1、关键术语
最大传输单元(Maximum Transmission Unit,MTU)
最大报文段长度(Maximum Segment Size,MSS)
循环冗余校验(Cyclic Redundancy Check,CRC)
帧检验序列(Frame Check Sequence,FCS)
2、协议码
ICMP:1
IGMP:2
TCP:6
UDP:17
EIGRP:88
OSPF:89
根据 [RFC894] 的说明,以太网封装IP数据包的最大长度是1500字节,最小长度是46字节,再加上各层封装和校验码(CRC校验计算得到的FCS),总字节应该为 72~1526 字节。
最大字节
= 前导同步码(7字节) + 帧开始定界符(1字节) + 目的MAC(6字节) + 源MAC(6字节) + 帧类型(2字节) + 数据(46~1500) + FCS(4字节)
= 72~1526 字节
按照上述,最大帧应该是 1526 字节,但是实际上我们抓包得到的最大帧是 1514 字节,为什么呢?
原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和出错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交给“设备驱动程序”做进一步处理。这时我们抓包的软件才能抓到数据,因此,抓包wireshark软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据。
数据帧字节 = 目的MAC(6字节) + 源MAC(6字节) + 帧类型(2字节) + 数据(46~1500) + FCS(4字节)
计算最大帧 = 1518,wireshark抓取最大帧 = 1514
计算最小帧 = 64,wireshark抓取最小帧 = 60
采取最简单且有效的方式——ping,简单有效控制报文长度。ping 是基于 IP 协议的 ICMP 报文格式。
2、ping 命令
目的MAC(6字节)、 源MAC(6字节)、帧类型(2字节)、 FCS(4字节)、IP 首部(20字节)、ICMP 首部(8字节) ,这里就占了 46 字节。
最小帧为 64 字节,抓包就为 60,我们就以分别发送 10、50 字节查看分组;
最大帧为 1518 字节,抓包就为 1514,我们就以分别发送 1472、1473 字节查看分组。
# 以学校网址为例,不跟后面的默认32
ping www.swust.edu.cn -l 5
ping www.swust.edu.cn -l 50
ping www.swust.edu.cn -l 1472
ping www.swust.edu.cn -l 1473
前三个结果没有分片
不足 60 字节,填充 0(根据各自设备驱动程序规则)直到 60 字节
超过1500字节的会分片,1473 + 8 + 20 = 1501,所以分为 1480 和 1,第二片在第一片后面就没有 ICMP 首部,分别为 1480 + 34 = 1514 和 1 + 34 = 35
可以看到不为 60 字节,就会填充到 60 字节,而超过 1514 字节,就会分片。
但是有时 ping 网络上网址,抓包小于 60,例如自己宽带
由于填充数据是由 MAC 子层负责,也就是设备驱动程序。不同的抓包程序和设备驱动程序所处的优先层次可能不同,抓包程序的优先级可能比设备驱动程序更高,也就是说,我们的抓包程序可能在设备驱动程序还没有填充不到 64 字节帧的时候,已经捕获了数据,导致有 60 字节也有小于 60 字节的情况。
抓包工具的不同: wireshark 抓到的可能没有填充数据段,而 sniffer 抓到的就有填充数据段。
使用的网络不用:宽带 抓到的可能没有填充数据段,校园网 抓到的就有填充数据段。
3、wireshark抓包分析
v Frame 2: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) on interface 0
v Interface id: 0 (\Device\NPF_{258BB613-5DA9-4E92-923E-8CDBC68345B0})
Interface name: \Device\NPF_{258BB613-5DA9-4E92-923E-8CDBC68345B0}
Interface description: WLAN
Encapsulation type: Ethernet (1)
Arrival Time: Dec 7, 2019 19:32:00.332245000 中国标准时间
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1575718320.332245000 seconds
[Time delta from previous captured frame: 0.044843000 seconds]
[Time delta from previous displayed frame: 0.044843000 seconds]
[Time since reference or first frame: 0.044843000 seconds]
Frame Number: 2
Frame Length: 60 bytes (480 bits)
Capture Length: 60 bytes (480 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: eth:ethertype:ip:icmp:data]
[Coloring Rule Name: ICMP]
[Coloring Rule String: icmp || icmpv6]
v Ethernet II, Src: RuijieNe_5f:b2:32 (58:69:6c:5f:b2:32), Dst: Cybertan_83:22:81 (60:14:b3:83:22:81)
v Destination: Cybertan_83:22:81 (60:14:b3:83:22:81) #目的地 MAC 地址,6字节
Address: Cybertan_83:22:81 (60:14:b3:83:22:81)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
v Source: RuijieNe_5f:b2:32 (58:69:6c:5f:b2:32) #源 MAC 地址,6字节
Address: RuijieNe_5f:b2:32 (58:69:6c:5f:b2:32)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: IPv4 (0x0800) #类型,2字节
Padding: 002198530000380130a0246ed5 #填充数据,13字节
v Internet Protocol Version 4, Src: 36.110.213.45, Dst: 10.16.80.85
0100 .... = Version: 4 #版本号,4比特 = 1/2字节
.... 0101 = Header Length: 20 bytes (5) #首部长度,4比特 = 1/2字节
v Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) #服务类型,1字节
0000 00.. = Differentiated Services Codepoint: Default (0)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 33 #数据总长度,2字节
Identification: 0x9853 (38995) #识别码,2字节
v Flags: 0x0000 #偏移量,2字节
0... .... .... .... = Reserved bit: Not set
.0.. .... .... .... = Don't fragment: Not set
..0. .... .... .... = More fragments: Not set
...0 0000 0000 0000 = Fragment offset: 0
Time to live: 54 #TTL,1字节
Protocol: ICMP (1) #类型码,1字节
Header checksum: 0x9888 [validation disabled] #首部校验和,只是检验数据,2字节
[Header checksum status: Unverified]
Source: 36.110.213.45 #源IP,4字节
Destination: 10.16.80.85 #目的地IP,4字节
v Internet Control Message Protocol
Type: 0 (Echo (ping) reply) #类型,1字节
Code: 0 #符号,1字节
Checksum: 0xd2e7 [correct] #ICMP校验和,2字节
[Checksum Status: Good]
Identifier (BE): 1 (0x0001) #ID,2字节
Identifier (LE): 256 (0x0100)
Sequence number (BE): 848 (0x0350) #序号,2字节
Sequence number (LE): 20483 (0x5003)
[Request frame: 1] #响应分组 1
[Response time: 44.843 ms]
v Data (5 bytes) #5个数据,16进制
Data: 6162636465
[Length: 5]
1、查看网络接口MTU的方法(Windows):
(1)详细查看:netstat -e -v
(2)初略查看:netsh interface ip show interface
3、wireshark抓不到FCS(CRC校验)
(1)以太网帧结构以及CRC校验
https://blog.csdn.net/a1414345/article/details/72781130
(2)以太网最大帧和最小帧、MTU
https://blog.csdn.net/shennongzhaizhu/article/details/52004183
(3)如何计算icmp校验和
https://blog.csdn.net/zhj082/article/details/80518322
(4)wireshark提问官网
https://ask.wireshark.org/questions/