srwebsocket 服务器过段时间会关闭_Tcp主动关闭的一些问题

2msl

定义

msl英文Maximum Segment Lifetime,msl指的是一片报文在网络上的生存时间,即这片报文在两个tcp协议栈之间的往返时长。也就是报文一去一回所需时间。

问题

2msl指的是tcp主动关闭场景中time_wait状态。这个状态下主动关闭一方已经发送了最后一个ack报文(last ack)。但是,如果这个last ack报文在网络中丢弃。那么被动关闭一方将会长久停留在last_ack状态。

a083d1633fcef970ab49ce3658b52e44.png

解决办法

主动关闭进入time_wait状态不能立刻进入closed状态,而是设置一个定时器,定时时长为2msl,以免ack网络中丢失。

如果last ack在网络中丢失,被动关闭将长期没有收到last ack,协议栈会重传fin报文。主动关闭收到fin重传报文后,重发一个last ack,并重新设置定时器2msl。

2msl带来的端口问题:

我们知道一个tcp链接有四元组决定,两个ip地址和两个tcp端口。处于2MSL,tcp链接仍然存活,tcp端口始终被占用。如果这时应用进程重启,将会出现端口不能绑定的错误。

比如,http用80端口,服务器触发tcp主动关闭(重启http服务器),这时候80端口处于2msl时长后才会释放。也就是要等2MSL时间后再启动http,2MSL期间tcp的80端口不能用,大概三四分钟比较保险,立刻启动服务,一般会报错,端口不能绑定。

平静时间

2MSL为TIME_WAIT状态,等待最后一个ack能正确到达对方。

比如一台http服务器,使用80端口。这台服务器重启了,会出现什么情况?

假如这台服务器启动了,启动前tcp处于time_wait状态,重启后应用也很快启动,80端口被新的tcp绑定。

这时候,如果启动前的last ack丢失了,那么没有链接重传这个last ack了。

机器重启了,记不到以前的2MSL状态了,规定,机器重启后,在MSL秒内,不能建立任何链接。这段时间称为平静时间

FIN_WAIT_2状态

这个状态是在等对方关闭fin报文,如果这个状态下,一直收不到对方发来fin,比如对方宕机或者网络断了,

这时候主动关闭一方也不能一直等下去。TCP协议栈会启动一个定时器,超过10分钟75秒后即使没有收到fin也进入closed状态。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值