跳转到内容
← 返回先驱
网络1951–约 15 分钟阅读

拉迪亚·珀尔曼

Radia Perlman

生成树IS-ISTRILL网络协议

1985 年,拉迪亚·珀尔曼(Radia Perlman)给扩展局域网里的网桥写了一份分布式算法:选出根桥,计算到根的最短路径,阻塞多余端口,让有环的网状连线在逻辑上变成一棵树。没有这棵树,广播帧会沿环无限复制,交换机的转发平面会在几毫秒内把自己淹没。后来的 IEEE 802.1D 把这套算法称为生成树协议(STP)。互联网没有因此“诞生”,以太网却因此可以在真实楼宇里被插成网状而不立刻崩溃。

关于转发表、最长前缀匹配与自治系统,路由与交换 已经写过。本篇不再把控制面与数据平面的分层图重画一遍。这里要看的是珀尔曼怎样把图论里的生成树做成容错的分布式协议,以及她为何公开讨厌“互联网之母”这种把协议写成神话的称呼。

破除误解:她不是互联网之母,生成树也不是路由

第一层误解来自媒体头衔。IP 协议、TCP 与早期 ARPANET 的作者名单里没有她。珀尔曼的主场是网桥、链路状态路由(IS-IS)以及后来允许网状以太网使用多条路径的 TRILL。把她写成“互联网的母亲”,既擦掉了文顿·瑟夫、卡恩、克拉克等人的工作,也把网桥层的问题抬到了错误的层次。她本人多次要求停止使用这个头衔。

第二层误解把 STP 当成 最小生成树 的直接运行。克鲁斯卡尔与普里姆计算的是边权之和最小的树,通常在一张已知图上离线完成。STP 必须在交换机只能看见邻居、标识可能重复、链路会抖的环境里运行,目标首先是无环且连通,根的选择用桥 ID 打破平局,而不保证全局带宽最优。把 STP 说成“分布式的 Kruskal”,会低估协议必须处理的计时器、老化与坏根。

第三层误解把 IS-IS 当成 OSPF 的附属品。IS-IS 起源于 DECnet,后被用来承载 IP。它是链路状态协议:每台路由器描述自己的邻接,全网同步同一张图,再各自计算最短路径。OSPF 更常出现在教科书里,不等于 IS-IS 是边角。数据中心与部分运营商至今仍在跑 IS-IS。层次选择是工程史,不是正确性排序。

现场:BBN、DEC 与 ethereal 的环

珀尔曼 1951 年生,在 MIT 完成本科与硕士,1988 年在 MIT 取得博士学位,论文讨论网络层协议在拜占庭故障下的稳健性,导师传统上归入克拉克所在的网络与系统脉络。她的职业路径经过 BBN、DEC、Sun、Intel。DEC 的局域网产品需要在客户把同轴电缆插成环时仍能工作——不是因为客户懂图论,而是因为冗余线会被当成可靠性。

生成树的现场约束非常具体。网桥必须转发以太网帧,不能改写第三层;必须允许临时环,因为物理冗余是需求;必须在秒级收敛,否则广播风暴先于任何人工干预到来。算法因此被设计成:周期发送配置消息(BPDU),比较根 ID、到根的代价、发送者桥 ID 与端口 ID,用字典序选出每个端口的角色:根端口、指定端口或阻塞端口。阻塞端口仍接收 BPDU,以便拓扑变化时唤醒。这是控制面,不是把用户帧沿树“智能地”改道。

同一时期她把 DECnet 的路由思想写成 IS-IS。链路状态把故障局部化:邻居消失就淹没一条新的链路状态通告,而不是等待距离向量的无穷计数。图的遍历 在每台路由器内部发生,对象是已经同步的拓扑图。协议的难点不在 Dijkstra 本身,而在淹没、分片、认证与多级区域,以免一张校园网变成一台全球计算机。

BPDU 的比较键必须写全,否则实现会对“看起来差不多的根”振荡。优先级最高的是根桥 ID,其次是到根的路径代价,再是发送者桥 ID 与端口 ID。字典序保证全网在同一份信息下选出同一棵树。消息带年龄,转发时递增,超过最大年龄则丢弃——这是在没有全局时钟时模拟“这份通告已经过期”。Hello 间隔、转发延迟与最大年龄三个计时器,是活性的全部预算。调短会更快,也会把抖动放大成整树重算。1985 年的论文把这些定时器当成协议的一部分,而不是运维旋钮。

她为生成树写的小诗 Algorhyme 不是余兴。诗句对应算法步骤:我是根、我的代价、若你更好则我让路、阻塞以免成环。工程师能背诗,就能在凌晨排障时想起不变量。把协议写成可背的短句,是一种把正确性从手册里救出来的工程技术。媒体头衔做不到这一点。

机制:无环不变量,以及后来为何要打破它

STP 维护的不变量是:转发拓扑是一棵以根为根的树。证明思路是局部的。每个网段恰好有一个指定端口负责向根方向转发;每个非根桥恰好有一个根端口。环意味着某个网段有两条通向根的活动路径,这会与“指定端口唯一”冲突。协议用计时器保证旧信息死亡,用消息年龄防止坏消息永久循环。失败模式也因此清楚:根桥抖动会导致整树重算;计时器过长则收敛慢,过短则不稳定。生成树用稳定性换来了备用链路在平时不被用来承载流量。这是显式的带宽牺牲。

TRILL(Transparent Interconnection of Lots of Links)与后来的最短路径桥接,是对这道牺牲的修正。珀尔曼等人把链路状态路由引进以太网转发:网桥用 IS-IS 计算到每个网桥的最短路径,用封装避免环,允许所有链路同时转发。生成树的无环不变量被“路由到网桥、再解封装”替换。旧协议没有错,它的目标函数变了:从“宁可闲置也要无风暴”变成“在无风暴前提下用满网状”。新旧之间是目标函数,不是道德进步。

拜占庭稳健的博士论文把对手写成可以撒谎的路由器。洪泛与转发必须在恶意节点存在时仍把诚实节点的消息送达。这与 TCP 与可靠传输 的端到端可靠不同:TCP 假设下层只是丢包与乱序,不假设邻居在拓扑上撒谎。网络层若要在撒谎下仍转发,必须给消息加源认证与冗余路径。论文的结论克制:完全的拜占庭路由昂贵,但可以在特定故障模型下给出协议。后来的安全路由研究仍在这条缝里工作。

她与考夫曼等人合写的《Network Security》把密钥分配、认证与防火墙写成工程师可读的机制,而不是产品目录。贯穿写法与兰普森类似:先写对手能做什么,再写协议挡住哪一类,承认挡不住哪一类。

IS-IS 的淹没必须在有限带宽上完成全网同步。链路状态协议的正确性依赖:每台路由器最终持有同一组通告,再各自跑最短路径。分片、序列号与老化防止旧图复活。认证防止伪造邻接。多级区域把一张大图切成可计算的块,代价是区域边界上的信息压缩——压缩就是故意的不精确。珀尔曼把这些机制写进可以配置的协议,而不是留在“理论上 Dijkstra 就够了”。距离向量的无穷计数在教科书里更有名,是因为失败模式戏剧化;链路状态的失败模式更隐蔽:数据库不一致会让两台路由器对同一目的算出互相矛盾的下一跳,形成黑洞或微环。协议的大部分篇幅用来对付这种不一致,而不是用来解释最短路径。

以太网学习桥在无环时靠源地址学习即可;有环时学习表会抖动,广播会放大。STP 先保证无环,学习才有意义。层次一旦写反——先追求多路径再补无环——广播风暴会在控制面收敛前到达。这是 1985 年把生成树放在网桥层的理由,也是后来 TRILL 必须用封装另开控制面的理由。

代价与争议

STP 在数据中心成为被骂得最多的协议之一。阻塞链路等于把花钱买的带宽闲置;根桥故障的收敛以秒计,对东西方流量不友好。厂商私有的快速生成树、多实例生成树试图修补,增加了状态。批评若停在“STP 很蠢”,忽略了 1985 年的目标函数。公平的说法是:协议精确完成了当时的约束,目标函数过期之后应当换协议,而不是羞辱原作者。

“互联网之母”头衔造成的伤害是真实的。它把女性工程师的可见性寄托在一个不准确的隐喻上,既让同行反感,也让学生学不到网桥与路由的层次。珀尔曼选择用一首关于生成树的小诗 Algorhyme 来解释算法,而不是接受神话。教学上这更有效:诗句对应的是根、代价与阻塞,不是起源故事。

IS-IS 与 OSPF 的宗教战争消耗过太多会议时间。可检查的差异在于编码、网络类型假设与是否把 IP 当成唯一客户。选择应当由运维约束决定。把其中之一写成“标准、因而正确”,是把 IETF 的流行程度当成定理。

跨域连接

  • 图论:生成树协议把“图有环则广播会爆炸”写成必须在分布式条件下维护的不变量。根、层、阻塞端口对应树的顶点层级与树边。图论保证连通无环图是树;协议保证在信息不完整时仍向这张图收敛。失败时图会短暂成环或分裂,计时器是对这张图论定理的工程近似。TRILL 则把同一张物理图改回可走多条最短路径的有向转发图。
  • 组合数学:桥 ID、端口 ID 与代价组成字典序,用来在对称图上打破平局。没有这套全序,两个根会竞争,树会振荡。组合上这是给每条边一个可比较的标签,使最大(或最小)生成树在分布式消息下唯一。平局打破看起来像实现细节,实际上是唯一性证明的一部分。任意对称数据中心拓扑若标签分配不当,就会把组合平局变成流量黑洞。
  • 证明:无环不变量是可证的安全性质,活性则依赖计时器与“坏根终将过期”。证明必须分开:安全不依赖同步,收敛依赖消息最终到达。拜占庭版本再把“消息来自声称的发送者”加成假设。网络协议的论文若只给状态机不定理,事故后无法判断是实现错了还是定理根本没有。珀尔曼把算法写短,是为了让这两类性质能被检查。
  • 国家能力:交换与路由是公共通信能力的地下层。校园、市政与国家骨干必须在冗余与风暴之间做同一道权衡:物理上要网状,逻辑上要无环或可路由。生成树曾让不会配置 OSPF 的机构也能插冗余线。能力体现在能否把这层协议的目标函数随流量变化升级——从 STP 到链路状态桥接——而不把升级写成一次国家级中断。协议选择是制度能力,不只是厂商清单。

人物小记:把环写成可以阻塞的边

珀尔曼反复做的事情是:承认物理拓扑会被插成人们喜欢的样子,然后在控制面给出仍能转发的逻辑拓扑。生成树、IS-IS、TRILL 是三次对同一诚实态度的回答。她拒绝起源神话,是因为神话会妨碍读协议。算法诗比头衔更接近她的品味:句子短,对象是根与代价。

若把轨迹压成一句判据:好的网络贡献,是让后来者无法再把连通、无环与最短路径当成可以同时免费获得的三个性质。 生成树牺牲了第三条以保住前两条;后来的协议把第三条买回来,代价是更复杂的控制面。层次必须写明。写明之后,头衔就变得不重要。

网桥学习与生成树必须按这个顺序叠加。无环之后,源地址学习才稳定;有环时同一源会从两个端口出现,转发表抖动,单播也会变成类似广播的复制。层次写反的故障在机房里仍会重演:先开多链路聚合再忘记哪一层负责无环。珀尔曼把顺序写进协议栈,是因为以太网的转发平面比控制面更快——错误的帧会先到达。这不是风格问题,是两种平面的速度差。

博士论文里的拜占庭假设把“邻居停机”和“邻居撒谎”分开。生成树要维护的是无环连通,默认部署往往假设网桥通告真实,并不把「控制报文的来源是否可验证」写成硬条件。威胁模型一旦包含撒谎的节点,诚实网桥之间仍可能收敛到一棵树,但这棵树不必对应物理上合理的根——那是认证缺失,不是图论失败。把论文与 SIGCOMM 1985 对读,才能看见她后来为何坚持把认证写进链路状态:拓扑声明若无法核对来源,最短路径就只是一张无法信任的图。

计时器是这份贡献里最容易被课件删掉的部分。Max Age、Forward Delay、Hello Time 把「最终无环」从定理变成带时钟的协议。把时钟设错,要么收敛像地质年代,要么瞬态环把局域网打满。RSTP 握手加快的是这些时钟,不是改写图论。读她的 SIGCOMM 论文,应把计时器与 BPDU 字段一起读;只记住「选一棵树」,会在机房里重新发明风暴。

IS-IS 把链路状态洪泛的会计——LSP、序列号、老化——写成可在分区愈合后仍安全的规则。旧通告复活是分布式系统的经典事故。她的博士论文还把拜占庭故障放进网络层:盒子不仅会停,还会说谎。生成树默认假设网桥大致诚实;把这条假设写明,比把协议吹成永远安全有用。

RSTP 用提议/同意握手缩短转发延迟,并不是改写「指定端口唯一」这条安全性质。它改的是活性:旧信息死亡得更快,端口从阻塞走到转发不必再等一个完整的转发延迟。握手失败或定时器仍按 802.1D 设,现场会退回慢收敛。数据中心后来改用最短路径桥接或覆盖网络,是因为即使加速后的生成树,仍把多数链路闲置。目标函数变了:东西方流量不能再把带宽当成备用零件。读协议迁移,应先写目标函数,再写状态机差异。

TRILL 用 IS-IS 计算到网桥的最短路径,再用 nick 与封装保证解封装前不把用户帧漏进环。控制面与数据面再次分层:学习桥的源地址表不再承担无环责任。封装的税是额外头与 MTU,收益是网状链路可以同时转发。珀尔曼参与这条线,等于公开承认 1985 年的牺牲可以赎回,赎回不是免费的。把 TRILL 写成「生成树的纠正」,会把两次不同的目标函数收成一次道歉。两次都对,约束不同。

参考文献

  • Perlman, R. An Algorithm for Distributed Computation of a Spanning Tree in an Extended LAN. ACM SIGCOMM, 1985, pp. 44–53.(生成树协议的会议原论文)
  • Perlman, R. Interconnections: Bridges, Routers, Switches, and Internetworking Protocols. 2nd ed., Addison-Wesley, 1999.(网桥与路由的机制教材)
  • Perlman, R. Network Layer Protocols with Byzantine Robustness. PhD dissertation, MIT, 1988.(拜占庭故障下的网络层)
  • Perlman, R. et al. Routing Bridges (RBridges): Base Protocol Specification. RFC 6325, IETF, 2011.(TRILL)
  • Kaufman, C., Perlman, R. & Speciner, M. Network Security: Private Communication in a Public World. 2nd ed., Prentice Hall, 2002.(网络安全机制)

延伸阅读

  • IEEE Std 802.1D. Media Access Control (MAC) Bridges. IEEE, 2004.(把生成树写进标准的文本,便于对照算法与计时器)