10 | 如何提升TCP四次挥手的性能?
该思维导图由 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-21414 - 我来也老师的文章都要细品. 内核调优的参数算是见识到了,不知道啥时候才能用得上.🤦 一些边界情况老师也介绍到了: 1. tcp_tw_reuse 也是有适用条件的. 2. 四次挥手在极端情况下,可能变三次挥手. 3. CLOSING 状态确实算是第一次见,之前没考虑过这个问题. 以前在用c语言的网络编程时,会接触setsockopt函数. 最初的使用该函数的原因,只是为了端口复用. 因为在调试的过程中,经常会重启服务,如果不设置SO_REUSEADDR参数,就需要等系统释放掉端口,服务才能监听成功. 见过SO_LINGER选项,但真未细究过. 待课代表们来解答.
作者回复: Nginx中有SO_LINGER选项的应用,可以参见《Nginx核心知识100讲》第130课
2020-05-209 - 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-018 - 冬风向左吹看到一遍文章,tcp_timestamps还有这个坑吗? https://blog.51cto.com/fuyuan2016/1795998
作者回复: 你好东郭,我认为本质上这是打开tcp_tw_recycle造成的,真不关timestamps的事。timestamps的好处很多,不建议关掉。
2020-05-2124 - Geek_78d3bb为什么3次握手4次挥手? 因为挥手的时候,需要先清空各自缓冲区中的数据,然后才能close,不是这样吗?
作者回复: 清空缓冲区,是关闭一端传输能力的子任务。4次挥手的主要原因,是因为TCP由内核实现,但应用层可以半关闭连接且长期存在,所以只能是4次挥手,清空缓冲区只是子目标。个人看法^_^
2020-10-213 - 夜空中最亮的星至少要听3遍
作者回复: 点个赞!
2020-05-2023 - 安排TTL每一跳减少1,这些怎么和MSL对应起来呢,每一跳减少的1相当于1秒?
作者回复: 不是,这是一个预估值,所谓每一跳,是指每经过一个路由器网络设备,将IP头部中的TTL字段减少1,并不等于1秒,通常推荐的TTL的初始值是64
2020-05-202 - 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-041 - 安排rst报文的发送是比普通数据优先级高吗,也就是socket对端如果先接受到rst,这个socket就不可读不可写了,后面收到的数据自然也没法被进程拿到了。
作者回复: 是的,普通数据要有序接收,但RST不需要按seq序号处理
2020-05-201 - butterfly在主动方处于 TIME_WAIT状态时,如果过了2MSL时间,还是有FIN传来,那不是对新连接还是有影响吗
作者回复: 是的
2021-03-19