1 介绍
1.1. 五元组
网络通信过程中会发送大量的请求,每一个请求都需要通过IP数据包进行交互,但是IP数据包的头部信息过于复杂,如果通过IP数据包头进行数据包之间的区分就太复杂了,所以就产生了元组。
五元组是元组中的一种,还有四元组、七元组。通过五元组可以表示所在的数据包属于哪一个会话。该头正在数据包查重和流量对比的时候使用较多。
五元组的结构包括:IP源地址、源端口、目的IP地址、目标端口、4层通信协议。
1.2 pacp文件格式
文件头+数据包头+数据+数据包头+数据+数据包头+数据+…
数据包格式:
结构名称 |
字节数 |
作用 |
文件头Global Header |
24 |
整个数据流文件,只会有一个Global Header,它定义了本文本的读取规则、最大存取长度限制等内容 |
数据包头 Packet Header |
16 |
Pachet Header可以有多个,每个Packet Header后面会跟一串Packet Data, Packet Header定义了Packet Data的长度、时间戳等信息 |
Packet Data |
|
|
2 结构介绍
2.1 Global Header 文件头
这里以nacp库
中定义的结构为例
结构定义如下:

struct pcap_file_header {
bpf_u_int32 magic;
u_short version_major;
u_short version_minor;
bpf_int32 thiszone;
bpf_u_int32 sigfigs;
bpf_u_int32 snaplen;
bpf_u_int32 linktype;
};
1、Magic
名称
:文件开始标记
大小
:4Byte
描述
:用来识别文件自己和字节顺序。
0xa1b2c3d4
:用来表示按照原来的顺序读取。
0xd4c3b2a1
:表示下面的字节都要交换顺序读取。
考虑到计算机的内存结构,一般采用0xd4c3b2a1
,如下
0xd4c3b2a1
:所有字节都需要交换顺序读取
2、 Major
名称
:当前文件主要的版本号
大小
:2Byte
描述
:一般为 0x0200
。【实际上因为需要交换读取顺序,所以计算机应该看到的是 0x0002
】
3、 Minor
名称
:当前文件次要版本号
大小
:4Byte
描述
:
一般为 0x0400
【计算机看到的应该是 0x0004
】
4、 ThisZone
名称
:当地的标准时间
大小
:4Byte
描述
:如果用的是 GMT 则全零。一般都直接写 0000 0000
5、 SigFigs
名称
:时间戳精度
大小
:4Byte
描述
:设置为 全零 即可。
6、 SnapLen
名称
:最大存储长度
大小
:4Byte
描述
:如果想把整个包抓下来,设置为 ffff 0000
,但一般来说 ff7f 0000
就足够了。
【计算机中看到的应该是 0000 ff7f
】
7、 LinkType
名称
:链路类型
大小
:4Byte
描述
:
2.2 Packet Header 数据包头
这里以nacp库
中定义的结构为例
数据包头有三个属性,每个属性占固定大小,所以可以使用一个结构体表示。

struct pcap_pkthdr {
struct timeval ts;
bpf_u_int32 caplen;
bpf_u_int32 len;
};
1、Timestamp
名称
:被捕获时间的高位
大小
:4Byte
描述
:单位 seconds
2、Timestamp
名称
:被捕获时间的低位
大小
:4Byte
描述
:单位 microseconds
3、Caplen
名称
:当前数据区的长度,即抓取到数据帧的长度
大小
:4Byte
描述
:不包括 Packet Header 本身的长度,单位是 Byte,由此可以的找到下一个数据帧的位置。
4、Len
名称
:离线数据长度
大小
:4Byte
描述
:网络中实际数据帧的长度,一般不大于 caplen,多数情况下和 Caplen的数值相等。
2.3 Packet Data 数据包数据
参考地址:
https://blog.csdn.net/qq_43481350/article/details/119909121
https://blog.csdn.net/m0_58087444/article/details/123078984
C语言解析pcap文件得到HTTP信息实例https://blog.csdn.net/koudaidai/article/details/7673082
<h2><a id="1__0"></a>1 介绍</h2>
<h3><a id="11__2"></a>1.1. 五元组</h3>
<p>网络通信过程中会发送大量的请求,每一个请求都需要通过IP数据包进行交互,但是IP数据包的头部信息过于复杂,如果通过IP数据包头进行数据包之间的区分就太复杂了,所以就产生了元组。</p>
<p>五元组是元组中的一种,还有四元组、七元组。<strong>通过五元组可以表示所在的数据包属于哪一个会话</strong>。该头正在<strong>数据包查重和流量对比</strong>的时候使用较多。</p>
<p><strong>五元组的结构包括</strong>:IP源地址、源端口、目的IP地址、目标端口、4层通信协议。</p>
<h3><a id="12_pacp_11"></a>1.2 pacp文件格式</h3>
<p><mark>文件头</mark>+数据包头+数据+<strong>数据包头+数据</strong>+数据包头+数据+…</p>
<p>数据包格式:</p>
<table>
<thead>
<tr>
<th>结构名称</th>
<th>字节数</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>文件头Global Header</td>
<td>24</td>
<td>整个数据流文件,只会有一个Global Header,它定义了本文本的读取规则、最大存取长度限制等内容</td>
</tr>
<tr>
<td>数据包头 Packet Header</td>
<td>16</td>
<td>Pachet Header可以有多个,每个Packet Header后面会跟一串Packet Data, Packet Header定义了Packet Data的长度、时间戳等信息</td>
</tr>
<tr>
<td>Packet Data</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2><a id="2__23"></a>2 结构介绍</h2>
<h3><a id="21_Global_Header__25"></a>2.1 Global Header 文件头</h3>
<p>这里以<code>nacp库</code>中定义的结构为例<br />
结构定义如下:</p>
<p><img src="https://static.couragesteak.com/article/5d87758ef9180a5dde942eb9287111a2.png" alt="" /></p>
<pre><div class="hljs"><code class="lang-c"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">pcap_file_header</span> {</span>
bpf_u_int32 magic; <span class="hljs-comment">// 文件开始标记</span>
u_short version_major; <span class="hljs-comment">// 当前文件主要的版本号</span>
u_short version_minor; <span class="hljs-comment">// 当前文件次要的版本号</span>
bpf_int32 thiszone; <span class="hljs-comment">// 当地的标准时间 gmt to local correction; this is always 0</span>
bpf_u_int32 sigfigs; <span class="hljs-comment">// 时间戳精度 accuracy of timestamps; this is always 0</span>
bpf_u_int32 snaplen; <span class="hljs-comment">// 最大的存储长度 max length saved portion of each pkt</span>
bpf_u_int32 linktype; <span class="hljs-comment">// 链路类型 data link type (LINKTYPE_*)</span>
};
</code></div></pre>
<p><strong>1、Magic</strong></p>
<p><code>名称</code>:文件开始标记<br />
<code>大小</code>:<code>4Byte</code><br />
<code>描述</code>:用来识别文件自己和字节顺序。<br />
<code>0xa1b2c3d4</code>:用来表示按照原来的顺序读取。<br />
<code>0xd4c3b2a1</code>:表示下面的字节都要交换顺序读取。<br />
考虑到计算机的内存结构,一般采用<code>0xd4c3b2a1</code>,如下<br />
<code>0xd4c3b2a1</code>:所有字节都需要交换顺序读取</p>
<p><strong>2、 Major</strong></p>
<p><code>名称</code>:当前文件主要的版本号<br />
<code>大小</code>:2Byte<br />
<code>描述</code>:一般为 <code>0x0200</code> 。【实际上因为需要交换读取顺序,所以计算机应该看到的是 <code>0x0002</code>】</p>
<p><strong>3、 Minor</strong></p>
<p><code>名称</code>:当前文件次要版本号<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:<br />
一般为 <code>0x0400</code><br />
【计算机看到的应该是 <code>0x0004</code>】</p>
<p><strong>4、 ThisZone</strong></p>
<p><code>名称</code>:当地的标准时间<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:如果用的是 GMT 则全零。一般都直接写 <code>0000 0000</code></p>
<p><strong>5、 SigFigs</strong></p>
<p><code>名称</code>:时间戳精度<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:设置为 全零 即可。</p>
<p><strong>6、 SnapLen</strong></p>
<p><code>名称</code>:最大存储长度<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:如果想把整个包抓下来,设置为 <code>ffff 0000</code>,但一般来说 <code>ff7f 0000</code>就足够了。<br />
【计算机中看到的应该是 <code>0000 ff7f </code>】</p>
<p><strong>7、 LinkType</strong></p>
<p><code>名称</code>:链路类型<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:</p>
<h3><a id="22_Packet_Header__93"></a>2.2 Packet Header 数据包头</h3>
<p>这里以<code>nacp库</code>中定义的结构为例<br />
数据包头有三个属性,每个属性占固定大小,所以可以使用一个结构体表示。</p>
<p><img src="https://static.couragesteak.com/article/8e4b087728af4850788dbc058e001011.png" alt="" /></p>
<pre><div class="hljs"><code class="lang-c"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">pcap_pkthdr</span> {</span>
<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">timeval</span> <span class="hljs-title">ts</span>;</span> <span class="hljs-comment">// 捕获时间 time stamp</span>
bpf_u_int32 caplen; <span class="hljs-comment">// 数据帧/区的长度 length of portion present</span>
bpf_u_int32 len; <span class="hljs-comment">// 离线数据长度 length of this packet (off wire)</span>
};
</code></div></pre>
<p><strong>1、Timestamp</strong></p>
<p><code>名称</code>:被捕获时间的高位<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:单位 seconds</p>
<p><strong>2、Timestamp</strong></p>
<p><code>名称</code>:被捕获时间的低位<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:单位 microseconds</p>
<p><strong>3、Caplen</strong></p>
<p><code>名称</code>:当前数据区的长度,即抓取到数据帧的长度<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:不包括 Packet Header 本身的长度,单位是 Byte,由此可以的找到下一个数据帧的位置。</p>
<p><strong>4、Len</strong></p>
<p><code>名称</code>:离线数据长度<br />
<code>大小</code>:4Byte<br />
<code>描述</code>:网络中实际数据帧的长度,一般不大于 caplen,多数情况下和 Caplen的数值相等。</p>
<h3><a id="23_Packet_Data__132"></a>2.3 Packet Data 数据包数据</h3>
<p>参考地址:<br />
https://blog.csdn.net/qq_43481350/article/details/119909121<br />
https://blog.csdn.net/m0_58087444/article/details/123078984<br />
C语言解析pcap文件得到HTTP信息实例https://blog.csdn.net/koudaidai/article/details/7673082</p>
留言