一、关键术语和协议码
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
二、报文分析
前同步码:第一个字段是7个字节的前同步码,1和0交替,作用是用来使接收端的适配器在接收MAC帧时能够迅速调整时钟频率,使它和发送端的频率相同。帧开始定界符:第二个字段是1个字节的帧开始定界符,前六位1和0交替,最后的两个连续1表示告诉接收端适配器:“帧信息要来了,你准备接收把。MAC 目的地址:第三个字段是6字节(如:FF,FF,FF,FF,FF),发送方的网卡(MAC)地址,用处是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同则会进一步处理,不同则直接丢弃。源MAC地址:发送端的MAC地址同样占6个字节。类型:该字段在网络协议栈分解中及其重要,考虑当PDU(协议数据单元)来到某一层时,它需要将PDU交付给上层,而上层协议众多,所以在处理数据的时候,必须要一个字段标识我这个交付给谁。数据:数据也叫有效载荷,除过当前层协议需要使用的字段外,即需要交付给上层的数据,以太网帧数据长度规定最小为46字节,最大为1500字节,如果有不到46字节时,会用填充字节填充到最小长度。帧检验序列FCS(使用CRC校验法):检测该帧是否出现差错。三、MTU
根据 [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
四、wireshark抓包分析
采取最简单且有效的方式——ping,简单有效控制报文长度。ping 是基于 IP 协议的 ICMP 报文格式。
1、ICMP报文格式
2、ping 命令
目的MAC(6字节)、 源MAC(6字节)、帧类型(2字节)、 FCS(4字节)、IP 首部(20字节)、ICMP 首部(8字节) ,这里就占了 46 字节。
最小帧为 64 字节,抓包就为 60,我们就以分别发送 10、50 字节查看分组;
最大帧为 1518 字节,抓包就为 1514,我们就以分别发送 1472、1473 字节查看分组。
# 以学校网址为例,不跟后面的默认32ping www. -l 5ping www. -l 50ping www. -l 1472ping www. -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 0v Interface id: 0 (\Device\NPF_{258BB613-5DA9-4E92-923E-8CDBC68345B0})Interface name: \Device\NPF_{258BB613-5DA9-4E92-923E-8CDBC68345B0}Interface description: WLANEncapsulation type: Ethernet (1)Arrival Time: Dec 7, 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: 2Frame 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.850100 .... = 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: 0Time 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 ProtocolType: 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校验
/a1414345/article/details/72781130
(2)以太网最大帧和最小帧、MTU
/shennongzhaizhu/article/details/5183
(3)如何计算icmp校验和
/zhj082/article/details/80518322
(4)wireshark提问官网
/questions/