(C语言) 怎样快速关闭产生的time_wait?

(C语言) 怎样快速关闭产生的time_wait?,第1张

TIME_WAIT是tcp连接的主动关闭的那一端(客户端)最后进入的状态,这个是tcp/ip协议栈规定的,TIME_WAIT的持续时间是2倍的MSS,之所以进入这个状态,是为了防止客户端最后发送给
服务器的确认报文丢失,如果丢失了,客户端在TIME_WAIT状态的持续时间里可以重发这个丢失
的报文。c语言是关不了的,除非你修改TCP/IP内核代码。

是Maximum Segment Lifetime的英文缩写
可翻译为最长报文段寿命, 它是任何报文在网络上存在的最长时间, 超过这个时间段的报文将被丢弃, 我们知道IP头部有个TTL字段, TTL TIME TO LIVE 可以译为生存时间, 但不是一个存在的具体时间, 而是一个IP数据报可以经过的最大路由数, 没经过一个路由它的值就减1, 当此值为0则数据报被丢弃, ICMP报文通知源主机,

从TIME_WAIT状态到CLOSED状态有一个超时设置,这个超时设置是2MSL
(RFC793定义MSL为2分钟),那么为什么在TIME_WAIT后必须等待2MSL时间呢?主要原因有两点:

为了保证客户端发送的最后一个ACK报文段能够到达服务器端
比如: 服务端FIN的ACK没有收到, 会重传FIN,这个时候客户端在TIME_WAIT状态

对端处于LAST_ACK状态,本端发送的syn报文被直接RST掉了

我们都知道,假如A发送的第一个请求连接报文段丢失而未收到确认,A就会重传一次连接请求,后来B收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。假如现在A发送的第一个连接请求报文段没有丢失,而是在某些网络节点长时间都留了,以至于延误到连接释放后的某个时间才到达B,这本来是已失效的报文段,但B并不知道,就会又建立一次连接。而等待的这2MSL就是为了解决这个问题的,A在发送完最后一个确认报后,在经过时间2MSL,
就可以使本链接持续时间内所产生的所有报文段都从网络中消失,
这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段

我们回到MSL,在2MSL时间内,该地址上的连接(客户端地址,端口和服务器的端口地址)不能被使用,比如我们在建立一个连接后关闭连接然后迅速重启连接,那么就会出现端口不可用的情况。

>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10791864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存