📚 覆盖:第 25–29 讲 · ⚠️ 这是期末冲刺的核心练习


这份习题的定位与前三份不同:它发布得晚、分值略低,但与期末考试的重合度最高。第 25–29 讲的内容在期末占相当比重,而这五讲又是全课最容易「读过就以为懂了」的部分——无线和安全的概念听起来都不难,真要算 CSMA/CA 的时序、手推 RSA、说清楚为什么 ECDHE 有前向保密而 RSA 密钥传输没有,就会发现理解并不牢。

建议做法:先合上讲义做一遍,再对答案。凡是「看到答案觉得理所当然但自己没写出来」的题,都抄进 cheat sheet。


第一部分:无线链路与 802.11(第 25 讲,24 分)

题 1(4 分)

(a) 列出无线链路相比有线链路的三个本质差异,每个用一句话说明它带来的后果。 (b) 802.11 为什么用 CSMA/CA 而不是以太网的 CSMA/CD?给出两条独立的理由。

题 2(4 分)⭐

拓扑:主机 A 和主机 C 都在 AP 的覆盖范围内,但 A 与 C 相距太远,互相收不到对方的信号。

(a) 描述一次碰撞是如何发生的,指出碰撞发生在哪个位置。 (b) RTS/CTS 如何解决这个问题?说明 C 是通过哪一帧知道要保持静默的。 (c) 既然 RTS/CTS 能解决隐藏终端,为什么现实中的 AP 默认把它关掉?

题 3(5 分)⭐

某 802.11 网络参数:DIFS = 34 µs,SIFS = 16 µs,一个时隙 = 9 µs,数据帧传输时间 = 200 µs,ACK 帧传输时间 = 30 µs。站点 S 有一帧待发,信道从一开始就空闲,S 抽到的退避值是 5 个时隙

(a) 从 S 开始侦听到它收到 ACK,一共经过多少微秒?写出每一段。 (b) 如果在 S 的退避倒计时进行到剩 3 个时隙时,信道被别的站点占用了 500 µs,S 的倒计时会怎样处理?这与以太网的退避有什么本质不同?

题 4(4 分)

(a) 以太网帧只有 2 个地址字段,802.11 帧却有 4 个。为什么? (b) 基础设施模式下,主机 A 通过 AP 向路由器接口 R1 发送数据。写出这个 802.11 帧的地址 1、地址 2、地址 3 分别是谁的 MAC 地址,并说明 AP 把它转成以太网帧时如何填写源和目的。 (c) 地址 4 在什么场景下才会用到?

题 5(4 分)⭐

(a) 无线链路的丢包主要来自误码和衰落,而不是队列溢出。解释 TCP 为什么会误判,以及误判的后果。 (b) 给出两种缓解方法,并分别指出各自的代价。

题 6(3 分)

802.11 会根据信噪比动态切换调制方式(速率自适应)。

(a) 为什么 SNR 下降时降低名义速率反而能提高有效吞吐量? (b) 这说明「名义速率」和「有效吞吐量」是什么关系?


第二部分:蜂窝网络与移动性(第 26 讲,18 分)

题 7(4 分)

频谱使用、信道接入方式、移动性支持三个角度,说明蜂窝网络与 WiFi 的根本差异。

题 8(4 分)

说明 4G LTE 中 MME、HSS、S-GW、P-GW 各自的职责,并指出哪些属于控制平面、哪些属于数据平面。为什么 P-GW 被称为「锚点」?

题 9(4 分)⭐

移动节点从归属网络移动到外地网络后,通信者仍要与它通信。

(a) 描述间接路由的完整路径,并说明什么是「三角路由」问题。 (b) 直接路由解决了什么?它付出了哪两个代价?

题 10(3 分)

描述 LTE 中从源基站切换到目标基站的关键步骤(至少 4 步),并指出哪一步是切换期间不大量丢包的关键。

题 11(3 分)⭐

手机从 WiFi 切换到蜂窝网络时,正在下载的 TCP 连接会断开,而 QUIC 连接不会。

(a) 用连接的标识方式解释这个差异。 (b) QUIC 在 IP 改变后还需要做什么?为什么不能直接继续发数据?


第三部分:密码学、完整性与认证(第 27 讲,26 分)

题 12(4 分)

(a) TLS 为什么不全程使用公钥加密,而要切换到对称加密? (b) 会话密钥是怎么产生的?公钥机制在其中扮演什么角色?

题 13(6 分)⭐

RSA 手算。设 p = 5q = 11e = 3

(a) 求 nz = (p−1)(q−1),并验证 e 是合法选择。 (b) 求满足条件的最小正整数 d。 (c) 加密明文 m = 8,求密文 c。 (d) 用 d 解密,验证能还原出 m必须写出模幂的中间步骤

题 14(4 分)⭐

比较单纯哈希(SHA-256)、HMAC、数字签名三者。对每一个回答:需要什么密钥?提供机密性吗?提供完整性吗?提供认证吗?提供不可否认性吗?

其中一项的「不可否认性」答案与另外两项不同——解释为什么。

题 15(4 分)

认证协议从 ap1.0 演进到 ap5.0,每一步都是被一种具体攻击逼出来的。挑出其中三次演进,说明「原方案 → 攻击 → 新方案」的因果链。

最后说明:为什么 ap5.0 仍然不够,还必须引入 CA?

题 16(4 分)

浏览器收到服务器证书后要做验证。列出至少五个必须检查的项目。任一项失败会怎样?

题 17(4 分)⭐

(a) 什么是前向保密(Forward Secrecy)?用「攻击者今天录流量、明天拿到私钥」这个场景来定义它。 (b) 为什么 RSA 密钥传输不具备前向保密,而 ECDHE 具备? (c) 这解释了 TLS 1.3 的哪一个设计决定?


第四部分:TLS、IPsec 与防火墙(第 28 讲,22 分)

题 18(5 分)⭐

设客户端与服务器之间 RTT = 40 ms,忽略传输时延与处理时延。

(a) 用 TCP + TLS 1.2,从开始建连到发出第一个 HTTP 请求,需要几个 RTT?总时延是多少? (b) 换成 TLS 1.3 呢? (c) TLS 1.3 的 0-RTT 会话恢复能省到多少?它有哪两个安全代价?为什么规范要求它只用于幂等请求?

题 19(4 分)

(a) TLS 工作在传输层之上,IPsec 工作在网络层。分别说明它们保护什么、不保护什么。 (b) 各举一个更适合用它的场景,并说明理由。

题 20(4 分)⭐

写出 ESP 在传输模式隧道模式下的封装格式(按字段顺序排列),并对每种模式指出:

(a) 加密覆盖哪些部分? (b) 外部观察者能看到什么? (c) 典型部署场景是什么?

题 21(5 分)⭐

(a) 比较无状态包过滤器、有状态包过滤器、应用网关:各能做什么、各做不到什么。 (b) 现在要实现一条策略:「允许内网主动发起的 HTTP 连接的返回流量进入,但禁止外部主动发起的任何连接」。无状态过滤器能精确实现吗?写出它能给出的最接近的规则,并说明这条规则为什么不安全。

题 22(4 分)

(a) 解释反射放大攻击的原理。为什么 DNS、NTP、memcached 特别容易被利用?给出各自的大致放大倍数。 (b) BCP 38(源地址过滤)在技术上能根治地址伪造。列出三条它至今没有被普遍部署的原因。


第五部分:综合(第 29 讲,10 分)

题 23(6 分)⭐

一名学生把笔记本插上校园以太网口,打开浏览器输入 https://www.example.com,页面出现。

时间顺序列出这一过程涉及的协议(至少 8 个环节),并对每个环节说明:用到了什么地址或标识这一步在等待什么

特别注意:请明确指出在整条路径上,哪些地址是逐跳变化的、哪些是端到端不变的

题 24(4 分)⭐

用本课学过的具体例子,说明以下三条设计原则各自的体现与代价:

(a) 端到端原则 (b) 分层 (c) 软状态

每条都要给出至少一个正面例子和一个代价。


参考解答

题 1

(a) 三个本质差异:

差异 后果
信号强度随距离衰减(路径损耗) 接收端 SNR 随距离急剧下降,可用速率随之下降;覆盖范围有硬边界
来自其他源的干扰 2.4 GHz 是免授权频段,微波炉、蓝牙、邻居的 WiFi 都在里面,噪声不可控
多径传播 信号经不同路径到达接收端产生相位叠加,造成时变的深度衰落,误码率随时间剧烈波动

⭐ 共同后果:无线链路的误码率比有线高好几个数量级,而且是时变的——这一点会一路影响到 TCP(见题 5)。

(b) 两条独立理由:

  1. 收发自干扰:网卡自己发射的信号,在自己天线处的功率比远端到达的信号强约 10^6 倍。要在发射的同时听清微弱的远端信号,需要极高性能的全双工射频,成本不可接受。所以边发边听做不到
  2. 即使能听也没用:碰撞发生在接收端(AP 处),而不是发送端。隐藏终端场景下,A 和 C 在各自位置听到的都是空闲,但它们的帧在 AP 处撞了。⭐ 在发送端做碰撞检测,检测的是错误位置的信道状态。

所以 802.11 转向避免:先协调好再发(载波侦听 + 随机退避 + 逐帧 ACK 确认)。


题 2

(a) A 和 C 都能听到 AP,但互相听不到。两者同时有帧要发,各自做载波侦听——都判定信道空闲——于是同时发送。两个信号在 AP 的天线处叠加,AP 无法解码,两帧都损坏。⭐ A 和 C 自己完全不知道发生了碰撞,只能靠 ACK 超时才发现。

(b) A 先发一个很短的 RTS(Request To Send)给 AP。AP 若同意,广播一个 CTS(Clear To Send)。关键在于:C 听得到 AP,所以 C 能收到这个 CTS。CTS 帧里携带 duration 字段,C 据此设置自己的 NAV(Network Allocation Vector,网络分配向量)计时器,在这段时间内即使物理载波侦听显示空闲也不发送——这叫虚拟载波侦听

C 是通过 CTS 而不是 RTS 知道要静默的,因为 C 根本收不到 A 的 RTS。这是整个机制的核心。

(c) 三条现实原因:

  1. 开销占比:RTS + CTS 加上两个 SIFS,对一个 200 µs 的数据帧来说是可观的固定开销;对短帧(如 TCP ACK)开销甚至超过数据本身。
  2. 隐藏终端在多数场景并不常见:家庭和办公室的终端通常互相可见。
  3. 实际做法是设一个 RTS 阈值(如 2347 字节,即默认相当于关闭),只对超过阈值的大帧启用——大帧碰撞的代价大,值得付这个开销。

题 3

(a) 逐段相加:

DIFS                     34 µs
退避 5 个时隙  5 × 9  =  45 µs
数据帧传输              200 µs
SIFS                     16 µs
ACK 帧传输               30 µs
--------------------------------
合计                    325 µs

⭐ 注意 SIFS < DIFS 是有意设计的:ACK 只等 SIFS 就发,比任何想抢信道的新站点(要等 DIFS)都快,保证了 ACK 不会被抢占。这是 802.11 里用「等待时间长短」实现优先级的典型手法。

(b) 802.11 的退避倒计时在信道变忙时冻结,保留剩余的 3 个时隙。信道恢复空闲后,再等一个 DIFS,然后从 3 继续倒数,而不是重新抽随机数。

与以太网的本质不同:以太网 CSMA/CD 每次碰撞后都在更大的区间里重新随机(二进制指数退避),一个倒霉的站点可能连续抽到大值而长期挨饿。802.11 的冻结-恢复机制让已经等了很久的站点保有它累积的等待,剩余计数越小越优先,公平性明显更好。


题 4

(a) 以太网是单一广播域内的直达传输,只需要「谁发的、发给谁」。而 802.11 的 AP 是一个链路层中继:无线帧到达 AP 后要被转换成以太网帧继续转发。因此帧里必须同时表达两件事:这一跳的无线收发双方,以及这个帧最终要交给有线侧的哪个 MAC。两者不是一回事,所以需要三个地址。

(b) A 通过 AP 发给路由器接口 R1:

字段 含义
地址 1 AP 的 MAC 这一跳的接收端(无线侧)
地址 2 A 的 MAC 这一跳的发送端
地址 3 R1 的 MAC 有线侧的最终目的

AP 转成以太网帧时:目的 = 地址 3(R1)源 = 地址 2(A)。⭐ 注意源填的是 A 而不是 AP——这正是 AP 对上层「透明」的原因,路由器看到的就是 A 直接发来的帧。

(c) 地址 4 只在无线分布式系统(WDS)/ 无线网桥 / ad hoc 中继场景用到:帧要在两个 AP 之间无线转发,此时「无线这一跳的收发双方」和「原始的源与最终目的」是四个不同的地址,才需要全部四个字段。普通基础设施模式下地址 4 不出现。


题 5

(a) TCP 唯一的拥塞信号是丢包(Reno 系)。它隐含假设「丢包 ⟹ 路由器队列溢出 ⟹ 网络拥塞」。但无线链路上的丢包主要来自误码和衰落,此时网络路径可能完全空闲。

后果:TCP 触发拥塞控制,cwnd 减半(快速恢复)甚至回到 1(超时),吞吐量骤降。⭐ 网络明明有带宽,TCP 却主动放弃使用。在误码率较高的链路上,这会让实际吞吐远低于链路能力。

(b) 两种缓解方法与代价:

方法 做法 代价
链路层 ARQ + FEC 802.11 的逐帧 ACK 与本地重传,把误码丢包在链路层修掉,不让 TCP 看见 引入时延抖动:本地重传使 RTT 突然变大,可能触发 TCP 的伪超时;与 TCP 的重传形成重复劳动
分裂连接(PEP / 性能增强代理) 在基站处把一条 TCP 拆成「有线段 + 无线段」两条,无线段用适配无线的协议 破坏端到端语义:ACK 不再代表接收方真的收到;与 TLS/QUIC 等加密协议不兼容(代理看不到也改不了传输层头部)

补充:更根本的路线是让 TCP 不再把丢包当唯一信号——BBR 用带宽和 RTT 建模、ECN 用显式标记,都能减轻这种误判。


题 6

(a) 误码率随 SNR 下降而升高。高阶调制(如 256-QAM)每个符号携带更多比特,但星座点更密集,对 SNR 的要求更高。SNR 低时若坚持高速率,几乎每一帧都会出错,每帧都要重传——重传本身还要占用信道时间。极端情况下有效吞吐趋近于 0。

降到低阶调制(如 BPSK),名义速率虽低,但帧能一次成功送达,不浪费信道时间在重传上,于是有效吞吐反而更高。

(b) 名义速率是信道在无差错假设下的上限;有效吞吐量 ≈ 名义速率 × 帧成功率(还要扣掉协议开销)。⭐ 两者在 SNR 低时严重背离,速率自适应算法的全部工作就是在这条「速率 × 成功率」的曲线上找极大值点。


题 7

角度 蜂窝网络 WiFi
频谱 授权频谱,运营商花钱独占,干扰在自己规划范围内可控 免授权频谱(2.4 / 5 / 6 GHz),任何设备都能用,干扰不可控
信道接入 集中调度:基站按时频资源块分配给谁在什么时刻发,无碰撞 分布式随机接入:CSMA/CA,靠退避和 ACK 处理碰撞
移动性 核心网提供注册、寻呼、切换,跨基站甚至跨运营商漫游时连接保持 换 AP 通常要重新关联;跨子网时 IP 变化,连接断开

⭐ 一句话概括:蜂窝把复杂度放在网络里换取确定性,WiFi 把复杂度放在终端里换取零成本部署。


题 8

网元 职责 平面
MME(移动性管理实体) 认证与鉴权、承载(bearer)建立与释放、切换控制、空闲态设备的寻呼 控制平面
HSS(归属用户服务器) 存储 IMSI、签约信息与主密钥,为 MME 提供认证向量 控制平面
S-GW(服务网关) 当前服务区的数据转发锚点;切换期间缓存并前转下行分组 数据平面
P-GW(分组数据网网关) 给设备分配 IP、连接外部网络、执行计费与 QoS 策略 数据平面

P-GW 为什么是「锚点」:设备的 IP 地址由 P-GW 分配,且在整个会话期间不随设备移动而改变——无论设备切换到哪个基站、哪个 S-GW,流量始终经由同一个 P-GW 进出。⭐ 正是这个固定的锚点,让上层的 TCP 连接在移动中不断(因为四元组不变)。代价是流量必须绕经 P-GW,可能产生次优路径。


题 9

(a) 间接路由的路径:

通信者 → 归属代理(归属网络) → 隧道 → 外地代理(外地网络) → 移动节点

通信者始终把包发往移动节点的永久地址,归属代理截获后用移动节点当前的**转交地址(COA)**封装转发。

三角路由问题:即使通信者与移动节点物理上近在咫尺(比如两人都在同一个城市出差),流量也必须先绕回可能在地球另一端的归属网络,形成一个「通信者 → 归属网络 → 移动节点」的三角形,额外时延可能高达上百毫秒

⭐ 但间接路由的巨大优点是:对通信者完全透明,通信者不需要知道移动性的存在,也不需要实现任何移动性协议。

(b) 直接路由:通信者先向归属代理查询 COA,然后直接把包发到 COA。消除了三角路由。

两个代价:

  1. 不再透明:通信者必须实现移动性协议、必须知道对方是移动节点、必须做这次查询。这在部署上是致命的——你无法要求全世界的服务器都升级。
  2. 会话中再次移动的处理复杂:通信者手上的 COA 会过期。解决办法是引入锚外地代理(第一个外地代理保持不变,后续移动由它链式转发),复杂度和路径长度又回来了。

题 10

关键步骤:

  1. 测量与上报:设备持续测量服务小区与邻小区的参考信号强度,按事件(如邻区比服务区强 X dB 持续 Y ms)上报源基站。
  2. 切换决策与准备:源基站决定切换,通过 X2 接口向目标基站发切换请求;目标基站预留资源并回应。
  3. 切换命令:源基站命令设备切换到目标基站,设备开始与目标基站做随机接入同步。
  4. 数据前转:源基站把尚未被设备确认的下行分组通过 X2 转发给目标基站缓存。
  5. 路径切换:设备在目标基站同步完成后,目标基站通知 MME,MME 指示 S-GW 把下行路径改到目标基站。

第 4 步「数据前转」是不大量丢包的关键。没有它,切换瞬间在源基站缓冲区里排队的数据会全部丢失,TCP 会观察到一连串丢包并超时。有了前转,这些分组只是延迟到达并可能乱序——TCP 用快速重传就能处理,甚至可能完全无感。


题 11

(a) TCP 连接由四元组(源 IP,源端口,目的 IP,目的端口)唯一标识。手机从 WiFi 切到蜂窝,网络接口改变,源 IP 随之改变,四元组不再匹配。内核找不到对应的连接控制块,原连接最终超时终止;应用必须重新建连,并重做完整的 TLS 握手

QUIC 不用四元组标识连接,而是用一个与网络地址无关的 Connection ID(CID)。IP 改变后,对端凭包里的 CID 仍能认出这是同一条连接,加密上下文、流状态、已确认的数据全部保留,无需重连也无需重做握手。

(b) QUIC 在检测到对端地址变化后,必须先做路径验证:向新地址发送一个携带随机 challenge 的 PATH_CHALLENGE 帧,要求对方用 PATH_RESPONSE 原样回送。

为什么不能直接继续发:如果不验证,攻击者可以伪造一个带合法 CID 的包、把源地址填成受害者的地址,诱使服务器把大量数据发往受害者——这就是地址伪造放大攻击(与题 22 同源)。路径验证证明了「新地址上确实有一个能收到包的对端」。

⭐ 另外,拥塞控制状态必须重置或重新探测:新路径的带宽和 RTT 与旧路径完全不同,沿用旧的 cwnd 可能瞬间压垮新链路。


题 12

(a) 公钥运算(RSA 模幂、椭圆曲线点乘)比对称运算(AES)慢 2–3 个数量级。现代 CPU 有 AES-NI 指令,对称加密可以跑到每秒数 GB;而 RSA 签名/解密是每秒几千次的量级。用公钥加密一个视频流在计算上完全不可行。

(b) 公钥机制只用来完成密钥协商,不承载数据:

  • RSA 密钥传输(TLS 1.2 及更早):客户端生成预主密钥,用服务器证书里的公钥加密后发过去。
  • (EC)DHE 密钥交换(TLS 1.3 唯一保留的方式):双方各生成一次性密钥对,交换公开部分,各自独立算出相同的共享秘密。

得到共享秘密后,双方用同一个密钥派生函数(TLS 1.3 用 HKDF)导出会话密钥,之后所有应用数据用 AES-GCM / ChaCha20-Poly1305 等对称 AEAD 算法保护。

⭐ 一句话:公钥解决「怎么在不安全信道上商定一个只有我俩知道的数」,对称解决「怎么快速地加密海量数据」。


题 13

(a)

n = p × q = 5 × 11 = 55
z = (p−1)(q−1) = 4 × 10 = 40

e = 3 合法的条件是 1 < e < zgcd(e, z) = 1gcd(3, 40) = 1 ✓(40 不含因子 3)。

(b)d 满足 e·d ≡ 1 (mod z),即 3d ≡ 1 (mod 40)

试乘:3×1=33×7=213×27=81 = 2×40 + 1

d = 27

(c) c = m^e mod n = 8^3 mod 55

8^3 = 512
512 = 9 × 55 + 17     (9 × 55 = 495,512 − 495 = 17)
c = 17

(d) 解密 m = c^d mod n = 17^27 mod 55。用平方-乘法,中间步骤全部对 55 取模:

17^1  = 17
17^2  = 289      → 289 − 5×55  = 289 − 275 = 14
17^4  = 14^2 = 196 → 196 − 3×55 = 196 − 165 = 31
17^8  = 31^2 = 961 → 961 − 17×55 = 961 − 935 = 26
17^16 = 26^2 = 676 → 676 − 12×55 = 676 − 660 = 16

指数分解:27 = 16 + 8 + 2 + 1

17^27 = 17^16 × 17^8 × 17^2 × 17^1
      = 16 × 26 × 14 × 17   (mod 55)

16 × 26 = 416 → 416 − 7×55 = 416 − 385 = 31
31 × 14 = 434 → 434 − 7×55 = 434 − 385 = 49
49 × 17 = 833 → 833 − 15×55 = 833 − 825 = 8
m = 8  ✓ 与原文一致

考试提示:模幂一定要边算边取模,绝不要先算出 17^27 这个天文数字。平方-乘法把 27 次乘法降到 6 次,这也是 RSA 在工程上可行的原因。


题 14

需要的密钥 机密性 完整性 认证 不可否认性
哈希(SHA-256) ⚠️ 仅防随机错误
HMAC 收发共享的对称密钥
数字签名 发送方私钥签、公钥验

三者都不提供机密性——这是最常见的错误答案。它们保护的是「有没有被改、是不是他发的」,不是「别人能不能看见」。

单纯哈希的完整性为什么打问号:攻击者可以同时篡改数据哈希值,接收方验证依然通过。哈希只在「哈希值通过另一条可信信道传递」时才有意义(比如从官网下载软件、从 HTTPS 页面读校验值)。

为什么只有数字签名提供不可否认性

HMAC 的密钥是双方共享的,所以接收方自己也能造出任何一条带合法 HMAC 的消息。因此接收方无法向第三方(比如法官)证明「这条消息一定是发送方发的,不可能是我伪造的」。

数字签名用的是只有发送方持有的私钥。任何人都能用公钥验证,但没人能伪造。⭐ 不可否认性来自密钥的非对称性——「只有一个人能做,所有人都能验」。


题 15

三次典型演进:

① ap3.0 → ap3.1(传口令 → 传口令的哈希)

  • 攻击:嗅探。攻击者在链路上抓到明文口令,直接冒充。
  • 改进:不传口令本身,传它的哈希。

② ap3.1 → ap4.0(口令哈希 → nonce + 共享密钥加密)

  • 攻击:回放攻击。哈希值虽然不可逆,但它是固定的——攻击者原样重放这个哈希就冒充成功了。「不可逆」不等于「不可重用」。
  • 改进:引入 nonce(一次性随机数)。Bob 发一个从未用过的 R,Alice 用共享密钥加密 R 回送。每次 R 不同,昨天录到的回答今天没用。这就证明了对方是「此刻活着的」(liveness)。

③ ap4.0 → ap5.0(共享对称密钥 → 公钥)

  • 问题:ap4.0 要求双方预先共享一个对称密钥。全互联网两两共享密钥不可能(n 个实体需要 n(n−1)/2 个密钥)。
  • 改进:Bob 发 nonce,Alice 用私钥签名回送,Bob 用 Alice 的公钥验证。无需预共享。

为什么 ap5.0 仍不够:

ap5.0 的安全性完全依赖「Bob 拿到的公钥真的是 Alice 的」。中间人 Trudy 可以在 Bob 索取公钥时把自己的公钥塞给 Bob。此后 Bob 验证通过的「Alice」其实是 Trudy,Trudy 再转发给真 Alice,形成完整的中间人攻击,双方全程无感。

⭐ 结论:公钥密码把「保守秘密」的问题转化成了「确认公钥归属」的问题——它没有消灭信任问题,只是把信任集中到了一个更可管理的地方。 这个地方就是 CA:由可信第三方用自己的私钥签名「这个公钥属于这个域名」,即证书。而 CA 自己的公钥通过操作系统/浏览器预装分发,形成信任的


题 16

至少五项(实际浏览器检查的更多):

  1. 域名匹配:请求的主机名必须匹配证书的 SAN(Subject Alternative Name)扩展。⭐ 现代浏览器不再接受只在 CN 字段里的域名。
  2. 有效期:当前时间在 notBeforenotAfter 之间。
  3. 签名链验证:沿签发关系逐级构建证书链,用每一级上级证书的公钥验证下级证书的签名,直到一个自签名的根证书。
  4. 信任根:这个根证书必须在本机/浏览器的信任存储里。
  5. 吊销状态:通过 CRL、OCSP,或更常见的 OCSP Stapling(服务器主动附带 CA 签名的有效性证明,避免浏览器额外的往返和隐私泄露)检查证书未被吊销。
  6. 用途与约束KeyUsage / ExtendedKeyUsage 必须包含服务器认证;中间证书的 BasicConstraints 必须标记为 CA 且 pathLen 未超限。
  7. 证书透明度(CT):Chrome 等要求证书出现在公开的 CT 日志中,附带 SCT 凭据——用于事后发现错误签发。

任一项失败:浏览器显示全屏拦截警告页,并默认拒绝建立连接。用户可以点击继续(HSTS 站点连这个选项都没有)。⭐ 注意验证失败是致命错误而不是警告——这是 Web PKI 相比早期设计的重要改进。


题 17

(a) 前向保密:攻击者今天完整录下加密流量,明天(或十年后)通过任何手段拿到了服务器的长期私钥,仍然无法解密那些录下的历史流量。

⭐ 关键在于「历史」二字——拿到私钥后当然可以冒充服务器进行新的攻击,前向保密保护的是过去

(b)

RSA 密钥传输(无前向保密):客户端生成预主密钥 → 用服务器证书里的 RSA 公钥加密 → 发送。会话密钥完全由这个预主密钥派生。攻击者只要日后拿到服务器私钥,就能解开当年录下的那条加密的预主密钥,进而导出会话密钥,解密全部历史流量。私钥是唯一的单点。

ECDHE(有前向保密):双方各自生成一对临时的(Ephemeral,就是 E 的含义)椭圆曲线密钥,交换公开部分,各自算出共享秘密。会话结束后临时私钥立即销毁。长期私钥只用来对握手消息做签名(证明「我确实是这个域名的持有者」),从不参与会话密钥的推导

因此拿到长期私钥只能冒充服务器发起新连接,无法重建任何已销毁的临时密钥,历史流量安全。

(c) 这解释了 TLS 1.3 完全删除了 RSA 密钥传输(以及所有静态 DH)密钥交换方式,只保留 (EC)DHE。⭐ 这是 TLS 1.3 最重要的设计决定之一:把「不安全但兼容」的选项彻底移除,而不是留着让人配置——因为经验反复证明,只要选项存在就一定有人误配。


题 18

(a) TCP + TLS 1.2:

TCP 三次握手                    1 RTT
TLS 1.2 握手                    2 RTT
  (ClientHello → ServerHello+Cert+Done
   → ClientKeyExchange+Finished → Finished)
--------------------------------------
合计                            3 RTT = 120 ms

(b) TCP + TLS 1.3:

TCP 三次握手                    1 RTT
TLS 1.3 握手                    1 RTT
  (ClientHello 里就带上密钥共享猜测
   → ServerHello+密钥共享+Cert+Finished)
--------------------------------------
合计                            2 RTT = 80 ms

⭐ TLS 1.3 省下一个 RTT 的核心手段:客户端在 ClientHello 里就带上自己的 (EC)DHE 公开值(对服务器支持的曲线做一次预测),服务器一个来回就能把密钥协商和证书全部发完。猜错时才退化成 2 RTT(HelloRetryRequest)。

(c) 0-RTT 会话恢复:

客户端用之前会话保存的 PSK(预共享密钥)直接加密应用数据,放在第一个飞行里就发出去。TLS 层面 0 RTT,总时延就是 TCP 的 1 RTT = 40 ms

⭐ 如果底层换成 QUIC(TLS 握手与传输握手合并),连 TCP 那一个 RTT 也省掉,可以做到真正的 0-RTT——第一个包就带应用数据。

两个安全代价:

  1. 没有前向保密:0-RTT 数据用的是从旧会话派生的 PSK,不是新鲜的 ECDHE 结果。PSK 泄露则这部分数据可被解密。
  2. 可被重放:0-RTT 数据不经过任何往返确认,服务器无法区分「客户端重发」和「攻击者重放录下的包」。攻击者可以把同一个 0-RTT 请求重复发送任意多次。

为什么只用于幂等请求GET 执行多次和执行一次结果相同,重放最多浪费点资源。而 POST /transfer?amount=1000 被重放一百次就是一百次转账。所以规范要求服务器只对幂等操作接受 0-RTT 数据,非幂等请求必须等握手完成。


题 19

(a)

TLS IPsec
保护 单条 TCP 连接之上的应用数据 整个 IP 数据报(隧道模式下含原 IP 头)
不保护 IP 头、TCP 头——源目 IP 和端口号全部明文;连接建立/关闭的时机、流量大小与时序也可见
对应用 应用必须自己调用 TLS 库、管理证书 完全透明,应用无需任何改动
粒度 每个应用、每条连接单独启用 整台主机或整个网段一刀切

⚠️ 补充一个重要细节:即使用了 TLS,SNI 字段在 ClientHello 中是明文的(除非启用 ECH),所以中间人依然能看到你访问的是哪个域名。TLS 保护的是「说了什么」,不是「跟谁说话」。

(b)

  • TLS 更适合 Web / 邮件等公开服务:服务器不知道客户端是谁、来自哪里,不可能预先配置密钥;TLS 靠 PKI 解决了陌生人之间的认证,且能按应用逐个启用、逐个升级。
  • IPsec 更适合站点到站点 VPN:把分支机构整个网段接入总部内网,希望所有流量(包括不支持 TLS 的老旧内部应用、打印机、数据库协议)都被保护,且不改造任何应用。隧道模式还能隐藏内部拓扑。

题 20

传输模式:

[ 原 IP 头 ][ ESP 头 ][ TCP 头 | 数据 ][ ESP 尾 ][ ESP 认证 ]
                      └──────── 加密 ────────┘
            └──────────── 完整性认证 ────────────┘
  • (a) 加密范围:TCP 头 + 数据 + ESP 尾。原 IP 头不加密
  • (b) 外部可见:源 IP、目的 IP 明文可见;端口号被加密,所以看不出是什么应用。
  • (c) 场景两台主机之间的端到端保护(host-to-host),比如管理员到服务器。

隧道模式:

[ 新 IP 头 ][ ESP 头 ][ 原 IP 头 | TCP 头 | 数据 ][ ESP 尾 ][ ESP 认证 ]
                      └──────────── 加密 ────────────┘
            └──────────────── 完整性认证 ────────────────┘
  • (a) 加密范围整个原始 IP 数据报(含原 IP 头)+ ESP 尾。
  • (b) 外部可见:只有新 IP 头,即两个 VPN 网关的地址。真正的通信双方、内部网络拓扑、端口全部隐藏。
  • (c) 场景网关到网关的 VPN(site-to-site),或远程办公客户端接入公司内网。

⭐ 记忆要点:隧道模式多封了一层 IP 头,多出来的这层头正是用来隐藏原来那层头的。


题 21

(a)

类型 能做 做不到
无状态包过滤 按 IP、协议、端口、TCP 标志位逐包放行/丢弃;极快,可线速处理 ⭐ 不知道一个包是否属于已建立的连接;无法应对分片规避、无法理解应用内容
有状态包过滤 维护连接表,能判断入站包是否对应一条内部发起的连接;能检查 TCP 状态机是否合法(拒绝乱序的、伪造的 ACK) 看不懂应用层内容——无法区分「正常的 HTTPS」和「隧道在 443 上的其他协议」
应用网关(代理) 理解应用语义:按 URL 过滤、扫描恶意内容、强制认证、做内容审计 (每连接要做完整的应用层解析);每种应用要单独实现一个代理;客户端通常需要显式配置;⭐ 对端到端加密的流量要么无能为力,要么必须做 TLS 中间人(引入自己的信任问题)

(b) 无状态过滤器不能精确实现。

它能给出的最接近的规则:

允许入站包,条件:源端口 = 80  且  TCP ACK 位 = 1

思路是:ACK = 1 意味着这不是一个连接的第一个包(新连接的首包是 SYNACK = 0),所以「看起来」是某条已有连接的返回流量。

为什么不安全:TCP 标志位是攻击者完全可以自己填写的。攻击者构造源端口 80、ACK = 1 的包就能直接穿过这条规则。这种 ACK 扫描可以用来探测内网存活主机和防火墙规则;配合其他技巧还能做数据外传。过滤器无法验证真的存在一条对应的出站连接——它没有记忆。

有状态过滤器则直接查连接表:表里没有匹配的四元组,包就丢弃。这是精确的。


题 22

(a) 反射放大攻击原理:

  1. 攻击者构造请求包,把源 IP 伪造成受害者的地址
  2. 发往大量开放的 UDP 服务(反射器);
  3. 反射器把响应发给「请求方」——也就是受害者;
  4. 若响应远大于请求,受害者收到的流量就被放大了。

放大倍数 = 响应字节数 / 请求字节数。

服务 利用方式 大致放大倍数
DNS ANY 查询或带 DNSSEC 的大响应 ~50×
NTP monlist 命令(返回最近 600 个客户端地址) ~500×
memcached 暴露在公网的 UDP 11211,可先存大对象再取 可达 50000×(2018 年 GitHub 1.35 Tbps 攻击)

根本原因是 UDP 无握手:服务器在回应之前没有任何机制验证源地址的真实性。TCP 服务无法这样利用,因为三次握手会失败——伪造源地址的 SYN 收不到 SYN-ACK。

(b) BCP 38 未被普遍部署的三条原因:

  1. 激励错配(公地悲剧):部署过滤的 ISP 自己得不到任何保护——它挡住的是从自己网络发往别人的伪造包。受益的全是别人。付出成本、收益外溢,典型的搭便车困境。
  2. 技术上会误伤:多宿主客户、非对称路由、移动 IP、某些 CDN 和 anycast 部署中,合法流量的源地址确实可能不属于该入口的地址块。严格过滤会切断合法业务,运维压力大。
  3. 需要接近全网覆盖才有效:只要还剩一小部分边缘 ISP 不过滤,攻击者就迁移到那里。防护效果不是线性累积的,在覆盖率接近 100% 之前收益都很有限——这进一步削弱了先行者的动力。

题 23

按时间顺序:

① DHCP(UDP 68 → 67)

  • 地址:以太网广播 FF:FF:FF:FF:FF:FF;IP 源 0.0.0.0、目的 255.255.255.255(此时本机还没有 IP)。
  • 四步 Discover / Offer / Request / ACK。
  • 拿到:本机 IP、子网掩码、默认网关 IP本地 DNS 服务器 IP
  • 等待:DHCP 服务器响应。

② ARP(在同一子网内广播)

  • 要把 DNS 查询送出子网,得先知道默认网关的 MAC
  • ARP 请求广播「谁是 192.168.1.1?」,网关单播回应自己的 MAC。
  • 等待:ARP 回应;结果进 ARP 缓存(软状态,会老化)。

③ DNS(UDP 53)

  • 向本地 DNS 服务器查 www.example.com 的 A / AAAA 记录。
  • 本地服务器若无缓存,做迭代查询:根 → .com TLD → 权威服务器。
  • 现实中往往先返回一个指向 CDN 的 CNAME,再由 CDN 的权威服务器根据请求来源返回就近节点的 IP
  • 等待:可能是整个页面加载中最不可预测的一段时延(缓存未命中时要多个往返)。

④ TCP 三次握手(目的端口 443)

  • SYN → SYN-ACK → ACK,双方交换初始序号 ISN 并协商 MSS、窗口缩放、SACK 等选项。
  • 等待:1 个 RTT。

⑤ TLS 握手

  • ClientHello(⭐ 含明文的 SNI,中间人由此可知你访问哪个域名)→ ServerHello + 证书 + 密钥共享 → 客户端验证证书链(题 16)→ 双方由 ECDHE 导出会话密钥 → Finished。
  • 等待:TLS 1.3 为 1 个 RTT。

⑥ HTTP 请求

  • GET / HTTP/1.1(或 HTTP/2 的 HEADERS 帧),整个请求已被 TLS 加密。
  • 等待:1 个 RTT + 服务器处理时间。

⑦ 逐跳转发(贯穿 ③–⑥ 的每一个包)

  • 每台路由器:查转发表做最长前缀匹配TTL 减 1 → 重算 IP 首部校验和 → 剥掉旧链路层帧、封装成下一跳链路的新帧。
  • 跨 AS 的路径由 BGP 的策略选路决定,AS 内部由 OSPF 的最短路径决定。

⑧ TCP 慢启动

  • cwnd 从初始窗口(通常 10 MSS ≈ 14 KB)开始,每个 RTT 翻倍。
  • ⭐ 页面开头几个 RTT 里,吞吐受 cwnd 而不是链路带宽限制——这正是小文件的加载时延主要取决于 RTT 而非带宽的原因,也是「把宽带从 100M 升到 1G,网页并没有变快」的解释。

⑨ 后续资源

  • 解析 HTML 发现更多资源;HTTP/2 在同一条连接上多路复用并发请求;若资源在别的域名,则从第 ③ 步重新来过。

⭐ 逐跳变化 vs 端到端不变:

变不变 原因
MAC 地址(源与目的) 每一跳都变 链路层地址只在一条链路内有意义,每次封装都要重填为「这条链路上的收发双方」
IP 地址(源与目的) 端到端不变 IP 提供端到端的标识与寻址,这正是网络层存在的意义
TTL 每跳减 1 防环,也是 traceroute 的工作基础
IP 首部校验和 每跳重算 因为 TTL 变了
端口号 端到端不变 ⚠️ 除非经过 NAT——NAT 会同时改写源 IP 和源端口,这正是它破坏端到端原则的地方

题 24

(a) 端到端原则

  • 体现:可靠传输放在端系统的 TCP 里,而不是让每条链路都保证可靠。网络核心只做「尽力而为的转发」,保持简单。
  • 收益:IP 因此能跑在任何链路技术上(以太网、WiFi、光纤、卫星),新的传输协议(QUIC)也无需改造任何路由器就能部署——创新的门槛留在了端上。
  • 代价一:网络无法针对特定链路做优化。无线链路的误码丢包被 TCP 误判为拥塞(题 5),而路由器明明知道真相却无法告诉端系统。
  • 代价二:这条原则在现实中已被 NAT 和中间盒严重侵蚀。中间盒对传输层头部的假设造成了协议僵化——以至于 QUIC 不得不把几乎整个头部都加密,只为让中间盒无法对它做任何假设。用加密来赎回可演进性,这是端到端原则被破坏后付出的代价。

(b) 分层

  • 体现:每一层只依赖下层提供的接口。HTTP 完全不必关心底下是 WiFi 还是光纤;换网卡不需要改浏览器。
  • 收益模块化与可替换性。IPv4 换 IPv6,上层应用理论上不用动;HTTP/1.1 换 HTTP/2,网络层毫无感知。这是互联网能演进四十年的组织基础。
  • 代价一:跨层信息丢失。TCP 看不到「这次丢包是无线误码」;应用看不到「现在是蜂窝网络,流量要计费」。有价值的信息被层边界挡住了。
  • 代价二:功能重复与开销。差错检测在链路层(CRC-32)、网络层(首部校验和)、传输层(TCP 校验和)各做一次;每层都加自己的头部,一个 40 字节的载荷可能背着 60 多字节的头。

(c) 软状态

  • 定义:状态由周期性刷新维持,不刷新就自动过期消失,不需要显式的拆除操作。
  • 体现DNS 缓存的 TTLARP 缓存表项的老化交换机自学习表的老化定时器NAT 映射的超时、OSPF 的 LSA 老化。
  • 收益:⭐ 对故障自愈。持有状态的一方崩溃后不必通知任何人,状态会自己消失;没有「僵尸状态」需要清理,也不需要可靠的拆除协议。这对一个由无数独立组织拼成、随时有设备失效的网络是必需的。
  • 代价:过期时间难以取舍太短则刷新开销大(DNS TTL 设成 30 秒会大幅增加查询量;ARP 频繁老化会引发额外广播);太长则故障后收敛慢(DNS TTL 设成一天,切换服务器 IP 后旧地址还会被访问一整天;交换机表项过时会把帧发到已经拔掉的端口)。

三条原则的共同点:它们都不是「正确答案」,而是在特定约束下做出的取舍。约束变了(链路变成无线、中间盒普及、云取代了自建机房),取舍就要重新审视——这也是这门课在讲完协议细节之后,真正希望留下的东西。