tcp四次挥手中的TIME_WAIT
一次面试中被问到:服务器中存在大量TiME_WAIT
状态的连接,应该从什么角度去优化(考虑)?
大量TIME_WAIT产生的原因
只有发起连接终止的一方会进入TIME_WAIT状态。
所以当服务器关闭大量tcp连接时会产生大量TIME_WAIT状态的连接。
TIME_WAIT的作用
TIME_WAIT
是为了确保客户端最后发送给服务端的ACK
报文能被服务器接收到,从而帮助其正常关闭。- 确保残留的TCP包
自然消亡
。
当服务端没有收到ACK
报文时(此时ACK
报文可以因为网络拥塞或其他原因导致报文丢失),会重发FIN
报文。
TMIE_WAIT的危害
- 会占用内存资源
- 会占用端口资源。大量的TIME_WAIT状态连接会导致服务器的端口用尽,使服务不可用(该服务器通过tcp连接对外提供服务即该服务器运行tcp客户端进程)。
解决方法
- 通过stsctl命令将系统值调小(net.ipv4.tcp_max_tw_bukets)。当系统中处于
TIME_WAIT
的连接超过系统值,系统会将所有的TIME_WAIT
连接状态重置,并打印警告信息。 - 设置套接字选项。设置调用
close
或shutdown
关闭连接的行为。 - net.ipv4_tw_reuse:可以复用处于
TIME_WAIT
的套接字让其为新的连接所用(TIME_WAIT
状态超过1s进行复用;只适用于连接发起方(C/S模型中的客户端))。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。