来自于知乎的几个问题,都是有关于 ARP 和 64 字节方面,主要如下:
ARP报文长度为什么可以小于64?
wireshark下抓取arp报文长度不全为42B?
为什么Wireshark抓到的ARP包长度小于64?
为什么可以小于 64 ?
64 字节的说法,我想大家应该都知道是什么样的组成。
14 字节 ( Ethernet II 首部长度 ) + 46 字节 ( 数据字段最小长度要求 ) + 4 字节 ( CRC ) = 64 字节
因此数据字段的最小长度是 46 字节,这意味着如果是 ARP 数据包,则 46 字节的组成如下
28 字节 ( ARP 请求或应答 ) + 18 字节 ( Padding 填充数据 ) = 46 字节
为什么其中一个 ARP 报文长度显示是 42 ?
原因是 Wireshark 的抓包方式(或者说是原理,最后附简图,详细的可以看下官网说明)和位置,Wireshark 抓包位置如果是在本地,那么对于本地产生所发出的数据包,是在进网卡之前所抓取的包,而填充数据以及 CRC 一般是由网卡硬件/驱动程序完成,所以 42 字节的组成并不包含填充数据和 CRC 部分。
14 字节 ( Ethernet II 首部长度 ) + 28 字节 ( ARP 请求或应答 ) = 42 字节
为什么另一个 ARP 报文长度显示是 60 ?
综合以上,就很好理解了,60 是来自对方的 ARP 响应包,包含了填充数据 (对方网卡完成),但不含 CRC 部分 (本地网卡剥离,可以说普通网卡基本都会剥离它,Wireshark 看不到 CRC 部分)。
14 字节 ( Ethernet II 首部长度 ) + 46 字节 ( 数据字段最小长度要求 ) = 60 字节
之前回答问题大概分析了下,不过提问人并没有进一步反馈抓包环境,也就没有进一步求证了,权当以下是标准答案了
为什么 ARP 报文长度显示是 56 ?
对比看了下源mac,一个apple,一个huawei,应该是两个设备网卡支持 802.1Q 标记与否的区别。apple 支持,所以发出来的 arp 数据包,就包含有 4 字节 的 802.1Q 标记,填充字段为 14 字节。中间过了个路由交换设备,去除 802.1Q 标记,但不会再补充填充字段。所以 56 字节组成是:
14 字节 ( Ethernet II 首部长度 ) + 42 字节 ( 28 字节 ARP 数据包 + 14 字节填充数据 ) = 56 字节
当然不仅仅是 ARP 报文,对于以太网帧 64 或者 60 字节长度来说,数据字段最小长度要求始终是 46 字节 ,再根据不同的以太网类型和长度,决定是否需要 Padding 。
附:Wireshark function blocks