TCP四次挥手
1.前言
- 关于 TCP 三握手以及后面文章用到的东西可以查看我的这篇博文:三次握手
2.四次挥手
- 所谓四次挥手(Four-Way Wavehand)即终止 TCP 连接,就是指数据传送完毕需要断开一个 TCP 连接时,需要客户端和服务端总共发送 4 个包以确认连接的断开。在 socket 编程中,这一过程由客户端或服务端任一方执行
close
来触发,整个流程如下图所示:
由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个
FIN
来终止这个方向的连接。收到一个FIN
只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个FIN
后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。第一次挥手(FIN=1,seq=u)
- 假设客户端想要关闭连接,客户端发送一个
FIN
标志位置为 1 的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。因为有可能服务器还要发送数据,所以发送自己的序列号seq=u
,等待服务器确认。 - 发送完毕后,客户端进入
FIN_WAIT_1
状态。
- 假设客户端想要关闭连接,客户端发送一个
第二次挥手(ACK=1,seq=v,ack=u+1)
- 服务器端确认客户端的
FIN
包,发送一个确认包(ACK=1
(确认),seq=v
(自己的序列号),ack=u+1
(确认收到序列号u以前的包,并希望下次发送数据从 u+1 开始)),表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接(可能有数据发送)。 - 发送完毕后,服务器端进入
CLOSE_WAIT
状态,客户端接收到这个确认包之后,进入FIN_WAIT_2
状态,等待服务器端关闭连接。 - 在这过程中 TCP 服务器进程会通知高层应
- 服务器端确认客户端的