pcap格式, 常用的文件格式, 采用tcpdump或者wireshark得到的文件格式.
pcap文件的组成如下:
Global Header
Packet Header
Packet Data
Packet Header
Packet Data
Packet Header
Packet Data
...
先用wireshark抓一个包,然后用ultraedit的十六进制模式打开该文件对照一下:
抓包后的界面如下 可以看到是一个tcp连接发起的syn包:
14个字节的mac层baotou
20个字节的ip包头
20个字节的tcp包头
外加
12个字节的tcp包头可选项
总共54+12 = 66个字节
然后用ultraedit打开对照看一下, pcap文件究竟是个什么乾坤:
第一部分是 Global Length
首先是4个字节的magic number, 这个主要是用来标识文件类型的
接着是major number, minor number, 文件格式的主次版本号, 因为是网络字节序,所以反过来读 0002, 0004, 也就是2.4
在下面就是包头中时间戳和 UTC时间的偏移量, 秒为单位, 这里是全0, 经常是全0, 包头中的时间戳加上该偏移量就是该包被抓到时的UTC时间.
紧接着的4个字节是时间戳的精度, 几乎是个扯淡的字段,所以这个字段一般就是 00 00 00 00
再下面4个字节是snap length, 也就是你抓包时截断的大小, 全抓一般是 65535, 也就是0xFFFF,网络字节序,表示为 FF FF 00 00
第二部分是Packet Header
最先的4个字节是网络类型 , 为 01 00 00 00 , 反过来 00 00 00 01, 也就是以太网,即在以太网上面抓到的包
下面8个字节分别是,该包的时间戳, 前面4个是 秒为单位, 后面4个是 纳秒为单位,同样是网络字节序
让我们来算算
1970.01.01 00:00:00.000000 + 0x4D032640秒 + 0x000A4223纳秒是多少
0x4D032640秒 = 1292052032秒 = 14954天 + 7小时 + 20分 + 32秒
0x000A4223纳秒 = 672291纳秒
正好是 2010.12.11 15:20:32.672291 秒
bingo, 看来没错了!
下面的8个字节分别是 抓包字节数(4字节), 包原始字节数(4字节), 看来一点不漏的抓下来了.
0x42 = 4x16 + 2 = 64 + 2 = 66字节, 一点不差.
补充:
magic_number:
用于检测文件格式和字节序, magic number的原始数据为 0xA1B2C3D4, 如果读到的magic number被反转过,那么下面global header和packet header中的所有字段的值都是被反转过的, 在转换时就需要反转一下.
至于包的数据部分,原始是什么样就是什么样,没有边界对齐什么的.
network
1为以太网
6为令牌环网
10为FDDI
0为回环接口