1、初始拥塞窗口值调整可行性

上图为现代浏览器从数据请求、下载到渲染的整个过程;我们关心的部分主要是红色框内的这几个阶段,主要分成dns请求,请求,响应这3个阶段;在继续细分后,我们主要会针对dns时间,建立连接时间,等待响应时间,内容下载时间这几个方面开始优化;

google工程师Yuchung Cheng在<<Let’s make TCP faster>>一文给出了几个tcp协议层的优化点并通过内部测试验证了这些优化点的效果,它们分别是:

– Increase TCP initial congestion window
– Reduce the initial timeout from 3 seconds to 1 second
– Use TCP Fast Open (TFO)
– Use Proportional Rate Reduction for TCP (PRR)

其中,内核未提供直接修改RTO时间的接口,TFO需要客户端和服务器的双边支持,PRR已经在3.2以上的内核默认开启;看起来我们能优化的点只能是init_cwnd(初始拥塞窗口)值了;

2、初始拥塞窗口值取值

较大的初始拥塞窗口值虽然能显式的提高内容下载速度,但是相对应的丢包率和重传率也会显著上升,因此这个取值需要兼顾下载速度和可用性等多方面来确定;
我们主要通过探测行业竞品的取值来确定自己产品的取值,毕竟行业内几个大佬已经在该领域摸爬滚打N年,早已摸索出了合理的初始拥塞窗口值了,这么干能省下不少事儿;

1)初始拥塞窗口值估计方法

通过三次握手阶段的syn,syn+ack,ack来计算RTT时间,然后计算从第一个服务器响应包(时间戳r1)开始到r1+RTT时间段内的服务器数据包个数,此r1-r1+RTT时间段内的数据包个数可近似认为是初始拥塞窗口值;

比如:
测试url : http://img5.dwstatic.com/www/1404/261510188736/1431050996364.jpg
IP: xxx.xxx.xxx.xxx
域名:img5.dwstatic.com
RTT: 28号包减27号包
4.460638000-4.393042000=0.067596
号包4.555419000+0.067596=4.623015
因此,在32号至47号包之间,init_cwnd初始拥塞窗口为10

2)自动化的估值工具

工具主要自动化以下的执行步骤,通过海量样本取平均的方法来最终计算出初始拥塞窗口近似值;

工具开源代码地址见“6、资料”部分

3)行业大佬的取值分析

探测结果显示,行业内各大cdn厂商都调整过init_cwnd值,普遍取值在10-20之间;

4)最终取值确定

取值初始拥塞窗口值:15

3、init_cwnd调整方法

 

 

4、init_cwnd值生效验证

登陆目标机器后进行以下操作:

 

5、init_cwnd值调整后效果

centos 7.1默认init_cwnd 10,调整后init_cwnd 20;下载速度提升还是很明显的;

使用mmtrix的监测工具:

6、资料

自动化远程探测init_cwnd值工具;

https://github.com/fifa2002nb/detectcwnd

http://www.apmbe.com/tcp%E5%8A%A0%E9%80%9F-%E5%88%9D%E5%A7%8B%E6%8B%A5%E5%A1%9E%E7%AA%97%E5%8F%A3%E8%B0%83%E6%95%B4/