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

Modified on: Fri, 16 Aug 2019 11:20:02 +0800

我将机器中的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, 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

作者:,Quintin Par

最佳答案

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

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

发件人不得在未经确认的情况下发送超过在RWIN中指定的数据量。根据拥塞窗口,发送方可能决定是否填写RWIN。

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

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

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

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

如果我的RWIN为64k,服务器上的拥塞窗口可以ANY低于64k。

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

如果我知道:

  1. 我的往返时间(RTT)约为200毫秒。
  2. 我刚刚申请了一个100k的资源。
  3. 我有一个64k的RWIN。
  4. 醇>

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

    如果您更改了IW并想确认更改有效,需要计算数据包以估算服务器上的拥塞窗口大小。

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

作者:,Sam Saffron

相关问答

添加新评论