C++网络编程之十四TIME_WAIT和CLOSE_WAIT

一、网络通信中的一些铺垫说明

在实际的网络开发中,可能遇到各种各样的问题。这些问题可能千奇百怪,但万变不离其宗。有过TCP/IP开发经验的知道,TCP的通信要通过三次握手和四次挥手来实现通信的连接和断开。而如果在这三次握手和四次挥手过程中如果遇到一些异常,会是什么情况呢?比如三次握手时没有实现完整的握手过程;亦或四次挥手时没有形成完整的挥手过程 。这是从通信底层来看问题,但如果从上层应用看呢?如何将底层的一些问题与上层暴露出来的现象对应起来,这才是重点。
今天就讨论一个比较常见的现象,就是在服务端上有很多TIME_WAIT和CLOSE_WAIT。而在面试中可能就会问题,如果服务端有大量的TIME_WAIT和CLOSE_WAIT,应该怎么解决?

二、TIME_WAIT和CLOSE_WAIT分析

其实要想明白二者处理的方式,就首先要弄明白二者是如何产生的。下面就对TIME_WAIT和CLOSE_WAIT产生的机制进行分析:
1、TIME_WAIT
TIME_WAIT,是主动关闭方收到对方的FIN报文并回应ACK报文,在2MSL(2 倍的 max segment lifetime,最大生存时间,RFC中给出的是2分钟,但实际一般是30秒、1分钟或2分钟)后转到CLOSED状态。当然如果已经在FIN_WAIT_1状态,收到对方的FIN标志和ACK标志的报文时,可略过FIN_WAIT_2状态直接进入TIME_WAIT状态。
那如果此看来,其实TIME_WAIT并没有什么大问题啊?过了2MSL会自动回收。对,实际情况中,一般来说TIME_WAIT也很难对系统产生重大的影响。但仍然有可能在某些情况下,需要对TIME_WAIT进行处理。那TIME_WAIT的的作用是什么呢?
其实非常简单,对TCP编程来说,开发者可能都知道它是一个双工的通信过程。但实际的环境中,可能出现各种原因导致这种双工不是按理想的你问我答,你来我往的流畅的进行的。举一个简单例子,可能主动关闭端在关闭前发送了一些数据,但被动一方接到了数据后,由于各种原因没有及时的返回应答报文;或者重传的报文发送出来时,对方已经关闭等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值