(1)TCP的TIME_WAIT超过65536是否就不能再建立连接呢?
答案是否定的,只要四元组不一样,就可以利用本地同样的ip+端口建立连接,不管本地这个IP+端口是否已经有了其他状态的连接。
(2)net.ipv4.tcp_max_tw_buckets 是限制TIME_WAIT状态的数量的,默认是65536。
很多时候会把这个值改小,例如16384,那么在短连接情况下,TW状态的连接很容易达到这个阈值,那么超出部分的TW连接会怎么处理呢?
按个人测试结果来看是直接进入closed状态的,并且TCPTimeWaitOverflow有增加的。
netstat -s | grep TCPTimeWaitOverflow
(3)那么不经过time_wait的连接会不会产生某些问题呢?
那先看time_wait的作用是什么了,time_wait作用是保证TCP连接正常关闭的可靠性的,因为第三次挥手的FIN是可能会重传的(没收到第四次挥手的ACK就会重传),如果不经过time_wait,同样的四元组又新建了连接,那旧连接上重传的FIN就可能发到新连接上,这个时候会把新连接关掉了,从而造成影响。
但是事实确实如此吗?我理解是在net.ipv4.tcp_timestamps = 1 的情况下,新连接收到旧连接的报文包括FIN,会直接丢弃不管,因为从timestamps 能判断这个报文是在新连接建立之前的。所以结论是在tcp_timestamps =1 的情况下,不会造成问题。
类似于tcp_tw_reuse = 1 的情况,并不会造成问题。
另外说明一下tcp_tw_reuse 在TW连接没达到tcp_max_tw_buckets 阈值的时候也能发挥作用,当然tcp_timestamps要打开。
欢迎讨论、指正!