当前位置:   article > 正文

TCP连接的四次挥手全过程_四次挥手过程

四次挥手过程

TCP通过四次挥手来释放连接
在这里插入图片描述

四次挥手的过程如下:

第一次挥手:

  • 客户端向服务器发送一个 FIN 数据包(FIN = 1,seq = u)主动断开连接,报文中会指定一个序列号。
  • 告诉服务器:我要跟你断开连接了,不会再给你发数据了;
  • 客户端此时还是可以接收数据的,如果一直没有收到被动连接方的确认包,则可以重新发送这个包。
  • 此时客户端处于 FIN_WAIT1 状态。

第二次挥手:

  • 服务器收到 FIN 数据包之后,向客户端发送确认包(ACK = 1,ack = u + 1),把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了
  • 这是服务器在告诉客户端:我知道你要断开了,但是我还有数据没有发送完,等发送完了所有的数据就进行第三次挥手
  • 此时服务端处于 CLOSE_WAIT 状态,客户端处于 FIN_WAIT2 状态

第三次挥手:

  • 服务器向客户端发送FIN 数据包(FIN=1,seq = w),且指定一个序列号,以及确认包(ACK = 1, ack = u + 1),用来停止向客户端发送数据
  • 这个动作是告诉客户端:我的数据也发送完了,不再给你发数据了
  • 此时服务端处于LAST_ACK状态,客户端处于TIME_WAIT状态

第四次挥手:

  • 客户端收到 FIN数据包 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值
  • 此时客户端处于 TIME_WAIT 状态。
  • 需要过一了一定时间(2MSL)之后,客户端发送确认包(ACK = 1, ack = w + 1),此时客户端才会进入 CLOSED 状态,以确保发送方的ACK可以到达接收方,防止已失效连接请求报文段出现在此连接中。
  • 至此,完成四次挥手。

等待计时器(TIME-WAIT)

MSL(Max Segment Lifetime):最长报文段寿命

等待计时器等待的时间为2MSL,MSL一般设置为2分钟。

为什么需要等待2MSL?

  1. 确保发送方发送的第四次挥手ACK报文可以到达接收方;2. 确保当前连接的所有报文都已经过期;
  • 在四次挥手时,只要发送方发出了第四次挥手的报文之后,发送方就进入了等待状态,这时最后一个报文其实是并没有确认的,这个等待计时器主要是为了确保发送方发送的第四次挥手ACK报文可以到达接收方
    • 2MSL是报文在网络中最长可以存活的时间,在2MSL时间里,如果第四次挥手ACK报文没到达服务端,接收方会重新发送第三次挥手的报文给客户端,客户端收到之后,就知道之前第四次挥手的 ACK 报文丢失了,然后再次发送 ACK 报文。确保正确地结束这次连接
  • 另外一个功能是为了确保当前连接的所有报文都已经过期,防止已失效的连接请求报文段出现在本连接中
    • 因为最后一个报文都已经等待了2MSL时间,所以对于其他报文,肯定也超过2MSL的时间,都是过期的报文
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/itrstu/article/detail/60179
推荐阅读
相关标签
  

闽ICP备14008679号