TCP 协议详解与原理图解
一、TCP 报文结构详解
TCP 是面向连接、可靠传输的传输层协议。其报文结构定义如下:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------------------------------------------------------+
| Source Port | Destination Port |
+---------------------------------------------------------------+
| Sequence Number |
+---------------------------------------------------------------+
| Acknowledgment Number |
+---------------------------------------------------------------+
| Data | |U|A|P|R|S|F| |
|Offset| Rsrvd |R|C|S|S|Y|I| Window Size |
+---------------------------------------------------------------+
| Checksum | Urgent Pointer |
+---------------------------------------------------------------+
| (Optional TCP Options) |
+---------------------------------------------------------------+
字段说明:
字段名 | 含义 |
---|---|
Source Port / Destination Port | 源/目标端口号,用于标识通信的进程 |
Sequence Number | 序列号,表示当前报文段的第一个字节的序号 |
Acknowledgment Number | 确认号,期望收到对方下一个字节的编号 |
Data Offset | 数据偏移,指出 TCP 头部长度(单位为 32 位字) |
Flags(6 个控制位) | URG 、ACK 、PSH 、RST 、SYN 、FIN ,用于控制连接状态 |
Window Size | 窗口大小,接收方通告的剩余缓冲区容量 |
Checksum | 校验和,包含头部和数据的完整性验证 |
Urgent Pointer | 紧急指针,与 URG 控制位配合使用 |
Options | 可选字段,如窗口缩放、时间戳等,支持性能优化 |
二、TCP 三次握手详解(连接建立)
客户端 服务器
| |
| ----------- SYN seq=X -----------------------> | 第一次握手:请求连接
| |
| <-------- SYN+ACK seq=Y ack=X+1 ------------- | 第二次握手:响应请求
| |
| ----------- ACK ack=Y+1 ---------------------> | 第三次握手:确认连接
| |
握手过程说明:
- SYN:客户端向服务器发送连接请求,并初始化序列号(
seq=X
)。 - SYN+ACK:服务器响应请求,同步自身的序列号(
seq=Y
),并确认客户端序列号(ack=X+1
)。 - ACK:客户端再次确认服务器的响应(
ack=Y+1
),至此双方建立连接。
⚠️ 三次握手的目的是可靠确认双向通信能力和初始序列号同步,防止失效连接混入。
三、TCP 四次挥手详解(连接释放)
客户端 服务器
| |
| ----------- FIN seq=U -----------------------> | 第一次挥手:主动关闭
| |
| <----------- ACK ack=U+1 --------------------- | 第二次挥手:被动确认
| |
| <----------- FIN seq=V ---------------------- | 第三次挥手:被动关闭
| |
| ----------- ACK ack=V+1 ---------------------> | 第四次挥手:确认关闭
| |
挥手过程说明:
- 客户端发送 FIN:表示没有数据可发,但仍可接收。
- 服务器发送 ACK:确认接收到关闭请求。
- 服务器完成剩余数据发送后,发送 FIN:准备关闭。
- 客户端发送 ACK:完成连接关闭。
🔁 四次挥手保证了双向关闭的可靠性,服务端关闭操作可能延迟,以确保数据完整传输。
四、TCP 状态迁移图解析
TCP 的连接建立与断开并不是简单的三次握手或四次挥手,其内部状态迁移涉及多个状态节点。
+---------+
| CLOSED |
+----+----+
|
Active OPEN | Passive OPEN
V
+---------+ +---------+
| SYN_SENT | <--| LISTEN |
+----+----+ +----+----+
| |
| |
V V
+---------+ +---------+
|SYN_RCVD | --> |ESTABLISHED|
+----+----+ +----+----+
| |
V V
+---------+ +----------+
|FIN_WAIT_1| <--| CLOSE_WAIT|
+----+----+ +----+-----+
| |
V V
+----------+ +----------+
| FIN_WAIT_2| | LAST_ACK |
+----------- +----------+
|
V
+-----------+
| TIME_WAIT |
+-----------+
|
V
+---------+
| CLOSED |
+---------+
🧠 状态说明:
- SYN_SENT/SYN_RCVD:连接建立中
- ESTABLISHED:连接建立成功
- FIN_WAIT_1/2:主动关闭方等待对方关闭
- CLOSE_WAIT/LAST_ACK:被动关闭方等待确认
- TIME_WAIT:连接已关闭,等待 2MSL 确保对方收到 ACK
- CLOSED:连接完全关闭
五、TCP 拥塞控制机制
TCP 设计了一套复杂的拥塞控制机制,以保证网络传输的效率与稳定性。主要包括以下四个阶段:
拥塞控制四阶段
窗口大小
|
| /~~~~~ 拥塞避免阶段(线性增长)
| /
| /
| / <--- 慢开始阶段(指数增长)
|/
+---------------------------> 时间
阈值 丢包
各阶段说明:
阶段 | 特点 |
---|---|
慢开始 | 初始窗口值小,每收到 ACK 指数增加 |
拥塞避免 | 超过阈值后,每 RTT 窗口线性增长 |
快速重传 | 连续收到 3 个重复 ACK,立即重传 |
快速恢复 | 重传后进入拥塞避免,避免窗口归零 |
📌 拥塞窗口(cwnd)和接收窗口(rwnd)共同决定 TCP 的实际发送速率。
总结
TCP 协议作为互联网的核心协议之一,凭借其可靠的连接机制与完善的拥塞控制,成为高质量网络传输的基础。掌握 TCP 的握手/挥手流程、报文结构、状态迁移及拥塞控制,对于理解操作系统、网络编程、安全通信等领域均具有极大意义。