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