Pcap文件中是二进制,使用winhex软件,打开是十六进制数,winhex是只有十六进制数,而wireshake自动将pcap中的数据包按照时间顺序将分开并赋予一个No.标号(标号是时间顺序)。
图1 winhex软件打开pcap文件
图2wireshake打开pcap文件
图3pcap包文件格式
Wireshake页面不显示pcap报头和数据报头(点击no.编号出来右下角的十六进制是没有显示pcap报头和数据报头,只显示数据部分)个人理解
下面分别介绍文件头,数据报头,数据这三个部分
1.pcap报头(24字节)
magic; 标识位:32位的,这个标识位的值是16进制的 0xa1b2c3d4
version_major;主版本号:16位,2个字节, 默认值为0x0002。
version_minor;副版本号:16位,默认值为0x0004。
thiszone;区域时间:32位,实际上该值并未使用,因此可以将该位设置为0。
sigfigs;精确时间戳:32位,实际上该值并未使用,因此可以将该值设置为0。
snaplen;数据包最大长度:32位,该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535;
linktype;链路层类型:32位, 数据包的链路层包头决定了链路层的类型。
以下是数据值与链路层类型linktype的对应表
0 BSD loopback devices, except for later OpenBSD
1 Ethernet, and Linux loopback devices 以太网类型,大多数的数据包为这种类型。
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
10 FDDI
100 LLC/SNAP-encapsulated ATM
101 raw IP, with no link
102 BSD/OS SLIP
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 later OpenBSD loopback devices (with the AF_value in network byte order)
113 special Linux cooked capture
114 LocalTalk
pcap报头部分对应图1的第一行和第二行的前半段
图4 winhex软件中的第一个数据包pcap报头部分
2.数据包头
秒计时(timestamp):32位,一个UNIX格式的精确到秒时间值,用来记录数据包抓获的时间,记录方式是记录从格林尼治时间的1970年1月1日 00:00:00 到抓包时经过的秒数;
微秒计时(timestamp):32位, 抓取数据包时的微秒值。
数据包长度(caplen):32位 ,标识所抓获的数据包保存在pcap文件中的实际长度,以字节为单位。
当前数据区的长度:即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。(对应上文的42 00 00 00)
数据包实际长度(len): 所抓获的数据包的真实长度,如果文件中保存不是完整的数据包,那么这个值可能要比前面的数据包长度的值大。(对应上文的42 00 00 00)
离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。该文件的第一个数据包的数据包头部分Caplen和Len相同)
对应图1的第二行的后半段和第三行的前半段
图5 winhex软件中的第一个数据包数据包头部分
注解:
第一个数据包是42 00 00 00,因为是小端模式,应该是00000042,转化为10进制就是66,wireshake统计的是66,如下图
图6wireshake软件统计的第一个数据包的长度
3.Packet Data 数据
该部分wireshake可以显示
图8wireshake软件中的第一个数据包数据部分
图9wireshake软件统计的第一个数据包的信息
94e6f7表示的目的地址
8c38e0表示的源地址
类型是0800,是ipv4
对应图1的第三行后半段和第四行的部分
以上是数据包共同部分,下面是不同的部分,简单介绍下ipv4,我们展示的第一个数据包也是ipv4
经典的ipv4数据包结构:
version: 占据半个字节(4位),表示IP协议的版本号,占用4位。IPv4和IPv6分别有不同的版本号。
IHL: 占据半个字节(4位),表示IP头部的长度,以32位字为单位,因此需要除以4得到实际长度。通常IPv4的头部长度是20字节,IPv6的头部长度是40字节。
DS字段: 占据一个字节(8位),表示服务类型(Type of Service),用于指示数据包的优先级、延迟、吞吐量等信息。
iplen: 占据两个字节(16位),表示IP数据报总长度,包括IP头部和数据部分。
flag: 占据两个字节(16位),表示标识字段。该字段通常用于数据包的分片和重新组装。在3层对流量进行区分、标记。 (如果数据是基于UDP传输的,因为UDP没有序列号不能进行差错控制,所以需要在IP报文中支持差错控制——要把所有分片的数据进行重组)
通常每发送一份报文该值+1,该值在数据分片时,会复制到每一个片中。所以在重组分片包的时候会观察该值。
把该值相同的分片收集到一起重组。
falg: 占据两个字节(16位),表示标志位。
offset: 占据两个字节(16位),表示片偏移。用于指示分片在原始数据报中的位置。其中高3位用于控制分片的相关操作。高三位是标志位(3位),其他位是分片偏移(13位),高三位:
第一位Bit:R:保留位(Reserved Bit) ——该位一般置位0
第二位BIt:DF:不分片位(Don‘t Fragment)——能否分片位 该位置1(不分片) 置0(分片)
第三位Bit:MF:更多分片位 (More Fragment)——表示是否该报文为最后一片 0表示最后一片 该位置1表示后面还有更多分片
后十三位分片偏移:每一个分片的数据字段偏移原始数据报开始处的位置。
例:原始数据报的数据字段总长为1461bytes,使用TCP传输,对该数据报分片,第一片
的offset字段为0,第二片的offset字段就应该为1460
ttl: 占据一个字节(8位),表示生存时间(Time to Live),用于限制数据包在网络中的生存时间,每经过一个路由器,TTL减1,直到为0时被丢弃。
protocol: 占据一个字节(8位),表示上层协议的类型,例如TCP、UDP或ICMP。范围:1~255
描述上层使用什么协议 Tcp=6 UDP=17 ICMP=1 OSPF=89
checksum: 占据两个字节(16位),表示头部校验和,用于验证IP头部在传输过程中是否出现错误。
src_ip: 占据四个字节(32位),表示源IP地址。
dst_ip: 占据四个字节(32位),表示目标IP地址。
后面的是数据部分
不同协议的数据部分不同:
Osi各层的常见协议: