TCP(Transmission Control Protocol,传输控制协议)

TCP(Transmission Control Protocol,传输控制协议)

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛用于互联网中的数据传输。它是 TCP/IP 模型中的核心协议之一,与 IP(Internet Protocol,互联网协议)协同工作,负责在多个网络设备之间传输数据。

TCP 协议的主要特点和功能包括:

  1. 面向连接:

    在数据传输开始之前,TCP 需要在两端建立一个连接,通常通过三次握手(three-way handshake)过程完成。

  2. 可靠性传输:

    TCP 提供可靠的数据传输服务,确保数据无差错、不丢失、不重复,并且按序到达。它通过序列号、确认应答(ACKs)、超时重传等机制实现这一点。

  3. 流量控制:

    TCP 使用滑动窗口协议来进行流量控制,防止快速发送方淹没慢速接收方。

  4. 拥塞控制:

    TCP 实现拥塞控制算法,如慢启动(Slow Start)、拥塞避免(Congestion Avoidance)、快速重传(Fast Retransmit)和快速恢复(Fast Recovery),以避免网络拥塞。

  5. 全双工通信:

    TCP 提供全双工服务,意味着数据可以在两个方向上同时传输,双方都可以是发送者和接收者。

  6. 顺序控制和数据重组:

    TCP 在数据包传输中使用序列号对数据包进行排序,确保接收端可以根据这些序列号将数据重新组合成原始的数据流。

  7. 错误检测:

    TCP 头部包含校验和(checksum)字段,用于检测数据在传输过程中的任何错误。

  8. 连接管理:

    TCP 协议管理和维护连接的生命周期,包括连接的建立、数据传输和连接的终止(通常通过四次挥手(four-way handshake)过程实现)。

在 TCP/IP 协议栈中,TCP 位于传输层,正上方是应用层,应用层协议如 HTTP、FTP 等使用 TCP 来保证数据传输的可靠性;正下方是网络层,网络层协议如 IP 负责将数据包路由到正确的目的地。TCP 处理的是端到端的通信,确保数据能够在应用程序之间准确无误地传输。

由于 TCP 提供的可靠性和面向连接的特性,它广泛用于需要保证数据完整性和正确顺序的应用场景,如网页浏览、文件传输、电子邮件发送等。

下面我们再看下完整的 TCP 连接过程,通过这个过程你可以明白 TCP 是如何保证重传机制和数据包的排序功能的。

从下图可以看出,一个完整的 TCP 连接的生命周期包括了 “建立连接”“传输数据” 和 “断开连接” 三个阶段。

一个TCP连接的生命周期

TCP 三次握手

TCP 三次握手(Three-way Handshake)是建立 TCP/IP 网络连接的标准过程,其目的是在两个网络主机之间创建一个可靠的连接。这个过程确保了双方都准备好接收和发送数据,并且同步了双方的初始序列号,用于数据包的正确排序和可靠传输。下面是 TCP 三次握手的详细步骤:

第一次握手:SYN

客户端发送 SYN 包:

客户端选择一个初始序列号(ISN)并向服务器发送一个 SYN(同步)包。这个 SYN 包包含客户端的初始序列号,并且 SYN 标志位被设置为 1,其他标志位(如 ACK)被设置为 0。

第二次握手:SYN-ACK

服务器回应 SYN-ACK 包:

服务器接收到 SYN 包后,发送一个 SYN-ACK(同步 - 确认)包作为回应。该包含有服务器自己的初始序列号,同时将客户端的初始序列号加 1,并在 ACK 字段中回传此值,以确认接收到客户端的 SYN。此时,SYN 和 ACK 标志位都被设置为 1。

第三次握手:ACK

客户端发送 ACK 包:

客户端收到 SYN-ACK 包后,将服务器的序列号加 1,并将这个值放在 ACK 包的确认字段中,发送给服务器。这个 ACK 包的 ACK 标志位设置为 1,表示确认。

握手完成

连接建立:

服务器接收到客户端的 ACK 包后,三次握手完成,客户端和服务器之间建立了一个双向的可靠连接。之后,数据可以在双方之间开始传输。

这个过程的关键在于两次增量序列号的交换,这保证了双方都能确认对方已准备好进行通信,并且正确地维护了 TCP 的状态信息。三次握手可以防止历史连接的初始化数据段突然出现在当前连接中,从而导致不可预料的问题。

简化的表示如下:

1
2
3
4
客户端                     服务器
|-----SYN(X)------------>|
|<----SYN(Y), ACK(X+1)---|
|-----ACK(Y+1)---------->|

其中,X 和 Y 分别是客户端和服务器选择的初始序列号。

值得注意的是,TCP 三次握手仅仅是建立连接的一部分,数据传输会在三次握手之后开始,而在数据传输结束后,TCP 用另一个独立的四次挥手(Four-way Handshake)过程来关闭连接。

TCP 四次挥手

TCP(传输控制协议)四次挥手是用于终止一个已经建立的 TCP 连接的过程。这个过程确保了双方都能够完成数据传输并且正确关闭连接。以下是 TCP 四次挥手的详细步骤:

第一次挥手:FIN_WAIT_1

  • 假设客户端决定关闭连接,它发送一个 FIN(结束)标志的 TCP 段给服务器,表示客户端已经没有数据要发送了。
  • 客户端进入 FIN_WAIT_1 状态,等待服务器的确认。

第二次挥手:CLOSE_WAIT

  • 服务器收到这个 FIN 段后,发送一个 ACK(确认)标志的 TCP 段作为回应,确认已经收到客户端的终止请求。
  • 服务器进入 CLOSE_WAIT 状态,此时客户端收到 ACK 后进入 FIN_WAIT_2 状态。
  • 此时,客户端到服务器的连接已经关闭,但是服务器如果还有数据要发送,可以继续发送。

第三次挥手:LAST_ACK

  • 当服务器完成数据发送后,它也会决定关闭连接,发送一个 FIN 标志的 TCP 段给客户端。
  • 服务器进入 LAST_ACK 状态,等待客户端的确认。

第四次挥手:TIME_WAIT

  • 客户端收到服务器的 FIN 段后,发送一个 ACK 标志的 TCP 段作为回应,确认已经收到服务器的终止请求。
  • 客户端进入 TIME_WAIT 状态,持续 2 个最大段生命周期(MSL)的时间后,确保服务器能够接收到确认,然后关闭连接。
  • 服务器收到 ACK 后,关闭连接,进入 CLOSED 状态。

这个过程确保了双方都有机会完成数据传输并清理连接。如果在四次挥手过程中的任何一步发生网络延迟或丢包,TCP 协议会重试发送丢失的段,直到成功完成四次挥手过程。这个过程是 TCP 提供可靠传输服务的关键机制之一。

简化的表示如下:

1
2
3
4
5
 客户端                       服务器
FIN_WAIT_1 |-----FIN---->|
FIN_WAIT_2 |<----ACK-----| CLOSE_WAIT
|<----FIN-----| LAST_ACK
TIME_WAIT |-----ACK---->| CLOSED