一、多路访问问题
两类链路:
点对点链路: 拨号线路、以太网交换机与主机之间 → 不需要 MAC 协议
⭐ 广播链路: 传统以太网(集线器)、WiFi、卫星、HFC → 需要 MAC 协议
问题:单一共享的广播信道,两个或更多节点同时发送 → 碰撞(collision) → 所有帧都损坏。
理想的多路访问协议(速率 R bps):
① 只有一个节点要发时,它能获得【全部 R】
② 有 M 个节点要发时,每个平均获得 【R/M】
③ ⭐ 完全分布式:没有主节点,没有全局时钟同步
④ 简单
二、三类协议
2.1 信道划分(Channel Partitioning)
把信道按某个维度切成片,每人一片。
| 方式 | 划分维度 |
|---|---|
| TDMA | 时间(每人固定的时隙) |
| FDMA | 频率(每人固定的频带) |
| CDMA | 编码(每人一个正交码,同时同频发送) |
- ✅ 公平、无碰撞、负载高时效率好
- ❌ ⭐ 负载低时浪费严重:只有一个人要发,也只能用 1/N 的容量
📌 这就是第 2 讲的电路交换思想在链路层的体现,取舍完全一样。
2.2 随机接入(Random Access)
想发就发,碰了再说。
需要两个机制:① 如何检测碰撞;② 碰撞后如何恢复。
时隙 ALOHA(Slotted ALOHA)
假设:所有帧等长,时间被划分为时隙,节点时钟同步
规则:有帧要发 → ⭐ 在下一个时隙开始时发送
若发生碰撞 → ⭐ 在之后的每个时隙以概率 p 重传
效率推导 ⭐(经典考点):
设 N 个节点,每个在每个时隙以概率 p 发送。
某个特定节点成功的概率 = p(1−p)^(N−1)
任一节点成功的概率 = N·p(1−p)^(N−1)
对 p 求导取最大:p* = 1/N
代入: N · (1/N) · (1 − 1/N)^(N−1) = (1 − 1/N)^(N−1)
当 N → ∞: (1 − 1/N)^(N−1) → 1/e ≈ 0.37
⭐ 时隙 ALOHA 的最大效率 = 1/e ≈ 37%
也就是说:63% 的时隙被浪费在碰撞和空闲上。
纯 ALOHA(Pure ALOHA)
去掉时隙同步,想发就发。碰撞窗口加倍(前后各一个帧时都可能碰):
成功概率 = p(1−p)^(N−1) · (1−p)^(N−1)
⭐ 最大效率 = 1/(2e) ≈ 18%
📌 代价很清楚:去掉同步这一个约束,效率减半。
CSMA(载波侦听多路访问)
改进:说话前先听。
⭐ 发送前先侦听信道:
信道空闲 → 发送
信道忙 → 推迟
⚠️ 碰撞仍然可能发生!因为传播时延:
时刻 0: 节点 A 开始发送
时刻 t: 节点 B 侦听信道 —— A 的信号还没传到 B
⭐ B 认为空闲,开始发送
→ 碰撞
⭐ **传播时延是碰撞的根源。**距离越远、传播时延越大,CSMA 的效果越差。
CSMA/CD(带碰撞检测)
再改进:说话时也听,听到别人在说就闭嘴。
① 侦听信道,空闲则发送
② ⭐ 发送【过程中】持续侦听
③ 检测到碰撞 → 立即停止发送,发送一个 48 位的【干扰信号 jam】
④ 进入二进制指数退避
收益:碰撞后不必把整个帧发完,大幅减少信道浪费。
⚠️ 有线可以做碰撞检测,无线不能(第 25 讲会详细解释为什么)。
二进制指数退避(Binary Exponential Backoff)⭐
第 m 次碰撞后:
从 {0, 1, 2, ..., 2^m − 1} 中【均匀随机】选一个数 K
等待 K × 512 比特时间后重试
⭐ m 上限为 10(K 的范围不再增大),16 次后放弃
为什么是指数?
碰撞次数少 → 说明竞争不激烈 → 短暂等待即可,⭐ 保证低负载下的低时延
碰撞次数多 → 说明竞争激烈 → 扩大随机范围,⭐ 降低再次碰撞的概率
📌 ⭐ 这与 TCP 超时的指数退避(第 13 讲)是同一个思想:用「拥挤程度的观测」自适应地调整退让力度。你已经在两个完全不同的层看到它了。
2.3 轮流协议(Taking Turns)
试图结合前两类的优点:
| 协议 | 机制 | 问题 |
|---|---|---|
| 轮询(Polling) | 主节点依次邀请各节点发送 | ⭐ 主节点是单点故障;轮询本身有开销 |
| 令牌传递(Token Passing) | 一个令牌在节点间循环,持有者才能发 | ⭐ 令牌丢失会导致全网瘫痪;恢复机制复杂 |
📌 令牌环(Token Ring)曾与以太网竞争,输了。原因不是技术上更差(它在高负载下效率更高),而是以太网更简单、更便宜、更易于演进。
🎯 这是网络史上反复出现的模式:简单且够用的方案,打败复杂且更优的方案。(TCP/IP 打败 OSI,以太网打败令牌环,都是同一个故事。)
三、以太网
**以太网是有线局域网事实上的唯一标准。**它从 1970 年代活到今天,从 10 Mbps 长到 400 Gbps。
3.1 帧结构
┌────────┬──────┬──────┬────────┬──────────┬────────┬──────┐
│ 前导码 │ SFD │目的MAC│ 源MAC │ 类型/长度 │ 数据 │ CRC │
│ 7 字节 │1 字节│6 字节 │ 6 字节 │ 2 字节 │46–1500 │4 字节│
└────────┴──────┴──────┴────────┴──────────┴────────┴──────┘
| 字段 | 说明 |
|---|---|
| 前导码 | 7 个 10101010,用于接收方时钟同步 |
| SFD | 10101011,标志帧的开始 |
| 目的/源 MAC | 48 位物理地址 |
| 类型 | 上层协议:0x0800 = IPv4,0x0806 = ARP,0x86DD = IPv6 |
| 数据 | ⭐ 46–1500 字节(MTU = 1500) |
| CRC | CRC-32(第 23 讲) |
3.2 ⭐ 为什么最小数据是 46 字节(最小帧 64 字节)
这是本讲最经典的考点。
答案:为了保证 CSMA/CD 能检测到碰撞。
考虑最坏情况:A 和 B 在网络两端
时刻 0: A 开始发送
时刻 τ−ε: B 侦听(还没听到 A),开始发送 → 碰撞
时刻 τ: 碰撞信号开始向 A 传回
时刻 2τ: ⭐ A 才检测到碰撞
⭐ 因此 A 必须【至少发送 2τ 那么久】,否则它发完就走了,
永远不知道自己的帧被撞坏了!
代入 10 Mbps 以太网的参数:
最大网段长度 2500 m,最多 4 个中继器
往返传播时延 2τ ≈ 51.2 μs
10 Mbps × 51.2 μs = 512 比特 = ⭐ 64 字节
减去 18 字节的头部和 CRC → 数据部分最少 46 字节
📌 **不足 46 字节的数据必须填充(padding)。**这就是为什么一个 1 字节的载荷也要占 64 字节的帧。
⚠️ 一个有趣的历史后果:千兆以太网若沿用 64 字节最小帧,网段长度会缩到几十米。解决方案是**载波扩展(carrier extension)**把最小帧扩到 512 字节——但在全双工交换式以太网中,碰撞根本不存在,这些机制都成了历史遗迹。
3.3 以太网的服务模型
⭐ 无连接:发送前不握手
⭐ 不可靠:接收方不发确认,CRC 失败就【静默丢弃】
**丢了怎么办?**上层(TCP)负责。若上层是 UDP,数据就永久丢失。
📌 注意这与第 23 讲的判断一致:以太网是低误码率链路,因此不做链路层可靠交付。
3.4 演进
| 标准 | 速率 | 介质 |
|---|---|---|
| 10BASE-T | 10 Mbps | 双绞线 |
| 100BASE-TX | 100 Mbps | 双绞线 |
| 1000BASE-T | 1 Gbps | 双绞线 |
| 10GBASE-T / SR | 10 Gbps | 双绞线 / 光纤 |
| 100G / 400G | 100–400 Gbps | 光纤 |
⭐ **所有版本共用同一个帧格式。**这就是为什么以太网能活五十年——接口稳定,实现可以完全替换(第 4 讲的分层收益)。
四、MAC 地址与 ARP
4.1 为什么需要两种地址
IP 地址(32/128 位):⭐ 层次化,可路由,与网络位置绑定
MAC 地址(48 位): ⭐ 扁平,全球唯一,与设备绑定(烧在网卡里)
为什么不能只用一种?
- 只用 MAC:地址是扁平的,无法聚合,全球路由表要有几百亿条 → 不可扩展
- 只用 IP:设备换网络就要换地址;且链路层需要一个与上层协议无关的寻址方式(同一根线上可能同时跑 IPv4、IPv6、ARP)
📌 这是「层次化用于路由、扁平化用于标识」的经典分工。
4.2 ARP:从 IP 地址找 MAC 地址
每台主机/路由器有一张 ARP 表:
IP 地址 MAC 地址 TTL
137.196.7.78 58-23-D7-FA-20-B0 13:45:00
ARP 协议(同一子网内):
① A 想给同子网的 B 发数据,但不知道 B 的 MAC
② ⭐ A 广播一个 ARP 请求(目的 MAC = FF-FF-FF-FF-FF-FF)
「谁是 137.196.7.78?请告诉 A」
③ 子网内所有主机都收到;⭐ 只有 B 回应
④ B 单播回复自己的 MAC
⑤ A 缓存到 ARP 表(TTL 通常 20 分钟)
⭐ ARP 是即插即用的:不需要任何配置。
4.3 ⭐ 跨子网发送:完整过程
这是期末考试的必考题,把整门课的很多概念串在一起。
主机 A (111.111.111.111, MAC AA) 在子网 1
路由器 R: 接口 1 (111.111.111.110, MAC RR-1) 在子网 1
接口 2 (222.222.222.220, MAC RR-2) 在子网 2
主机 B (222.222.222.222, MAC BB) 在子网 2
A 要给 B 发一个 IP 数据报:
① A 比较目的 IP 与自己的子网掩码
→ ⭐ 发现 B 不在同一子网
→ 必须发给【默认网关】R
② A 用 ARP 查询【R 的接口 1】的 MAC(不是 B 的!)
⭐ A 永远无法用 ARP 查到 B 的 MAC —— ARP 请求是广播,不跨越路由器
③ A 构造帧:
┌──────────────────────────────────────────────┐
│ 目的 MAC: RR-1 │ 源 MAC: AA │ ← 逐跳
│ 目的 IP: 222.222.222.222 │ 源 IP: 111.111.111.111 │ ← 端到端
└──────────────────────────────────────────────┘
④ R 收到帧,剥掉帧头,查路由表 → 应从接口 2 发出
⑤ R 用 ARP 查询 B 的 MAC(在子网 2 上广播)
⑥ R 构造【新的】帧:
┌──────────────────────────────────────────────┐
│ 目的 MAC: BB │ 源 MAC: RR-2 │ ← ⭐ 全变了
│ 目的 IP: 222.222.222.222 │ 源 IP: 111.111.111.111 │ ← ⭐ 完全没变
└──────────────────────────────────────────────┘
🎯 一句话总结: ⭐ IP 地址是端到端的(不变),MAC 地址是逐跳的(每一跳都换)。
4.4 ARP 的安全问题
⚠️ ARP 没有任何认证——任何人都可以回复任何 ARP 请求。
ARP 欺骗(ARP Spoofing):
攻击者持续广播:「网关的 IP 对应【我的】MAC」
→ 局域网内所有主机把流量发给攻击者
→ ⭐ 中间人攻击(第 4 讲)
防御:动态 ARP 检测(DAI)、静态 ARP 绑定、端口安全、以及最重要的:端到端加密(TLS)——即使流量被截获也无法读取或篡改。
五、交换机
5.1 核心特性
⭐ 交换机对主机是【透明的】——主机完全不知道它的存在
⭐ 交换机【不需要配置】——即插即用,自学习
⭐ 交换机隔离碰撞域——每个端口是独立的碰撞域,可以全双工
⚠️ 交换机不是主机,它没有 MAC 地址参与转发(管理接口除外),也不运行 IP。
5.2 交换机表与自学习 ⭐
表项:(MAC 地址, 端口, 时间戳)
自学习算法:
收到一个帧时:
① ⭐ 学习:记录【源 MAC】 → 【收到该帧的端口】
(因为帧从这个端口进来,说明发送者在那个方向)
② 查表找【目的 MAC】:
• 表中没有 → ⭐ 【泛洪】:从除入端口外的所有端口发出
• 表中有,且指向【入端口本身】 → ⭐ 【过滤】:丢弃(同一段内,不需要转发)
• 表中有,指向其他端口 → ⭐ 【转发】:只从那个端口发出
📌 注意这个算法的优雅之处:交换机从数据流量本身学习拓扑,不需要任何协议、任何配置。这是以太网能大规模部署的关键原因之一。
5.3 自学习追踪示例
端口1 端口2 端口3
│ │ │
A B C
事件 1: A → B
⭐ 学习: (A, 端口1)
查 B: 表中无 → 泛洪到端口 2、3
事件 2: B → A
⭐ 学习: (B, 端口2)
查 A: 表中有 (A, 端口1) → ⭐ 转发到端口 1(不泛洪)
事件 3: C → A
⭐ 学习: (C, 端口3)
查 A: (A, 端口1) → 转发到端口 1
事件 4: A → C
查 C: (C, 端口3) → 转发到端口 3
⭐ 此时 B 完全看不到这个帧 —— 这就是交换机相比集线器的价值
5.4 交换机 vs 路由器 ⭐
| 维度 | 交换机 | 路由器 |
|---|---|---|
| 工作层次 | 第 2 层 | 第 3 层 |
| 转发依据 | MAC 地址 | IP 地址 |
| 表的来源 | ⭐ 自学习(被动) | ⭐ 路由算法(主动计算) |
| 需要配置 | ❌ 即插即用 | ✅ 需要配置 |
| 隔离广播域 | ⭐ 否(广播会传遍整个交换网络) | ⭐ 是 |
| 拓扑限制 | ⭐ 必须无环(靠 STP 生成树协议阻断环路) | 允许任意拓扑,甚至受益于多路径 |
| 转发速度 | 更快(表更简单) | 稍慢(最长前缀匹配) |
| 适用规模 | 几百到几千台主机 | 无限 |
⚠️ 两个关键限制解释了为什么不能只用交换机组建大网:
1️⃣ 广播风暴
交换机不隔离广播。一个大型交换网络中,所有的 ARP 请求、DHCP 请求都会传遍全网。主机数量增加时,广播流量会占据可观的带宽。
2️⃣ 生成树协议(STP)浪费带宽
以太网帧没有 TTL(第 18 讲的 IP 才有)。⭐ 一旦交换网络中存在环路,广播帧会永远循环并无限增殖 → 广播风暴 → 网络瞬间瘫痪。
STP 通过阻断部分链路来消除环路。代价是:冗余链路被闲置,带宽被浪费。
📌 这就是数据中心网络放弃传统 STP、转向 ECMP + Clos 拓扑(或 VXLAN over IP)的根本原因——它们需要让所有链路同时工作。
5.5 VLAN
问题:一个交换机上的所有端口默认在同一个广播域。想按部门隔离怎么办?买多台交换机?
VLAN(虚拟局域网):在一台交换机上划分多个逻辑广播域。
交换机端口 1–8 → VLAN 10(工程部)
交换机端口 9–16 → VLAN 20(财务部)
⭐ VLAN 10 的广播不会传到 VLAN 20
⭐ 两个 VLAN 之间通信必须【经过路由器】(或三层交换机)
VLAN 干道(Trunk):跨交换机传输多个 VLAN 的流量,用 802.1Q 标签(在以太网帧中插入 4 字节的 VLAN 标记)区分。
📌 注意 802.1Q 让以太网帧变长了 4 字节(1518 → 1522),这在某些设备上会导致「巨型帧」问题——又一个 MTU 相关的实际坑。
六、数据中心网络
上一节末尾提到「数据中心放弃了 STP」。这不是一个孤立的选择——数据中心的约束条件和广域网差别太大,几乎每一层都做了不同的取舍。
6.1 三个不一样的地方
| 广域网 | 数据中心 | |
|---|---|---|
| 主要流量方向 | 南北向(用户 ↔ 服务器) | ⭐ 东西向(服务器 ↔ 服务器)占绝大多数 |
| RTT | 数十至上百 毫秒 | ⭐ 数十至上百 微秒(差 3 个数量级) |
| 管理权 | 跨越无数 AS,无人能控制全程 | ⭐ 单一管理域,全部设备自己说了算 |
| 拓扑 | 演化形成,不规则 | ⭐ 规则的、事先设计好的 |
⭐ 最后两条是关键:因为全程自己可控且拓扑已知,数据中心可以部署广域网根本没法部署的方案——改传输协议、改交换机队列策略、要求所有设备支持 ECN,在这里都只是一次内部升级。
6.2 从树形到 Clos:让所有链路同时工作
传统的三层树形拓扑(接入 — 汇聚 — 核心)有两个致命问题:
- ⭐ 超额订购(oversubscription):接入层下联 48 台服务器却只有 4 条上联,比例 12:1。东西向流量一大,上层链路立刻成为瓶颈。
- STP 阻断冗余链路:为了防环,本来就不多的上联还要被关掉一部分。
Clos / Fat-Tree 拓扑用大量廉价的同规格交换机堆出多条等价路径:
k 端口交换机构成的 k-ary Fat-Tree:
· k 个 Pod,每个 Pod 内有 k/2 台边缘交换机 + k/2 台汇聚交换机
· 每台边缘交换机:k/2 个端口朝下接主机,k/2 个端口朝上接汇聚
· 核心交换机数量 = (k/2)²
· 可接主机总数 = k³/4
例:k = 48
主机数 = 48³/4 = 27648 台
核心交换机 = 24² = 576 台
⭐ 全部用【同一种】48 口交换机搭成
⭐ 关键性质:全等分带宽(full bisection bandwidth)——把所有主机任意分成两半,两半之间的可用带宽等于主机接入带宽之和。也就是说任意主机对任意主机满速通信都不会在网络内部堵住,1:1 无超额订购。
📌 这是一次典型的「用规模换性能」:不追求单台设备性能,而是用大量同规格廉价交换机堆出冗余路径。坏一台影响很小,扩容就是加 Pod。
6.3 ECMP:把流散到多条路径上
有了多条等价路径,就要决定每个分组走哪条。答案是 ECMP(等价多路径):
对分组的五元组做哈希:
hash(源IP, 目的IP, 协议, 源端口, 目的端口) mod 路径数
⭐ 同一条流的所有分组哈希结果相同 → 走同一条路径
⭐ 不同的流被打散到不同路径
为什么按流而不是按分组分散:按分组分散会让同一条流的分组经不同路径、以不同时延到达,⭐ 造成大量乱序——而乱序会被 TCP 误判为丢包(三个重复 ACK 触发快速重传,第 13 讲),白白降速。按流哈希保证了同一条流的保序。
⚠️ ECMP 的软肋是「大象流」:如果两条长时间的大流量(如数据备份)恰好哈希到同一条路径,它们会一直挤在一起,而其他路径空闲。哈希是无状态的,不会重新平衡。这催生了流量感知的调度方案与在 SDN 控制器上做的集中式重路由(第 22 讲)。
6.4 TCP incast:一个只在数据中心出现的崩溃
这是数据中心网络最著名的问题。
场景:分布式存储读取、MapReduce 的 shuffle 阶段——客户端同时向几十台服务器请求数据,几十份响应几乎同时涌向同一个交换机端口。
崩溃链条:
① 多对一同步汇聚 → 交换机端口缓冲区(数据中心交换机缓冲很浅)瞬间溢出
② 大量分组被丢弃,某些流的【整个窗口】都丢光
③ 窗口全丢 → 没有重复 ACK 可用 → ⭐ 只能等【超时】
④ TCP 最小 RTO 通常是 200 ms,而数据中心 RTT 只有约 100 µs
⭐ 一次超时 = 白白空等约 2000 个 RTT
⑤ 客户端必须等最慢的那份响应才能继续 → 整体吞吐【崩塌】
⭐ 第 ④ 步是问题的核心:RTO 的下限是为广域网设计的,在数据中心里大了整整三个数量级。链路明明是空的,所有人却都在干等。
缓解手段:把 RTO 下限调到微秒级、增大交换机缓冲、在应用层错开请求时间(打散同步度)、限制并发请求数——以及下面的 DCTCP。
6.5 DCTCP:把「有没有拥塞」换成「拥塞多严重」
标准 TCP 只知道一个比特的信息:丢了还是没丢,于是只能一刀切地把 cwnd 减半(第 16 讲)。DCTCP 利用了数据中心「全程可控」这个前提,让所有交换机都开启 ECN,并且把标记阈值设得很低(队列刚开始堆积就标记)。
· 发送方统计被标记的 ACK 占比,用 EWMA 得到 α ∈ [0, 1]
· 降窗时:cwnd ← cwnd × (1 − α/2)
α → 0(几乎没标记):⭐ 几乎不降窗
α → 1(全部被标记):降为一半,退化成标准 TCP 的行为
⭐ 关键差别:标准 TCP 问「拥塞了吗」,DCTCP 问「拥塞多严重」,然后按比例响应。结果是队列长度被稳定维持在一个很低的水平——既跑满带宽,又几乎没有排队时延,同时因为很少真的丢包,也就很少触发那个致命的 200 ms 超时。
📌 这是第 16 讲 ECN 的真正主场:ECN 在公网上因为部署协调困难而长期难以铺开,但在数据中心里「让所有设备都支持它」只是一次内部升级——⭐ 同一个机制的成败,取决于它需要多少方达成一致。
七、例题(Worked Example)
题目:某以太网交换机有 4 个端口,初始交换机表为空。主机 A、B、C、D 分别接在端口 1、2、3、4。发生以下事件序列:
① A → D ② D → A ③ B → C ④ C → B ⑤ A → B
(a) 逐步写出每个事件后的交换机表,以及该帧被发往哪些端口。 (b) 哪些事件发生了泛洪?为什么? (c) 若把交换机换成集线器(hub),事件 ⑤ 会有什么不同? (d) 若 A 和 B 之间通过第二条链路也接到了这台交换机上(形成环路),会发生什么?
解答:
(a)
| 事件 | 学习到的表项 | 查目的 MAC | 动作 | 发往端口 |
|---|---|---|---|---|
| ① A→D | (A, 1) | D 不在表中 | 泛洪 | 2, 3, 4 |
| ② D→A | (A,1) (D,4) | A 在表中,端口 1 | 转发 | 1 |
| ③ B→C | (A,1)(D,4)(B,2) | C 不在表中 | 泛洪 | 1, 3, 4 |
| ④ C→B | (A,1)(D,4)(B,2)(C,3) | B 在表中,端口 2 | 转发 | 2 |
| ⑤ A→B | 表已完整 | B 在表中,端口 2 | 转发 | 2 |
(b) 事件 ① 和 ③ 发生了泛洪。
原因:目的 MAC 尚未出现在交换机表中。交换机只能从「帧的源地址」学习,因此在某台主机第一次发送之前,交换机不知道它在哪个端口。
⭐ 关键观察:泛洪是自学习的必然代价,但它是一次性的——D 一旦回复(事件 ②),交换机就学到了 (D, 4),之后再也不需要为 D 泛洪。
(c) 集线器会把帧发到【所有其他端口】(2、3、4),不做任何过滤。
三个后果:
- C 和 D 会收到不属于它们的帧 → ⭐ 可以被嗅探(第 4 讲的分组嗅探)
- 所有端口在同一个碰撞域里 → 只能半双工,且随主机数增加碰撞剧增
- 总带宽被所有主机共享,而交换机的每个端口都是独享的
📌 **这就是集线器被彻底淘汰的原因。**在交换机价格降下来之后,它没有任何优势。
(d) 会发生广播风暴,网络在几秒内瘫痪。
① A 发出一个广播帧(例如 ARP 请求)
② 交换机从两条链路都泛洪出去
③ 帧从一条链路绕回来,交换机再次泛洪
④ ⭐ 以太网帧【没有 TTL】,没有任何机制让它停下来
⑤ 帧数量指数增长 → 链路饱和 → 交换机 CPU 耗尽 → 全网瘫痪
⚠️ 注意与 IP 层的对比:IP 有 TTL,即使出现路由环路,分组也会在 TTL 归零时被丢弃,影响是局部且有界的。以太网没有这个保护,因此环路是致命的。
解决办法:生成树协议(STP/RSTP/MSTP)——交换机之间交换 BPDU 报文,自动计算出一棵生成树,逻辑上阻断多余的链路。代价是那些链路的带宽被闲置。
八、随堂自测
- 理想的多路访问协议应满足哪四条?
- 推导时隙 ALOHA 的最大效率。纯 ALOHA 为什么只有它的一半?
- CSMA 已经先听后说了,为什么还会碰撞?
- 二进制指数退避的规则是什么?为什么用指数?它与 TCP 的哪个机制同构?
- ⭐ 以太网最小帧长为什么是 64 字节?给出完整推导。
- 以太网提供可靠交付吗?为什么这个选择是合理的?
- 为什么需要 MAC 地址和 IP 地址两套地址?
- ⭐ A 要给不同子网的 B 发数据,A 会 ARP 查询谁的 MAC?为什么不能查 B 的?
- 写出交换机自学习的三个动作(学习、泛洪、过滤/转发)的触发条件。
- 交换机为什么不隔离广播域?以太网环路为什么是致命的(对比 IP 层)?
- ⭐ 数据中心为什么放弃 STP?Fat-Tree 的「全等分带宽」是什么意思?
- ECMP 为什么按【流】而不是按【分组】做哈希分散?它的软肋是什么?
- ⭐ 完整叙述 TCP incast 的崩溃链条,指出哪一步是问题的核心。
- DCTCP 相比标准 TCP 多知道了什么信息?它为什么只能在数据中心里部署?
九、本讲要点回顾
- 三类多路访问协议:信道划分(低负载浪费)、随机接入(高负载碰撞)、轮流(有单点问题)。
- ⭐ 时隙 ALOHA 效率上限 1/e ≈ 37%;纯 ALOHA 只有 1/(2e) ≈ 18%。
- 传播时延是碰撞的根源;CSMA/CD 通过边发边听减少浪费。
- 二进制指数退避与 TCP 的超时退避同构:用观测到的拥挤程度自适应调整退让力度。
- ⭐ 以太网最小帧 64 字节 = 最坏情况往返传播时延内能发出的比特数,为了保证能检测到碰撞。
- 以太网无连接、不可靠——低误码链路,交给上层处理。
- ⭐ IP 地址端到端不变,MAC 地址逐跳更换;ARP 不跨越路由器。
- 交换机:自学习、即插即用、透明、隔离碰撞域;但不隔离广播域。
- ⭐ 以太网帧没有 TTL,因此环路是致命的,必须靠 STP 阻断——代价是闲置带宽。
- ⭐ 数据中心的两个前提:单一管理域 + 拓扑已知 → 可以部署广域网做不到的方案。
- Clos / Fat-Tree:k 端口交换机可接
k³/4台主机,核心交换机(k/2)²台,⭐ 全等分带宽、无超额订购。 - ⭐ ECMP 按五元组哈希、同流同路——按分组分散会造成乱序被 TCP 误判为丢包;软肋是大象流哈希碰撞。
- ⭐ TCP incast:多对一同步 → 浅缓冲溢出 → 整窗丢失 → 只能等超时,而 200 ms 的 RTO 是 100 µs RTT 的 2000 倍。
- DCTCP 用 ECN 标记比例 α 按比例降窗
cwnd × (1 − α/2),⭐ 把「拥塞了吗」换成「拥塞多严重」,队列稳定维持在极低水平。
十、自测答案
1. ① 只有一个节点发送时,它能获得全部信道速率 R;② M 个节点同时要发时,每个平均获得 R/M;③ 完全分布式——没有主节点、不需要全局时钟同步;④ 实现简单。
2. 设 N 个节点各以概率 p 在一个时隙发送。某特定节点成功的概率为 p(1−p)^(N−1)(它发且其余都不发),任一节点成功的概率为 N·p(1−p)^(N−1)。对 p 求导得最优 p* = 1/N,代入得 (1−1/N)^(N−1),当 N→∞ 时趋于 1/e ≈ 0.37。纯 ALOHA 只有一半,是因为去掉了时隙同步后,碰撞窗口加倍——一个帧不仅会与在同一时隙开始发送的帧碰撞,还会与在它之前一个帧时内开始、尚未发完的帧碰撞,因此成功概率多乘了一个 (1−p)^(N−1),最大效率变为 1/(2e) ≈ 18%。
3. 因为传播时延。节点 B 侦听信道时,节点 A 已经开始发送但信号还没有传到 B,B 因此判断信道空闲并开始发送,碰撞发生。信道越长(传播时延越大)、帧越短,这个"侦听盲区"的相对影响就越严重。
4. 第 m 次碰撞后,从 {0, 1, ..., 2^m − 1} 中均匀随机选一个 K,等待 K × 512 比特时间后重试;m 的上限为 10,连续 16 次碰撞后放弃该帧。用指数是为了自适应:碰撞次数少说明竞争不激烈,随机范围小、等待短,保证低负载下的低时延;碰撞次数多说明竞争激烈,随机范围指数扩大,降低再次碰撞的概率。它与 TCP 超时后的指数退避(第 13 讲)同构——两者都是「用观测到的拥挤程度自适应地调整退让力度」。
5. 为了保证 CSMA/CD 能够检测到碰撞。最坏情况下,A 在时刻 0 开始发送,位于网络另一端的 B 在信号即将到达时(时刻 τ−ε)判断空闲并开始发送,碰撞信号要到时刻 2τ 才传回 A。因此 A 必须至少持续发送 2τ 那么久,否则它发完就停止侦听,永远不会知道自己的帧被撞坏。对 10 Mbps 以太网,最大跨距下 2τ ≈ 51.2 μs,10 Mbps × 51.2 μs = 512 bit = 64 字节。减去 14 字节头部和 4 字节 CRC,数据部分最少 46 字节(不足则填充)。
6. 不提供。接收方不发确认,CRC 校验失败就静默丢弃,丢失由上层(TCP)恢复。这个选择合理,是因为以太网是低误码率的有线链路(第 23 讲),差错极为罕见;为罕见事件增加链路层确认与重传的开销、时延和复杂度不划算,而 TCP 的端到端重传已经覆盖了这种情况。(对比:802.11 无线误码频繁,因此做链路层重传。)
7. MAC 地址是扁平的、与设备绑定的全球唯一标识,好处是设备换到任何网络都能工作、且与上层协议无关(同一根线上可跑 IPv4/IPv6/ARP);但扁平地址无法聚合,若用它做全球路由,路由表要有几百亿条,完全不可扩展。IP 地址是层次化的、与网络位置绑定,因而可以聚合(CIDR)、可以路由;但设备移动就要换地址。二者的分工是:层次化地址用于路由,扁平地址用于标识。
8. A 会 ARP 查询默认网关(路由器在本子网一侧的接口)的 MAC。不能查 B 的 MAC,有两个原因:① ARP 请求是广播帧,而路由器不转发广播——请求根本到不了 B 所在的子网;② 即使拿到了 B 的 MAC 也没用,因为链路层的帧只能在本链路上传递,A 无法把帧直接送到另一个子网的 B。A 必须把帧交给网关,由网关重新封装后继续转发。
9. 学习:收到任何帧时,都把「源 MAC → 收到该帧的端口」记入表中(无条件执行)。泛洪:查表时目的 MAC 不在表中(或目的是广播/多播地址),则从除入端口外的所有端口发出。过滤:目的 MAC 在表中,且对应端口就是入端口,说明收发双方在同一段上,直接丢弃。转发:目的 MAC 在表中且对应其他端口,只从那个端口发出。
10. 交换机不隔离广播域,是因为广播帧(目的 MAC = FF:FF:FF:FF:FF:FF)按定义就要送达链路上的所有节点,交换机必须把它泛洪到所有端口——ARP、DHCP 等基础协议都依赖这个行为。以太网环路致命,是因为⭐ 以太网帧头部没有 TTL 字段:帧沿环路循环时没有任何机制让它衰减或停止,而每次经过交换机泛洪还会复制成多份,帧数指数增长,几秒内耗尽链路带宽和交换机 CPU。对比 IP 层:IP 头部有 TTL,即使出现路由环路,分组也会在最多 255 跳后被丢弃,损害是有界且局部的——这正是当初在 IP 头部里放 TTL 的价值所在。
11. STP 靠阻断链路来消除环路,而数据中心恰恰需要所有链路同时工作——冗余路径是它性能的来源,不是要消除的隐患。所以数据中心改用 L3 路由或 VXLAN over IP,让多路径共存并用 ECMP 分散流量。
⭐ 全等分带宽(full bisection bandwidth):把所有主机任意分成两半,这两半之间可用的网络带宽等于一半主机接入带宽的总和。含义是⭐ 任意主机与任意主机满速通信都不会在网络内部形成瓶颈,即超额订购比为 1:1。传统树形拓扑的超额订购常达 12:1,东西向流量一大就堵在上联链路。
12. 因为按分组分散会造成大量乱序:同一条流的分组走不同路径、经历不同时延,到达顺序被打乱。⭐ TCP 会把乱序误判为丢包——失序到达触发重复 ACK,凑够三个就启动快速重传并降窗(第 13、16 讲),于是链路明明没堵却在降速。按五元组哈希保证同一条流始终走同一条路径,保序。
软肋是大象流碰撞:哈希是无状态的,若两条长期大流量恰好哈希到同一路径,它们会一直互相挤占而其他路径闲置,且不会自动重新平衡。
13. 崩溃链条:① 多对一同步汇聚(如 MapReduce shuffle),几十份响应几乎同时涌向同一端口;② 数据中心交换机缓冲很浅,瞬间溢出丢包;③ 某些流的整个窗口被丢光,⭐ 没有后续分组能产生重复 ACK,快速重传用不上;④ 只能等超时,而 TCP 最小 RTO 通常是 200 ms,数据中心 RTT 只有约 100 µs;⑤ 客户端要等最慢的那份响应,整体吞吐崩塌。
⭐ 核心是第 ④ 步:RTO 的下限是按广域网设定的,在这里大了整整三个数量级——一次超时白等约 2000 个 RTT,而链路是空的。
14. 标准 TCP 只能获得一个比特的拥塞信息:丢了还是没丢,因此只能一刀切地把 cwnd 减半。DCTCP 让交换机在队列刚开始堆积时就用 ECN 标记,发送方统计被标记 ACK 的比例 α——⭐ 它知道的是「拥塞有多严重」,于是可以按比例降窗 cwnd × (1 − α/2):轻微拥塞只轻微降窗,全部被标记时才退化成减半。
只能在数据中心部署,是因为它要求路径上所有交换机都开启 ECN 且按统一的低阈值标记。在公网上这需要无数个互不隶属的运营商达成一致(第 16 讲 ECN 部署困境);⭐ 在数据中心里这只是一次内部升级——同一个机制的成败,取决于它需要多少方达成一致。