作者是怎么开展讲述的
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就是发送过去的包,再返回来的时间,这是一个双边加起来的时候,也是为了保证服务端收到包的同时,并返回给客户端,给客户端收到的时间间隔。
|