一直对Linux的内核参数比较感兴趣,然而工作中接触还是比较少,只能偶尔捡一两个认识下,平常用的较多的是net.ipv4.tcp_tw_recycle与net.ipv4.tcp_tw_reuse
自己以前理解的是:tcp_reuse主要是做tcp连接复用、tcp_recycle主要是快速回收处于time wait状态的链接,至于什么叫连接复用、怎么回收time wait状态的链接,从未深挖过(这可能也是水平一直无法进步的原因),因此写这个文章,后续有新的理解时,方便整合;
前提,需要开启net.ipv4.tcp_timestamps=0参数,这个参数表示是否启用时间戳检查,0为不启用,1为启用,tcp_recycle与tcp_reuse都是依赖于检查时间戳来定义TIME_WAIT的,因此,使用这两个参数,必须设置net.ipv4.tcp_timestamps=1
先写net.ipv4.tcp_tw_tcprecycle(这个相对好理解一些)
由于tcp四次挥手断开时,为保证数据传输完毕与断开时最后的ack请求,能准确到达服务器,因此会等待2msl(为了更好理解time wait状态,附上大佬的图对照下),这个msl是指在客户端收到FIN开始,发出ACK开始计时的,如果客户端发出ACK后,服务端2msl内没有收到ACK,那么服务端会继续发送FIN,这就是重传;
为什么是2msl?msl是指报文生成的最大时间,它是任何报文在网络上存活的最长时间,超过这个时间报文会被丢弃,那么2msl就是报文一来一回的时间,因此TIME_WAIT要等待2msl,超时则触发重传FIN,Linux对msl时间定义为30s,那么2msl就是60s,所以,TIME_WAIT状态至少要维持一分钟才能关闭(基本上是这样,本人对网络协议不是很熟悉,浅显之谈)
只有发起断开连接请求的一方才会进入TIME_WAIT状态,如下图,客户端发起断开连接请求并且在服务端发出FIN后,客户端就会进入TIME_WAIT状态,如果2msl后客户端没有收到任何新的数据包,那么客户端会进入close状态
图非原创,侵删,来源于:超超超详细讲解TCP三次握手与四次挥手(大图解),值得收藏 - 知乎
重点来了
net.ipv4.tcp_tw_recycle就是用于快速回收处于TIME_WAIT状态的连接,让四次挥手不需要等待服务端确认ACK,不用等这2msl,这样有利于高并发状态下快速组建新的tcp链接
这样是比较浅显易懂的,那么tcp_recycle是根据什么来识别断开连接时的时间?也就是根据什么作为标志位?
时间戳!是的,tcp_recycle是根据客户端最后一次挥手时,发出ACK的时间戳作为标志位,时间戳超过这个点,那么就认为这个链接已经处于确认ACK中,无需等待了
开启net.ipv4_tcp_tw_tcpcycle的坏处?
之前有遇到过tcp_recycle参数开启导致服务端丢包问题,但是一直不了解根因,坏处基本答不上来,直到看了这位老哥的文章:深挖由tcp_tw_recycle引发的业务超时问题 - 知乎
个人理解就是,对端送的数据包中,时间戳可以是无序的,如果数据包中的时间戳并不准确(如NAT情况下,NAT不会更改包中的timestamp,而不同机器的时间不可能完全同步,NAT比较复杂,这里不做深究),那么就会造成tcp_recycle将对端于发送的数据包识别成TIME_WAIT之前的链接,造成系统层面的丢包。
如果需要开启,那么需要确保客户端与服务端之间,做了时间同步,或者时间一致,并且数据包中的时间戳必须是有序的,否则会造成系统层面丢包
接下来说net.ipv4.tcp_tw_reuse
理解tcp_recycle后,reuse这块就更好理解了,这个参数与tcp_recycle类似,都是对处于TIME_WAIT状态的连接进行处理,但是tcp_recycle主要在于断开连接,tcp_reuse在于复用连接
tcp_reuse的作用域小于tcp_recycle,tcp_recycle作用于双向断开连接都可以生效,tcp_reuse仅用于出向连接,也就是作用于客户端主动发起断开连接的情况下生效,服务端主动断开时,这个参数是无意义的;
由于net.ipv4.tcp_tw_recycle是用于断开处于TIME_WAIT状态的连接,因此参数比较危险,会导致丢包,在数据包时间戳处于无序状态时更会引发生产事故,因此在Linux内核4.x后,这个参数已经被弃用,但目前市面上3.x版本内核还是比较常见,很多企业还是会涉及这个问题。文章来源:https://www.toymoban.com/news/detail-801341.html
系统层面运维来讲,这部分知识基本上已经够用了,仅做个人记录用,欢迎大神批判,学习ing...文章来源地址https://www.toymoban.com/news/detail-801341.html
到了这里,关于tcp_recycle与tcp_reuse的简易理解(个人记录用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!