Skip to content

路由协议

OSPF

基础知识

OSPF 是一种链路状态路由协议(Link-State Routing Protocol)。

非传闻式路由: 与 RIP 那种“听邻居说远方有什么”的距离矢量协议不同,OSPF 路由器会交换详细的链路状态信息,最终每台路由器手里都有一张全网拓扑图。

计算法宝: 它使用 Dijkstra 算法(最短路径优先算法,SPF)来计算到达目的地的最佳路径。

OSPF 如何工作的

OSPF 的运行可以概括为三个主要阶段:

第一步:建立邻居关系 (Neighbor Adjacency) 路由器通过发送 Hello 包 来寻找周围运行 OSPF 的邻居。大家见个面,对对暗号(比如区域 ID、掩码、认证等),如果合得来,就建立邻居关系。

第二步:同步数据库 (LSDB Synchronization) 这是最关键的一步。邻居之间会互换 LSA(Link State Advertisement,链路状态通告)。打个比方: 每一条 LSA 就像是一张小地图碎片,记录着“我连接着哪个网段,带宽是多少”。路由器把收集到的所有碎片拼在一起,形成 LSDB(链路状态数据库)。这时候,全网路由器的数据库都是一模一样的。

第三步:计算最优路径 (SPF Calculation) 有了全网地图,每台路由器都会以自己为根,利用 SPF 算法计算出一棵“最短路径树”,并把结果塞进路由表。 \(\(Cost = \frac{Reference\ Bandwidth}{Interface\ Bandwidth}\)\) 注:OSPF 使用“开销(Cost)”作为度量值,带宽越高,Cost 越小,路径越优。

OSPF 的“层级化管理”:区域 (Area) 如果网络规模非常大,几千台路由器天天交换 LSA,内存和 CPU 都会爆掉。为了解决这个问题,OSPF 引入了区域的概念: - 骨干区域 (Area 0): 所有非骨干区域必须直接连接到这里。它是信息的“中转站”。 - 非骨干区域: 负责局部的数据转发。 优势: 减少了 LSA 的泛洪范围,节约了路由器资源,也方便了管理。

为什么要学 OSPF?(它的优点) - 收敛速度快: 网络一旦有变动,OSPF 能迅速感知并重新计算路径。 - 无环路: 既然大家手里都有地图,自然不会像瞎子摸象那样绕圈子。 - 支持 VLSM: 完美支持子网划分,不浪费 IP 地址。 - 触发更新: 没变化时不发完整路由表,只发微小的 Hello 包维持感情,节省带宽。

OSPF paccket types

OSPF 所有的工作都是靠这五种不同颜色的“信件”完成的,它们直接封装在 IP 协议中(协议号 89)。

报文名称 英文全称 俗称 作用
Hello Hello Packet 打招呼 发现并维持邻居关系,选举 DR/BDR。
DD Database Description 目录单 包含本地 LSDB 的摘要,让对方知道我手里的地图大概长啥样。
LSR Link State Request 求助信 看了对方的 DD 后,发现自己缺了某块地图,请求对方发给我。
LSU Link State Update 送货单 包含真正的 LSA 详细信息,是 OSPF 报文中分量最重的一个。
LSAck Link State Ack 确认收据 对收到的 LSU 进行确认,保证可靠性。

LSR,LSU,LSAck

LSR、LSU、LSA 到底长什么样?你可以把它们想象成不同层级的“包裹”: - LSA (Link State Advertisement): 它不是独立的报文,而是信件的内容。它描述了链路的细节(IP 地址、掩码、开销)。 - LSU (Link State Update): 它是信封,专门用来装 LSA。一个 LSU 报文里可以塞进好几个 LSA。 - LSR (Link State Request): 它是一张清单,上面写着:“我想要 ID 为 1.1.1.1 的那个 LSA”。

报文结构的“套娃”关系:
$$[ IP Header (协议号 89) ] + [ OSPF Header ] + [ OSPF Payload (LSR/LSU内容) ]$$

在 OSPF 的世界里,LSA(链路状态通告)就是地图上的标注信息。虽然 LSA 有很多种(1 到 11 类都有),但最基础、最必须理解的就是 1 类和 2 类。

我们可以用一个“社交圈”的比喻来理解它们的区别:

  1. Type-1 LSA (Router LSA):我是谁,我连着谁 一句话总结:每台路由器都会发出的“个人名片”。

发送者: 区域内的每一台路由器。

范围: 仅在产生的那个区域(Area)内传输,不会跨越区域。

内容:

“我是谁”(Router ID)。

“我有几个接口”。

“每个接口的 IP 地址、掩码和开销(Cost)”。

本质: 它描述的是路由器的自我宣告。如果有 10 台路由器,区域里就会有 10 条 1 类 LSA

  1. Type-2 LSA (Network LSA):咱们这块儿都有谁 一句话总结:由“班长”(DR, Designated Router, 指定路由器)代表整个网段发出的“集体合照”。

发送者: 只有 DR(指定路由器) 才会产生。

范围: 同样仅在产生它的区域(Area)内传输。

内容:

“咱们这个多路访问网段(比如以太网)的掩码是什么”。

“目前在这个网段里,活跃的‘邻居’(路由器)都有谁”。

本质: 它描述的是一个多路由器连接的公共网段。

如果没有 2 类 LSA,路由器只知道自己连到了一个网段,但不知道那个网段上还有谁。

OSPF State Machine

路由器从互不相识到最后“亲密无间”(Full),会经历一个状态机的转换过程。

  1. Down 状态这是初始状态。路由器还没发送或收到任何 Hello 包。
  2. Init 状态 (初始化)路由器收到了邻居的 Hello 包,但在这个包的“邻居列表”里还没看到自己的名字。这说明:“你看到我了,但我还没看到你看到我”。

  3. 2-Way 状态 (双向通信)路由器在邻居的 Hello 包里看到了自己的 Router-ID。关键点: 这是邻居关系的里程碑。如果是广播网络,DR 和 BDR 的选举就在这个阶段完成。普通学生(DRother)之间通常就停留在这一步。

  4. ExStart 状态 (预启动)大家准备开始同步数据库了。这时候会先发一个空的 DD 报文,目的是“比大小”(选举主从关系 Master/Slave),Router-ID 大的当 Master,负责控制序列号,保证同步不乱套。

  5. Exchange 状态 (交换)Master 和 Slave 选好了,大家开始正式交换 DD 报文(目录单)。比喻: “这是我图书馆里所有书的目录,你看看你缺哪本?”

  6. Loading 状态 (加载)路由器对比目录后,发现对方有自己没有的信息,就会发送 LSR 请求,对方回以 LSU。比喻: “这本《OSPF 进阶》我没有,请借给我看看。”

  7. Full 状态 (全毗邻)当所有的 LSR 请求都被满足,两台路由器的 LSDB(数据库)达到完全同步。终点: 这标志着拓扑学习完成,可以开始用 SPF 算法算路了.

串联:报文与状态的对应关系 为了方便记忆,我们可以看这个过程: - Hello \(\rightarrow\) 触发 Init 和 2-Way。 - DD \(\rightarrow\) 触发 ExStart 和 Exchange。 - LSR / LSU / LSAck \(\rightarrow\) 触发 Loading。 - 同步完成 \(\rightarrow\) 到达 Full.

2. 深入 2-Way 状态

它是怎么形成的?

2-Way 状态是邻居关系中第一个“稳定期”。它的达成标志着双向通信的建立。达成 2-Way 的三步走:

  1. R1 发送 Hello: “大家好,我是 R1,我目前还没看到任何邻居。” (Neighbor List 为空)
  2. R2 收到并回复: R2 看到 R1 的包,记录下 R1。然后 R2 发出 Hello:“大家好,我是 R2,我看到了 R1。” (Neighbor List = 1.1.1.1)
  3. R1 确认: R1 收到 R2 的包,发现里面有自己的名字。R1 心想:“噢!R2 已经认识我了!”。此时 R1 也会发一个包,里面带着 R2 的名字。当双方都在对方的邻居列表里看到自己时,2-Way 达成。
2-Way 里的“策划”:选举 DR 和 BDR

如果你说的“策划”是指在这个阶段发生的决策,那最重要的就是 DR/BDR 的选举。在广播网络(比如连在同一个交换机上)里,大家到了 2-Way 状态后,并不会急着进入下一阶段,而是先停下来“开个会”:

  • 看优先级 (Priority): 默认都是 1,数值大的当选。如果设为 0,代表弃权(永远当普通学生)。
  • 看 Router-ID: 如果优先级一样,Router-ID 大的当选。

为什么要在这个阶段选?因为 OSPF 极其注重效率。选出“班长(DR)”后,后面的数据库同步(ExStart, Exchange 等)只需要跟班长同步就行了,不需要跟每个同学都同步一遍。

特殊情况:为什么有时停在 2-Way 不动了?

这是一个很常见的现象。如果在同一个网段有三台路由器(R1, R2, R3),且 R3 是 DR,R2 是 BDR。

  • R1 与 R3 之间 \(\rightarrow\) Full
  • R1 与 R2 之间 \(\rightarrow\) Full
  • R2 与 R1 之间 (DRother 之间) \(\rightarrow\) 永远保持 2-Way

它们会维持邻居关系,互发 Hello 包“保鲜”,但绝不交换地图。

`

Diikstra 算法

IS-IS 协议

IS-IS 是一个链路状态协议(Link-State),这意味着每台路由器都不听信“邻居传来的谣言”,而是自己收集全网的信息,画出一张完整的“地图”,然后用 SPF算法 计算出通往目的地的最短路径。

原理

  1. 为什么 IS-IS 在二层就可以运行? 简单直接的原因是:IS-IS 根本不是为 TCP/IP 协议栈设计的。

出身名门: IS-IS 最早是由 ISO(国际标准化组织)为 CLNP(无连接网络协议)设计的。CLNP 是当时准备用来取代 IP 协议的“竞争对手”。

不依赖 IP: 既然它设计时就没打算跑在 IP 上,它自然不需要 IP 头部。它直接封装在数据链路层(以太网帧)里,就像 ARP 协议或 STP(生成树)协议一样。

对比封装结构: OSPF 封装: [二层帧头] [IP 头部 (Protocol 89)] [OSPF 报文]

IS-IS 封装: [二层帧头] [LLC 头部] [IS-IS 报文]

在二层运行的好处:

更稳定: 即使路由器的接口没有配置 IP 地址,或者 IP 地址配置错误,IS-IS 依然可以建立邻居并发现拓扑。

更安全: 针对 IP 层的攻击(如 IP 碎片攻击、IP 欺骗)对 IS-IS 无效,因为攻击者很难从三层渗透到二层的控制平面。

  1. IS-IS 的工作原理(全过程) IS-IS 的核心逻辑可以拆解为:邻居建立 -> 链路信息交换 -> 路径计算。

A. 邻居建立(Hello 阶段) 两台路由器连上网线后,会互相发送 IIH (IS-to-IS Hello) 报文。

认亲: 检查大家的 Area ID。

L1 路由器只能和同区域的 L1 建立关系。

L2 路由器可以跨区域建立关系。

选班长(DIS): 在广播网(如以太网)中,大家会选出一个 DIS,负责同步全网地图。

B. 链路信息交换(LSP 阶段) 邻居建立好了,开始“交换名片”。

产生 LSP (Link State PDU): 每台路由器都会生成一个 LSP,里面包含了:“我是谁、我连着谁、我的 Cost 是多少、我挂载了哪些网段(TLV)”。

泛洪 (Flooding): 路由器把自己的 LSP 发给所有邻居,邻居再传给邻居。很快,全区域所有路由器手里都有一份完全一样的 LSP 集合。

同步 (CSNP/PSNP): 为了防止漏掉信息,路由器会发送 CSNP(摘要列表)。如果你发现邻居发来的摘要里有你没有的 LSP,你就发个 PSNP(请求包)找他要。

C. 路径计算(SPF 阶段) 当每台路由器脑子里都有一张完整的全网拓扑图(LSDB 数据库)后:

它会以自己为根,运行 SPF(最短路径优先)算法。

它不关心 IP 怎么跳,它只关心在二层拓扑里,哪条路到那个 System ID 的 Cost 总和最小。

最后,它把计算出的最优路径映射到 IP 转发表里。

  1. 一个直观的比喻 我们可以把 OSPF 比作“手机导航”,把 IS-IS 比作“修路工人”

OSPF (三层): 就像在 App 上查路线,你必须先联网(有 IP 连通性),如果网络层(IP)出了问题,导航就断了。

IS-IS (二层): 就像修路工人在地表直接铺路。哪怕路还没起名字(没有 IP),工人只要能看到对面的工地(二层连通),就能把路铺过去,并标记好哪里有坑、哪里路宽。

IS-IS 这种“脱离 IP 办大事”的能力,让它在以下场景无敌:

大规模运营商网络: 节点上万,稳定性第一,不能因为 IP 层波动导致路由协议崩溃。

新协议部署(如 IPv6/SRv6): 因为它不看 IP,所以你可以很方便地在同一套二层拓扑上跑多种三层协议,这就是 Integrated IS-IS(集成化 IS-IS) 的魅力。

IS-IS 模块

  1. 身份识别:它是怎么认人的?(NET地址)

在 OSPF 里,路由器靠 Router ID。在 IS-IS 里,每台路由器必须有一个“身份证号”,叫 NET (Network Entity Title)。

  • 一个典型的地址长这样:49.0001.0000.0000.0001.00

  • 区域标识(49.0001): 前缀。告诉别人你在哪个区。

  • 系统 ID(0000.0000.0001): 中间的 6 字节。在整个网络里必须唯一,通常把路由器的 Loopback 接口 IP 转换过来。

  • SEL(00): 最后 2 位。在 IP 网络里永远是 00。

初学者重点: IS-IS 是基于二层(链路层)的,所以它不需要 IP 地址也能建立邻居。

  1. 层级结构:它是怎么划分地盘的? IS-IS 把路由器分成三个等级,这决定了“地图”怎么传:

  2. Level-1 (L1): “居委会”。只负责自己区域内的路线,对外面的世界一无所知。

  3. Level-2 (L2): “省交通厅”。负责连接各个区域,是网络的骨干。

  4. Level-1/2 (L1/2): “中转站”。它是最常见的角色,一只脚在 L1(了解区域内),一只脚在 L2(了解全网)。

规则:

L1 路由器要去别的区域,必须把包交给 L1/2 路由器。

所有的 L2 和 L1/2 路由器连在一起,构成了整个网络的“脊梁骨”(骨干网)。

  1. 邻居关系:怎么打招呼并交换地图?

当两台运行 IS-IS 的路由器连在一起时,它们会经历以下过程:

  • 打招呼 (Hello PDU):

我发一个 Hello 包:“嘿,我是 0001,我是 L1 等级的,你在哪?”

对方回一个 Hello:“收到,我是 0002,我也是 L1,咱俩能做邻居。”

  • 交换“地图碎片” (LSP):

IS-IS 不传路由条目,传的是 LSP (Link State PDU)。

LSP 就像是一张纸,上面写着:“我是路由器 A,我左边连着 B,右边连着 C,开销(Cost)分别是 10。”

  • 同步地图 (CSNP/PSNP):

路由器会定期对比各自的 LSP 列表,缺了哪张“碎片”就问邻居要,多了就发给邻居。最终,区域内所有路由器的地图都一模一样。

  1. 广播网中的“班长”:DIS 如果 10 台路由器连在同一个交换机上(广播环境),大家两两建立邻居会很乱。于是 IS-IS 会选出一个“班长”,叫 DIS (Designated IS)。

它的作用: 负责同步所有人的地图,确保大家的信息是一致的。

特点: * 抢占式: 只要新来的路由器优先级更高,立刻当班长(这和 OSPF 的 DR 不同)。

没有备份: DIS 挂了立刻选新的,不需要专门的“副班长”。

  1. 核心报文:TLV 结构(为什么它这么好?)

这是 IS-IS 最精华的部分。IS-IS 的报文是由 TLV (Type, Length, Value) 构成的。

  • Type: 这是什么类型的数据(比如:名字、IPv4地址、IPv6地址)。

  • Length: 数据有多长。

  • Value: 具体内容。

IS-IS vs OSPF:该选哪一个?

比较项|OSPF (常见的)|IS-IS (运营商/大厂)|灵活性|区域划分|严格,必须连 Area 0|区域划分灵活,链路就是边界|稳定性|容易受 IP 层抖动影响|运行在二层,非常稳定|扩展性|修改协议较难|增加 TLV 极快,适应新技术能力强|维护难度|中等|稍微高一点(地址格式奇怪)

NET地址

“既然没有 IP,路由器怎么知道包该发给谁?”

  1. 它是如何定位的?(NSAP 地址架构) IS-IS 使用的是 OSI 模型的地址体系,叫 NSAP。为了方便 IP 网络使用,我们精简出了 NET 地址。

Area ID (49.0001): 相当于“邮编”。告诉二层链路,这个设备属于哪个逻辑区域。

System ID (0000.0000.0001): 相当于“身份证号”。它是全网唯一的二层标识。

在以太网里,路由器会建立一个映射表:将这个 System ID 和对方的 MAC 地址 绑定。

原理: 当 A 要发报文给 B 时,它查找 LSDB(地图),发现要去目的地必须经过 System ID 0001,然后查询二层邻居表,找到对应的 MAC 地址,直接封装成二层帧发出去。

  1. 两个关键的二层组播 MAC 因为 IS-IS 运行在二层,它不能往特定的 IP 发包,所以它定义了两个专用的组播 MAC 地址来“喊话”:

0180-C200-0014: 专门发给全网所有的 Level-1 路由器。

0180-C200-0015: 专门发给全网所有的 Level-2 路由器。

想象一下这个场景: 一台新路由器插上网线,它不需要给自己配 IP,直接向 0180-C200-0014 喊一句:“我是 L1 路由器 A,谁在附近?”。所有同区域的 L1 路由器听到这个二层组播,就开始和它建立邻居。这就是它“插电即发现”的二层特性。

. IS-IS 的三种核心报文(PDU) 在二层传输时,IS-IS 不叫“数据包(Packet)”,叫 PDU(协议数据单元)。你只需要记住这三类“信件”:

Hello PDU (IIH): 握手用的。维持邻居关系。

LSP (Link State PDU): 真正的“地图碎片”。包含了路由信息和拓扑信息。

SNP (Sequence Number PDU): 确认用的“收条”和“目录”。

CSNP: 全目录。告诉你我手里所有的地图编号。

PSNP: 缺课补习。发现你的目录里有我没有的 LSP,我发个 PSNP 找你请求。

  1. 为什么它比 OSPF “快”? 这也是二层运行带来的隐形福利:

减少封装开销: 少了一层 IP 头部处理,CPU 解析报文的速度理论上更快。

DIS 的高效率: 在以太网中,DIS(班长)会定期发送 CSNP。如果某个节点挂了或者新加入,大家通过对比二层的 CSNP 摘要,能以极快的速度完成拓扑同步,而不需要等待三层定时器超时。

TLV

TLV 是 IS-IS 协议的“灵魂”。如果把 IS-IS 报文比作一辆货运列车,那么 TLV 就是车厢里一个一个独立的集装箱。

这种设计让 IS-IS 拥有了极强的可扩展性。当我们需要传输新的信息(比如从 IPv4 升级到 IPv6)时,不需要更换整列火车,只需要挂载一个新的集装箱(TLV)即可。

  1. TLV 的结构拆解TLV 是三个单词的缩写,每个字段都有明确的分工:

  2. T (Type/Tag):类型。 用一个数字表示这个数据包里装的是什么。比如 Type 128 代表 IP 内部可达性,Type 135 代表扩展的 IP 可达性。

  3. L (Length):长度。 告诉路由器这个数据的具体字节数,这样路由器就知道从哪里开始读,到哪里结束。

  4. V (Value):数值。 真正的“干货”内容,比如具体的 IP 地址、掩码、开销值(Metric)等。

  5. 为什么 TLV 设计如此精妙?在传统的网络协议中,报文格式通常是固定的。死板的协议(如 OSPFv2): 字段的位置是写死的。如果想增加一个功能,必须重新定义报文格式,甚至开发新版本(如 OSPFv3)。灵活的 IS-IS: 它是“按需加载”。如果路由器收到一个它不认识的 Type,它不会报错死机,而是根据 Length 字段直接跳过这部分,处理后面的数据。这种“向后兼容性”非常强大: 老设备虽然看不懂新功能,但不会阻碍新功能在全网的传递。

  6. 常见的 TLV 举例为了让你更有体感,看看 IS-IS 在实际工作中都装了些什么:

Type (类型) 名称 作用
1Area Addresses 告诉邻居自己属于哪个区域
2IS Neighbors 告诉大家自己的邻居是谁(构建地图的关键)
128IP Int. Reachability 携带区域内的 IPv4 路由信息
129Protocols Supported 告诉别人我支持 IPv4 还是 IPv6
132IP Interface Address 接口的 IP 地址
22Extended IS Neighbors 为了支持 TE(流量工程) 增加的增强型邻居信息
  1. 现实意义:IS-IS 的“长生不老” 正是因为 TLV,IS-IS 经历了几十年的技术迭代依然是顶流:

支持 IPv6: 只需要定义几个新的 TLV(如 Type 236),IS-IS 就能跑 IPv6 了,不需要像 OSPF 那样从 v2 彻底重构到 v3。

支持 SR (Segment Routing): 现在的 5G 和云网融合核心技术是 SRv6,IS-IS 通过新增几个子 TLV (Sub-TLV),轻而易举地接管了这些复杂的新功能。

支持多拓扑: 可以在同一套物理设备上,为视频流和普通上网流量计算出完全不同的路径。

  1. 一个形象的比喻 你可以把 TLV 想象成乐高积木:

固定报文协议 就像是一个整体注塑的塑料玩具,想加个翅膀?对不起,得重买一个。

TLV 结构的 IS-IS 就像乐高,你想加个翅膀(IPv6)、加个推进器(SRv6),只需要在原来的积木块上插个新组件就行。