“R9把一个固定流的缺口补成连续前缀。本页改变接口:同一连接中有多个分别排序的字节序列,一个包可以带多个流的片段。包到达次序不能充当任何一条流的字节次序。”
形式陈述
本页构造教学协议R9,而非TCP实现。底层沿用消息传递的发送与交付事件,允许包丢失、重复、乱序,不允许篡改、伪造;两端不崩溃。双方预先知道唯一且不复用的流标识
把
- 新发送:发送从
起的下一段,再令 。数据包进入可丢失信道 - 收数据:先检查流标识和固定分段范围,再填入尚未保存的字节;重复位置不重复输出。随后从
起逐格推进,直到遇到空格或到达 ,将新连续部分交给读者;回复ACK= - 收确认:只有
才令 ;旧ACK不回退,超过 的ACK不接受 - 重传:若
且重传计时器到期,重发从 开始的最早未确认段。每次仍未完成,就继续安排以后有限时刻的重传;新发送也必须最终获得执行机会
固定分段及整段交付使
直觉
接收者不是按“包到达的次序”拼字符串,而是按包写明的位置补格子。确认报告连续填满到哪里。最后一段先到只会填后面的格子;缺口补上时,前缀可以一下推进很多字节。
重复包会再次触发确认,这正好修复“数据到了,确认没到”的情况。字节只追加一次与ACK可以发送很多次并不矛盾。
例子与边界
取 00 03 43 41 54 00 02 4F 4B,
| 事件 | 已填位置 | 接收r | 发出ACK | 发送u |
|---|---|---|---|---|
| P1先到 | [3,6) | 0 | 0,到达发送者 | 0 |
| P0丢失 | 不变 | 0 | 无 | 0 |
| P2到达 | [3,9) | 0 | 0,到达发送者 | 0 |
| 超时重发P0并到达 | [0,9) | 9 | 9,但丢失 | 0 |
| 网络中重复P1到达 | [0,9) | 9 | 9,到达发送者 | 9 |
只有第四步新增交付9字节;第五步没有第二份消息内容。数据发送共4次,含原始P0的丢失与一次重传;网络额外复制P1一次不算发送者调用。接收者发出4个ACK,其中一个丢失。这里不把三次“到达后段”理解成三个TCP重复ACK规则;R9没有Reno。
若最后ACK及以后所有ACK永久丢失,接收者可能早已完成,发送者仍无法确认完成。设定有限尝试上限可以让发送者退出,但返回只能表明“传输未获完整确认”;不能证明对端没收到,更不能回滚已交付前缀。若允许重启、旧流ID复用或位串篡改,本协议的证明前提失效,需要新增机制。
推论与应用
前缀安全为什么不依赖包的顺序
采用归纳不变量:每个已填格
什么时候能最终完成
活性另需公平条件:持续未完成时,发送者最终发出所有新段并持续重传最早未确认段;某个数据包若被发送无穷多次,就被交付无穷多次;同样规则适用于反向ACK;接收者持续处理并保留流状态。若
位图与缓存占
参考资料
- Peterson、Davie,Computer Networks: A Systems Approach,在线6.2-dev版,§5.2.4:按序字节、重传与滑动窗口机制。
- RFC 9293,§§2.2、3.4,用于对照真实TCP累计确认;R9的预共享长度、固定分段、无绕回数组和证明均为本页自定模型,不是该RFC的实现声明。