时序图:
详细流程:
我们用 curl http://sogo.com
来获得一次 TCP 断开连接。
在 wireshark 中找到这几条记录:
可以看到断开连接的过程如下:
1.客户端设定随机序列号 1316840669
,向服务端发送 FIN/ACK
请求,请求服务端断开连接。客户端进入 FIN_WAIT_1
状态。
2.服务端设定随机序列号 617231205
,确认号 1316840670
(1中的序列号+1),向客户端发送 ACK
请求。服务端进入 CLOSE_WAIT
状态。
3.服务端设定序列号 617231205
(同2中的序列号),确认号 1316840670
(同2中的确认号),向客户端发送 FIN/ACK
请求。服务端进入 LAST_ACK
状态。
4.客户端设定确认号 617231206
(2、3中的序列号+1),向客户端发送 ACK
请求。服务端进入 CLOSED
状态。断开连接完毕。
和三次握手建立连接相比,为什么断开连接是四次而不是三次?
由于TCP通信是全双工的,客户端申请断开连接,说明其没有数据继续传输了,服务端给与确认回应,但此时服务端可能还有数据没有传完,传完后它也会申请断开连接,客户端给与确认回应,至此断开连接。