TCP创建的过程和释放的过程都是通过TCP/IP协议栈自动完成的. 本篇就主要是分析TCP释放过程.
TCP报文段首部格式
注意 : TCP虽然是面向字节流的, 但是TCP传送的数据单元却是报文段.
本篇我们主要会涉及到TCP首部的 : FIN.
四次挥手的过程
连接释放需要发送4次报文才能完成. 这是因为TCP连接是全双工的, 每一端都需要对读写部分分别进行关闭才行. 当一端关闭读/写或者都关闭时, 该端就会向对象发送FIN
来告知对端我将要关闭了, 对端知道后挥发送确认, 关闭端确认后再发送一个确认给对端. 整体就是首先进行关闭的一方将执行主动关闭, 而另一方执行被动关闭.
上图是客户发送FIN, 当然也可以是服务端发送FIN, 一般是客户端主动断开.
- 客服端调用
close
等函数主动关闭, 并向服务端发送一个含FIN
的报文, 然后就进入FIN-WAIT1
阶段, 该阶段是等待对端的ACK到来. - 服务端接收到对端的
FIN
后, 立马向对端回一个ACK
确认, 然后进入CLOSE-WAIT
阶段,