Book Notes · 10 / 14 · 路由实践
Routing TCP/IP 卷I·卷II
精读笔记
Jeff Doyle 的 CCIE 职业发展系列经典(第 2 版,卷II 与 Jennifer Carroll 合著)。这不是一本"翻一翻就能懂"的书,它的定位是实验驱动的协议深读:每个协议你都必须能在实验台上把状态机复现出来,把排障输出逐行看懂。本笔记以原创转述提炼两卷的主线——卷I 的 IGP 三件套、重分发与策略,卷II 的 BGP、组播与 IPv6——并为每一章配上可复现的实验点。
全书骨架:从一个自治系统到整个互联网
两卷书合起来回答一个问题:"路由器们是怎么互相商量出一张全球路由表的?" 答案分四步——先在一个自治系统内部用 IGP 三件套(RIP/EIGRP/OSPF,外加 IS-IS)达成一致, 再在多协议共存时用重分发缝合,然后用 BGP 与其他自治系统对话, 最后组播与 IPv6 把问题推广到新场景:
准备 GNS3 或 EVE-NG,每读一个协议就搭一个最小拓扑复现它:看邻居怎么建立、路由怎么收敛、故意断一条链路看状态机怎么走。书里的每个"坑"都要亲手踩过才算读完。
本书最深的假设:动态路由协议本质是一台分布式状态机。排障的八成就是找出"状态卡在哪一步"——邻居停在 Init?卡在 ExStart?路由进了拓扑表却没进路由表?
卷I 讲自治系统内部的 IGP 与路由策略,卷II 讲域间的 BGP、组播与 IPv6。两卷的接缝是"重分发"——多协议共存时最危险也最能看出功底的地方。
思科视角下,所有路由信息最终都被翻译成两个数字:管理距离(信谁)与度量值(走哪条)。掌握这对坐标,就能把任何协议的输出放进同一个框架里比较。
路由基础与静态路由 —— 一切从路由表开始
在谈论任何动态协议之前,得先搞清楚路由器到底在维护什么:一张路由表。 这一章是全书的语法课,后面的 RIP、EIGRP、OSPF、BGP 都只是"往这张表里填条目的不同方式"。
路由表的四要素
两个数字常被混淆,记住一句话:管理距离比"出处",度量值比"路径"。 同一条前缀被静态路由和 OSPF 同时学到,先按管理距离选出处; 出处定了之后若有多条路径,再按度量值选哪条走。 这个两级裁决的顺序,是后面所有章节反复用到的裁判规则。
路由条目的来源只有三种:接口UP 时自动产生的直连路由、管理员手工写下的静态路由、 动态协议算出来的动态路由。可信度按这个顺序天然递减—— 亲眼所见的直连当然比听来的传闻可靠,这正是管理距离排序背后的直觉。
最长前缀匹配:查表的唯一规则
路由表里可能同时存在 10.0.0.0/8、10.1.0.0/16、10.1.1.0/24
三条都"沾边"的条目。目的地址 10.1.1.7 会走哪条?
永远是掩码最长的那条——更具体的路由优先,与度量值无关。
这条规则看似简单,却是大量排障的钥匙: 流量"不按预期走"时,先怀疑路由表里藏着一条更长的前缀把流量截走了。 它同时也是汇总设计的基石——汇总路由兜底,明细路由择优,两层各安其位。
静态路由:简单,但有三处暗礁
静态路由的适用场景很明确:末节网络(stub)只有一条出口、默认路由指向运营商、 小规模拓扑追求完全可控。它的局限同样明确—— 网络一大、拓扑一变,手工维护就成了事故源头。三个必须吃透的概念:
- 递归查询:静态路由可以只写下一跳地址,而下一跳本身可能也要查路由表才能确定出接口。一条静态路由可能引发多次查表,链式依赖断一环全断。
- 默认路由:0.0.0.0/0 是最短的前缀,按最长匹配它"兜底"所有流量——这是"不知道往哪走就往这走"的标准表达,末节网络几乎只需要它。
- 浮动静态路由:给静态路由配一个比动态协议更差的管理距离,平时被动态路由压在表外,动态路由失效时它浮上来顶班——最朴素的备份方案。
实验建议:两台路由器、两个回环网段,只配静态路由把双向流量跑通—— 注意"通"是双向的,回程路由忘了写是新手第一个坎。 然后故意只写下一跳不写接口,观察递归解析如何发生; 再加一条浮动静态,断掉主链路看它接管,恢复主链路看它退回。
RIP 与 RIPv2 —— 距离矢量的活化石
RIP 是动态路由协议的祖师爷,也是最纯粹的"距离矢量"样本: 每台路由器只告诉邻居"我到某网段有多远",不描述拓扑本身。 读懂 RIP,你就读懂了这一类协议的荣光与天花板。
传闻式路由:距离矢量的本质
距离矢量协议里,路由是"传闻":我听说隔壁老王离目标三跳,那我记四跳。 没人见过完整的地图,只有道听途说的距离与方向。 这个比喻值千金——它解释了这一类协议的一切弱点: 收敛慢(传闻要一层层传)、易出环(旧传闻与新传闻会在网络里打架)、 无法验证(你没法问老王"你这三跳具体走的哪条路")。
跳数度量:一把太钝的尺子
RIP 用跳数(经过几台路由器)当度量,上限十五跳——再多一跳即"不可达"。 这把尺子的问题显而易见:它看不见带宽差异 (一条低速链路和一个高速链路同样算一跳), 也把网络直径死死限制在十几跳以内。 度量太钝,是距离矢量家族的通病,RIP 只是最极端的那个。
RIPv1 的类路病与 RIPv2 的救赎
RIPv1 的更新报文里不带子网掩码,只能按有类地址(A/B/C 类)猜测—— 不连续子网会被自动汇总搞得面目全非。 RIPv2 补上掩码,支持 VLSM 与不连续子网,认证也来了, 更新方式从广播换成组播(不再惊扰网段上所有主机)。 但请注意:这些改进治的是"类路病",治不了距离矢量的根病。
计数到无穷与它的补丁们
链路断了,坏消息在距离矢量网络里传得极慢—— 两台路由器可能互相把对方当成通往失效网段的出口, 跳数你加一我加一,一直数到"不可达"才罢休,这就是计数到无穷。
RIP 打了一圈补丁:水平分割(从哪个口学的路由不从哪个口回传)、 毒性逆转(明确回传"此路不通")、触发更新(坏消息不等周期立刻发)、 抑制计时器(坏消息之后冷静一阵,防旧传闻复活)。 补丁能缓解,不能根治——这正是链路状态协议后来登场的理由, 也是为什么今天 RIP 只当教学素材读:它是理解"为什么会演化出 OSPF"的最佳标本。
实验建议:三台路由器串成环跑 RIPv2,断一条链路, 在接口上抓更新报文,亲眼看跳数一轮轮涨到不可达; 再分别开关水平分割对比收敛速度。 顺手把一条低速链路和一条高速链路并排放进拓扑,看 RIP 如何"公平地"选错路。
EIGRP —— DUAL 的优雅与"卡在活动状态"
EIGRP 自称"高级距离矢量",骨子里却是一台准链路状态设备: 它维护邻居表和拓扑表,只传变化不传全表,收敛速度直追 OSPF。 让它与众不同的灵魂是 DUAL 算法。
先立邻居,再谈路由
与 RIP 的"逢人就说"不同,EIGRP 先通过 Hello 报文建立明确的邻居关系, 再只向邻居可靠地投递路由信息——重要更新需要对方确认,丢了会重传。 这带来两个直接好处:初始同步之后只发增量更新,日常流量极小; 邻居死了立刻知道,不必等路由一条条超时。 "邻居表 + 拓扑表 + 路由表"三张表,是 EIGRP 排障的固定动线。
DUAL 的核心词汇:可行距离、后继与可行后继
可行后继的判定条件(RD < FD)是 DUAL 无环的数学保证: 邻居离目标比我近,把包交给它就不可能绕回我这儿。 后继挂了,可行后继立刻顶上来,收敛快得几乎无感—— 好网络里 EIGRP 的"秒切"就是这么来的。
弥散更新:快收敛的代价
没有可行后继时,DUAL 进入"活动状态":向邻居发出查询, 邻居再问邻居,查询像涟漪一样扩散出去, 必须等所有应答回来才能定新路由——这就是"弥散计算"。
如果某台邻居迟迟不应(链路拥塞、它自己也在等别人), 路由就卡在活动状态(SIA),计时器超时后邻居关系被重置,网络剧烈抖动。 SIA 是 EIGRP 最经典的排障场景:缓解思路是控制查询边界—— 用汇总与末节配置把涟漪圈在小范围里,别让它扩散到全网。
高级度量与不等价负载分担
EIGRP 的复合度量以带宽与延迟为主体(另有负载、可靠性等可调因子), 比跳数灵敏得多。它还支持不等价负载分担: 只要备用路径的度量落在主路径的某个倍数范围内, 流量就能按比例摊到多条路上——这是大多数 IGP 不给的奢侈。
为什么工程师爱它:配置上手快、收敛快、可控性强, 一台台路由器配过去几乎不出岔子。 在非多厂商环境里,它长期是最省心的 IGP—— 这份口碑,就是它曾是思科私有的最好注脚。
实验建议:搭一个带环路的四台拓扑,验证 FD/RD 条件—— 把每条候选路径的 RD 与 FD 抄下来逐个比对,亲手确认谁配当可行后继。 然后人为拖慢一条链路制造延迟,重现 SIA; 再用汇总把查询边界收紧,看 SIA 消失。
OSPF —— 链路状态协议的标准像
OSPF 是 IGP 的正殿:开放标准、分层设计、 每台路由器握有全区域的拓扑地图,各自跑 SPF 算出最短路径树。 卷I 里篇幅最厚的一章,也是 CCIE 实验的重灾区。
链路状态的世界观
链路状态协议不再传"传闻",而是让每台路由器向全区域泛洪自己的局部视图—— "我是谁,我连着谁,链路状态如何"。 收齐所有人的自白之后,每台路由器拼出同一张完整地图, 各自独立跑最短路径算法。 传闻变成了地图:收敛快、可验证、无环天然成立,代价是内存与算力。
邻接状态机:排障的主轴
两台 OSPF 路由器从插上网线到完全同步,要走过一串状态。 把这串状态背下来还不够——要在实验里亲眼看它走, 卡住时能立刻说出"停在哪一步、为什么":
- Init → 2-Way:收到对方的 Hello,并在里面看到了自己的名字。广播网络上普通邻居之间停在 2-Way 就算正常状态。
- ExStart → Exchange:协商主从、交换链路状态数据库的摘要目录——MTU 不一致会让这一步永远谈崩。
- Loading → Full:按摘要补齐缺失条目,数据库完全同步,SPF 可以信任地跑了。
邻接能建立的前提是 Hello 参数谈得拢: 区域号、认证、网络类型、Hello/失效间隔等必须一致。 排障时先看"Hello 发没发出去、对方收没收到",再查参数对没对上——顺序反了会浪费半天。
DR/BDR:广播网络上的"班长"制度
以太网这种多路访问网络上,若每台路由器都两两建立完全邻接, 邻接数量是平方级爆炸。OSPF 选出一个指定路由器(DR)和备份(BDR), 其他路由器只跟它们俩完全同步,泛洪也经由 DR 中转。 选举比的是接口优先级再比路由器 ID,且不抢占—— 新来一台更"高"的路由器,也得等现任 DR 下台。
LSA 类型与区域设计
链路状态通告(LSA)是 OSPF 的原子信息单位: 路由器 LSA 描述"我连着谁",网络 LSA 由 DR 代广播网段发言, 汇总 LSA 在区域之间搬运路由,外部 LSA 负责重分发进来的域外路由…… 每种回答一类问题,认不全它们就看不懂数据库。
区域设计是 OSPF 的工程灵魂:分层不是为了好看, 而是把 SPF 重算与泛洪圈在区域内部,网络才能长大。 骨干区域是所有区域的枢纽,其余区域必须挂在它身上—— 虚链路之所以是"创可贴",正因为它绕过了这条铁律。
实验建议:两台路由器之间抓邻居建立全过程,逐帧对应状态机; 再故意把一边接口 MTU 改大,看邻接卡在 ExStart——这是必做实验。 三区域拓扑里配末节区域,对比数据库条目的消长; 最后把骨干拆断,用虚链路缝合,再体会它为什么只能应急。
IS-IS —— 运营商的静默之选
IS-IS 出身 ISO 的 CLNS 体系,原本不是为 IP 设计的; 可大 ISP 的骨干里它出镜率极高。 学它不为别的:换一个哲学看链路状态,顺便理解运营商的审美。
TLV:可扩展性的来源
IS-IS 的报文是"类型-长度-值(TLV)"的积木堆: 要支持新地址族、新功能,加一类 TLV 就行,报文骨架不用动。 IPv6、流量工程、段路由的扩展都以这种方式长进协议里。 对比之下,OSPF 为 IPv6 专门重写了 v3—— 这一笔最能说明 TLV 设计的远见:协议的可扩展性,在画第一版报文格式时就注定了。
Level-1 / Level-2:边界在链路上,不在路由器上
IS-IS 的分层与 OSPF 形似神不同:L1 路由器只认本区域, L2 路由器串成骨干,一台路由器按接口分别属于不同层级。 关键差异——OSPF 的区域边界画在路由器上(ABR), IS-IS 的边界画在链路上: 两台不同区域的路由器之间那条链路就是边界,路由器整体归属一个区域。 这让区域调整灵活得多,也让"骨干"天然是一串连续的 L2 路由器链。
另一个容易忽视的差异:广播网络上 IS-IS 也选类似 DR 的角色(DIS), 但选举规则与抢占行为与 OSPF 并不相同—— 别把 DR 的肌肉记忆直接搬进 IS-IS 实验。
窄度量、宽度量与运营商偏爱它的理由
早期 IS-IS 的度量字段窄小,大带宽时代不得不引入宽度量—— 这是读老配置时常撞见的历史包袱,也是"协议字段宽度要留余量"的教科书案例。
运营商偏爱 IS-IS 的理由可以上位概括为三条: TLV 带来的扩展顺滑(对 IPv6、段路由友好); 协议自身跑在 CLNS 上,与 IP 转发面解耦,少一层自举依赖; 平坦的分区习惯贴合骨干拓扑。 它不是"更好的 OSPF",而是另一种工程口味—— 企业网惯用 OSPF,运营商骨干常见 IS-IS,井水不犯河水。
实验建议:三台路由器配 L1/L2 混合层级, 观察 L1 区域如何靠默认路径到达外部; 再抓一次链路状态报文,数里面的 TLV 种类, 直观感受"积木式"扩展——同一个报文骨架,装上 IP 的 TLV 就跑 IP, 这就是它与"为 IP 而生"的协议最大的气质差别。
重分发与路由策略 —— 全书排障密度最高的一章
真实的网络几乎从不止跑一种协议:并购来的网段跑 OSPF, 老设备只懂 RIP,边界上还得对接 BGP。 把 A 协议的路由灌进 B 协议,叫重分发;控制"灌什么、怎么灌",叫路由策略。 这一章的技巧与事故,密度冠绝全书。
单点安全,多点危险
单台路由器做单向重分发,一般可控; 两台以上路由器在 A、B 协议之间双向互灌,环路风险立刻浮现: A 学来的路由被灌进 B,又经另一台灌回 A—— 由于管理距离的差异,回灌的路由可能比"原装"的更被信任, 次优路径甚至环路就此定型。 多点双向重分发,是生产事故的经典配方。
种子度量:跨协议翻译的"汇率"
把 OSPF 路由灌进 RIP,度量值怎么折算? 两种协议的度量语言互不相通——成本、跳数、复合度量各有各的量纲, 必须给重分发指定一个"种子度量"。 不给或乱给,轻则度量失真(一律折算成同一个值,路径优劣全丢), 重则目标网段在目的协议里直接不可达。 种子度量的选择,体现了你对两边度量语义的翻译能力。
策略工具箱四件套
工具箱的使用顺序有讲究:前缀列表负责"认出谁", route-map 负责"认出之后做什么",分发列表在协议边界上收口, tag 则给路由打上跨域可识别的身份。 四件套组合起来,几乎可以表达任何"这些路由可以走、那些不行"的意图。
方法论:先画流向图再动手
把每个路由域画成圈,把每个重分发点画成门, 箭头标出路由该往哪流、不该往哪流; 然后用 tag 与过滤把"不该"的箭头逐条封死。 纸上清楚了,配置只是誊写;纸上没画就动手,事故只是时间问题。 书里这一章的案例教学价值,一半在协议细节,另一半就在这套"先图后配"的工程纪律。
实验建议:OSPF + RIP 双域、两台边界路由器做双向重分发, 先裸配观察次优路径与环路,再逐层加 tag 过滤与分发列表, 每加一层用路由表对比变化—— 这是全书最值得完整复现的一组实验,没有之一。
BGP —— 策略协议,不是最短路径协议
卷II 的主角登场。BGP 把互联网的自治系统(AS)缝在一起: 它不追求最短路径,它追求的是"符合各方意愿的路径"。 理解这一句话,BGP 的所有怪癖都有了出处。
路径矢量与 AS 的概念
自治系统是受单一管理控制的网络(一家运营商、一家大企业),用 AS 号标识。 BGP 是路径矢量协议:路由更新里带着完整的 AS 路径列表—— "到我这里要经过 AS 甲、AS 乙、AS 丙"。 路径列表一身二任:既是选路依据(越短通常越优), 也是防环机制(看到自己的 AS 号出现在路径里,直接拒收)。
eBGP 与 iBGP:同一协议的两种人格
iBGP 这条防环规则的代价是:AS 内部所有 BGP 扬声器要么全互联 (邻居数量平方爆炸),要么引入路由反射器—— 让指定路由器代为中转 iBGP 路由,把平方压成线性。 反射器集群与层级设计,是大型 AS 内部架构的日常功课; 它放松了"不转述"规则,换来可扩展性,防环职责则由额外属性接手。
BGP 状态机:从 Idle 到 Established
与 OSPF 一样,BGP 排障从状态机入手: Active 是"在努力但还没握上手",通常意味着对端不可达或配置错位; OpenSent/OpenConfirm 阶段卡住,多半是参数协商(版本、AS 号、认证)谈崩; Established 之后才轮到谈路由。 BGP 跑在 TCP 之上,这让它跨多跳建立会话成为可能, 也让"会话通了但路由不通"与"路由通了但转发不通"成为两类独立故障—— 排障时先问自己:卡的是会话、路由,还是转发?
属性与选路:一张优先级清单
BGP 路由携带一堆属性,选路就是按固定次序比较它们(上位概括): 先看本地偏好类属性(本 AS 更想从哪个出口走), 再看 AS 路径长短(经过的 AS 越少越好), 再看起源、MED(邻居建议从哪个入口进来)等, 一路比下去,直到用路由器 ID 兜底。 这张清单的深意在于——每一级都是一处策略把手: 想引导流量,就去调整对应级的属性。
所以说 BGP 是策略协议:它表达的是商业关系—— 客户的路由优先转发,对等伙伴的流量免费互换,上游供应商按流量计费。 一张全球路由表,本质是几十万份商业合同的投影; 这和 IGP"谁快选谁"的世界观,隔着一层人间烟火。
实验建议:三个 AS 的最小互联:两端 eBGP,中间 AS 内部两台 iBGP。 先体验"全互联"缺一角时路由莫名消失的怪象,再配路由反射器修复; 然后调本地偏好,看出口选择随之翻转; 最后试着用 AS 路径属性做入向流量的引导,体会"策略"二字的分量。
组播与 IPv6 路由概览 —— 卷II 的两条延长线
最后一章收束两条支线:组播把"一对多"变成路由问题, IPv6 把前七章的协议家族整体升级。 两段内容都以"思想差异"为主,细节可留待专项深入。
组播的动机与 RPF 检查
一份视频流要发给一万个接收者,单播要复制一万份,组播只发一份, 由路由器在分叉点复制——带宽节省发生在"最后分叉之前"的每一跳。 但组播路由的逻辑是反的:单播问"这个包要去哪", 组播问"这个包从哪来"——RPF 检查验证组播包是否来自 "回到源头的正确接口",来路不对就丢弃,这是组播防环的第一道闸。
PIM 稠密与稀疏:先淹后剪 vs 先点后聚
由此引出组播树的两种形态:共享树(大家都从 RP 那棵树上取流, 省状态但路径可能绕)与源树(每个源到接收者各走最短路径, 路径优但状态多)。 稀疏模式常以共享树起步、流量起来后再切换源树收尾, 是两种折中的合奏。别忘了主机侧还有"声明我想收哪个组"的组成员协议在配合—— 组播是主机、路由器两头协作的系统工程。
IPv6 路由:熟悉的配方,升级的地址
前七章的协议家族整体有 IPv6 版:RIPng、OSPFv3、EIGRP for IPv6、 承载多地址族的 MP-BGP。差异要点做上位概括: 地址变长、链路本地地址登场、邻居发现(ND)取代 ARP; OSPFv3 把认证交还给 IP 层并重构了 LSA 体系; MP-BGP 则用同一套会话承载不同地址族的路由,BGP 从此"一套班子多块牌子"。
思想没变,表达变了——这正是"先学透 IPv4 版再升级"的理由。 过渡技术(双栈、隧道、协议翻译)书中一笔带过, 实践中记住一条即可:双栈是默认答案—— 能双栈就别翻译,隧道是桥梁不是归宿。
实验建议:组播侧,两台路由器一台源一台接收者, 抓包验证 RPF 丢弃行为,再看"声明加入"之后流量如何被引过来; IPv6 侧,把第 4 章的 OSPF 实验用 OSPFv3 重做一遍, 对照两张数据库感受差异——同样的状态机,换了一套报文语言。