TCP终止连接(TCP四次挥手)

TCP建立一个连接需要3个分节,终止一个连接需要4个分节。
(1)某个应用进程首先调用close,我们称该端执行主动关闭(active close)。该 端的TCP于是发送一个FIN分节,表示数据发送完毕。
(2)接收到这个FIN的对端执行被动关闭(passive close)。这个FIN由TCP确认。它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
(3)一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
(4)接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
既然每个方向都需要一个FIN和一个ACK,因此通常需要四个分节。我们使用限定词“通常”是因为:某些情况下步骤1的FIN随数据一起发送;另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。


TCP终止连接(TCP四次挥手)_第1张图片
TCP连接关闭时的分组交换.png

类似SYN,一个FIN也占据一个字节的序列号空间。因此,每个FIN的ACK确认号就是这个FIN的序列号加1.
在步骤2于步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的。这称为半关闭(half-close)
当套接字被关闭时,其所在端TCP各自发送了一个FIN。我们在图中指出,这是由应用进程调用close而发生的,不过需认识到,当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接也发生一个FIN。
上图展示了客户执行主动关闭的情形,不过我们指出,无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是客户执行主动关闭,但是某些协议(譬如值得注意的HTTP/1.0)却由服务器执行主动关闭。

你可能感兴趣的:(TCP终止连接(TCP四次挥手))