美文网首页
TCP终止连接(TCP四次挥手)

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

作者: 吴业鹏 | 来源:发表于2018-04-25 00:05 被阅读0次

    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连接关闭时的分组交换.png

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

    相关文章

      网友评论

          本文标题:TCP终止连接(TCP四次挥手)

          本文链接:https://www.haomeiwen.com/subject/jsnslftx.html