[File Format]

매우 단순한 구조
PCAP 파일은 매우 단순한 구조로 이루어져있다.
파일의 맨 처음에 Global Header가 하나가 있고, 그 후로 [Packet Header - Packet Data]쌍으로 이루어진다.
[Global Header]
글로벌 헤더는 아래와 같은 구조체로 정의를 할 수 있다.
typedef struct pcap_hdr_s {
guint32 magic_number; /* magic number */
guint16 version_major; /* major version number */
guint16 version_minor; /* minor version number */
gint32 thiszone; /* GMT to local correction */
guint32 sigfigs; /* accuracy of timestamps */
guint32 snaplen; /* max length of captured packets, in octets */
guint32 network; /* data link type */
} pcap_hdr_t;
magic_number
바이트 오더를 판별할 때 쓰이는 숫자이다. 매직 넘버의 값은 0xa1b2c3d4(identical) 와 0xd4c3b2a1(swapped)
두 값중에 하나로 지정이 되어 있는데, identical의 형식으로 매직 넘버의 값이 저장 되어있다면 상관 없지만
swappped의 형식으로 값이 저장된 경우에는 모든 바이트 오더를 swapped하게 해석해야 한다.
version_major, version_minor
해당 PCAP 파일의 버전을 나타낸다. 최신 버전은 2.4이다(2008년 12월 기준).
thiszone
GMT 표준시와 local timezone의 차이를 second 단위로 표현한 숫자이다. 예를 들어,
local timezone이 GMT + 1:00이라고 할 경우에, GMT 표준시가 되기 위해서는 -1:00을 해주어야 한다.
따라서, 이 때의 thiszone은 -3600이라는 값을 갖는다.
sigfigs
보통은 0으로 세팅되어 이 필드는 사용하지 않는다.
snaplen
snapshot length이다. 보통은 65535로 지정하나 필요에 따라 크기를 제한 할 수 있다.
network
OSI 7 Layer에서 Level 2에 해당하는 data link layer에 타입을 명시한다.
예를 들어, Ethernet은 1로 설정, Token Ring은 6으로 설정을 한다.
자세한 설명은 http://anonsvn.wireshark.org/wireshark/trunk/wiretap/libpcap.c 소스를 참조할 것.
[Packet Header]
패킷 헤더는 다음과 같은 구조체로 정의할 수 있다.
typedef struct pcaprec_hdr_s {
guint32 ts_sec; /* timestamp seconds */
guint32 ts_usec; /* timestamp microseconds */
guint32 incl_len; /* number of octets of packet saved in file */
guint32 orig_len; /* actual length of packet */
} pcaprec_hdr_t;
ts_sec
언제 패킷이 캡쳐되었는지를 나타낸다. 1970년 1월 1일 00:00:00(GMT 표준) 이후의 Timestamp를 데이터에 저장한다.
ts_sec는 UNIX 플랫폼에서 사용하는 time_t라는 형태와 동일하다.
ts_sec값을 Win32 시간 형식으로 얻기 위해서는 아래와 같은 함수를 Win32 함수를 사용해야 한다.
void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst)
{
FILETIME ft;
UnixTimeToFileTime(t, &ft);
FileTimeToSystemTime(&ft, pst);
}
시간 변환에 대한 자세한 내용은 http://support.microsoft.com/kb/167296/ko 를 참조할 것.
ts_usec
ts_sec를 microseconds로 표시한 것이다.
incl_len
PCAP 파일안에 저장되어 있는 패킷 데이터의 길이를 나타낸다.
incl_len 값은 orig_len 값이나 snaplen 값보다 클 수 없다.
orig_len
실제 네트워크 상에서 캡처된 패킷 데이터의 길이를 나타낸다.
incl_len 값과 orig_len 값이 다른 경우에는 패킷 사이즈를 snaplen 값으로 정한다.
[Packet Data]
incl_len의 길이만큼 실제 패킷 데이터가 그 뒤에 이어진다.
[Libraries]
libpcap: the origin of this file format (for UN*X based systems)
WinPcap: Windows based version of libpcap
Net::Pcap: Perl based libpcap wrapper
Jpcap: JAVA based libpcap wrapper
python-libpcap: Python based libpcap wrapper
Ruby/Pcap: Ruby based libpcap wrapper
[References]
http://wiki.wireshark.org/Development/LibpcapFileFormat



덧글
xeraph 2009/07/16 01:09 # 답글
잘 정리했네.. :)