乐趣区

关于后端:tcp四次挥手中的TIMEWAIT

tcp 四次挥手中的 TIME_WAIT

一次面试中被问到:服务器中存在大量 TiME_WAIT 状态的连贯,应该从什么角度去优化(思考)?

大量 TIME_WAIT 产生的起因

只有发动连贯终止的一方会进入 TIME_WAIT 状态。

所以当服务器敞开大量 tcp 连贯时会产生大量 TIME_WAIT 状态的连贯。

TIME_WAIT 的作用

  1. TIME_WAIT是为了确保客户端最初发送给服务端的 ACK 报文能被服务器接管到,从而帮忙其失常敞开。
  2. 确保残留的 TCP 包 天然沦亡

当服务端没有收到 ACK 报文时(此时ACK 报文能够因为网络拥塞或其余起因导致报文失落),会重发FIN 报文。

TMIE_WAIT 的危害

  1. 会占用内存资源
  2. 会占用端口资源。大量的 TIME_WAIT 状态连贯会导致服务器的端口用尽,使服务不可用(该服务器通过 tcp 连贯对外提供服务即该服务器运行 tcp 客户端过程)。

解决办法

  1. 通过 stsctl 命令将零碎值调小(net.ipv4.tcp_max_tw_bukets)。当零碎中处于 TIME_WAIT 的连贯超过零碎值,零碎会将所有的TIME_WAIT 连贯状态重置,并打印正告信息。
  2. 设置套接字选项。设置调用 closeshutdown敞开连贯的行为。
  3. net.ipv4_tw_reuse: 能够复用处于 TIME_WAIT 的套接字让其为新的连贯所用(TIME_WAIT状态超过 1s 进行复用;只实用于连贯发起方(C/ S 模型中的客户端))。
退出移动版