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 模型中的客户端))。