TCP协议的Time_Wait

TCP协议的TIME_WAIT状态是为了确保数据传输的可靠性。它避免了最后一个ACK丢失导致的问题,以及新连接与旧连接数据包混淆的风险。然而,在高并发短连接服务器中,大量TIME_WAIT状态会占用资源。解决方案包括调整内核参数,如增加tcp_max_tw_buckets限制,启用tcp_tw_recycle快速回收,以及启用tcp_tw_reuse重用机制。
摘要由CSDN通过智能技术生成

首先,TIME_WAIT并不是多余的。在TCP协议被创造,经历了大量的实际场景实践之后,TIME_WAIT出现了,因为TCP主动关闭连接的一方需要TIMEWAIT状态,它是我们的朋友。

为什么需要TIme_Wait

TCP协议要保证在所有可能的情况下使得所有的数据都能够被正确送达。当你关闭一个socket时,主动关闭一端的socket将进入TIME_WAIT状态,而被动关闭一方则转入CLOSED状态,这的确能够保证所有的数据都被传输。
当一个socket关闭的时候,是通过两端四次握手完成的,当一端调用close()时,就说明本端没有数据要发送了。这好似看来在握手完成以后,socket就都可以处于初始的CLOSED状态了,其实不然。原因是这样安排状态有两个问题, 首先,我们没有任何机制保证最后的一个ACK能够正常传输,第二,网络上仍然有可能有残余的数据包(wandering duplicates),我们也必须能够正常处理。
TIME_WAIT就是为了解决这两个问题而生的。

  1. 假设最后一个Ack丢失了,被动关闭的一方会重发它的FIN,主动关闭的一方要维持一个有效的状态信息。以便于能够重发确认。如果主动关闭的socket不维持这种状态而进入CLOSED状态,那么主动关闭的socket在处于CLOSED状态时,接收到FIN后会响应一个RST,被动关闭一方接收到RST后会认为出错了。这就是为什么socket在关闭后,仍然处于TIME_WAIT状态的第一个原因——等待以便重发ACK。
  2. 假设目前连接的通信双方都已经调用了close(),双方同时进入CLOSED的终结状态,而没有走TIME_WAIT状态。那么会出现如下问题:现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值