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等。
阅读全文
0 0
- tcp协议栈优化1-增加TCP初始拥塞窗口 ===》流氓的方式
- tcp协议栈优化1-增加TCP初始拥塞窗口
- TCP 滑动窗口协议及拥塞控制
- TCP滑动窗口协议和拥塞控制
- TCP滑动窗口协议及拥塞控制
- TCP的滑动窗口与拥塞窗口
- TCP的滑动窗口与拥塞窗口
- TCP的滑动窗口与拥塞窗口
- TCP的滑动窗口与拥塞窗口
- TCP的滑动窗口与拥塞窗口
- TCP窗口拥塞控制:
- TCP协议滑动窗口协议以及拥塞控制算法
- tcp的拥塞窗口和慢启动
- 【网络协议】TCP的拥塞控制机制
- TCP协议的拥塞控制机制
- Tcp协议的窗口
- TCP流量控制和拥塞控制-滑动窗口协议详解
- TCP拥塞控制慢启动窗口设置===》另外一篇文章
- IO流小结
- 操作Hadoop集群
- HDFS详解
- 《将博客搬至CSDN》
- Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)
- tcp协议栈优化1-增加TCP初始拥塞窗口 ===》流氓的方式
- Junit 单元测试、BeanUtils、Properties类
- Linux 基本命令
- Spark之核心---RDDs(1)
- 如何开发一个Servlet
- servlet中cookie和session操作
- Java Jsp使用
- Java jsp 自定义标签
- WebSphere V8.5 静默安装升级(二)-使用响应文件静默安装(生成相应文件)以及managesdk管理SDK