Published on

传输控制协议 (TCP):面向连接的可靠字节流

传输控制协议 (Transmission Control Protocol, TCP) 是 TCP/IP 协议栈中传输层的核心协议,它为运行在不同主机上的应用程序之间,提供了一种面向连接的、可靠的字节流 (byte stream) 服务。与 UDP “尽力而为”的传输模式不同,TCP 的设计目标是在不可靠的、底层 IP 网络之上,构建一个可靠的数据传输通道,以解决数据包丢失、损坏、重复和乱序等问题。几乎所有要求高可靠性的应用层协议(如 HTTP, FTP, SMTP)都构建于 TCP 之上,使其成为现代互联网的基石。

TCP 的核心特性

面向连接 (Connection-Oriented)

在进行任何数据传输之前,通信双方(客户端与服务器)必须首先通过一个被称为三次握手 (Three-Way Handshake) 的过程,建立一个逻辑上的连接。数据传输结束后,连接会通过一个四次挥手 (Four-Way Handshake) 的过程被优雅地关闭。

可靠传输 (Reliable Transport)

TCP 通过多种机制来保证数据的可靠性:

  • 序列号与确认: TCP 将每个字节的数据进行编号,接收方在收到数据后会发送一个确认(ACK),告知发送方已成功接收到哪个字节之前的所有数据。
  • 超时重传 (Timeout Retransmission): 发送方在发送数据段后会启动一个计时器。如果在计时器超时后仍未收到对方的确认,就会认为数据段已丢失,并重新发送。
TCP 可靠传输机制
  • 数据校验: TCP 段的头部包含一个校验和 (checksum),用于检测数据在传输过程中是否发生损坏。

字节流与顺序保证

TCP 会将应用程序交付的数据视为一个无结构的、连续的字节流。它通过序列号 (sequence number) 确保接收方应用层收到的数据,与发送方应用层发出的数据字节顺序完全一致,即使底层的 IP 数据包到达时是乱序的。

TCP 字节流与顺序保证

流量控制与拥塞控制

  • 流量控制 (Flow Control): 通过滑动窗口 (sliding window) 机制,接收方可以告知发送方其当前可用的缓冲区大小,防止快速的发送方淹没慢速的接收方。
  • 拥塞控制 (Congestion Control): TCP 会主动探测网络的拥塞状况,并动态调整其发送速率,以避免造成网络拥堵,保证整个网络的稳定性。

TCP 连接的生命周期

建立连接:三次握手

此过程用于在通信双方之间同步初始序列号并建立逻辑连接。

握手过程

  • SYN (Synchronize)ACK (Acknowledge) 是 TCP 段头部中的两个控制位。
TCP 控制位
  • 这个过程通常不携带应用层数据,其唯一目的是交换初始序列号并确认双方都已准备好通信。

数据传输:序列号与确认号

TCP 数据传输

连接建立后,数据开始双向传输。TCP 通过序列号和确认号的协同工作来保证数据的可靠和有序。

  • 序列号 (Sequence Number): 标记了当前 TCP 段中数据部分的第一个字节,在整个字节流中的位置。
  • 确认号 (Acknowledgement Number): 告知对方,我方已经成功接收到此确认号之前的所有字节,并期望接收的下一个字节的序列号就是此确认号。
丢包与重传机制

关闭连接:四次挥手

TCP 连接关闭

当一方数据发送完毕后,会发起关闭连接的请求。

机制: 使用 FIN (Finish) 控制位来表示数据已发送完毕。由于 TCP 是全双工的,每一方都必须独立地关闭自己的发送通道,因此需要四次交互。

TIME_WAIT 状态

在四次挥手的最后,主动关闭连接的一方会进入 TIME_WAIT 状态,并等待 2 * MSL (Maximum Segment Lifetime,报文最大生存时间) 的时长。这主要是为了确保网络中所有延迟的、旧的报文段都已消失,以及确保被动关闭方已成功收到最后的 ACK,从而保证连接的可靠关闭。