Files
cs-note/hhs/NETWORK/02-链路层/03-MAC地址与广播域.md
T
2026-05-24 11:42:38 +08:00

153 lines
5.4 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: [计算机网络, 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 地址的动态解析过程