TCP 连接的建立与终止

1. 建立连接协议(三次握手)

TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。

  1. 请求端(通常称为客户)发送一个 SYN段 指明客户打算连接的服务器的端口,以及初始序号(ISN,在这个例子中为 J)。
  2. 服务器发回包含 服务器的初始序号(此处为 K) 的 SYN报文段作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个 SYN将占用一个序号。
  3. 客户必须将确认序号设置为服务器的 ISN加1以对服务器的 SYN报文段进行确认。
    在这里插入图片描述

2. 连接终止协议(四次握手)

建立一个连接需要三次握手,而终止一个连接要经过四次握手。这由 TCP的半关闭(half -close)造成的。既然一个 TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个 FIN来终止这个方向连接。当一端收到一个 FIN,它必须通知应用层另一端已经终止了那个方向的数据传送。

收到一个FIN只意味着在这一方向上没有数据流动。一个 TCP连接在收到一个 FIN后仍能发送数据

正常关闭过程如下所示:
在这里插入图片描述
当服务器收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1。和SYN一样,一个FIN将占用一个序号。同时 TCP服务器还向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的 TCP端发送一个FIN,客户必须发回一个确认,并将确认序号设置为收到序号加1。


3. TCP的半关闭

TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭

如果应用程序不调用 close 而调用shutdown,且第2个参数值为1,则 socket 的API支持半关闭。然而,大多数的应用程序通过调用 close 终止两个方向的连接。

半关闭示例:
在这里插入图片描述
当收到半关闭的一端(此处是服务器端)在完成它的数据传送后,将发送一个FIN关闭这个方向的连接,这将传送一个文件结束符给发起这个半关闭的应用进程。当对第二个 FIN进行确认后,这个连接便彻底关闭了。


4. TCP状态变迁

在这里插入图片描述

  • ESTABLISHED 状态是连接双方能够进行双向数据传递的状态。

  • TIME_WAIT状态也称为 2MSL等待状态。每个具体 TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。我们知道这个时间是有限的,因为 TC P报文段以IP数据报在网络内传输,而 IP数据报则有限制其生存时间的TTL字段。

    对一个具体实现所给定的 MSL值,处理的原则是:当 TCP执行一个主动关闭,并发回最后一个 ACK,该连接必须在 TIME_WAIT状态停留的时间为 2倍的MSL。这样可让 TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的 FIN)

    这种2MSL等待的另一个结果是这个 TCP连接在 2MSL等待期间,定义这个连接的 socket(客户的IP地址和端口号,服务器的 IP地址和端口号)不能再被使用。这个连接只能在 2MSL结束后才能再被使用。这暗示如果我们终止一个客户程序,并立即重新启动这个客户程序,则这个新客户程序将不能重用相同的本地端口(服务器程序也是如此)。

    在连接处于 2MSL等待时,任何迟到的报文段将被丢弃。因为处于 2 M L等待的、由该插口对(socket pair)定义的连接在这段时间内不能被再用。

  • FI N_WAIT_2 状态我们已经发出了 FIN,并且另一端也已对它进行确认。除非我们在实行半闭,否则将等待另一端的应用层意识到它已收到一个文件结束符说明,并向我们发一个 FIN 来关闭另一方向的连接。只有当另一端的进程完成这个关闭,我们这端才会从FI N_WAIT_2状态进入TIME_WAIT状态

参考:TCP/IP详解卷1:协议

猜你喜欢

转载自blog.csdn.net/fcku_88/article/details/88357661