TCP三次握手、四次拜拜

一张图解释清楚:
这里写图片描述

注意,关闭链接时,CLIENT\SERVER有可能都是服务端,只要是建立TCP链接的双方都可以;

注:
1:发送了FIN只是表示这端不能继续发送数据(应用层不能再调用send发送),但是还可以接收数据;

2:四次握手拜拜时,有时候SERVER的ACK、FIN会同时一次发送,那么CLIENT中就没有FIN_WAIT_2状态
直接进入了TIME_WAIT状态;

3:TIME_WAIT存在的必要性
有些人会奇怪,client端发送最后一次ACK后,不就可以变成CLOSED状态了,为什么要等到2MSL的时间呢?
假设最后一个ACK丢失了,被动关闭一方会重发它的FIN。主动关闭一方必须维持一个有效状态信息(TIMEWAIT状态下维持),以便能够重发ACK。如果主动关闭的socket不维持这种状态而进入CLOSED状态,那么主动关闭的socket在处于CLOSED状态时,接收到FIN后将会响应一个RST。被动关闭一方接收到RST后会认为出错了。如果TCP协议想要正常完成必要的操作而终止双方的数据流传输,就必须完全正确的传输四次握手的四个节,不能有任何的丢失。这就是为什么socket在关闭后,仍然处于TIME_WAIT状态的第一个原因,因为他要等待以便重发ACK。
假设目前连接的通信双方都已经调用了close(),双方同时进入CLOSED的终结状态,而没有走TIME_WAIT状态。会出现如下问题,现在有一个新的连接被建立起来,使用的IP地址与端口与先前的完全相同,后建立的连接是原先连接的一个完全复用。还假定原先的连接中有数据报残存于网络之中,这样新的连接收到的数据报中有可能是先前连接的数据报。为了防止这一点,TCP不允许新连接复用TIME_WAIT状态下的socket。处于TIME_WAIT状态的socket在等待两倍的MSL时间后,将会转变为CLOSED状态。这就意味着,一个成功建立的连接,必然保证先前网络中残余的数据报都丢失了;

4:什么是2MSL?MSL即Maximum Segment Lifetime,也就是报文最大生存时间,引用

猜你喜欢

转载自blog.csdn.net/fengshenju2018/article/details/50236185
今日推荐