TCP 可靠传输
hard计算机网络TCP滑动窗口流量控制拥塞控制
TCP 如何保证可靠传输
TCP 通过以下机制保证数据可靠、有序、不重复地到达:
- 序号与确认:每个字节编号,接收方确认收到的序号
- 超时重传:一定时间内未收到确认就重传
- 滑动窗口:控制发送速率
- 校验和:检测数据是否损坏
序号与确认机制
发送方 接收方
│ seq=1, 数据="Hello"(5字节) │
│ ────────────────────────────────────▶│
│ │
│ ack=6 │
│ ◀────────────────────────────────────│
│ "我已收到前 5 字节,请发第 6 字节" │
│ │
│ seq=6, 数据="World"(5字节) │
│ ────────────────────────────────────▶│
│ ack=11 │
│ ◀────────────────────────────────────│
累计确认:ack=N 表示 "N 之前的所有数据都已收到"。
超时重传
发送数据后启动计时器,超时未收到 ACK 就重传:
发送方 接收方
│ seq=1 ──────────────────▶│
│ 定时器启动 │
│ × ACK 丢失
│ 超时!重传 seq=1 ────────▶│
│ ack=6 │
│ ◀──────────────────────── │
RTO(Retransmission Timeout) 的计算基于 RTT(Round-Trip Time)的动态采样,使用指数退避策略:第一次超时等 T,第二次等 2T,第三次等 4T…
滑动窗口
滑动窗口是 TCP 流量控制和可靠传输的核心机制。发送方维护一个窗口,只有窗口内的数据才能发送:
发送方的发送窗口:
已确认 已发送未确认 可以发送 不能发送
├────────┤├──────────────┤├──────────┤├──────────┤
│1 2 3 4 ││5 6 7 8 9 ││10 11 12 ││13 14 ... │
├────────┤├──────────────┤├──────────┤├──────────┤
└──── 发送窗口 ────┘
窗口大小 = min(rwnd, cwnd)
收到 ack=6 后窗口右移:
已确认 已发送未确认 可以发送
├──────────────┤├──────────────┤├──────────┤
│1 2 3 4 5 ││6 7 8 9 ││10 11 12 13│
├──────────────┤├──────────────┤├──────────┤
└──── 发送窗口 ────┘
流量控制
流量控制确保发送方不会淹没接收方。接收方通过 TCP 头部的 Window 字段告知发送方自己的接收缓冲区还有多少空间(rwnd):
发送方 接收方
│ 发送 3KB 数据 │
│ ────────────────────────────────────▶│ 缓冲区剩余 5KB
│ ack, rwnd=2KB │ 缓冲区剩余 2KB
│ ◀────────────────────────────────────│
│ 最多只能再发 2KB │
│ │
│ ack, rwnd=0 │ 缓冲区满了
│ ◀────────────────────────────────────│
│ 停止发送! │ 应用层读取数据...
│ │
│ 窗口更新, rwnd=4KB │ 缓冲区空出 4KB
│ ◀────────────────────────────────────│
│ 继续发送 │
拥塞控制
流量控制关注接收方的处理能力,拥塞控制关注网络的承载能力。发送方维护一个拥塞窗口(cwnd),实际发送窗口 = min(rwnd, cwnd)。
四个阶段
cwnd
▲
│ ╱ 拥塞避免(线性增长)
│ ╱
│ ╱ × ← 发生超时/丢包
│ ╱ │
│ ╱ │ ssthresh = cwnd/2
│ ╱ │ cwnd = 1(超时)或 cwnd/2(快恢复)
│ ╱ │
│╱ 慢开始 │ ╱ 快恢复后拥塞避免
│(指数增长) │╱
└──────────────────────────────▶ 时间
| 阶段 | 触发条件 | 行为 |
|---|---|---|
| 慢开始 | 连接初始 / 超时后 | cwnd 从 1 开始,每 RTT 翻倍(指数增长) |
| 拥塞避免 | cwnd ≥ ssthresh | cwnd 每 RTT +1(线性增长) |
| 快重传 | 收到 3 个重复 ACK | 立即重传丢失的段(不等超时) |
| 快恢复 | 快重传后 | ssthresh = cwnd/2,cwnd = ssthresh,直接进入拥塞避免 |
慢开始为什么其实不慢?
"慢"是相对于一开始就占满带宽而言。但指数增长其实非常快:
- RTT1: cwnd=1 → RTT2: cwnd=2 → RTT3: cwnd=4 → RTT4: cwnd=8 → ...
- 10 个 RTT 就能达到 cwnd=1024
生产高频题
TCP 如何保证可靠传输?
通过序号确认(确保数据有序)、超时重传(确保数据到达)、滑动窗口(流量控制)、校验和(数据完整性)和拥塞控制(防止网络过载)五大机制。
流量控制和拥塞控制的区别?
流量控制是端到端的,防止发送方发太快导致接收方缓冲区溢出,通过 rwnd 控制。拥塞控制是全局的,防止发送方发太快导致网络拥塞,通过 cwnd 控制。实际发送窗口 = min(rwnd, cwnd)。