tcp协议栈优化1-增加TCP初始拥塞窗口 ===》流氓的方式

来源:互联网 发布:淘宝旺旺名在哪里看 编辑:程序博客网 时间:2024/05/16 05:35
看linux3.0 network代码,发现TCP initcwd(初始拥塞窗口)默认已经调为10,同时,TCP rcvwnd初始接收窗口也已调为10。
    tcp initcwd初始化函数---函数tcp_init_cwnd(),宏TCP_INIT_CWND
    tcp rcvwnd初始化函数 ---函数tcp_select_initial_window(),宏TCP_DEFAULT_INIT_RCVWND
   (注:tcp允许发送包个数由 发送端拥塞窗口 和 接收端接收窗口 决定,接收端通过tcp头部window字段通知发送端接收窗口大小)
    linux为什么要调大tcp initcwnd,请参见http://lwn.net/Articles/427104/ 和http://tools.ietf.org/html/draft-hkchu-tcpm-initcwnd-01;
   (注:wf和我在09年已经进行了研究,并在线上业务中调大initcwnd,当时觉得该参数适用场景不具普遍性;没想到google能对其进行量化的研究,并推动IETF接受该调整,值得我们学习)

     国内外 互联网公司(google/baidu/taobao等)已在合适业务中调大了TCP初始拥塞窗口,调大有2种方法:
    1. ip route方式,ip route change default via <gateway> dev eth0 initcwnd <iw>(记得2.6.32版本以上支持),该方式仅对通过该路由的TCP连接有效;
    2. sysctl参数,自己在内核中增加一个控制initcwnd的proc参数,该方式对于所有tcp连接有效;(我们当年采用了该方式)
   
    适用场景:短连接+发送数据量小(拥塞控制尚处于slowstart阶段,传输就完毕了)
    效果:我知道的几个应用效果为传输速度可以提高10%~20%;但有好处也有坏处,TCP重传率会增加(初始拥塞窗口越大,重传率越高)

    代码研究:
    我们将分析“tcp三次握手”过程中,客户端和服务端 拥塞窗口(snd_cwnd)的变化;,。
    客户端
        创建socket - 函数tcp_v4_init_sock - snd_cwnd=2;
        发送syn - 函数tcp_v4_connect - snd_cwnd=2 没有变化;
        收到syn_ack发送ack - 函数tcp_rcv_synsent_state_process 调用 函数tcp_init_metrics 调用 snd_cwnd = tcp_init_cwnd(tp, dst);
     服务端:
        linux tcp/ip协议栈中 服务端收到三次握手的最后一个ack,才会创建socket;
        收到ack - 函数tcp_create_openreq_child中创建socket,snd_cwnd=2 - 函数tcp_rcv_state_process,当前socket状态为TCP_SYN_RECV,调用 函数tcp_init_metrics 调用 snd_cwnd = tcp_init_cwnd(tp, dst);
    
     注:函数tcp_init_metrics根据socket所在路由中设置的tcp参数 初始化 该socket;同时,该路由条目所在socket在关闭时,会通过函数tcp_update_metrics,更新路由中的tcp参数(sysctl_tcp_nometrics_save为是否更新的开关);路由条目中所有的tcp参数在rtnetlink.h中定义,如RTAX_RTT/RTAX_REORDERING等。
原创粉丝点击