대개 pcap이라는 확장자를 갖는 파일로 주로 네트워킹 툴에서 주로 쓰이며 패킷의 정보를 담고 있다. 여기서 파일이 어떤 식으로 쓰이는지를 간략히 설명하고자 한다.
가장 처음 글로벌 헤더부분에서 파일의 기본적인 형식등을 지정해주고, 그 다음에 패킷 정보들이 차례대로 위치하게 된다.
글로벌 헤더의 내용은 다음과 같이 정의되어 있다.
각 패킷의 헤더는 다음과 같이 정의되어 있다.
그리고 이를 뒤따르는 패킷 데이터는 실제 패킷의 데이터이다. 다시 말해, IP 패킷의 경우, 패킷 데이터는 [IP[Ether[payload]]] 이런 형태가 된다. 그러므로 모든 패킷 처리 과정은 이 데이터 부분을 이용한다. 한 예로, pcap_next_ex()를 이용하면, 패킷 헤더 부분과 패킷 데이터 부분을 동시에 받을 수 있다.
우선 pcap파일의 큰 그림은 아래와 같다.
Global Header |
Packet Header |
Packet Data |
Packet Header |
Packet Data |
Packet Header |
Packet Data |
... |
가장 처음 글로벌 헤더부분에서 파일의 기본적인 형식등을 지정해주고, 그 다음에 패킷 정보들이 차례대로 위치하게 된다.
글로벌 헤더의 내용은 다음과 같이 정의되어 있다.
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_munber: 파일 포맷과 바이트 쓰는 순서. 0xa1b2c3d4는 원래 순서, 0xd4c3b2a1는 거꾸로.
version_major, version_minor: 버전 정보.
thiszone: 시간대 세팅. 만약 GMT + 1:00 이면 thiszone = -3600(초).
sigfigs: 원래 timestamp를 좀 더 세밀히 저장하기 위해 쓰이는 것이나 실제로는 0으로 세팅되어 사용되지는 않음.
snaplen: 패킷 캡쳐 최대크기.
network: 데이터 링크 타입. Ethernet은 1.
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, ts_usec: 1970년 1월 1일 0시부터의 timestamp. (sec는 초단위, usec는 마이크로 초단위)
incl_len: 파일에 저장된 패킷의 길이.
orig_len: 실제 네트워크 상에 있던 패킷의 길이. 만약 incl_len과 orig_len이 다를 경우, snaplen만큼 패킷이 저장됨.
댓글