报文格式-PCAP文件格式详解

即使对于已经使用过wireshark这款软件的同学,很多人其实并不是特别清楚pcap报文格式以及wireshark中所提供frame层的含义,相信通过这章可以让你get到这些新的知识点(本文是我的专栏《wireshark从入门到精通》中的一篇,感兴趣的可以关注下)。

Wireshark默认的存储方式是pcap格式,最新版本的wireshark默认存储方式是pcapng。ng是next generation 的缩写,pcap和pcapng格式文件有是存在一定的差异。由于pcap格式文件非常的常见,同时理解了.pcap文件之后其实也非常的容易理解pcapng文件,因此为了兼顾老版本,本章就先介绍一下.pcap文件格式。文件格式总的来说其实都有固定的一种模式,使用文件头来表征具体的文件类型,通常是TLV结构,就是type,length,value缩写。 type就是告诉解码器文件的类型, length就是告诉解码器文件内容长度,value就是具体的内容数据。

图1即pcap报文文件结构示意图:
在这里插入图片描述
图1

  • 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。(ps:这里指的是pcap文件格式版本而不是wireshark软件版本)
  • 3、Packet Header中的时戳信息是按照本机系统的时区记录的时间的。由于全世界各地的时区并不一致,为了统一,使用thiszone表示本地时区和标准UTC的差值,单位为秒,默认值为0。举个例子来说,通常wireshark在Time那一列显示的默认都是本地的时间,因为wireshark中默认的配置如图2:
    在这里插入图片描述
    图2
    通过选中Time->右键->编辑列,红框中Absolute表示的就是本地的时区。如果选择的是UTC开头的,你会看到显示的时间是和本地时间相差8个小时的,因为我们使用北京时间是在东八区,具体计算的依据就是根据thiszone这个字段。(PS:在实际的过程中我发现该字段通常为0,即按照UTC时间记录,但是Packet Header中的时间却是本地时间,和其定义存在矛盾,不知是否是wireshark的bug)
  • 4、sigfigs是Packet Header中的时戳信息的精度,长度为4个字节,通常默认为0。
  • 5、snaplen为4个字节的最大长度,描述的是允许捕获的每一片数据报文的最大长度,一般默认 ffff 0000,即65535个字节。对于像TCP/IP协议族来说,由于MTU通常限制在1500左右,因此默认的设置肯定是满足日常使用的,当然这个长度是可以在wireshark中设置。
  • 6、network为4个字节的链路类型,例如常见的以太网的值为1。已知的链路层类型包括288种,详见这里

我以一个在x86 windows上捕获的具体的报文为例,对上述的各字段作进一步的解释。下述的码流为使用HxD 16进制文件编辑器打开文件的第一片报文部分数据(需要注意的是,如果使用nodepadd++打开,在中文操作系统,ANSI其对应编码方式应该是gbk。查看的时候,会显示前两个汉字为“悦病”,则是因为悦在gbk编码中值为Oxd4c3,而病为0xb2a1,后续的则是很多乱码,因为其对码流进行了解码。因此我这里面使用HxD这种16进制编辑器):

d4c3 b2a1 0200 0400 0000 0000 0000 0000
0000 0400 0100 0000 deb4 d25a 78e6 0800
ff00 0000 ff00 0000 fcd7 33ec 414a 446d
57bb 14a1 0800 4500 00f1 20e2 4000 8006
423e c0a8 0072 b461 216b ced2 01bb 5e7a
21d5 6546 e5be 5018 40b0 c8f6 0000 1603
0100 c401 0000 c003 0389 0bb6 3b80 f388
3965 716e b3d9 c374 258d 6ce3 ca20 6748
68dc d4d0 25e3 f3b2 1e00 001c 8a8a c02b
c02f c02c c030 cca9 cca8 c013 c014 009c
009d 002f 0035 000a 0100 007b baba 0000
ff01 0001 0000 0000 1200 1000 000d 7777

可以看到magic_number 为0xd4c3b2a1,表示这是小端序系统中的pcap报文,后面所有的数据都要使用小端序解码。因此version_major和version_minor分别为0002,0004(注意字节序)。thiszone,sigfigs均是0000 0000,表示按照标准的GMT进行记录时间。snaplen为0004 0000,表示单片数据报文最大捕获长度为2^19 -1。network为0000 0001,表示以太网。

在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中各个字段的含义如下:

  • ts_sec和ts_usec分别使用4个字节表示捕获时间戳的秒数和毫秒数。
  • incl_len使用4个字节表示该软件实际捕获的报文长度。
  • orig_len使用4个字节表示原始报文长度,由于受到Global Header中snaplen的限制,实际的incl_len可能会小于orig_len。

还是以上述使用HxD软件打开的报文数据为例,Packet Header之后便是第一片报文的Packet Header部分。按照小端序ts_sec和ts_usec分别为5ad2 b4de 以及0008 e678,转换后的时间为Apr 15, 2018 10:11:42.583288000。incl_len和orig_len按照小端序为为0000 00ff,即长度为255个字节。剩下的便是Packet Data内容了。

对于Global Header以及Packet Header中的信息,wireshark在解析显示报文数据的时候为每一片报文额外加上了一个frame层进行显示,上述报文数据在wireshark中显示如图3:
在这里插入图片描述
图3
从图3中可以看出该层所提供的信息包括两类,一类是没有中括号的,这类信息表示的是,从pcap数据报文本身能够提取的一些信息。

  • 1、Encapsulation type: Ethernet (1)表示以太网的链路类型,即Global Header的network的内容。
  • 2、 Arrival Time Apr 15, 2018 10:11:42.583288000以及Epoch Time: 1523758302.583288000 seconds表示获取报文的时间,只是两种不同的时间格式。这些时间信息是从Packet Header的ts_sec和ts_usec字段获取的。
  • 3、Frame Length: 255 bytes (2040 bits)表示数据的长度,也就是从Packet Header的orig_len字段得到的长度,和后面的Capture Length长度略有不同。
  • 4、Capture Length: 255 bytes (2040 bits)表示在网卡上所捕获的实际数据长度,即Packet Header的incl_len字段。通常情况下Frame Length和Capture Length 是相同的,但是如果Capture Length所捕获的数据有长度限制,则Capture Length要比Frame Length要小一些。

另外一类是带有中括号的,这类信息表示的是根据报文整体的分析所给出的辅助性信息。像[Protocols in frame: eth:ethertype:ip:tcp:ssl]这种就是根据报文后续解码分析所得到的协议信息,pcap文件本身并不含有这些字段信息。

frame虽然不是网络协议的一部分,但是wireshark却像各个协议一样为frame层提供了显示过滤器,供筛选报文之用(对齐IP层,TCP层,HTTP层的数据),如图4:
在这里插入图片描述
图4

相信通过上述的介绍应该可以对frame 层所提供的信息以及pcap文件格式有了新的认识。

本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里

发布了132 篇原创文章 · 获赞 183 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/javajiawei/article/details/103585666
今日推荐