1

我正在通过 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时没有碎片?

谢谢你。

4

2 回答 2

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 字节数据。

于 2015-09-25T08:58:43.343 回答
3

以太网最常见的MTU是 1500,不包括以太网帧头。这意味着您可以通过网络在一个数据包中发送 1500 个字节,包括 IP 标头。IPv6 标头大于IPv4 标头有几个原因,最重要的是 IPv6 地址大于 IPv4。因此,当您在 IPv6 上使用默认值运行时,您的数据包大小会超过 MTU 大小,并且需要将数据包分成两部分;一种称为碎片的过程。

于 2015-09-25T08:13:30.630 回答