tcp必知必会

tcp协议相关的问题总结

连接的建立

三次握手

正常情况下,建立连接需要经过三次握手 alt 三次握手

连接的终止

正常终止(四次挥手)

正常情况下,断开连接需要经过四次挥手 alt 三次握手

异常终止(RST报文)

主动终止方发送RST报文立刻终止连接

处于TIME_WAIT状态的连接过多怎么办?

如何查看连接状态?

1
2
3
4
5
❯ netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
LISTEN 32
CLOSE_WAIT 7
TIME_WAIT 3
ESTABLISHED 119

什么情况下会产生大量的TIME_WAIT连接?

我们知道TIME_WAIT是主动正常断开连接的一方所处的最后一个状态,这个状态会经历2MSL时长(2*30s) 在Nginx反向代理中,在高并发短连接的场景下,可能导致大量的TIME_WAIT连接

TIME_WAIT 危害

  • 对于客户端:处于TIME_WAIT状态的连接占用的端口无法被再次使用,可能会导致端口耗尽,无法建立新的连接
  • 对于服务端:大量的连接不被释放会消耗内存

控制最大TIME_WAIT连接数

Linux提供了tcp_max_tw_buckets参数,当TIME_WAIT连接数等于此参数值时,新的连接关闭时不会再经历TIME_WAIT状态,而是直接关闭。

重用连接

Linux提供了tcp_tw_reuse 参数允许复用处于TIME_WAIT状态的连接

Licensed under CC BY-NC-SA 4.0