三类场景各选什么

按三条规则给应用分类:要实时且能容忍丢 → UDP;短问短答且自己重试 → UDP;一对多 → UDP;否则 TCP: apps = [("语音通话", "实时"), ("下载文件"

开始练习 →

补全:选协议

补全 choose(realtime, tolerate_loss, one_to_many, big):一对多 → UDP;实时且容忍丢 → UDP;数据大或者不容忍丢 → TCP;其余(小而不实时的短问答)→ UDP。看六种组合。

开始练习 →

补全:发现设备

(每道题开头都有同一段:上面的内存版 UDP。) 贯穿全条的内存版 UDP(判题机不联网;接口和真 socket 一字不差,真机上把 net.socket() 换成 socket.socket(AF_INET, SOCK_DGRAM) 就是

开始练习 →

补全:解析 DNS 查询里的名字

本节的 DNS 小工具: encode_name("www.example.com") b"\x03www\x07example\x03com\x00"(每段前面一个长度字节,末尾 0) buil

开始练习 →

为什么会丢

五个方块依次进管子,出来的却不是那五个 少了一个、多了一个、两个调了个 UDP 包在路上「丢了」,最常见的原因是【0】。

开始练习 →

为什么会乱序和重复

五个方块依次进管子,出来的却不是那五个 少了一个、多了一个、两个调了个 UDP 包可能乱序到达、甚至到两次,因为【0】。

开始练习 →

应用层要补什么

想在 UDP 上得到「按顺序、不重复、都到」,应用层要自己做的是【0】。

开始练习 →

一条会丢会乱的信道

本节的信道模拟: deliver(msgs, plan) plan 每个报一个字符:. 到达 x 丢 d 到两次 s 和后一个交换顺序;交回接收方看到的顺序 seq_gaps(seqs) 缺了哪些序号|dedupe(seqs) 去

开始练习 →

停等协议要发几次

本节的信道模拟: deliver(msgs, plan) plan 每个报一个字符:. 到达 x 丢 d 到两次 s 和后一个交换顺序;交回接收方看到的顺序 seq_gaps(seqs) 缺了哪些序号|dedupe(seqs) 去

开始练习 →

补全:按序号重排

本节的信道模拟: deliver(msgs, plan) plan 每个报一个字符:. 到达 x 丢 d 到两次 s 和后一个交换顺序;交回接收方看到的顺序 seq_gaps(seqs) 缺了哪些序号|dedupe(seqs) 去

开始练习 →