我正在通过 IPv6使用 iperf ( https://iperf.fr/ ) 进行一些 UDP 带宽测试。使用带有以下命令行的 Linux UDP 客户端时,我的结果非常糟糕:
iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m
调查 Wireshark 的问题我发现客户端发送数据时存在一些碎片。更准确地说,我看到 UDP 客户端传出的数据包大小为 1510 字节和 92 字节,交替出现。例如,我看到的 UDP 数据包具有以下模式(大小):1510、92、1510、92、1510、92、...、1510、92、...
阅读 iperf2 文档我为选项 (-l) 阅读了以下内容:
要读取或写入的缓冲区的长度。iPerf 通过多次写入一个 len 字节数组来工作。TCP 的默认值为 8 KB,UDP 的默认值为 1470 字节。请注意,对于 UDP,这是数据报大小,在使用 IPv6 寻址时需要将其降低到 1450 或更少以避免碎片。另请参见 -n 和 -t 选项。
我尝试通过将 Linux iperf UDP 客户端命令行替换为以下内容来进行相同的带宽测试:
iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m -l1450
我看到了很好的结果。看着 Wireshark 捕获,我再也看不到碎片了。
在 IPv4 上进行相同的测试我不需要更改默认的 UDP 数据报大小(我不需要使用 '-l' 选项)以获得良好的结果。
所以我的结论是分片(通过 IPv6)是造成带宽性能不佳的原因。
无论如何,我想知道在通过 IPv6 将 UDP 数据报大小设置为 1450 时会发生什么。为什么使用 UDP 数据报大小的默认值在 IPv6 上而不是在 IPv4 上进行分段?此外,为什么我将UDP数据报大小减小到1450时没有碎片?
谢谢你。