为什么 iperf、scamper 和路径 MTU 发现数据包捕获在路径的 MTU 上不一致?

网络工程 路由 ipv4
2021-07-22 17:58:03

让我们在由运行 Shorewall 生成的 iptables 规则的 Debian 路由器分隔的两个 Debian 主机之间进行一些路径 MTU 发现。两个主机中的每一个都使用单个以太网链路,而路由器在两个聚合以太网链路上使用标记的 VLAN。

使用诈骗

root@kitandara:/home/jm# scamper -I "trace -M 10.64.0.2"
traceroute from 10.1.0.5 to 10.64.0.2
 1  10.1.0.1  0.180 ms [mtu: 6128]
 2  10.64.0.2  0.243 ms [mtu: 6128]

好:6128 字节是预期的结果(廉价的 Realtek 以太网适配器无法处理合适大小的巨型帧)。

现在,让iperf进行吞吐量测试,顺便告诉我们 MTU:

root@kitandara:/home/jm# iperf -c 10.64.0.2 -N -m
------------------------------------------------------------
Client connecting to 10.64.0.2, TCP port 5001
TCP window size: 66.2 KByte (default)
------------------------------------------------------------
[  3] local 10.1.0.5 port 59828 connected with 10.64.0.2 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1011 MBytes   848 Mbits/sec
[  3] MSS size 6076 bytes (MTU 6116 bytes, unknown interface)

6116 字节?为什么 ?

现在对于完全不同的东西,让我们看看这个会话的流量实际包含什么:

root@kitandara:/home/jm# tshark -i eth0 -R "(ip.dst == 10.64.0.2) || (ip.src == 10.64.0.2)" | head
Capturing on eth0
  1.308557     10.1.0.5 -> 10.64.0.2    TCP 74 60310 > 5001 [SYN] Seq=0 Win=5340 Len=0 MSS=534 SACK_PERM=1 TSval=101928961 TSecr=0 WS=16
  1.308801    10.64.0.2 -> 10.1.0.5     TCP 74 5001 > 60310 [SYN, ACK] Seq=0 Ack=1 Win=18328 Len=0 MSS=6088 SACK_PERM=1 TSval=3764064056 TSecr=101928961 WS=64

6088 字节 MSS,这意味着 6128 MTU……很好。但是为什么 iperf 会宣布 6116 字节的 MTU 呢?

在这一点上,彻底性要求仔细查看在 scamper 跟踪会话期间发生的事情:

root@kitandara:/home/jm# tshark -i eth0 -R "(ip.dst == 10.64.0.2) || (ip.src == 10.64.0.2)"
Capturing on eth0
  0.000000     10.1.0.5 -> 10.64.0.2    UDP 58 Source port: 43870  Destination port: 33435
  0.000175     10.1.0.1 -> 10.1.0.5     ICMP 86 Time-to-live exceeded (Time to live exceeded in transit)
  0.050358     10.1.0.5 -> 10.64.0.2    UDP 58 Source port: 43870  Destination port: 33436
  0.050592    10.64.0.2 -> 10.1.0.5     ICMP 86 Destination unreachable (Port unreachable)
  0.099790     10.1.0.5 -> 10.64.0.2    UDP 6142 Source port: 43870  Destination port: 33437
  0.100912    10.64.0.2 -> 10.1.0.5     ICMP 590 Destination unreachable (Port unreachable)

除了最后两个数据包的 udp.length 为 6108 之外,所有这些数据包的 udp.length 都是 24... 但是,scamper 如何告诉我们路径 MTU 是 6128 呢?

6108, 6116, 6128... 这么多MTU可供选择!

2个回答

很有意思。

MSS(最大分段大小)= MTU - IP 标头 = 6076。

6076 + 40 = 6116。

Debian 是否正在使用 IP 标头中的 IP 选项字段?那可能是额外的 12 个字节...

tshark 报告以太网帧大小:6142 - 14(以太网标头)= 6128 IP 字节。

在使用大数据包进行 MTU 发现之前,scamper 会先使用小数据包执行跟踪路由(这就是为什么您会看到小数据包后跟大数据包)。这对于区分所有被丢弃/无响应的数据包和大数据包很有用。

https://www.usenix.org/conference/imc-05/inferring-and-debugging-path-mtu-discovery-failures