Appearance
题目
主机甲和主机乙新建一个 TCP 连接,甲的拥塞控制初始阈值为 32 KB,甲向乙始终以 MSS = 1 KB 大小的段发送数据,并一直有数据发送;乙为该连接分配 16 KB 接收缓存,并对每个数据段进行确认,忽略段传输延迟。若乙收到的数据全部存入缓存,不被取走,则甲从连接建立成功时刻起,未发生超时的情况下,经过 4 个 RTT 后,甲的发送窗口是( )。
错因
B
只算了 cwnd(慢启动 1→2→4→8),忽略了 rwnd 因接收缓存填满而缩小。乙缓存只有 16 KB 且不取走,每收到 1 KB 缓存就少 1 KB。算到 4 RTT 时已收 1+2+4+8=15 KB,rwnd 仅剩 1 KB → 发送窗口 = min(cwnd=16, rwnd=1) = 1。错的根源:忘了发送窗口是 cwnd 与 rwnd 的较小值。
C
可能直接给 rwnd 初值 16 KB 或 cwnd 16 KB 当成发送窗口。但 4 RTT 时 rwnd 已严重缩小(剩 1 KB),cwnd=16 也被 rwnd 限制。错的根源:忽略缓存填满的累积效应。
D
直接给慢启动阈值 32 KB 或第 5 RTT 的 cwnd——但 4 RTT 时 cwnd 还没到 32(慢启动 1→2→4→8→16,第 4 RTT 末 cwnd=16),且接收窗口已紧紧限制。错的根源:把"阈值"当成"当前窗口",且忽略 rwnd 限制。
总解析
第一步:理清 TCP 发送窗口公式
- cwnd(拥塞窗口):发送方拥塞控制算出的本地限制
- rwnd(接收窗口):接收方在 ACK 中通告的剩余缓存
第二步:列每个 RTT 的状态变化
设 rwnd 初始 = 16 KB(接收缓存)。慢启动从 cwnd = 1 MSS = 1 KB 开始,每 RTT 翻倍。
| 时刻 | 本 RTT 内甲发送量 | 累计已发送 | 乙累计缓存 | rwnd(=16-累计) | 下个 RTT 的 cwnd |
|---|---|---|---|---|---|
| 0 RTT(连接建立) | — | 0 | 0 | 16 | 1 |
| 1 RTT 后 | 发 1 KB | 1 | 1 | 15 | 2 |
| 2 RTT 后 | 发 2 KB | 3 | 3 | 13 | 4 |
| 3 RTT 后 | 发 4 KB | 7 | 7 | 9 | 8 |
| 4 RTT 后 | 发 8 KB | 15 | 15 | 1 | 16 |
第三步:算 4 RTT 后的发送窗口
4 RTT 后甲的状态:
- cwnd(用于下一轮发送)= 16 KB(慢启动翻倍后)
- rwnd(来自乙的 ACK)= 16 − 15 = 1 KB
发送窗口 = KB。
第四步:核对
| 选项 | 值 | 错处 |
|---|---|---|
| A | 1 KB | 正确(rwnd 限制) |
| B | 8 KB | 漏 rwnd 限制 |
| C | 16 KB | 漏 rwnd 缩小 |
| D | 32 KB | 把阈值当窗口 |
最终答案是 A(1 KB)。
编者注(生僻术语):TCP 的发送窗口同时受拥塞控制 cwnd(防止网络拥塞)和流量控制 rwnd(防止接收方缓存溢出)双重制约。本题刻意设置"乙不取走数据"——让 rwnd 持续缩小到几乎为零,这种现象叫糊涂窗口综合征(Silly Window Syndrome)。实际 TCP 实现会用"Nagle 算法"+"Clark 解决方案"避免发送方反复发小包,但题面已"简化"忽略这些优化。