Linux慢启动:更改IP路由对初始窗口没有任何影响

我将我的机器中的tcp初始窗口更改为10,如下所示

[user@site etc]$ sudo ip route change default via 17.255.209.1 dev eth0 proto static initcwnd 10 

并改变了tcp_slow_start_after_idle ,如下所示

 [user@site etc]$ sudo sysctl -a | grep tcp_slow_start_after_idle net.ipv4.tcp_slow_start_after_idle = 0 

一个IP路由显示确认如下

 [user@site etc]$ ip route show default via 17.255.209.1 dev eth0 proto static initcwnd 10 169.254.0.0/16 dev eth0 scope link metric 1002 17.255.209.0/24 dev eth0 proto kernel scope link src 17.255.209.19 

现在,当我在网站上做一个tcpdump的时候,我觉得WIN / MSS在默认情况下仍然是4 ,所以在初始窗口中看不到改变。 一千四百六十零分之五千八百四十零= 4

 [user@site etc]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and port 80' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 11:17:45.048174 IP 21.101.151.198.45873 > 17.255.209.19.http: Flags [S], seq 2008673341, win 5840, options [mss 1460,sackOK,TS val 1724223146 ecr 0,nop,wscale 6], length 0 

我在网页上做了约30KB的数据。

 [user@machine ~]$ curl http://www.site.com/js/main.js > /dev/null % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 88212 100 88212 0 0 179k 0 --:--:-- --:--:-- --:--:-- 272k 

我的方法有什么不对?

核心

 [user~]$ uname -r 3.0.4x86_64-linode21 

作为更新,这里是我尝试google.com时的结果

 [user@site ~]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and host www.google.com' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 17:20:28.033236 IP 17.255.209.19.42799 > 74.125.127.106.http: Flags [S], seq 3148947324, win 14600, options [mss 1460,sackOK,TS val 193695310 ecr 0,nop,wscale 4], length 0 

正如你可以看到在这种情况下WIN / MSS是14600/1460 = 10

我尝试通过curl从服务器机器本身打到我的网站,结果如下:

 [user@site ~]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and host www.site.com' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 17:25:14.584338 IP 17.255.209.19.35008 > 17.255.209.19.http: Flags [S], seq 3894567470, win 32792, options [mss 16396,sackOK,TS val 193981861 ecr 0,nop,wscale 4], length 0 

在这种情况下, WIN / MSS是32792/16396 = 2

我想你错误地理解了TCP的工作原理。

发送的每个数据包将始终通告一个接收器窗口(又名RWIN)和一个可选的缩放因子,请参阅RFC 1323

发送方不允许发送超过 RWIN中指定的数据量,而不会被确认。 根据拥塞窗口,发送者可能决定填写RWIN或不填写。

所以,在TCP数据包中有两位信息是公共的。 服务器上的RWIN和客户端上的RWIN。 这两个数字都表明拥塞窗口的最大尺寸可以在两端。

当我们试图优化file upload的性能时,服务器上的RWIN很有意思。

当我们试图确定下载速度时,客户端上的RWIN很有意思。

这些数字都不会使另一端的拥塞窗口公开

所以如果我有一个64K的RWIN,服务器上的拥塞窗口可以是任何低于64k的数字。

确定实际拥塞窗口是什么来计数数据包的唯一方法。

如果我知道:

  1. 我的往返时间(RTT)是〜200ms。
  2. 我只是要求一个10万的资源。
  3. 我有一个64K的RWIN。

如果从服务器得到2个在200ms内长达1452字节的数据包,服务器上的拥塞窗口很可能小于4356,如果它大于3个数据包将被发送。 如果IW设置为10,那么在200ms标记附近会看到10个数据包。

如果您更改了IW,并且想要确认所做的更改,则需要对数据包进行计数,以获取服务器上拥塞窗口大小的估计值。

请记住,您可能希望在SYN,SYN-ACK,ACK之后直接查看对话,以确保您不会看到对话的中间(拥塞窗口已经增长)。

窗口大小将取小者:服务器初始化窗口大小或客户端RWIN。 由于5840是Linux 2.6的默认RWIN,因此您的客户端似乎是限制因素。

尝试从一个窗口框。 Windows XP的RWIN为64k,较新的版本为8k。

来源: http : //www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/ (有趣的部分是在video下面)

编辑:扩大答案,使其更清晰:

  • 在TCP握手中,客户端发送一个SYN数据包给发送其最大允许窗口大小的服务器。 (当你的tcpdump输出显示时,这些是5840字节)
  • 服务器现在用SYN ACK和它想要达成的窗口大小进行响应。 这个窗口的大小只能比客户提出的小,不能大一些。 无论服务器如何configuration,它的窗口大小都不会超过该客户端的5840字节。
  • 客户端返回ACK,他们愉快地交换数据。

Edit2:添加到问题的tcpdumps显示服务器打开连接到谷歌和本身作为客户端。