CS 168 · LECTURE 13 · 2026-10-08 · 传输
流量控制保护接收端,拥塞控制保护网络;两者都限制发送,却依据完全不同的信号和瓶颈。
版本快照:Fall 2026 官方课表与在线教材,核对日期 2026-09-02;官网仍标注 under construction,日期与政策可能变化。
发送方看不见路由器队列,怎样只凭 ACK、丢包或时延推断全路径还能承受多少流量?
若所有发送方在丢包后立即更快重传,路由器队列会被无用副本占满,真正交付吞吐反而下降。拥塞控制必须让发送速率对网络反馈形成负反馈:容量紧张时减速,空闲时试探增加。
端到端方案从丢包、ECN 或 RTT 增长推断拥塞;路由器辅助方案可显式标记甚至给出速率。反馈越丰富,部署要求通常越高。
连接开始不知道路径容量,cwnd 从较小值起步,每收到一个新 ACK 增加,使每个 RTT 近似翻倍。它用指数增长快速搜索量级,而不是一开始就把任意大突发灌入网络。
达到 ssthresh 或发现拥塞后转入 congestion avoidance,增长变为每 RTT 约一个 MSS。初始窗口、ACK 聚合和 pacing 会影响真实突发形态。
Additive Increase 让并发流逐步增加,Multiplicative Decrease 在拥塞时按比例收缩。两条同 RTT、同算法流在理想模型下会趋向效率线与公平线交点。
“公平”依赖定义。RTT 更短的流每秒经历更多增长轮次,常获得更多带宽;多连接应用也能比单连接占更多份额。算法公平不自动等于用户公平。
超时意味着长时间没有可用反馈,发送方应强烈收缩并退避;三个重复 ACK 说明后续数据仍在到达,可快速重传缺口并保留部分在途估计。Fast recovery 避免完全回到初始状态。
所有窗口更新都要基于新确认数据,重复 ACK 本身不能无限增加发送权限,否则接收路径上的重复反馈会被放大成流量。
给定 cwnd=2 MSS、ssthresh=8 MSS,画出无丢包四轮后再发生一次超时的 cwnd/状态变化,并说明哪些数值依具体实现而变。
检查:TCP 实际允许的未确认数据通常受什么限制?
ACK/loss event 改变 cwnd:slow start 近似按 ACK 增长,loss 触发窗口收缩
ACK/loss event 改变 cwnd:slow start 近似按 ACK 增长,loss 触发窗口收缩;rwnd 仍独立约束 receiver。
检查:判断一个实现分支是否必要,最有力的问题是什么?
给出 cwnd=4 MSS 的一轮 ACK 与一次 loss 后状态。
答案必须出现 packet/message、local state/table、触发 event、after state 与 output;只给定义不算完成。
瓶颈容量 12 packets/RTT,初始 cwnd_A=2、cwnd_B=6。教学模型:无拥塞各加 1,出现拥塞各减半。
| RTT | A | B | 总负载 | 反馈 |
|---|---|---|---|---|
| 0 | 2 | 6 | 8 | 无拥塞→(3,7) |
| 1 | 3 | 7 | 10 | 无拥塞→(4,8) |
| 2 | 4 | 8 | 12 | 继续探测→(5,9) |
| 3 | 5 | 9 | 14 | loss/ECN→约(2.5,4.5) |
加性增长保持差距并逼近效率边界;乘性减小同时缩小差距,因此多轮后趋向公平。sender 保存的是局部控制状态,而不是网络真实容量。
瓶颈已满时,丢包触发重传;重传又占容量并排挤新数据,导致更多超时。可靠性只回答“丢了怎样补”,不知道丢失来自过载;没有速率负反馈可进入 congestion collapse。
min(rwnd,cwnd) 约束。| 场景 | 机制 | 状态/信号 | 不能替代的原因 |
|---|---|---|---|
| packet lost | Reliability | seq、ACK、retx、timer | 降速不能补字节 |
| receiver slow | Flow control | advertised window | 网络空闲也可淹没接收端 |
| network overloaded | Congestion control | cwnd、loss/ECN、RTT | rwnd 不描述瓶颈 |
检查:接收端快但瓶颈持续丢包,应优先?
检查:为何 decrease 是乘性?
检查:duplicate ACK 能证明 receiver 太慢吗?
正文是 CourseStack 的中文解释与重新绘制的教学例子;官方页面负责课程原始定义,历史仓库只提供你的实现证据。