[关闭]
@natsumi 2015-03-26T01:27:23.000000Z 字数 3769 阅读 3559

PCAP文件格式

Wireshark libpcap


参考:
1 https://wiki.wireshark.org/Development/LibpcapFileFormat
2 http://www.tcpdump.org/linktypes.html
3 http://www.cnblogs.com/caoguoping100/p/3658792.html
4 libpcap函数库: http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=libpcap%E5%87%BD%E6%95%B0%E5%BA%93

1. 概述

2. 文件格式

2.1 Global Header

  1. typedef struct pcap_hdr_s {
  2. guint32 magic_number; /* magic number */
  3. guint16 version_major; /* major version number */
  4. guint16 version_minor; /* minor version number */
  5. gint32 thiszone; /* GMT to local correction */
  6. guint32 sigfigs; /* accuracy of timestamps */
  7. guint32 snaplen; /* max length of captured packets, in octets */
  8. guint32 network; /* data link type */
  9. } pcap_hdr_t;

magic_number :
用来识别文件格式本身和字节顺序。一般,写入的程序用自己的字节序在文件中写入0xa1b2c3d4。读取的程序如果读出0xd4c3b2a1,就表示后面所有的字段都要将字节序反转。
对于纳秒精度的文件,写入程序应在文件中写入0xa1b23c4d,读取程序再进行相应的判别。

version_major, version_minor :
文件格式的版本号,最新的版本是2.4

thiszone :
GMT (UTC)和后面packet header的时间戳所用的时区的时间差(单位:秒)。 实际上,时间戳用的一般都是GMT时间, 所以thiszone一般都设为0。

sigfigs :
时间戳的精度
实际上,一般设置为0

snaplen :
每个数据包的最大存储长度(该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535; 例如:想获取数据包的前64字节,可将该值设置为64)

network :
链路类型, specifying the type of headers at the beginning of the packet (例,以太网是1, 详见tcpdump.org's link-layer header types page,<--这里还有些关于DLT-Value的解释)
常用类型:

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

2.2 Record (Packet) Header

每个捕获的包都以Packet Header开始(any byte alignment possible):

  1. typedef struct pcaprec_hdr_s {
  2. guint32 ts_sec; /* timestamp seconds */
  3. guint32 ts_usec; /* timestamp microseconds */
  4. guint32 incl_len; /* number of octets of packet saved in file */
  5. guint32 orig_len; /* actual length of packet */
  6. } pcaprec_hdr_t;

ts_sec :
时间戳高位,精确到seconds(值是自从January 1, 1970 00:00:00 GMT以来的秒数来记),其实就是UN*X的time_t,可以用ANSI C time.h中的time()函数来获取这个值。如果时间戳不是基于GMT的,需调整global header中的thiszone

ts_usec :
时间戳低位。
一般的pcap文件中,精确到microseconds (数据包被捕获时候的微秒数,是自ts-sec的偏移量)
在纳秒精度的文件中,这个字段是数据包被捕获时候的纳秒数
注意:这个字段的值不能大于1秒

incl_len :
捕获且存储在PCAP文件中的数据包长度
其实就是min[orig_len,snaplen]

orig_len :
这个数据包在网络中的原始长度。

2.3 Packet Data

The actual packet data will immediately follow the packet header as a data blob of incl_len bytes without a specific byte alignment.

3. Libraries

由于格式简单,实现读写libpcap文件的功能实现应该不是太难。但是如果想要使用库来完成这个目的,或者从网络中捕获一些数据包,有下面的这些库可用:

libpcap: the origin of this file format (for UN*X based systems)
WinPcap: Windows based version of libpcap

有各种语言的封装(你需要先装上面的两个库之一):

Net::Pcap: Perl based libpcap wrapper
Jpcap: JAVA based libpcap wrapper
python-libpcap: Python based libpcap wrapper
Ruby/Pcap: Ruby based libpcap wrapper
... 如果还是没有你喜欢的语言,请使用Google ...

注意:
如果自己编写代码,是不能读取"next generation libpcap"格式的抓包文件的。使用libpcap,也只能读取【没有使用当前libpcap API不支持的特性】(如,不同链路类型的多个接口的数据包)的pcapng文件。 所以应尽可能使用libpcap/WinPcap库,而不是自己写代码。

4. 不足

5. 展望——NTAR

libpcap尚缺少一些实用的特性, There's a proposal of a next generation pcap file format available at: http://www.winpcap.org/ntar/draft/PCAP-DumpFileFormat.html. 新的格式提供了“不足”中列出的很多性能。

This is still a proposal for quite a while now. Wireshark目前尽管不能支持所有pcap-NG的性能,但已经可以读取一些pcap-NG文件,libpcap 1.1.0及以后的版本也可以读取(能力受限)pcap-NG文件

NTAR - Network Trace Archival and Retrieval库目前正在开发。完成后,它可以读写pcap-NG格式的所有记录,但不是解释它们(像Wireshark做的那样)。未来libpcap和Wireshark将使用这个库,解释捕获数据包的记录。

More details about the integrating of the pcapng file format into Wireshark at: Development/PcapNg

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注