解决路由器后面的 TCP 传输速率低的问题

解决路由器后面的 TCP 传输速率低的问题

我正在尝试调试主机(“lowHost”)上的低 TCP 传输速率。
作为参考,我将其与第二台主机(“highHost”)进行比较。

我正在进行两项速率测量:

  1. 使用 curl 从 Web 服务器下载大文件。
  2. 使用 iperf

与 highHost 相比,lowHost 要经过一个额外的网络跳数(“路由器”)。

lowHost  ---(router)----->(fw)----> internet ----> webserver
highHost ---------------->(fw)----> internet ----> webserver

“路由器” 是一台 Linux 主机,它使用 nat(iptables)并在一组网络接口之间路由流量。
我试图了解这台路由器是否是造成 TCP 速率低的原因。

我最好的猜测是,低速率是由延迟峰值引起的,这限制了 tcp cwnd。

                         |  lowHost                     |  highHost
--------------------------------------------------------------------------------
curl rate                |  40Mbps rate                 |  400Mbps rate
curl wshark “rtt”        |  ~100 pkts with rtt>100ms    |  ~5 pkts with rtt>100ms
curl rwnd                |  3MB                         |  3MB
curl cwnd                |  0.2MB                       |  2.5MB            
--------------------------------------------------------------------------------
iperf tcp rate           |  100Mbps                     |  700Mbps
iperf tcp wshark “rtt”   |  0 pkts with rtt>100ms       |
iperf tcp cwnd           |  0.5MB                       |
--------------------------------------------------------------------------------
iperf udp rate           |  350Mbps                     |

ping stats:
    lowHost --> webserver
         79 packets transmitted, 79 received, 0% packet loss, time 78077ms
         rtt min/avg/max/mdev = 33.285/33.664/38.176/0.800 ms

    highHost --> webserver
         108 packets transmitted, 108 received, 0% packet loss, time 106949ms
         rtt min/avg/max/mdev = 32.684/32.855/39.706/0.689 ms

我使用 systemtap 检查内核中 ip_forward 调用的持续时间,以查看它是否是延迟峰值的来源。
当采样超过 60 秒时,最大 ip_forward 调用持续时间为 8 毫秒,这远远不足以解释 wireshark“rtt”中看到的延迟。

如果不是路由器,那还会是什么?
如果是路由器,而且不是延迟,那还会是什么?
是否有任何套接字统计数据可以指出问题所在 (/bin/ss)?
为什么 iperf 速率是 curl 速率的两倍?

wireshark 吞吐量/rtt/rwnd/cwnd 图表:

相关内容