好记性不如铅笔头

编程, 网络通讯

pcap文件格式笔记

最近需要对报文进行二次筛选和分析,初步考虑将筛选后的报文用pcap格式保存下,这里简单的笔记下pcap文件格式。

参考链接:
http://www.soolco.com/post/47975_1_1.html
https://blog.csdn.net/ytx2014214081/article/details/80112277
https://blog.csdn.net/u013793399/article/details/51474831

Wireshark默认的存储方式是pcap格式,最新版本的wireshark默认存储方式是pcapng。ng是next generation 的缩写。
pcap报文文件结构示意如下:
【Global Header】【Packet Header】【Packet Data】【Packet Header】【Packet Data】【Packet Header】【Packet Data】……
1、Global Header是整个文件的文件头,包含文件格式标识,pcap格式版本号等文件指示信息。
2、Packet Header是每一片数据报文的头部信息,这些信息都是在形成pcap 报文的过程中由抓包软件wireshark添加的额外信息,例如报文捕获时间等。
3、Packet Data是抓取通信过程中的实际数据,包括协议数据和内容数据。

在wireshark源码中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;

Global Header中各个字段的含义如下:
1、magic_number 作用有两个,一个是pcap文件标识,另一个是系统字节序的表示。因此存在两个值,即0xa1b2c3d4和0xd4c3b2a1。0xa1b2c3d4表示大端序的系统,0xd4c3b2a1表示小端序的系统
2、version_major和version_minor分别使用2个字节表示大小版本号,即pcap格式版本,当前版本为2.4
3、Packet Header中的时戳信息是按照本机系统的时区记录的时间的。由于全世界各地的时区并不一致,为了统一,使用thiszone表示本地时区和标准UTC的差值,单位为秒,默认值为0。
4、sigfigs是Packet Header中的时戳信息的精度,长度为4个字节,通常默认为0
5、snaplen为4个字节的最大长度,描述的是允许捕获的每一片数据报文的最大长度,一般默认 ffff 0000,即65535个字节。对于像TCP/IP协议族来说,由于MTU通常限制在1500左右,因此默认的设置肯定是满足日常使用的。
6、network为4个字节的链路类型,常用类型如下:

0 BSD loopback devices, except for later OpenBSD
1 Ethernet, and Linux loopback devices
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
10 FDDI
100 LLC/SNAP-encapsulated ATM
101 “raw IP”, with no link
102 BSD/OS SLIP
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 later OpenBSD loopback devices (with the AF_value in network byte order)
113 special Linux “cooked” capture
114 LocalTalk

在wireshark源码中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;

Packet Header中各个字段的含义如下:
1、ts_sec和ts_usec分别使用4个字节表示捕获时间戳的秒数和毫秒数
2、incl_len使用4个字节表示该软件实际捕获的报文长度。
3、orig_len使用4个字节表示原始报文长度,由于受到Global Header中snaplen的限制,实际的incl_len可能会小于orig_len。

Packet Data 是链路层的数据帧,长度就是Packet Header中定义的Caplen值(incl_len),所以每个Packet Header后面都跟着Caplen长度的Packet Data。也就是说pcap文件并没有规定捕获的数据帧之间有什么间隔字符串。Packet数据帧部分的格式就是标准的网络协议格式了。

Leave a Reply

5 + 1 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据