系统性能调优必知必会
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
36367 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
系统性能调优必知必会
15
15
1.0x
00:00/00:00
登录|注册

10 | 如何提升TCP四次挥手的性能?

tcp_tw_recycle
tcp_timestamps
tcp_tw_reuse
tcp_max_tw_buckets
tcp_fin_timeout
tcp_max_orphans
tcp_orphan_retries
SO_LINGER选项的影响
LAST_ACK状态
CLOSE_WAIT状态
控制参数的优化
close函数与shutdown函数的区别
关闭连接的四次挥手
建立连接时的三次握手
为什么需要四次挥手
思考题
被动方的优化
主动方的优化
四次挥手的流程
TCP四次挥手的性能优化

该思维导图由 AI 生成,仅供参考

你好,我是陶辉。
上一节课,我们介绍了建立连接时的优化方法,这一节课再来看四次挥手关闭连接时,如何优化性能。
close 和 shutdown 函数都可以关闭连接,但这两种方式关闭的连接,不只功能上有差异,控制它们的 Linux 参数也不相同。close 函数会让连接变为孤儿连接,shutdown 函数则允许在半关闭的连接上长时间传输数据。TCP 之所以具备这个功能,是因为它是全双工协议,但这也造成四次挥手非常复杂。
四次挥手中你可以用 netstat 命令观察到 6 种状态。其中,你多半看到过 TIME_WAIT 状态。网上有许多文章介绍怎样减少 TIME_WAIT 状态连接的数量,也有文章说 TIME_WAIT 状态是必不可少、不能优化掉的。这两种看似自相矛盾的观点之所以存在,就在于优化连接关闭时,不能仅基于主机端的视角,还必须站在整个网络的层次上,才能给出正确的解决方案。
Linux 为四次挥手提供了很多控制参数,有些参数的名称与含义并不相符。例如 tcp_orphan_retries 参数中有 orphan 孤儿,却同时对非孤儿连接也生效。而且,错误地配置这些参数,不只无法针对高并发场景提升性能,还会降低资源的使用效率,甚至引发数据错误。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了TCP四次挥手的性能优化方法,强调了优化连接关闭时需要考虑整个网络层次,不能仅基于主机端的视角。文章介绍了Linux下针对四次挥手提供的控制参数,并指出了错误配置可能导致性能下降和数据错误。作者还强调了服务器优化策略的复杂性,因为服务器需要同时为成千上万个用户服务,任何错误都会被放大。文章内容深入浅出地解释了TCP四次挥手的流程和优化方法,对于需要深入了解网络连接关闭性能优化的读者具有一定的参考价值。文章内容涉及了主动方的优化关闭连接的方式,包括对TCP连接状态的详细解释,以及针对不同状态的优化参数调整建议。文章还介绍了如何解决孤儿连接和TIME_WAIT状态的问题,以及相关参数的调整建议。整体而言,本文提供了丰富的技术细节和实用的优化建议,对于网络工程师和系统管理员来说具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《系统性能调优必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(33)

  • 最新
  • 精选
  • 忆水寒
    本节内容真的很烧脑啊!收获也很多,从来没有从这么多角度看待过这个问题。 so_linger是一个结构体,其中有两个参数:l_onoff和l_linger。第一个参数表示是否启用so_linger功能,第二个参数l_linger=0,则 close 函数在阻塞直到 l_linger 时间超时或者数据发送完毕,如果超时则直接情况缓冲区然后RST连接(默认情况下是调用close函数立即返回)。

    作者回复: 谢谢忆水寒的分享!

    2020-05-21
    4
    14
  • 我来也
    老师的文章都要细品. 内核调优的参数算是见识到了,不知道啥时候才能用得上.🤦 一些边界情况老师也介绍到了: 1. tcp_tw_reuse 也是有适用条件的. 2. 四次挥手在极端情况下,可能变三次挥手. 3. CLOSING 状态确实算是第一次见,之前没考虑过这个问题. 以前在用c语言的网络编程时,会接触setsockopt函数. 最初的使用该函数的原因,只是为了端口复用. 因为在调试的过程中,经常会重启服务,如果不设置SO_REUSEADDR参数,就需要等系统释放掉端口,服务才能监听成功. 见过SO_LINGER选项,但真未细究过. 待课代表们来解答.

    作者回复: Nginx中有SO_LINGER选项的应用,可以参见《Nginx核心知识100讲》第130课

    2020-05-20
    9
  • G.S.K
    请教老师,我有一点想不明白。假如A和B之间有个tcp连接,A主动发起关闭,A进入TIME_WAIT状态。如果B端的RTO(重传超时时间)比2msl大,2MSL后,B端还是有可能重传FIN的。感觉TIME_WAIT等待的时间应该是B端RTO+MSL啊。还请老师帮忙解惑。

    作者回复: RTO通常是毫秒级,2MSL是分钟级,RTO大于2MSL的概率几乎为0

    2020-07-01
    8
  • 冬风向左吹
    看到一遍文章,tcp_timestamps还有这个坑吗? https://blog.51cto.com/fuyuan2016/1795998

    作者回复: 你好东郭,我认为本质上这是打开tcp_tw_recycle造成的,真不关timestamps的事。timestamps的好处很多,不建议关掉。

    2020-05-21
    2
    4
  • Geek_78d3bb
    为什么3次握手4次挥手? 因为挥手的时候,需要先清空各自缓冲区中的数据,然后才能close,不是这样吗?

    作者回复: 清空缓冲区,是关闭一端传输能力的子任务。4次挥手的主要原因,是因为TCP由内核实现,但应用层可以半关闭连接且长期存在,所以只能是4次挥手,清空缓冲区只是子目标。个人看法^_^

    2020-10-21
    3
  • 夜空中最亮的星
    至少要听3遍

    作者回复: 点个赞!

    2020-05-20
    2
    3
  • 安排
    TTL每一跳减少1,这些怎么和MSL对应起来呢,每一跳减少的1相当于1秒?

    作者回复: 不是,这是一个预估值,所谓每一跳,是指每经过一个路由器网络设备,将IP头部中的TTL字段减少1,并不等于1秒,通常推荐的TTL的初始值是64

    2020-05-20
    2
  • Geek_f1c894
    老师,您好!我在想主动方处于FIN_WAIT2状态,被动方处于CLOSE_WAIT,意味可能想在半关闭连接上接收数据,且没有限制CLOSE_WAIT状态的持续时间,若被动方在CLOSE_WAIT状态还要发送的数据量耗时超过了2MSL时间,此时主动方是如何处理的? 我猜想可能情况①主动方接收了个含数据的报文后重新记时(收到最新报文的时间开始记时2MSL时间),直到在2MSL内收到FIN包或没接收到数据及FIN包做超时结束连接。②主动方在进入FIN_WAIT2状态的一分钟(2MSL)内能收到多少数据就收到,时间一到直接进入TIME_WAIT状态或者直接关闭连接

    作者回复: 这取决于主动方调用的是close还是shutdown: 1、调用的是close,此时连接将成为orphan,一般在 tcp_fin_timeout秒左右连接会被系统关闭; 2、调用的是shutdown,此时只有TIME_WAIT才有2MSL限制,FIN_WAIT2可以长时间处于此状态。

    2020-11-04
    1
  • 安排
    rst报文的发送是比普通数据优先级高吗,也就是socket对端如果先接受到rst,这个socket就不可读不可写了,后面收到的数据自然也没法被进程拿到了。

    作者回复: 是的,普通数据要有序接收,但RST不需要按seq序号处理

    2020-05-20
    1
  • butterfly
    在主动方处于 TIME_WAIT状态时,如果过了2MSL时间,还是有FIN传来,那不是对新连接还是有影响吗

    作者回复: 是的

    2021-03-19
收起评论
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部