time wait 整理

本文深入解析TCP连接断开过程中的Timewait状态,详细阐述了进入该状态的原因、socket在此状态下的行为及对服务端的影响。Timewait状态是为了防止旧连接数据包与新连接混淆,客户端在接收对端发送的FIN后进入此状态,需等待2倍超时时间以确保数据包正确送达或超时废弃。

 

 

状态转换图

 

 

1、谁会进入time wait状态:

主动发起断开连接的一方调用close()函数发送FIN并进入FIN WAIT 1状态,当收到对面反馈的ack之后会进入FIN WAIT2状态。之后收到对面发来的FIN并返回ACK之后会进入time wait状态。

 

 

2、Time wait状态,socket怎么样?

进入time wait状态之后,socket pair处于不可用状态。需要等待time out那么长的时间之后,处于time wait状态的一方才会进入close状态。

 

 

3、为什么会有time wait状态?

设置了这一段时间,就不会出现跟下一次连接之间有任何数据的混淆

主动发起关闭的一方在接受到对方发送的fin之后,会进入time wait的状态。每一个tcp都需要选择一个报文的最大生存时间。因为数据包会在网络上一定的存活时间,这个存活时间在ip包头有一个8位生存时间(TTL)。

发起断开的一端,不知道最后一次挥手后,对端有没有接收到,所以等待2*timeout,如果真的对方没收到最后一次挥手,对方会再次发起一次确认断开的消息(第三次挥手内容),这个时间内,如果发起端又收到了第三次挥手消息,说明刚刚的第四次挥手丢了,重新发出第四次挥手消息即可。如果等待2*timeout ,没收到任何东西,说明第四次挥手成功,连接断开成功。

Time wait就是确保我发送的数据包要么就是到达了目的地,要么就是超过了生存时间之后被抛弃。他是做这个保证的。

单次的ttl不足以完成这个time wait时间,因为假如数据包在生存时间的最后一刻到达了目的端,则目的端会返回一个确认,这个确认也需要一定的时间,所以tim wait的时间一般是两倍的ttl时间

 

 

4、Time wait的注意事项

虽然客户端和服务器都可以进入time wait状态,但是最好服务器不要进入这样的状态

 

 

5、为什么Time wait对服务端的影响比较大,为什么呢?

原因一:资源占用

Socket进入time wait状态时候,操作系统会分配一定的资源去捕捉这个状态,也就是说这个资源还不能被释放,还处于time wait的状态。

原因二:会使得服务器无法使用

假如消息是通过代理服务器获得的,比如vpn,如果这样,很多计算机发出来的消息,是通过一台机器发生中转的。如果服务器发起断开连接,会有大量的端口进入time wait状态,有可能会造成代理服务器无法使用。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值