[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
解决方法
发送的每个数据包将始终通告接收器窗口(也称为RWIN)和可选的缩放因子,请参阅RFC 1323
如果没有得到确认,则不允许发送方发送超过RWIN中指定的数据量.根据拥塞窗口,发送方可能决定是否填写RWIN.
因此,TCP数据包中有两位公共信息.服务器上的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之后直接查看对话,以确保您不会看到对话的中间(拥塞窗口可能已经增长).