CS 168 · DISCUSSION 06 · GUIDED REASONING WORKBOOK

TCP 序号、确认与可靠传输

TCP 不是 packet 编号练习。每一行都把 segment 还原成 byte interval,再用累计 ACK 表示 receiver 已连续拥有的前缀。

现在轮到你推

无需离开 CourseStack:先预测,再在表格、时间线或状态空间里完成推导;卡住时逐层打开提示,最后才展开解释与变式。

已阅读 Spring 2026 worksheet 与 official solution;以下是原创等价练习。官方 IDs 用于 coverage,对精确原题请回到页末 PDF。

忘记机制?回到 L11 TCP Reliability →

对应官方 1.1、1.2

1 · 滑动窗口遇到两个 loss

Why the official problem exists:同时检查 byte interval、window budget、乱序 ACK、timeout 与“sender 最后如何知道完成”。

发送 1000B,MSS=100B,window=300B,ISS=99,所以首段 SEQ=100,len=100 覆盖 [100,200)。首次 D200 与 D700 丢失;无 fast retransmit。

先预测:D200 丢失、D300 到达后 receiver 回什么?

Work It Out

eventSND.UNASND.NXTin flightRCV.NXT / ACK
发 D100,D200,D300100400300B100
D100 到、D200 lost、D300 到____400________
timeout 重传 D200____400____ACK____
发送窗口继续________≤300B____

再按 RTO=3s、RTT=10ms 标出两个 timeout 和五个 RTT phase,总时长。

Hint 1 · Concept

先把每段写成 [start,end)。

Hint 2 · State / Invariant

ACK=n 表示 n 之前连续 bytes 都已收到。

Hint 3 · First Step

D200 补齐后,buffered D300 可一起使 ACK 跳到 400。

Reveal · 展开完整推导

D100 使 ACK=200;D300 乱序仍 ACK=200。timeout 后重传 [200,300),receiver 连续拥有到 400,ACK400,sender window 右移并发 D400–D600。第二个洞 D700 同理。官方时序假设下总计 2×RTO+5×RTT=6.05s;同批 packets 可近同时发,不能多算三个串行 RTT。

Why This Works

窗口约束的是 SND.NXT-SND.UNA,累计 ACK 一次推进整个连续前缀。

Variation

启用 fast retransmit:D200 后收到三个 ACK200 时,哪一时刻可避免 3s timeout?

对应官方 2.1、2.2

2 · MTU → MSS → byte ACK

Why the official problem exists:检查 header overhead 与 SYN 占序号是否能贯穿到第一、最后 ACK。

MTU=1260B,IPv4 header=20B,TCP header=20B;ISS=19;initial window=10 MSS。

先预测:MSS 是多少?

Work It Out

求 handshake ACK;首个 data segment 的 interval 与 ACK;十个 MSS 全部连续到达后的 ACK。

Hint 1 · Concept

SYN 消耗一个 sequence number。

Hint 2 · State / Invariant

first data byte seq=ISS+1。

Hint 3 · First Step

ACK=first seq + confirmed payload bytes。

Reveal · 展开完整推导

MSS=1220B。SYN 的 ACK=20;首段 [20,1240) 后 ACK1240;10×1220B 连续前缀结束于 12220,所以最后 ACK12220。

Why This Works

TCP ACK 指向 next expected byte,而不是“最后一个 packet number”。

Variation

TCP options 使 header=32B,IPv6 header=40B;重算 MSS 与第四段后的 ACK。

对应官方 2.3、2.4、2.5

3 · 按正确顺序更新 RTO,再判断 window 是否够大

Why the official problem exists:把估计器状态与 bandwidth-delay product 串起来。

旧 SRTT=70ms、RTTVAR=50ms,新 sample R=10ms,α=β=0.5,K=4;window=12200B。

先预测:应先更新哪个量?

Work It Out

statebeforeruleafter
RTTVAR50.5×50+.5×|70-10|____
SRTT70.5×70+.5×10____
RTOSRTT+4×RTTVAR____

再算 12200B/40ms;若 bottleneck=76.25MB/s,求 BDP window。

Hint 1 · Concept

同一次 sample 的三步有顺序。

Hint 2 · State / Invariant

window-limited rate≈window/RTT。

Hint 3 · First Step

BDP=bandwidth×RTT。

Reveal · 展开完整推导

RTTVAR=55ms,SRTT=40ms,RTO=260ms。window-limited rate=305KB/s。要填满 76.25MB/s、40ms path,window 至少约 3.05MB。

Why This Works

RTO 保护 loss recovery timing;BDP 决定需要多少未确认 bytes 才能不让 pipe 空。

Variation

RTT 翻倍而 bandwidth 不变:BDP、固定 window throughput 与合适 RTO 方向各如何变?

对应官方 3.1、3.2

4 · 少发 ACK 的协议:先找最小反例

Why the official problem exists:检查“最后一个 packet 到了”与“所有先前数据都到了”之间缺少什么证明。

方案 A 只 ACK 每个指数窗口最后一包;方案 B 每收到一对 packets 才 ACK 偶数索引。sender 看到目标 ACK 就推进。

先预测:方案 A 最小致命问题?

Work It Out

为 n=4 构造 delivery pattern,使 P4 到达但 P2 丢失;再为 odd n 构造 pair-ACK 永远无法确认最后一包的 trace。

Hint 1 · Concept

可靠性需要 sender 获得“完整前缀”证据。

Hint 2 · State / Invariant

cumulative ACK 只有在之前全部收到时才能前进。

Hint 3 · First Step

先试 n=3 或 n=4。

Reveal · 展开完整推导

A 中仅 P1、P2、P4 到达也可能让 sender 误判完成;把 checkpoint ACK 改成累计边界才修正。B 在奇数个 packets 时最后一包没有搭档,永不 ACK;可显式处理尾包。即便正确,大窗口任一丢失就整窗重传,带宽未必更省。

Why This Works

反例同时检查 safety(不能错报完成)和 liveness(完整数据最终能被确认)。

Variation

设计 selective ACK bitmap:它增加了什么 receiver/sender state,又减少了哪些不必要重传?

误区诊断:ACK200 不是“packet 200 到了”

它是一个边界:所有 sequence numbers 小于 200 的字节形成连续已收前缀。看到 ACK 时先在数轴涂区间,再更新 SND.UNA。

Closed-book reconstruction

ISS=500,MSS=80,window=240;第二段丢失、第三段乱序到达。闭卷画 sender/receiver timeline,填 UNA/NXT/RCV.NXT/retx/recv queue,再加入三个 duplicate ACK 的 fast retransmit。

一手资料