此tcpdump输出是通过简单的集线器连接从主机 1 向主机 2 发送单个 ping 包的结果:
root@mininet-vm:~# tcpdump -XX -n -i h2-eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on h2-eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
00:19:06.466207 ARP, Request who-has 10.0.0.2 tell 10.0.0.1, length 28
0x0000: ffff ffff ffff 0000 0000 0001 0806 0001 ................
0x0010: 0800 0604 0001 0000 0000 0001 0a00 0001 ................
0x0020: 0000 0000 0000 0a00 0002 ..........
00:19:06.466285 ARP, Reply 10.0.0.2 is-at 00:00:00:00:00:02, length 28
0x0000: 0000 0000 0001 0000 0000 0002 0806 0001 ................
0x0010: 0800 0604 0002 0000 0000 0002 0a00 0002 ................
0x0020: 0000 0000 0001 0a00 0001 ..........
00:19:06.468925 IP 10.0.0.1 > 10.0.0.2: ICMP echo request, id 4587, seq 1, length 64
0x0000: 0000 0000 0002 0000 0000 0001 0800 4500 ..............E.
0x0010: 0054 ac58 4000 4001 7a4e 0a00 0001 0a00 .T.X@.@.zN......
0x0020: 0002 0800 7d50 11eb 0001 ea2e f155 0000 ....}P.......U..
0x0030: 0000 c86b 0600 0000 0000 1011 1213 1415 ...k............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
00:19:06.468961 IP 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 4587, seq 1, length 64
0x0000: 0000 0000 0001 0000 0000 0002 0800 4500 ..............E.
0x0010: 0054 d17f 0000 4001 9527 0a00 0002 0a00 .T....@..'......
0x0020: 0001 0000 8550 11eb 0001 ea2e f155 0000 .....P.......U..
0x0030: 0000 c86b 0600 0000 0000 1011 1213 1415 ...k............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
00:19:11.471904 ARP, Request who-has 10.0.0.1 tell 10.0.0.2, length 28
0x0000: 0000 0000 0001 0000 0000 0002 0806 0001 ................
0x0010: 0800 0604 0001 0000 0000 0002 0a00 0002 ................
0x0020: 0000 0000 0000 0a00 0001 ..........
00:19:11.509755 ARP, Reply 10.0.0.1 is-at 00:00:00:00:00:01, length 28
0x0000: 0000 0000 0002 0000 0000 0001 0806 0001 ................
0x0010: 0800 0604 0002 0000 0000 0001 0a00 0001 ................
0x0020: 0000 0000 0002 0a00 0002 ..........
我对输出的顺序有点困惑。
我会假设顺序
ARP-request host 1 to host 2
ARP-reply host 2 to host 1
ICMP echo request host 1 to host 2
ARP-request host 2 to host 1
ARP-reply host 1 to host 2
ICMP echo reply host 2 to host 1
但tcpdump显示顺序
ARP-request host 1 to host 2
ARP-reply host 2 to host 1
ICMP echo request host 1 to host 2
ICMP echo reply host 2 to host 1
ARP-request host 2 to host 1
ARP-reply host 1 to host 2
我不明白。
我的假设是,在通过 ICMP 进行回声回复之前,主机 2 必须使用 ARP 请求主机 1 的 MAC 地址。
我怎么了?
或者tcpdump只是更改其输出格式的顺序,以便 ICMP 请求和回复在tcpdump的输出中相距不远?
更新:所有主机和网络集线器都运行带有内核 3.13.0-24-generic 的 Ubuntu 14.04(更准确地说:我正在运行一个 VM,我在其中运行带有集线器星型拓扑的 mininet)。