共计 5087 个字符,预计需要花费 13 分钟才能阅读完成。
介绍
主要演示了 tcpdump 捕捉 icmp 报文以及用 ping 命令指定 icmp 长度后 ip 分组的查看。
A 发起正常包 ping
C:\Users\yaxia>ping 10.70.30.60
正在 Ping 10.70.30.60 具有 32 字节的数据:
来自 10.70.30.60 的回复: 字节 =32 时间 <1ms TTL=64
来自 10.70.30.60 的回复: 字节 =32 时间 <1ms TTL=64
来自 10.70.30.60 的回复: 字节 =32 时间 <1ms TTL=64
来自 10.70.30.60 的回复: 字节 =32 时间 <1ms TTL=64
10.70.30.60 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间 (以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
B 端查看结果
root@php56:/home/tb# tcpdump -ntv -i enp0s3 icmp
tcpdump: listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
IP (tos 0x0, ttl 128, id 27746, offset 0, flags [none], proto ICMP (1), length 60)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4795, length 40
IP (tos 0x0, ttl 64, id 30075, offset 0, flags [none], proto ICMP (1), length 60)
10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4795, length 40
IP (tos 0x0, ttl 128, id 27748, offset 0, flags [none], proto ICMP (1), length 60)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4796, length 40
IP (tos 0x0, ttl 64, id 30127, offset 0, flags [none], proto ICMP (1), length 60)
10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4796, length 40
IP (tos 0x0, ttl 128, id 27750, offset 0, flags [none], proto ICMP (1), length 60)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4797, length 40
IP (tos 0x0, ttl 64, id 30365, offset 0, flags [none], proto ICMP (1), length 60)
10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4797, length 40
IP (tos 0x0, ttl 128, id 27752, offset 0, flags [none], proto ICMP (1), length 60)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4798, length 40
IP (tos 0x0, ttl 64, id 30534, offset 0, flags [none], proto ICMP (1), length 60)
10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4798, length 40
A 发送大于 MTU 的数据包
C:\Users\yaxia>ping 10.70.30.60 -l 1473
正在 Ping 10.70.30.60 具有 1473 字节的数据:
来自 10.70.30.60 的回复: 字节 =1473 时间 <1ms TTL=64
来自 10.70.30.60 的回复: 字节 =1473 时间 <1ms TTL=64
来自 10.70.30.60 的回复: 字节 =1473 时间 <1ms TTL=64
来自 10.70.30.60 的回复: 字节 =1473 时间 <1ms TTL=64
10.70.30.60 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间 (以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
B 接收结果(可以看到 ip 包多了一倍)
P (tos 0x0, ttl 128, id 27801, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4799, length 1480
IP (tos 0x0, ttl 128, id 27801, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.47 > 10.70.30.60: ip-proto-1
IP (tos 0x0, ttl 64, id 10022, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4799, length 1480
IP (tos 0x0, ttl 64, id 10022, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.60 > 10.70.30.47: ip-proto-1
IP (tos 0x0, ttl 128, id 27803, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4800, length 1480
IP (tos 0x0, ttl 128, id 27803, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.47 > 10.70.30.60: ip-proto-1
IP (tos 0x0, ttl 64, id 10189, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4800, length 1480
IP (tos 0x0, ttl 64, id 10189, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.60 > 10.70.30.47: ip-proto-1
IP (tos 0x0, ttl 128, id 27805, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4801, length 1480
IP (tos 0x0, ttl 128, id 27805, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.47 > 10.70.30.60: ip-proto-1
IP (tos 0x0, ttl 64, id 10418, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4801, length 1480
IP (tos 0x0, ttl 64, id 10418, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.60 > 10.70.30.47: ip-proto-1
IP (tos 0x0, ttl 128, id 27807, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4802, length 1480
IP (tos 0x0, ttl 128, id 27807, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.47 > 10.70.30.60: ip-proto-1
IP (tos 0x0, ttl 64, id 10429, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.60 > 10.70.30.47: ICMP echo reply, id 1, seq 4802, length 1480
IP (tos 0x0, ttl 64, id 10429, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.60 > 10.70.30.47: ip-proto-1
摘出来一个被分片的 ip 数据包
IP (tos 0x0, ttl 128, id 27801, offset 0, flags [+], proto ICMP (1), length 1500)
10.70.30.47 > 10.70.30.60: ICMP echo request, id 1, seq 4799, length 1480
IP (tos 0x0, ttl 128, id 27801, offset 1480, flags [none], proto ICMP (1), length 21)
10.70.30.47 > 10.70.30.60: ip-proto-1
简单解释
- id 都为 27081,说明为同一个 ip 数据报的分片。
- 第一个 ip 分组的 offset 为 0,第二个为 1480.
- 第一个 ip 分组的 flags 为 +,实则设置了 MF 标志,表示后续还有分片,第二个 flag 为 none
- 第一个 ip 分组长度为 1500,第二个为 21
-l 1473 字节的由来
-
win 下查看 A 端 mtu
C:\Users\yaxia>netsh interface ipv4 show subinterfaces MTU MediaSenseState 传入字节 传出字节 接口 ------ --------------- --------- --------- ------------- 4294967295 1 31577369 21149 Loopback Pseudo-Interface 1 1500 1 10271737813 4348038074 以太网 1500 1 4944 9536968 VirtualBox Host-Only Network
-
B 端 mtu ifconfig
enp0s3 Link encap:Ethernet HWaddr 08:00:27:ce:14:39 inet addr:10.70.30.60 Bcast:10.70.31.255 Mask:255.255.254.0 inet6 addr: fe80::a00:27ff:fece:1439/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3130176 errors:0 dropped:0 overruns:0 frame:0 TX packets:171929 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:361713379 (361.7 MB) TX bytes:124807829 (124.8 MB)
- 一般 ip 头部通常 20 个字节(选项 40 个字节为 0 的情况,所以说最长 ip 头部 60 个字节),以太网的帧 MTU 最大为 1500 字节,所以承载的 ip 的数据部分最大为 1480 字节。icmp 头部报文长度为 8 字节。如果我们用 ip 数据报封装一个长度为 1480+ 1 的 icmp 报文,那就需要 1481-8=1473 字节大小的 icmp 数据部分大小。所以 -l 为 1473。如果是封装正常的 ip 报文,比如 4000 个字节,可以参考以下算法:4000 字节中,正常 20 字节为 ip 包头,剩下 3980 字节为数据,需要分成 3 个 ip 片(假设链路层 MTU 为 1500),那么第一个分片的片偏移 offset 就是 0,表示该分片在 3980 的第 0 位开始,第 1479 位结束。第二个 ip 片的片偏移为 185(1480/8),表示该分片开始的位置在原来 ip 的第 1480 位,结束在 2959。第三片的片偏移为 370(2960/8),表示开始的时候是 2960 位,结束的时候在 3979 位。也不难得出,ip 数组分组的分片的单位是 8 个字节。
正文完