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


10

我将机器中的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仍为45840/1460 = 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


请记住,如果您是从Linux机器上执行此操作,则也需要使用3.0,并仔细研究源代码/标签以确认确切的3版本,从而表明了更改
Sam Saffron 2012年

@QuintinPar是否可以添加tcpdump输出以及从测试计算机输出的连接?
kupson 2012年

@kupson我已经更新了问题
Quintin

据我所知,您无法影响传入连接上的“ 初始窗口”。您与google的连接表明,您将IW设置为10。对于如此大的MTU,环回接口非常特殊,也许内核源代码中的“初始窗口”有一些上限。
库普森,2012年

请记住,两件事将决定IW。客户端最大的初始拥塞窗口和服务器IW。较小的胜利。从2台计算机上运行测试,服务器应默认将IW设置为3.0 ...并且XP / Vista / Win7客户端不限制IW,因此请为测试做好客户端。3.0 Linux客户端也可以使用,但必须是单独的计算机。
Sam Saffron'3

Answers:


9

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

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

未经确认,发送方不得发送超过 RWIN中指定的数据量。根据拥塞窗口,发送者可以决定是否填写RWIN。

因此,TCP数据包中有两个公共信息。服务器上的RWIN和客户端上的RWIN。这两个图都说明了拥塞窗口的最大大小在两端都可以是多少。

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

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

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

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

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

如果我知道:

  1. 我的往返时间(RTT)是〜200ms。
  2. 我刚刚请求的资源为10万。
  3. 我的RWIN为64k。

如果我在200毫秒内从服务器收到2个数据包,这些数据包的长度为1452字节,则服务器上的拥塞窗口可能小于4356,这是因为如果发送的数据包较大,则会发送3个数据包。如果将IW设置为10,我会在200ms标记附近看到10个数据包的突发。

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

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


1
TCP / IP的20.6(慢启动)中说明了拥塞窗口和tcp窗口之间的区别。插图:“慢启动将另一个窗口添加到发送方的TCP:拥塞窗口,称为cwnd”(粗体是我的)。20.7中有一个序列图,显示了批量传输期间的过程。
凯尔·勃兰特

7

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

从Windows框中尝试。Windows XP的RWIN为64k,较新的版本为8k。

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

编辑:扩展答案使其更清晰:

  • 在TCP握手中,客户端向服务器发送SYN数据包,并发送其最大允许窗口大小。(如您的tcpdump输出所示,这些是5840字节)
  • 现在,服务器将以SYN ACK和希望同意的窗口大小进行响应。该窗口大小只能小于客户端建议的大小,而不能更大。无论服务器如何配置,对于该客户端,它的窗口大小都不能超过5840字节。
  • 客户端返回ACK,从此以后他们愉快地交换数据。

Edit2:添加到问题中的tcpdumps显示服务器打开与google及其本身的连接以客户端身份运行。


初始窗口(在SYN数据包中建议)是5840。这是第一个数据包,此时发送方对接收方一无所知(我用“ ip route flush cache”进行了测试)。
kupson 2012年

呃17.255.209.0是您的服务器子网,对吗?您看到的数据包是从21.101.151.198.45873到17.255.209.19.http。我不是tcpdump输出的专家,但对我来说,它是:Hello Server,我是您的客户端,我喜欢5840字节窗口。:)下一个数据包将是服务器响应ACK,5840很棒,欢呼。:)
某人2012年

只是强调一下,我认为您的做法是错误的:第一台发送机是客户端,因为它打开了连接,而不是服务器。它是提供5840字节窗口的客户端。服务器不能建议较大的窗口大小,而只能建议较小的窗口大小。
某人2012年

1
我不是这个问题的原始作者。我在自己的测试环境中对其进行了测试(结果相似),也无法更改。初始拥塞窗口大小(initcwnd)与连接的另一端无关。
库普森2012年

我不知道您的设置。最初的发布者询问为什么尽管增加了服务器上的初始窗口大小,但他的测试连接的窗口大小只有5840字节。答案是:因为与他一起测试的客户端不允许更大的窗口大小。一般来说,我无法评论其他设置或该概念可能存在的其他问题/错误。
某人2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.