TOPIC 23 · PHASE D

鲁棒但脆弱ROBUST YET FRAGILE

同一个系统,可以既是最抗造的,又是最好拆的(One system can be both the toughest and the easiest to break)

2026-08-09 · 网络

互联网每天都有成千上万台设备掉线,你毫无察觉。但同一张网上存在几百个位置,只要同时拿掉它们,它就散成一地碎片。这两句话说的是同一张网,而且它们互为因果——让它扛得住第一件事的那个结构,正是让它扛不住第二件事的那个结构。

先做个对照。一条铁路线,中间任何一站出事,两头就断了;每一站都同样重要,也同样致命。这种系统的好处是没有意外——你知道风险均匀地摊在每一处。

而上一期讲的那种有枢纽的网络完全不是这样。它的容错能力高得反常:可以持续损失节点而几乎不受影响。但这份反常的结实不是因为它更冗余、更用心、更结实,而是因为它绝大多数的点本来就无关紧要。同一个理由反过来说就是:极少数的点承担了几乎全部的连接,而它们的位置是公开可算的。抗随机故障的能力和怕定点打击的毛病,是同一件事的两面,不是两个性质。你不可能只留下前者。

与邻近几期的分工先说清楚:第 22 期讲枢纽是怎么长出来的(以及「无标度」的证据有多硬);本期讲有了枢纽之后会怎样,以及这个结论能推广到多远;第 25 期讲一次失效如何沿着网络级联放大。本期不讲级联的动力学,只讲一件事——系统对什么结实、对什么脆,是同一笔账的正反两栏。

01同一张网,两种拆法(Two Ways to Break One Network)

下面这张网有 61 个点、80 条连线。它长得很不平均:最大的那个点连了 14 条线,而超过三分之一的点只连了 1 条。这种「少数点连很多、多数点连很少」的结构,上一期给过它一个名字——无标度(scale-free),意思是「一个点通常连几条」这个问题没有答案,因为不存在典型值 → 参考 · 优先连接模型

现在做两次实验,两次都只拿掉 3 个点(5%),唯一的区别是怎么挑。第一次闭着眼睛随机抽;第二次挑连线最多的三个。

同一张网,同样拿掉 3 个点(5%)— 只有挑法不同 ① 完整 ② 随机拿掉 3 个 ③ 拿掉最大的 3 个 完好 最大块 61/61 平均距离 3.81 拿掉的度数 3、2、2 最大块 57/61 平均距离 3.71 拿掉的度数 14、9、7 最大块 45/61 平均距离 5.21 仍在最大连通块里 已被切下来 被拿掉的点
随机拿掉三个点,这张网几乎没变;挑着拿同样三个点,它碎成十一块。差别不在拿掉了多少,在挑法。

随机那次,几乎什么都没发生:最大的一块从 61 个点变成 57 个,点与点之间的平均距离从 3.81 步变成 3.71 步——反而略短了一点,因为被切掉的正是几条挂在外围的尾巴。这不是运气好。这是 300 次随机抽样的中位结果,而且它必然如此:这张网上大多数点只连一两条线,你随手一抓,抓到的几乎一定是这种点。

挑着拿的那次,同样是 3 个点,网碎成了 11 块,最大的一块只剩 45 个点,而剩下这块内部的平均距离从 3.81 步涨到 5.21 步。拿掉的东西一样多,破坏差了一个数量级。

这不是我编的玩具现象。2000 年 Albert、Jeong 和 Barabási 在《自然》上做了同一件事,用的是当时能拿到的真实网络数据。他们的结论后来被引用了上万次:随机移除节点,网络的平均路径长度几乎纹丝不动;而移除度数最高的 5% 的节点,网络直径直接翻倍。这篇文章给这个现象起了个流传很广的名字——阿喀琉斯之踵。

🎯 决策线

不要再问「这个系统抗不抗打」,问「抗谁打」。同一个系统在随机失效下的存活率和在挑着打时的存活率可以差一个数量级,所以任何一个不注明扰动来源的鲁棒性数字都是无效的。具体动作:把可靠性指标拆成两栏——随机失效下的最坏情况下的——两栏都填上才算数。只填了前一栏,你报的是一个和防御无关的数。

🌀 公共卫生 · 熟人免疫 按上面这条机制,要防住传播就得给枢纽打疫苗——可你并不知道谁是枢纽,挨个统计每个人的社交圈根本做不到。2003 年 Cohen、Havlin 和 ben-Avraham 给了一个绕过去的办法:随机找人,然后请他随便说出一个熟人的名字,去给那个熟人打。因为连得越多的人越容易被别人说出来,这一抽就自动偏向了尾巴。妙处在于它把本节的机制反过来用了一次——定点打击之所以厉害是因为它专挑尾巴,而这个办法证明了不知道谁是枢纽,也能抽到枢纽

EN One network, 61 nodes. Remove three at random and almost nothing happens — the largest cluster goes 61→57 and mean distance barely moves, because most nodes hold one or two links and a blind draw almost always takes one of those. Remove the three biggest instead and the same network splits into eleven pieces. Albert, Jeong and Barabási (Nature, 2000) found the same asymmetry in real data: random loss leaves path length untouched, while deleting the top 5% by degree doubles the diameter.

02不对称是从哪儿来的(Where the Asymmetry Comes From)

上面那个结果容易被读成一句鸡汤——「关键少数决定成败」。它不是。它是一个可以算出来的、有确切前提的统计事实,而且前提不满足的时候它就不成立。

把每个点连了几条线画成一张分布图(这个数量叫度数,degree),一切就清楚了。

两种拆法,抽的是同一张分布上完全不同的两段 一个点连了几条线(度数)→ 1 12 30 …309 尾巴到这儿 有多少个点(对数) 随机故障几乎总落在这儿(71% 的点只连 1–2 条) 定点打击只取这儿 拿掉了百分之几的点 → 0 50% 100% 最大连通块还剩多大 8% 就散架 随机拿掉 拿掉八成还连着 4% 同一张网:3651 个点,平均每点 3.2 条线,最大的一个点连了 309 条。κ = ⟨k²⟩/⟨k⟩ = 31
左:绝大多数点只连一两条线,随机故障几乎只碰得到它们。右:同一张网,两种拆法的后果差了一个数量级。

左边这张图是一张 3651 个点的网。71% 的点只连 1 到 2 条线,而最大的那个点连了 309 条。随机故障和定点打击,抽的是这同一张图上完全不同的两段。随机抽相当于闭眼往这张图上扔一个飞镖——它压倒性地落在左边那堆矮柱子上,也就是那些拿掉了谁也不心疼的点。定点打击只从最右边那条又长又扁的尾巴里取。

右边是后果。随机拿掉八成的点,剩下的还有 4% 连成一片;而挑着拿,只要 8% 就散架了。

能把这件事说死的是一个很朴素的量。要判断一张网还连不连得起来,看的不是平均每个点连几条,而是「顺着一条线走到某个点,从这个点还能继续往前走几条线」。这个数记作 κ(读作 kappa),算法是:把每个点的度数平方后取平均,再除以平均度数。κ 大于 2,网就连得成一片;小于 2,就散。这条判据叫 Molloy–Reed 判据。

关键在于 κ 里那个平方。平方会让大数变得极其重要——一个连了 309 条线的点,在这个式子里的分量是一个连 2 条线的点的两万多倍。所以在这张网上 κ = 31,离散架的门槛 2 远得离谱。这个巨大的安全垫几乎全部由那几个最大的点提供。随机拿走的点对 κ 没什么影响;拿走那几个大的,κ 直接塌下来。

这就把两件看起来无关的事拧成了一件:让它抗随机故障的那个「安全垫」,和让它怕定点打击的那个「靶子」,在数学上是同一项。2000 年 Cohen 等人算过一个具体的例子:以当时互联网实测的度分布,随机移除节点要移掉 99% 以上,它才会断成碎片。而次年同一批人算定点打击,答案掉到了百分之几。

🎯 决策线

在分配防御预算之前,先把度分布画出来,算一下 κ。κ 远大于 2:你的系统属于「随机故障几乎打不垮、但存在极少数要命节点」这一类,预算应该压到排序头部的那几个上,加固中位数节点是浪费。κ 接近 2:没有捷径可走,只能整体加固——这时候还去找「关键少数」就是在编故事。这两句话对应的是完全相反的花钱方式,而区分它们只需要一次统计。

🌀 经济与制度 · 藏在三级供应商里的那个点 2011 年日本地震之后,全球车厂陆续停产,原因不是自己的工厂或直接供应商出事,而是一家叫瑞萨(Renesas)的公司——它当时占全球车用微控制器(microcontroller,简称 MCU,就是控制安全气囊、刹车、发动机的那种芯片)四成以上的份额,而且很多型号是为某一家车厂定制、只此一家。度分布极不均匀的网络里,最大的那个点不必和你相邻;车厂例行审计的是一级供应商,也就是自己的直接邻居,而枢纽藏在三级。所以「我们已经审过所有直接供应商」这句话,在重尾的供应网络里几乎不提供保障。

EN Both halves of the asymmetry come from one quantity. Whether a network holds together is governed by κ = ⟨k²⟩/⟨k⟩ — roughly, how many further links you find after arriving at a node — and it holds together while κ > 2 (the Molloy–Reed criterion). The square makes the largest nodes dominate: in the network above κ = 31, and nearly all of that cushion is supplied by a handful of nodes. The cushion that absorbs random loss and the target list an attacker would use are the same term in the same formula.

03这不只是网络的事:鲁棒是一笔预算(Robustness Is a Budget, Not a Virtue)

到这里为止,「鲁棒但脆弱」看起来是无标度网络的一个特产。它不是。度分布只是其中一种实现方式;这个模式在完全没有网络的系统里同样出现,而且原因更根本。

1990 年代末,Jean Carlson 和 John Doyle 提出了一个说法,他们叫它高度优化的容错(highly optimized tolerance,缩写 HOT)。意思很直白:一个系统之所以能扛住某类扰动,是因为有人(或者演化、或者市场)针对那一类扰动做了优化。而优化总要花掉某种有限的东西——重量、成本、时间、复杂度。花在这儿,就没花在别处。

两条曲线下的面积一样大 — 加固不是增加总量,是搬运 可能遇到的各种扰动 → 扛得住的程度 通用系统:处处一般,处处不死 优化过的系统 设计时假定的那类扰动 没被算进来的那类扰动 这里反而比通用系统更差 示意图:横轴不是数值,是「扰动的种类」;要看的是形状,不是刻度
加固不是往系统里注入了什么,是把脆弱性从一处搬到了另一处。曲线的形状才是要点,横轴没有刻度。

左边那条平的蓝线是一个没被优化过的东西:哪种扰动来了都表现平平,但也哪种都不会一下子死掉。橙色那条是被精心优化过的:在设计时假定的那类扰动上,它的表现高得离谱;而在假定之外的地方,它比那个平庸的家伙还差。两条曲线下的面积一样大。加固不是往系统里增加了什么,是把它从一个地方搬到了另一个地方。

这解释了很多看起来不相干的事共享同一个形状。客机对机械故障的容忍度高到惊人(多重冗余、无数次试飞),但对一类没被想到的软件状态可以毫无抵抗。免疫系统能处理它见过的病原体谱系,代价是自身免疫病——它把「敌我识别」这件事赌在了一套假设上。而上一节那张网的鲁棒性,其实也是这套账:它对随机失效的优化,是通过把连接集中到少数点上买来的。

这里要小心一个真实的危险:「鲁棒但脆弱」这句话可以被说得永远正确——任何东西都对某些事结实、对另一些事脆弱,说了等于没说。让它变成一个可检验的命题,只需要补两样东西:①你说的是对哪一类扰动结实;②你付出的脆弱落在哪一类扰动上。说不出第二条,就说明你还没找到它,而不是说明它不存在。

🎯 决策线

每写下一条「我们对 X 很鲁棒」,就在旁边强制写下「代价是对 Y 更脆弱」。这不是修辞平衡,是查账:加固动作几乎总是把脆弱性搬到了别处(冗余搬到了协调复杂度上,缓存搬到了一致性上,多签搬到了响应速度上)。具体动作:设计评审加一栏「本次加固把脆弱性转移到了哪里」,这一栏空着不许通过。

🌀 工程与技术史 · 田老的防潮堤 岩手县田老在 1896、1933 两次海啸之后,从 1934 年起修了一道总长 2.3 公里、高 10 米的防潮堤,人称「万里长城」,连撤离道路都设计成能一眼望见海面。2011 年来的浪高约 16 米,直接漫过去,这个地区约 200 人死亡或失踪。按本节的账目看,这道墙不是「修得不够高」——它是对一类扰动(设计基准以内的海啸)优化到了极致,代价刚好落在另一类(超出基准的海啸)上,而且还多付了一笔:墙太可靠,撤离这个习惯本身就退化了。所以事后得出「下次修更高」这个结论,是把同一笔账又签了一遍。

EN The pattern is not specific to networks. Carlson and Doyle's highly optimized tolerance (HOT) says a system survives a class of disturbance because something was spent optimising against that class — weight, cost, time, complexity — and what is spent there is not available elsewhere. The optimised system beats the generic one inside its design class and loses to it outside. To keep the phrase falsifiable you must name both halves: which class it is robust to, and which class the fragility was moved onto.

04这套说法在哪儿不成立(Where This Breaks Down)

「找出枢纽,然后保护它」是本期最容易被端走的一句话,也是最容易用错的一句。下面四条,用之前每条都得过一遍。

第一,打击需要一份别人不一定有的名单。前面所有的定点打击都默认攻击者知道整张图。这个假设在互联网上大致成立(拓扑是公开可测的),在恐怖袭击或商业竞争里往往不成立。也就是说,那个吓人的阈值描述的是知道地图的攻击者的能力上限,不是任何一次真实攻击的期望值。把它当成后者,会把防御预算压在错误的场景上。

第二,「哪张地图」这件事本身就可能是错的。网络拓扑通常不是量出来的,是出来的——用爬虫、用路由探测、用问卷、用组织架构图。而不同的采集方式会系统性地造出不同的枢纽。Willinger、Alderson 和 Doyle 一直在做的那件事就是这个:路由器层面的互联网被广泛报道为无标度,而按他们的分析,那条重尾很大程度上是探测方法的产物;真实的路由器网络受硬件和带宽约束,高连接度的设备主要出现在网络边缘,核心反而是少数高带宽、低连接数的设备。如果地图上的枢纽是测法造的,那么按这张图去加固,加固的是一个不存在的东西。

第三,能连上不等于能用。前面所有的图,衡量的都是「还连不连得起来」。这是一个纯拓扑的口径,而现实系统关心的是功能:电送不送得到、包转不转得动、货发不发得出。这两个口径可以给出完全相反的答案。

同一张网,只拿掉一个点 — 两种口径给出完全相反的答案 只看连通:还剩 96% 拿掉负载最高的那个点 拿掉一个普通点 +0% +10% +20% +30% +50% +80% +120% 每个点比平时多留了多少余量 → 事后还能用的比例 两种口径的差距 同一张网(485 个点)。负载按「有多少条最短路要过这个点」算;过载的点也停掉,再重算,直到不再有人过载
同一张网,同一个动作。连通性口径说「96% 还连着」,负载口径说「只剩 19% 能用」。

上图做的事很简单:给每个点算一个负载(有多少条最短路要经过它),再给每个点一个容量(比平时的负载多留一点余量),然后只拿掉负载最高的那一个点,让它的负载分给别人,谁超了谁也停,如此往复。纯看连通性,拿掉一个点之后 96% 的节点还连在一起——什么都没发生。而如果每个点只留了 10% 的余量,最后还能用的只剩 19%。同一张网、同一个动作,两种口径一个说没事,一个说塌了大半。

这种「结构完好、功能失效」的错位在别处也有现成的教训。心脏科很长一段时间按造影上的狭窄百分比决定要不要放支架,也就是看「管腔还通不通」;后来改用直接测血流的指标(血流储备分数,fractional flow reserve),因为狭窄程度和缺血与否经常对不上。凡是「通不通」型的指标,都得配一个「够不够」型的指标,否则报出来的健康度是假的。顺便说一句,上面那种负载重分配的连锁反应本身是第 25 期的主题,这里只用它说明一件事:拓扑口径不等于功能口径。

第四,很多现实网络根本没有那条重尾。「基础设施都是无标度的、都有阿喀琉斯之踵」是这个概念被推销得最过头的地方。北美电网的度分布经过检验是指数型的,不是幂律——大多数变电站连的线路数量都差不多,不存在连着几百条线的超级枢纽。有意思的是电网确实很怕定点打击,但原因不在度分布,而在潮流怎么重新分配。同一个现象(鲁棒但脆弱)可以由完全不同的机制产生,看到现象就套上枢纽解释,是本期最该防的错误。

🎯 决策线

动手保护枢纽之前,先过三道关:①这张拓扑图是怎么测出来的,换一种独立的采集方式还排在前面吗(只信两次都靠前的节点);②「重要」是按连通性算的还是按负载算的,两个排名一样吗;③这个系统的度分布真的重尾吗,还是它只是看起来有关键少数。三道关有一道过不了,「找枢纽」这个动作就该换成「整体加余量」。

🌀 天文学 · 望远镜造出来的趋势 巡天观测里有一个人人都要改正的偏差:望远镜只看得见足够亮的天体,所以越远的地方,能进入样本的就越是那些本身最亮的,于是「宇宙越远越亮」这个趋势就凭空长了出来。它叫马尔姆奎斯特偏差(Malmquist bias),处理办法是把仪器的选择函数写进模型再反解。网络这边跑的是同一条机制——测量方式决定了什么能进样本——但配套动作还没建立起来:天文学家不会不带选择函数就报一条趋势线,而一份用爬虫抓出来的枢纽榜,通常连「怎么抓的」都不附。

EN Four limits. An attack presupposes a map the attacker may not have. The map itself is usually inferred rather than measured, and the inference manufactures hubs — Willinger, Alderson and Doyle argue the router-level Internet's heavy tail is largely an artefact of probing. Connectivity is not function: removing the single busiest node above leaves 96% of nodes connected while only 19% still work once load redistribution is counted. And many real infrastructures are not heavy-tailed at all — the North American power grid's degree distribution tests as exponential, so its fragility runs through flow, not through hubs.

🎒 场景 · BigCat

  1. 工程与系统设计反复发生的情境:每季度做一次故障演练,随机挑一台实例杀掉,季度报告写「演练 12 次全部自愈」。按本期第一节,这个演练抽的是分布的躯干,它在构造上就不可能找到枢纽——次数再多也不行。可改的东西:把演练清单从「随机一台」换成「按有多少个服务在启动路径里依赖它排序,杀第一名」。排出来的往往是内部 DNS、配置中心、CI 的制品仓库、某个对象存储桶——这些东西从来不在演练清单里,恰恰因为它们不属于任何一个业务团队,没人拥有的东西就没人演练。停掉的动作:把「随机演练全绿」写进韧性达标的证据。
  2. 带团队与组织反复发生的情境:某人休长假或离职,才发现有件事只有他会,然后结论永远是「要补文档」。补文档是在提高整体余量,而问题是定点的。可改的东西:不等人走,每季度指定一个人整周不接任何询问——消息真的转给别人,不做例外——看哪些流程当场停住。这是在做定点移除演练,而日常的零星请假是随机移除,永远暴露不出枢纽。要看的指标也换一个:不是文档覆盖率,而是上周有多少条决定必须经过同一个人。停掉的动作:用「团队里没有不可替代的人」当口号——它把一个本来可测的量变成了不能提的话题。
  3. 健康与精力反复发生的情境:临时插进来一件事,你按「哪一项最容易挪」来腾时间。一周的日程里大部分安排怎么挪都行,但有一两项是别的事都挂在它上面的——固定的入睡时间、那段没有交付物的空白。而最容易挪的,恰恰就是它们,因为它们没有议程、没有对方在等、挪了当场没人有意见。按本期的说法,这不是意志力问题,是你的挑选规则天然瞄准了枢纽。可改的东西:给日程里每一项标一个数——有多少件别的事的状态取决于它——然后只按这个数排优先级,不按紧急度。停掉的动作:「这周先挪一下休息,下周补回来」。

🌀 越界 · 跨学科的联想(Crossings)

深入思考(Going Deeper)

如果枢纽既是优势又是弱点,为什么演化和市场还是不停地长出枢纽?

因为「有枢纽」在别的维度上很便宜:路径短、协调成本低、建设成本低。定点打击这一类扰动在大多数系统的历史里出现频率极低,而随机失效天天发生。按第三节的记账法,把预算压在高频扰动上是理性的。危险只在于假设变了却没人重算——一个从来没有对手的系统里长出的结构,遇上第一个对手时,脆弱性是现成的。

把枢纽拆散、把度分布压平,是不是就安全了?

不是免费的。压平度分布会拉长平均路径、抬高协调成本,而且会把系统推向「哪儿都不太行」的那条平线。真正的问题不是要不要压平,而是你面对的扰动分布是什么样的:随机失效为主就保留枢纽,存在有目标的对手就付钱压平。这个决定没有通用答案,因为它依赖的不是系统的结构,是系统的环境。

「找出你的枢纽」这个建议,会不会本身就在制造枢纽?

很可能会。一旦某个节点被正式认定为关键,资源、流量、审批权都会向它集中,它的度数于是继续上升——这是第 22 期那条优先连接规则的一个自我实现版本。所以「识别关键节点」这个动作应该配一个反向动作:识别之后立刻问「怎么让它变得不那么关键」,而不是「怎么保护它」。

一个系统能不能同时对随机失效和定点打击都很结实?

在纯拓扑的层面上,理论上存在同时兼顾两者的度分布(大致是双峰的),但代价是连接数要多得多。更现实的答案在第三节:这个问题问的是预算够不够,不是形状对不对。所以真正要谈的是你愿意为哪一类扰动付多少钱,以及第三类扰动来的时候你打算怎么办。

延伸阅读(Further Reading)