13 案例篇 | TCP拥塞控制是如何导致业务性能抖动的?
邵亚方
该思维导图由 AI 生成,仅供参考
你好,我是邵亚方。这节课我来跟大家分享 TCP 拥塞控制与业务性能抖动之间的关系。
TCP 拥塞控制是 TCP 协议的核心,而且是一个非常复杂的过程。如果你不了解 TCP 拥塞控制的话,那么就相当于不理解 TCP 协议。这节课的目的是通过一些案例,介绍在 TCP 拥塞控制中我们要避免踩的一些坑,以及针对 TCP 性能调优时需要注意的一些点。
因为在 TCP 传输过程中引起问题的案例有很多,所以我不会把这些案例拿过来具体去一步步分析,而是希望能够对这些案例做一层抽象,把这些案例和具体的知识点结合起来,这样会更有系统性。并且,在你明白了这些知识点后,案例的分析过程就相对简单了。
等电梯时和别人聊着微信,进入电梯后微信消息就发不出去了;
和室友共享同一个网络,当玩网络游戏玩得正开心时,游戏忽然卡得很厉害,原来是室友在下载电影;
使用 ftp 上传一个文件到服务器上,没想到要上传很久;
……
在这些问题中,TCP 的拥塞控制就在发挥着作用。
TCP 拥塞控制是如何对业务网络性能产生影响的 ?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
TCP拥塞控制是网络通信中的关键环节,本文深入介绍了TCP拥塞控制的原理和影响,帮助读者理解其与业务性能抖动之间的关系。文章首先解释了TCP拥塞控制的基本原理,包括慢启动和拥塞避免两个阶段。针对丢包问题,文章介绍了针对网关服务的TCP单边优化工作以及对Cubic拥塞控制算法的优化。此外,还探讨了快速重传和快速恢复的优化策略,以及RTO的改进对业务阻塞时间的影响。文章还详细介绍了TCP连接中拥塞窗口和接收窗口的动态变化,以及如何通过tcp_probe来实时观察TCP连接的数据传输状况。总的来说,本文通过深入浅出的方式,帮助读者了解了TCP拥塞控制的原理和对业务网络性能的影响,为读者提供了一定的技术参考和优化建议。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 内核技术实战课》,新⼈⾸单¥59
《Linux 内核技术实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(14)
- 最新
- 精选
- 邵亚方置顶课后作业答案: - 通过 ssh 登录到服务器上,然后把网络关掉,过几秒后再打开,请问这个 ssh 连接还正常吗?为什么? ssh使用的TCP协议,也就是它是有连接的,这个连接对内核而言就是tcp_sock这个结构体,这个结构体会记录该TCP连接的状态,包括四元组(src_ip:src_port - dst_ip:dst_port),该连接的路由信息也被保存着。关闭网络后,该TCP连接的这些信息都还在,如果两边没有数据交互的话,这些信息就不会被更新,也就你一直存在着,当你再次打开网络,该连接还可以正常使用;假如关闭网络后,该TCP连接有数据交互,此时就会检查到异常,同样的也会去更新TCP连接状态信息,就有可能会断开这个连接。除此之外,TCP还有keepalive机制,如果该连接长时间没有数据,keepalive机制也会把该连接给关闭掉。2020-10-1124
- 我来也课后思考题: 这个应该是不确定的。 以前也测试过,只要在网络断开期间不主动发送数据,就会晚一点探测到连接已断开。 如果不主动发数据,可能网络恢复时,连接就自动恢复了。
作者回复: 对的!
2020-09-1828 - 黑客不够黑我们金融交易平台的生产环境出现过一个案例,每天早上9点开盘会有用户集中登录的情况,其中登录链路中有两个服务,部署在两台服务器上,事故当天就出现了很多用户无法登陆的情况,开发人员排查日志发现这两个服务之间的通信有非常大的延时,A服务发的消息,B服务过了很久才收到,时间5分钟到20分钟不等,我们运维小伙伴监控服务器的负载非常低,CPU,内存,io都很正常,甚至我们还有专门的程序每秒探测内网机器的存活,ping包每秒一次,延时也都在毫秒级别。所以当时判断可能是两个服务之间的tcp链接出了问题,我比较怀疑是接收方窗口变为0了,但苦于没有抓包无法验证猜想,并且此类事件再也没有出现,但是心里一直存在疑惑,所以想问问老师,在您看来这种情况比较可能原因有哪些?
作者回复: 看你的描述,这类问题大概率跟TCP缓冲区有关系。A服务所在机器的发送缓冲区太小,或者B服务所在服务器的接受缓冲区太小,都会导致缓冲区排队严重,甚至引起丢包,接受窗口变为0也可能会出现。 我建议你可以适当的增加TCP缓冲区大小。 你可以通过ss -natp来看是否存在数据积压的情况。
2020-11-077 - solarcwnd和rwnd使用的单位是什么呢?
作者回复: TCP segment个数
2020-10-1036 - Ilovek8skeepalive心跳的时间里如果不发送ssh命令操作,断开网络之后再重新打开,由于TCP有重试机制,是可以恢复的,但如果keepalive开始检查了,服务端发现客户端是死的之后就会关闭连接
作者回复: 对的。
2021-03-144 - webmin要分情况: 1. 如果关闭网络是发生在Client端或Server端的机器上,那么网络恢复后连接不会正常; 2. 如果关闭网络是发生在Client端与Server端之间链路中的某个路由节点上; 2.1 Client端到Server端之间有多条路可用,只要不是和CS直连这个设备有问题,那么设备可以选择其它路走,这时连接还是正常的; 2.2 Client端与Server端之间链路有NAT,且网络关闭发生与NAT端相关的设备上,那么连接就不正常; 2.3 Client端与Server端之间只有一条路,只要不是和CS直连这个设备有问题,那么如果网络在发生tcp_keepalive之前恢复,那么连接还是正常的; 3. 以上讨论的都是在TCP/IP协议情况下,网上查了一下SSH有居于UDP的方案(http://publications.lib.chalmers.se/records/fulltext/123799.pdf),如果走UDP的话这个要看SSH应用层的保活或SESSION有效期是否超过网络关闭时间,大小则可以连接,小于则关闭。
作者回复: 很赞!总结的比较全面,很多因素都考虑到了。
2020-09-1824 - jssfy引用:对此,我们使用 tcpdump 在 server 上抓包后发现,Client 响应的 ack 里经常出现 win 为 0 的情况,也就是 Client 的接收窗口为 0。于是我们就去 Client 上排查,最终发现是 Client 代码存在 bug,从而导致无法及时读取收到的数据包。 请问这里的前一句的接收窗口为0和后一句的代码bug是有什么逻辑关系吗?这里没太看懂
作者回复: 哦 是应用被阻塞住 没有及时从缓冲区里读取数据 导致缓冲区满
2020-09-193 - 我能走多远感谢老师分享,学习了拥塞控制的原理,慢启动,拥塞避免,快速重传和快速恢复。cwnd和rwnd使用的单位是什么呢? TCP segment个数。每个segment的长度就是mss的大小吗?
作者回复: segment的大小最大是mss,最小的话就只是tcp header。
2020-11-0922 - 董泽润连接是否正常,要看是否开启了 tcp_keepalive, 并且探测持续失败,连接才失效
作者回复: 是的
2020-09-172 - redseed老师你好,去年公司接入了跨境专线,使用默认对 CUBIC 算法时 TCP 的流量极不稳定,根据网上的优化建议增大了 TCP 的 sendbuf 适应这类高延迟网络,但是 TCP 的传输带宽反而下降了,想请教一下可能的原因出现在哪里?(PS. 后面我们使用了 BBR 算法并增大 sendbuf,这个对长肥管道有奇效...)2020-10-0915
收起评论