互联网没有唯一中心,但有层级:接入层 → 区域层 → 骨干层。 分层把链路数从平方级降到线性级,代价是最远要多绕几跳。
2.3.2 讲的是「靠什么连」,这一节讲「怎么连成一张网」。 这一节会算跳数与链路数,两个数的对比很说明问题。
一、三层结构
从你家到骨干,大致这么几层:
| 层 | 典型设备 | 连接方式 |
|---|---|---|
| 接入层 | 家用路由器、楼道交换机 | 星型,接终端 |
| 区域层 | 城域网汇聚设备 | 环型或双星,接多个接入 |
| 骨干层 | 核心路由器 | 网状,少而粗 |
第一行是「星型」:终端到接入点只有一条路,断了就断。 这一层不做冗余,因为成本太高、影响面太小。 第二行开始做冗余:城域网常见「双环」或「双星」,保证任一段断了还能绕。 第三行是「少而粗」:骨干层的链路数量很少,但每条都是几十上百 G。 所以骨干断一条,影响的是整个区域。
二、两个数的对比
同一批节点,两种连法:
| 连法 | 链路数 | 最远几跳 |
|---|---|---|
| 全连(网状) | 45 | 1 |
| 分层 | 9 | 6 |
10 个节点全连要 45 条链路,分层只要 9 条:从平方级降到线性级,这就是分层的收益。 代价是最远要绕 6 跳:每跳都要经过一台设备,每台都有一点时延。 所以「分层」是用「跳数」换「链路数」——这笔交易在节点数少时不划算,节点一多就必赚。 这也是「为什么不能把所有路由器都直连」的答案: 10 个节点 45 条线还能接受,100 个节点就是 4950 条,没有哪个机房放得下这么多线。
三、骨干断了会怎样
三层结构有一个必然的脆弱点:
| 断在哪 | 影响范围 | 能绕吗 |
|---|---|---|
| 接入层 | 一户或一栋 | 不用绕 |
| 区域层 | 一个片区 | 通常能绕 |
| 骨干层 | 一个区域甚至一国 | 绕不了,只能等修 |
第三行是真实发生过的事:海底光缆被渔船挖断、被地震震断,都会让某个国家的国际出口骤降。 这不是「设计失败」,是「成本与风险的折中」——要把骨干做到完全冗余,成本会高到没人愿意付。 所以「互联网没有单点」这句话要打个折扣:它在「逻辑上」没有单点(任何两点之间有多条路径), 但在「物理上」有(某些海缆就是独一份)。 这也解释了为什么大公司要自建海缆、要多个运营商接入:它们买的不是带宽,是「路径多样性」。
四、动手 Demo:三层 ISP 拓扑,任意两点最多几跳
建一个三层小拓扑,算任意两个接入端之间的跳数。 同时对比「全连」需要多少条链路。
edges = [('骨干A', '骨干B'), ('骨干B', '骨干C'),
('骨干A', '区域1'), ('骨干B', '区域2'), ('骨干C', '区域3'),
('区域1', '接入1a'), ('区域1', '接入1b'),
('区域2', '接入2a'), ('区域3', '接入3a')]
nodes = sorted({x for e in edges for x in e})
g = {n: [] for n in nodes}
for a, b in edges:
g[a].append(b)
g[b].append(a)
def hops(s, t):
dist, q = {s: 0}, [s]
while q:
v = q.pop(0)
for w in g[v]:
if w not in dist:
dist[w] = dist[v] + 1
q.append(w)
return dist.get(t)
leaves = [n for n in nodes if n.startswith('接入')]
mx = max(hops(a, b) for a in leaves for b in leaves if a != b)
print('节点 %d、链路 %d、最远 %d 跳' % (len(nodes), len(edges), mx))
print('全连要 %d 条' % (len(nodes) * (len(nodes) - 1) // 2))
实跑输出:
--------------------------------------------------------------------
三层 ISP 拓扑,任意两点最多几跳
--------------------------------------------------------------------
**互联网是分层的:接入层 → 区域层 → 骨干层。**下面建一个三层小拓扑,算任意两点之间的跳数。
**节点 10 个、链路 9 条,两个最远的接入端之间是 6 跳。**
**这就是「分层」在拓扑上的收益**:**全网 10 个节点,如果全连要 45 条链路;分层只要 9 条。**
**链路数从平方级降到线性级,代价是最远要多绕几跳。**
**所以「互联网没有中心」这句话要修正一下**:
**它没有「唯一中心」,但有「层级」**——**骨干层就那么几条,断了影响很大。**
**这也是「海底光缆被挖断导致某国全网变慢」的原因。**
10 个节点、9 条链路、最远 6 跳:全连要 45 条。 所以分层用 1/5 的链路换来了 6 跳的距离。 最远的那一对是「接入1b 到 接入3a」: 接入1b → 区域1 → 骨干A → 骨干B → 骨干C → 区域3 → 接入3a,数一下正好 6 跳。 这个拓扑里骨干只有三个节点:这是刻意的——现实里的骨干层也是「少而粗」。 所以「骨干断了影响大」不是设计缺陷,是结构性必然。
30 秒实验
- 加一个「区域1 直连 区域2」的链路,看最远跳数会不会降到 4。
- 把骨干减到两个节点,看最远跳数变成多少、链路数变成多少。
- 想一下:为什么海底光缆这么重要?用「链路数 vs 跳数」解释。
常见误区
- 以为互联网是「网状全连」。 它是分层的,骨干少而粗,接入多而细。
- 以为「没有单点」等于「绝对可靠」。 逻辑上无单点,物理上有,某些海缆就是独一份。
- 以为分层只是为了省钱。 它还用「跳数」换「可管理性」,全连的拓扑连配置都写不完。
自测三问(点开对答案)
1. 互联网的三层结构是什么? —— **接入层(星型接终端)、区域层(环型或双星)、骨干层(网状,少而粗)。**越往上链路越少越粗。 2. 分层在链路数上买到什么?代价是什么? —— **10 个节点从 45 条降到 9 条**(平方级降为线性级),**代价是最远要绕 6 跳。** 3. 为什么说「互联网物理上有单点」? —— **某些海底光缆是某个国家/地区的唯一出口**,断了就绕不了。 逻辑上有多条路径,物理上可能是独一份。下一节把「谁在运营这些层」说清楚:ISP 与区域网。
- ☐ (本节完,下一节 2.3.4 ISP和区域网)