同一个系统,可以既是最抗造的,又是最好拆的(One system can be both the toughest and the easiest to break)
2026-08-09 · 网络
互联网每天都有成千上万台设备掉线,你毫无察觉。但同一张网上存在几百个位置,只要同时拿掉它们,它就散成一地碎片。这两句话说的是同一张网,而且它们互为因果——让它扛得住第一件事的那个结构,正是让它扛不住第二件事的那个结构。
先做个对照。一条铁路线,中间任何一站出事,两头就断了;每一站都同样重要,也同样致命。这种系统的好处是没有意外——你知道风险均匀地摊在每一处。
而上一期讲的那种有枢纽的网络完全不是这样。它的容错能力高得反常:可以持续损失节点而几乎不受影响。但这份反常的结实不是因为它更冗余、更用心、更结实,而是因为它绝大多数的点本来就无关紧要。同一个理由反过来说就是:极少数的点承担了几乎全部的连接,而它们的位置是公开可算的。抗随机故障的能力和怕定点打击的毛病,是同一件事的两面,不是两个性质。你不可能只留下前者。
与邻近几期的分工先说清楚:第 22 期讲枢纽是怎么长出来的(以及「无标度」的证据有多硬);本期讲有了枢纽之后会怎样,以及这个结论能推广到多远;第 25 期讲一次失效如何沿着网络级联放大。本期不讲级联的动力学,只讲一件事——系统对什么结实、对什么脆,是同一笔账的正反两栏。
下面这张网有 61 个点、80 条连线。它长得很不平均:最大的那个点连了 14 条线,而超过三分之一的点只连了 1 条。这种「少数点连很多、多数点连很少」的结构,上一期给过它一个名字——无标度(scale-free),意思是「一个点通常连几条」这个问题没有答案,因为不存在典型值 → 参考 · 优先连接模型。
现在做两次实验,两次都只拿掉 3 个点(5%),唯一的区别是怎么挑。第一次闭着眼睛随机抽;第二次挑连线最多的三个。
随机那次,几乎什么都没发生:最大的一块从 61 个点变成 57 个,点与点之间的平均距离从 3.81 步变成 3.71 步——反而略短了一点,因为被切掉的正是几条挂在外围的尾巴。这不是运气好。这是 300 次随机抽样的中位结果,而且它必然如此:这张网上大多数点只连一两条线,你随手一抓,抓到的几乎一定是这种点。
挑着拿的那次,同样是 3 个点,网碎成了 11 块,最大的一块只剩 45 个点,而剩下这块内部的平均距离从 3.81 步涨到 5.21 步。拿掉的东西一样多,破坏差了一个数量级。
这不是我编的玩具现象。2000 年 Albert、Jeong 和 Barabási 在《自然》上做了同一件事,用的是当时能拿到的真实网络数据。他们的结论后来被引用了上万次:随机移除节点,网络的平均路径长度几乎纹丝不动;而移除度数最高的 5% 的节点,网络直径直接翻倍。这篇文章给这个现象起了个流传很广的名字——阿喀琉斯之踵。
不要再问「这个系统抗不抗打」,问「抗谁打」。同一个系统在随机失效下的存活率和在挑着打时的存活率可以差一个数量级,所以任何一个不注明扰动来源的鲁棒性数字都是无效的。具体动作:把可靠性指标拆成两栏——随机失效下的和最坏情况下的——两栏都填上才算数。只填了前一栏,你报的是一个和防御无关的数。
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.
上面那个结果容易被读成一句鸡汤——「关键少数决定成败」。它不是。它是一个可以算出来的、有确切前提的统计事实,而且前提不满足的时候它就不成立。
把每个点连了几条线画成一张分布图(这个数量叫度数,degree),一切就清楚了。
左边这张图是一张 3651 个点的网。71% 的点只连 1 到 2 条线,而最大的那个点连了 309 条。随机故障和定点打击,抽的是这同一张图上完全不同的两段。随机抽相当于闭眼往这张图上扔一个飞镖——它压倒性地落在左边那堆矮柱子上,也就是那些拿掉了谁也不心疼的点。定点打击只从最右边那条又长又扁的尾巴里取。
右边是后果。随机拿掉八成的点,剩下的还有 4% 连成一片;而挑着拿,只要 8% 就散架了。
能把这件事说死的是一个很朴素的量。要判断一张网还连不连得起来,看的不是平均每个点连几条,而是「顺着一条线走到某个点,从这个点还能继续往前走几条线」。这个数记作 κ(读作 kappa),算法是:把每个点的度数平方后取平均,再除以平均度数。κ 大于 2,网就连得成一片;小于 2,就散。这条判据叫 Molloy–Reed 判据。
关键在于 κ 里那个平方。平方会让大数变得极其重要——一个连了 309 条线的点,在这个式子里的分量是一个连 2 条线的点的两万多倍。所以在这张网上 κ = 31,离散架的门槛 2 远得离谱。这个巨大的安全垫几乎全部由那几个最大的点提供。随机拿走的点对 κ 没什么影响;拿走那几个大的,κ 直接塌下来。
这就把两件看起来无关的事拧成了一件:让它抗随机故障的那个「安全垫」,和让它怕定点打击的那个「靶子」,在数学上是同一项。2000 年 Cohen 等人算过一个具体的例子:以当时互联网实测的度分布,随机移除节点要移掉 99% 以上,它才会断成碎片。而次年同一批人算定点打击,答案掉到了百分之几。
在分配防御预算之前,先把度分布画出来,算一下 κ。κ 远大于 2:你的系统属于「随机故障几乎打不垮、但存在极少数要命节点」这一类,预算应该压到排序头部的那几个上,加固中位数节点是浪费。κ 接近 2:没有捷径可走,只能整体加固——这时候还去找「关键少数」就是在编故事。这两句话对应的是完全相反的花钱方式,而区分它们只需要一次统计。
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.
到这里为止,「鲁棒但脆弱」看起来是无标度网络的一个特产。它不是。度分布只是其中一种实现方式;这个模式在完全没有网络的系统里同样出现,而且原因更根本。
1990 年代末,Jean Carlson 和 John Doyle 提出了一个说法,他们叫它高度优化的容错(highly optimized tolerance,缩写 HOT)。意思很直白:一个系统之所以能扛住某类扰动,是因为有人(或者演化、或者市场)针对那一类扰动做了优化。而优化总要花掉某种有限的东西——重量、成本、时间、复杂度。花在这儿,就没花在别处。
左边那条平的蓝线是一个没被优化过的东西:哪种扰动来了都表现平平,但也哪种都不会一下子死掉。橙色那条是被精心优化过的:在设计时假定的那类扰动上,它的表现高得离谱;而在假定之外的地方,它比那个平庸的家伙还差。两条曲线下的面积一样大。加固不是往系统里增加了什么,是把它从一个地方搬到了另一个地方。
这解释了很多看起来不相干的事共享同一个形状。客机对机械故障的容忍度高到惊人(多重冗余、无数次试飞),但对一类没被想到的软件状态可以毫无抵抗。免疫系统能处理它见过的病原体谱系,代价是自身免疫病——它把「敌我识别」这件事赌在了一套假设上。而上一节那张网的鲁棒性,其实也是这套账:它对随机失效的优化,是通过把连接集中到少数点上买来的。
这里要小心一个真实的危险:「鲁棒但脆弱」这句话可以被说得永远正确——任何东西都对某些事结实、对另一些事脆弱,说了等于没说。让它变成一个可检验的命题,只需要补两样东西:①你说的是对哪一类扰动结实;②你付出的脆弱落在哪一类扰动上。说不出第二条,就说明你还没找到它,而不是说明它不存在。
每写下一条「我们对 X 很鲁棒」,就在旁边强制写下「代价是对 Y 更脆弱」。这不是修辞平衡,是查账:加固动作几乎总是把脆弱性搬到了别处(冗余搬到了协调复杂度上,缓存搬到了一致性上,多签搬到了响应速度上)。具体动作:设计评审加一栏「本次加固把脆弱性转移到了哪里」,这一栏空着不许通过。
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.
「找出枢纽,然后保护它」是本期最容易被端走的一句话,也是最容易用错的一句。下面四条,用之前每条都得过一遍。
第一,打击需要一份别人不一定有的名单。前面所有的定点打击都默认攻击者知道整张图。这个假设在互联网上大致成立(拓扑是公开可测的),在恐怖袭击或商业竞争里往往不成立。也就是说,那个吓人的阈值描述的是知道地图的攻击者的能力上限,不是任何一次真实攻击的期望值。把它当成后者,会把防御预算压在错误的场景上。
第二,「哪张地图」这件事本身就可能是错的。网络拓扑通常不是量出来的,是推出来的——用爬虫、用路由探测、用问卷、用组织架构图。而不同的采集方式会系统性地造出不同的枢纽。Willinger、Alderson 和 Doyle 一直在做的那件事就是这个:路由器层面的互联网被广泛报道为无标度,而按他们的分析,那条重尾很大程度上是探测方法的产物;真实的路由器网络受硬件和带宽约束,高连接度的设备主要出现在网络边缘,核心反而是少数高带宽、低连接数的设备。如果地图上的枢纽是测法造的,那么按这张图去加固,加固的是一个不存在的东西。
第三,能连上不等于能用。前面所有的图,衡量的都是「还连不连得起来」。这是一个纯拓扑的口径,而现实系统关心的是功能:电送不送得到、包转不转得动、货发不发得出。这两个口径可以给出完全相反的答案。
上图做的事很简单:给每个点算一个负载(有多少条最短路要经过它),再给每个点一个容量(比平时的负载多留一点余量),然后只拿掉负载最高的那一个点,让它的负载分给别人,谁超了谁也停,如此往复。纯看连通性,拿掉一个点之后 96% 的节点还连在一起——什么都没发生。而如果每个点只留了 10% 的余量,最后还能用的只剩 19%。同一张网、同一个动作,两种口径一个说没事,一个说塌了大半。
这种「结构完好、功能失效」的错位在别处也有现成的教训。心脏科很长一段时间按造影上的狭窄百分比决定要不要放支架,也就是看「管腔还通不通」;后来改用直接测血流的指标(血流储备分数,fractional flow reserve),因为狭窄程度和缺血与否经常对不上。凡是「通不通」型的指标,都得配一个「够不够」型的指标,否则报出来的健康度是假的。顺便说一句,上面那种负载重分配的连锁反应本身是第 25 期的主题,这里只用它说明一件事:拓扑口径不等于功能口径。
第四,很多现实网络根本没有那条重尾。「基础设施都是无标度的、都有阿喀琉斯之踵」是这个概念被推销得最过头的地方。北美电网的度分布经过检验是指数型的,不是幂律——大多数变电站连的线路数量都差不多,不存在连着几百条线的超级枢纽。有意思的是电网确实很怕定点打击,但原因不在度分布,而在潮流怎么重新分配。同一个现象(鲁棒但脆弱)可以由完全不同的机制产生,看到现象就套上枢纽解释,是本期最该防的错误。
动手保护枢纽之前,先过三道关:①这张拓扑图是怎么测出来的,换一种独立的采集方式还排在前面吗(只信两次都靠前的节点);②「重要」是按连通性算的还是按负载算的,两个排名一样吗;③这个系统的度分布真的重尾吗,还是它只是看起来有关键少数。三道关有一道过不了,「找枢纽」这个动作就该换成「整体加余量」。
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.
因为「有枢纽」在别的维度上很便宜:路径短、协调成本低、建设成本低。定点打击这一类扰动在大多数系统的历史里出现频率极低,而随机失效天天发生。按第三节的记账法,把预算压在高频扰动上是理性的。危险只在于假设变了却没人重算——一个从来没有对手的系统里长出的结构,遇上第一个对手时,脆弱性是现成的。
不是免费的。压平度分布会拉长平均路径、抬高协调成本,而且会把系统推向「哪儿都不太行」的那条平线。真正的问题不是要不要压平,而是你面对的扰动分布是什么样的:随机失效为主就保留枢纽,存在有目标的对手就付钱压平。这个决定没有通用答案,因为它依赖的不是系统的结构,是系统的环境。
很可能会。一旦某个节点被正式认定为关键,资源、流量、审批权都会向它集中,它的度数于是继续上升——这是第 22 期那条优先连接规则的一个自我实现版本。所以「识别关键节点」这个动作应该配一个反向动作:识别之后立刻问「怎么让它变得不那么关键」,而不是「怎么保护它」。
在纯拓扑的层面上,理论上存在同时兼顾两者的度分布(大致是双峰的),但代价是连接数要多得多。更现实的答案在第三节:这个问题问的是预算够不够,不是形状对不对。所以真正要谈的是你愿意为哪一类扰动付多少钱,以及第三类扰动来的时候你打算怎么办。