iperf UDP over IPv6

Sal*_*ore 1 linux udp bandwidth ipv6 iperf

我正在使用iperf(https://iperf.fr/)通过IPv6 进行一些UDP带宽测试.使用具有以下命令行的Linux UDP客户端时,我的结果非常糟糕:

iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m
Run Code Online (Sandbox Code Playgroud)

调查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
Run Code Online (Sandbox Code Playgroud)

我看到了很好的结果.看看Wireshark捕获,我看不到任何碎片了.

在IPv4上进行相同的测试我不需要更改默认的UDP数据报大小(我不需要使用'-l'选项)来获得良好的结果.

所以我的结论是碎片(通过IPv6)导致带宽性能不佳.

无论如何,我想知道在IPv6上将UDP数据报大小设置为1450时会发生什么.为什么我在IPv6上存在碎片,而不是在UDP上使用UDP数据报大小的默认值?此外,为什么在将UDP数据报大小减小到1450时没有碎片?

谢谢.

San*_*ann 5

基本IPv4报头为20字节,基本IPv6报头为40字节,UDP报头为8字节.

使用IPv4时,总数据包大小为1470 + 8 + 20 = 1498,小于默认的以太网MTU 1500.

使用IPv6时,总数据包大小为1470 + 8 + 40 = 1518,超过1500且必须进行分段.

现在让我们看看你的观察.您会看到大小为1510和92的数据包.其中包括以太网标头,即14个字节.因此,您的IPv6数据包为1496和78字节.大数据包的内容是:IPv6标头(40字节),分段标头(8),UDP标头(8)和1440字节的数据.较小的分组包含IPv6报头(40),分段报头(8)和剩余的30个字节的数据.