time_wait与面试的暧昧

【背景知识】TCP三次握手与四次挥手

http://blog.csdn.net/double_happiness/article/details/70160738

time_wait是什么?

通过上面三次握手和四次挥手的学习,在TCP连接断开的时候,断开的一方将处于time_wait状态。

为什么主动断开连接的一方将处于time_wait状态?

(1)等待被关闭方应答ACK确认

因为TCP协议是可靠的面向连接的协议,因此在任何情况下,都应该保证收发双方的数据能够被正确的发送到对端主机,一般来说主动断开的一方将处于time_wait状态,而被动关闭的一方则将处于close状态,这样就能确保发送的数据正确的到达对端主机。正如上文所讲的TCP断开连接的时候为什么是四次挥手而不是三次或者五次,显然聪明的设计人员经过反复的验证之后肯定是认为四次是最好的。再此我们应该知道在TCP协议中最后一次的ACK是不能保证正常传输的,因此当一方关闭连接时,假设它发送的ACK报文丢失了,那么被动关闭的一方将重新发送它的FIN,主动关闭的一方必须维持一个有效的状态信息(time_wait状态下维持),以便能够在次重发ACK报文。如果主动断开的一方不维持这种状态,而进入close状态,那么主动关闭的一方在处于close状态时,那么主动关闭的socket在处于close状态时,接受到FIN后会响应一个RST。被动关闭的一方接收到RST后会认为出错。如果TCP协议想要完成必要的操作而终止双方的数据流传输,就必须完全正确的传输四次握手的四个节,不能有任何的丢失。

(2)防止网络中残存的数据报丢失

假设关闭方和被关闭方都已经调用了close,同时进入了CLOSE状态,而没有进入time_wait状态。那么当有一个新的连接建立起来时,使用的IP地址与端口与先前的完全相同,后建立的连接是前一个连接的完全复用,这样就有可能收到原来残存在网络中的数据报。为了防止这一点,TCP不允许新连接复用time_wait状态下的socket。处于time_wait状态的socket在等待两倍的MSL时间以后,将会转变为CLOSED状态,这就意味着一个成功建立的连接,必然使得先前网络中残余的数据报都丢失。

为什么time_wait状态在socket下需要等待两倍的MSL?

MSL是一个数据在网络中单向发出到确认丢失的时间,一个数据报可能在发送途中丢失,也可能在其响应过程中成为残余数据报,确认一个数据报,因此确认一个数据报及其响应的丢弃需要两倍的MSL时间。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_happiness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值