IS-IS和OSPFv2,算是网络工程师绕不开的两位老熟人。同样都是链路状态协议,同样跑Dijkstra算法,也同样被运营商和企业网大量使用,但真要在项目里二选一,或者面试时被问一句“为什么这网用IS-IS不用OSPF”,很多人都说不到点子上。这篇文章不念协议文档,就站在选型和排障角度,把两者从设计出身、区域模型、报文机制、度量值、收敛、扩展性一项项拉开,再附上实际配置和踩坑记录。看完你至少能判断自己手头这摊网络该用谁,别人问你的时候也能答得有底气。
1. 两种协议,一张表先看清全貌
1.1 为什么网络里会有两位“同门师兄弟”
这不是凑巧,而是历史路线问题。OSPFv2是IETF在TCP/IP体系下推出的链路状态IGP,目标就是给纯IP网络做路由;IS-IS则是ISO为OSI网络层设计的路由协议,最初跑的是CLNP地址体系,后来才被扩展成同时承载IPv4、IPv6的IGP。两者都属于链路状态家族,核心思路一致:每台路由器收集全网的链路信息,形成LSDB,再各自跑SPF算法算出无环最短路径。
但同一棵树上结出的果子和不同地方结出的果子,口感就是不一样。OSPF生下来就是为IP服务,IS-IS则是半路转型做IP。这个出身决定了它在报文封装、区域结构、扩展方式上跟OSPF有不少本质差异,也导致两种协议在真实网络中的“性格”差别很大。
1.2 核心差异速查表
先给一张表把考点铺开,后文会逐个拆解。
| 对比维度 | IS-IS | OSPFv2 |
|---|---|---|
| 出身背景 | OSI体系,最初用于CLNP网络 | IETF在TCP/IP体系下设计 |
| 报文封装 | 直接跑在二层,有独立协议标识 | 封装在IP报文里,协议号89 |
| 身份标识 | NET地址/System ID | Router ID |
| 区域模型 | Level-1、Level-2两级 | 骨干区域Area 0 + 若干普通区域 |
| 邻居状态机 | 相对简化的Up/Down/Init | 八态机,状态多且细 |
| 路由计算 | 每层独立LSDB,L1/L2分离 | 一个区域一个LSDB,ABR汇总 |
| 度量值 | 传统narrow最多63,wide可到16777215 | cost由参考带宽/接口带宽计算,范围1~65535 |
| 组播/广播机制 | 二层组播MAC,DIS可抢占 | 组播224.0.0.5/224.0.0.6,DR/BDR不抢占 |
| IPv6支持 | 本身就支持,扩展TLV即可 | OSPFv2只支持IPv4,IPv6得用OSPFv3 |
| 认证 | 接口、区域、域都可以做认证 | 接口/区域认证,支持明文和MD5等 |
| 扩展性 | TLV扩展,天然比较优雅 | 靠新增LSA类型,版本演进更重 |
这张表只是一个快照。真正难的不是背对比,而是理解这些差异是从哪来的,以及它们会如何影响实际网络的选型、配置和排障。
1.3 一句话总结差异本质
IS-IS的基因里带着“为大型网络设计”“扩展优先”的痕迹,所以它结构简单但后劲足;OSPFv2则是“精细化”“IP原生”的代名词,所以在企业网里非常顺手,但越往大往复杂做,越容易显露出头部协议模型的限制。说白了,没有谁全面碾压谁,只有合不合适。
2. 区域模型与网络设计思路的差别
2.1 IS-IS为什么是Level-1、Level-2两级
很多新人第一次看到IS-IS的Level概念,容易把它理解成OSPF的“区域等级”,其实不太一样。IS-IS把一个网络从逻辑上分成两层:Level-1负责一个区域内部的路由,Level-2负责把各个Level-1区域连成一张骨干网。路由器也分成三类,纯L1、纯L2、L1/L2。
关键区别在于:L1路由器只维护本区域的LSDB,对区域外的细节一无所知,只知道通过最近的L1/L2路由器可以出去,有点像“小区业主只需要知道出门走哪个门岗上环路,不需要知道环路对面那个小区有几栋楼”。L1/L2路由器同时维护两套LSDB,既参与本区域计算,也参与骨干计算,还会把本区域的明细路由带到L2去,再往L1回传一条默认路由。这样设计的好处是扩展性极强,单个区域内部设备不需要知道全网所有路由,L1路由表很精简,网络规模再大也只是骨干L2视图在膨胀。
这里必须强调一点:IS-IS默认不会把骨干和别的区域的明细路由泄露回L1,除非你显式配置路由泄漏(route leaking)。这是和OSPF非常不同的行为,后面配置章节会再说。
2.2 OSPF为什么必须挂Area 0
OSPF的区域模型是“单骨干+多分支”。所有非骨干区域必须直连到骨干区域Area 0,ABR负责把区域间的路由汇总和翻译。这种设计的初衷是确保区域间路由不会打架,所有流量在逻辑上都可以汇聚到骨干再分发。
但代价也明显:如果某个区域没法直连Area 0,你就得用虚链路(virtual-link)去“穿墙”成一条逻辑上的骨干连接。虚链路是个能救场但很不受欢迎的东西,它会让LSDB同步在逻辑走线上变得复杂,排障时还经常莫名其妙。我自己碰到过虚链路因为对端Router ID变更而迟迟起不来的情况,头疼程度直逼“邻居半天Down掉”。
OSPF的区域类型也比IS-IS多:stub、totally stub、NSSA、totally NSSA。每一种都对应不同的默认路由和外部路由发布规则。灵活性高,但同时意味着你要记的场景多,配错一个区域选项就可能大面积路由异常。
2.3 区域设计差异带来的实际影响
先说IS-IS。它只有L1/L2两层,理解成本低,配置也相对简单。你不需要在一个网络里同时想“这个区域是stub还是NSSA”,只需要决定这台路由器是L1、L2还是L1/L2。但这种简洁的背后也有约束:如果想让L1区域里出现骨干明细路由,必须手动做路由泄漏,否则L1设备只会靠默认出去。这对核心路由策略是好事,因为你可以控制得很细,但对刚上手的人而言,容易踩“L1区域学不到远端明细路由”的坑。
OSPF则是另一套体验。多区域设计在企业网很成熟:每个区域都有自己的Area号,ABR做汇总,区域边界清晰,排障时看设备的Area号就知道大概位置。问题在于,OSPF要求一个主干网络Area 0承载所有区域间的流量,规模大了以后Area 0本身的告警和驱动压力并不低,加上末梢区域、NSSA这类附加设置,复杂度是层层叠加的。
从选型角度看,区域模型决定了一个网络的扩展上限。如果你知道这网络未来会滚得很大,比如运营商级别、几千台设备起步,IS-IS的两层模型更接近“骨干+接入”的自然物理结构,也更容易做到路由分层。如果是一个企业园区,几十上百台设备,OSPF多区域模型其实更顺手,像分公司、各部门划区域也符合组织架构。
3. 报文、邻居关系与LSDB同步机制对比
3.1 OSPFv2的“五封文书”和邻居状态机
OSPFv2的报文类型一共五种:Hello、DBD(数据库描述)、LSR(链路状态请求)、LSU(链路状态更新)、LSACK(链路状态确认)。邻居关系的建立是一个“恋爱长跑”:从Down到Init,再到Two-Way,选完DR/BDR,然后走ExStart、Exchange、Loading,最后才到Full。
为什么要搞得这么复杂?因为OSPF必须在语音IP的基础上,通过组播发送DBD来描述自己LSDB的摘要,然后双方通过LSR精确请求缺失的LSA,再用LSU携带完整LSA,最后LSACK确认。这个过程非常严谨,也带来一个特征:OSPF的邻居状态能看到“中间态”,排障时你能从状态停在哪个阶段推断问题出在哪。比如一直卡在ExStart,多半是MTU不匹配或者Router ID冲突;一直卡在Loading,往往是LSA请求列表里某个LSA怎么都收不齐。
OSPFv2在广播多路访问网络上还要选举DR/BDR,减少邻居间邻接关系数量,避免全网两两建立邻接导致LSA洪泛爆炸。这里有个容易被忽略的细节:DR/BDR一旦选出,就不允许被更高优先级的新设备抢占。这个机制提高了稳定性,但也意味着一台更好的路由器可能长期当不了DR,只能默默接收。
3.2 IS-IS的“三件套PDU”和特殊的DIS
IS-IS的报文简单很多,只有三大类:Hello、LSP(链路状态报文)、SNP(序号报文)。SNP又分CSNP(完全序号PDU)和PSNP(部分序号PDU)。没有OSPF那种繁琐的“请求-描述-确认”状态机,邻居关系基本就是Down、Init、Up几个状态。
IS-IS在广播网络上选举的不是DR/BDR,而是DIS(指定中间系统)。DIS负责生成伪节点(类似OSPF的Network LSA),并在广播网络上周期性发送CSNP,相当于“我告诉你我这边都有哪些LSP摘要”。其他设备如果发现自己缺某个LSP,可以用PSNP向对端请求。这种机制比OSPF的DBD/LSR流程更粗放,但效率不低。
需要注意的一个实用点:IS-IS的DIS是可抢占的。只要有一台设备优先级更高,就可能把原有DIS顶下来,这会触发伪节点重建和LSP重新洪泛。在关键链路上,这种抢占造成的额外抖动完全不必要,所以建议把骨干链路上的IS-IS设备手动设置为高优先级且稳定,避免它高频换主。
3.3 谁的收敛路径更短
理论上两种协议都靠SPF,收敛速度的差距主要来自协议开销、状态机复杂度和实现优化。IS-IS因为状态机简单、报文类型少,在很多实现里收敛链路更短,尤其适合大范围链路状态快速传播的骨干网络。OSPFv2的八态机和LSA的多类型让它在“精细”上赢,但在极端大规模下,额外状态带来的处理成本也会更明显。
不过在现实里,现在已经没有人靠“协议本身”扛收敛了,BFD快速检测、路由收敛优化、TE FRR这些机制早就是标配。选协议时没必要把“谁比谁收敛快”当成唯一标准,关键还是看网络规模和运维习惯。我个人的体会是:IS-IS在大网里确实更“皮实”,但OSPF在小网里配好了收敛也足够快。
4. 度量值、认证与扩展性的较量
4.1 度量值的两端:narrow/wide 与参考带宽的坑
IS-IS的度量值历史包袱比较重。早期只有6位,最多0到63,这在原来的小网络里够用,放到今天完全不够精细。于是有了wide metric,扩展TLV里的度量值可以达到24位,范围0~16777215。现在主流网络基本都要求配metric-style wide,这不是有没有格局的问题,是窄度量真的没法做精细流量调度。如果你把某个接口cost设成100,结果协议里narrow根本不认,路由盈亏完全不是你以为的那样。
OSPFv2的cost计算则简单直接,等于参考带宽除以接口带宽,参考带宽默认是100Mbps。这里有一个非常经典的坑:当链路速率超过参考带宽时,cost算出来都是1,比如千兆和万兆接口的cost都是1,OSPF根本分不清谁更快。解决办法是把参考带宽调到足够高,比如万兆网络就调成10000或更高,让不同速率链路cost拉开差距。很多老网在扩容时忘了改这个,导致全网的流量负载模型直接失效。
4.2 认证与可靠性机制:细节决定排障难度
两种协议都支持认证,但IS-IS的认证体系分得细:接口认证、区域认证、域认证,LSP和SNP里也能附带认证TLV。认证不匹配时,IS-IS邻居通常卡在Init状态,但LSP洪泛可能已经被污染,所以日志里不一定直接显示“认证失败”这么明确。OSPFv2也支持接口级和区域级认证,常用MD5或明文,配置不匹配会导致邻居状态反复跳,排查时优先看认证配置。
可靠性方面,现代设备上两种协议都支持NSF(不中断转发)和NSR(不中断路由),还有GR(优雅重启)机制。区别更体现在工程上:IS-IS因为LSP刷新和老化机制相对简洁,在故障接管时更少出现LSDB再同步风暴;OSPFv2则因为LSA种类多,GR重启时对端要处理的“数据库重同步”往往更重。但这些都是设备实现层面的差异,协议本身决定不了全部。
4.3 扩展性:TLV与新LSA的不同哲学
IS-IS能把IPv4、IPv6、TE、Segment Routing等能力都塞进去,靠的是TLV设计。你想加一个新特性,就加一个TLV,老设备不认也能忽略,兼容性好,向前兼容的路径非常平滑。这也是为什么很多运营商骨干网至今坚持IS-IS:它不是为一个地址族设计的,而是为一个可以不断长大的协议框架设计的。
OSPFv2的扩展则是“打补丁式的出新LSA”。从Router LSA到Network LSA、Summary LSA、AS External LSA、NSSA LSA,每一种LSA都有明确职责,但每加一种新场景就得设计新LSA类型和选项字段。OSPFv3干脆另起炉灶做IPv6版本,也说明OSPFv2的架构想原生支持IPv6会非常吃力。所以如果你规划的网络要长期演进,IS-IS的TLV路线更省心;如果只是企业网里跑跑IPv4,OSPFv2完全够用,不必过度设计。
5. 实际选型经验:什么样的网络该用谁
5.1 IS-IS偏爱的场景
运营商骨干网、大型ISP、MPLS骨干、Segment Routing网络,这几个地方IS-IS出现频率极高。原因不外乎:设备规模大,路由分层要求高,后期要叠加TE、SR、IPv6一套东西,TLV扩展更方便。IS-IS直接跑二层,对IP头部依赖低,在某些特殊链路上也更干净。加上它默认的L1/L2结构,天然适合“核心骨干一张网、接入分区各自跑”的物理形态。
我参与过的某跨区域骨干网项目,整网上千台设备,跑的就是IS-IS Level-2为主,Level-1只是边缘接入的小区域。当时之所以没选OSPF,有一个很直接的原因:骨干要求所有设备看到全网明细,而区域划分又要非常灵活,IS-IS的L2平面直接满足这个需求,不需要像OSPF那样到处设计Area和虚链路。再加上后续要上SR-TE,IS-IS的扩展能力让人放心。
5.2 OSPFv2更合适的场景
企业园区网、数据中心内部传统L3网络、分支互联、还有大量“团队里大家都熟OSPF”的网络环境,OSPFv2非常顺手。它区域划分方式直观,Router ID、Area、网络类型等概念在企业网里容易对应到业务和组织。多区域配合stub/NSSA可以做不少“外部路由不下沉”的策略控制,这在企业访问控制场景里很实用。
另外,OSPFv2的多厂商兼容性极好,生态完善。你随便找一台三层交换机,基本上都会支持OSPF,而IS-IS虽然支持也广,但在中低端设备的实现细节和排障工具上略少。如果团队对OSPF更熟悉,运维效率通常更高,这一点不该被忽视。
5.3 我的选型心法
我个人选型时会问三个问题:
- 网络规模会到多大?如果刚开始就规划超过几百台核心设备,或者后面可能变成一张大骨干,一条路走到IS-IS会更稳妥;如果规模不大,OSPF轻松搞定。
- 后续要不要跑IPv6、TE、SR这类新特性?要跑新特性,IS-IS的扩展性优势更值钱;纯IPv4且以后大概率不折腾,OSPFv2简单直观。
- 团队谁会维护?协议再强,没人会排障就是灾难。如果团队全是OSPF熟手,硬切IS-IS会有一段阵痛期。
说得再直白一点:企业网络求稳求熟,OSPFv2选它没毛病;运营商和大型骨干想面向未来,IS-IS基本是默认答案。这不是说IS-IS不能用于企业网,而是对你“成本和收益”的划算程度不同。
6. 配置实战与验证:两个协议的关键步骤
6.1 IS-IS最小配置:NET地址、Level和路由泄漏
IS-IS配置第一件事是NET地址,它是路由器在整个网络中的身份。NET地址由三部分组成:区域地址 + System ID + NSEL。平时看到一长串如49.0001.0000.0000.0001.00,就是区域49.0001、系统ID 0000.0000.0001、NSEL固定00。同一个区域内的所有设备区域地址要一致,System ID必须全网唯一,否则LSP会互相冲突。配置步骤大致如下:
router isis net 49.0001.0000.0000.0001.00 is-type level-2 metric-style wide接口侧配置要宣告进IS-IS:
interface GigabitEthernet0/0/1 isis enable isis circuit-type level-2如果一台路由器要同时承担L1和L2,is-type就配level-1-2。想让L2的明细路由进入L1区域,需要配置路由泄漏,方向和策略因厂商而异。我建议在一开始就明确这台设备是L1还是L2,避免L1/L2同时开启导致LSDB和SPF计算量翻倍。除非设备确实位于区域边界,否则没必要所有设备都level-1-2。
6.2 OSPFv2最小配置:Router ID、区域和网段
OSPFv2配置第一步是Router ID,建议手动指定,不要依赖自动选举。很多人图省事不配,结果设备重启后Router ID变了,邻居状态开始反复跳,排障排了半天发现是最不值得的坑。配置步骤示例:
router ospf 1 router-id 1.1.1.1 network 192.168.1.0 0.0.0.255 area 0在点对点和广播链路上网络类型可能需要调整,比如NBMA环境下要改网络类型或者用peer。默认情况下广播网络会选举DR/BDR,如果你确实不需要DR/BDR因为只有两台路由器互联,可以手动设为点对点类型,能省掉DR选举带来的收敛延迟。
OSPF多区域时,注意每个region的口径,比如area 1要连area 0且通过ABR设备。不要让一个非骨干区域变成“孤儿区”,实在没法直连时再考虑虚链路,但能不用就不用。
6.3 验证命令与故障分析思路
最简单、最直接的验证手段就是看邻居表、LSDB和路由表。IS-IS看邻居用“show isis neighbors”或厂商对应的display命令,重点看状态是否为Up,邻接类型L1/L2是否和你预期一致。再看LSDB的时候要注意LSP数量是否合理,LSP的序列号是否在正常增长。如果发现某个LSP一直不刷新,可能配合老化机制慢慢清除,不要干等,先查链路问题。
OSPFv2看邻居状态就更直观了,Full表示建邻完成,2-Way可能只是广播网络下不能建邻的普通邻居。看LSDB时重点检查Router LSA、Network LSA是否齐全,ABR上有没有生成Summary LSA。路由表里出现大量“O IA”和“O E2”时,说明区域间和外部路由都进来了,和预期对不上就往回查。
排障思路我习惯从下往上:先看物理链路,再看二层封装,然后看协议邻居,最后看LSDB和路由表。很多IS-IS起不来的问题其实是二层不互通,OSPF也一样,不要一上来就怀疑算法,先查最基础的东西。
7. 常见问题排查速查与避坑补遗
7.1 邻居起不来的高频原因
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| IS-IS邻居一直Init | NET区域地址不一致、System ID冲突、认证不匹配 | 核对NET和认证配置,抓Hello报文看TLV |
| IS-IS邻居Up后路由表没有L1路由 | L1设备没做路由泄漏或链路层is-type不匹配 | 确认L1/L2边界设备,show isis route |
| OSPF邻居卡ExStart | MTU不匹配、Router ID冲突 | 两端接口MTU改成一致,检查Router ID |
| OSPF邻居卡Two-Way | 接口网络类型不适合、优先级全0 | 确认广播网络DR/BDR选举,必要时改点对点 |
| OSPF路由学不全 | 区域类型配错、ABR没做汇总或过滤 | 查看LSA类型和ABR上的Area配置 |
7.2 路由学不到或路径不对的坑
IS-IS的路由泄漏是重灾区。很多网络规划时写了一大堆路由策略,但漏了“L2到L1的路由泄漏”这一步,结果L1区域只能看到默认路由,远端网段全不可达。这不算协议bug,而是设计时没理解L1/L2的信息流方向。
OSPF则要小心“区域边界错位”。有人把同一台设备下连的两条链路分别规划成area 0和area 1,但ABR位置没设计清楚,导致区域间路由由非预期设备做翻译。结果是路由学得到但下一跳绕路,路径看起来“怪怪的”。这种问题看ABR汇总和路由传播方向最能定位。
7.3 容易被忽略的细节
第一个是DIS抢占问题。IS-IS广播链路上如果所有设备默认优先级相同,DIS身份可能变化,每次变化都会重建伪节点并重新洪泛LSP。在稳定骨干上建议手动设置接口优先级,让固定的核心设备做DIS。
第二个是参考带宽。OSPF自动算cost,如果不调参考带宽,千兆以上接口cost全为1。别以为“反正负载均衡就完了”,当链路速率不同时,这会造成低带宽链路和高带宽链路被当成等价路径,流量被打到低速口上。
第三个是LSP/LSA老化机制。IS-IS的LSP默认刷新周期15分钟,老化为20分钟,OSPF的LSA则是一小时老化,半小时刷新。如果你抓包看到周期性的LSP/LSA刷新,别当成异常,它是协议正常心跳。真正要查的是“过期LSP清除不掉”或者“LSA序列号异常增长”,那才是脑洞。
7.4 一些从实践中摸索出的经验
我平时维护这两类协议网络时,养成了一些固定习惯。一是所有设备的手动Router ID或IS-IS NET地址都记录在资产表里,并和物理设备绑定,防止配置迁移时身份错乱。二是在关键链路上统一开BFD,让两个协议都能快速感应链路故障,而不是等Hello超时。三是每次改配置前先备份相关进程和接口配置,尤其是IS-IS的level调整和OSPF的区域类型,改错一条就可能全网震荡。
四是监控LSP/LSA的数量和序列号。数量突然暴涨往往意味着有环或设备异常;序列号跳得飞快说明某台设备可能在频繁重启或配置抖动。这些监控项不复杂,但能提前暴露很多隐藏问题。
最后分享一个我自己的小习惯:不管最终选了IS-IS还是OSPFv2,我都会把整网的“协议设计图”画出来,标注好区域/Level边界、ABR/L1L2位置、路由泄漏策略、认证范围和BFD部署点。这个图平时看着麻烦,真出问题的时候,比翻任何命令输出都管用。协议无绝对优劣,能让你睡得着觉、出得了事、接得了盘的那一个,就是眼下最合适的。