三类场景各选什么
按三条规则给应用分类:要实时且能容忍丢 → 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) 去