Files
cs-note/hhs/NETWORK/01-基础概念/03-寻址体系MAC-IPTPort.md
T
2026-05-24 11:42:38 +08:00

170 lines
5.9 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地址, IP地址, 端口号]
create time: 2026-05-17 22:30
---
# 寻址体系:MAC / IP / Port
## 概述
网络中的每个端点需要三层地址才能精确定位到一个进程:**MAC 地址**(物理层/链路层)定位到哪台设备、**IP 地址**(网络层)定位到哪个子网、**端口号**(传输层)定位到哪个进程。三层地址组合起来,就是经典的 `ip:port` 定位公式。
> [!QUESTION] 为什么需要三种地址?一层不够吗?
> 每种地址解决不同尺度的问题。MAC 在同一个广播域内有效,但路由器不转发广播——跨网段必须用 IP 路由。IP 能到达目标主机,但不区分进程——同一台服务器可能跑着 Web、数据库、邮件等多个服务,所以需要端口来分发。
## 一、MAC 地址(48 位)
### 基本结构
```
前 3 字节 后 3 字节
───────────── ─────────────
OUI (厂商编号) NIC 序列号
由 IEEE 分配 由厂商自定
```
示例:`aabb.ccdd.eeff` = `AA:BB:CC:DD:EE:FF`
- 前三个字节 `AA:BB:CC` → OUI,代表厂商
- 后三个字节 `DD:EE:FF` → 设备唯一序列
### MAC 地址类型
| 类型 | 格式 | 含义 |
|------|------|------|
| 单播 | LSB=0 | 发给单个设备 |
| 广播 | `ff:ff:ff:ff:ff:ff` | 发给局域网内所有设备 |
| 组播 | LSB=1 | 发给一组设备 |
### ARP 地址解析
当知道一个主机的 **IP 地址** 时,需要通过 ARP 协议找到它的 **MAC 地址**。
```mermaid
sequenceDiagram
participant Src as 源主机<br/>192.168.1.10/?.mac
participant Bcast as 局域网广播
participant Dst as 目标主机<br/>192.168.1.20/aa:bb:cc:11:22:33
participant Cache as 源主机 ARP 缓存
Src->>Bcast: ARP Request "192.168.1.20 是谁?→ ff:ff:ff:ff:ff:ff"
Dst-->>Src: ARP Reply "我是!MAC = aa:bb:cc:11:22:33"
Src->>Cache: 写入缓存条目 (TTL ≈ 15~30 分钟)
Note over Src,Dst: 之后的通信直接用此 MAC,不再发 ARP
```
### ARP 缓存查看与管理
```bash
# Linux
$ ip neigh show # 等价于 arp -n
192.168.1.20 dev eth0 lladdr aa:bb:cc:dd:ee:ff STALE
$ ip neigh del 192.168.1.20 dev eth0 # 删除缓存条目
# macOS / Windows
$ arp -a
```
## 二、IP 地址(IPv4 32 位 / IPv6 128 位)
### IPv4 地址结构
```
版本(4 bits) IHL(4 bits) DSCP(8 bits) Total Length(16 bits)
...
Identification(16 bits) | DF/MF | Fragment Offset(13 bits)
TTL(8 bits) | Protocol(8 bits) | Header Checksum(16 bits)
Source Address(32 bits)
Destination Address(32 bits)
Options (可选)...
```
### IPv4 vs IPv6
| 特性 | IPv4 | IPv6 |
|------|------|------|
| 地址长度 | 32 bit (4 字节) | 128 bit (16 字节) |
| 地址数量 | ~43 亿 (2³²) | ~3.4×10³⁸ (2¹²⁸) |
| 表示法 | `192.168.1.1` | `2001:0db8::1` |
| 首部固定长度 | 20 bytes(可变选项更长) | 40 bytes(固定) |
| Checksum | ✅ 有 | ❌ 无(依赖上层校验) |
| NAT | 广泛使用(缓解地址耗尽) | 不需要(地址充足) |
| SLAAC | — | 支持无状态自动配置 |
| 组播 | 有限支持 | 原生支持 |
### IP 地址分类(历史)
| 类别 | 首字节范围 | 默认掩码 | 可用主机数 | 用途 |
|------|-----------|---------|-----------|------|
| A | 1–126 | /8 | 16,777,214 | 大型组织 |
| B | 128–191 | /16 | 65,534 | 中型组织 |
| C | 192–223 | /24 | 254 | 小型网络 |
| D | 224–239 | — | — | 组播 |
| E | 240–255 | — | — | 保留 |
> [!warning] CIDR 已淘汰分类编址
> 现代网络全部使用 **CIDR(Classless Inter-Domain Routing)** 无类编址,子网掩码可以是任意位数(如 /23、/27)。
## 三、端口号(16 位)
### 端口范围
| 范围 | 名称 | 说明 |
|------|------|------|
| 0–1023 | 熟知端口 (Well-Known) | 预分配给标准服务(HTTP:80, HTTPS:443, SSH:22, DNS:53) |
| 1024–49151 | 注册端口 (Registered) | 申请注册的商业软件 |
| 49152–65535 | 动态端口 (Ephemeral) | 客户端临时分配,用完即释放 |
### 服务端 vs 客户端端口
```mermaid
flowchart LR
Client["客户端 192.168.1.100:54321"] -->|"SYN"| Server["服务端 10.0.0.1:80"]
Server -->|"SYN-ACK"| Client
Client -->|"ACK"| Server
style Client fill:#DDA0DD,color:#000
style Server fill:#98FB98,color:#000
```
- **服务端端口**:固定且知名(如 80),告诉客户端"我在哪"
- **客户端端口**:操作系统动态分配(49152–65535),保证连接的唯一标识 `(src_ip, src_port, dst_ip, dst_port)`
### 常见端口速查
| 端口 | 协议 | 服务 |
|------|------|------|
| 21 | FTP | 文件传输控制 |
| 22 | SSH | 安全远程登录 |
| 25 | SMTP | 邮件发送 |
| 53 | DNS | 域名解析 |
| 80 | HTTP | Web 网站 |
| 443 | HTTPS | 加密 Web |
| 993 | IMAPS | 加密邮件收取 |
| 3306 | MySQL | 数据库 |
| 5432 | PostgreSQL | 数据库 |
| 6379 | Redis | 缓存 |
| 8080 | HTTP Alt | Web 备用端口 |
## 四、完整寻址链:从请求到进程
```mermaid
flowchart TD
S["你在浏览器输入 example.com"] -->|"DNS 查询"| A["DNS 返回 93.184.216.34"]
A -->|"TCP 三次握手"| B["建立 TCP 连接<br/>src:192.168.1.100:54321 → dst:93.184.216.34:80"]
B -->|"以太网帧头"| C["Dst MAC: router的出口MAC<br/>Src MAC: 本机MAC"]
C -->|"ARP缓存"| D["如果没缓存,先发ARP请求"]
D -->|"发送 HTTP GET"| E["Web 服务器的 PID 1234<br/>nginx worker 进程读取数据"]
style S fill:#DDA0DD,color:#000
style E fill:#98FB98,color:#000
```
**结论:** 三层地址缺一不可——没有 IP 找不到机器,没有 MAC 连不上网线,没有端口不知道该交给哪个进程。
## 关联笔记
- [[hhs/NETWORK/OSI与TCP-IP模型对比]] — 三层地址对应 OSI 的不同层级
- [[hhs/NETWORK/IPv4协议详解]] — IP 地址的详细编码与 CIDR 计算
- [[hhs/NETWORK/TCP状态机详解]] — 四元组如何唯一标识 TCP 连接