TCP 协议概述
TCP
(Transmission Control Protocol
)是传输层协议之一,提供可靠的、面向连接的数据传输服务。TCP
协议确保了从发送方到接收方的数据传输是可靠的,且能够在网络中发生丢失、乱序或错误时,自动进行重传和排序,以确保接收方收到的数据是完整和准确的。
TCP
是基于 IP 协议(Internet Protocol
)之上的,因此 TCP/IP
协议族中的其他协议(如 HTTP、FTP、SMTP
等)大多数都是在 TCP
协议之上进行通信的。
TCP 协议的核心特点
-
可靠性:
- 错误校验:每个数据包都有校验和,用于验证数据的完整性。
-
确认机制:接收方在收到数据后会发送确认(
ACK
)信息。如果发送方没有收到确认,就会重新发送数据。 - 重传机制:如果数据包在传输过程中丢失,发送方会重新发送数据包,直到收到确认。
-
面向连接:
- 在传输数据之前,
TCP
会先进行连接的建立,保证双方能够相互通信。连接的建立是通过“三次握手”(Three-Way Handshake
)实现的。 - 在通信结束时,
TCP
会执行四次挥手(Four-Way Handshake
)来关闭连接,确保双方都不再发送数据。
- 在传输数据之前,
-
流量控制:
-
TCP
会根据接收方的接收能力来调节发送方的数据发送速率,避免接收方因处理不过来而丢失数据。
-
-
拥塞控制:
-
TCP
会根据网络的当前状况(如网络拥塞)来调整发送数据的速度,避免过多的数据造成网络过载。
-
-
数据有序:
-
TCP
会对数据包进行编号并确保它们按顺序到达接收方。即使数据包在网络中乱序,TCP
也会将它们重新排序。
-
TCP 连接的建立:三次握手(Three-Way Handshake)
建立一个 TCP
连接时,需要经过三次握手的过程:
-
客户端发送 SYN:
- 客户端向服务器发送一个 SYN(同步)报文,表示客户端希望建立连接。此时客户端处于
SYN_SENT
状态。
- 客户端向服务器发送一个 SYN(同步)报文,表示客户端希望建立连接。此时客户端处于
-
服务器响应 SYN-ACK:
- 服务器收到客户端的
SYN
后,回应一个 SYN-ACK(同步-确认)报文,表示同意建立连接。此时,服务器处于SYN_RECEIVED
状态。
- 服务器收到客户端的
-
客户端确认 ACK:
- 客户端收到服务器的
SYN-ACK
后,向服务器发送一个 ACK(确认)报文,表示客户端已准备好进行数据传输。此时,客户端进入ESTABLISHED
(已建立)状态,连接建立成功。
- 客户端收到服务器的
通过这三次握手,客户端和服务器双方确认了对方的接收和发送能力,确保连接的可靠性。
TCP 连接的关闭:四次挥手(Four-Way Handshake)
TCP
连接的关闭过程是四次挥手:
-
主动关闭方发送 FIN:
- 一方(例如客户端)通过发送一个 FIN(结束)报文,表示它已经没有数据要发送了,并希望关闭连接。此时,客户端进入
FIN_WAIT_1
状态。
- 一方(例如客户端)通过发送一个 FIN(结束)报文,表示它已经没有数据要发送了,并希望关闭连接。此时,客户端进入
-
对方确认 ACK:
- 服务器收到
FIN
后,发送一个 ACK(确认)报文,表示已收到客户端的关闭请求。此时,服务器处于CLOSE_WAIT
状态,客户端进入FIN_WAIT_2
状态。
- 服务器收到
-
服务器发送 FIN:
- 服务器准备好关闭连接后,发送一个 FIN(结束)报文,表示它也没有数据要发送了,准备关闭连接。
-
客户端确认 ACK:
- 客户端收到服务器的
FIN
后,发送一个 ACK(确认)报文,确认连接关闭。此时,客户端进入TIME_WAIT
状态,等待足够时间确保服务器收到最后的ACK
报文后,连接完全关闭。
- 客户端收到服务器的
完成四次挥手后,连接关闭。
TCP 数据传输流程
在 TCP
连接建立并处于 ESTABLISHED
状态时,双方可以开始进行数据传输。数据传输过程中,TCP
会做以下几件事情:
-
数据分段:
-
TCP
会将要发送的数据拆分为大小合适的数据段(称为 segment)。每个数据段都会包含一个头部,其中包括序列号、确认号、数据校验和等信息。
-
-
流量控制:
- 在数据传输过程中,接收方会告知发送方它的接收窗口大小,发送方根据接收窗口的大小来控制发送数据的量,防止接收方缓冲区溢出。
-
确认和重传:
- 发送方每发送一个数据段后,接收方会发送一个确认报文(
ACK
),确认已收到的数据段。如果发送方没有收到确认报文,或者确认报文的序列号不正确,它将重新发送该数据段。
- 发送方每发送一个数据段后,接收方会发送一个确认报文(
-
顺序传输:
- 如果数据在网络中发生了乱序,接收方会根据
TCP
数据包中的序列号重新排序数据,保证应用层收到的是有序的数据。
- 如果数据在网络中发生了乱序,接收方会根据
TCP 滚动窗口与流量控制
滑动窗口(Sliding Window):在
TCP
中,滑动窗口是一个动态变化的机制,表示可以发送多少字节的数据而不需要等待对方的确认。它允许发送方在没有收到确认的情况下发送多个数据包,从而提高效率。接收方的流量控制:接收方通过 窗口大小 告知发送方它能够接受的最大数据量,发送方只能发送接收方指定窗口大小的数据量。
拥塞控制
TCP
的拥塞控制算法通过监控网络的状况(如网络延迟和丢包情况)来动态调整数据发送速率,避免过多的数据涌入导致网络拥塞。常见的拥塞控制算法有 慢启动(Slow Start)、拥塞避免(Congestion Avoidance)、快速重传(Fast Retransmit) 和 快速恢复(Fast Recovery) 等。
在 TCP
协议中,以下是常见控制位的全称:
SYN(
Synchronize
):同步控制位,用于建立连接时的同步阶段。客户端向服务器发送SYN
报文时,表示希望与服务器建立连接。ACK(
Acknowledge
):确认控制位,用于确认收到的数据包。当接收到的数据包是有效的时,接收方会发送一个ACK
报文,表示确认收到数据。FIN(
Finish
):结束控制位,用于连接关闭阶段。当一方没有数据要发送时,会发送FIN
报文,表示关闭连接,准备终止通信。
这些标志位在 TCP
协议的报文头部中用于表示连接的状态和控制信号。
总结
- TCP 是一个可靠的、面向连接的协议,在数据传输时通过三次握手建立连接,四次挥手关闭连接。
-
流量控制、拥塞控制和数据顺序保证 是
TCP
的三大核心特性,确保数据在复杂网络环境下可靠传输。