OSPF、IS-IS 与 BGP 路由协议
内容摘要:动态路由协议让路由器交换可达性并在拓扑变化后重新收敛。本章比较 RIP、OSPF、IS-IS 与 BGP 的定位,重点拆解 OSPF/IS-IS 的链路状态数据库与 SPF、BGP 的 TCP 会话、有限状态机、路径属性和策略决策,解释 iBGP/eBGP、路由反射器与互联网路由安全。核心边界:IGP 追求域内可达与快速收敛,BGP 追求跨域策略与可控传播;BGP 不等于“最短路径协议”。
一、协议定位:先按管理边界分类
自治系统(Autonomous System,AS) 是对外呈现一致路由策略的网络管理域,用自治系统号(Autonomous System Number,ASN)标识。
| 协议 | 类型 | 典型范围 | 核心算法/模型 | 最适合 |
|---|---|---|---|---|
| RIP | IGP | 小型网络 | 距离矢量、跳数 | 教学、遗留小网 |
| OSPF | IGP | 企业、园区、数据中心 | 链路状态 + Dijkstra SPF | 多厂商 IP 网络 |
| IS-IS | IGP | 运营商、大型骨干、部分数据中心 | 链路状态 + Dijkstra SPF | 高扩展性、大规模域内 |
| BGP | EGP/路径矢量 | AS 间;也用于 AS 内传播外部路由 | 路径属性 + 策略决策 | 互联网、云/数据中心策略路由 |
不是替代关系:典型运营商同时运行 OSPF/IS-IS 保障内部 loopback 与下一跳可达,再运行 iBGP/eBGP 传播互联网或业务前缀。若 IGP 不可达 BGP
NEXT_HOP,BGP 路由即使存在也不能正常转发。
二、OSPF:域内链路状态协议
开放最短路径优先(Open Shortest Path First,OSPF) 是 IGP。OSPFv2(RFC 2328)服务 IPv4;OSPFv3(RFC 5340)最初服务 IPv6,后续扩展可承载更多地址族。
1、工作流程
RFC 2328 的关键性质:
- 同一区域内路由器维护一致的链路状态数据库(Link-State Database,LSDB)。
- 每台路由器以自己为根运行 Dijkstra,生成最短路径树。
- 支持区域层次与等价多路径(ECMP)。
- 以**代价(cost)**作为无量纲度量;如何从带宽映射到 cost 是实现/配置问题。
2、OSPF 报文类型与字段
OSPF 直接封装在 IP 中,IPv4 协议号为 89,不是 TCP/UDP 端口。
| 报文 | Type | 作用 | 关键异常 |
|---|---|---|---|
| Hello | 1 | 发现/维持邻居、选举 DR/BDR | Area ID、Hello/Dead、认证、网络类型不匹配 |
| Database Description(DBD) | 2 | 摘要交换 LSDB | MTU 不匹配常卡在 ExStart/Exchange |
| Link State Request(LSR) | 3 | 请求缺少或较新的 LSA | LSDB 差异 |
| Link State Update(LSU) | 4 | 携带一个或多个 LSA | 泛洪风暴、序列号异常 |
| Link State Acknowledgment(LSAck) | 5 | 确认 LSA | 丢失导致重传 |
OSPFv2 公共头:
| 字段 | 位宽/长度 | 语义 | 生成方 | 接收方处理 | 抓包显示 | 常见异常 |
|---|---|---|---|---|---|---|
| Version | 1B | OSPF 版本(v2) | 发送路由器 | 版本检查 | Version 2 | 版本不兼容 |
| Type | 1B | 五类协议报文 | 发送路由器 | 分派处理 | Message Type | 非法类型 |
| Packet Length | 2B | OSPF 包总长 | 发送路由器 | 定界 | Packet Length | 截断/MTU |
| Router ID | 4B | 32 位稳定路由器标识 | 配置/实现选择 | 识别邻居 | Source OSPF Router | 重复 Router ID |
| Area ID | 4B | 所属区域 | 配置 | 必须匹配 | Area ID | 区域不匹配不建邻 |
| Checksum | 2B | 报文校验 | 发送方 | 验证 | Checksum | 报文损坏 |
| AuType/Auth | 2B+8B | OSPFv2 认证 | 发送方 | 按安全关联验证 | Auth Type | 密钥/Key ID 不一致 |
认证版本提醒:RFC 2328 的明文密码和 Keyed-MD5 属于历史兼容机制;现代 OSPFv2 优先使用 RFC 5709 的 HMAC-SHA(至少 HMAC-SHA-256,具体看设备支持)。OSPFv3 可用 RFC 7166 Authentication Trailer。不要把弱算法作为新部署推荐。
3、邻居状态机
- 在广播网络上,普通 DROther 之间停在
2-Way可以是正常状态;它们分别与 DR/BDR 建 Full。 ExStart/Exchange长时间不前进,优先检查 MTU、Router ID、重复邻居、主从协商。- 频繁
Full → Down → Full是邻接抖动,会触发 LSA 泛洪与 SPF 计算,影响全域。
4、区域、DR/BDR 与 LSA
- Area 0 是骨干区域;其他区域原则上经 Area 0 互联。
- 区域边界路由器(Area Border Router,ABR) 连接多个区域并传播区域间摘要。
- 自治系统边界路由器(Autonomous System Boundary Router,ASBR) 把外部路由引入 OSPF。
- 广播多路访问网络选举 DR/BDR,把邻接数从全互联的 O(n²) 降低。
常见 OSPFv2 LSA:
| LSA | 名称 | 范围 | 主要内容 |
|---|---|---|---|
| Type 1 | Router-LSA | 区域 | 路由器链路 |
| Type 2 | Network-LSA | 区域 | DR 描述多路访问网段 |
| Type 3 | Summary-LSA | 跨区域 | ABR 发布区域间前缀 |
| Type 4 | ASBR-Summary | 跨区域 | 到 ASBR 的可达性 |
| Type 5 | AS-External | AS | 外部路由 |
| Type 7 | NSSA External | NSSA | NSSA 内的外部路由 |
5、OSPFv2 与 OSPFv3
| 维度 | OSPFv2 | OSPFv3 |
|---|---|---|
| 基础标准 | RFC 2328 | RFC 5340 |
| 传统地址族 | IPv4 | IPv6 |
| 运行粒度 | 每 IP 子网 | 每链路 |
| 邻接地址 | IPv4 | IPv6 链路本地地址 |
| Router ID/Area ID | 32 位 | 仍为 32 位,不是 IPv6 地址 |
| 认证 | OSPF 头内机制 + RFC 5709 | IPsec 或 RFC 7166 Authentication Trailer |
三、IS-IS:运营商常用的链路状态 IGP
中间系统到中间系统(Intermediate System to Intermediate System,IS-IS) 源自 ISO 10589;集成 IS-IS(RFC 1195)用同一协议承载 IP 可达性。它与 OSPF 都运行 SPF,但工程形态不同。
1、核心机制
- L1:区域内路由;L1 路由器把域外流量交给最近的 L1/L2 路由器。
- L2:区域间骨干;L2 路由器维护区域间拓扑。
- LSP(Link State PDU):类似 OSPF LSA,可靠泛洪形成 LSDB。
- TLV(Type-Length-Value):协议能力和前缀通过 TLV 扩展,扩展性强。
- 直接运行在二层 CLNS 上,不依赖 IP 建邻,因此 IP 地址变化与 IGP 邻接相对解耦。
2、OSPF 与 IS-IS 工程对比
| 维度 | OSPF | IS-IS |
|---|---|---|
| 标准体系 | IETF RFC | ISO 10589 + IETF RFC 1195 |
| 承载 | 直接在 IP 上(协议号 89) | 直接在二层 CLNS 上 |
| 层次 | Area 0 + 非骨干区域 | L1 区域 + L2 骨干 |
| 扩展 | 新 LSA/字段 | TLV,扩展灵活 |
| 广播网代表 | DR/BDR | DIS(无 BDIS 等价机制) |
| 常见部署 | 企业、多厂商园区 | 运营商骨干、大规模网络 |
| 算法 | Dijkstra SPF | Dijkstra SPF |
| 优劣结论 | 取决于团队、规模、设备支持 | 不是天然“更快”或“更好” |
IS-IS 的完整规范需结合 ISO 10589;RFC 1195 只描述把 IP 集成进 IS-IS 的扩展。不能只读 RFC 1195 就声称覆盖完整 IS-IS 状态机。
四、BGP:策略型路径矢量协议
边界网关协议(Border Gateway Protocol,BGP-4,RFC 4271) 是 AS 间路由协议。它交换“前缀 + 路径属性”,以策略选择与传播可达性。
- BGP 使用 TCP,IANA 注册服务名
bgp、端口 179/TCP。 - TCP 只保证 BGP 消息可靠有序传输;BGP 自己维护邻居状态、路由属性和策略。
- BGP 的目标不是全网最短,而是满足商业/安全/运维策略的可达路径。
1、BGP 消息与状态机
| 消息 | 作用 | 关键字段/内容 |
|---|---|---|
| OPEN | 协商版本、ASN、Hold Time、BGP Identifier、能力 | 版本/ASN/能力不匹配会失败 |
| UPDATE | 发布/撤销 NLRI 与路径属性 | BGP 的核心 |
| KEEPALIVE | 维持会话、确认 OPEN | 无载荷 |
| NOTIFICATION | 报错并关闭会话 | Error Code/Subcode |
| ROUTE-REFRESH | 请求按当前策略重发路由(扩展) | 地址族 |
名为
Active不代表“会话已激活”,而是 TCP 连接重试状态。生产中邻居长期Active常意味着 TCP/179 不通、源地址/路由不对、ACL 拦截或对端未配置。
2、UPDATE 与路径属性
| 属性 | RFC 类型 | 语义 | 典型策略 |
|---|---|---|---|
| ORIGIN | well-known mandatory | 路由起源类别 IGP/EGP/Incomplete | 通常低权重决策 |
| AS_PATH | well-known mandatory | 经历的 AS 序列;用于环路检测 | prepend 影响入站流量 |
| NEXT_HOP | well-known mandatory | 数据面的下一跳 | 必须由 IGP/静态路由可达 |
| LOCAL_PREF | well-known discretionary | AS 内偏好,值大优先 | 控制出站选路 |
| MED | optional non-transitive | 向邻 AS建议入口,值小优先 | 控制邻 AS进入本 AS |
| COMMUNITY | optional transitive,RFC 1997 | 给路由打策略标签 | NO_EXPORT、客户/地域策略 |
| ORIGINATOR_ID / CLUSTER_LIST | optional non-transitive,RFC 4456 | 路由反射防环 | RR 内部使用 |
2025 年标准更新:RFC 9774 更新 RFC 4271/5065,禁止常规产生或传播
AS_SET/AS_CONFED_SET;收到包含这些段类型的 UPDATE 默认采用treat-as-withdraw。新设计不要再把 AS_SET 当作推荐的聚合方案。
3、BGP 决策:标准与实现必须分开
RFC 4271 定义三阶段决策过程与必要属性语义;实际设备常加入 Weight、厂商特定 tie-break 等。下面是常见但非跨厂商完全统一的高层顺序:
- 路由有效且
NEXT_HOP可解析。 - 本地策略产生的偏好更高(如 Weight,厂商专有)。
LOCAL_PREF更高。- 本地产生优于外部学习(实现细节)。
AS_PATH更短。ORIGIN更优(IGP < EGP < Incomplete)。- 可比较条件下
MED更低。 - eBGP 常优于 iBGP。
- 到
NEXT_HOP的 IGP 代价更低。 - 后续按年龄、Router ID、邻居地址等打破平局(实现不同)。
不要背一张“万能 BGP 选路表”。排障必须查看目标设备版本的官方决策输出,例如 FRR
show bgp ... detail、厂商bestpath原因,并区分 RFC 必选逻辑与实现扩展。
五、eBGP 与 iBGP
| 维度 | eBGP | iBGP |
|---|---|---|
| 邻居 ASN | 不同 | 相同 |
| 目的 | AS 之间交换路由 | AS 内传播 BGP 路由 |
| AS_PATH | 出站通常前置本 ASN | 不前置本 ASN |
| NEXT_HOP | 通常改为本端 | 默认可能保持不变 |
| 邻接范围 | 常直连,也可多跳 | 常 loopback 多跳 |
| 防环 | AS_PATH | iBGP split-horizon + RR 属性 |
iBGP 的基本传播规则:从一个 iBGP 邻居学到的路由不再发布给另一个 iBGP 邻居。因此传统 iBGP 要全互联,n 台路由器需:
n × (n - 1) / 2 个会话100 台需要 4950 个会话,无法扩展,于是引入路由反射器。
六、路由反射器
路由反射器(Route Reflector,RR,RFC 4456) 可把 iBGP 学到的路由反射给客户端,消除全互联。
防环属性:
ORIGINATOR_ID:原始发布者的 BGP Identifier;路由器看到自己的 ID 应忽略。CLUSTER_LIST:经过的 RR Cluster ID 列表;本地 Cluster ID 已存在则忽略。
工程风险:
- RR 只反射自己选中的最佳路由,客户端可能看不到其他可用路径。
- RR 所在位置与 IGP 代价会影响最佳路径,拓扑设计不合理会产生**路径隐藏(path hiding)**或次优转发。
- 至少部署冗余 RR,并让 RR 拓扑与物理/IGP 拓扑尽量一致。
七、路由策略:BGP 的核心
BGP 的价值在于策略,不在于“算最短”。典型手段:
| 目标 | 常用属性/策略 | 方向 |
|---|---|---|
| 选择本 AS 出口 | 提高/降低 LOCAL_PREF | 影响出站 |
| 影响邻居进入本 AS | MED、AS_PATH prepend、按上游 community | 影响入站(仅建议,不保证) |
| 限制传播范围 | NO_EXPORT、NO_ADVERTISE | 发布控制 |
| 客户/对等/上游关系 | prefix-list + AS_PATH + community | 防路由泄漏 |
| 控制规模 | maximum-prefix | 防错误全表/泄漏耗尽 |
误区:AS_PATH prepend 只是影响部分网络的偏好,不能保证所有入站流量按预期切换;上游可能优先 LOCAL_PREF 或有自己的策略。
八、BGP 路由安全
1、风险模型
| 风险 | 条件 | 影响 | 证据 |
|---|---|---|---|
| 前缀劫持 | 非授权 AS 发布他人前缀/更具体前缀 | 流量黑洞或中间人 | 起源 AS 异常、全球路由观测 |
| 路由泄漏 | 合法获得的路由被错误传播给不该接收的邻居 | 大范围绕路/拥塞 | AS_PATH 商业关系异常 |
| 会话攻击 | 可达 TCP/179、伪造 RST/注入 | 邻接中断或恶意 UPDATE | 会话重置日志、异常包 |
| 路由抖动 | 前缀频繁发布/撤销 | 控制平面压力、可达性波动 | UPDATE 频率、flap 计数 |
2、纵深防御
- 前缀与 AS_PATH 过滤:客户只能发布已登记前缀和合法起源 AS;对等/上游过滤特殊用途与过长前缀。
- 最大前缀限制:异常数量达到阈值时告警或关闭会话,阈值需留增长余量。
- 控制平面保护:仅允许已知邻居访问 TCP/179;直接邻居使用 GTSM(RFC 5082);设备支持时优先 TCP-AO(RFC 5925)。
- RPKI 路由起源验证(Route Origin Validation,ROV):ROA 授权“哪个 AS 可起源哪个前缀”,验证状态为
Valid、Invalid、NotFound。 - 监控:对自己的前缀做外部 BGP 监测,告警起源 AS、路径、可见性与更具体前缀变化。
RPKI 边界:
- RFC 6811 只验证起源 AS,不验证完整 AS_PATH;攻击者把合法起源 ASN 放到伪造路径末端可能绕过起源验证。
NotFound不是Invalid;不能默认等同恶意。- RPKI 缓存是分布式数据,更新时刻不同;策略错误可能造成拒绝服务。
- RFC 8481 强调先为所有路由设置验证状态,没有显式配置就不要自动采取策略动作。
九、收敛与故障路径
收敛不是一个瞬时动作,而是检测 → 协议传播 → 计算 → FIB 下发 → 流量恢复。观测至少记录:
- 链路失败时间、BFD/Hello 检测时间。
- OSPF/IS-IS 邻接和 LSDB 更新时间、SPF 运行次数。
- BGP UPDATE/withdraw 时间、会话状态与最佳路径变化。
- FIB 安装完成时间、真实丢包窗口。
盲目缩短 Hello/Hold 定时器会增加 CPU 与抖动敏感性。需要亚秒检测时通常评估双向转发检测(Bidirectional Forwarding Detection,BFD),并以设备容量和故障域为前提。
十、最小可复现实验
1、实验目标
在隔离 Linux 容器/虚拟机中:
- 建立三台路由器的 OSPF 邻接,观察状态到
Full、LSDB 与 ECMP。 - 建立 AS 64512 与 AS 64513 的 eBGP,会话到
Established,验证AS_PATH与NEXT_HOP。 - 关闭一条链路,记录邻接、路由与流量恢复时间。
2、版本与执行状态
- 建议:Linux LTS、FRRouting(FRR)稳定版本;执行前用
vtysh -c 'show version'记录精确版本。 - 当前主机:macOS 26.6.2、Docker 29.6.1。
- 未执行原因:当前本机没有已锁定版本的 FRR 镜像,Docker Hub 查询也未得到预期版本标签。为避免用未知镜像伪造结果,本节提供完整验证步骤并标记“未在当前环境执行”。
3、OSPF 验证命令
# [未在当前环境执行] FRR/vtysh,具体配置语法需以所用 FRR 版本核验
vtysh -c 'show version'
vtysh -c 'show ip ospf neighbor'
vtysh -c 'show ip ospf database'
vtysh -c 'show ip route ospf'
vtysh -c 'show ip ospf route'预期证据:
- 邻居从
Down/Init/2-Way/ExStart/Exchange/Loading到Full。 - LSDB 中双方 Router-LSA 序列号一致。
- 存在两条等价路径时,RIB/FIB 显示两个下一跳。
抓包:
sudo tcpdump -i any -nn -c 100 -w ospf-lab.pcap 'ip proto 89'
# Wireshark 显示过滤器
ospf4、BGP 验证命令
示例使用 RFC 6996 私有 ASN 与 RFC 5737 文档地址:
R1: AS64512, 192.0.2.1
R2: AS64513, 192.0.2.2
R1 宣告 198.51.100.0/24# [未在当前环境执行] FRR/vtysh
vtysh -c 'show bgp summary'
vtysh -c 'show bgp ipv4 unicast'
vtysh -c 'show bgp ipv4 unicast 198.51.100.0/24 detail'
ss -tnp '( sport = :179 or dport = :179 )'预期证据:
- TCP/179
ESTABLISHED,BGP 状态为Established。 - R2 路由表看到
198.51.100.0/24,AS_PATH为64512。 - R2 FIB 的下一跳可达;若删除到
NEXT_HOP的路由,BGP 路径存在但不可用或不下发。
抓包:
sudo tcpdump -i any -nn -s 0 -c 100 -w bgp-lab.pcap 'tcp port 179'
# Wireshark:先看 TCP 三次握手,再看 OPEN/KEEPALIVE/UPDATE
bgp5、故障注入与清理
# 在隔离环境关闭一条链路,记录时间
date -Ins
sudo ip link set dev eth1 down
# 观察 OSPF 邻居、BGP 下一跳与 ping 丢包
# 恢复
sudo ip link set dev eth1 up
# 删除实验容器/命名空间和 PCAP
rm -f ospf-lab.pcap bgp-lab.pcap权限与风险:需 root/CAP_NET_ADMIN/CAP_NET_RAW;只允许在独立容器、虚拟机或 20 统一实验 中执行。生产路由协议变更必须先有带外访问、配置快照、回滚与变更窗口。
十一、排障清单
OSPF/IS-IS 邻接不上
- 链路与 VLAN 是否通,接口是否 up。
- Hello 是否双向可见;组播/CLNS 是否被 ACL 丢弃。
- Area/Level、Hello/Dead、网络类型、认证是否一致。
- OSPF 是否因 MTU 不一致卡在
ExStart/Exchange。 - Router ID/System ID 是否重复。
- LSDB 是否一致、SPF 是否执行、路由是否装入 FIB。
BGP 会话或路由异常
ip route get <peer>与 TCP/179 是否双向可达。- ASN、源地址、eBGP multihop、密码/TCP-AO、GTSM 是否一致。
- 状态机卡在
Active还是OpenSent/OpenConfirm。 - UPDATE 是否被 prefix-list、AS_PATH、community、RPKI 策略拒绝。
NEXT_HOP是否可解析,是否只存在于 BGP RIB 而未进入 FIB。- 正向与回程路径是否对称,是否经过状态防火墙。
十二、常见误区
| 误区 | 纠正 |
|---|---|
| “BGP 选最短路径” | BGP 先服从本地策略,AS_PATH 只是众多属性之一。 |
| “OSPF 邻居在 2-Way 就坏了” | 广播网 DROther 之间停在 2-Way 可以正常。 |
| “BGP Established 就一定有路由” | 会话与路由是两层;策略可过滤全部 NLRI。 |
| “BGP 表里有路由就能转发” | NEXT_HOP 必须可达,且路由要装入 FIB。 |
| “RPKI 能验证完整路径” | ROV 只验证前缀起源 AS,不验证完整 AS_PATH。 |
| “RR 只是减少会话,无选路影响” | RR 只反射最佳路径,可能隐藏路径并产生次优转发。 |
| “OSPF/IS-IS 哪个绝对更快” | 收敛取决于规模、定时器、实现、硬件与拓扑。 |
十三、性能与容量
- OSPF/IS-IS 的压力来自邻接数、LSDB 规模、泛洪与 SPF 频率;区域设计和前缀汇总降低故障扩散。
- BGP 的压力来自前缀/路径数量、策略复杂度、更新速率和 Add-Path/多路径保留;评估内存、CPU 与 FIB/TCAM。
- RR 降低会话规模,但把 CPU/内存与收敛依赖集中到 RR;需冗余与容量测试。
- 路由抖动抑制不是默认万能方案,可能延长合法前缀恢复;应先修复抖动源。
十四、版本与实现差异
- OSPFv2(RFC 2328)与 OSPFv3(RFC 5340)报文、地址语义与认证不同。
- IS-IS 完整基础标准是 ISO 10589;RFC 1195 是 Integrated IS-IS 的 IP 扩展。
- BGP 基础为 RFC 4271,但 MP-BGP、四字节 ASN、错误处理、社区与安全由后续 RFC 扩展。
- BGP best-path 中的 Weight、部分 tie-break 和 multipath 条件是实现差异。
- RFC 9774(2025)已更新 RFC 4271:新部署不得继续把
AS_SET/AS_CONFED_SET当作可推荐功能。
十五、关联章节
- 上一章:10 路由基础、策略路由与 ECMP
- 下一章:12 UDP 与应用层可靠性
- 相关:QoS 与高可用、网络安全、云网络、分层故障排查
检索关键词
OSPF 邻居状态机 Full ExStart OSPF LSA LSDB SPF DR BDR Area 0 OSPFv2 OSPFv3 区别 IS-IS L1 L2 TLV LSP BGP TCP 179 状态机 Active Established BGP UPDATE NLRI AS_PATH NEXT_HOP LOCAL_PREF MED COMMUNITY iBGP eBGP 区别 路由反射器 ORIGINATOR_ID CLUSTER_LIST BGP 路由策略 RPKI ROV Valid Invalid NotFound 前缀劫持 路由泄漏 RFC 9774 AS_SET
权威来源
- RFC 2328:OSPFv2、RFC 5340:OSPFv3
- RFC 5709:OSPFv2 HMAC-SHA、RFC 7166:OSPFv3 Authentication Trailer
- ISO/IEC 10589、RFC 1195:Integrated IS-IS
- RFC 4271:BGP-4、RFC 4456:Route Reflection
- RFC 1997:BGP Communities、RFC 7454 / BCP 194:BGP Operations and Security
- RFC 6811:BGP Origin Validation、RFC 8481、RFC 9319
- RFC 9774:Deprecation of AS_SET and AS_CONFED_SET
- IANA Service Name and Port Number Registry(BGP:TCP/179)
核心机制已于 2026-09-07 对照 RFC Editor 与 IANA 注册表核验。动态路由实验命令以 FRR 为示例,但因当前环境缺少已锁定版本的 FRR 镜像而未执行;文档没有伪造邻接或抓包输出。
