Files
cs-note/hhs/NETWORK/03-网络层/07-动态路由协议OSPF-BGP.md
T
2026-05-24 11:42:38 +08:00

201 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [计算机网络, OSPF, BGP, 动态路由协议]
create time: 2026-05-18 01:10
---
# 动态路由协议:OSPF 与 BGP
## 概述
在大型网络中手动维护静态路由不现实——网络拓扑变化时每条路由都要手动更新。动态路由协议让路由器自动"学习"彼此的网络,发现链路故障后自动切换路径。核心分类:
| 类别 | IGP (内部网关协议) | EGP (外部网关协议) |
|------|-------------------|-------------------|
| 代表协议 | OSPF, IS-IS, RIP | **BGP** |
| 使用场景 | 同一个 AS(自治系统)内 | **不同 AS 之间**(即互联网 backbone)|
| 算法类型 | 链路状态 (LSA), 距离向量 | 路径向量 |
## OSPF(Open Shortest Path First)
### 基本概念
OSPF 是一种**链路状态**协议,每台路由器收集全网拓扑信息,独立计算最短路径树(SPF)。
```mermaid
flowchart TD
subgraph "AS 内部 — OSPF Area 0"
R1["Router A"] --- R2["Router B"]
R1 --- R3["Router C"]
R2 --- R3
R1 --- SW1["Network 192.168.1.0/24"]
R2 --- SW2["Network 10.0.0.0/8"]
R3 --- R4["Router D"]
R4 --- SW3["Network 172.16.0.0/12"]
end
style R1 fill:#DDA0DD,color:#000
style R3 fill:#FFD700,color:#000
```
### OSPF 工作流程
```mermaid
sequenceDiagram
participant R1 as Router A
participant R2 as Router B
participant R3 as Router C
Note over R1,R3: Step 1: Neighbor Discovery
R1->>R2: Hello Packet (multicast 224.0.0.5)
R2-->>R1: Hello + DB Description
R1->>R2: Adjacency Established ✅
Note over R1,R3: Step 2: LSA Exchange
R1->>R2: LSUpdate (我的直连网络: 192.168.1.0/24, cost=10)
R1->>R3: LSUpdate (我的直连网络: 192.168.1.0/24, cost=10)
Note over R1,R3: Step 3: SPF Calculation
R2->>R2: Dijkstra → 最优路径已构建
R3->>R3: Dijkstra → 最优路径已构建
Note over R1,R3: Step 4: Routing Table Updated
```
### OSPF 区域(Area)概念
OSPF 用"区域"来水平扩展:
| 区域类型 | 特点 |
|----------|------|
| **Backbone Area 0** | 所有其他 Area 必须连接到 Area 0 |
| Standard Area | 传播全部 LSA,路由表最大 |
| Stub Area | 不接受 Type 5 LSA(外部路由),注入一条 default route |
| Totally Stubby | Stub + 不接收 Type 3(区域间路由),只有一条默认路由 |
| NSSA (Not-So-Stubby Area) | Stub 的变种,允许引入外部路由(Type 7)|
```mermaid
flowchart LR
R1["ABR: Router A<br/>Area 0 ↔ Area 1"] -->|"全部LSA"| A0["Area 0 (Backbone)"]
A0 -->|"全部LSA"| R1
R1 -->|"汇总路由 → Stub"| A1["Area 1 (Totally Stubby)<br/>只有默认路由"]
style R1 fill:#FFD700,color:#000
style A0 fill:#DDA0DD,color:#000
style A1 fill:#98FB98,color:#000
```
- **ABR** (Area Border Router): 连接多个区域的边界路由器
- **ASBR** (AS Boundary Router): 引入外部路由的路由器
### Cost 计算
```
Cost = Reference_Bandwidth / Interface_Bandwidth
参考带宽默认值: 100 Mbps (10^8)
接口实际 Cost:
- 10 Mbps Ethernet: 100 / 10 = 10
- 100 Mbps Ethernet: 100 / 100 = 1
- 1 Gbps Ethernet: 100 / 1000 = 0 → 调为 1
- 10 Gbps Ethernet: 100 / 10000 = 0 → 需调整参考带宽
```
> [!warning] 参考带宽问题
> 如果参考带宽是 100Mbps,那么 Gigabit (1G) 和 TenGig (10G) 的 cost 都是 1,无法区分优劣。正确做法:
> ```bash
> router ospf 1
> distance ospf 10
> auto-cost reference-bandwidth 10000 # 单位 Mbps → 支持到 100G
> ```
### 查看 OSPF 状态
```bash
$ ip route | grep O # 过滤 OSPF learned routes
O 10.0.0.0/8 [110/20] via 192.168.1.1, eth0
OE1 172.16.0.0/12 [110/130] via 192.168.1.1, eth0
$ ip -d ospf show # FRR/quagga/Zebra
$ netstat -s | grep ospf # OSPF 统计信息
# Quagga/FRR 中的详细查看
$ vtysh
show ip ospf neighbor # 邻居关系
show ip ospf database # LSA 数据库
show ip ospf route # 计算出的 OSPF 路由
show ip ospf interface eth0 # 接口 OSPF 状态
```
## BGP(Border Gateway Protocol)
### BGP vs OSPF 对比
| 特性 | OSPF | BGP |
|------|------|-----|
| 范围 | AS 内部 (IGP) | **AS 间 (EGP)** |
| 算法 | 链路状态 (Dijkstra) | **路径向量** |
| 传输 | IP 协议号 89 | **TCP 179** |
| 收敛速度 | 秒级 | 分钟级(设计如此,稳定优先)|
| 可扩展性 | ~几千台路由器 | **全球互联网 10 万+ 前缀** |
| 策略控制 | 基于 cost | **丰富的 attribute 策略** |
### BGP 两种会话类型
```mermaid
flowchart LR
iBGP["iBGP<br/>同一 AS 内的路由器"] -->|"传递可达信息<br/>不改变 next-hop"| R1["AS 65001<br/>Peer A -- Peer B"]
eBGP["eBGP<br/>不同 AS 间"] -->|"交换路由并修改 next-hop"| R2["AS 65001 -- AS 65002<br/>Peer A -- Peer B"]
style iBGP fill:#DDA0DD,color:#000
style eBGP fill:#98FB98,color:#000
```
### BGP 属性(Attributes)选路顺序
当多条路径可选时,按以下优先级逐条比较:
```mermaid
flowchart TD
Start["新路由到达"] --> Weight["① Cisco专有 Weight<br/>本地有效"]
Weight --> LocPrf["② Local Preference<br/>AS 内传递"]
LocPrf --> Originate["③ 本地起源 > 接收的路由"]
Originate --> AS_Path["④ AS Path 最短"]
AS_Path --> ORIGIN["⑤ Origin: IGD < EGP < INCOMPLETE"]
ORIGIN --> MED["⑥ MED: 越低越好"]
MED --> ebgp["⑦ eBGP > iBGP"]
ebgp --> IGP_Cost["⑧ IGP cost to next-hop"]
IGP_Cost --> Cluster["⑨ Cluster List 最短"]
Cluster --> RouterID["⑩ Router ID 最小"]
style Start fill:#FFD700,color:#000
style LocPrf fill:#DDA0DD,color:#000
style AS_Path fill:#98FB98,color:#000
```
### ASN(自治系统编号)
| 范围 | 说明 |
|------|------|
| 0–64511 | 私有 ASN(类似 RFC1918 IP 地址)|
| 64512–65534 | 16-bit 扩展私有 ASN |
| 65535 | 保留 |
| 65536–4294967295 | 32-bit 全局 ASN(互联网注册)|
IANA 分配给各大 ISPs 和大型企业(如 Google: AS15169, Cloudflare: AS13335, Alibaba: AS37963)。
## RIP(Routing Information Protocol)— 了解即可
RIP 是最简单的距离向量协议,已基本被淘汰:
- 跳数上限 15(第 16 跳视为不可达)
- 每 30 秒广播整个路由表
- `routing protocol name is rip` → 太慢了,现代网络不用
## 关联笔记
- [[hhs/NETWORK/静态路由与默认网关]] — 静态路由是动态协议的替代方案
- [[hhs/NETWORK/NAT原理与应用]] — NAT 后方的路由器不需要运行 OSPF/BGP
- [[hhs/NETWORK/负载均衡]] — Load Balancer 通常依赖 L4/L7 而非完整路由协议