Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

Libpcap 文件格式

概述

这种文件格式是一种非常基础的格式,用于保存捕获的网络数据。随着 libpcap 库成为 UN*X 上网络捕获的“事实”标准,它也成为开源世界中网络捕获文件的“公分母”(在商业网络捕获领域似乎完全不存在这样的“公分母”)。

Libpcap 以及 libpcap 的 Windows 移植版本 Npcap 使用相同的文件格式。

虽然有时会认为这种文件格式只适用于 Ethernet 网络,但它可以服务于许多不同的网络类型,示例可见 Wireshark 的 Supported Capture Media 页面;所有列出的类型都由 libpcap 文件格式处理。

基于 libpcap 的文件已注册的 IANA 媒体类型值是 vnd.tcpdump.pcap,依据其注册文档;根据该文档,这些文件的主要文件扩展名是 .pcap,也有一些文件使用 .cap 或 .dmp。不推荐使用 .cap,因为其他几个捕获文件格式也使用该扩展名。

Wireshark 在 wiretap 库中处理所有捕获文件 I/O。你可以在 wiretap/libpcap.c 和 .h 文件中找到有关 libpcap 文件格式的更多细节。

文件格式

此格式由 draft-ietf-opsawg-pcap Internet-Draft 描述。

变体

由于 pcap 文件格式存在一些缺点,若干开发者和厂商分别独立扩展了该格式以满足自身需求。有些开发者很友好地将 magic bytes 从 libpcap 标准中改开;对于其他情况,Wireshark 不得不包含一些启发式判断。

纳秒 pcap

pcap 格式的一个官方变体记录在 Internet-Draft 中,是一个支持纳秒精度时间戳的版本。Libpcap 1.5.0 及更高版本,以及所有版本的 Npcap 都可以读取这种格式的文件;较旧版本的 libpcap 以及所有版本的 WinPcap 都无法读取它。较旧版本的 Wireshark 无法读取它;当前版本可以读取它,并可以显示完整纳秒分辨率的时间戳。

此格式的 magic bytes 是 0xa1b23c4d(注意最后两个字节)。除了时间戳分辨率之外,文件头或记录头与标准 libpcap 没有区别。

此变体的作者署名为 Ulf Lamping。

“Modified” pcap

Alexey Kuznetsov 创建了 libpcap 补丁,用于向记录头添加一些额外字段。(这些补丁传统上可在 http://ftp.sunet.se/pub/os/Linux/ip-routing/lbl-tools/ 获取,但现在那里已经不再提供。)在 Wireshark 源代码中,此格式简称为 “modified pcap”。

此格式的 magic bytes 是 0xa1b2cd34(注意最后两个字节)。除此之外,文件头与标准 libpcap 头相同。

记录头按如下方式扩展:

 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 0 | Timestamp (Seconds) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4 | Timestamp (Microseconds or nanoseconds) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 | Captured Packet Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 12 | Original Packet Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 16 | Interface Index | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 20 | Protocol | Packet Type | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 24 / / / Packet Data / / variable length, not padded / / /

File Header 长度为 24 个 octet。

File Header 中额外字段的含义为:

Interface Index(32 bits):一个无符号整数,给出捕获机器接口列表中该 packet 到达的接口索引。

Protocol(16 bits):一个无符号整数,给出该 packet 的 Ethernet packet type。

Packet Type(8 bits):一个无符号整数,其值为以下之一:

  • 0,如果 packet 是由其他人专门发送给捕获机器的;
  • 1,如果 packet 是由其他人广播的;
  • 2,如果 packet 是由其他人组播但不是广播的;
  • 3,如果 packet 是由其他人发送给另一个人的;
  • 4,如果 packet 是由捕获机器发送的。

在该补丁的 ss990915 版本中(它出现在 SuSE Linux 6.3 中),记录头改为如下形式:

 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 0 | Timestamp (Seconds) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4 | Timestamp (Microseconds or nanoseconds) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 | Captured Packet Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 12 | Original Packet Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 16 | Interface Index | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 20 | Protocol | Packet Type | CPU 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 24 | CPU 2 | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 28 / / / Packet Data / / variable length, not padded / / /

CPU 1 和 CPU 2 字段的含义未知。

Nokia pcap

一些 Nokia 设备(防火墙?)会发出非标准记录格式。它使用标准文件头,记录头包含标准 libpcap 记录头,但还额外添加 4 个字节的神秘内容。Wireshark 在保存时会保留这些数据,但除此之外会忽略它。

AIX

AIX 上使用的 libpcap 库写入的 pcap 文件声明版本号为 2.2,并且在头部使用 RFC 1573 "ifType" 值,而所有其他变体都使用 DLT_ 值。它还具有纳秒精度的 packet 时间戳。

如果文件版本为 2.2,Wireshark 会包含一些额外检查,以确定该文件是否为 AIX pcap。

IXIA

IXIA 的 lcap 文件格式与 libpcap 非常相似,但在文件头末尾添加了一个长度字段,用于给出后续所有记录的大小。(Wireshark 会忽略此数字。)

此格式的 magic bytes 是 0x1c0001ac(硬件生成)和 0x01c0001ab(软件生成)。

从头实现读取/写入 libpcap 文件的函数应该不会太困难,因为它确实是一种非常简单的文件格式。不过,如果你希望为此使用库,或者如果你需要实际从实时网络捕获 packet,可以使用以下库来完成这件事:

  • libpcap:此文件格式的来源(用于基于 UN*X 的系统)

  • Npcap:基于 Windows 的 libpcap 版本

还提供了多种编程语言的 wrapper(但你必须安装上述库之一):

  • Net::Pcap:基于 Perl 的 libpcap wrapper

  • Jpcap:基于 JAVA 的 libpcap wrapper

  • python-libpcap:基于 Python 的 libpcap wrapper

  • Ruby/Pcap:基于 Ruby 的 libpcap wrapper

  • ……如果这里仍然缺失,你可以添加一个适用于你最喜欢的编程语言的 libpcap wrapper,或使用 Google 查找……

请注意,如果你编写自己的代码,它将无法读取下面提到的 “now generic pcap” 格式的任何捕获文件。不过,如果你使用 libpcap,当它与能够读取这些文件的 libpcap/NPcap 版本链接(在构建时或运行时)时,它将能够读取不使用当前 libpcap API 不支持的特性(例如来自多个接口且具有不同链路层类型的 packet)的 “now generic pcap” 文件,也能读取当前 libpcap 格式。因此,如果可以的话,你应使用 libpcap/NPcap,而不是编写自己的代码来读取这些文件。

缺点

libpcap 格式非常简单,这是它获得如此广泛使用的原因之一。遗憾的是,它缺少一些有用的内容:

  • 用户注释:“显示从 packet 1432 开始的连接故障”
  • 接口信息(例如网卡制造商)
  • packet 丢弃计数(并且可能还有其他计数)
  • ……

现状与未来

人们普遍认为,libpcap 文件格式达到了其目的,但缺少一些有用特性。有一种由 draft-ietf-opsawg-pcapng Internet-Draft 描述的 “now generic” pcap 文件格式。新格式提供了上文“缺点”中列出的许多能力。

Wireshark 目前能够读取和写入 pcapng 文件,并且默认这样做,尽管它并不支持这些文件的全部能力。Libpcap 1.1.0 及更高版本也具备有限的读取能力,尽管 libpcap 尚不支持写入它们。

关于将 pcapng 文件格式集成到 Wireshark 的更多细节见:Development/PcapNg

讨论

也许使用 “data block” 或 “block” 或其他词来代替 “packet” 会更好。

导入自 https://wiki.wireshark.org/Development/LibpcapFileFormat,时间为 2020-08-11 23:12:52 UTC

相关 Wireshark Wiki 页面

网络分析技术档案