tcpdump-icmp-ip报文分片

55次阅读

共计 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
简单解释
  1. id 都为 27081,说明为同一个 ip 数据报的分片。
  2. 第一个 ip 分组的 offset 为 0,第二个为 1480.
  3. 第一个 ip 分组的 flags 为 +,实则设置了 MF 标志,表示后续还有分片,第二个 flag 为 none
  4. 第一个 ip 分组长度为 1500,第二个为 21
-l 1473 字节的由来
  1. 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
  2. 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)
    
  3. 一般 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 个字节。

正文完
 0