【网络编程实战】-第10讲-TIME_WAIT:隐藏在细节下的魔鬼

作者是怎么开展讲述的

1、作者先讲述了自己生产遇到了有很多TIME_WAIT的状态,
2、然后从TCP的四次挥手中去讲TIME_WAIT的作用
3、然后引出了2MSL,接着讲MSL是什么,为什么是2
4、接下来才是讲怎么处理TIME_WAIT过去的问题

本篇学习需要收获的内容是这几个

  • MSL是什么?可以修改吗?
  • TIME_WAIT在TCP中的作用是什么?如果没有了他会怎样
  • 为什么设置成2MSL?如果设置过长或者过短会怎样?
  • 怎么解决TIME_WAIT过多的问题,有什么思路?优缺点都是什么?

MSL是什么

最长报文段寿命 MSL(maximum segment lifetime),它是任何报文在网络上存在的最长的最长时间。
MSL=1分钟

直接查看Linux系统内的值
在这里插入图片描述

可以修改MSL的值吗?

在这里插入图片描述
可以的

TIME_WAIT 的作用是什么?

二话不说,TCP四次挥手的图是必然要的
在这里插入图片描述

  • 场景

TIME_WAIT
是出现在主动断开的那一方的,看图可以知道,当服务端向客户端发送出最后一个FIN包的时候,客户端就会向服务端发送一个ACK的包,告诉服务端,我们这边已经准备关闭了,进入半关闭状态了。

  • 为什么要进入这个状态呢

你按照正常思路想肯定是想不出来为什么呢,肯定是按异常才想的处理

出现的情况
A、我客户端发出去的最后一个ACK的包,如果服务端没有收到。
站在客户端的视角:“我主动下线了,没啥事~”
站在服务端的视角:“对方的最后一个ACK包还没给我,是不是我最后的FIN包没给过去,那我就继续发吧”,然后循环,一直发。。。

因此,没有这个TIME_WAIT的状态的时候,客户端直接就下线了,服务端是可能没办法完全进入关闭状态的,这个是我们不想看到的

那么在这个场景下TIME_WAIT是怎么起作用的呢?

客户端发完最后一个ACK的包之后,先等个2MSL,进入TIME_WAIT 状态,如果服务端真的没有收到最后一个ACK的包,那服务端会在重发一次FIN包,此时,客户端是还在线的!对,He still alive!!这很关键,只要他还活着,就能确保能再尝试发一次ACK的包了。
总结一句话就是:

为了保证最后一个ACK的包能够安全可靠地到达服务端

B、如果在这次连接结束后,马上又开始一次新的连接,上一次TCP连接的分节,传输到了最新一次连接的请求里面去了,那不就乱了。
这次这个场景,是从2个大的TCP连接的角度去讲述的
假设第一TCP连接请求叫做T1,那么当他结束连接之后,假设没有TIME_WAIT状态,然后又重新来了一次一模一样的的四元组连接(源 IP,源端口,目的 IP,目的端口)叫做T2,那T1连接产生的任何一个TCP的分节,都可能会在由于网络传输的原因,延迟送到了,但此时送到的确实T2连接上,就会对T2连接进行干扰。

那么在这个场景下TIME_WAIT是怎么起作用的呢?

划重点!
TCP不允许处于TIME_WAIT状态的连接启动一个新的化身,也就是TIME_WAIT状态的时候,如果有相同的四元组的连接返回给了客户端,客户端都是不会启动一个新的连接的,说到底就是,这个TIME_WAIT状态,起到了一个很好的前后2次TCP连接的隔离作用。

那为什么可以隔离呢?
因为在2MSL时间段里面,可以保证在网络上传输的各种分节,都能够消逝,让上一次连接节点的多个数据包,都死亡,这样就可以做到前后的2次连接的互不干扰了。

那为什么是2个MSL呢?

1个MSL代表一个数据报从一端发送到另一端的时间,2个MSL就是发送过去的包,再返回来的时间,这是一个双边加起来的时候,也是为了保证服务端收到包的同时,并返回给客户端,给客户端收到的时间间隔。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值