Linux慢启动:更改ip route对初始窗口没有任何影响

我将机器中的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 route show的确认

[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

我对网页做的卷曲请求大约30 KB的数据.

[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,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,TS val 193695310 ecr 0,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,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,TS val 193981861 ecr 0,length 0

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

解决方法

我认为你误解了TCP的工作原理.

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

如果没有得到确认,则不允许发送方发送超过RWIN中指定的数据量.根据拥塞窗口,发送方可能决定是否填写RWIN.

因此,TCP数据包中有两位公共信息.服务器上的RWIN和客户端上的RWIN.这两个数字都决定了两端拥塞窗口的最大大小.

当我们尝试优化文件上传性能时,服务器上的RWIN很有趣.

当我们尝试确定下载速度时,客户端上的RWIN很有趣.

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

因此,如果我的RWIN为64k,则服务器上的拥塞窗口可以是低于64k的任何数字.

确定实际拥塞窗口的唯一方法是对数据包进行计数.

如果我知道:

>我的往返时间(RTT)约为200ms.
>我刚刚申请了一个100k的资源.
>我有一个64k的RWIN.

如果我从服务器返回的2个数据包在~200ms内长度为1452个字节,则服务器上的拥塞窗口可能小于4356,因为如果它更大,则会发送3个数据包.如果将IW设置为10,我会在200ms标记周围看到10个数据包突发.

如果您更改了IW并希望确认更改有效,则需要对数据包进行计数以获得服务器上拥塞窗口大小的估计值.

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

相关文章

在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异...
git使用小结很多人可能和我一样,起初对git是一无所知的。我...
1. 操作系统环境、安装包准备 宿主机:Max OSX 10.10.5 虚拟...
因为业务系统需求,需要对web服务作nginx代理,在不断的尝试...
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核...
一、Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个...