Libpcap已经成为Linux,Unix平台上网络数据捕获的一个事实上的标准。所以,掌握Libpcap文件的格式也非常重要。这里用version2.4来说明(实际上,这个文件格式自从Libpcap的0.4版本,既是1998年来就没有改变过)。Libpcap文件用.pcap作为后缀。
从上图可以看出来,每个Libpcap文件都有一个全局的头(Global
header),然后跟着是N(N>=0)个数据包组成的。每个数据包又分为包头(Packet
Header)和包数据(Packet Data)部分。
1.Global Header
typedef struct pcap_hdr_s {
guint32 magic_number;
guint16 version_major;
guint16 version_minor;
gint32 thiszone;
guint32 sigfigs;
guint32 snaplen;
guint32 network; } pcap_hdr_t;
这是Global Header的格式。
magic_number:用来识别文件自己和字节顺序。0xa1b2c3d4用来表示按照原来的顺序读取,0xd4c3b2a1表示下面的字节都要交换顺序读取。一般,我们使用0xa1b2c3d4
version_major, version_minor:Libpcap的版本
thiszone:
时区。GMT和本地时间的相差,用秒来表示。如果本地的时区是GMT,那么这个值就设置为0.这个值一般也设置为0
sigfigs:精确的time stamps,实际上都设置为0
snaplen:该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535;
例如:想获取数据包的前64字节,可将该值设置为64。
network:数据链路层类型。1是Ethernet,所以一般设置为1。
2.Packet Header
每个数据包都以一个Packet Header开始,下面是其结构:
typedef struct pcaprec_hdr_s {
guint32 ts_sec;
guint32 ts_usec;
guint32 incl_len;
guint32 orig_len; } pcaprec_hdr_t;
ts-sec:该数据包被捕获的时间(date and time),值是自从January 1,
1970 00:00:00 GMT以来的秒数来记。也就是linux
time_t
ts_usec:数据包被捕获时候的微秒(microseconds)数,是自ts-sec的偏移量。
incl_len:数据包实际抓获并且保存在文件中的长度(用bytes计算)。这个值不能大于orig_len和snaplen
orig_len:数据包被捕获是,在网络上出现的长度(用bytes计算)。如果incl_len与orig_len不同,则说明实际抓包的大小被snaplen所限制。
例如,实际上有一个包长度是1500 bytes(orig_len=1500),但是因为在Global
Header的snaplen=1300有限制,所以只能抓取这个包的前1300个字节,这个时候,incl_len
= 1300
3.Packet Data
Packet Data紧跟着Packet Header,长度是incl_len,没有格式