Files
cs-note/hhs/NETWORK/02-链路层/04-Switch与路由器.md
T
2026-05-27 23:01:37 +08:00

552 lines
27 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: [计算机网络, Switch, Hub, Router, VLAN, STP, RSTP, EtherChannel, L3Switch, MAC, CEF, ARP, IGMP, DAI, BPDU]
create time: 2026-05-17 23:20
---
# Switch vs Hub vs Router
## 概述
这三种设备是构建局域网的核心组件,但它们工作在完全不同的 OSI 层,转发决策的依据也不同。理解它们的差异是设计网络拓扑的基础。
| 特性 | Hub(集线器) | Switch(交换机) | Router(路由器) |
|------|-------------|-----------------|-----------------|
| OSI 层级 | 物理层 L1 | 数据链路层 L2 | 网络层 L3 |
| 寻址依据 | 无(全量复制) | MAC 地址 | IP 地址 + 路由表 |
| 冲突域 | 全部共享 | 每个端口独立 | 每个接口独立 |
| 广播域 | 全部共享(一个广播域) | 不隔离(同 VLAN 内) | **天然隔离** |
| 性能 | 极低(半双工) | 高(全双工并行) | 依赖 CPU/ASIC |
| 现代使用 | ❌ 已淘汰 | ✅ 局域网核心 | ✅ 网关/边界 |
## Hub(集线器)——已淘汰的共享介质
### 工作原理
Hub 本质上就是一个多端口的中继器(Repeater)。收到任何端口的电信号,放大后复制到所有其他端口。
```mermaid
flowchart LR
A["PC-A 发送"] -->|"信号"| H["Hub"]
H -->|"原样复制"| B["PC-B 收到"]
H -->|"原样复制"| C["PC-C 碰撞"]
style H fill:#FF6B6B,color:#fff
```
### 致命缺陷
1. **所有端口在同一冲突域**:两台同时发送 = 碰撞 → CSMA/CD 退避
2. **只能半双工**:同一时刻要么收要么发
3. **无法隔离故障**:一台 PC 中毒疯狂发包会影响所有人
4. **安全性差**:所有流量对所有端口可见
> [!question] 思考
> Hub 已经被淘汰了,为什么我们还要了解它?因为 **Switch 的泛洪行为本质上就是退化成了 Hub**——理解 Hub 的缺陷,才能理解后面 CAM 表攻击的危害。
### 冲突域 vs 广播域
这两个概念贯穿整个 L2 学习,必须清晰区分:
```mermaid
flowchart TD
subgraph "冲突域 Collision Domain"
CD1["同一时刻只能有一方发送, 否则碰撞"]
end
subgraph "广播域 Broadcast Domain"
BD1["一条广播帧能到达的所有设备集合"]
end
Hub["Hub: 所有端口 = 1 个冲突域, 1 个广播域"]
SW["Switch: 每端口 = 1 个冲突域, 同 VLAN = 1 个广播域"]
RT["Router: 每接口 = 既隔离冲突域, 也隔离广播域"]
style CD1 fill:#FF6B6B,color:#fff
style BD1 fill:#87CEEB,color:#000
```
> [!question] 思考
> 交换机能隔离冲突域,但不能隔离广播域(VLAN 内)——那广播风暴的防护靠什么?答案是 **VLAN 分割广播域** + **STP 防环**,这也是后面两篇笔记的核心主题。
## Switch(交换机)——现代 LAN 核心
### 工作原理
Switch 维护一张全局 MAC 表(CAM 表),记录"哪个 MAC 地址在哪个端口"的映射关系。收到帧时查表,只将帧转发到目标端口,实现"点对点"通信。
```mermaid
flowchart TD
S["Switch MAC表 mac_A→Port1, mac_B→Port2"]
A["PC-A Port1"] -->|"发给 mac_B"| S
S -->|"仅从 Port2 发出"| B["PC-B"]
D["PC-D Port4"] -->|"未知目标"| S
S -->|"泛洪到 Port1,2,3"| N["Port1到3都收到, 只有正确的会处理"]
style S fill:#98FB98,color:#000
```
> [!question] 思考
> Switch 的泛洪和 Hub 的复制有什么区别?Hub 是**无差别地复制所有帧**,而 Switch 只在 **MAC 表中找不到目标时**才泛洪。一旦学到地址,就走精确转发——这就是"智能"的地方。
### MAC 表学习流程
```mermaid
sequenceDiagram
participant SW as Switch
participant A as PC-A mac_A
participant B as PC-B mac_B
A->>SW: Frame mac_A→mac_B from Port1
SW->>SW: Learn mac_A on Port1
SW->>B: Flood mac_B unknown
B->>SW: Reply Frame mac_B→mac_A from Port2
SW->>SW: Learn mac_B on Port2
A->>SW: Next Frame mac_A→mac_B from Port1
SW->>SW: Forward directly to Port2
```
> [!info] MAC 地址表的老化
> 交换机的 CAM 表条目不是永久的。如果某个 MAC 地址在**老化时间**(默认通常 300 秒 / 5 分钟)内没有再出现,该条目会被自动清除。这保证了表项不会被已离线设备永久占据,但也是 MAC 泛洪攻击能生效的前提——攻击者必须持续发送伪造帧来维持表满状态。
### Switch 的关键优势
| 特性 | 说明 |
|------|------|
| **每个端口一个冲突域** | 端口间互不影响 |
| **全双工通信** | 收发光纤分开,可同时对发对收 |
| **硬件转发** | ASIC 芯片查 MAC 表,延迟 < 1μs |
| **背板带宽** | 交换机内部总线,决定交换能力上限 |
| **VLAN 支持** | 802.1Q 实现逻辑分割 |
> [!tip] 关于全双工
> 全双工 = 收发同时进行,物理上收发走不同线对(或波长)。这意味着**冲突域的概念在全双工下已不存在**——不需要 CSMA/CD。
> [!info] IGMP Snooping:多播流量的守护者
> 交换机默认会把多播帧像广播一样泛洪到所有端口。**IGMP Snooping** 让交换机监听 IGMP 报文,学习哪些端口有多播组成员,只将多播流量转发到有接收者的端口。典型场景:IPTV 组播、视频会议。没有 IGMP Snooping 的交换机在多播场景下会严重浪费带宽。
### 常见 Switch 规格参数
| 参数 | 说明 | 典型值 |
|------|------|-------|
| 端口速率 | 千兆/万兆/25G/100G | 1/10 Gbps |
| 端口数 | 24/48 口最常见 | — |
| 背板带宽 | 内部交换容量 | 双向 ≥ 端口总数 × 速率 × 2 |
| 包转发率 | PPS (packets per second) | 10G 端口满速 ≈ 14.88M PPS |
| 缓存 | SRAM 缓冲丢包 | 几 MB ~ 几百 MB |
> [!question] 思考
> 10G 端口满速为什么恰好是 **14.88M PPS**?因为最小以太网帧 64 字节 + 8 字节前导码 + 12 字节帧间距 = 84 字节,10Gbps / (84×8 bits) ≈ 14.88M。记住这个数字,面试常考。
### 交换模式:帧怎么被转发的?
交换机在转发帧时,有三种读取策略,它们在**延迟**和**可靠性**之间做出不同的取舍:
| 模式 | 行为 | 延迟 | 错误检测 | 适用场景 |
|------|------|------|---------|---------|
| **Cut-through** 直通转发 | 读完目标 MAC 就立刻开始转发 | 最低 | ❌ 不校验 | 对延迟极端敏感的高频交易 |
| **Store-and-Forward** 存储转发 | 完整接收帧 → CRC 校验 → 无误再转发 | 较高 | ✅ 完整校验 | **现代交换机默认模式** |
| **Fragment-Free** 无碎片转发 | 读取前 64 字节后转发(过滤冲突碎片) | 中等 | ⚠️ 部分 | 早期 Catalyst 交换机 |
> [!info] 为什么 Fragment-Free 检查恰好 64 字节?
> 以太网规定最小帧长 64 字节。**冲突产生的碎片(runt frame)一定小于 64 字节**——如果一个帧在传输前 64 字节期间没发生冲突,后续碰撞的概率极低。Fragment-Free 通过检查前 64 字节,用较低代价过滤掉了绝大部分冲突碎片,是 Cut-through 和 Store-and-Forward 之间的折中方案。
> [!tip] 为什么 Store-and-Forward 成为主流?
> 早期 ASIC 算力不够,Cut-through 有延迟优势。但现代 ASIC 做 CRC 校验几乎零开销,Store-and-Forward 的可靠性优势(能丢弃损坏帧、避免错误帧浪费带宽)远大于那点微秒级延迟差异。
### STP:交换机环路的终结者
当交换机之间存在冗余链路时(高可用设计的标配),帧可能在环路中无限循环:
```mermaid
flowchart LR
SW1["SW1 根桥"] -->|"转发"| SW2["SW2"]
SW1 -->|"转发"| SW3["SW3"]
SW2 -->|"广播帧循环"| SW3
SW3 -->|"广播帧循环"| SW2
style SW1 fill:#98FB98,color:#000
style SW2 fill:#FFD700,color:#000
style SW3 fill:#FFD700,color:#000
```
**环路会导致三大灾难:**
1. **广播风暴**:广播帧被无限复制,瞬间耗尽带宽
2. **MAC 表抖动**:同一帧从不同端口到达,交换机不断更新 MAC 表导致转发表不稳定
3. **重复帧接收**:终端收到多份相同帧,协议栈混乱
**STP(Spanning Tree Protocol, 802.1D)的解决思路:** 通过选举算法,逻辑上"阻塞"某些端口,让拓扑变成一棵无环的树。
```mermaid
flowchart TD
SW1["SW1 根桥 Root Bridge"] -->|"DP"| SW2["SW2"]
SW1 -->|"DP"| SW3["SW3"]
SW2 -->|"DP"| SW3
SW3 -.->|"BLK 阻塞"| SW2
style SW1 fill:#98FB98,color:#000
style SW2 fill:#DDA0DD,color:#000
style SW3 fill:#FFD700,color:#000
```
> [!info] 图中端口角色
> - **DP(Designated Port)**:每个网段上负责转发的端口,由到根桥路径开销最小的交换机拥有。**根桥的所有端口都是 DP**(图中 SW1 的三个端口、SW2→SW3 链路上 SW2 的端口均为 DP)。
> - **RP(Root Port)**:每个非根桥上有且仅有一个到达根桥的最优端口。图中 **SW2 面向 SW1 的端口** 和 **SW3 面向 SW1 的端口** 就是各自 RP。比较规则:路径开销最小 → 对端 Bridge ID 最小 → 对端 Port ID 最小。
> - **BLK(Blocked)**:逻辑阻塞,不转发数据帧,仅接收 BPDU 以防拓扑变化。图中 **SW3 面向 SW2 的端口被阻塞**,从而打破环路。
STP 选举规则:
1. **选根桥**:Bridge ID(优先级 + MAC 地址)最小的交换机
2. **选根端口(RP)**:每个非根桥选一个到根桥"最优路径"的端口(比较路径开销 → 对端 Bridge ID → 对端 Port ID)
3. **选指定端口(DP)**:每个网段选一个负责转发的端口(通常是离根桥更近的一方)
4. **阻塞其余端口**:不转发数据帧,只接收 BPDU
> [!tip] STP vs RSTP
> 经典 STP 收敛需要 30~50 秒(Blocking → Listening → Learning → Forwarding),这在现代网络中不可接受。**RSTP(802.1w)** 将收敛时间缩短到**秒级**,是当前生产环境的标准选择。
### STP 安全增强机制
STP 本身没有认证,恶意设备可以伪造 BPDU 抢占根桥或制造环路。以下三个机制是生产环境必备:
| 机制 | 作用 | 应用位置 |
|------|------|---------|
| **BPDU Guard** | 如果接收到 BPDU,立即 shutdown 端口 | 连接终端的 Access 端口(防止用户私接交换机) |
| **Root Guard** | 如果收到更优的 BPDU,将端口置为 root-inconsistent | 非信任方向端口(防止非法设备抢占根桥) |
| **Loop Guard** | 如果单向链路故障导致收不到 BPDU,将端口置为 loop-inconsistent | RP 和 Alternate 端口(防止单向故障引起环路) |
> [!question] 思考
> BPDU Guard 和 Root Guard 看起来很像,区别在哪?**BPDU Guard 是"绝不允许 BPDU 出现"**——一旦收到就关停,适用于接入层终端端口。**Root Guard 是"允许 BPDU 但不允许更优的"**——保护根桥地位不被篡改,适用于汇聚/核心层非信任方向端口。
### EtherChannel:STP 的补丁
STP 阻塞冗余端口来防环,但代价是**浪费了那条链路的带宽**。EtherChannel(LACP/PAgP)将多条物理链路捆绑成一条逻辑链路,解决这个问题:
```mermaid
flowchart LR
SW1["SW1"] -->|"物理链路 x4 捆绑为 1 条逻辑链路"| SW2["SW2"]
Note1["STP 只看到 1 条逻辑链路, 不会阻塞"] -.-> SW1
```
| 特性 | 说明 |
|------|------|
| **带宽叠加** | 4 条 1G 链路 = 1 条 4G 逻辑链路 |
| **STP 透明** | STP 将捆绑组视为单条链路,不阻塞任何成员 |
| **故障切换** | 某条物理链路断开,流量自动分配到剩余链路 |
| **协商协议** | LACP(802.3ad,开放标准)/ PAgP(Cisco 私有) |
> [!info] 负载均衡哈希算法
> EtherChannel 的"负载均衡"并非逐包轮询,而是**基于流(per-flow)哈希**——同一对源/目的通信始终走同一条物理链路,保证帧顺序不乱。哈希输入字段的选择直接影响均衡效果:
>
> | 哈希模式 | 哈希字段 | 适用场景 |
> |---------|---------|---------|
> | `src-mac` | 源 MAC | 服务器下行(多客户端 → 一服务器) |
> | `dst-mac` | 目的 MAC | 多服务器场景 |
> | `src-dst-ip`(推荐) | 源 + 目的 IP | 大多数场景,均衡效果最佳 |
> | `src-dst-mac` | 源 + 目的 MAC | 二层环境 |
>
> ```bash
> # Cisco 配置哈希算法
> Switch(config)# port-channel load-balance src-dst-ip
> ```
> [!question] 思考
> 既然 EtherChannel 这么好,为什么不把所有链路都捆绑?因为捆绑的成员链路必须连接相同的两端设备、相同速率/双工,且有数量上限(通常 8 条)。更重要的是——基于流的哈希意味着**单条流仍然只能走一条物理链路**,不能突破单链路速率上限。如果只有少数大流量流,可能出现"看似 4G 实际只用 1G"的不均衡。
### CAM 表安全:当 Switch 退化成 Hub
交换机的 CAM 表(MAC 表)容量是有限的,通常为数千到数万条。攻击者可以利用这一点:
**MAC 泛洪攻击原理:**
```mermaid
sequenceDiagram
participant ATK as Attacker
participant SW as Switch CAM 8192 entries
participant V as Victim
ATK->>SW: 伪造 10万+ 个随机源 MAC 帧
SW->>SW: CAM 表溢出
Note over SW: 无法学习新 MAC, 退化为 Hub 模式, 所有未知流量泛洪到所有端口
V->>SW: 正常通信帧
SW->>ATK: 泄漏, 帧被泛洪到攻击者端口
```
**防御措施:**
| 措施 | 原理 |
|------|------|
| **端口安全 (Port Security)** | 限制每个端口学习的最大 MAC 数,超限则触发违规动作(见下表) |
| **DHCP Snooping** | 构建 IP-MAC 绑定表,过滤非法 DHCP 响应 |
| **Dynamic ARP Inspection (DAI)** | 基于 DHCP Snooping 表校验 ARP 报文的合法性 |
| **802.1X 认证** | 端口级准入控制,未认证设备无法通信 |
> [!info] 端口安全的三种违规模式
>
> | 模式 | 超限行为 | 是否发送 SNMP Trap | 是否递增 Violation 计数 | 端口状态 |
> |------|---------|-------------------|----------------------|---------|
> | **Protect** | 静默丢弃违规帧 | ❌ | ❌ | 保持 UP(最容易被忽视) |
> | **Restrict** | 丢弃违规帧 | ✅ | ✅ | 保持 UP |
> | **Shutdown**(默认) | 丢弃违规帧 | ✅ | ✅ | **err-disabled**,需手动 `shutdown` / `no shutdown` 恢复 |
>
> 生产环境推荐 **Shutdown** 模式——故障暴露最明显,能迫使运维介入排查。如果担心影响可用性,可配合 `errdisable recovery` 自动恢复。
> [!question] 思考
> 为什么 MAC 泛洪攻击能让 Switch 退化成 Hub?因为 CAM 表满后,交换机无法学习新的 MAC-端口 映射关系,对于所有"未知目标"的帧只能泛洪——这恰恰就是 Hub 的行为。**理解 Hub 的工作方式,才能理解这个攻击的本质。**
### ARP 欺骗:另一种 L2 攻击
MAC 泛洪是让交换机"退化",而 ARP 欺骗则是"欺骗"——攻击者直接篡改 ARP 映射关系,将流量劫持到自己手中。
**ARP 欺骗原理:**
```mermaid
sequenceDiagram
participant ATK as Attacker
participant GW as Gateway 192.168.1.1
participant V as Victim 192.168.1.10
ATK->>GW: 伪造 ARP Reply: 192.168.1.10 is at MAC_ATK
GW->>GW: ARP 表被污染, 192.168.1.10 → MAC_ATK
ATK->>V: 伪造 ARP Reply: 192.168.1.1 is at MAC_ATK
V->>V: ARP 表被污染, 网关 → MAC_ATK
Note over V,GW: 所有流量经过 Attacker, 实现中间人攻击
```
> [!info] 为什么 ARP 协议如此脆弱?
> ARP 协议设计之初没有认证机制——**任何设备都可以主动发送 ARP Reply(免费 ARP),接收方不会验证其真实性**。在没有防护的网络中,攻击者可以随意声称"我就是网关"。这也是为什么 ARP 欺骗至今仍是内网渗透中最常用的手法之一。
**ARP 欺骗 vs MAC 泛洪对比:**
| 维度 | MAC 泛洪 | ARP 欺骗 |
|------|---------|---------|
| 攻击目标 | 交换机 CAM 表 | 终端 ARP 缓存 |
| 攻击效果 | Switch 退化成 Hub(泛洪) | 流量劫持到攻击者(精准定向) |
| 流量截获 | 被动嗅探泛洪流量 | 主动中间人,可篡改/重放 |
| 防御措施 | Port Security | **DAI + DHCP Snooping**(核心组合) |
> [!tip] DAI + DHCP Snooping 的防御逻辑
> **DHCP Snooping** 在交换机上建立一张"IP-MAC-端口"可信绑定表(信任表)。**DAI(Dynamic ARP Inspection)** 则拦截所有 ARP 报文,对照这张绑定表校验:如果 ARP 声称的 IP-MAC 映射不在表中,直接丢弃。两道防线配合,几乎可以完全封堵 ARP 欺骗。详见 [[hhs/NETWORK/08-网络安全/01-DDoS与MITM防御]]。
### 风暴控制:流量的最后一道闸门
MAC 泛洪攻击针对的是 CAM 表容量,而**广播风暴**针对的是带宽——当广播/多播帧因环路或恶意行为失控时,网络瞬间瘫痪。STP 防环是根本方案,但 **Storm Control** 是每个端口上的最后一道保险:
| 参数 | 说明 |
|------|------|
| **监控对象** | 广播帧、多播帧、未知单播帧(可分别配置) |
| **阈值方式** | 带宽百分比 / 帧速率(pps) / 绝对速率(bps) |
| **超限动作** | 阻塞(shutdown)/ 仅丢弃超限帧(drop)/ 发送 SNMP Trap 告警 |
```bash
# Cisco IOS 配置示例
interface GigabitEthernet0/1
storm-control broadcast level 20 # 广播流量超过带宽 20% 时触发
storm-control multicast level pps 1000 # 多播超过 1000 pps 时触发
storm-control action shutdown # 超限直接 shutdown 端口
```
> [!question] 思考
> STP 已经防环了,为什么还需要 Storm Control?因为 STP 只防"环路导致的"广播风暴,**无法防护恶意终端主动发送大量广播帧**。两者是不同层级的防护:STP 是拓扑级(防环),Storm Control 是端口级(限速),在生产环境中应同时启用。
## Router(路由器)——跨网段互联
### 工作原理
Router 运行在 OSI 第三层,根据 **IP 路由表**做出转发决策,不同接口属于不同的子网和广播域。
```mermaid
flowchart TD
subgraph "LAN 1 - 192.168.1.0/24"
A["PC-A 192.168.1.10"]
S["Local Switch"]
end
subgraph "Router Gateway"
R["Router eth0 .1, eth1 .1"]
end
subgraph "LAN 2 - 192.168.2.0/24"
B["PC-B 192.168.2.10"]
S2["Local Switch"]
end
A --> S --> R
R --> S2 --> B
style A fill:#DDA0DD,color:#000
style B fill:#DDA0DD,color:#000
style R fill:#98FB98,color:#000
```
### Router 转发动作详解
当 PC-A(192.168.1.10)要发数据给 PC-B(192.168.2.10)时:
```mermaid
sequenceDiagram
participant A as PC-A
participant R as Router
participant B as PC-B
Note over A: 判断 192.168.2.10 不在本地子网, 走默认网关
A->>R: Frame SrcMAC=A, DstMAC=Gateway, IP Src=192.168.1.10, Dst=192.168.2.10
Note over R: Step1 Strip Ethernet Header, Step2 校验 IP Checksum, Step3 TTL -1, 若 TTL=0 则丢弃并回 ICMP Time Exceeded, Step4 查路由表 via eth1, Step5 ARP 找 B 的 MAC, Step6 Rebuild Ethernet Header
R->>B: Frame SrcMAC=Gateway, DstMAC=B, IP Src=192.168.1.10, Dst=192.168.2.10
Note over R: MAC 改了, IP 没变
```
> [!info] TTL 的作用:防止环路中的无限循环
> 路由器每转发一个包,TTL 减 1。当 TTL 降为 0 时,路由器**丢弃该包并向源 IP 发送 ICMP Time Exceeded 消息**——这就是 `traceroute` 的工作原理。每一跳路由器都会返回一条 ICMP 消息,从而揭示完整路径。
### 关键规则:IP 不变,MAC 逐跳改
```mermaid
flowchart LR
A["原始帧 SrcMAC=A, DstMAC=R1-E0, SrcIP=A, DstIP=B"] -->|"通过 Router1"| M1["帧改写 SrcMAC=R1-E1, DstMAC=R2-E0, IP不变"]
M1 -->|"通过 Router2"| M2["帧改写 SrcMAC=R2-E1, DstMAC=B, IP不变"]
style A fill:#DDA0DD,color:#000
style M2 fill:#98FB98,color:#000
```
> [!question] 思考
> 为什么要这样设计?因为 **IP 地址是端到端的逻辑标识**(告诉你"最终目的地"),而 **MAC 地址是逐跳的物理标识**(告诉你"下一跳该发给谁")。就像寄快递:收件人地址(IP)全程不变,但每个中转站的转运标签(MAC)都会换。
### Router 的路由功能
路由器的核心能力是**路由**——根据路由表决定数据包的去向。路由来源分三种:
| 路由类型 | 说明 | 配置方式 |
|---------|------|---------|
| **直连路由** | 接口 UP 后自动学习 | 无需配置 |
| **静态路由** | 管理员手动指定 | `ip route 10.0.0.0/8 192.168.1.1` |
| **动态路由** | 协议自动交换(OSPF/BGP) | 启动路由协议进程 |
```bash
# Linux 查看路由表
$ ip route show
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
10.0.0.0/8 via 192.168.1.254 dev eth0 # 静态路由
# Cisco IOS 查看路由表
Router# show ip route
S 10.0.0.0/8 [1/0] via 192.168.1.254 # S = Static
C 192.168.1.0/24 is directly connected # C = Connected
```
> [!tip] 路由表中的"最长前缀匹配"
> 当多条路由都匹配目标 IP 时,路由器选择**掩码最长**的那条。例如同时有 `10.0.0.0/8` 和 `10.1.0.0/16`,发往 `10.1.2.3` 的包会走 `/16` 这条——越精确的路由越优先。
> [!info] 管理距离(AD)和度量值(Metric)
> 当同一条路由从不同来源学到时(如 OSPF 和 RIP 都宣告了 `10.0.0.0/16`),路由器用两个维度做选择:
> 1. **管理距离 AD(Administrative Distance)**:衡量路由来源的可信度。直连 = 0,静态 = 1,OSPF = 110,RIP = 120——**AD 越小越优先**。
> 2. **度量值 Metric**:同一协议内比较路径优劣。OSPF 看带宽(Cost),RIP 看跳数——**Metric 越小越优先**。
>
> 选择顺序:**最长前缀匹配 → AD 最小 → Metric 最小**。这个三步判定是路由选路的核心逻辑,面试和排障都会用到。
### Router 的其他关键功能
路由转发只是路由器的一部分能力,现代路由器实际上身兼数职:
| 功能 | 说明 | 典型场景 |
|------|------|---------|
| **NAT** | 将私有 IP 转换为公有 IP | 家庭路由器、企业出口 |
| **ACL** | 基于五元组的包过滤 | 禁止外部访问内网特定端口 |
| **QoS** | 流量优先级调度 | VoIP 优先于普通数据 |
| **DHCP Server** | 自动分配 IP 地址 | 小型网络无需独立 DHCP 服务器 |
| **VPN** | 加密隧道 | 远程办公接入企业内网 |
> [!question] 思考
> Switch 和 Router 的功能边界正在模糊——**三层交换机**可以做 VLAN 间路由,**路由器**也能做交换。在你的网络架构中,什么场景用纯 L2 Switch、什么场景用 L3 Switch、什么场景用 Router?带着这个问题继续学习后面的 VLAN 和路由章节。
### L3 交换机:Switch 与 Router 的融合
传统的 L2 Switch 只看 MAC 转发,跨 VLAN 通信必须绕道路由器——这在大型企业网中成为性能瓶颈。**L3 交换机**将路由功能集成到交换机的 ASIC 硬件中,实现"线速路由":
```mermaid
flowchart TD
subgraph "传统方案 Router-on-a-Stick"
VA1["Host-A VLAN10"] -->|"所有跨VLAN流量上行"| TR["Trunk 链路"]
TR --> R["Router 子接口"]
R -->|"回传下行"| TR2["Trunk 链路"]
TR2 --> VB1["Host-B VLAN20"]
end
subgraph "L3 交换机方案"
VA2["Host-A VLAN10"] --> L3["L3 Switch 内部 SVI 路由"]
L3 --> VB2["Host-B VLAN20"]
end
```
| 对比 | Router-on-a-Stick | L3 交换机 |
|------|-------------------|-----------|
| 转发方式 | CPU 软件路由 | ASIC 硬件路由 |
| 性能 | 受路由器 CPU 限制 | 线速转发 |
| 拓扑 | 需要 Trunk 到路由器 | 内部完成,无需外部设备 |
| 适用场景 | 小型网络 | 中大型企业网核心 |
> [!tip] SVI(交换虚拟接口)
> L3 交换机通过 **SVI** 实现 VLAN 间路由——为每个 VLAN 创建一个虚拟三层接口(如 `interface Vlan10`,配置 IP `192.168.10.1`),充当该 VLAN 的网关。数据包在交换机内部直接完成路由,无需离开设备。
> [!info] L3 交换机为什么比路由器快?
> 关键在于转发路径不同:
> - **传统路由器**:收到包 → CPU 查路由表 → CPU 执行 ARP → CPU 封装新帧 → 发出。每一步都经过 CPU,性能受主频限制。
> - **L3 交换机**:预先从路由表构建硬件转发表(**无需等待第一个包触发**),**所有数据包由 ASIC 直接在硬件层面完成查表 + 改写 MAC + 转发**,完全绕过 CPU。这个通用理念称为"**一次路由,多次交换**"。Cisco 的实现叫 **CEF(Cisco Express Forwarding)**,基于 **FIB(Forwarding Information Base)** + **Adjacency Table** 双表架构——FIB 由路由表预计算而来,存储目标前缀 → 下一跳映射;Adjacency Table 存储每一跳对应的 L2 封装头(源/目的 MAC),两者配合实现"查一次表,改两处数据,直接发出"。华为对应叫 **快速转发**,同样基于 FIB 硬件表。核心思路一致:把软件查表的结果预计算到硬件表中,实现线速转发。
>
> 打个比方:路由器像一个每次都走审批流程的公司,L3 交换机像一个把常规流程固化成自动化的公司——第一次走流程建模板,之后同类请求直接自动执行。
> [!warning] FIB vs LFIB 易混淆
> **FIB** 用于标准 IP 转发(本节讨论的场景);**LFIB(Label FIB)** 是 MPLS 标签转发的概念,两者不要混淆。
## 三者的协作关系
现实网络中,三者通常协同工作:
```mermaid
flowchart TD
PC["终端 PC"] --> H["Hub 旧时代遗留, 冲突域大, 已淘汰"]
PC --> SW["Switch 局域网核心, MAC 转发表驱动, 全双工"]
SW --> RT["Router 网关, IP 路由表驱动, 隔离广播域"]
RT --> ISP["ISP Router 接入 Internet"]
PC --> WAP["Wireless AP 接入 Switch, AP 本身不转发"]
style H fill:#FF6B6B,color:#fff
style SW fill:#98FB98,color:#000
style RT fill:#DDA0DD,color:#000
style ISP fill:#87CEEB,color:#000
```
## 排障速查
| 操作 | Switch | Router | Linux 对等命令 |
|------|--------|--------|---------------|
| 查看 MAC 表 | `show mac-address-table` | — | `bridge fdb show` |
| 查看路由表 | — | `show ip route` | `ip route show` |
| 查看 ARP 表 | `show arp` | `show arp` | `ip neigh show` |
| 查看接口状态 | `show interfaces status` | `show ip interface brief` | `ip link show` |
| 端口安全配置 | `switchport port-security maximum 2` | — | 无直接对等命令(可用 `ebtables` / `tc` 限制) |
> [!tip] Linux 网络排障组合拳
> 快速定位 L2/L3 问题的三板斧:
> ```bash
> ip link show # L1/L2: 接口是否 UP?速率/双工?
> ip neigh show # L2: ARP 解析是否正常?MAC 是否正确?
> ip route get <目标IP> # L3: 走哪条路由?下一跳是谁?
> ```
## 关联笔记
- [[hhs/NETWORK/02-链路层/03-MAC地址与广播域]] — Switch 如何管理 MAC 表和广播
- [[hhs/NETWORK/02-链路层/05-VLAN与Trunk]] — 三层交换机如何实现 VLAN 间路由
- [[hhs/NETWORK/03-网络层/04-ARP协议完整流程]] — ARP 如何解析 MAC 地址
- [[hhs/NETWORK/03-网络层/06-静态路由与默认网关]] — Router 的路由表配置
- [[hhs/NETWORK/03-网络层/08-NAT原理与应用]] — Router 的 NAT 功能详解
- [[hhs/NETWORK/08-网络安全/01-DDoS与MITM防御]] — MAC 泛洪等 L2 攻击防御