我在 Windows 操作系统上使用 netperf,两台计算机通过交叉电缆连接。第一台 PC 使用 Realtek FE 网络控制器,第二台 PC 使用 Realtek GBE 控制器。
将第一台电脑作为服务器,将第二台电脑作为客户端,我得到如下结果:
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
8192 65536 65536 10.00 95.11
当我切换第二台 PC 作为服务器,第一台 PC 作为客户端时,我得到如下结果:
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
65536 8192 8192 10.00 50.11
为什么这两种情况下的吞吐量不同?
答案1
这可能是因为其中一台机器使用的 TCP 窗口调整不当(netperf 显然将其称为 Recv Socket Size)。在打开 TCP 连接的 TCP 三次握手期间,每台主机都会传达其在接收时可以处理的 TCP 窗口大小,因此另一台主机知道在等待 TCP Ack 之前要发送多少数据。
在 100,000,000 bps 的网络速度和预计 RTT(往返时间 == ping 时间)为 1ms 的情况下,8KiB(8,192 字节 = 65,536 位)不足以传输足够的数据。
要计算要使用的合适 TCP 窗口,您需要计算“带宽 * 延迟乘积”(BDP)。从一台机器 ping 另一台机器并记下 ping 时间。在我繁忙的 GigE LAN 上,现在大约是 1ms。我认为对于 GigE 来说这有点高,但让我们继续使用它,因为您的链路的一端只是 100BASE-TX。
每秒 100,000,000 比特 * 0.001 秒 (1ms) RTT = 100,000 比特
100,000 位 / 每字节 8 位 = 12,500 字节
12,500 字节 / 1024 字节每 KibiByte = 12.2KiB
因此,慢速机器上的 TCP 接收窗口至少需要比现在大 50%(12.2 而不是 8 KiB)。
再说一次,如果您使用的是 Windows 8.x 等现代操作系统,则此答案不适用,因为您的主机应该具有自动 TCP 窗口调整功能,因此最初报告的值可能不可信。如果您使用的是 Windows XP 等古老的操作系统,或者由于某种原因禁用或不工作自动 TCP 窗口调整,则此答案适用。