1.3 TCP/IP之大明邮差
从写入字节到累计确认追踪 TCP 的序号、在途窗口、重传与拥塞边界,用可重放实验验证可靠字节流。
学习目标
- 能沿写入字节、分配序号、网络传送、确认窗口和超时重传追踪 TCP 的可靠性状态
- 能用序号、累计确认、接收窗口、拥塞窗口和在途字节解释发送速度与有序交付
- 能在丢包、乱序、确认延迟和拥塞场景中定位首个偏离,并从干净状态重放
1.3 TCP/IP之大明邮差
本页依据刘欣《码农翻身》(2018 年第 1 版)及出版社公开书目信息,独立重构 1.3 TCP/IP之大明邮差。正文、代码、图示、实验和练习都是本课程重新设计的教学材料,不复制原书正文、插图、练习答案或代码。
可靠字节流不是“发出去就算完成”。TCP 为字节分配序号,接收端用累计确认报告连续收到的范围,发送端根据接收窗口和拥塞窗口限制在途数据;丢包或确认超时后重传,乱序数据要等待缺口补齐。每一步都产生不同的证据。
三个会让可靠传输失真的陷阱
可靠字节流合同
↡本页把网络故事重构为由序号、累计确认、接收窗口、重传和拥塞窗口共同维护的可靠有序字节流。不是把邮差类比搬进实现,而是要求每个字节范围有身份、每次确认有覆盖范围、每次重传有触发证据。
设发送端当前在途字节为 bytes_flight,则最基本的发送预算是:
其中 cwnd 是发送端依据拥塞状态维护的窗口,rwnd 是接收端通告的窗口。预算满足也不代表应用已处理;还要沿序号、确认和应用边界继续追踪。
五个节点到机制证据
写入字节
↡应用交给传输接口、尚未由远端确认的字节范围。 产生待发送字节,但写入返回只说明本地接口接受了数据。记录消息 ID、字节范围、发送缓冲和应用边界,避免把本地成功报告成远端完成。
分配序号
↡为字节流建立连续位置,使分段、重传和重组可以比较范围。为字节流建立连续位置。每个分段保存起止序号、长度和连接状态;应用消息被拆分或合并时,仍用序号范围恢复字节顺序。
网络传送
↡分段经过路径并可能丢失、重复、延迟或乱序的过程。 只改变“哪些序号正在路上”的证据,不自动推进累计确认,也不保证应用已经看到数据。
确认窗口
↡由累计 ACK 和接收窗口共同表达的连续进度与可接收预算。表示接收端已经连续收到确认号之前的字节,接收窗口表示还能接受多少数据。发送端同时受
cwnd 和 rwnd 限制,窗口收缩时必须暂停或减少在途数据。
超时重传
↡根据计时器或丢失证据重新发送未确认序号范围并调整拥塞状态的动作。可以由超时、重复确认或其他丢失证据触发。重传不是无条件复制;记录触发原因、原序号范围、退避时间、窗口变化和最终确认。
最小可重放实现
state = baseline(cwnd=4, rwnd=4, next_seq=0, ack=0)
for event in scenario:
state = transition(state, event)
assert bytes_in_flight(state) <= min(state.cwnd, state.rwnd)
assert reset(state) == baseline(cwnd=4, rwnd=4, next_seq=0, ack=0)这段草图只表达窗口与序号的验证合同,不复制书中叙事或代码。实际复核要保存输入、分段序号、确认覆盖范围、窗口、计时器、重传原因、应用重组和复位结果。
五步复核可靠字节流
1. 固定写入字节与初始预算
记录消息 ID、长度、起始序号、cwnd、rwnd 和初始确认号。先算出允许的在途字节,再观察首个分段。
Lab
序号、确认与窗口实验
只改变一个丢包或窗口条件,观察确认推进、在途预算和恢复动作。
cwnd=4,rwnd=4,四段按序确认
send seq 0..399 → ACK 400 → bytes_flight 0 → app complete
判定
通过:预算满足,确认连续推进
当前场景:基线窗口;记录序号、ACK、cwnd、rwnd、在途字节、重传和应用结果。
正常、边界与故障证据
| 样本 | 只改变的变量 | 预期判定 | 必存证据 |
|---|---|---|---|
| 正常 | 窗口足够、分段按序、确认及时 | 在途预算满足,应用重组完整 | 序号、ACK、窗口、重组结果 |
| 边界 | cwnd、rwnd、确认延迟或超时阈值 | 停止或退避,不超过在途预算 | 窗口、计时器、确认覆盖、发送量 |
| 故障 | 一个序号范围丢失或重复确认 | 缺口可定位,重传后按序恢复 | 首差、缺口、重传原因、退避和复位 |
故障诊断:先找确认没有推进的原因
- 核对写入范围:确认应用写入的字节数、消息边界和发送缓冲,排除输入本身被截断。
- 核对序号缺口:按连接和时间排列分段,找最小未确认序号;重复 ACK 只说明连续范围没有继续推进。
- 核对窗口预算:比较
bytes_flight、cwnd和rwnd,检查是否因窗口收缩或拥塞而暂停。 - 核对重传终态:保存计时器、退避、重传次数、最终 ACK 和应用重组;修复后从同一序号基线重放。
术语表
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 1.3 TCP/IP之大明邮差
由序号、累计确认、接收窗口、重传和拥塞窗口共同维护的可靠有序字节流。
- 写入字节
应用交给传输接口、尚未由远端确认的字节范围。
- 分配序号
为字节流建立连续位置,使分段、重传和重组可以比较范围。
- 网络传送
分段经过路径并可能丢失、重复、延迟或乱序的过程。
- 确认窗口
由累计 ACK 和接收窗口共同表达的连续进度与可接收预算。
- 超时重传
根据计时器或丢失证据重新发送未确认序号范围并调整拥塞状态的动作。
练习
练习
问题 1: 本地写入返回成功,能否直接把消息标为远端已收到?
问题 2: 接收端收到序号 100 到 199 后,序号 0 到 99 仍然缺失,累计确认能否跳到 200?
问题 3: 拥塞期间反复超时,为什么不能只增加重传次数?
本页小结
1.3 TCP/IP之大明邮差的关键不是记住投递故事,而是能用序号、累计确认、接收窗口、拥塞窗口和重传证据解释每一个字节的状态。完成标准是从固定写入重放到应用重组,在丢包或拥塞中定位确认不推进的首因,并证明复位后在途预算和可靠结果重新闭合。