令人费解的 3G / UMTS 上的 TCP 性能

lem*_*eze 8 linux vpn 3g tcp udp

我使用 3G 作为我的主要互联网连接,而 TCP 每天都在变得越来越令人费解。例如:

  1. 从 kernel.org 下载非常快:

    $wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.6.8.tar.bz2
    
    Run Code Online (Sandbox Code Playgroud)

    几秒钟后增加到~500kB/s!

  2. 一些服务器非常慢,例如 www.graphic-pc.com:
    同样的事情,用 wget 下载一个大文件,它在一瞬间以 ~30kB/s 开始,然后崩溃到 5-10k 甚至更糟。

  3. 网页浏览是不错的,但有点不可靠。随机地,一个页面需要很长时间才能加载甚至无法加载,但重新加载几乎可以立即成功。

  4. 现在,我偶然开始在 3G 连接上通过 UDP 使用 OpenVPN,而且 OMG 突然间一切都变得非常快!
    同样的 www.graphic-pc.com 现在以 100-200kB/s 的速度拍摄!


  • 这里发生了什么 ???
  • 为什么有 VPN 比没有 VPN 好这么多?
  • 为什么在 kernel.org 运行时 graphics-pc.com 会爬行?
    与我的 tcp 堆栈(或服务器)有关,或者与它们之间的一些有问题的路由器有关??

笔记:

设置是运行 Ubuntu Lucid 和华为 3G 加密狗的笔记本电脑(所以直接 pppd 连接)。

我几乎可以在白天的任何时间重现这一点,而且我没有移动,所以这显然不是蜂窝环境或互联网拥塞。(虽然没有 VPN 的 kernel.org 有时在晚上会更糟,60kB 左右 - 但使用 VPN 仍然是 500kB!)

对于 2)wireshark 显示重传的数据包,dup ack's,有时甚至乱序。

我试过使用不同的 /proc/sys/net/ipv4 参数(tcp_rmem、window_scaling、tcp_congestion...)似乎没有什么区别。


更新:
在 Windows 7(无 VPN)下尝试过,有一些有趣的结果:

tcp settings  :  default          tcp_optimizer
kernel.org    :  10 kB/s          20 kB/s
graphic-pc.com:   8 kB/s          70 kB/s !
Run Code Online (Sandbox Code Playgroud)

tcp_optimizer 开启了 ctcp 等等。必须检查 os graphics-pc.com 正在运行什么,我敢打赌 linux 的 tcp_westwood 和 ms ctcp 在这里不能很好地混合...

lem*_*eze 6

问题已解决:
在 graphics-pc.com 上用另一种文件类型 (.zip) 进行了测试。你猜怎么着,同时这个文件的速度很快,另一个文件的速度很慢(顺便说一句是.mp3)。所以这显然是 ISP 在进行深度数据包检查和限制。

至于windows下奇怪的结果,今天又测试了一下,现在和linux完全一样。此外,节流是动态的,并且在白天发生变化。我想我真的很不走运,当节流改变时,我都重新启动并运行了 tcp_optimizer ......

仍然对 3G 对 TCP 性能的真正影响感到好奇,因为有很多 关于这个主题 论文,但就这点而言,这只是流量整形的废话,3G 没有错!