当前位置:主页 > 查看内容

Linux:TCP协议——四次挥手【图片+文字】

发布时间:2021-05-10 00:00| 位朋友查看

简介:LinuxTCP协议——四次挥手【图片文字】 四次挥手 四次挥手时客户端与服务端的状态转变 理解为什么TIME_WAIT的时间是2MSL 如果服务端或者客户端突然崩溃会怎样 四次挥手 tcp协议的 三次握手 是通信双方建立连接的过程而四次挥手其实就是通信双方断开连接时要……

四次挥手

tcp协议的三次握手是通信双方建立连接的过程,而四次挥手其实就是通信双方断开连接时要经历的过程。而在通信双反断开连接时,无论是客户端先关闭(调用close函数,向服务端发送FIN),还是服务端先关闭(调用close函数,向客户端发送FIN)都要经历四次握手这个阶段。
客户端

在这里插入图片描述

服务端
在这里插入图片描述
对于四次挥手,个人觉得和我们平时下班还挺像的。就比如说你和你的老板让你处理一件工作,快下班了,老板说他快下班了,你的把你处理的工作进度给你的老板说,并询问自己是否可以下班,当他同意了你才可以下班一样:
在这里插入图片描述

四次挥手时客户端与服务端的状态转变

服务端

状态解释
ESTABLISHED -> CLOSE_WAIT当客户端主动关闭连接(调用close), 服务器会收到结束报文段, 服务器返回确认报文段并进入CLOSE_WAIT;
CLOSE_WAIT -> LAST_ACK进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据); 当服务器真正调用close关闭连接时, 会向客户端发送FIN, 此时服务器进入LAST_ACK状态, 等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)
LAST_ACK -> CLOSED服务器收到了对FIN的ACK, 彻底关闭连接

客户端

状态解释
ESTABLISHED -> FIN_WAIT_1客户端主动调用close时, 向服务器发送结束报文段, 同时进入FIN_WAIT_1;
FIN_WAIT_1 -> FIN_WAIT_2客户端收到服务器对结束报文段的确认, 则进入FIN_WAIT_2, 开始等待服务器的结束报文段;
FIN_WAIT_2 -> TIME_WAIT客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出LAST_ACK;
TIME_WAIT -> CLOSED客户端要等待一个2MSL(Max Segment Life, 报文最大生存时间)的时间, 才会进入CLOSED状态.

理解为什么TIME_WAIT的时间是2MSL

上面我们看到在断开连接的一方进入TIME_WAIT后等待了2MSL的时间,那么他为什么要等待2MSL的时间呢,要来解释清楚这个问题,我i们需要理解
(1)MSL表示的是报文的最大生存时间(在网络中数据包理论上的最大生存时间)
(2)对于断开连接的一方而言(这里以客户端为例子),客户端还是处于TIME_WAIT状态,并切在等待2MSL的时间;
(3)对于被断开连接的一方(这里以服务端为例)而言,服务端不清楚FIN报文是否达到客户端,服务端在发送FIN报文之后,就会开启超时重传。
那么现在我们假设主动断开连接方(客户端)只等待一个MSL,就将自己的状态设置成CLOSED状态,并且返回的ACK还丢失掉了。那么这个时候客户端的状态已经为CLOSED状态了,而服务端状态由于还没有收到ACK,将继续维持在LASK_ACK状态。而此时服务端开始重新发送FIN报文,但是由于客户端已经是CLOSED状态了,不会再去处理该连接上的数据了,客户端机器会给服务端发送一个RST报文(连接重置报文)。
其实这个现象也可以用上面我们老板和员工的例子来模拟一下的,假如老板最后给员工发送下班的信息中途因为某种原因丢失了,导致员工一直在等待下班的指令(假设员工只能在收到下班指令后才能下班,除非老板已经下班),时间长了员工由于不知道老板是否已经下班了就会怀疑老板没有收到刚才的消息,再次向老板发送工作完成的消息,此时员工会受到老板已经下班的消息,要想给他提交资料的话只能等明天上班(建立连接)。
而2MSL其实就是丢失ACK的MSL+重传FIN报文的MSL

如果服务端或者客户端突然崩溃,会怎样

在日常生活中可能会出现突然断电的情况,突然断电就意味着网络不能正常工作了,进程会崩溃,来不急调用close,也就是说我们没有向对端发送FIN,但是自己已经关闭了。这种情况下会怎样呢?
保活计时器:在网络协议栈的TCP协议当中,设计了一种心跳包,当连接双方没有数据往来的时候,超出保活计数器的时间之后,就会给对方发送心跳包(心跳包是TCP协议处理的,并不会交给应用层程序处理);如果对方没有收到心跳包,连续发送10次心跳包,如果10次都没有收到确认回复,则认为对端已经不存在了,关闭连接;如果收到了对方发送的确认包,则认为连接是正常的。

;原文链接:https://blog.csdn.net/qq_43825377/article/details/115442572
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐