pcap文件是一种常用的数据报存储格式,类似于一种特定格式的文件。普通的文本编辑器打开pcap文件会显示乱码,但使用Ultra Edit可以以16进制数据的格式显示,而使用抓包工具如wireshark则可以正常打开并查看其中的网络数据报。当然,除了我经常使用的这些工具外,还有许多其他可以查看pcap文件的工具。
.pcap/.cap文件的结构如下:
- Pcap Header(文件头):每个pcap文件只有一个文件头,总共占24字节。文件头包含以下7个字段的信息:
-
Magic(4字节):标记文件开始,并用于识别文件和字节顺序。值可以是0xa1b2c3d4或0xd4c3b2a1。如果是0xa1b2c3d4,表示大端模式;如果是0xd4c3b2a1,表示小端模式。现在大多数计算机采用小端模式。
-
Major(2字节):当前文件的主要版本号,一般为0x0200。
-
Minor(2字节):当前文件的次要版本号,一般为0x0400。
-
ThisZone(4字节):当地的标准事件,如果使用的是GMT,则为全零。
-
SigFigs(4字节):时间戳的精度,一般为全零。
-
SnapLen(4字节):最大的存储长度,设置所抓获的数据包的最大长度。如果要抓取所有数据包,则将值设置为65535。
-
LinkType(4字节):链路类型。解析数据包时需要判断其链路类型,因此这个值非常重要。常见的链路类型包括以太网、Token Ring、ARCnet、SLIP、PPP等。
- Packet Header(数据包头):每个数据包头后面跟着真正的数据包。Packet Header包含以下4个字段的信息:
-
Timestamp(4字节):时间戳高位,精确到秒,使用Unix时间戳。捕获数据包的时间通常基于此值。
-
Timestamp(4字节):时间戳低位,精确到微秒。
-
Caplen(4字节):当前数据区的长度,即抓取到的数据帧长度。通过此值可以确定下一个数据帧的位置。
-
Len(4字节):离线数据长度,即网络中实际数据帧的长度。通常不大于Caplen,大多数情况下与Caplen值相同。
- Packet Data(数据包数据):Packet是链路层的数据帧,其长度由Packet Header中定义的Caplen值确定。因此,每个Packet Header后面都跟着长度为Caplen的Packet Data。pcap文件并没有规定捕获的数据帧之间的间隔字符串。Packet数据帧部分的格式遵循标准的网络协议格式。
例如,下图是一个16进制的pcap文件示例:
[图片ID:50444]
备注:
- 红色部分:Pcap Header(文件头)
- 蓝色部分:Packet Header(数据包头)
PcapHeader:
- Magic(4字节):D4 C3 B2 A1,表示小端模式。
- Major(2字节):02 00,计算机读取为00 02。
- Minor(2字节):04 00,计算机读取为00 04。
- ThisZone(4字节):00 00 00 00,全零。
- SigFigs(4字节):00 00 00 00,全零。
- SnapLen(4字节):FF FF 00 00,计算机读取为00 00 FF FF,即2^16-1=65535。
- LinkType(4字节):01 00 00 00,计算机读取为00 00 00 01,表示以太网类型。
Packet Header: