TCP · 传输控制协议 · Transport Layer
网络协议核心系列 · Transport Layer

TCP

传输控制协议的可靠性之道

从三次握手到拥塞控制,探索互联网数据传输背后的精密设计

01
基础概念

什么是 TCP

一种面向连接的、可靠的、基于字节流的传输层协议(RFC 793)

面向连接

通信双方必须先通过三次握手建立连接,数据传输结束后再通过四次挥手释放连接。

可靠传输

通过序号确认、超时重传、校验和等机制,保证数据不丢失、不重复、按序到达。

面向字节流

应用层数据被视为无结构的连续字节流,TCP 按需分段封装,不保留消息边界。

全双工通信

连接建立后,通信双方可以同时发送与接收数据,两个方向互不干扰。

02
协议对比

TCP 与 UDP

可靠性与效率之间的权衡,两种截然不同的设计哲学

TCP

面向连接 · 可靠
  • 需要建立连接,数据有序可靠送达
  • 具备流量控制与拥塞控制机制
  • 首部开销较大(20–60 字节)
  • 适用于网页、文件传输、邮件等

UDP

无连接 · 高效
  • 无需建立连接,直接发送数据报
  • 不保证送达顺序,可能丢包
  • 首部开销小(仅 8 字节),速度快
  • 适用于直播、DNS、实时游戏等
03
报文结构

TCP 首部剖析

20 字节固定首部,承载着可靠传输所需的全部控制信息

源端口号16 bit
目的端口号16 bit
序号 Sequence Number32 bit
确认号 Acknowledgment Number32 bit
首部长度4 bit
保留6 bit
标志位 URG·ACK·PSH·RST·SYN·FIN6 bit
窗口大小 Window16 bit
校验和 Checksum16 bit
紧急指针 Urgent Pointer16 bit
选项 Options(可变,0–40 字节)+ 填充视情况而定
04
建立连接

三次握手 · Three-way Handshake

确保双方都具备收发能力,防止已失效的连接请求突然到达服务器

客户端 Client
CLOSED
① SYN=1, seq=x
② SYN=1, ACK=1, seq=y, ack=x+1
③ ACK=1, seq=x+1, ack=y+1
服务器 Server
LISTEN
💡 为什么是三次而非两次? 避免已失效的连接请求到达服务器后,白白建立无用连接、浪费资源。
05
数据传输

序号与滑动窗口

发送方在窗口范围内连续发送数据,无需等待每个包单独确认

1
2
3
4
5
6
7
8
9
10
已发送并确认
已发送未确认
窗口内可发送
窗口外暂不可发送
采用累积确认:ACK=n 表示前 n-1 字节均已正确接收,窗口随之向前滑动。
06
流量控制

让发送方恰到好处

接收方通过首部中的 rwnd 字段,动态告知自己还能接收多少数据

已交付应用层
已接收未处理
可用窗口 rwnd
暂不可用
可用窗口 = rwnd − 已发送未确认字节数;当 rwnd = 0 时,发送方停止发送并启动窗口探测
07
拥塞控制

感知网络,动态调节

发送方结合网络拥塞状况,自适应调整拥塞窗口 cwnd

RTT cwnd
1

慢启动 Slow Start

cwnd 从 1 个 MSS 开始,每收到一个 ACK 就翻倍,呈指数增长。

2

拥塞避免 Congestion Avoidance

达到 ssthresh 后转为线性增长,每个 RTT 增加 1 个 MSS。

3

快速重传 / 拥塞发生

收到 3 个重复 ACK 立即重传;出现丢包时 ssthresh 减半。

4

快速恢复 Fast Recovery

cwnd 直接降为 ssthresh 而非回到 1,避免流量剧烈波动。

08
释放连接

四次挥手 · Four-way Termination

全双工连接需双方分别确认,才能安全释放

客户端 Client
ESTABLISHED
① FIN=1, seq=u
② ACK=1, ack=u+1
③ FIN=1, ACK=1, seq=v
④ ACK=1, ack=v+1
服务器 Server
ESTABLISHED
💡 客户端为何要等待 2MSL 才进入 CLOSED? 确保最后的 ACK 能到达对方,并让本连接的旧报文在网络中消失。
The End

感谢观看

TCP 用精密的状态机与算法,在不可靠的网络之上,构建起一座可靠的通信基石

连接建立
可靠传输
流量控制
拥塞控制
连接释放
TCP / IP · Transport Layer Essentials
01 / 10
使用 ← → 方向键或点击箭头翻页 · 按 F 全屏