📚 覆盖:第 1–9 讲
第一部分:互联网构成(第 1–2 讲,20 分)
题 1(4 分)
某小区使用 HFC 电缆接入,同轴电缆下行总容量 600 Mbps,接入 80 户。
(a) 所有用户同时满速下载时,人均带宽是多少? (b) 若运营商宣称"最高 300 Mbps",需要在什么条件下才能兑现? (c) 换成每户独享 100 Mbps 的 FTTH,“瓶颈消失了"这个说法对吗?
题 2(4 分)
判断正误并说明理由:
(a) 光纤比铜缆传播速度快,所以能降低 ping 值。 (b) Tier-1 ISP 之间互不付费,是因为它们签了免费协议。 (c) 端系统包括路由器,因为路由器也是一台计算机。
题 3(4 分)⭐
一条 5 Mbps 链路,每个用户活跃时占 250 kbps,活跃比例 8%。
(a) 电路交换能支持多少用户? (b) 若有 100 个用户,用二项分布估算链路过载(同时活跃 > 20 人)的概率。 (c) 从 (a)(b) 说明统计复用的价值。
题 4(4 分)
一个 20 Mbit 的文件经过 4 条链路(3 台路由器)传输,每条链路 5 Mbps。
(a) 作为一个整体分组发送,端到端时延是多少? (b) 切成 2000 个分组(每个 10 kbit)后呢? (c) 解释差异的来源。 (d) 若头部为 40 字节,方案 (b) 的头部开销占比是多少?
题 5(4 分)
用一句话分别说明「转发」和「路由」,并指出它们的时间尺度差多少个数量级。为什么这个差异决定了路由器的硬件设计?
第二部分:时延、丢包与吞吐量(第 3 讲,25 分)
题 6(5 分)
主机 A 通过两条链路向主机 B 发送数据:
A ──[R1: 20 Mbps, 500 km]──▶ 路由器 ──[R2: 100 Mbps, 50 km]──▶ B
分组长度 12,000 bit,传播速度 2.5×10⁸ m/s
计算:(a) 每条链路的传输时延;(b) 每条链路的传播时延;(c) 忽略排队与处理时延时,一个分组的端到端时延。
题 7(5 分)⭐
某链路 R = 8 Mbps,平均分组长 4000 bit,分组到达率 a。
(a) 写出流量强度的表达式。 (b) a = 1500 分组/秒时,流量强度是多少?链路健康吗? (c) a 增加到 2000 分组/秒会怎样? (d) 为什么运营商通常把骨干链路利用率控制在 50–70%?
题 8(5 分)
某 traceroute 输出:
1 10.0.0.1 0.9 ms
2 172.16.5.1 12.3 ms
3 * * *
4 203.0.113.1 88.4 ms
5 198.51.100.9 35.2 ms
6 93.184.216.34 36.1 ms
(a) 第 3 跳说明该路由器故障了吗? (b) 第 4 跳(88.4 ms)大于第 5 跳(35.2 ms),可能吗?给出两种解释。 (c) traceroute 如何知道第 6 跳是终点?
题 9(5 分)⭐
一条链路 R = 2.5 Gbps,RTT = 120 ms。
(a) 带宽时延积是多少?以字节表示。 (b) 若发送方采用停等协议、分组 1500 字节,吞吐量是多少?利用率是多少? (c) 要达到 95% 的利用率,窗口需要多少个分组? (d) TCP 的 16 位接收窗口字段够用吗?需要什么机制?
题 10(5 分)
某路径由三段链路组成:接入 100 Mbps、骨干 10 Gbps、服务器出口 1 Gbps,共有 40 个用户共享骨干。
(a) 单个用户的端到端吞吐量瓶颈在哪? (b) 若骨干上同时有 200 个这样的用户,瓶颈变了吗? (c) 用户抱怨"网速慢”,应该先升级哪一段?
第三部分:应用层与 HTTP(第 5–6 讲,30 分)
题 11(5 分)
一个网页包含 1 个 HTML(200 KB)和 12 个对象(各 20 KB)。RTT = 60 ms,带宽 20 Mbps。计算以下三种方式的总加载时间:
(a) HTTP/1.0 非持续、串行 (b) HTTP/1.0 非持续、6 条并行连接 (c) HTTP/1.1 持续连接 + 流水线
题 12(4 分)
(a) 说出 401 与 403 的区别;(b) 说出 502 与 504 的区别;(c) 301 与 302 的区别,以及为什么用错 301 很危险。
题 13(4 分)⭐
(a) 什么是幂等性?列出 HTTP 方法中哪些是幂等的。 (b) 为什么浏览器刷新 POST 结果页会弹确认框? (c) 什么是 POST/Redirect/GET 模式?它解决了什么问题?
题 14(4 分)
(a) no-cache 和 no-store 的区别是什么?
(b) 条件 GET 返回 304 时,省下了什么?没省下什么?
(c) Cache-Control: max-age=3600 相比条件 GET 多省了什么?
题 15(4 分)
HTTP 是无状态的。(a) 为什么这样设计?(b) 代价是什么,用什么补上?(c) 列出 Cookie 的三个安全属性及其防御的攻击。
题 16(5 分)⭐
某机构接入链路 80 Mbps,平均对象 600 kbit,请求速率 100 个/秒。到源服务器的互联网往返时延 1.5 s。
(a) 无缓存时接入链路的流量强度是多少? (b) 要把流量强度降到 0.6,命中率至少要多少? (c) 命中率 0.5、接入链路排队时延估为 0.4 s、缓存命中时延 8 ms 时,平均响应时延是多少?
题 17(4 分)
(a) HTTP/2 消除了哪一层的队头阻塞?没消除哪一层?给出根本原因。 (b) 为什么 HTTP/3 必须建在 UDP 上而不是定义新的传输层协议? (c) QUIC 的连接迁移解决了什么问题?
第四部分:DNS、P2P、流媒体与实时多媒体(第 7–8 讲,35 分)
题 18(5 分)
某主机首次访问 mail.dept.univ.edu,本地 DNS 缓存为空。RTT:主机↔本地 DNS = 3 ms,本地↔根 = 90 ms,本地↔edu TLD = 50 ms,本地↔univ.edu 权威 = 25 ms,本地↔dept 权威 = 12 ms。
(a) 采用"主机递归、本地迭代"模式,总耗时是多少?
(b) 5 分钟后另一台主机访问同一域名,耗时多少?
(c) 若访问的是 web.other.univ.edu(同一 univ.edu 下的不同子域),耗时多少?
题 19(5 分)⭐
(a) 给出 DNS 不能集中式的四条理由。 (b) “全球只有 13 台根 DNS 服务器"这句话错在哪?13 这个数字的由来是什么? (c) 一家公司要在周末迁移网站到新 IP,运维应该在什么时候做什么?
题 20(5 分)
(a) DNS 放大攻击利用了 DNS 的哪两个特性?
(b) DNSSEC 提供机密性吗?DoH 提供真实性吗?二者是替代还是互补?
(c) 为什么根域名 example.com 不能配置 CNAME?
题 21(5 分)⭐
一个 F = 20 Gbit 的文件分发给 N 个用户。服务器上传 50 Mbps,用户上传均为 3 Mbps,下载均为 15 Mbps。
(a) 写出 C/S 与 P2P 的分发时间公式。 (b) 计算 N = 20、200、2000 时两种方式的分发时间。 (c) 用 (b) 的数据说明什么是"自扩展”。
题 22(5 分)
(a) SMTP 是推还是拉?这个方向性带来了什么后果? (b) 什么是点填充?它在链路层的对应机制叫什么? (c) BitTorrent 中若没有乐观疏通会发生什么? (d) DASH 为什么把码率选择的智能放在客户端?用一条课程原则回答。
题 23(6 分)⭐
某 VoIP 应用每 20 ms 产生一个语音块,第 1 块在 t = 0 产生。下表是前 6 个块的产生时刻与到达接收方的时刻(单位 ms):
| 块 | 产生时刻 t_i |
到达时刻 r_i |
|---|---|---|
| 1 | 0 | 58 |
| 2 | 20 | 71 |
| 3 | 40 | 92 |
| 4 | 60 | 129 |
| 5 | 80 | 105 |
| 6 | 100 | 148 |
(a) 求每个块的网络时延,并给出抖动(最大时延与最小时延之差)。这组数据里有没有乱序?
(b) 取固定播放时延 q = 60 ms,哪些块会错过播放时刻?
(c) 取 q = 90 ms 呢?
(d) 若要求 6 个块全部都能播放,q 最小取多少?这个取值的代价是什么?
题 24(4 分)
(a) 交互式语音的单向时延预算约 150 ms。设某会话 RTT = 60 ms(对称),语音块每 20 ms 一个,播放时延 q = 70 ms。某个块丢失,接收方在发现丢失后立刻请求重传。用计算说明重传回来的块能否赶上播放时刻。
(b) 列出两种不依赖重传的丢包对策,并分别说明它们的时延代价。
参考解答
⚠️ **请先独立完成再看解答。**看过答案再做的题目,几乎不产生学习效果。
题 1
(a) 600 ÷ 80 = 7.5 Mbps/户。
(b) 只有当其余 79 户几乎不产生流量时才能达到 300 Mbps。由于用户活动在统计上不同步(大多数时间大多数人不在满速下载),这个宣传在统计意义上并非欺诈——这正是统计复用。
(c) ⭐ 不对。FTTH 只是把瓶颈往上游推了一层。PON 的分光器下仍是共享的,OLT 到 ISP 的上联、ISP 的对外出口同样可能拥塞。互联网上总有某个地方是共享的——完全独享意味着要为峰值容量付费,没有人愿意。
题 2
(a) ❌ 错。光纤与铜缆中的信号传播速度是同一量级(约 2×10⁸ m/s)。光纤的优势在带宽和误码率。ping 值主要由传播时延(距离/速度)与排队时延构成。换光纤可能通过消除 DSL 的低速率和上行排队而间接降低 ping,但不是因为"传得快"。
(b) ❌ 理由错。它们互不付费,是因为流量大致对等且互相依赖——谁也不能单方面切断而不损害自己。这是经济学的结果,协议只是它的表现形式。
(c) ❌ 错。端系统(end system)特指运行网络应用程序的主机。路由器不运行用户应用,它只做转发,属于网络核心。这个区分正是「智能在边缘」的基础。
题 3
(a) 5 Mbps ÷ 250 kbps = 20 个用户。
(b) X ~ B(100, 0.08),E[X] = 8,σ = √(100×0.08×0.92) ≈ 2.71。
P(X > 20) = P(X ≥ 21)
21 距均值 (21−8)/2.71 ≈ 4.8 个标准差
⭐ 概率约在 10⁻⁵ 量级(极小)
(c) 电路交换只能服务 20 人;分组交换可以服务 100 人(5 倍),而过载概率只有十万分之一量级。⭐ **统计复用用极小的服务质量风险,换来了数倍的容量。**这是互联网经济性的基础。
题 4
(a) L/R = 20 Mbit ÷ 5 Mbps = 4 s,N = 4 跳
d = N × (L/R) = 4 × 4 = 16 s
(b) L/R = 10 kbit ÷ 5 Mbps = 2 ms,P = 2000,N = 4
d = (N + P − 1) × (L/R) = (4 + 2000 − 1) × 2 ms = 4.006 s
(c) ⭐ 流水线。方案 (a) 中每台路由器必须干等 4 秒收完整个文件,四段完全串行。方案 (b) 中第一个分组到达路由器 2 时,源主机已经在发第 150 多个分组了——四条链路同时在工作。
(d) 头部 40 字节 = 320 bit,载荷 10,000 bit:
开销占比 = 320 / (10000 + 320) ≈ 3.1%
题 5
转发:把一个分组从路由器的输入端口移到正确的输出端口——单台路由器内部的局部动作。 路由:决定分组从源到目的应该走哪条端到端路径——全网范围的分布式计算。
时间尺度差约 6 个数量级(纳秒 vs 毫秒到秒)。
⭐ 这个差异决定了:转发路径必须完全硬件化(TCAM、专用 ASIC),因为要跟上线速;路由计算可以放在软件里(路由处理器),因为它只在拓扑变化时运行。这正是路由器被划分为数据平面与控制平面的原因。
题 6
(a)
链路 1: 12000 / 20×10⁶ = 0.6 ms
链路 2: 12000 / 100×10⁶ = 0.12 ms
(b)
链路 1: 500,000 m / 2.5×10⁸ = 2 ms
链路 2: 50,000 m / 2.5×10⁸ = 0.2 ms
(c)
d = 0.6 + 2 + 0.12 + 0.2 = 2.92 ms
题 7
(a) 流量强度 = L·a / R
(b) 4000 × 1500 / 8×10⁶ = 6×10⁶ / 8×10⁶ = 0.75
⚠️ **不太健康。**0.75 已进入排队时延曲线开始陡峭上升的区域,抖动会明显。
(c) 4000 × 2000 / 8×10⁶ = 1.0。⭐ 队列理论上无限增长,实际表现为持续丢包与极高时延——链路饱和。
(d) 因为排队时延与利用率的关系是非线性的:E[排队时延] ∝ ρ/(1−ρ)。ρ 从 0.9 到 0.99,分母的 (1−ρ) 从 0.1 变成 0.01,时延放大 10 倍。把利用率压在 50–70% 是为突发留出余量,而不是浪费。
题 8
**(a) ⭐ 不能说明。**第 4、5、6 跳都正常返回,说明分组确实穿过了第 3 跳。它只是被配置为不回送 ICMP 超时报文,或对 ICMP 做了速率限制。
(b) 完全可能。 ① ⭐ 生成 ICMP 走的是控制平面(软件路径),若第 4 跳的 CPU 繁忙,生成响应就慢——这反映的是它的 CPU 负载,不是转发性能;② ⭐ 返回路径可能不同(热土豆路由导致路径不对称),第 4 跳的 ICMP 回程可能绕了更远的路。
(c) 因为第 6 跳返回的是 **ICMP 类型 3 代码 3(端口不可达)**而非类型 11(TTL 超时)。traceroute 故意把 UDP 目的端口设为一个极不可能有进程监听的值,把"端口不可达"这个错误当作"我到了"的信号。
题 9
(a)
BDP = 2.5×10⁹ × 0.12 = 3×10⁸ bit = 37.5 MB
(b)
每 RTT 发 1500 字节 = 12000 bit
吞吐量 = 12000 / 0.12 s = 100 kbps
利用率 = 100 kbps / 2.5 Gbps = 4×10⁻⁵ = 0.004%
(c)
W ≈ 0.95 × BDP / L = 0.95 × 3×10⁸ / 12000 = 23,750 个分组
(d) ⭐ **完全不够。**16 位窗口最大 65535 字节 ≈ 44 个分组,而需要 23,750 个。必须启用窗口缩放选项(RFC 7323),它在握手时协商一个移位因子,可把窗口扩到最大 1 GB。
题 10
(a) 骨干上 40 人共享 10 Gbps → 人均 250 Mbps。三项比较:min(100 Mbps 接入, 250 Mbps 骨干份额, 1 Gbps 服务器) = ⭐ 接入链路 100 Mbps。
(b) 200 人共享 10 Gbps → 人均 50 Mbps。min(100, 50, 1000) = ⭐ 瓶颈转移到骨干,50 Mbps。
(c) ⭐ 要先测量再决定。若属 (a) 情形,升级接入有效;若属 (b) 情形,升级接入完全无效——这就是水管类比:加粗不是瓶颈的那一段没有任何作用。实际家庭宽带的瓶颈绝大多数在接入链路,但企业和校园网常常在出口。
题 11
传输时间:
HTML: 200 KB × 8 = 1.6 Mbit ÷ 20 Mbps = 80 ms
对象: 20 KB × 8 = 0.16 Mbit ÷ 20 Mbps = 8 ms
(a) 非持续串行
HTML: 2×60 + 80 = 200 ms
每对象: 2×60 + 8 = 128 ms
12 个: 12 × 128 = 1536 ms
总计: 200 + 1536 = 1736 ms
(b) 6 条并行(两批:6 + 6)
HTML: 200 ms
批 1: 128 ms
批 2: 128 ms
总计: 456 ms
(c) 持续 + 流水线
握手: 60 ms
HTML: 60 + 80 = 140 ms
12 个对象: 60 + 12×8 = 156 ms
总计: 356 ms
⭐ 1736 → 456 → 356 ms。收益主要来自消除重复握手的 RTT,且 RTT 越大收益越显著。
题 12
(a) 401 = 「我不知道你是谁,请提供认证凭据」(应带 WWW-Authenticate,补上凭据后可能成功);403 = 「我知道你是谁,但你没有权限」(重试凭据无用)。
(b) 502 Bad Gateway = 代理从上游收到了无效响应;504 Gateway Timeout = 代理等待上游超时未收到响应。前者上游有回复但格式错误,后者上游根本没回。
(c) 301 永久移动,302 临时移动。⭐ 301 会被浏览器和搜索引擎长期缓存——一旦配错,用户浏览器会在很长时间内不再向你的服务器发请求就直接跳转,你无法从服务端撤回。这是运维中真实且代价高昂的事故类型。
题 13
(a) 幂等指执行一次与执行 N 次对服务器状态的影响相同。幂等的方法:GET、HEAD、PUT、DELETE、OPTIONS。非幂等:POST、PATCH。
(b) 因为 POST 不是幂等的——重发可能造成重复下单、重复扣款。而网络会丢包和重传,浏览器不能替用户做这个决定。
(c) POST 处理完成后返回一个 303/302 重定向到某个 GET 页面,浏览器随后 GET 该页面。⭐ 这样用户看到的最终页面是通过 GET 到达的,刷新时重发的是幂等的 GET,而不是 POST,从而消除了重复提交的风险。
题 14
(a) no-cache = 可以存储,但每次使用前必须向服务器重新验证(发条件 GET);no-store = 完全不允许存储。银行账户页面应当用 no-store。
(b) ⭐ 省下了实体体的传输(可能几百 KB 到几 MB);⭐ 没省下一个完整的 RTT——你仍然必须发出请求并等待响应才知道"没变"。
(c) ⭐ 在有效期内连请求都不发,把那个 RTT 也省掉了。这是三级递进:max-age 未过期 = 0 RTT;条件 GET = 1 RTT 但省实体;无缓存 = 1 RTT + 完整传输。
题 15
(a) 无状态让服务器可以任意水平扩展——任何一台服务器都能处理任何请求,无需在集群间同步会话状态,也无需在崩溃后恢复状态。
(b) 代价是需要状态的应用(登录、购物车)必须自己实现。补救机制是 Cookie(客户端存标识,服务端存数据)。
(c)
HttpOnly → 禁止 JavaScript 读取 → 缓解 XSS 窃取会话
Secure → 只在 HTTPS 上发送 → 防止明文信道泄露
SameSite → 限制跨站携带 → 缓解 CSRF
题 16
(a)
比特到达率 = 100 × 600 kbit = 60 Mbps
流量强度 = 60 / 80 = 0.75
(b) 设未命中率 m:
m × 60 / 80 ≤ 0.6 → m ≤ 0.8
⭐ 命中率至少 20%
(c)
平均时延 = 0.5 × 0.008 + 0.5 × (1.5 + 0.4)
= 0.004 + 0.95 = 0.954 s
题 17
(a) 消除了**应用层(HTTP 层)**的队头阻塞(响应不再需按请求顺序返回);未消除传输层(TCP 层)的队头阻塞。⭐ 根本原因:TCP 向上提供的抽象是一条有序的字节流,它对上层的多流结构一无所知,任何字节丢失都会阻止其后所有已到达的字节交付给应用——哪怕它们属于完全无关的流。
(b) ① 部署可行性——新的 IP 协议号需要全球 NAT、防火墙、负载均衡器升级才能通过,历史证明这要几十年(参考 SCTP 与 IPv6);UDP 是既有的、被普遍放行的通道。② QUIC 在用户态实现,可随浏览器更新迭代,不必等操作系统内核升级。
(c) 解决了移动场景下 IP 地址改变导致连接中断的问题。TCP 连接由四元组标识,IP 变则连接断;QUIC 用与地址无关的 Connection ID 标识连接,IP 变了连接仍继续(只需做一次路径验证)。
题 18
(a)
3 + 90 + 50 + 25 + 12 = 180 ms
(b) 本地 DNS 已缓存最终的 A 记录,直接返回:3 ms。(60 倍差距——这就是缓存的价值。)
(c) 根、edu TLD、univ.edu 的 NS 记录均已缓存,只需查 univ.edu 权威拿到 other 子域的委派,再查该子域权威。设子域权威 RTT 同为 12 ms:
3 + 25 + 12 = 40 ms
⭐ 缓存是分层生效的——即使是全新域名,只要上层记录已缓存,也能省掉大部分往返。
题 19
(a) ① 单点故障;② 查询流量巨大,单机无法承载;③ 集中式数据库对远处用户时延不可接受;④ 数亿条记录的维护与授权无法集中管理。
(b) 错在把 13 个逻辑根服务器标识当成 13 台物理机器。通过 anycast,同一个根服务器 IP 在全球有 1500+ 个物理实例。13 这个数字来源于:早期 DNS 响应必须装进 512 字节的 UDP 报文,13 个 IPv4 地址的 NS + A 记录恰好是能塞下的上限。
(c) ⭐ 迁移前 24–48 小时(超过当前 TTL 一个周期)把该记录的 TTL 调低(如从 3600 秒降到 60 秒),等旧的长 TTL 缓存全部过期;迁移时更新 A 记录,全网 60 秒内切换;确认稳定后把 TTL 调回长值以降低查询量。
题 20
(a) ① UDP 无连接、无握手,源 IP 可以随意伪造(IP 欺骗);② 响应报文远大于请求报文(尤其启用 DNSSEC 或查询 ANY 时),构成流量放大。
(b) ⭐ DNSSEC 不提供机密性(只签名不加密);⭐ DoH 不提供真实性(只加密传输,无法验证记录本身是否被权威服务器篡改或伪造)。二者是互补关系:DNSSEC 管"这条记录确实来自权威且未被篡改",DoH/DoT 管"路径上的人看不到你查了什么"。理想部署是两者同时启用。
(c) 因为 CNAME 记录不能与同名的其他记录共存(RFC 1034),而根域名必须拥有 SOA 和 NS 记录。托管商用 ALIAS / ANAME / CNAME flattening 等非标准手段在服务端展开来绕开这一限制。
题 21
(a)
D_cs = max( N·F/u_s , F/d_min )
D_p2p = max( F/u_s , F/d_min , N·F/(u_s + Σu_i) )
(b) F = 20,000 Mbit,u_s = 50 Mbps,u = 3 Mbps,d = 15 Mbps
F/d = 20000/15 ≈ 1333 s
F/u_s = 20000/50 = 400 s
C/S:
N=20: 20×20000/50 = 8,000 s → max(8000, 1333) = 8,000 s
N=200: 200×20000/50 = 80,000 s → 80,000 s
N=2000: 2000×20000/50 = 800,000 s → 800,000 s
P2P: N·F/(u_s + N·u)
N=20: 20×20000/(50+60) = 400000/110 = 3,636 s → max(400,1333,3636) = 3,636 s
N=200: 200×20000/(50+600) = 4000000/650 = 6,154 s → 6,154 s
N=2000: 2000×20000/(50+6000) = 40000000/6050 = 6,612 s → 6,612 s
| N | C/S | P2P | 倍数 |
|---|---|---|---|
| 20 | 8,000 s | 3,636 s | 2.2× |
| 200 | 80,000 s | 6,154 s | 13× |
| 2000 | 800,000 s | 6,612 s | 121× |
(c) ⭐ N 从 200 涨到 2000(10 倍),C/S 的时间也涨 10 倍(线性),而 P2P 只从 6154 涨到 6612(1.07 倍),并正在向渐近值 F/u = 20000/3 ≈ 6667 s 收敛。每增加一个用户,既增加了 F 的需求,也增加了 u 的供给,二者相互抵消——这就是自扩展。
题 22
(a) SMTP 是推(发送方主动把邮件送到接收方服务器)。⭐ 后果之一是垃圾邮件成为可能——任何人都能主动往你的邮箱推东西;而 HTTP 世界里没有人能强迫你的浏览器去下载什么。这个方向性差异是邮件反垃圾问题如此顽固的结构性原因。
(b) 点填充:SMTP 用单独一行的 . 表示报文结束,因此发送方把正文中行首的 . 替换为 ..,接收方还原。链路层的对应机制叫 ⭐ 字节填充(byte stuffing)——同一个「边界符号 vs 数据透明」问题在两个层的相同解法。
(c) 新加入的 peer 一个块都没有,无法向任何人上传,因而永远进不了任何人的"上传最快的 4 个"名单,得不到数据,被永久饿死——系统将无法接纳新成员。乐观疏通用少量随机资源打破这个死锁。
(d) 因为 ⭐ 端到端原则:只有客户端知道自己真实的可用带宽、缓冲区水位、屏幕尺寸和用户偏好,服务器无法完整、正确地代它做这个决定。副产品是服务器退化为普通 HTTP 服务器,因而可以直接复用整个 CDN 缓存体系。
题 23
(a) 网络时延 d_i = r_i − t_i:
| 块 | t_i |
r_i |
时延 d_i |
|---|---|---|---|
| 1 | 0 | 58 | 58 |
| 2 | 20 | 71 | 51 |
| 3 | 40 | 92 | 52 |
| 4 | 60 | 129 | ⭐ 69(最大) |
| 5 | 80 | 105 | ⭐ 25(最小) |
| 6 | 100 | 148 | 48 |
抖动 = 69 − 25 = 44 ms。
⭐ 有乱序:第 5 块在 t = 105 到达,而第 4 块直到 t = 129 才到——后产生的块先到了。这正是需要 RTP 序号的原因:仅凭到达顺序无法还原真实顺序。
(b) q = 60,播放时刻 p_i = t_i + 60:
| 块 | p_i |
r_i |
判定 |
|---|---|---|---|
| 1 | 60 | 58 | ✅ |
| 2 | 80 | 71 | ✅ |
| 3 | 100 | 92 | ✅ |
| 4 | 120 | 129 | ❌ 错过 9 ms |
| 5 | 140 | 105 | ✅ |
| 6 | 160 | 148 | ✅ |
⭐ 只有第 4 块错过,被当作丢包丢弃。
(c) q = 90,播放时刻 p_i = t_i + 90:分别为 90、110、130、150、170、190,而到达时刻为 58、71、92、129、105、148——⭐ 全部按时到达,无一错过。
(d) 要全部播放,必须对每个块都有 t_i + q ≥ r_i,即:
q ≥ max(r_i − t_i) = max(58, 51, 52, 69, 25, 48) = 69 ms
⭐ q 最小取 69 ms,由**时延最大的那一个块(第 4 块)**决定。
代价:每一个块都要为了迁就那唯一一个倒霉的块而统一多等 69 ms。这 69 ms 还要叠加采集、编码、解码、播放的开销,很容易把单向时延推过 150 ms 的舒适线。⭐ 这就是固定播放时延的根本矛盾:一个离群值绑架了所有人——所以实际系统改用自适应播放时延,并且接受丢掉少数离群块(比如取 q = 58 就只丢第 4 块)。
题 24
(a) 设该块产生于 t,单向时延约 RTT/2 = 30 ms。
该块的播放时刻 = t + q = t + 70
接收方何时发现它丢了?
要等【下一个块】到达才看得出缺口
下一个块产生于 t + 20,到达于 t + 20 + 30 = t + 50
请求重传(发出) = t + 50
请求到达发送方 = t + 50 + 30 = t + 80
重传块到达接收方 = t + 80 + 30 = ⭐ t + 110
⭐ 重传块在 t + 110 才到,而播放时刻是 t + 70——迟到 40 ms,赶不上。
即使乐观地假设接收方在 t + 30(原本该到的时刻)就立刻察觉丢失,重传也要到 t + 30 + 60 = t + 90 才回来,⭐ 仍然错过 20 ms。
📌 结论:要让重传有用,q 至少得取到 110 ms,再叠加编解码开销后单向时延远超 150 ms 预算——对话已经无法正常进行。⭐ 所以问题不是「UDP 不支持重传」,而是重传在时间上无意义;正因为如此才选 UDP。
(b) 任选两种:
| 对策 | 做法 | ⭐ 时延代价 |
|---|---|---|
| FEC(前向纠错) | 每 n 个块附加一个冗余块,丢任意一个都能恢复 | 必须等齐这一组才能解码,⭐ 增加约一个块组的时延;另有 1/n 的带宽开销 |
| 低码率冗余 | 第 i 个包里捎带第 i−1 个包的低质量版本 | ⭐ 只增加一个包的时延(约 20 ms),代价是恢复出的音质较低——交互式场景的首选 |
| 交织 | 把相邻采样打散到不同包 | 丢一个包变成多处小间隙而非一处大间隙,人耳更易接受;⭐ 但必须等齐一组才能还原,时延明显增加,不适合交互式 |
| 接收端隐藏 | 用前一块波形重复或内插 | ⭐ 零时延、零带宽开销,但丢包率高时失真明显 |