vault backup: 2026-05-17 22:27:07
This commit is contained in:
@@ -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 的路由表配置
|
||||
@@ -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 缩小了广播域的规模
|
||||
Reference in New Issue
Block a user