路由协议
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 类。
我们可以用一个“社交圈”的比喻来理解它们的区别:
- Type-1 LSA (Router LSA):我是谁,我连着谁 一句话总结:每台路由器都会发出的“个人名片”。
发送者: 区域内的每一台路由器。
范围: 仅在产生的那个区域(Area)内传输,不会跨越区域。
内容:
“我是谁”(Router ID)。
“我有几个接口”。
“每个接口的 IP 地址、掩码和开销(Cost)”。
本质: 它描述的是路由器的自我宣告。如果有 10 台路由器,区域里就会有 10 条 1 类 LSA
- Type-2 LSA (Network LSA):咱们这块儿都有谁 一句话总结:由“班长”(DR, Designated Router, 指定路由器)代表整个网段发出的“集体合照”。
发送者: 只有 DR(指定路由器) 才会产生。
范围: 同样仅在产生它的区域(Area)内传输。
内容:
“咱们这个多路访问网段(比如以太网)的掩码是什么”。
“目前在这个网段里,活跃的‘邻居’(路由器)都有谁”。
本质: 它描述的是一个多路由器连接的公共网段。
如果没有 2 类 LSA,路由器只知道自己连到了一个网段,但不知道那个网段上还有谁。
OSPF State Machine
路由器从互不相识到最后“亲密无间”(Full),会经历一个状态机的转换过程。
- Down 状态这是初始状态。路由器还没发送或收到任何 Hello 包。
-
Init 状态 (初始化)路由器收到了邻居的 Hello 包,但在这个包的“邻居列表”里还没看到自己的名字。这说明:“你看到我了,但我还没看到你看到我”。
-
2-Way 状态 (双向通信)路由器在邻居的 Hello 包里看到了自己的 Router-ID。关键点: 这是邻居关系的里程碑。如果是广播网络,DR 和 BDR 的选举就在这个阶段完成。普通学生(DRother)之间通常就停留在这一步。
-
ExStart 状态 (预启动)大家准备开始同步数据库了。这时候会先发一个空的 DD 报文,目的是“比大小”(选举主从关系 Master/Slave),Router-ID 大的当 Master,负责控制序列号,保证同步不乱套。
-
Exchange 状态 (交换)Master 和 Slave 选好了,大家开始正式交换 DD 报文(目录单)。比喻: “这是我图书馆里所有书的目录,你看看你缺哪本?”
-
Loading 状态 (加载)路由器对比目录后,发现对方有自己没有的信息,就会发送 LSR 请求,对方回以 LSU。比喻: “这本《OSPF 进阶》我没有,请借给我看看。”
-
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 的三步走:
- R1 发送 Hello: “大家好,我是 R1,我目前还没看到任何邻居。” (Neighbor List 为空)
- R2 收到并回复: R2 看到 R1 的包,记录下 R1。然后 R2 发出 Hello:“大家好,我是 R2,我看到了 R1。” (Neighbor List = 1.1.1.1)
- 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算法 计算出通往目的地的最短路径。
原理
- 为什么 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 无效,因为攻击者很难从三层渗透到二层的控制平面。
- 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 转发表里。
- 一个直观的比喻 我们可以把 OSPF 比作“手机导航”,把 IS-IS 比作“修路工人”。
OSPF (三层): 就像在 App 上查路线,你必须先联网(有 IP 连通性),如果网络层(IP)出了问题,导航就断了。
IS-IS (二层): 就像修路工人在地表直接铺路。哪怕路还没起名字(没有 IP),工人只要能看到对面的工地(二层连通),就能把路铺过去,并标记好哪里有坑、哪里路宽。
IS-IS 这种“脱离 IP 办大事”的能力,让它在以下场景无敌:
大规模运营商网络: 节点上万,稳定性第一,不能因为 IP 层波动导致路由协议崩溃。
新协议部署(如 IPv6/SRv6): 因为它不看 IP,所以你可以很方便地在同一套二层拓扑上跑多种三层协议,这就是 Integrated IS-IS(集成化 IS-IS) 的魅力。
IS-IS 模块
- 身份识别:它是怎么认人的?(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 地址也能建立邻居。
-
层级结构:它是怎么划分地盘的? IS-IS 把路由器分成三个等级,这决定了“地图”怎么传:
-
Level-1 (L1): “居委会”。只负责自己区域内的路线,对外面的世界一无所知。
-
Level-2 (L2): “省交通厅”。负责连接各个区域,是网络的骨干。
-
Level-1/2 (L1/2): “中转站”。它是最常见的角色,一只脚在 L1(了解区域内),一只脚在 L2(了解全网)。
规则:
L1 路由器要去别的区域,必须把包交给 L1/2 路由器。
所有的 L2 和 L1/2 路由器连在一起,构成了整个网络的“脊梁骨”(骨干网)。
- 邻居关系:怎么打招呼并交换地图?
当两台运行 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 列表,缺了哪张“碎片”就问邻居要,多了就发给邻居。最终,区域内所有路由器的地图都一模一样。
- 广播网中的“班长”:DIS 如果 10 台路由器连在同一个交换机上(广播环境),大家两两建立邻居会很乱。于是 IS-IS 会选出一个“班长”,叫 DIS (Designated IS)。
它的作用: 负责同步所有人的地图,确保大家的信息是一致的。
特点: * 抢占式: 只要新来的路由器优先级更高,立刻当班长(这和 OSPF 的 DR 不同)。
没有备份: DIS 挂了立刻选新的,不需要专门的“副班长”。
- 核心报文: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,路由器怎么知道包该发给谁?”
- 它是如何定位的?(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 地址,直接封装成二层帧发出去。
- 两个关键的二层组播 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 找你请求。
- 为什么它比 OSPF “快”? 这也是二层运行带来的隐形福利:
减少封装开销: 少了一层 IP 头部处理,CPU 解析报文的速度理论上更快。
DIS 的高效率: 在以太网中,DIS(班长)会定期发送 CSNP。如果某个节点挂了或者新加入,大家通过对比二层的 CSNP 摘要,能以极快的速度完成拓扑同步,而不需要等待三层定时器超时。
TLV
TLV 是 IS-IS 协议的“灵魂”。如果把 IS-IS 报文比作一辆货运列车,那么 TLV 就是车厢里一个一个独立的集装箱。
这种设计让 IS-IS 拥有了极强的可扩展性。当我们需要传输新的信息(比如从 IPv4 升级到 IPv6)时,不需要更换整列火车,只需要挂载一个新的集装箱(TLV)即可。
-
TLV 的结构拆解TLV 是三个单词的缩写,每个字段都有明确的分工:
-
T (Type/Tag):类型。 用一个数字表示这个数据包里装的是什么。比如 Type 128 代表 IP 内部可达性,Type 135 代表扩展的 IP 可达性。
-
L (Length):长度。 告诉路由器这个数据的具体字节数,这样路由器就知道从哪里开始读,到哪里结束。
-
V (Value):数值。 真正的“干货”内容,比如具体的 IP 地址、掩码、开销值(Metric)等。
-
为什么 TLV 设计如此精妙?在传统的网络协议中,报文格式通常是固定的。死板的协议(如 OSPFv2): 字段的位置是写死的。如果想增加一个功能,必须重新定义报文格式,甚至开发新版本(如 OSPFv3)。灵活的 IS-IS: 它是“按需加载”。如果路由器收到一个它不认识的 Type,它不会报错死机,而是根据 Length 字段直接跳过这部分,处理后面的数据。这种“向后兼容性”非常强大: 老设备虽然看不懂新功能,但不会阻碍新功能在全网的传递。
-
常见的 TLV 举例为了让你更有体感,看看 IS-IS 在实际工作中都装了些什么:
| Type (类型) | 名称 | 作用 |
|---|---|---|
| 1Area Addresses | 告诉邻居自己属于哪个区域 | |
| 2IS Neighbors | 告诉大家自己的邻居是谁(构建地图的关键) | |
| 128IP Int. Reachability | 携带区域内的 IPv4 路由信息 | |
| 129Protocols Supported | 告诉别人我支持 IPv4 还是 IPv6 | |
| 132IP Interface Address | 接口的 IP 地址 | |
| 22Extended IS Neighbors | 为了支持 TE(流量工程) 增加的增强型邻居信息 |
- 现实意义: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),轻而易举地接管了这些复杂的新功能。
支持多拓扑: 可以在同一套物理设备上,为视频流和普通上网流量计算出完全不同的路径。
- 一个形象的比喻 你可以把 TLV 想象成乐高积木:
固定报文协议 就像是一个整体注塑的塑料玩具,想加个翅膀?对不起,得重买一个。
TLV 结构的 IS-IS 就像乐高,你想加个翅膀(IPv6)、加个推进器(SRv6),只需要在原来的积木块上插个新组件就行。