vault backup: 2026-05-17 22:27:07

This commit is contained in:
hhs
2026-05-17 22:27:07 +08:00
parent 64e34e6871
commit bbea71f62b
45 changed files with 8983 additions and 0 deletions
@@ -0,0 +1,104 @@
---
tags: [计算机网络, Ethernet, MAC, 帧结构, 数据链路层]
create time: 2026-05-17 22:50
---
# Ethernet 帧结构
## 概述
Ethernet(以太网)是目前最主流的局域网技术,由 Xerox、DEC 和 Intel 在 1980 年联合制定(IEEE 802.3)。理解 Ethernet 帧结构是掌握网络底层通信的基础——每一帧都包含了足够的信息来让网卡判断"这是给我的吗?内容完整吗?上层协议是什么?"
## Ethernet II 帧格式(最常见)
```
┌──────────┬──────────┬──────────┬─────────────┬──────────┐
│ Dest MAC │ Src MAC │ EtherType│ Payload │ FCS │
│ 6 bytes │ 6 bytes │ 2 bytes │ 46–1500 B │ 4 bytes │
│ aabb.ccdd│ dd.eeff. │ 0x0800 │ IP Packet │ crc32() │
│ ee.ff.00│ │ │ │ │
└──────────┴──────────┴──────────┴─────────────┴──────────┘
←──────── 14 bytes Header ───────→ ← Tail →
←──── Min Frame = 64B ────→
←──── Max Frame = 1518B ────→
```
### 字段详解
| 字段 | 大小 | 说明 |
|------|------|------|
| Dest MAC | 6 bytes | 目标 MAC 地址,`ff:ff:ff:ff:ff:ff` 表示广播 |
| Src MAC | 6 bytes | 源 MAC 地址,发出方的物理地址 |
| EtherType | 2 bytes | 上一层协议类型:`0x0800`=IPv4, `0x86DD`=IPv6, `0x0806`=ARP |
| Payload | 46–1500 bytes | 承载的上层数据包。**最小 46 字节**,不足则填充(Padding) |
| FCS | 4 bytes | CRC-32 校验和,网卡硬件自动计算,接收端验证错误则直接丢弃 |
### 为什么 Payload 最小 46 字节?
最早的以太网最大电缆长度 2500m,信号传播延迟需要至少 64 字节才能保证碰撞检测(CSMA/CD)生效。所以规定**整个帧最小 64 字节**,减去 14 字节头部和 4 字节 FCS,Payload 最少 46 字节。短包会补零填满。
现代 Gigabit+ 网卡已不用 CSMA/CD,但为了兼容仍保留此限制。
## IEEE 802.3 / 802.3Q(VLAN Tagged)帧
当网络中使用 VLAN 时,帧中会插入一个 4 字节的 802.1Q Tag:
```
┌──────────┬──────────┬──────┬──────┬──────────┬─────────────┬──────────┐
│ Dest MAC │ Src MAC │ Type │ TPID │ TCI/VID │ Payload │ FCS │
│ 6 bytes │ 6 bytes │ 2B │2B │ 2B │ 46–1500 B │ 4 bytes │
└──────────┴──────────┴──────┴──────┴──────────┴─────────────┴──────────┘
```
新增字段:
- **TPID** (Tag Protocol Identifier): `0x8100` — 标识这是带 VLAN Tag 的帧
- **TCI** (Tag Control Information): 包含 PCP(优先级,3 bit)、CFI(规范格式指示符,1 bit)、**VID**(VLAN ID,12 bit)
VID 取值范围 1–4094,共 4094 个可用 VLAN。
## 常见 EtherType 对照表
| EtherType | 十六进制 | 协议 |
|-----------|---------|------|
| IPv4 | `0x0800` | IP 数据包 |
| IPv6 | `0x86DD` | IPv6 数据包 |
| ARP | `0x0806` | 地址解析协议 |
| RARP | `0x8035` | 反向 ARP(历史遗留) |
| PPPoE | `0x8864` | PPP over Ethernet |
| 802.1Q | `0x8100` | VLAN 标记 |
| LACP | `0x8809` | 链路聚合控制协议 |
## MAC 地址空间与 OUI
### OUI(Organizationally Unique Identifier)
MAC 地址的前三个字节由 **IEEE** 统一分配给厂商,称为 OUI。查询 OUI 可以知道网卡的制造商:
```bash
$ ip link show
link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
↑ 前三个字节 aa:bb:cc 就是 OUI
# 在线查询:https://www.wireshark.org/tools/oui-lookup.html
# Linux 也可以用 ethtool -P eth0 查看出厂 MAC
```
### 单播/多播位(LSB of First Byte)
第一个字节的最低比特位决定寻址类型:
| LSB | 类型 | 示例 |
|-----|------|------|
| 0 | 单播 (Unicast) | `aa:bb:cc:dd:ee:ff` |
| 1 | 多播 (Multicast) | `01:00:5e:xx:xx:xx`(IPv4 组播) |
| 1 | 广播 (Broadcast) | `ff:ff:ff:ff:ff:ff` |
> [!tip] 如何快速判断?看 MAC 第一个字节的十六进制最后一位
> - `a` → 1010 → LSB=0 → 单播
> - `3` → 0011 → LSB=1 → 多播/广播
## 关联笔记
- [[hhs/NETWORK/OSI与TCP-IP模型对比]] — 以太网属于链路层
- [[hhs/NETWORK/MAC地址与广播域]] — MAC 地址的工作范围
- [[hhs/NETWORK/Switch与路由器]] — Switch 如何使用 MAC 表转发帧
@@ -0,0 +1,138 @@
---
tags: [计算机网络, CSMA-CD, 以太网退避, 冲突检测]
create time: 2026-05-17 23:00
---
# CSMA/CD 与以太网退避
## 概述
CSMA/CD(Carrier Sense Multiple Access / Collision Detection,载波监听多路访问/冲突检测)是早期共享式以太网的 MAC 子层协议。虽然现代交换式以太网已不再使用它,但理解其原理对掌握网络演进和碰撞域概念至关重要。
> [!QUESTION] 为什么需要 CSMA/CD?
> 在共享介质(如同轴电缆或 Hub 集线器)上,多台设备共用同一根网线。如果没有协调机制,两台同时发送会导致信号叠加破坏——就像两个人同时在同一频道说话,谁也听不清。
## CSMA/CD 工作流程
```mermaid
flowchart TD
Start["有帧要发送"] --> Wait["等待信道空闲?"]
Wait -->|"空闲"| Send["开始发送"]
Wait -->|"忙碌"| Wait
Send --> Check{"是否在 512bit<br/>时间内检测到冲突?"}
Check -->|"否"| Done["发送完成 ✅"]
Check -->|"是"| Collide["发生冲突 → 发送 Jam Signal"]
Collide --> Backoff["指数退避算法计算等待时间"]
Backoff --> Retry{"重传次数 < 16?"}
Retry -->|"是"| Wait
Retry -->|"否"| Fail["丢弃帧,上报错误 ❌"]
style Done fill:#98FB98,color:#000
style Fail fill:#FF6B6B,color:#fff
```
### 四个步骤详解
| 步骤 | 英文名称 | 说明 |
|------|---------|------|
| 1 | **Carrier Sense** | 发送前先监听:信道忙就等,空闲才发 |
| 2 | **Multiple Access** | 多个设备共享同一介质 |
| 3 | **Collision Detection** | 发送过程中持续监测是否有冲突信号 |
| 4 | **Collision Handling** | 检测到冲突 → 发 Jam Signal → 执行退避 → 重试 |
## 二进制指数退避算法
冲突后的等待时间通过随机退避来避免再次冲突:
$$\text{等待时间} = \min(r, 2^{10}-1) \times 512 \text{ bit-time}$$
其中 $r$ 为重传次数,`512 bit-time` 是最小帧长对应的传输时间(即争用期)。
```mermaid
flowchart TD
k["重传次数 k"] --> r["r = random(0 ~ 2^k - 1)"]
r --> capped["capped at 2^10 - 1 = 1023 (k > 10)"]
capped --> backoff["backoff_time = r × 512 bit-time"]
style k fill:#DDA0DD,color:#000
style backoff fill:#98FB98,color:#000
```
### 退避表
| 重传次数 k | 窗口大小 2^k - 1 | 可能等待的 slot 数范围 |
|-----------|------------------|---------------------|
| 1 | 1 | {0, 1} |
| 2 | 3 | {0, 1, 2, 3} |
| 3 | 7 | {0..7} |
| 4 | 15 | {0..15} |
| 5–10 | 最大值 1023 | {0..1023} |
| >10 | 仍为 1023 | 上限固定 |
如果重传 16 次仍然失败,帧被丢弃并向上层报告错误。
### 示例
假设节点 A 和 B 同时发送,发生冲突:
```
时刻 0ms: A 和 B 同时发送 → 冲突!
两者都发送 32bit Jam Signal
时刻 0.1ms: A 选 r=3 → 等 3×512bit-time = 3×51.2μs ≈ 154μs
B 选 r=1 → 等 1×51.2μs ≈ 51μs
时刻 0.05ms: B 先等完,先尝试发送 → A 还在等
时刻 0.15ms: A 等完,发现信道已被 B 占用 → 退避重选 r
...
```
## 最小帧长与争用期
### 为什么最小帧是 64 字节?
关键公式:**帧传输时间 ≥ 2 × 端到端传播延迟**
如果帧太短,可能在冲突信号到达之前就已经发完了——发送方根本不知道发生过冲突。
```mermaid
sequenceDiagram
participant A as 节点 A
participant H as 最远节点 H
Note over A,H: 传播延迟 = τ
A->>H: 开始发送一个超短帧 (长度 < 2τ)
H->>A: 冲突信号沿原路返回
Note over A: 此时 A 已经发完了...<br/>没检测到冲突!🔥
```
所以规定:
$$\text{最小帧长} \geq 2 \times \tau \times \text{带宽}$$
对于经典 10Mbps 以太网,最长电缆段 2500m,$\tau \approx 12.5\mu s$:
$$\text{最小帧长} \geq 2 \times 12.5\mu s \times 10^7 \text{ bps} = 250,000 \text{ bits?}$$
等等,实际工程中使用了中继器和更短的网段组合,最终标准定为 **512 bit-time = 64 bytes**。
## 现代以太网中的命运
| 年代 | 拓扑 | 介质 | CSMA/CD? |
|------|------|------|---------|
| 1980s | 总线型 | 同轴电缆 | ✅ 必需 |
| 1990s | 星型 + Hub | 双绞线 | ✅ 存在但极少冲突 |
| 2000s+ | 全双工 Switch | 双绞线/光纤 | ❌ 已禁用 |
全双工模式下,收发通道分离(两根线对),不存在碰撞的可能,CSMA/CD 自动关闭。从 Gigabit Ethernet (802.3ab) 起,交换机端口默认全双工运行。
> [!note] 如何检查当前网卡是否启用了 CSMA/CD?
> ```bash
> $ ethtool eth0 | grep -i coll
> Supports Collision Detection: yes
> Current Collision Detection: disabled (full-duplex)
> ```
## 关联笔记
- [[hhs/NETWORK/Ethernet帧结构]] — 以太网 II 帧的格式定义
- [[hhs/NETWORK/Switch与路由器]] — Switch 如何通过全双工消除冲突
- [[hhs/NETWORK/VLAN与Trunk]] — VLAN 隔离冲突域
@@ -0,0 +1,152 @@
---
tags: [计算机网络, MAC地址, 广播域, 组播, OUI]
create time: 2026-05-17 23:10
---
# MAC 地址与广播域
## 概述
MAC(Media Access Control)地址是数据链路层的物理地址,为全球每台联网设备的每个网络接口分配一个唯一标识。理解 MAC 地址的范围边界——**广播域**——是网络规划的基础。
## MAC 地址结构
### OUI + NIC Serial
```
┌───────────────┬───────────────┐
│ OUI (3B) │ NIC Serial │
│ IEEE 分配 │ 厂商自定 │
│ │ │
│ AA:BB:CC │ DD:EE:FF │
└───────────────┴───────────────┘
```
- **OUI** (Organizationally Unique Identifier): 前 3 字节由 IEEE 分配给厂商
- **NIC Serial**: 后 3 字节由厂商自行分配给具体网卡
### 寻址类型位
第一个字节的最低比特位(LSB)决定类型:
| 位模式 | 类型 | 示例 |
|--------|------|------|
| `xx:xx:xx:xx:xx:xx` — LSB=0 | 单播 (Unicast) | `a0:88:b4:12:34:56` |
| `01:00:5e:xx:xx:xx` — LSB=1 | IPv4 组播 | 特定多播组 |
| `ff:ff:ff:ff:ff:ff` | 广播 (Broadcast) | 全网段广播 |
## 广播域(Broadcast Domain)
### 定义
**广播域**是指广播帧能到达的所有设备的集合。在一个广播域内,一个设备发出的 ARP 请求或 DHCP Discover 能被该域内所有其他设备收到。
### 哪些网络设备处理/转发广播?
| 设备 | 是否转发广播帧? | 说明 |
|------|----------------|------|
| Hub(集线器) | ✅ 复制转发到所有端口 | 相当于延长网线,扩大冲突域也扩大广播域 |
| Switch(交换机) | ✅ 转发到除接收口外的所有端口 | **同一 VLAN 内广播不隔离** |
| Router(路由器) | ❌ 不转发 | 天然隔离广播域,每个接口独立广播域 |
| Firewall(防火墙) | ⚙️ 可配置 | 默认通常丢弃 |
```mermaid
flowchart LR
A["PC-A<br/>IP:192.168.1.10"] -->|"ARP广播"| B[Switch<br/>VLAN 10]
B -->|"ARP广播"| C["PC-B<br/>192.168.1.20"]
B -->|"ARP广播"| D["PC-C<br/>192.168.1.30"]
B --"不转发"--> E[Router<br/>VLAN 20]
E --> F["PC-D<br/>192.168.2.10"]
style A fill:#DDA0DD,color:#000
style E fill:#FF6B6B,color:#fff
```
**结论:** Switch 内部不隔离广播域,只有 Router(或三层交换机)的 VLAN 接口才能隔离广播。这就是为什么大型网络需要划分 VLAN。
## 二层转发 vs 三层转发
### ARP 解析流程(跨网段的情况)
```mermaid
sequenceDiagram
participant Src as PC-A<br/>192.168.1.10
participant GW as 网关 Router<br/>eth0: 192.168.1.1<br/>eth1: 192.168.2.1
participant Dst as PC-D<br/>192.168.2.10
Src->>Dst: IP包 → 但目的MAC设为谁的?
Note over Src: 发现 dst不在同一子网,<br/>交给默认网关
Src->>GW: ARP "192.168.1.1是谁?"<br/>(局域网内广播)
GW-->>Src: ARP回复 "我是! eth0 MAC=aa:bb:cc:dd:ee:01"
Note over Src,Dst: 源MAC=Src MAC<br/>目的MAC=Gateway MAC<br/>目标IP=Remote IP
Src->>GW: Frame[EthHdr(Dst=GW_mac)|IP(src_ip,dst_ip)]
Note over GW: Strip Ethernet → 查路由表 → 重封帧
GW->>Dst: Frame[EthHdr(Dst=Dst_mac)|IP(src_ip,dst_ip)]
Note over GW: src MAC 变成了 Gateway MAC!<br/>MAC 逐跳改写,IP 不变
```
### 关键规律总结
| 层级 | 地址变化 | 跨越范围 |
|------|---------|---------|
| IP 地址(第3层) | **保持不变**(除非 NAT) | 端到端,从源到终点 |
| MAC 地址(第2层) | **每跳改写** | 只服务于当前链路(两台相邻设备之间) |
## MAC 地址表(Switch CAM 表)
### Switch 如何学习 MAC?
```mermaid
flowchart TD
S["Switch 启动"] --> L["清空 MAC 表"]
L --> R["收到帧 Port1"]
R --> Learn["提取 Src MAC → 记录: mac→port1"]
Learn --> Fwd{"已知目的 MAC?"}
Fwd -->|"是"| Forward["仅转发到对应端口"]
Fwd -->|"否"| Flood["泛洪到所有其他端口"]
```
### 查看 MAC 表
```bash
# Linux Bridge / 大多数交换机等价命令
$ bridge fdb show
aa:bb:cc:dd:ee:01 dev eth0 master br0 permanent
aa:bb:cc:dd:ee:ff dev eth1 vlan 10 self permanent
# 传统命令
$ arp -a # 查看 ARP 缓存(IP → MAC 映射)
$ ip neigh # 等价于 arp,更现代
```
### MAC 表老化
MAC 表条目有超时时间(通常 300 秒),超时后自动删除,等待下一帧到来重新学习。这防止了表中堆积无效条目。
## 广播风暴与防范
### 什么是广播风暴?
当广播帧在网络中无限循环(如物理环路未启用 STP)时,每个交换机会不断泛洪,最终耗尽带宽。
### 防范措施
| 措施 | 说明 |
|------|------|
| **STP/RSTP/MSTP** | 生成树协议,自动阻断环路端口 |
| **VLAN 划分** | 缩小广播域规模 |
| **BPDU Guard** | 在接入端口禁用 STP 协议包 |
| **广播速率限制** | Switch 端口限速广播流量 |
| **IP 亚网划分** | 减少每个广播域内的主机数 |
> [!tip] 最佳实践
> 生产网络的广播域规模建议不超过 `/23`(510 台主机)。超过就应考虑划分 VLAN,用三层路由互联。
## 关联笔记
- [[hhs/NETWORK/Ethernet帧结构]] — 以太网帧的目的/源 MAC 字段
- [[hhs/NETWORK/VLAN与Trunk]] — VLAN 如何进一步隔离广播域
- [[hhs/NETWORK/ARP协议完整流程]] — MAC 地址的动态解析过程
@@ -0,0 +1,181 @@
---
tags: [计算机网络, Switch, Hub, Router, VLAN]
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. **安全性差**:所有流量对所有端口可见
## Switch(交换机)——现代 LAN 核心
### 工作原理
Switch 为每个端口维护一张独立的 MAC 表,只将帧转发到目标端口,实现"点对点"通信。
```mermaid
flowchart TD
S["Switch<br/>MAC 表: mac_A→Port1, mac_B→Port2"]
PC_A["PC-A → Port1"] -->|"发给 Mac_B"| S
S -->|"仅从 Port2 发出"| PC_B["PC-B"]
PC_D["PC-D → Port4"] -->|"未知目标"| S
S -->|"泛洪到 Port1,2,3"| N["Port1~3 都收到<br/>只有正确的会处理"]
style S fill:#98FB98,color:#000
```
### 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 → Port2 only ✅
```
### Switch 的关键优势
| 特性 | 说明 |
|------|------|
| **每个端口一个冲突域** | 端口间互不影响 |
| **全双工通信** | 收发光纤分开,可同时对发对收 |
| **硬件转发** | ASIC 芯片查 MAC 表,延迟 < 1ms |
| **背板带宽** | 交换机内部总线,决定交换能力上限 |
| **VLAN 支持** | 802.1Q 实现逻辑分割 |
### 常见 Switch 规格参数
| 参数 | 说明 | 典型值 |
|------|------|-------|
| 端口速率 | 千兆/万兆/25G/100G | 1/10 Gbps |
| 端口数 | 24/48 口最常见 | — |
| 背板带宽 | 内部交换容量 | 双向 ≥ 端口总数 × 速率 × 2 |
| 包转发率 | PPS (packets per second) | 10G 端口满速 ≈ 14.88M PPS |
| 缓存 | SRAM 缓冲丢包 | 几 MB ~ 几百 MB |
## 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 不在本地子网?<br/>→ 走默认网关
A->>R: Frame{SrcMac=A, DstMac=Gateway}<br/>IP(Src=192.168.1.10,<br/> Dst=192.168.2.10)
Note over R: Step 1: Strip Ethernet Header<br/>Step 2: 校验 IP Checksum<br/>Step 3: 查路由表 → 下一跳 via eth1<br/>Step 4: ARP 找 B 的 MAC<br/>Step 5: Rebuild Ethernet Header
R->>B: Frame{SrcMac=Gateway, DstMac=B}<br/>IP(Src=192.168.1.10,<br/> Dst=192.168.2.10)
Note over R: ← MAC 改了 ← IP 没变
```
### 关键规则:IP 不变,MAC 逐跳改
```mermaid
flowchart LR
A["原始帧<br/>SrcMAC=A DstMAC=R1-E0<br/>SrcIP=A DstIP=B"] -->|"通过 Router1"| M1["帧改写<br/>SrcMAC=R1-E1 DstMAC=R2-E0<br/>SrcIP=A DstIP=B ← 不变!"]
M1 -->|"通过 Router2"| M2["帧改写<br/>SrcMAC=R2-E1 DstMAC=B<br/>SrcIP=A DstIP=B"]
style A fill:#DDA0DD,color:#000
style M2 fill:#98FB98,color:#000
```
> [!tip] 一句话记住区别
> **Switch 看 MAC 转发,Router 看 IP 转发。** Switch 是"同城快递",Router 是"跨省物流"。
## 三者的协作关系
现实网络中,三者通常协同工作:
```
PC ──┬── Hub(旧时代遗留) ← 冲突域大,已淘汰
├── Switch(局域网核心) ← MAC 转发表驱动,全双工
│ │
│ └── Router(网关) ← IP 路由表驱动,隔离广播域
│ │
│ └── ISP Router → Internet
│
└── Wireless AP → Switch (AP 本身不转发)
```
## 关联笔记
- [[hhs/NETWORK/MAC地址与广播域]] — Switch 如何管理 MAC 表和广播
- [[hhs/NETWORK/VLAN与Trunk]] — 三层交换机如何实现 VLAN 间路由
- [[hhs/NETWORK/静态路由与默认网关]] — Router 的路由表配置
+208
View File
@@ -0,0 +1,208 @@
---
tags: [计算机网络, VLAN, 802.1Q, Trunk, Access端口]
create time: 2026-05-17 23:30
---
# VLAN 与 Trunk
## 概述
VLAN(Virtual Local Area Network,虚拟局域网)允许在一台物理交换机上创建多个逻辑隔离的广播域。它是现代数据中心和办公网络的基本组织单元。
> [!QUESTION] 为什么需要 VLAN?
> 一台万兆交换机的 MAC 表通常限制在几万条以内,加上广播泛洪带来的开销,单广播域超过 2000 台主机会显著降低性能。VLAN 将大网络划分为多个小广播域,就像在一栋大楼里用防火墙隔出多个独立办公室——同一楼层但互不干扰。
## IEEE 802.1Q Tag 结构
### 不带 VLAN 的 Ethernet II 帧
```
┌──────────┬──────────┬──────┬─────────────┬──────┐
│ Dest MAC │ Src MAC │Type │ Payload │ FCS │
│ 6 bytes │ 6 bytes │ 2B │ 46-1500 B │ 4 B │
│ │ │0x0800│ │ │
└──────────┴──────────┴──────┴─────────────┴──────┘
←── 14 ──→ ←──MTU──→ ←── 4 ──→
Header Payload Tail
```
### 带 802.1Q Tag 的帧
```
┌──────────┬──────────┬──────┬───┬──────┬─────────────┬──────┐
│ Dest MAC │ Src MAC │Type │TPID │ TCI │ Payload │ FCS │
│ 6 bytes │ 6 bytes │ 2B │2B │ 2B │ 46-1500 B │ 4 B │
│ │ │0x0800│8100 │ VID │ │ │
└──────────┴──────────┴──────┴───┴──────┴─────────────┴──────┘
←── 14 ──→ │←──4──→│ ←──MTU──→ ←── 4 ──→
↑ 新增 4-byte Tag
```
### TCI (Tag Control Information) 位图
```
Bit 15 Bit 13-12 Bit 11-0
────────────────────────────────────
CFI | PCP (优先级) | VID (VLAN ID)
(1bit) | (3 bits) | (12 bits)
```
| 字段 | 大小 | 取值范围 | 说明 |
|------|------|---------|------|
| CFI | 1 bit | 0 或 1 | Canonical Format Indicator,传统以太网固定为 0 |
| PCP | 3 bit | 0–7 | Priority Code Point,QoS 优先级(见下表) |
| VID | 12 bit | 0–4095 | VLAN Identifier,**实际可用 1–4094** |
### PCP 优先级对照
| PCP | 用途 | 典型场景 |
|-----|------|---------|
| 0 | Best Effort | 普通数据流量 |
| 1 | Background | 后台低优先级的备份任务 |
| 2–3 | Excellent Effort | 文件传输等中等业务 |
| 4 | Critical Applications | 视频流会议 |
| 5 | Voice | 语音通话 VoIP(最高优先) |
| 6 | Network Control | 网络管理协议 |
| 7 | Reserved | 保留 |
## VLAN 端口类型
| 端口类型 | Access | Trunk | Hybrid(Huawei/H3C) |
|----------|--------|-------|---------------------|
| 允许 VLAN | 1 个(PVID) | 多个 | 多个(可配置) |
| 入栈标签 | 接收不带标签 → 打上 PVID | 所有到达的帧保持标签 | 根据配置决定 |
| 出栈标签 | 发送时剥离标签 | 发送时保留标签(除 PVID) | 按每 VLAN 配置 |
| 使用场景 | 接 PC/打印机/AP | 交换机互联、接路由器 | 灵活混合 |
### Access 端口示例
```mermaid
flowchart LR
PC["PC (无标签帧)"] -->|"发裸帧"| A["Access Port<br/>PVID = 10"]
A -->|"打上 Tag 10"| S["Switch 内部 VLAN 10 域"]
S -->|"移除 Tag"| B["Access Port<br/>PVID = 10"]
B -->|"发裸帧"| GW["网关 Router"]
style A fill:#DDA0DD,color:#000
style B fill:#DDA0DD,color:#000
```
> Access 端口对主机透明——主机看到的仍是普通以太网帧,完全不知道 VLAN 的存在。
### Trunk 端口示例
```mermaid
flowchart LR
SW1["Switch A"] -->|"Trunk<br/>携带多个 VID"| SW2["Switch B"]
Note over SW1,SW2: VLAN 10 流量: EtherType=0x8100, VID=10<br/>VLAN 20 流量: EtherType=0x8100, VID=20
style SW1 fill:#98FB98,color:#000
style SW2 fill:#98FB98,color:#000
```
## Router-on-a-Stick(单臂路由)
当路由器只有一个物理接口时,可以通过子接口 + VLAN 实现多个 VLAN 间路由:
```
VLAN 10 VLAN 20
┌──────────┐ ┌──────────┐
│ 192.168.10.x /24 │ │ 192.168.20.x /24 │
└──────┬───┘ └──────┬───┘
│ │
Access Access
│ │
┌──────┴───────────────────┴───┐
│ Switch │
│ Trunk Port (eth0.10 & .20) │
└──────┬───────────────────┬───┘
│ 子接口 eth0.10 │ 子接口 eth0.20
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Router │ │ Router │
│ eth0.10: 192.168.10.1/24 │ │ eth0.20: 192.168.20.1/24 │
└─────────────────┘ └─────────────────┘
```
> [!warning] 单臂路由的性能瓶颈
> 所有 VLAN 间的流量都经过同一个物理接口进出(先入后出),相当于**双倍带宽占用**。对于万兆环境,建议使用三层交换机做硬件 VLAN 间路由。
## 配置示例
### Linux Bridge 上的 VLAN
```bash
# 创建 vlan interface
ip link add link eth0 name eth0.10 type vlan id 10
ip link add link eth0 name eth0.20 type vlan id 20
# 设置 IP 并启用
ip addr add 192.168.10.1/24 dev eth0.10
ip addr add 192.168.20.1/24 dev eth0.20
ip link set eth0.10 up
ip link set eth0.20 up
# 查看
$ ip -d link show type vlan
4: eth0.10@eth0: <BROADCAST,MULTICAST,UP> mtu 1500 ...
link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff promiscuity 0
vlan protocol 802.1Q id 10 reassemble 0
```
### Docker 中利用 VLAN
```yaml
# docker-compose.yml
services:
web:
networks:
frontend: # VLAN 10
ipv4_address: 192.168.10.10
backend: # VLAN 20
ipv4_address: 192.168.20.10
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 192.168.10.0/24
backend:
driver: bridge
ipam:
config:
- subnet: 192.168.20.0/24
```
## VLAN 边界与跨 Switch
```mermaid
sequenceDiagram
participant SW1 as Switch-A
participant Link as 交换机间链路
participant SW2 as Switch-B
SW1->>Link: Frame {EtherType:0x8100, VID:10}
Note over Link: Trunk 链路保持 802.1Q Tag
SW2->>SW2: 收到 → 识别 VID=10 → 在 VLAN 10 内转发
SW2->>SW2: 查 MAC 表 → 仅从同 VLAN 端口发出
```
**核心要点:** VLAN 信息随 802.1Q Tag 穿过 Trunk 链路传递到下一台交换机。每台交换机根据自己的 VLAN 数据库独立处理。
## 最佳实践
| 项目 | 建议 |
|------|------|
| VLAN ID 分配 | 管理 VLAN=1(不建议,安全风险),业务 VLAN ≥ 10 |
| Native VLAN | 修改默认 native VLAN(避免用 1),防 VLAN Hopping |
| VLAN 数量 | 单台交换机支持最大 4094 个 VLAN |
| Inter-VLAN 路由 | >10 个 VLAN 用三层交换机而非单臂路由 |
| 安全 | 未使用的端口划入"黑洞 VLAN"(无 IP 段),关闭 DTP 自动协商 |
## 关联笔记
- [[hhs/NETWORK/Ethernet帧结构]] — 802.1Q Tag 插入在 Ethertype 位置之前
- [[hhs/NETWORK/Switch与路由器]] — Switch 如何基于 VLAN 隔离广播域
- [[hhs/NETWORK/MAC地址与广播域]] — VLAN 缩小了广播域的规模