IS-IS路由协议深度解析:与OSPF/BGP对比及实战排障
1. 从一张路由表说起:网络层到底在解决什么问题
不管是刚接触网络的在校生,还是已经在机房里折腾过几台设备的人,都会有一个共同的体感:网络层协议是整个TCP/IP体系里最“承上启下”的一层。上层应用不管你是HTTP还是视频流,下层链路不管你是光纤还是无线,到了网络层,一切都得被抽象成一种东西——IP报文。而路由协议,就是这个抽象世界里最关键的神经系统。
很多人刚开始学的时候,会把“路由协议”和“路由表”混为一谈。实际上路由表是结果,路由协议是产生结果的过程。就好比你手机里的地图导航,地图App是路由协议,最终屏幕上的那条推荐路线是路由表。没有导航算法,光有地图数据,你依然不知道车该往哪开。路由协议干的事就是:让每台路由器都知道,去往某个目标网段,下一跳该交给谁。这个“知道”的过程,可以靠人手工配置,也可以靠路由协议自动学习。网络规模一大,手工配置就是灾难,所以动态路由协议成了网络层的核心话题。
这篇文章我会把路由协议这条线的关键知识点掰开揉碎讲一遍,重点放在当前讨论度很高的IS-IS协议上,同时把RIP、OSPF、BGP这几个常客串起来对比。不管你是准备认证考试,还是在现网里做网络割接、排障,这篇都能给你一些可以直接参考的判断依据。我不会堆一堆教科书式的定义,尽量用实际会遇到的场景说话,能动手的地方就给出配置思路,能踩坑的地方就提前告诉你坑在哪。
2. 路由协议的家族谱系与核心选型逻辑
2.1 先分清静态和动态:这不是二选一的问题
很多人初学路由时,第一个纠结的问题是“到底用静态路由还是动态路由”。其实这不是一个二选一的题,而是一个按需搭配的题。静态路由的特点是稳定、可控、不占用网络带宽,你告诉路由器去哪,它就老老实实去哪,不会自己乱变。缺点是:网络拓扑一变,你得手动改配置,改错一条就可能把流量引到沟里。
动态路由协议则相反,它让路由器之间互相“交换情报”,网络拓扑发生变化后,协议会自动重新计算路径。坏处是协议本身会消耗CPU、内存和带宽资源,而且如果设计不合理,还可能引发路由震荡、环路这类麻烦。实际工程里最常见的做法是:核心骨干用动态路由协议(通常是OSPF或IS-IS),边缘出口或用静态路由指向默认网关。静态和动态从来不是对立关系,而是互补关系。
2.2 动态路由协议怎么分类:IGP和EGP的边界
动态路由协议的第一层分类是IGP和EGP。IGP是内部网关协议,跑在同一个自治系统内部,日常企业网、园区网、数据中心里见到的几乎都是IGP。EGP则负责连接不同的自治系统,典型代表就是BGP。这个边界特别重要,因为它决定了协议的设计哲学:IGP追求的是“快速收敛+路径最优”,BGP追求的是“可控+灵活策略”。
再往下分,IGP里又有两大流派:距离矢量协议和链路状态协议。RIP是距离矢量的典型代表,OSPF和IS-IS则是链路状态协议的中坚力量。距离矢量协议的工作方式有点像“邻居传话”:我只从邻居那里学路由,邻居也是从它的邻居那里学来的。链路状态协议则是“人人都画地图”:每台路由器把自己直连的链路信息广播给全网,所有路由器手里都有一张完整的网络拓扑图,然后自己用SPF算法算最短路径。
这个区别非常关键,因为链路状态协议之所以能在大型网络里活得很好,核心就在于“全局视野”。它不像距离矢量那样需要靠跳数来规避环路,而是通过拓扑计算天然保证无环。这也是OSPF和IS-IS能在企业网、运营商网里占据绝对主导地位的根本原因。
3. IS-IS为什么成了热词:重新认识这个“老将”
3.1 IS-IS的前世今生:从ISO到TCP/IP的转型
IS-IS最近在技术社区里讨论度很高,原因倒不是它多新鲜,恰恰相反,它是一个很“老”的协议。它诞生于ISO的OSI体系,全称是Intermediate System到Intermediate System,最初是给CLNS网络用的。那时候,TCP/IP和OSI是两套并行的网络体系,IS-IS是OSI体系里的路由协议。后来TCP/IP一统天下,IS-IS并没有像其他OSI组件那样消亡,而是做了个聪明的转型:扩展出了对IP路由的支持,于是它就变成了同时能跑CLNS和IP的双料协议。
这个背景解释了IS-IS的很多“怪癖”。比如它不像OSPF那样有独立的“区域”概念,而是用Level-1、Level-2来区分路由器角色;比如它的报文是直接封装在链路层帧里的,不需要IP层。这些设计对于吃惯了OSPF的人来说,一开始会觉得别扭,但用久了你会发现它在某些场景下确实比OSPF更干净。
3.2 为什么大型网络里IS-IS比OSPF更“耐造”
我自己的体会是,IS-IS最突出的优势在于它的扩展性和稳定性。运营商骨干网、大型数据中心,这两个场景里IS-IS的出镜率极高。原因不外乎几点:
第一,IS-IS的TLV(Type-Length-Value)扩展机制非常灵活。后续要支持新功能,比如SR-MPLS、Segment Routing,IS-IS可以直接通过新增TLV来扩展,协议本身不需要大改,兼容性也好。OSPF也行,但在扩展性上IS-IS天生就设计得更符合“大而全”的思路。
第二,IS-IS的Level-1区域设计天然适合分层。Level-2路由器组成骨干,Level-1路由器只在区域内交换路由信息,默认路由指向最近的Level-1-2路由器。这种设计让区域边界很清楚,骨干路由器的路由表不会因为某个区域内部震荡而跟着抖。OSPF也有区域设计,但OSPF的区域间路由还需要ABR处理三类LSA,机制上比IS-IS要繁琐一些。
第三,IS-IS对网络不稳的容忍度更高。OSPF有DR/BDR选举,所有非DR路由器只和DR建立邻接关系,DR挂了会重新选举,期间收敛会受影响。IS-IS也有类似的机制叫DIS,但IS-IS的设计是:每台路由器都同时跟DIS和其他路由器保持邻接关系。也就是说IS-IS里的路由器之间是全部互联的,DIS只负责在广播网络上抑制多余的LSP泛洪,没有DR那种“单点代言”的角色。这让IS-IS在广播网络里的收敛行为更平滑,网络抖动时不容易因为选举问题产生延迟。
3.3 IS-IS的NET地址和路由器的“身份卡片”
如果你第一次配IS-IS,一定会被NET地址搞懵。这东西不像IP地址,看起来是一串十六进制。NET地址的全称是Network Entity Title,它就是IS-IS路由器的身份证。
一个标准的NET地址样子是:49.0001.0000.0000.0001.00。它分三个部分:第一部分是区域地址,比如49.0001;第二部分是System ID,比如0000.0000.0001,一共6个字节,在整个路由域里必须唯一;第三部分是NSEL,一般固定写00。实操里,我们通常把Router ID转换Hex后作为System ID。比如Router ID是10.1.1.1,那System ID可以写成10.0001.0001这种形式,用点分来凑够6字节。规划NET地址的时候,最需要注意的是区域地址的分配:同一个Level-1区域内的路由器,区域地址必须一致,否则邻居虽然能建立,但区域归属就乱了,路由就学不全。这块是我最早犯过的错——两台设备NET地址一看都在49.0001下面,但System ID没对齐,结果Level-1区域老是学不到对方路由,查了半天。
4. 动态路由协议横向对比:OSPF、IS-IS、RIP、BGP怎么选
4.1 一张表格看完四个协议的定位差异
很多面试官喜欢问“OSPF和IS-IS有什么区别”,其实这两个协议在实际使用中的差异并没有传说中那么大,但设计哲学确实有差异。为了让你一眼看清,我习惯用下面这张表来总结:
| 对比项 | RIP | OSPF | IS-IS | BGP |
|---|---|---|---|---|
| 类型 | 距离矢量 | 链路状态 | 链路状态 | 路径矢量 |
| 所在范围 | IGP | IGP | IGP | EGP |
| 度量标准 | 跳数 | 开销Cost | 开销Metric(默认64K参考带宽) | 多种属性(AS-Path、MED等) |
| 收敛速度 | 慢 | 快 | 快 | 决定于策略控制 |
| 扩展性 | 差(最大15跳) | 中等偏上 | 优秀 | 极强(跨AS) |
| 使用场景 | 小型网络/实验环境 | 企业网/数据中心 | 运营商骨干/大型DC | 互联网/跨域互联 |
这张表的信息量很大。RIP就不用多说了,现在生产环境里基本绝迹,除非在一些很老的低端设备上还能看到。OSPF和IS-IS是真正值得你花时间对比的一对。BGP则是另一个维度的事情,它在AS之间做选路,策略控制能力极强,但收敛速度远不如IGP,所以绝不能拿它当IGP去全网跑。
4.2 OSPF和IS-IS的差异没你想的那么绝对
说实话,在实际工程里,OSPF和IS-IS在企业网内做出来的效果差别不大。两者都是链路状态算法,都有区域化设计,都支持等价负载均衡。差异主要体现在几个操作层面:
一是区域边界的实现方式。OSPF要求区域0必须是骨干,所有非骨干区域必须直接或通过虚链路连接到区域0。IS-IS则没有“必须连接区域0”的硬性要求,Level-2骨干本身就是一个连续区域,Level-1区域通过Level-1-2路由器接入骨干。这个差异在规划多区域时感受最明显:OSPF区域设计错了会出很多奇奇怪怪的LSA问题,IS-IS则相对宽松。
二是报文封装。OSPF跑在IP上,协议号89,需要IP层参与。IS-IS直接跑在数据链路层,不受IP分片和IP地址变化的影响。这意味着IS-IS路由器之间的邻接关系不依赖IP地址可达性,在某些IP配置变更场景下反而更稳。
三是扩展新特性的方式。IS-IS的TLV机制让它天然适合扩展Segment Routing、IPv6等新特性。OSPF开发了OSPFv3来支持IPv6,IS-IS则是直接通过新增TLV实现IPv6支持,原来的IPv4能力不受影响。在双栈环境下,IS-IS的这种“一套协议跑双栈”的特性确实省事。
4.3 BGP:不要在错误的地方用错误的工具
BGP在网络上被称为“路径矢量协议”,因为它不是靠算出来的最短路径选路,而是靠一堆路径属性来决定“谁的路由更优”。BGP里没有Cost这种单一数值,而是有Local Preference、AS-Path、MED、Weight等一系列属性。这也就算了,BGP还支持极强的路由策略,可以基于前缀、基于邻居、基于AS号做各种过滤和改写。
正因为它功能强,所以很多人会忍不住把BGP引入企业网内部做流量调度。我见过不少案例,最终都被BGP的复杂性和排障难度拖垮。BGP的核心问题在于:它不会主动收敛,一切变化都靠Update报文传递,再加上策略的叠加,出了问题很难排查。我的建议是:企业内部IGP该用OSPF用OSPF,该用IS-IS用IS-IS,BGP只在跨境、跨运营商、多出口的场景下使用,而且要配合严谨的路由策略。把工具用在对的地方,才是网络工程师的成熟标志。
5. IS-IS实操配置与关键参数:照着做就能跑通
5.1 最精简的IS-IS配置流程
IS-IS的配置门槛其实不高,很多人觉得难,是因为NET地址和区域概念不熟。我提供一个最精简的配置模板,你可以直接套用。假设有两台路由器R1和R2,直连,都在一个Level-2区域内,网段是10.0.12.0/30。
R1上的配置:
R2上的配置:
配置完成后,在R1上用show isis neighbor能看到对端System ID,用show isis route能看到学到的路由。这里有两个细节值得注意:一是is-type level-2-only和circuit-type level-2-only是在确认你就是纯骨干节点时才这么写,如果后续要跟Level-1区域接入,就得改成level-1-2;二是NET地址的System ID不能配错,它是全网唯一的,配错了邻接建立没问题,但路由计算会乱套。
细心的读者可能发现了:我在接口上也指定了isis circuit-type,这其实是双保险。即使全局允许Level-1,接口上只跑Level-2,也能减少无谓的LSDB开销。在大型网络里,这种细节上的克制,累计下来能省不少CPU。
5.2 IS-IS度量值:别忽略默认值背后的计算逻辑
IS-IS的度量值默认情况下的参考带宽比较“古老”——它不像OSPF有明确的auto-cost reference-bandwidth参数,而是默认说“一条链路开销是10”。好在现代设备基本都支持metric-style wide,把度量扩展为24位,方便和Segment Routing等新特性配合。实际操作里,我建议一律开启metric-style wide,否则你用TLV扩展的很多新功能会受限。
开了wide之后,你就能给特定接口设置开销:
开销值怎么定?核心逻辑和OSPF一样:链路带宽越大,开销越小;开销值越小,路径越优先。通常你不需要手动去调,默认值就能工作得很好,只有在做流量规划、想引导流量走特定链路时才需要动它。调的时候要记住,IS-IS的Cost是叠加的,路径总开销是所有出接口Cost的累加,你可以通过traceroute加开销对比来验证选路结果。
5.3 LSP泛洪与DIS选举:IS-IS收敛的底层机制
IS-IS里,每台路由器都会生成LSP(Link State PDU)描述自己的直连链路状态,然后泛洪给全网。为了保证每个节点最终都持有相同的一份LSDB,IS-IS在广播网络上设计了DIS(Designated IS)。DIS会周期性发送CSNP(Complete Sequence Number PDU),相当于一个“目录”,告诉所有邻居自己有哪些LSP。其他路由器收到CSNP后,发现自己缺哪条就发PSNP去请求。
这里我特别想说一个很多人容易忽略的点:IS-IS的DIS选举不是抢占式的。已经选举出的DIS不会因为新加入一台优先级更高的路由器而被替换。这和OSPF的DR选举完全不一样。所以,如果现网里某个广播网段DIS频繁变化,别急着去改优先级,而是要考虑是否网络不稳定导致DIS老化。这个特性对理解“为什么IS-IS收敛比OSPF稳”非常有帮助,它就是通过牺牲一定的最优性换来了稳定。
5.4 双栈环境下IS-IS配IPv6的注意事项
如今很多网络是IPv4和IPv6双栈,IS-IS对IPv6的支持是通过新增TLVs完成的,所以配置上比OSPFv3要简单。要开启IPv6路由能力,需要在IS-IS进程下配置:
然后在接口上启用:
配完后,show isis ipv6 route就能看到IPv6路由。需要注意的一点是:IS-IS的IPv6能力不是默认开启的,即使你接口上配了IPv6地址,只要没在IS-IS进程下启用IPv6地址族,IPv6路由就不会被通告。这个问题我接过不少工单,排查到最后发现就是少敲了两行命令,但如果没有经验,光抓包分析LSP内容会浪费很多时间。
6. 路由协议实战中的坑:排障思路与避坑经验
6.1 邻居建立不起来?先查这三样
IS-IS邻居建立失败的排查,其实套路很固定。我总结了一个经验顺序,可以大大提高定位效率:
第一查NET地址和System ID。两端NET区域地址不一致时,邻居虽然会尝试建立,但Level级别不匹配会直接导致失败。System ID重复也会导致LSDB冲突,邻居状态反复振荡。
第二查Level类型。一边是level-1-only,另一边是level-2-only,那么两边都配了circuit-type也只是各自干各自的,永远不可能建立邻接。用show isis interface看一眼接口的Level类型就能定位。
第三查接口状态和MTU。IS-IS直接跑在二层,二层不通那就谈不上IS-IS。另外IS-IS的Hello包里带有PDU长度字段,两端接口MTU不一致会导致Hello包被丢弃或解析失败,邻居会一直卡在Initial状态。这个坑在交换机上少见,但在路由器跨厂商对接时容易出现,因为默认MTU可能不一样。
6.2 学了路由但下一跳不可达?大概率是区域设计问题
IS-IS的一个经典现象是:Level-1路由器能学到默认路由,但去往某些具体网段的明细路由学不到,于是报文被扔到默认路由上,结果下一跳不通。
原因在于Level-1区域内的路由器只会保留本区域内的明细路由,区域外前缀由Level-1-2路由器下发一条默认路由。这是设计如此,不是故障。如果你想在Level-1路由器上看到明细路由,需要在Level-1-2路由器上配置attach bit相关的LSP策略,但实际工程中我并不建议这么干。因为Level-1本来就是为了隔离区域细节而生的,真正需要明细流量精确控制时,应该调整流量模型,而不是强行扩展LSP。早期我折腾过一阵,把Level-1区域搞得特别复杂,最后运维起来非常痛苦。
6.3 路由环路怎么防:IGP自带的机制与BGP的策略
链路状态协议天然无环,因为计算路径用的是SPF树,不是靠邻居跳数猜。但有一种情况会产生“逻辑环路”:不同路由协议之间互相引入,比如OSPF学到的路由引入到IS-IS里,IS-IS又把它回传到OSPF,就会引发次优路径甚至环路。解决办法是做好路由引入的方向控制,外加使用路由策略打Tag。Route Tag就是给外部引入的路由打个标,回传时拒绝带这个标签的路由,彻底阻断环路。
BGP这边的环路防护靠的是AS-Path属性,凡是AS路径里已经包含自己AS号的路由,直接丢弃不接收。这个机制不是用来“算路”的,而是用来做防环的。所以你在配BGP时,千万不能随意修改对方的AS-Path,否则会把BGP的防环机制破坏掉。
6.4 常见问题速查表:网络工程师的随身小抄
| 现象 | 可能原因 | 排查命令/动作 |
|---|---|---|
| IS-IS邻居一直Initial | MTU不匹配/Hello包被丢弃 | 检查两端接口MTU,抓包看Hello长度 |
| IS-IS路由学不到明细 | Level类型设置错误/区域地址不匹配 | show isis topology、show isis database |
| OSPF邻居反复Down | Dead定时器超时/接口震荡 | show ip ospf neighbor、查看接口CRC错误计数 |
| RIP路由15跳不可达 | RIP最大跳数限制 | 重新设计网络,或者换OSPF/IS-IS |
| BGP邻居建不起来 | TCP 179不通/update-source配错 | telnet <peer> 179测端口通断 |
| 引入路由出现次优路径 | 双向引入未打Tag | 给引入路由打Route Tag,回传时拒绝 |
这张表是浓缩了不少实际工单经验的,几乎每个现象都在现网里真实发生过。拿MTU来说,很多厂商设备默认二层MTU是1500,但有些设备在接VLAN子接口或无标记接入端口时会自动做调整,跨厂商对接时有一端没关negotiation auto,就会产生“能学到邻居但建不起邻接”的奇葩现象。刚开始做现网排查时,我遇到这类问题总往配置上猜,后来才知道要先从最底层的链路参数查起,反而省时间。
6.5 路由汇聚和过滤:控制协议开销的必修课
现代企业网络的设备数量动辄上千台,如果不做路由汇聚,LSDB会暴涨,SPF计算时间也会线性增加。IS-IS和OSPF都支持路由汇总。IS-IS里可以在接口下做LSP过滤,但实际上最常用的还是借助路由策略将明细路由聚合成汇总前缀再通告。配置思路是:在Level-1-2路由器上把区域内的明细路由聚合成一条区域前缀,然后只通告汇总项,这样Level-2骨干上承载的路由条目可以下降一个数量级。
路由过滤是另一个维度。通过地理解位置、业务类型等因素,定时清理无效路由,对网络稳定性也有大帮助。但这里必须提醒一句:过滤要克制,不要上来就搞一堆ACL,特别是filter-policy这种配置,用错了会影响路由学习和转发路径。我之前见过一个案例,一个工程师为了“优化”骨干路由器,误加了一条过滤策略,导致业务路由被砍掉一大半,最后花了好几个小时才恢复。动手前务必先看路由表里到底有哪些前缀,确认过滤条件覆盖范围,再实施。
7. 给新手的几条实在建议
如果你刚接触路由协议,最忌一上来就陷入各种细节。我的建议是先搭一个三台路由器的小实验环境,分别跑通静态路由、RIP、OSPF、IS-IS、BGP,用抓包工具看协议报文,理解每种协议是怎么交互的。然后逐步拆掉实验,去处理一些真实网络故障。这种“从小环境到现网”的路线,比死磕教科书高效得多。
IS-IS本身入门曲线有点陡,但一旦你理解了NET、LSP、DIS这几个核心概念,它的逻辑比OSPF更“爽快”——没有那么多复杂的LSA类型,没有DR/BDR的反复选举,几乎没有“虚链路”这种绕弯子的设计。这也是为什么很多从OSPF转向IS-IS的工程师,最后都回不去了。
我个人在多次实际配置中还有一个体会:任何路由协议,越到网络复杂的时候,越要回归网络设计的本质——分层、汇聚、隔离。协议本身只是工具,你的网络边界是否清晰、路由表是否简洁、故障域是否可控,这些设计层面的功底,才是真正让网络稳定的东西。遇到问题先从设计和基本物理链路排查,不要一直盯着协议参数往深处钻。这个思路,帮我解决了很多让人挠头的网络事故。