交换机

交互机是个核心且不起眼的小设备。交换机(普通二层交换机)正是工作在“数据链路层”(Data Link Layer,第 2 层)。

1. 打包成“帧”(Frame)

它规定了数据的“开头”和“结尾”,把一连串纯粹的比特流(010101)切分成一段一段有固定结构的“数据包裹”,这个包裹就叫做 “数据帧”(Frame)。

2. 给包裹贴上物理标识 —— MAC 地址

它给每一个包裹加了一个“快递单头(Header)”,里面最重要的两项内容就是:

  • 源 MAC 地址:谁发的?
  • 目的 MAC 地址:同一局域网内,要发给眼前的哪台设备?

3. 局域网内的“点对点精确投递”

这正是交换机干的事情:根据数据帧上的 目的 MAC 地址,查表并精准地把这个包裹从正确的物理网口打出去,实现局域网内部设备的互联与高效通信。所以交互机内其实是MAC 地址 →‬ 交换机自己的物理网口(Port) 映射表(不是 mac 到 ip):

javascript
交换机内部的 MAC 表(CAM 表):
┌───────────────────┬──────────────┐
│  目标 MAC 地址     │ 交换机的网口  │
├───────────────────┼──────────────┤
│ AA:BB:CC:11:22:33 │   Port 1     │  <-- 插着电脑 A
│ AA:BB:CC:44:55:66 │   Port 2     │  <-- 插着电脑 B
│ AA:BB:CC:77:88:99 │   Port 3     │  <-- 插着路由器
└───────────────────┴──────────────┘

所以并不是只有机房才需要,只要网线接口不够用、或者对局域网传输速度要求极高的地方,都需要独立的交换机。

1. 家庭/小办公室场景(网口不够用了)

假设你家里做装修,每个房间都拉了网线,客厅还有 NAS、游戏机、电脑,总共有 8 根网线。但是家用路由器后面只有 3 个 LAN 口,怎么办?

  • 你只需要买一个几十块钱的 “5 口/8 口傻瓜式独立交换机”。
  • 用一根网线把路由器和交换机连起来,另外 7 根网线全部插在交换机上。交换机立刻就能帮你扩展出更多的局域网接口。

2. 大型企业与机房场景(为什么机房里的交换机长得像“抽屉”)

机房里的独立交换机(比如 24 口、48 口,甚至是万兆光纤交换机),解决的是两个问题:

  • 海量接口连接:机房里几百台 ECS 虚拟机、数据库服务器,需要通过成千上万根网线连接在一起,必须依赖几台大交换机堆叠起来分拨数据。
  • 极高的数据吞吐与硬件性能:路由器 负责查表路由、NAT 转换、防火墙过滤,逻辑复杂,速度较慢(耗费 CPU)。交换机逻辑极简单,内部使用硬件级别的专用芯片(ASIC),处理数据全是“硬件电路硬转发”,延迟低至微秒级,每秒能吞吐几百 Gbps 的流量。

总结

  1. 交换机 是真正的物理硬件,负责在同一个局域网内,根据 MAC 地址把数据精准打给对应的网口。
  2. 你家里的路由器 内部已经焊接并集成了一块交换机芯片,背面的几个 LAN 网口就是交换机的物理接口,所以你不需要额外买独立交换机。
  3. 独立交换机 并不是机房专属,只要局域网设备多、接口不够用,随时都可以插一台独立交换机来扩充网口。

ARP(Address Resolution Protocol) 和 RARP (Reverse ARP)

arp 是地址解析协议,rarp 是逆向地址解析协议,即:

  • ARP: 根据 IP 查 Mac 地址
  • 谁干的:你的电脑。
  • 过程:电脑知道对方 IP,但不知道对方 MAC 时,会在局域网喊一嗓子(ARP 广播),询问“谁的 IP 是这个?请把 MAC 告诉我”。
  • RARP:反过来,根据 Mac 查询 IP
  • 谁干的:DHCP 服务器(比如你家路由器里的 DHCP 服务)
  • 过程:电脑刚开机时,网卡只有 MAC 地址,没有 IP。网卡会发广播问“我的 MAC 是这个,请分配给我一个内网 IP”。路由器收到后,查表并分配一个 IP 给你。

DHCP 服务器(路由器里的那个服务)内部维护一张 租约表(Lease Table / 地址绑定表),分配 IP 后它会记录:

javascript
┌───────────┬────────────────────────────┐
 │ 字段      │ 说明                       │
 ├───────────┼────────────────────────────┤
 │ MAC 地址  │ 你的网卡物理地址           │
 ├───────────┼────────────────────────────┤
 │ 分配的 IP │ 内网地址,如 192.168.1.100 │
 ├───────────┼────────────────────────────┤
 │ 租约期限  │ 通常 1~24 小时             │
 ├───────────┼────────────────────────────┤
 │ 主机名等  │ 额外信息                   │
 └───────────┴────────────────────────────┘

DHCP 服务器会记住 MAC。这也就是为什么很多路由器后台有"已连接设备列表",能显示每台设备的 MAC、IP、主机名。

⚠️ 但注意一个细节:这个"记住"不是永久的,而是 租约(Lease) 性质的:

  • 租约到期前,设备会续租(一般用一半时间就续),通常同一台设备能一直拿到同一个 IP;
  • 但如果设备长时间不在线、租约过期,记录就会被释放,下次可能拿到 不同的 IP;
  • 若想让某台设备永远拿到固定 IP,需要在路由器里做 DHCP 静态绑定 / 保留(Reservation),也就是把 MAC 和 IP 手动锁死。

绝大多数情况下是的。 家用路由器其实是一台"多功能一体机",把下面这些角色都集成在一起了:

  • 路由器(转发不同网段)
  • NAT / 防火墙
  • 交换机(LAN 口)
  • 无线 AP(Wi-Fi)
  • DHCP 服务器 ← 就是这个

DHCP 服务是路由器固件里的一个软件进程(例如 OpenWrt 里是 dnsmasq,消费级路由器各有自己的实现)。

不过严格来说,DHCP 服务器不一定非得在路由器里——它可以是局域网里任何一台能响应广播的设备(树莓派、NAS、某台电脑等)。只是家庭场景下,为了省事,大家默认让路由器兼任。

RARP(Reverse ARP,反向地址解析)是很古老的协议,早就被淘汰了;这里学习记录,还是要了解。

DHCP 才是现在真正在用的"根据 MAC 分配 IP"的协议。

日常所说的"开机自动拿 IP",指的就是 DHCP,RARP 基本可以不用管了。

ARP 查询逻辑

在现实中,ARP 绝对不会 去尝试查询“外网设备的 MAC 地址”。因为你的电脑在发起 ARP 查询之前,就已经通过子网掩码(Subnet Mask)算出了目标是不是外网。电脑拿“目标 IP”和“自己的子网掩码”做计算:

目标是内网设备(比如 192.168.1.5):电脑决定,“我要直接把数据发给它!”

如果是外网,则把数据交给路由器网关,接下来就是路由器负责和外网建立连接,找到目标 IP。这里需要提一下 NAT 。

NAT 网络地址转换

当发送目标是外网 IP,例如百度的 IP,就需要交给路由器网关来转为出口。这里有个背景只是先补充一下,路由器的 Mac 地址通常都是全球唯一的:MAC 地址的前半部分是厂商代码(OUI),后半部分是流水号,全球所有网络设备的 MAC 地址都是硬编码且全球唯一的。这样就可以把路由器作为全球唯一的通信地址,做数据寄存。

NAT (Network Address Translation,网络地址转换)

javascript
[你的手机: 192.168.1.10:5000] ───发送请求───► [路由器 (NAT)] ───改包后发往外网───► [百度服务器]
                                              │
                                  记录 NAT 映射表:
                                  内网 192.168.1.10:5000 
                                  ◄───► 映射为外网 WAN_IP:8888

出站(NAT 替换):当手机(192.168.1.10:5000)访问百度时,数据包经过路由器。路由器把数据包的源 IP 改成路由器的外网 WAN IP,把源端口改成一个随机分配的端口(比如 8888),同时在内存里记下一笔帐(NAT 表)。

入站(NAT 还原):百度把数据返回给 WAN IP:8888。路由器收到后,查了一下 NAT 表:“哦!8888 端口对应的其实是内网手机 192.168.1.10 的 5000 端口”。

路由器内部的 NAT 映射表(Conntrack 表),记录的是一个“双向四元组”的对应关系:

内部源(内网机器 + 内网应用)外部转换(路由器 WAN 口公网映射)目标服务器(外网)
你的手机 (192.168.1.10:5000 微信)WAN_IP : 8888百度服务器 : 443
你的电脑 (192.168.1.20:5000 浏览器)WAN_IP : 9999知乎服务器 : 443
你的平板(192.168.1.30:6000 抖音)WAN_IP : 7777抖音服务器 : 443

注意你的内部源都是 IP + 端口 (应用层端口),而外部转换的端口,就是一个逻辑端口,例如 8888,因为 WAN_IP 通常只有一个,所以用个逻辑端口来映射到你内网的 IP + 端口,还有目标服务器的 IP + 端口。

IP 找到机器,端口确定具体发给哪个应用。

互联网接力赛:下一跳(Next Hop)接力

NAT 将地址转换后,数据包将离开你家,在互联网上的传输过程就像寄快递,过程如下:

javascript
[你家电脑] 
   │ (IP: 百度, MAC: 家用路由器)
   ▼
[家用路由器] ──查路由表──► 下一跳: 运营商小区路由器 A
   │ (IP: 百度, MAC: 替换为路由器 A 的 MAC)
   ▼
[运营商路由器 A] ──查路由表──► 下一跳: 运营商骨干网路由器 B
   │ (IP: 百度, MAC: 替换为路由器 B 的 MAC)
   ▼
[运营商骨干网 B] ──查路由表──► 下一跳: 百度机房出口路由器 C
   │ (IP: 百度, MAC: 替换为路由器 C 的 MAC)
   ▼
[百度机房路由器 C] ──发现百度服务器就在自己的局域网内!
   │ (在本局域网内发起 ARP 广播: "谁是百度服务器?")
   ▼
[百度服务器] ──回复 MAC 地址,完成最后 1 米投递!

所以,网络就是个局域网套娃游戏,你的路由只有百度的 IP 地址,然后发现自己不知道这个 IP 的具体 Mac 地址 (注意是百度机房网关路由器的 MAC 地址,WAN 网入口),所以求救上级路由器,也就是更大的路由器;层层上访。直到骨干网络找到了百度 IP 的入口。

在这个过程中: ⚬ IP 地址(百度 IP):全程保持不变,作为终点导航。 ⚬ MAC 地址:每过一个路由器就换一次。每一次只填“下一台路由器”的 MAC 地址。

重点:下一跳过程中始终是下个路由器的 MAC 地址,层层查找,直到找到百度网关路由器的 MAC 地址。

此时百度网关路由器说,哎呀,这个 IP 地址在我的网络内,我来处理。接下来,再次进入 NAT 转换,将外网转换为内网的 IP + 应用端口。

阶段总结:网络寻址的终极心智模型

javascript
【你的电脑】
   │  ① 算子网掩码,发现是外网 IP;
   │  ② 发起 ARP,拿到【家里的路由器 MAC】;
   ▼
【家用路由器】 ───►【运营商路由器 A】 ───►【骨干网路由器 B】 ───►【百度入口网关】
   │                                                             │
   └─────────── 阶段一:互联网长途接力(IP 导航,MAC 一跳一换) ─────────────┘
                                                                 │
                                                                 ▼  ③ 网关根据 IP/端口 做负载均衡/NAT,锁定内网服务器 10.0.1.5
                                                                 │  ④ 网关在机房内网发起 ARP 广播,问到 10.0.1.5 的 MAC
                                                                 ▼
                                                        【百度服务器/Pod (10.0.1.5)】
  1. 外网看 IP(路由表接力):从你家到百度机房入口,全靠 IP 导航,路由表决定“下一跳去哪”,MAC 地址每一跳都在被擦掉重写(重写为下一个路由器的 MAC 地址)。
  2. 内网看 MAC(ARP 寻址 + 交换机转发):只有到达了终点所在的“最后一个局域网”,才会触发 ARP 协议去获取目标服务器的 MAC 地址,由交换机完成精准的最后一击投递。

汇总图: