day214-HTTP四次挥手

要点

  1. 目的
  2. 过程

目的

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,客户端或服务器均可主动发起挥手动作。

这个原则是当一方完成它的数据发送任务后就能发送标志位FIN来终止这个方向的连接。收到FIN=1只意味着这一方向上没有数据流动,一个TCP连接在收到FIN=1后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

过程

第一次握手 (FIN=1,seq=x)

假设客户端想要关闭连接,客户端发送标志位FIN为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

发送完毕后,客户端进入FIN_WAIT_1状态。

第二次握手 (ACK=1,ACKnum=x+1)

服务器端确认客户端的 FIN 包,发送一个确认序号(ACKnum,又写做ack),表明已接收客户端关闭连接的请求,但还没有准备好关闭连接。

发送完毕后,服务器端进入CLOSE_WAIT状态。
客户端接收到这个确认序号后,进入FIN_WAIT_2状态,等待服务器端关闭连接。

第三次握手 (FIN=1,seq=y)

服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

第四次挥手 (ACK=1,ACKnum=y+1)

客户端接收到来自服务器端的关闭请求,发送一个确认序号,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

最后

客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

参考

三次握手

文章作者: lmislm
文章链接: http://lmislm.com/2019/08/15/2019-08-15/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog