iperf UDP over IPv6
iperf UDP over IPv6
我正在通过 IPv6 使用 iperf (https://iperf.fr/) 进行一些 UDP 带宽测试。使用带有以下命令行的 Linux UDP 客户端时,我得到了非常糟糕的结果:
iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m
调查 Wireshark 的问题我发现在客户端发送数据时存在一些碎片。更准确地说,我看到交替出现大小为 1510 字节和 92 字节的 UDP 客户端传出数据包。
例如,我看到的 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 时到底发生了什么。为什么我在 IPv6 上有分段而不是在 IPv4 上有 UDP 数据报大小的默认值?另外,为什么我把UDP数据报大小减少到1450就没有分片了?
谢谢。
最常见MTU for Ethernet is 1500, not including ethernet frame headers. This means you can send 1500 bytes in one packet over the wire, including IP headers. IPv6 headers are larger than IPv4 headers for several reasons, with the most important being that IPv6 addresses are larger than IPv4. So when you run with the default value over IPv6 your packet size goes over the MTU size and the packet needs to be split into two; a procedure known as fragmentation.
基本 IPv4 header 是 20 个字节,基本 IPv6 header 是 40 个字节,UDP header 是 8 个字节。
对于 IPv4,总数据包大小为 1470+8+20=1498,小于默认的以太网 MTU 1500。
使用IPv6总数据包大小为1470+8+40=1518,超过1500,需要分片。
现在让我们看看您的观察结果。您会看到大小为 1510 和 92 的数据包。其中包括 14 字节的以太网 header。因此,您的 IPv6 数据包为 1496 和 78 字节。大数据包的内容是:IPv6header(40字节),分片header(8),UDPheader(8)和1440字节的数据。较小的数据包包含 IPv6 header (40)、分片 header (8) 和剩余的 30 字节数据。
我正在通过 IPv6 使用 iperf (https://iperf.fr/) 进行一些 UDP 带宽测试。使用带有以下命令行的 Linux UDP 客户端时,我得到了非常糟糕的结果:
iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m
调查 Wireshark 的问题我发现在客户端发送数据时存在一些碎片。更准确地说,我看到交替出现大小为 1510 字节和 92 字节的 UDP 客户端传出数据包。 例如,我看到的 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 时到底发生了什么。为什么我在 IPv6 上有分段而不是在 IPv4 上有 UDP 数据报大小的默认值?另外,为什么我把UDP数据报大小减少到1450就没有分片了?
谢谢。
最常见MTU for Ethernet is 1500, not including ethernet frame headers. This means you can send 1500 bytes in one packet over the wire, including IP headers. IPv6 headers are larger than IPv4 headers for several reasons, with the most important being that IPv6 addresses are larger than IPv4. So when you run with the default value over IPv6 your packet size goes over the MTU size and the packet needs to be split into two; a procedure known as fragmentation.
基本 IPv4 header 是 20 个字节,基本 IPv6 header 是 40 个字节,UDP header 是 8 个字节。
对于 IPv4,总数据包大小为 1470+8+20=1498,小于默认的以太网 MTU 1500。
使用IPv6总数据包大小为1470+8+40=1518,超过1500,需要分片。
现在让我们看看您的观察结果。您会看到大小为 1510 和 92 的数据包。其中包括 14 字节的以太网 header。因此,您的 IPv6 数据包为 1496 和 78 字节。大数据包的内容是:IPv6header(40字节),分片header(8),UDPheader(8)和1440字节的数据。较小的数据包包含 IPv6 header (40)、分片 header (8) 和剩余的 30 字节数据。