srwebsocket 服务器过段时间会关闭_TCP第四次挥手,为啥要等待2MSL时间才进行关闭?...

本文首发于微信公众号:程序员乔戈里

89037b62a39abb0ac419d7d92bd106a4.png
591eb2e6dbdf1bf3c3e54840d9557642.png
ca1b5e13440a5754a3a8f19fbf43bcc7.png
7240d716761df9bf3c801621d6dc5e25.png

MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存活的最长时间,超过这个时间报文将被丢弃。而2MSL的意思就是2倍的MSL的意思。

0f437e5be7444e16f0aa7401e1795fef.png
02d35c2a85e2ba81dfab65f6184e03cf.png
d5fe8c8c3ce229b6633c2d119cc8767a.png
bf41bdc5e4a6fb36bbd724583b95d95f.png
f8d0674cd104885136dbd69dbaf2a827.png
57a4579ded1d17322b6d0e63351463ce.png

小萌: 这种情况下,那服务器会一直收不到客户端的回应,所以这种情况是和只进行三次挥手的情况类似的,服务器没有收到回应,服务器就无法知道到底客户端有没有收到服务器断开的请求。

如果客户端收到了,那还好,皆大欢喜客户端和服务器端都断开连接;

如果客户端没有收到(为啥这么说呢?虽然客户端已经收到了,但是客户端没有回应呀~,没有回应谁知道你到底收没收到,所以服务器不知道客户端收到没有,就好比你自己捡了100块钱,你不交给警察叔叔,那么警察叔叔怎么知道你捡没捡100块呢?),客户端还一直傻傻地在那里等着服务器继续发送消息。

服务器无法判断客户端是否收到,这种情况本身就是一种不可靠的情况,堂堂号称可靠的TCP的连接出现这种情况岂不是要被笑掉大牙?

91e9ef9b218f7841d474e94021015835.png

乔戈里:小萌你说得很好,也因此出现了客户端要等待2MSL的情况。为了保证客户端最后一次挥手的报文能够到达服务器,如果第四次挥手的报文段丢失了,服务器会超时重传这个第三次挥手的报文段,所以客户端不是直接进入CLOSED,而是要保持TIME_WAIT(等待2MSL就是TIME_WAIT)就起到作用了,当再次收到服务器的超时重传的断开连接的第三次挥手的请求的时候,客户端会继续给服务器发送一个第四次挥手的报文,能够保证对方(服务器)收到客户端的回应报文,最后客户端和服务器正确的关闭连接。

3a1f67997d5ac56564a11ac853a70490.png
d6c9a22bc6394214b8ab257aeb320d30.png

乔戈里:如果Client(客户端)直接CLOSED(关闭),然后又再向Server(服务器端)发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

563efeeb910dc7d4ead4b676b695945c.png
3ae0544898cfe53b5178e260263e5bf2.png

小明与女神的对话: 所处的网络环境:如果客户端不等待2MSL直接进行关闭,前一次的连接的数据还在网络中。

383af90a83d01caa3abc049133a1c67a.png

这个时候小明以为他的消息会在这2MSL中的时间中消失(小明以为这个TCP是正常的四次挥手),悄悄说了一句女神的坏话,但是悲剧的是这个小明所在的网络环境不是可靠的没有等待2MSL的网络环境,并没有消失,因此如果没有2MSL的等待时间上一次的小明说的坏话的数据包还在网络中。

你说好巧不巧,小明和女神重新建立了连接以后,端口号还是之前的端口号,ip地址也没变,于是小明和女神上一次说坏话聊天的记录,重新送到了女神那里。

于是女神收到了小明说的坏话,然后小明就。。。

d38b9318168d16ef5d1d8916158d4f1f.png
00c547319360918a77cc7c3f54690cc6.gif
ec4b8622a30e7cec7342da4663938d8c.png

关注头条号 程序员乔戈里 关注以后私信我,送你一份价值19889元的某平台内部的编程资料和一堆实用软件,价值20000+元的考研资源,以及5000G python/C++/Java/机器学习资源。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值