📖 Day 11 / 15 · 《计算机网络:自顶向下方法》阅读笔记

每天 30 分钟,15 天读懂计算机网络。今天我们「下沉」到数据链路层——数据在物理链路上实际传输的层。这里有以太网、ARP 协议、CSMA/CD、交换机和 VLAN。你每天插网线、连 WiFi,背后都是它们在默默工作。

一、链路层概述:从「IP 包」到「物理信号」#

1.1 为什么还需要链路层?#

前面几章我们一直在聊应用层和传输层,数据以 IP 数据报的形式在网络上飞来飞去。但问题来了——IP 包只是逻辑上的数据包,它不知道怎么在一根网线上变成电信号传过去。

就像你知道快递要从北京寄到上海(IP 层知道目的地址),但你总不能让快递员自己长翅膀飞过去吧?他得坐高铁、坐飞机、骑三轮——每一段路程,交通工具是不同的。

🎯 链路层的核心使命

将 IP 数据报(或者说网络层数据报)从一个节点(主机或路由器)传输到相邻的下一个节点(next-node)。每跨一段链路,用的协议可能不一样,但链路层负责把这件事搞定。

1.2 链路层的服务#

链路层主要提供以下服务(不是所有链路层协议都全部提供):

服务 说明 生活类比
成帧(Framing) 把网络层数据报封装成帧,加上头和尾 把信件装进信封,写上收件人地址
链路接入 决定什么时候可以发送数据(MAC 协议) 开会时谁先发言?得有个规则
可靠交付 有些链路层保证无差错传输(如 WiFi),有些不保证(如以太网) 快递签收 vs. 直接丢门口
差错检测与纠正 检测传输过程中的比特翻转,甚至纠正 信封破损了检查一下,能修就修

1.3 链路层在哪里实现?#

不同于应用层和传输层主要在操作系统内核或用户空间实现,链路层主要在硬件(网卡)和固件中实现

在你的 Mac mini 上,链路层功能主要由这几部分完成:

  • 网卡(NIC,Network Interface Card):负责实际的信号发送和接收,实现了 CSMA/CD、CRC 校验等
  • 网卡驱动程序:操作系统和硬件之间的桥梁
  • 链路层地址(MAC 地址):烧录在网卡上的硬件地址

💡 实际看看你的 Mac mini

打开终端,输入 ifconfig en0,你会看到 ether d0:11:e5:be:86:a7——这就是你 Mac mini 以太网口的 MAC 地址。这个地址是全球唯一的,在网卡出厂时就烧好了。

有趣的是,你的 WiFi 接口(en1)有另一个不同的 MAC 地址:d0:11:e5:9e:19:2c每个网络接口都有自己独立的 MAC 地址。

1.4 MAC 地址 vs IP 地址——经典对比#

这个问题面试必考,我们好好捋一捋:

对比项 MAC 地址 IP 地址
所在层 链路层 网络层
长度 48 位(6 字节) 32 位(IPv4)/ 128 位(IPv6)
表示方式 D0:11:E5:BE:86:A7 192.168.31.31
是否可变 烧录在网卡上,理论不变(但可软件修改) 随网络环境变化
分配方式 IEEE 分配前 24 位,厂商分配后 24 位 DHCP 或手动配置
持久性 永久(跟着网卡走) 临时(跟着网络走)

🏠 生活类比:MAC 地址 = 身份证号,IP 地址 = 通讯地址

你的身份证号一辈子不变(MAC 地址),但你搬家后通讯地址就变了(IP 地址)。写信给别人,你写的是通讯地址(IP),但邮递员在最后一公里,是靠身份证上的名字(MAC)来确认是不是交对了人。

1.5 成帧:把数据「打包」#

链路层把网络层交下来的 IP 数据报封装成帧(Frame)。一个典型的帧结构如下:

1
2
3
4
┌──────────┬──────────┬──────────┬───────────────┬──────────┬──────────┐
│ 前导码 │ 目标MAC │ 源MAC │ 类型/长度 │ 数据 │ CRC │
│ 8 bytes │ 6 bytes │ 6 bytes │ 2 bytes │ 可变 │ 4 bytes │
└──────────┴──────────┴──────────┴───────────────┴──────────┴──────────┘
  • 前导码:用来同步时钟,相当于「注意了,我要开始说话了!」
  • 目标 MAC / 源 MAC:收件人和寄件人的硬件地址
  • 类型:上层协议类型(比如 0x0800 表示 IPv4)
  • 数据:IP 数据报本体(MTU 通常是 1500 字节)
  • CRC:循环冗余校验,用来检测传输错误

📦 生活类比:就像寄快递——IP 包是里面的物品,链路层帧是快递箱。快递箱上贴着寄件人和收件人的地址标签(MAC 地址),箱子里放着物品(IP 数据报),箱底还有个防伪码(CRC)确保没被掉包。


二、多路访问协议:一条路上谁先走?#

2.1 问题在哪?#

有些链路是广播链路——多个节点共享同一条物理介质。比如早期的总线型以太网,所有电脑接在同一根同轴电缆上。这时候问题就来了:如果两台电脑同时发数据,信号就会撞在一起(碰撞)

这就像一群人挤在一个房间里说话,如果大家同时开口,谁也听不清。得有个规则。

2.2 三大类多路访问协议#

信道划分协议#

把信道提前分好,每人一份:

  • TDMA(时分多路访问):每人一个时间片,轮流来
  • FDMA(频分多路访问):每人一个频率通道

🎵 类比:就像合唱团,有人唱高音、有人唱低音(FDMA),或者大家轮流独唱(TDMA)。

随机接入协议#

不分份,谁想发就发,撞了再说:

  • ALOHA:最简单粗暴——想发就发,没收到确认就等一会儿重发
  • CSMA/CD:先听后说,撞了就退

轮流协议#

大家自觉排队:

  • 轮询(Polling):主节点挨个问「你有数据要发吗?」
  • 令牌传递(Token Passing):拿着令牌的才能发,发完传给下一个

2.3 CSMA/CD——以太网的核心协议#

CSMA/CD(载波侦听多路访问/碰撞检测) 是经典以太网的多路访问协议。它的规则可以总结为一句人话:

「先听后说,边说边听,撞了就撤,等会再来。」

拆解一下:

  1. 载波侦听(CS):发送前先听一下链路上有没有人在发数据。有就等,没有就发。

    • 🔧 类比:开会发言前先听听有没有人在说话
  2. 多路访问(MA):多个节点共享链路

  3. 碰撞检测(CD):发送过程中同时监听链路。如果检测到信号异常(说明别人也在发),立即停止。

    • 🔧 类比:你开口说话的同时也在听,发现有人也在说,你就停下来
  4. 二进制指数退避:碰撞后,等一个随机时间再试。如果又撞了,等待时间的上限翻倍,以此类推。

    • 🔧 类比:两个人同时开口,都停下来。等 1 秒再试;又撞了,等 2 秒;再撞,等 4 秒……最多等到 1024 个时间槽

💡 重要细节:为什么有线以太网用 CSMA/CD,而 WiFi 用 CSMA/CA?

因为有线链路可以「边发边听」(碰撞检测),但无线链路做不到——发射信号太强,会盖住接收信号,所以 WiFi 只能「避免碰撞」(CA,Collision Avoidance)而不是「检测碰撞」(CD,Collision Detection)。

2.4 现代以太网还需要 CSMA/CD 吗?#

基本上不需要了。 现代以太网用的是交换机(Switch)而不是集线器(Hub)。交换机的每个端口是独立的冲突域,一台电脑和交换机之间的链路上只有它自己,不存在碰撞。CSMA/CD 主要存在于使用集线器的老式半双工以太网中。

你的 Mac mini 插在路由器/交换机上,走的是全双工模式,发送和接收各走各的道,根本不会撞车。


三、ARP 协议:从 IP 地址找 MAC 地址#

3.1 为什么需要 ARP?#

数据在网络层用的是 IP 地址,但在链路层,帧是用 MAC 地址来寻址的。所以问题来了:

我知道要把数据发给 192.168.31.1(路由器),但我怎么知道它的 MAC 地址是什么?

这就是 ARP(Address Resolution Protocol,地址解析协议) 干的事——把 IP 地址翻译成 MAC 地址。

📮 生活类比

你知道同事小明在「销售部 308 工位」(IP 地址),但你要寄快递,快递单上得写他的身份证号(MAC 地址)。你不知道怎么办?最简单的办法:在办公室大喊一声「308 工位的小明,你的身份证号是多少?」。小明听到了,大声回答你。这就是 ARP。

3.2 ARP 的工作过程#

  1. 查询 ARP 缓存:先看本地的 ARP 表里有没有这个 IP 对应的 MAC 地址。有就直接用,不用每次都广播。
  2. 发送 ARP 请求:如果没有,链路层广播一个 ARP 请求帧(目标 MAC = FF:FF:FF:FF:FF:FF),帧里包含「谁的 IP 是 192.168.31.1?请把你的 MAC 告诉我。」
  3. ARP 响应:目标节点收到请求后,发现自己的 IP 确实是这个,就单播回复自己的 MAC 地址。
  4. 更新 ARP 缓存:发送方把这条记录存进 ARP 表,通常缓存 15-20 分钟。

3.3 🔧 实战:在你的 Mac mini 上查看 ARP 表#

打开终端,执行以下命令:

1
2
3
4
5
6
7
# 查看完整的 ARP 表
arp -a

# 你会看到类似这样的输出:
# xiaoqiang (192.168.31.1) at 58:ea:1f:71:25:bb on en1 ifscope [ethernet]
# iphone (192.168.31.15) at de:bb:e:58:97:1a on en1 ifscope [ethernet]
# mac (192.168.31.31) at 26:a:bc:79:39:c8 on en1 ifscope permanent [ethernet]

来解读一下:

  • **xiaoqiang (192.168.31.1)**:这是你的小米路由器(OpenWrt 系统)。它的 IP 是 192.168.31.1,MAC 地址是 58:ea:1f:71:25:bbxiaoqiang 是小米路由器的主机名。
  • **iphone (192.168.31.15)**:你的 iPhone,MAC 地址 de:bb:e:58:97:1a
  • **mac (192.168.31.31)**:你自己的 Mac mini!MAC 地址 26:a:bc:79:39:c8,标注了 permanent 因为这是本机接口的 MAC

🔍 动手试试:试着 ping 一个你之前没通信过的设备,然后立刻 arp -a 看看 ARP 表有没有变化。你会看到一条新的记录被添加了——这就是 ARP 协议刚刚在后台默默工作了。

3.4 ARP 欺骗——安全隐患#

ARP 协议有一个天生缺陷:它不验证响应的真实性。任何设备都可以发送 ARP 响应说「我是 192.168.31.1,我的 MAC 是 XX:XX:XX:XX」,其他设备会照单全收。

这就是 ARP 欺骗(ARP Spoofing) 的原理,也是中间人攻击的常见手段。黑客把自己的设备伪装成路由器的 MAC 地址,让其他设备的流量都经过他。

防御手段:静态 ARP 绑定、动态 ARP 检测(DAI)、网络隔离等。在 OpenWrt 路由器上,你可以配置静态 ARP 绑定来防止 ARP 欺骗。


四、以太网:统治世界的链路层技术#

4.1 以太网简史#

以太网的历史可以追溯到 1970 年代。Robert Metcalfe 在 Xerox PARC 发明了它,最初的速度只有 2.94 Mbps,用一根同轴电缆连接所有电脑。

后来以太网不断进化:

版本 速度 介质 年代
10Base5(粗缆以太网) 10 Mbps 同轴电缆 1980s
10Base-T 10 Mbps 双绞线 1990s
快速以太网 100 Mbps 双绞线/光纤 1995
千兆以太网 1 Gbps 双绞线/光纤 1998
万兆以太网 10 Gbps 光纤/双绞线 2002
25/40/100 Gbps 以太网 25-100 Gbps 光纤 2010s
400 Gbps 以太网 400 Gbps 光纤 2017+

🤯 想想看:从 2.94 Mbps 到 400 Gbps,以太网速度提升了 13 万倍以上。但帧格式几乎没有变过。这就是好设计的力量——向前兼容是以太网长盛不衰的关键。

4.2 以太网帧结构#

以太网帧的格式非常简洁:

1
2
3
4
┌───────────┬────────────┬──────────┬──────────┬─────────────────┬──────┐
│ 前导码 │ 目标 MAC │ 源 MAC │ 类型 │ 数据(46-1500B)│ CRC │
│ 8 bytes │ 6 bytes │ 6 bytes │ 2 bytes │ │ 4B │
└───────────┴────────────┴──────────┴──────────┴─────────────────┴──────┘

几个关键点:

  • 最小帧长 64 字节:为了保证碰撞检测能正常工作(发送端还没发完就能检测到碰撞)。如果数据不够 46 字节,就填充到 46 字节。
  • 最大帧长 1518 字节:其中数据部分最大 1500 字节(这就是 MTU 1500 的由来)。
  • 类型字段:指示上层协议。0x0800 = IPv4,0x86DD = IPv6,0x0806 = ARP。
  • CRC:32 位循环冗余校验,接收方用它检测错误。如果校验失败,直接丢弃(以太网不做重传,交给上层处理)。

4.3 以太网为什么「赢了」?#

在链路层技术的竞争中,以太网打败了 Token Ring、FDDI、ATM 等对手,成为绝对的霸主。原因:

  1. 简单:CSMA/CD 比令牌环简单多了
  2. 便宜:设备和线缆成本低
  3. 向前兼容:新版本保持帧格式不变,老设备能混用
  4. 不断进化:从共享到交换,从半双工到全双工,不断自我革新
  5. 网络效应:用的人越多,生态越完善,成本越低,用的人更多

🏆 类比:以太网就像 USB 接口——不是技术最完美的方案,但凭借简单、便宜、兼容性好的优势,干掉了所有竞争对手。


五、交换机:链路层的「智能快递分拣中心」#

5.1 从集线器到交换机#

早期的以太网用集线器(Hub)连接所有设备。集线器是纯物理层设备,它做的事情简单粗暴:把一个端口收到的信号,复制到所有其他端口

📢 类比:集线器就像一个大喇叭广播系统——一个人说话,所有人都能听到。问题是:只有说话人和目标听众关心这个消息,其他人觉得是噪音。而且两个人同时说话就撞车了。

交换机(Switch) 是链路层设备,聪明得多。它会根据 MAC 地址,把帧只送到目标端口

📮 类比:交换机就像一个智能分拣中心的快递员——看到收件人地址(目标 MAC),直接送到对应的传送带上,不会满大厅乱喊。

5.2 交换机的工作原理#

交换机的核心是一张 转发表(也叫 MAC 地址表 / CAM 表)。这张表记录了:哪个 MAC 地址在哪个端口上

工作流程:

  1. 收到帧:交换机从某个端口收到一个以太网帧
  2. 学习(自学习):查看帧的源 MAC 地址,记录到转发表中——「哦,这个 MAC 在这个端口上」
  3. 查表转发:查看帧的目标 MAC 地址,查转发表:
    • 找到了?只从对应端口转发出去 ✅
    • 没找到?泛洪(Flooding)——从所有其他端口转发出去(除了收到的那个端口)
  4. 过滤:如果目标 MAC 和源 MAC 在同一个端口上,说明不需要转发,直接丢弃

🧠 交换机自学习——天才般的设计

交换机不需要任何配置,开机就能工作。它通过观察流经的帧,自动学习哪个设备在哪个端口。这叫即插即用(Plug and Play)

5.3 🔧 实战:想象你家的网络拓扑#

你的网络结构大致是这样的:

1
2
3
4
5
6
7
8
9
10
11
互联网

├── 小米路由器/OpenWrt (192.168.31.1, MAC: 58:ea:1f:71:25:bb)
│ (内置交换机芯片 + WiFi AP)
├── WiFi 设备
│ ├── Mac mini en1 (192.168.31.31, MAC: 26:0a:bc:79:39:c8)
│ ├── iPhone (192.168.31.15, MAC: de:bb:e:58:97:1a)
│ └── iPad (192.168.31.162, MAC: 26:b1:3d:8e:61:50)

└── 有线设备
└── Mac mini en0 (MAC: d0:11:e5:be:86:a7, 当前未连接)

你的小米路由器内置了一个小交换机芯片。当你的 Mac mini 通过 WiFi 发数据给 iPhone 时,路由器的交换芯片在链路层做转发:

  1. 收到来自 Mac mini 的帧(源 MAC = 26:0a:bc:79:39:c8
  2. 学习:「Mac mini 在 WiFi 接口这一侧」
  3. 查目标 MAC(de:bb:e:58:97:1a),发现是 iPhone
  4. 转发到 iPhone 所在的 WiFi 信道

💡 如果你想玩更高级的:OpenWrt 系统支持查看和管理交换机配置。SSH 登录你的路由器后,可以用 swconfig listswconfig dev switch0 show 查看交换机芯片的 VLAN 配置和端口状态。

5.4 交换机 vs 路由器#

对比项 交换机 路由器
工作层级 链路层(第二层) 网络层(第三层)
寻址方式 MAC 地址 IP 地址
转发表 MAC 地址表(自动学习) 路由表(配置或协议学习)
即插即用 ✅ 是 ❌ 需要配置
隔离冲突域 ✅ 每个端口一个冲突域
隔离广播域 ❌ 不隔离(除非用 VLAN) ✅ 每个接口一个广播域
处理速度 快(硬件转发) 相对慢(需要查路由表)

六、VLAN:虚拟局域网#

6.1 为什么需要 VLAN?#

随着网络规模增大,交换机面临一个问题:广播包(比如 ARP 请求)会泛洪到所有端口。如果网络里有几百台设备,广播流量会变得很讨厌。

而且有时候我们希望隔离不同部门/类型的设备

  • 办公网络和 IoT 设备网络隔离
  • 开发测试环境和生产环境隔离
  • 访客 WiFi 和内网隔离

🏢 类比:一栋大楼里,你想让财务部、技术部、市场部各自独立,互不干扰。物理上他们都在同一栋楼里,但你可以用门禁系统把他们分到不同的区域。VLAN 就是网络世界的「门禁系统」。

6.2 VLAN 的工作原理#

VLAN(Virtual Local Area Network,虚拟局域网)通过在以太网帧上插入一个 VLAN 标签(802.1Q Tag),将一个物理交换机划分为多个虚拟局域网。

带 VLAN 标签的帧格式(802.1Q):

1
2
3
4
┌───────────┬────────────┬──────────┬────────────────┬──────────┬──────┐
│ 目标 MAC │ 源 MAC │ VLAN Tag │ 类型 │ 数据 │ CRC │
│ 6 bytes │ 6 bytes │ 4 bytes │ 2 bytes │ 可变 │ 4B │
└───────────┴────────────┴──────────┴────────────────┴──────────┴──────┘

VLAN Tag 里最重要的信息是 VLAN ID(12 位),取值范围 0-4095。

同一个 VLAN 内的设备可以自由通信,不同 VLAN 之间需要通过路由器(或三层交换机)才能通信。

6.3 端口类型:Access 端口和 Trunk 端口#

  • Access 端口(接入端口):只属于一个 VLAN。连普通 PC/设备的端口。

    • 🔧 类比:一个房间的门,只能进出一个部门的人
    • 帧在 Access 端口上不带 VLAN 标签(标签在交换机内部处理)
  • Trunk 端口(中继端口):可以承载多个 VLAN 的流量。通常用于交换机之间的连接。

    • 🔧 类比:一条走廊,连接多个房间,不同部门的人都可以走
    • 帧在 Trunk 端口上带 VLAN 标签,以区分属于哪个 VLAN

6.4 🔧 实战:OpenWrt 路由器上的 VLAN 配置#

很多 OpenWrt 路由器支持 VLAN 功能。一个典型的应用场景是把路由器的 4 个 LAN 端口划分成不同的 VLAN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# SSH 登录路由器后查看交换机配置
swconfig dev switch0 show

# 你可能看到类似这样的输出:
# Port 0: LAN1 (VLAN 1)
# Port 1: LAN2 (VLAN 1)
# Port 2: LAN3 (VLAN 1)
# Port 3: LAN4 (VLAN 1)
# Port 4: CPU
# Port 5: WAN (VLAN 2)

# 一个常见的 VLAN 划分场景:
# VLAN 1: LAN (正常局域网)
# VLAN 2: WAN (互联网接入)

常见的 VLAN 应用场景:

  1. IPTV 分流:把 IPTV 机顶盒的端口单独划一个 VLAN,避免广播包干扰其他设备
  2. Guest WiFi:访客 WiFi 和主网络隔离(OpenWrt 通常通过独立接口实现,本质也是 VLAN 隔离)
  3. IoT 隔离:智能家居设备放在单独的 VLAN,防止被入侵后横向渗透到主网络

6.5 你的 Mac mini 与 VLAN#

回到你的系统。还记得 ifconfig en0 输出中有一行 options=567<RXCSUM,TXCSUM,VLAN_MTU,TSO4,TSO6,AV,CHANNEL_IO> 吗?

那个 VLAN_MTU 表示你的 Mac mini 网卡支持 VLAN 功能。macOS 中可以通过以下命令配置 VLAN:

1
2
3
4
5
# 查看 VLAN 配置(默认没有)
networksetup -listVLANs

# 创建 VLAN(需要指定物理接口和 VLAN ID)
# sudo networksetup -createVLAN "VLAN100" en0 100

在实际使用中,如果你只是普通家用,不太需要在 Mac 上配 VLAN。但如果你搞了软路由、NAS 虚拟化或者企业网络,VLAN 就是必备技能了。


七、链路层的完整数据之旅#

让我们把今天学的东西串起来,走一遍完整流程:当你的 Mac mini 要发一个 HTTP 请求给服务器时,链路层做了什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
应用层:HTTP 请求消息

传输层:封装成 TCP 报文段(加端口号)

网络层:封装成 IP 数据报(加源 IP 192.168.31.31,目标 IP xxx)

链路层:封装成以太网帧

1. 查 ARP 表:目标 IP(路由器 192.168.31.1)的 MAC 是什么?
→ 找到 58:ea:1f:71:25:bb(之前缓存了)
2. 构建帧:源 MAC = 26:0a:bc:79:39:c8,目标 MAC = 58:ea:1f:71:25:bb
3. CSMA/CD 检查链路空闲 → 发送!(全双工模式,实际不会碰撞)

物理层:变成电信号/无线信号传输

到路由器后,路由器拆掉链路层帧头,看 IP 层,决定下一跳是谁,再重新封装成新的链路层帧发出去……就这样一路接力,直到目的地。

🎯 一句话总结:链路层负责相邻节点间的「最后一跳/下一跳」传输。IP 负责全程路线规划,链路层负责每一步的实际行动。


🔑 关键知识点回顾#

知识点 核心内容
链路层职责 成帧、链路接入、差错检测、可靠交付(可选)
MAC 地址 48 位硬件地址,网卡出厂烧录,链路层寻址用
CSMA/CD 先听后说、边说边听、碰撞退避。现代交换式以太网已不太需要
ARP 协议 将 IP 地址解析为 MAC 地址。广播请求 + 单播响应,有缓存表
以太网帧 目标MAC + 源MAC + 类型 + 数据(46-1500B) + CRC
交换机原理 自学习 MAC 地址表,按目标 MAC 单端口转发,未知则泛洪
VLAN(802.1Q) 用标签在物理交换机上划分虚拟局域网,隔离广播域
交换机 vs 路由器 交换机二层转发(MAC),路由器三层转发(IP)

📌 Day 12 预告:无线网络和移动网络——WiFi、蜂窝网络#

今天我们聊了有线链路层,但你现在用 Mac mini 很可能走的是 WiFi。无线网络可是一个完全不同的战场——信号会衰减、会被干扰、不能边发边听(所以 WiFi 用 CSMA/CA 而不是 CSMA/CD)。

明天 Day 12,我们来聊:

  • WiFi(802.11 系列):你每天用的无线网络是怎么工作的?
  • CSMA/CA:无线版本的「先听后说」,比有线版本更谨慎
  • 蜂窝网络(4G/5G):手机是怎么在移动中保持连接的?
  • 移动性管理:从 WiFi 切到 4G,为什么视频不会断?

WiFi 的帧格式、无线信道的挑战、蜂窝网络的架构……精彩的无线世界等着我们!


💬 今日思考题:如果有人在你局域网里疯狂发 ARP 欺骗包,你的 Mac mini 会怎样?怎么发现?怎么防御?欢迎在评论区讨论!

—— 小黑白陪你读网络,Day 11 打卡 ✅