Global Header
Packet Header
Packet Data
Packet Header
Packet Data
Packet Header
Packet Data
...
捕获文件中捕获的数据包不一定包含数据包中出现在网络上的所有数据; 捕获文件最多可能包含每个数据包的前N个字节。这种捕获中N的值称为捕获的“快照长度”或“snaplen”。 N可能是大于最大可能数据包的值,以确保捕获中的数据包“切片”不变; 在这种情况下通常会使用65535的值。 全局头部(Global Header) 这个头在libpcap文件的开始,后面跟着第一个数据包头: 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与本地字节排序格式写入该字段。读取应用程序将读取0xa1b2c3d4(相同)或0xd4c3b2a1(交换)。如果读取应用程序读取交换的0xd4c3b2a1值,它将知道所有以下字段也将被交换。对于纳秒分辨率文件,写入应用程序写入0xa1b23c4d,交换两个低级字节的两个半字节,读取应用程序将读取0xa1b23c4d(相同)或0x4d3cb2a1(交换)。 version_major,version_minor:此文件格式的版本号(当前版本为2.4) thiszone:GMT(UTC)与以下数据包头时间戳的本地时区之间的时间差值(以秒为单位)。示例:如果时间戳为格林尼治标准时间GMT(UTC),则此区域为0.如果时间戳是位于中欧的时间(阿姆斯特丹,柏林,...)GMT + 1:00,则该区域必须为-3600。实际上,时间戳总是在GMT,所以这个区域总是0。 sigfigs:在理论上,捕获时间戳的精确度;实际上,所有工具都将其设置为0。 snaplen:捕获的“快照长度”(通常为65535甚至更多,但可能受到用户的限制),请参见:以下的incl_len与orig_len network:链路层头类型,指定分组开头的头部类型(例如,以太网为1,请参阅tcpdump.org's link-layer header types的链路层头类型页面了解详细信息);它可以是各种类型,例如具有各种无线电信息的802.11,802.11,PPP,令牌环,FDDI等。 注意:如果您需要libpcap文件的新封装类型,请勿使用任何现有值!即,不要通过更改现有条目添加新的封装类型。相反,发送邮件到tcpdump-workers@lists.tcpdump.org,要求一个新的链接层头类型值,并指定新值的目的。 数据包头(Record (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之后的秒数,这也被称为UN*X time_t。您可以使用time.h中的ANSI C time()函数获取此值,但您可以使用更优化的方式来获取此时间戳记值。如果此时间戳记的值不基于GMT(UTC),请从全局头文件中使用thiszone进行调整。 ts_usec:在常规pcap文件中,捕获此数据包时的微秒,作为ts_sec的偏移量。在纳秒分辨率文件中,相反,这是捕获数据包时的纳秒,作为ts_sec的偏移量。小心:此值不应达到1秒(在常规pcap文件中为1 000 000;以纳秒为单位的文件中,1 000 000 000);在这种情况下,ts_sec必须增加! incl_len:实际捕获并保存在文件中的数据包数据的字节数。该值不应大于orig_len或全局头的snaplen值。 orig_len:捕获时在网络上出现的数据包的长度。如果incl_len和orig_len不同,实际保存的数据包大小受到snaplen的限制。 数据包数据(Packet Data) 实际的分组数据将立即跟随分组报头作为incl_len字节的分组内容,而不需要特定的字节对齐。 库(Libraries) 实现从头开始读/写libpcap文件的功能不是太难,因为它是一个非常简单的文件格式。 但是,如果要为此目的使用库,或者如果需要从实际网络实际捕获数据包,则可以使用以下库来执行此操作: libpcap:这个文件格式的起源(用于基于UN*X的系统) WinPcap:基于Windows的libpcap版本 有可用的各种编程语言的包装(但是您必须安装以上一个lib): Net :: Pcap:基于Perl的libpcap包装 Jpcap:基于JAVA的libpcap包装 python-libpcap:基于Python的libpcap包装 Ruby / Pcap:基于Ruby的libpcap包装 ...您可以为自己喜欢的编程语言添加一个libpcap包装 ... libpcap格式非常简单,这是它获得如此广泛的应用的原因之一。 不幸的是,它缺少了一些有益的东西: 纳秒时间分辨率 用户评论:“显示从包1432开始的连接故障” 接口信息(如网卡制造商) 分组丢弃计数(也可能是其他计数)