Osprey 拒绝猜测的东西
我造出来最重要的东西,是一组拒绝
Michel Wijnberg
一个会猜的网络工具比一个承认自己不知道的工具更糟糕,而理由不是哲学上的,是运维上的。
如果一个工具说”我不知道”,您就会自己去查清楚。如果它给出一个看起来说得通的答案,您就 会照着它行动。而屏幕上没有任何东西能把正确的答案和自信的答案区分开,所以失效模 式不是”工具错了”,而是”工具错了,而我没有任何理由去核对”。
所以 Osprey 有一条压过我所有产品直觉的规则:**要么说出证据,要么说明没有证据。**绝不插 值。绝不画一个看起来像数据的占位符。
下面是这条规则在一个真正在卖的产品里长什么样。
1. “这条路径我没法用好办法算出来”
上一篇文章讲的是逐跳转发链:跟随每一台路由器自己的路由表,而 不是画一条以源为根的走廊,并且拿 AS 200 里全部 4,032 对路由器做了精确验证。
那个引擎在 OSPFv2 上管用。它在 IS-IS 上不管用,而 Osprey 会照实说出来,而不是悄悄退 回去:
4. Hop-by-hop forwarding chain unavailable Showing the source’s own shortest-path view, which every intermediate router may legitimately disagree with. Osprey does not model this protocol’s inter-area reachability hop-by-hop (IS-IS carries inter-level reachability differently from OSPF and has no Type-3 equivalent to persist, so Osprey stores nothing from which L1↔L2 route leaking could be reconstructed. An L1-only source in particular forwards on the attached-bit default toward its nearest L1/L2 router, not by end-to-end cost; EIGRP has its own observed chain).
关于这条消息有三点值得说。
它点名了给出答案的那个模型:源自己的最短路径视图,这样您就知道自己看的是两个引擎中的 哪一个。它点名了原因:Osprey 没有存下任何可以用来重建 L1↔L2 路由泄漏的东西。这是 Osprey 模型的局限,不是协议的局限:IS-IS 之所以没有 Type-3 summary LSA,是因为它从来不需 要,它用 L2 LSP 和 attached 位来承载跨级别的可达性。它还点名了具体后果,而这才是真会 咬到您的那部分:一台纯 L1 的源根本不是按端到端开销转发的。按照 ISO 10589,它跟着 attached 位走向最近的 L1/L2 路由器。它真正的第一跳可能跟画出来的路径毫无关系。
路径依然会显示出来,因为最短路径视图本身确实有用。它只是不被允许冒充那个更强的答案。
同样的纪律适用于 OSPFv3、只包含某个协议实例部分区域的作用域、带虚链路的区域,以及同时活 在两个都能承载该地址族的协议实例里的路由器。每一种都有自己被点名的原因。没有任何一种会悄 悄把旧的画法恢复回来。
2. “这个数字不会有任何意义”
EIGRP 不是链路状态协议。没有数据库可加入,没有 SPF 可跑,而且很重要的一点是,没有任何有 意义的方式把逐跳开销加起来,因为 EIGRP 的复合度量描述的是一整条路径,不是单独一条链路。
所以 Osprey 不打印总计:
Observed EIGRP forwarding chain EIGRP has no link-state database; this path follows the routers’ own DUAL result (per-hop topology tables), so there is no summed cost to show: 3 RIB-installed variant(s) shown alongside (the RIB holds equal next-hops).
您得到的是每台路由器自己算出来的、通往目的地的距离,沿着这条链递减: 712704 → 710144 → 658944 → 556544 → 505344 → 428544 → 223744 → 133120 → 128256。
这些数字每一个都来自一台路由器。没有一个是推导出来的。那个空着的”总开销”字段不是实现上的 缺口,而是对一个并不存在的量的正确呈现。
跨过 AS 边界时同一条规则同样触发,因为那里的 OSPF 开销和 IS-IS 开销是两个毫无关联的度量空 间里的数字:
Per-segment costs (never summed) | 15 hops
3. “这是我对每一段的确切把握程度”
跨域路径算不出来。它们只能从证据里拼接出来,而证据的质量并不齐整,所以 Osprey 按段给 证据评级,而不是对整条路径发一个笼统的置信度:
AS 200 ospfv2/1 cost 20051 是 resolved。AS 300 isis/LAB cost 1320 是
inferred。同一条路径,同一块屏幕,不同的认知地位,两者都贴了标。
那些徽标背后是一条严格的阶梯,按顺序逐级尝试:
| 阶 | 证据 | 置信度 |
|---|---|---|
| a | 该域某个边界上有一条覆盖该目的地的 RIB 记录 | resolved |
| a2 | 某个 route server 自己的 BMP RIB 经由下一个 AS 覆盖了该目的地 | inferred(bmp-rib-rs) |
| b | 朝向链上下一个 AS 有一条已建立的 eBGP 会话 | inferred |
| c | 什么都没有 | opaque:画成一个带注记的段,一跳都不画 |
第 (c) 阶才是关键。当 Osprey 无法确定流量是怎么进入某个域的,它不会插值出一串看起来说得通 的跳。它会画一个明确标为不透明的段并且解释自己;而在原因可以处理的地方,它说的是可以动手 的那句话,而不是一句泛泛的道歉。消息的形态是这样的:
AS 65000 has no areas in the selected scope. Include its areas to trace through this domain
这是一条您能拿它做点什么的消息。“入口未知”不是。(这些文章里的实验室路径全都能解析出 来,所以那条特定的注记不在这些截图里。它会在某个作用域确实漏掉了一个中转 AS 时触发。)
第 (a2) 阶的存在有一个值得点出来的具体理由:透明 route server 从来不会出现在 AS_PATH 里。 不去读 route server 自己的 RIB,就根本没有办法看到一次经由 IX 的绕行。那条路径看起来会像 是直连,而实际上不是。
4. “这些端口是事实 / 是猜测 / 确实存在歧义”
当 Osprey 用物理端口去标注一次 eBGP 转换时,它区分四种情形,而不是把它们压成一个自信的答 案:
- 恰好一对链路,没有 fabric 替代路径 → 端口作为事实陈述:
jfk1-gw1 Et1/1 → i-jfk1-gw1 Et1/2 - 并行链路 → 给出聚合结果,并把不确定性点出来: “3 parallel L2 links: Gi2↔Et1/0, … (session link undetermined)”
- 两端边界都在一个共享桥上,但没有直连链路 → 陈述 fabric 的存在以及接入端口,也就 是”它们之间存在一个桥”这一事实,绝不断言会话就是从那里跨过去的
- 既有直连链路又有共享 fabric → 明确的歧义,把两者都点名,并且两个都不选
再加上支撑规则:记录必须比 13 小时更新,超过 6 小时会披露其年龄,而仅凭 sysname 匹配上的桥 会否决一个端口断言,同时自己永远不会作为事实被展示出来。
最强的那一阶会把猜测升级为事实:当两个 BGP 会话地址都通过设备的 IP-MIB 绑定解析到了具体端口
时,标注就变成 ip-bound,并且压过那些歧义闸门,因为到那一步它已经不是推断了。
5. “这些字段拿不到”
最微妙的一条,也是我最喜欢的:
13382 LSAs reconstructed (LSAge, SeqNo, Checksum not available)
这些 LSA 是从 SNMP 遍历中重建的,而不是通过协议邻接收到的,而对 OSPF MIB 做 SNMP 遍历能给 您 LSA 的内容,却给不了实时的头部字段。
诱人的实现方式是三列零。它们会画得很漂亮,排序也没问题,而且是谎言。更糟的是,是无法察 觉的谎言,因为一条 age 为 0 的 LSA 看起来像是刚刚泛洪过来的新 LSA,而不是一次缺失的测量。
所以那几列干脆不存在,原因就印在面板顶部。
6. 拒绝使用我自己最好的引擎
这一条我最满意,因为它让我丢掉了一个功能。
Osprey 的仿真模式允许您断掉链路、拿掉节点、改动度量值,然后看流量怎么迁移。显而易见的做法 是把那个崭新的逐跳链引擎拿去跑在被改动过的拓扑上。
Osprey 刻意不这么做。
改动之后的转发链是不可计算的。跟随每台路由器自己的表,需要知道变更之后每台路由器的表 会是什么样,而那取决于幸存的 ABR 会重新产生哪些 Type-3 summary LSA。那些 LSA 还不存 在。不猜就合成不出来,而猜出来的结果会产生一条逐跳路径,它带着那个已验证引擎的全部权威,却 一点验证都没有。
所以仿真的两侧都停留在明确标注过的 SPF 投影上,并且在提示里说清楚。更好看的答案是拿得到 的。它只是不会是真的。
为什么这是特性而不是道歉
我卖的是一款网络拓扑产品。上面每一种行为都会让截图比竞争对手的稍微不那么震撼,而我也经历过 那种对话:有人指出一个自信的答案演示效果更好。
确实更好。它同时也毁掉了这个工具唯一值得拥有的那点东西。
凌晨 3 点面对一个被切分的区域的工程师,需要的不是一张漂亮的图。他需要知道这张图的哪些部分 可以下注。一个会给自己的证据评级的产品(resolved、inferred、opaque、unavailable、not computable),能让他把怀疑花在该花的地方,而不是均匀地摊在屏幕上的一切之上。
上一篇文章里的那次测量,是赢得这份信任的东西:4,032 对路由器里 4,032 对被精确复现,对照的是从路由器上读来的基准真相。而这一篇里的那些拒绝,是保护它的东 西。一个对了 4,032 次、然后在第 4,033 次悄悄虚张声势的工具,等于没教会您任何关于”您现在处在 哪一种情况”的事。
说出您知道的。说出您是怎么知道的。不知道的时候,就说不知道。
第一个系列到此结束。实验室导览在这里,被动发现的架构在 这里,逐跳路径引擎在这里。第二个系列讲的 是如何同时持有多个真相、如何给互相矛盾的证据排序,以及如何证明自己的产品是错的,从 同一台路由器,三个不同的真相开始。