当前位置:   article > 正文

计算机网络之TCP四次挥手

tcp四次挥手

计算机网络之TCP四次握手

1.TCP四次挥手过程

定义:建立一个连接需要三次握手,而终止一个连接要经过四次挥手;这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力

刚开始双方都处于ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下
1.第一次挥手:
当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据)
Client发送一个FIN报文,用来关闭Client到Server的数据传送,报文中会指定一个序列号,即发出连接释放报文段(FIN=1,序号seq=u);
Client进入FIN_WAIT_1(终止等待1)状态
2.第二次挥手:
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v);
Server进入CLOSE_WAIT(关闭等待)状态;
此时TCP链接处于半关闭状态,客户端到服务端的连接释放,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收;
客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段
3.第三次挥手:
Server发送一个FIN,且指定一个序列号,用来关闭Server到Client的数据传送(和客户端的第一次挥手一样);
Server进入LAST_ACK状态。
4.第四次挥手:
Client进入TIME_WAIT状态, 等待 2MSL 时间;
Server进入CLOSED状态

image-20220206113853426

img

2.任何一方执行close()操作即可产生挥手操作为什么要等待呢

附:在socket编程中,任何一方执行close()操作即可产生挥手操作
为什么要等待呢?
为了防止这种情况:A接到B的释放连接请求后会发送一个确认信息,但是如果这个确认信息丢了,也就是B没有收到确认释放连接,那么B就会重发一个释放连接请求,这时候A还处于TIME_WAIT状态,所以会再次发送一个确认信息。
为什么TIME_WAIT 状态还需要等2*MSL秒之后才能返回到CLOSED 状态呢?
因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED 状态(就好比从SYN_SENT 状态到ESTABLISH 状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK 状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。

3.说说 TCP 四次挥手过程

思路: TCP 的四次挥手,也是最重要的知识点,一般跟三次握手会一起考的,必须得记住。

在这里插入图片描述

● Client状态变化:Fin-Wait-1 -> Fin-Wait-2 -> Time-Wait -> Closed
● Server状态变化:Close-Wait -> Last-Ack -> Closed

具体流程:
1.第一次挥手:客户端发送连接释放报文FIN=1,序号(握手时初始序号 + 发送的字节数据数量 + 1)seq=u,发送完毕后,客户端进入FIN_WAIT_1状态。
2.第二次挥手:服务器发出确认收到报文ACK=1,确认号ack=u+1,序列号(握手时初始序号 + 回复的字节数据)seq=v,发送完毕后,服务器端进入CLOSE_WAIT状态,客户端接收到这个确认包之后,进入FIN_WAIT_2状态。
3.第三次挥手:关闭连接,发送连接释放报文FIN=1,确认号ack=u+1,初始序号seq=w,发送完毕后,服务器端进入LAST_ACK状态,等待来自客户端的最后一个 ACK。
4.第四次挥手: 客户端接收到来自服务器端的关闭请求,发回确认收到报文ACK=1,确认序号ack=u+1,初始序号seq=w+1,客户端进入 TIME_WAIT 状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

4.TCP挥手为什么需要四次呢

思路: TCP 挥手为什么需要四次呢?为了方便大家理解,再举个生活的例子吧。
★ 小明和小红打电话聊天,通话差不多要结束时,小红说,“我没啥要说的了”。小明回答,“我知道了”。但是小明可能还有要说的话,小红不能要求小明跟着她自己的节奏结束通话,于是小明可能又叽叽歪歪说了一通,最后小明说,“我说完了”,小红回答,“我知道了”,这样通话才算结束。

在这里插入图片描述

总结:
Server端可能还有数据没有发送完毕。Client发出连接释放通知,Server确认收到后,Client就进入半关闭状态(只收消息不发消息),Server把未发完的数据发送完毕后,发送连接释放通知,Client确认后就关闭连接。

5. TCP 四次挥手过程中,为什么需要等待 2MSL, 才进入 CLOSED 关闭状态

2MSL,two Maximum Segment Lifetime,即两个最大段生命周期。假设主动发起挥手的是客户端,那么需要 2MSL 的原因是:
● 1. 为了保证客户端发送的最后一个 ACK 报文段能够到达服务端。 这个 ACK 报文段有可能丢失,因而使处在LAST-ACK状态的服务端就收不到对已发送的FIN + ACK报文段的确认。服务端会超时重传这个 FIN+ACK 报文段,而客户端就能在 2MSL 时间内(超时 + 1MSL 传输)收到这个重传的 FIN+ACK 报文段。接着客户端重传一次确认,重新启动 2MSL 计时器。最后,客户端和服务器都正常进入到CLOSED状态。(简述:防止ack报文丢失,Server再次发送Fin报文,一来一回最长时间就是2MSL)
● 2. 防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程挑战者/article/detail/60159
推荐阅读
相关标签
  

闽ICP备14008679号