帧的数据字段的最小长度位46字节。如果IP数据报小于46字节,数据报必须被填充到46字节。当采用填充时,传递到网络层的数据包括IP数据报和填充部分。网络层使用IP数据报首部中的长度字段来去除填充部分。
当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和出错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,将帧交给“设备驱动程序”做进一步处理,将帧的数据字段的内容传递给网络层。这时我们抓包的软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据。
以太网中,IP数据报长度最小为46字节,负载不足46字节,在数据帧的末尾补0,但是补充的0属于以太网层,不属于数据部分。所以wireshark显示的数据帧最小长度是14字节 + 46字节 = 60 字节。
对于ICMP报文,当ICMP 请求报文的 payload 小于 18 字节时,ICMP响应报文会填充0, 但是它们有效负载的长度还是相同的.
计算方法: 46 - IP首部(20字节)-ICMP首部(8字节) = 18 字节。
最大传输单元(MTU):指由IP包头和数据部分组成的IP数据报长度。
以太网中, MTU 设置为 1500。所以ICMP负载长度最大值为
MTU(1500字节) - IP首部长度(20字节)-ICMP首部长度(8字节) = 1472 字节
当ICMP负载长度超过1472字节,ICMP 报文会被分片。如下图所示:
其中,帧354的负载大小为1480字节,等于ICMP最大负载长度(1472字节) + ICMP首部长度(8字节)
分片前 ICMP报文长度为1513字节 = 1480字节 + 33 字节
对应的数据帧:
帧354的长度1514 = 以太网帧首部(14字节) + IP首部(20字节) + ICMP首部(8字节)+ ICMP 负载长度(1472字节)
帧355的长度67字节 = 以太网帧首部(14字节) + IP首部(20字节) + 负载长度(33字节)
可见,帧355的长度67字节中不包含ICMP首部,使用scapy解析该数据包时找不到ICMP首部。
参考: