我正在尝试调试网络问题。在此过程中,我注意到当我尝试执行 arping 时,收到的 arp 数据包大于发送的 arp 数据包,如 tcpdump 输出所示。
(注意两端都有一个br100
到eth1
接口的桥)。
命令:
# arping 10.40.0.5 -I br100 -c1
ARPING 10.40.0.5 from 10.40.0.1 br100
Sent 1 probes (1 broadcast(s))
Received 0 response(s)
tcpdump(发送方):
# tcpdump -nnvvXSs 1514 arp -i eth1
tcpdump: WARNING: eth1: no IPv4 address assigned
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 1514 bytes
21:32:29.529106 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.40.0.5 (ff:ff:ff:ff:ff:ff) tell 10.40.0.1, length 28
0x0000: 0001 0800 0604 0001 5478 1a86 50c9 0a28 ........Tx..P..(
0x0010: 0001 ffff ffff ffff 0a28 0005 .........(..
tcpdump(接收方):
# tcpdump -nnvvXSs 1514 arp -i eth1
tcpdump: WARNING: eth1: no IPv4 address assigned
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 1514 bytes
21:32:29.532966 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.40.0.5 (ff:ff:ff:ff:ff:ff) tell 10.40.0.1, length 46
0x0000: 0001 0800 0604 0001 5478 1a86 50c9 0a28 ........Tx..P..(
0x0010: 0001 ffff ffff ffff 0a28 0005 0000 0000 .........(......
0x0020: 0000 0000 0000 0000 0000 dac7 07ed ..............
收到的 arp 数据包比发送的 arp 数据包大 18 个字节。我试图弄清楚这是否正常,或者是一个问题。(此数据包最终被绑定到无法正确接收它的虚拟机实例)。
谁添加了这 18 个字节?为什么?是发送方、交换机还是接收方?它们意味着什么?
我怀疑它是(Cisco Nexus 3000)交换机,并且与 802.1Q 封装有关。
答案1
46 字节是以太网数据包中允许的最小用户数据量。
有一个 8 字节的前导码、一个 6 字节的目标 MAC、一个 6 字节的源 MAC、一个 2 字节的类型/长度、用户数据和一个 4 字节的帧校验序列。由于最小数据包为 64 字节,即用户数据不能少于46字节。
以太网顶层的每个协议都必须处理这个问题。ARP 通过忽略数据后的“垃圾”来处理这个问题。
答案2
只想添加额外的信息(网络视角),为什么路由器在什么条件下不接受数据包
如果数据包大小低于 64 字节,则路由器将假定数据包为 RUNT 并拒绝该数据包
(数据包 <= 64 拒绝 RUNT 数据包)
由于数据包头大小本身就是 64 个头,因此看起来数据包不包含数据,这是由于数据包损坏造成的。
如果数据包大小超过端口(路由器)MTU(快速以太网默认为 1500,千兆接口默认为 9000),则数据包将被视为巨型数据包并拒绝该数据包。由于端口 MTU 为 1500,因此不会接受该数据包。
(数据包 > 端口 MTU(1500)将其作为 GIANT 拒绝)
如果数据包大小为 1519-1564,则此数据包称为 Jambo 婴儿数据包,并且仅接受端口 MTU 为 9000 的数据包
如果所有条件都通过,则路由器将执行循环冗余校验(CRC)