TCP
提供 面向连接 的,可靠 的数据传输服务
#status / growing
#type / concept
[!info] related notes
- 所属 MOC: computer-networking-moc
- 三次握手: tcp三次握手
- 四次挥手: tcp-four-way-handshake
- 可靠性: tcp-reliability
- 对比协议: udp
TCP
TCP(Transmission Control Protocol,传输控制协议):传输层协议,提供面向连接、可靠、字节流传输服务。通过序列号、确认应答、重传机制、流量控制和拥塞控制来保证数据完整有序地送达。
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 | |C|E|U|A|P|R|S|F| |
| Offset| Rsrvd |W|C|R|C|S|S|Y|I| Window |
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 字段 | 说明 |
|---|---|
| Sequence Number | 本报文段数据的第一个字节的序号 |
| Acknowledgment Number | 期望收到对方下一个报文段的第一个字节的序号 |
| SYN | 同步位,连接建立时置 1 |
| ACK | 确认位,置 1 时 Acknowledgment Number 有效 |
| FIN | 终止位,表示发送方数据发送完毕 |
| RST | 重置位,强制关闭连接 |
| Window | 接收窗口大小,用于流量控制 |
三次握手(建立连接)
客户端 服务器
| |
|--- SYN (seq=x) -----------> | ① 客户端发起连接
| |
|<-- SYN+ACK (seq=y, ack=x+1) | ② 服务器确认并同步
| |
|--- ACK (ack=y+1) ---------->| ③ 客户端确认
| |
=== 连接建立,双方进入 ESTABLISHED 状态 ===
为什么是三次而非两次? 防止已失效的连接请求到达服务器,导致资源浪费(两次握手无法确认客户端的接收能力)。
四次挥手(断开连接)
客户端 服务器
| |
|--- FIN (seq=u) ------------>| ① 客户端请求关闭
| |
|<-- ACK (ack=u+1) ---------- | ② 服务器确认(半关闭)
| | 客户端不再发送,但仍可接收
|<-- FIN (seq=w) ------------ | ③ 服务器也请求关闭
| |
|--- ACK (ack=w+1) ---------->| ④ 客户端确认
| |
=== 客户端进入 TIME_WAIT(2MSL)后完全关闭 ===
为什么是四次? TCP 是全双工的,每个方向需要单独关闭。服务器收到 FIN 后可能还有数据要发送,不能立即关闭。
流量控制 — 滑动窗口
接收方通过 TCP 报文头中的 Window 字段告知发送方:“我还能接收多少字节”。
发送方窗口:
|--- 已发送已确认 ---|--- 已发送未确认 ---|--- 可发送 ---|--- 不可发送 ---|
|<------- 发送窗口 ------->|
- 窗口大小动态调整:接收方处理能力变弱时缩小窗口,变强时扩大
- 窗口为 0 时发送方暂停发送,定期探测窗口是否恢复
拥塞控制
防止网络拥塞导致大量丢包,TCP 维护一个拥塞窗口(cwnd):
| 阶段 | 策略 | 说明 |
|---|---|---|
| 慢启动 | cwnd 指数增长(1→2→4→8…) | 从 1 MSS 开始,试探可用带宽 |
| 拥塞避免 | cwnd 线性增长(+1 MSS/RTT) | 达到阈值后减速增长 |
| 快重传 | 收到 3 个重复 ACK 立即重传 | 不等超时,快速恢复 |
| 快恢复 | cwnd 减半(而非归 1) | 配合快重传,避免重新慢启动 |
实际发送窗口 = min(接收窗口, 拥塞窗口)。
TCP vs UDP 对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠(确认+重传) | 不可靠(尽力而为) |
| 有序性 | 保证有序(序列号) | 不保证 |
| 流量控制 | 滑动窗口 | 无 |
| 拥塞控制 | 慢启动/AIMD | 无 |
| 头部大小 | 20~60 字节 | 8 字节 |
| 速度 | 较慢(控制开销大) | 较快 |
| 适用场景 | HTTP/FTP/邮件/文件传输 | DNS/视频流/游戏/VoIP |
边界与常见误解
- TCP 不是”绝对可靠”:它保证数据有序完整送达,但不保证延迟和吞吐量
- 三次握手不只是”确认双方能收发”:更重要的是同步初始序列号(ISN)
- TIME_WAIT 不是 bug:2MSL 等待是为了确保最后的 ACK 到达以及让旧报文在网络中消亡
- TCP 和 UDP 不是对立的:很多协议在 UDP 之上自己实现可靠性(如 QUIC)
相关笔记
- 计算机网络 MOC
- tcp三次握手 — 连接建立详细过程
- tcp-four-way-handshake — 连接断开详细过程
- tcp-reliability — TCP 可靠性机制
- udp — 对比协议
- ip — 网络层协议