CS 168 · DISCUSSION 06 · GUIDED REASONING WORKBOOK
TCP 不是 packet 编号练习。每一行都把 segment 还原成 byte interval,再用累计 ACK 表示 receiver 已连续拥有的前缀。
无需离开 CourseStack:先预测,再在表格、时间线或状态空间里完成推导;卡住时逐层打开提示,最后才展开解释与变式。
已阅读 Spring 2026 worksheet 与 official solution;以下是原创等价练习。官方 IDs 用于 coverage,对精确原题请回到页末 PDF。
对应官方 1.1、1.2
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 回什么?
| event | SND.UNA | SND.NXT | in flight | RCV.NXT / ACK |
|---|---|---|---|---|
| 发 D100,D200,D300 | 100 | 400 | 300B | 100 |
| D100 到、D200 lost、D300 到 | ____ | 400 | ____ | ____ |
| timeout 重传 D200 | ____ | 400 | ____ | ACK____ |
| 发送窗口继续 | ____ | ____ | ≤300B | ____ |
再按 RTO=3s、RTT=10ms 标出两个 timeout 和五个 RTT phase,总时长。
先把每段写成 [start,end)。
ACK=n 表示 n 之前连续 bytes 都已收到。
D200 补齐后,buffered D300 可一起使 ACK 跳到 400。
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。
窗口约束的是 SND.NXT-SND.UNA,累计 ACK 一次推进整个连续前缀。
启用 fast retransmit:D200 后收到三个 ACK200 时,哪一时刻可避免 3s timeout?
对应官方 2.1、2.2
Why the official problem exists:检查 header overhead 与 SYN 占序号是否能贯穿到第一、最后 ACK。
MTU=1260B,IPv4 header=20B,TCP header=20B;ISS=19;initial window=10 MSS。
先预测:MSS 是多少?
求 handshake ACK;首个 data segment 的 interval 与 ACK;十个 MSS 全部连续到达后的 ACK。
SYN 消耗一个 sequence number。
first data byte seq=ISS+1。
ACK=first seq + confirmed payload bytes。
MSS=1220B。SYN 的 ACK=20;首段 [20,1240) 后 ACK1240;10×1220B 连续前缀结束于 12220,所以最后 ACK12220。
TCP ACK 指向 next expected byte,而不是“最后一个 packet number”。
TCP options 使 header=32B,IPv6 header=40B;重算 MSS 与第四段后的 ACK。
对应官方 2.3、2.4、2.5
Why the official problem exists:把估计器状态与 bandwidth-delay product 串起来。
旧 SRTT=70ms、RTTVAR=50ms,新 sample R=10ms,α=β=0.5,K=4;window=12200B。
先预测:应先更新哪个量?
| state | before | rule | after |
|---|---|---|---|
| RTTVAR | 50 | .5×50+.5×|70-10| | ____ |
| SRTT | 70 | .5×70+.5×10 | ____ |
| RTO | — | SRTT+4×RTTVAR | ____ |
再算 12200B/40ms;若 bottleneck=76.25MB/s,求 BDP window。
同一次 sample 的三步有顺序。
window-limited rate≈window/RTT。
BDP=bandwidth×RTT。
RTTVAR=55ms,SRTT=40ms,RTO=260ms。window-limited rate=305KB/s。要填满 76.25MB/s、40ms path,window 至少约 3.05MB。
RTO 保护 loss recovery timing;BDP 决定需要多少未确认 bytes 才能不让 pipe 空。
RTT 翻倍而 bandwidth 不变:BDP、固定 window throughput 与合适 RTO 方向各如何变?
对应官方 3.1、3.2
Why the official problem exists:检查“最后一个 packet 到了”与“所有先前数据都到了”之间缺少什么证明。
方案 A 只 ACK 每个指数窗口最后一包;方案 B 每收到一对 packets 才 ACK 偶数索引。sender 看到目标 ACK 就推进。
先预测:方案 A 最小致命问题?
为 n=4 构造 delivery pattern,使 P4 到达但 P2 丢失;再为 odd n 构造 pair-ACK 永远无法确认最后一包的 trace。
可靠性需要 sender 获得“完整前缀”证据。
cumulative ACK 只有在之前全部收到时才能前进。
先试 n=3 或 n=4。
A 中仅 P1、P2、P4 到达也可能让 sender 误判完成;把 checkpoint ACK 改成累计边界才修正。B 在奇数个 packets 时最后一包没有搭档,永不 ACK;可显式处理尾包。即便正确,大窗口任一丢失就整窗重传,带宽未必更省。
反例同时检查 safety(不能错报完成)和 liveness(完整数据最终能被确认)。
设计 selective ACK bitmap:它增加了什么 receiver/sender state,又减少了哪些不必要重传?
它是一个边界:所有 sequence numbers 小于 200 的字节形成连续已收前缀。看到 ACK 时先在数轴涂区间,再更新 SND.UNA。
ISS=500,MSS=80,window=240;第二段丢失、第三段乱序到达。闭卷画 sender/receiver timeline,填 UNA/NXT/RCV.NXT/retx/recv queue,再加入三个 duplicate ACK 的 fast retransmit。