Skip to content

从丢失包到请求结果:R9网络终点任务 ​

本任务追踪三种不同的进度:哪些字节已经连续收到,哪些应用帧已经完整解析,以及客户端有何证据判断业务结果。三者都推进,才形成一个可解释的调用;某一层完成,不替后两层作保证。

核心链、补课与进阶 ​

核心链为消息传递→受限可靠流→TCP字节序号→长度前缀分帧→背压→总期限→RPC结果判定。七站各解决一个接口,R9只是教学模型,不是TCP实现。

按需补课:字节序解释两字节头,状态机解释事件,分层封装解释包从哪里来,队列解释有界缓冲。

进阶分支包括IP转发、MTU、UDP与DNS,以及连接生命周期、接收窗口、RTO和Reno。之后再进入既有共识/复制路线;不需要先读FLP才能开始本任务。

入口自测与答案 ​

  1. 两字节大端00 03是多少?答案:3,先字节权重为256,后字节权重为1
  2. [3,6)字节已到但[0,3)尚缺,连续接收前缀末端是多少?答案:0,后段不能越过前缀缺口
  3. 本地send完成是否就是对端业务执行完成?答案:不是;发送、网络交付、应用读取和业务执行是不同事件

第一题不熟先补字节序;第二题先看序列前缀;第三题先看消息传递。答出这三题便可从下面的具体轨迹开始。

任务一:先把九个位置补齐 ​

固定流标识R9-one-use,总长度N=9,最大段长m=3,字节串为:

00 03 43 41 54 00 02 4F 4B

两端不崩溃,网络可丢失、乱序与复制,不篡改、不伪造。双方预知总长与固定分段,偏移不绕回,接收者以位置数组缓存,输出仅追加连续前缀。三段P0=[0,3)、P1=[3,6)、P2=[6,9)全部先由发送者发出;发送前沿n=9、累计确认u=0、接收前沿r=0。

依次发生:P1先到并回ACK;原P0丢失;P2到并回ACK;超时重发P0到达,但它引出的ACK丢失;网络中一份P1副本到达且ACK成功返回。每个未注明丢失的ACK都在下一行前返回。写出每行r、ACK、u,指出何时交付字节,统计发送者数据发送次数与接收者ACK次数。

答案与理由 ​

事件完成后 r 该事件ACK u 新交付字节
P1到且ACK返回 0 0 0 无
原P0丢失 0 无 0 无
P2到且ACK返回 0 0 0 无
重传P0到、ACK丢失 9 9,丢失 0 全部9字节
重复P1到且ACK返回 9 9 9 无

P1、P2先到只填[3,9),不能越过[0,3)缺口。重传补洞后r从0跳到9;重复P1只触发再次ACK,不再输出字节。发送者共发4个数据包:三个原段加一次P0重传。网络复制P1不算发送者第五次发送。接收者共发4个ACK,一个丢失。

安全不变量是“已填格等于原串相同位置,输出恰为[0,r)前缀,0≤u≤r且u≤n≤N”。每个事件都保持它。活性还需要持续重传、公平的双向丢包、持续处理以及接收完成后仍保留确认状态;有限测试不能证明这些无限执行条件。

任务二:三次短读恢复消息 ​

应用格式是两字节大端长度L,再跟L字节载荷;0≤L≤16。接收调用依次返回 00、03 43 41、54 00 02 4F 4B。写出每次调用后解析状态和完整消息。再判断 00后EOF、00 03 43 41后EOF、FF FF长度头与零长度帧的结果。

答案与理由 ​

第一次只留半头Header(00)。第二次头变0003,得到长度3,并留Body(3,CA),尚无输出。第三次先用54(T)补成CAT,继续解析0002与4F4B得到OK,最终回空Header。

00后EOF是截断头;00 03 43 41后EOF是截断载荷;FF FF一读完就因65535>16拒绝,不分配该长度。00 00立即产生一个空载荷。没有数据可读的EAGAIN不是EOF,必须保留已有状态。

九字节内部共有8个可切点,每点选择切或不切,因此有2⁸=256种非空批次切分。所有切分都应得到CAT、OK。解析器还必须限制输出队列,否则无穷个合法短帧仍能占尽内存。

任务三:连接和deadline不能决定业务效果 ​

业务操作为add(10),每次被处理的尝试原子地执行一次或无效果拒绝,没有跨尝试去重;余额初始100。客户端总预算1000毫秒,起点0。DNS100,建连200,发送50,等待200未获响应,退避150,重连100,再发送50。第二次等待局部上限400毫秒。

  1. 算出各阶段结束时间、第二次可等待多久,以及t=1010才唤醒时能否再发
  2. 比较请求从未到达,与请求在t=400提交但响应丢失这两条轨迹(为固定余额,比较时另设第二次尝试在D前也未执行),在D处客户端能否区分
  3. 若重连后无去重保护再次add(10),解释余额可能是什么
  4. 分别给成功、明确失败、结果未知的一份充分证据,并说明TCP ACK为何不够

答案与理由 ​

阶段末端为100、300、350、550、700、800、850,剩余预算依次为900、700、650、450、300、200、150。第二次至多等150毫秒,到D=1000结束本轮等待,不能重置为400。t=1010时剩余0,不开始新尝试。

在比较中两条运行的第二次尝试都尚未执行:请求从未到达时余额100;第一次t=400提交后丢失响应时余额110。客户端都只观察到尝试开始、没有完整响应和到期,因此两者在D处都判结果未知。沿后者重连后再次add,余额还可能变120。重建TCP连接不继承业务去重知识。

本任务的“成功”是收到一份可报告的成功返回:响应完整并匹配逻辑请求ID及尝试号,按约定只在该次尝试效果完成后发送。它不证明逻辑请求恰好执行一次,也不证明所有在途尝试都已结束;另一尝试随后执行仍可把余额110变120。若接口要承诺一个逻辑请求最终唯一结果,必须另有持久身份/去重合同。明确失败证据可以是任何尝试发送前本地校验拒绝,或服务协议对整个逻辑请求给出“未生效”的最终拒绝。响应截断、TCP RST、取消发出或deadline到期都不能单独提供这种拒绝证据;此前可能执行时保留未知。

TCP ACK只确认连续字节已到对端TCP,业务可能尚未读、尚未执行或已经提交。第二次尝试的一般拒绝也不能抹掉第一次未决效果。RFC9110中幂等说的是重复请求的预期效果,不要求响应和日志相同;完整持久去重、会话与结果表回收另由容错服务单元承担。

迁移题:改变结构再检查 ​

迁移一:接收完成后立刻忘记流 ​

删去R9“r=N后继续回答重复包”的规则,其余不变。最后ACK丢失后会怎样?

答案:发送者u<N,仍重传最早未确认段;接收者已经忘记该流而不再确认,发送者可能永远不能完成,即使网络从此不丢包。原活性证明用到的“重复数据产生ACK”已经失效。可以改变生命周期合同或增加结束协议;仅增加发送重试次数不构成证明。

迁移二:帧比总缓冲大 ​

解析器必须完整缓存载荷才交给消费者,最大合法载荷16字节,却只给它8字节总可用缓存。发来L=16时,单有正确背压能否完成?

答案:不能。解析器等剩余字节才交付,消费者等完整帧才释放,容量不足形成结构矛盾。应把完整帧容量纳入预算,或修改协议和消费者接口支持受控流式消费;不能声称调大高水位就解决。即使完整帧为8字节而C=8,H=6的硬暂停也会停在半帧;应为已准入帧预留完整预算并允许收完,或流式消费。

迁移三:跨机传播剩余300毫秒 ​

A在本地t=700发出剩余300毫秒,网络用40毫秒,B收到后再计300。B是否保证在A的1000前停止?

答案:没有,B可工作到A时间1040。剩余时长消除了时钟原点差,却没有消除未知传输时间。A仍独立在D结束等待;严格的远端共同截止点还需额外时钟/时延假设。

迁移四:用“设为7”替换add(10) ​

重复设置可以具有相同预期效果,但这是否消除结果未知?

答案:没有。幂等性可能允许在合同范围内重试,却不产生一份已到达的成功响应。与并发写入的交互、日志和返回值也需按服务语义分析。能安全重复与已经知道结果是不同问题。

可选计算分支 ​

  • 对转发表/0→A、10/8→B、10.2/16→C、10.2.3/24→D、10.2.3.128/25→E,目的10.2.3.200选E,10.2.3.20选D;缺省路由只在没有更具体项时使用
  • IPv4无选项,3000字节载荷过MTU1500:载荷1480、1480、40;偏移0、185、370;总发送IP字节3060。IPv6路由器不照此执行分片
  • RTT样本0.8、1.0、0.7秒,G=0.01:RFC6298本页参数下RTO依次2.4、2.225、1.984375秒。重传样本歧义按Karn排除
  • u=1000、n=1600、rwnd=1000、cwnd=800:共同新增额度200。Reno以FlightSize6000、M1000计算阈值3000;不能用cwnd10000算5000
  • DNS正记录t0=0、TTL60,t20回复剩40;负答案t10、SOA TTL120及MINIMUM30,到t40失效。NODATA(AAAA)不否定A记录

检查器与适用边界 ​

下载Python复算器。仅使用Python 3标准库,不连接网络,也不调用生产服务。它检查24条有限乱序/重复/单丢失后恢复轨迹、全部256种短读切分、各截断位置、超长/空帧、短写、RTO、路由/分片、窗口、deadline及八条结果观察,包括“已收到成功返回后,另一在途尝试仍执行”的边界。运行输出结构化中间账本,而不是只给“通过”。

检查器验证这些有限样本与不变量断言,不证明真实TCP符合RFC,也不验证R9的无限公平活性。R9不含握手、序号绕回、接收窗口、拥塞、校验、认证和崩溃恢复。真实服务还需持久化、并发控制、身份验证与协议级恢复,不能把本任务当作可部署网络库。

参考资料 ​

  • RFC9293,§§2.2、3.4–3.9;RFC6298,§§2–5;RFC5681,§§2–3,本任务只选择各页明确声明的协议片段
  • RFC9110,§9.2.2,幂等与重试;gRPC Deadlines,期限传播和取消责任
  • 分层、DNS、分片与接口的精确来源见对应概念页;R9、九字节分帧及所有数值轨迹为本单元自定教学数据