看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 routechange default via <gateway> dev eth0initcwnd<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等。

tcp协议栈优化1-增加TCP初始拥塞窗口相关推荐

  1. TCP初始拥塞窗口与初始接收窗口

    根据RFC3390(2002年)中的表述,TCP初始窗口的上限定义为: min (4 * MSS, max (2*MSS, 4380 bytes)),旨在限制初始窗口在4K范围内,但是当MSS非常大时 ...

  2. linux协议栈劫持,Linux系统优化之TCP协议栈优化-基本篇1

    因为在做爬虫分布式系统的过程中,涉及到了一些linux系统优化方面的知识,所以来总结一下,我们会对linux的不同模块做相关的基本优化,这篇文章主要讲述的是关于tcp协议栈的参数优化. 1.机器环境 ...

  3. 如何进行TCP性能优化

    本次和大家聊一下TCP性能优化. TCP全称为Transmission Control Protocol,每一个IT人士对TCP都有一定了解.TCP协议属于底层协议,对于大部分研发人员来说,这是透明的 ...

  4. 【计算机网络】2、TCP:四次挥手与TIME_WAIT、shutdown() 优雅关闭 server、探活、拥塞窗口与 Nagle 算法、端口占用、tcp 的流式协议、可靠性

    文章目录 六.四次挥手 与 TIME_WAIT 6.1 TIME_WAIT 的作用 6.2 TIME_WAIT 的危害和方案 七.server 用 shutdown() 优雅关闭 7.1 close( ...

  5. TCP的滑动窗口与拥塞窗口

    因此我们先了解一下16位的窗口大小究竟有什么作用. 窗口分为滑动窗口和拥塞窗口. 滑动窗口是接受数据端使用的窗口大小,用来告知发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制 ...

  6. RFC2861 TCP 拥塞窗口检验

    组织:中国互动出版网(http://www.china-pub.com/) RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook ...

  7. python Scapy 随心所欲撩tcp协议栈

    1. 前言 如果只需要研究Linux的tcp协议栈行为,只需要使用packetdrill就能够满足我的所有需求.packetdrill才是让我随心所欲地撩tcp协议栈.packetdrill的简单使用 ...

  8. tcp拥塞控制_面试必备TCP(四):拥塞控制

    拥塞控制: 发送端主动控制cwnd,有慢启动(从cwnd初始为1开始启动,指数启动),拥塞避免(到达ssthresh后,为了避免拥塞开始尝试线性增长),快重传(接收方每收到一个报文段都要回复一个当前最 ...

  9. TCP/IP参考模型-传输层TCP

    系列文章目录 由于因特网的实现是一个分层架构,为了防止篇幅过大,笔者不想一篇文章就写完想表达的所有内容,于是会以系列文章的方式,主要内容包括TCP/IP分层架构.网络层的最短路径算法:Dijkstra ...

最新文章

  1. ESXi6.5环境搭建(三:vSphere Client6.0安装)
  2. redis延迟消息队列不准时php,Redis实现延迟消息队列
  3. 细胞转染的操作步骤及注意事项
  4. Python脚本配合Linux计划任务工作
  5. css H5端多行文本实现省略号
  6. 百度云:centos7.0+ 安装宝塔与ShopXO开源商城(从0搭建到部署上线) - 教程篇
  7. Android Dialog Activity
  8. Centos 7忘记密码,如何重置
  9. Windows10如何安装windows terminal
  10. html5文字游戏引擎,【HTML5 Game】一步步开发一个 TypeShot 的打字游戏
  11. 联想硬盘保护系统 计算机名 后缀,联想硬盘保护系统,教您联想硬盘保护系统怎么安装...
  12. IDEA Maven下载依赖时报错: ERROR - #org.jetbrains.idea.maven - Cannot reconnect.
  13. 内向的孩子学医好还是学计算机好,什么性格适合学医 哪种人不适合学医
  14. PYRIT 强大的密码分析工具(可使用GPU分析)-学习笔记
  15. linux查看运行的程序c pu,在Linux系统中,采用()一命令查看进程输出的信息,得到下图所示的结果。系统启动时最先运行的进程是...
  16. oracle 建立分区,oracle 分区表的建立方法
  17. 以太网通信连接不上自检步骤
  18. 【计算方法】线性方程组的数值解法
  19. redis简单分布式锁实现 超简单的那种
  20. Codeforces Round #376 (Div. 2) B. Coupons and Discounts

热门文章

  1. Java 算法 复数求和
  2. matplotlib绘制平滑曲线
  3. 解决python报错写入文件 io.UnsupportedOperation: not writable
  4. tshark 解析pcap中带TLS协议的数据包
  5. Linux导出history命令到本地
  6. windows截图c语言,window 截取屏幕,并实现jpeg压缩
  7. 用servlet进行用户名和密码校验
  8. Linux CPU信息和使用情况查看(CentOS)
  9. linux 下备份MySQL数据库 并删除7天前的备份数据
  10. 构建之法首周阅读体会