PCAP File Format

[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


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://mindori.egloos.com/tb/2390488 [도움말]

덧글

※ 로그인 사용자만 덧글을 남길 수 있습니다.