tcp四次挥手中的TIME_WAIT

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

image-20221026171803731

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

zhaobuqi
1 声望1 粉丝

下一篇 »
tcp--Keep-Alive