因为这个问题,我气跑了面试官

本文深入解析TCP连接中time_wait和close_wait状态的原因及影响。详细介绍了这两种状态在服务器端大量出现时可能产生的问题,以及如何通过调整socket选项来解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现大量close_wait和time_wait怎么办?

这涉及到TCP的四次挥手时状态

我们先来复习一下TCP的三次握手和四次挥手过程中每个阶段对应的状态

三次握手:

在这里插入图片描述

四次挥手:

在这里插入图片描述
问题1:
如果服务器端出现大量time_wait状态?
time_wait是为了防止最后一次ACK丢失
就会立刻给客户端发送一个结束报文段来关闭连接,客户端收到这个结束报文段之后,并没有直接进入CLOSE状态而是转移到TIME_WAIT状态。在这个状态,客户端连接要等待一段长为2MSL的时间,才能完全关闭。MSL是TCP报文段在网络中的最大生存时间
为什么要引用 time_wait ?
可靠的终止TCP连接。
保证让迟来的TCP报文有足够的时间被识别并丢弃。

我们来看,time_wait出现在主动断开方,这时候说服务器端出现了大量的time_wait状态,说明主动断开方是服务器。
那么服务器为什么会主动断开连接呢?

服务器主动close。
服务器主动断开连接,按理说服务器是提供服务的,很少有可能主动断开,说明出现了业务有逻辑上的漏洞,(异常现象)
如果是个正常现象,time_wait是个正常现象,说明想要重用这个socket
怎么重用?

采用:

int setsockopt(int sockfd, int level, int optname,
                      const void *optval, socklen_t optlen);

如果服务器端出现大量close_wait状态会怎么样?
1:什么是CLOSE_WAIT状态?
在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。
和SYN_RECVD一样这个CLOSE_WAIT应该是个很短时间

服务器出现大量CLOSE_WAIT
服务器recv返回0,没有及时调用close
在这里插入图片描述

close_wait 和 time_wait有没有什么影响?

数量少的时候不会产生影响。
数量多的时候会产生影响。

出现大量的close_wait 和time_wait时
在这里插入图片描述
会占用大量内存资源,使得后面新的连接缓慢。

总结:学艺不精,该打。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值