03 · 数据链路层(Data Link Layer)

📅 预计 70 分钟 | ⭐ 本章主题:把"裸比特"打包成"帧",管好相邻两台的传送


3.0 先给直觉:链路层是"小区内的快递驿站"

物理层把比特流送出去了,但物理层很"笨"——它不知道一堆 1 和 0 从哪里来、到哪里去、有没有传错。数据链路层就是物理层上面的一层,它干的事很像小区里的快递驿站

  • 快递要打包(在比特流前后加"帧头帧尾",让接收方知道"哪到哪算一单")。
  • 每单要贴门牌(MAC 地址,认准同一链路内的收发方)。
  • 送完要验收(差错检测,坏了就重送)。
  • 小区门口有个智能货柜(交换机),按门牌精准投递。

这一层只负责相邻两个节点之间的传输——比如你的电脑和家里的路由器/交换机之间。跨城市的远途运输(跨网络)是网络层的活,链路层不操心。

3.1 帧(frame):链路层的数据单元 ⭐

帧 = 比特流被"切"出来的一单快递

物理层送来的是连续的比特流。链路层要把它们切成一段段,每一段前后加控制信息,成为一个帧(frame)。典型帧结构:

| 帧首(目的地址+源地址) | 类型/长度 | 数据 | 帧校验(FCS) |
  • 目的地址 / 源地址:同一链路内收发方的 MAC 地址
  • 类型 / 长度:标识上层协议(如 IPv4)或数据长度。
  • 数据:来自网络层的 IP 分组。
  • 帧校验 FCS:用于差错检测的校验码(见 3.3 CRC)。

帧的边界靠帧头帧尾的特殊标记或定长来区分——接收方收到一帧,知道"这一单结束了"。

💡 一句话网络层传"分组/数据报",链路层把它包成"帧",物理层再把帧变成比特。帧是链路层的"快递单"。

以太网帧格式(IEEE 802.3) 是这个"快递单"的标准长相:

| 前导码(7B) | 帧首定界符(1B) | 目的MAC(6B) | 源MAC(6B) | 类型(2B) | 数据(46~1500B) | FCS(4B) |
  • 前导码 + 定界符:让接收方"对表",同步时钟。
  • 目的/源 MAC:各 6 字节,本链路的收发方。
  • 类型/长度:标识上层协议,如 0x0800 表示 IPv4。
  • 数据:网络层分组,最小 46 字节(凑够 64 字节最小帧长),最大 1500 字节(MTU,最大传输单元)。
  • FCS(4 字节):CRC 校验码。
  • 整个帧不含前导码约 64~1518 字节

⚠️ 常见错误

  1. 把帧和分组混了:分组/数据报是网络层的数据单元,帧是链路层的。链路层给分组"加头加尾"就变成了帧。
  2. 以为帧里存的是原始比特流:帧是"切分+打包"后的结构,有明确的帧头帧尾边界。
  3. MAC 地址和 IP 地址分不清:MAC 是"本链路内认门牌"(局域网内有效),IP 是"全球寻址"(跨网络有效),二者都会出现在帧里(IP 是"数据"里包的)。

3.2 MAC 地址 ⭐⭐⭐

每张网卡出厂就带的门牌号

MAC(Media Access Control,介质访问控制)地址是网卡出厂时烧录的全球唯一标识,48 位(6 字节),通常写成十六进制:

  00-1A-2B-3C-4D-5E
  └────────────┬────────┘
前 24 位 OUI:厂商编号(如 Cisco、Intel)
后 24 位:厂商自己分配的序列号

特点:

  • 全球唯一:理论上每块网卡一个 MAC,世界不重号。
  • 烧在硬件里:一般不可改(可伪装,但那是另一回事)。
  • 只在同一链路(局域网)内有效:数据在局域网内靠 MAC 找目标;出了局域网,MAC 会逐跳变化(每个路由器接口都有自己的 MAC),而 IP 地址全程不变

对比一下两个地址的分工:

地址 谁有 范围 比喻
MAC 地址 每块网卡 局域网内、逐跳变化 小区门牌号
IP 地址 每个主机/接口 全球、端到端不变 全国邮政地址

💡 记忆口诀"MAC 认邻居,IP 认全球"——MAC 是邻居之间的门牌,IP 是跨省市的邮政地址。快递到你家门口最后一步靠门牌,这最后一步就是链路层的活。

⚠️ 常见错误

  1. 以为 MAC 地址跨网络不变:帧每经过一个路由器,MAC 头会被重写(目的 MAC 改成下一跳),但 IP 地址不变。
  2. 把 MAC 记成 32 位:IPv4 地址是 32 位,MAC 地址是 48 位(6 字节),写成 6 组十六进制。
  3. MAC 是"网卡"的不是"电脑"的:一台电脑有 Wi-Fi 和有线两张网卡,就有两个 MAC 地址。

3.3 差错控制:CRC 循环冗余校验 ⭐⭐⭐

怎么知道传过来的货有没有坏

比特在线路上跑,可能受干扰翻几个位(1 变 0、0 变 1)。接收方怎么发现"这单货坏了"?用差错检测码。链路层最常用的是 CRC(Cyclic Redundancy Check,循环冗余校验)

思路(不用背手算过程,理解逻辑即可):

  1. 发送方:把数据看成一个二进制多项式,除以一个约定的生成多项式 G(x),得到余数,把余数附加在数据后面一起发送。
  2. 接收方:用同一个 G(x) 去除"收到的数据+余数"。如果余数为 0 → 认为无错;不为 0 → 出错,丢弃该帧。
发送端: 数据D ÷ 生成多项式G = 商... 余数R
        发送内容 = 数据D + 余数R
接收端: (数据D + 余数R) ÷ G
        余数为0 → 正确   |   余数非0 → 出错,丢弃

几个关键点:

  • CRC 只能"检错",不能"纠错":发现错误后靠重传(ARQ,自动重传请求)解决,不会自己把错位"修好"。
  • 校验能力取决于生成多项式:检测不出错误的概率很低,但不能保证 100%。
  • 另一种相关的编码是海明码(Hamming code):它既能检错也能纠错,但冗余大,用于对可靠性要求苛刻的场合(如内存纠错)。

💡 记忆口诀"CRC 除法求余、错了就丢"——发送方除出余数挂后面,接收方再除一次,非零就扔掉重传。

CRC 怎么"除":一个看得懂的思路

不需要会手算多项式除法,但要看懂原理。约定一个生成多项式,例如最常用的 CRC-32 G(x) = x³² + ... + 1。过程是模 2 除法(加减都是异或,不进位):

数据 D = 1011,生成多项式对应除数 G = 1011(假设 4 位)

1. 在 D 后面补(G 的位数 − 1)个 0 → 1011 000
2. 用 G 对 1011000 做模 2 除法,得余数 R
3. 把余数 R 附加在 D 后面发送:1011 R
4. 接收方用 G 去除收到的整段,余数为 0 → 正确;非 0 → 出错丢弃

关键:模 2 除法 = 逐位异或,没有借位进位。余数 R 的位数 = G 的位数 − 1,附加在数据后正好凑成"整除"。

⚠️ 常见错误

  1. 把 CRC 说成能纠错:CRC 只检错纠错,纠错靠重传(ARQ);海明码才直接纠错。
  2. 以为 CRC 能保证 100% 检测所有错误:CRC 是概率性的——绝大多数错误能查出,但存在极小概率查不出(校验位也恰好被破坏成"看似正确")。
  3. 把 CRC 和校验和(checksum)混为一谈:CRC 是"按位多项式除法",用在链路层;checksum 是"按字节求和取反",用在 IP/TCP/UDP 报头,机制不同。

3.4 以太网与 CSMA/CD ⭐⭐⭐

共享一条线的"先听后说"

以太网(Ethernet) 是最主流的局域网技术(你的有线网、办公室网络基本都是它)。早期以太网用一根共享总线:多台电脑连在同一根线上,谁都能发。

问题来了:多台电脑同时发数据就会碰撞,信号搅在一起全乱。怎么避免?用 CSMA/CD(Carrier Sense Multiple Access with Collision Detection,载波监听多路访问/碰撞检测),规则像"多人抢一个话筒":

  1. 先听后说(载波监听 CS):发数据前先"听"线路上有没有人正在发。有人发就,没人发才发。
  2. 边说边听(碰撞检测 CD):发的同时继续监听,如果发现信号强度异常(撞上了),立刻停止发送。
  3. 随机退避:撞了之后,各自随机等一段时间再重试,避免又同时抢。
A 想发 → 先听线 → 空闲 → 发!
        ↓              ↑
B 也发 → 撞车了! → 双方停,各自随机等再试

💡 一句话:CSMA/CD = "先听后发、边发边听、撞了退让"。它是"共享介质"时代的方案。现在的以太网都用交换机全双工互连,几乎不碰撞了,CSMA/CD 更多作为原理被学习。

CSMA/CD 的一个衍生考点:最小帧长。为什么要有最小帧长?因为发送方要能"边发边听"——如果帧太短,发完了才撞上,发送方已经停了监听,检测不到碰撞。以太网规定最小帧长为 64 字节,确保在最坏情况下(两端相距最远),发送方在发完前就能听到碰撞。帧比 64 字节短(比如填充不足),算无效帧。

最远两端各发一帧,信号一来一回需要时间:
  碰撞发生在靠近接收端处,发送方要等"去 + 回"的时间才知道撞了
  → 帧长必须足够大,保证发送期间能收到碰撞信号 → 最小帧长 64 字节

⚠️ 常见错误

  1. 把 CSMA/CD 当成现代必用:交换式以太网是全双工点对点,不存在碰撞,不需要 CSMA/CD;它主要用在早期共享式总线以太网和教学里。
  2. 漏掉"随机退避":撞了不是立刻重发,而是随机等待一段时间,否则两人同时重发又撞。
  3. CSMA/CD 与 CSMA/CA 混淆:CD(Collision Detection)用于有线以太网(碰撞能检测到);CA(Collision Avoidance)用于Wi-Fi 无线网(半双工,难检测碰撞,所以尽量"避免")。

3.5 交换机(switch)⭐

从"广播喊话"升级到"精准投递"

早期的集线器(hub)收到数据,给所有端口都发一遍(广播),谁的目标 MAC 对上谁收。浪费且不安全。

交换机(switch) 更聪明,它是二层设备,学过的关键:

  1. 学习:每收到一帧,把"源 MAC + 进来的端口"记进MAC 地址表(转发表)
  2. 转发:收到一帧,查表找"目的 MAC 在哪个端口",只往那个端口发——精准投递。
  3. 泛洪:表里查不到目的 MAC 时,才向除源端口外的所有端口转发(泛洪),顺便让它"回应"以便学习。
交换机 MAC 地址表(示意):
  MAC 00-11-22-33-44-55  →  端口 1
  MAC AA-BB-CC-DD-EE-FF  →  端口 3
收到目的 MAC = AA-BB-CC-DD-EE-FF 的帧 → 只从端口 3 发出,不打扰端口 2、4

交换机的隔离效果:

  • 隔离冲突域:每个端口是一条独立的"话路",端口之间不碰撞——这是它和集线器最大的区别。
  • 不隔离广播域:交换机仍会转发广播帧(目的 MAC 全 FF-FF-FF-FF-FF-FF),广播会传到所有端口。要隔离广播域,得上路由器/VLAN

交换机的三种转发方式(按"收到多少就转"区分,考试常考对比):

方式 做法 优点 缺点
存储转发(store-and-forward) 收完整帧、验 CRC 通过后再转发 差错控制严、不会转坏帧 延迟大
直通转发(cut-through) 只看到目的 MAC(前 6 字节)就转发 延迟极小 不验错、坏帧也转
无碎片转发(fragment-free) 收到 64 字节(最小帧长)再转 介于两者之间,过滤碎片 校验仍不完整

💡 记忆口诀"交换机认 MAC、学一张表、精准发"——学源地址,查目的地址,查不到才泛洪。转发快慢看方式:存储转发最稳最慢,直通最快但不验错。

⚠️ 常见错误

  1. 把交换机说成"隔离广播域":交换机隔离冲突域(端口间不碰撞),但不隔离广播域(广播仍全网传播)。
  2. 以为交换机会修改 MAC:交换机只看不改帧里的 MAC 地址,只是按表转发;改 MAC 的是路由器。
  3. MAC 地址表不是预先配好的:是交换机动态学习出来的,条目还会老化过期。

3.6 VLAN:虚拟局域网 ⭐⭐

在一个交换机里"切开"几间房

问题来了:一台交换机下挂了 50 台电脑,其中 20 台是财务部、30 台是研发部。交换机默认让他们互相都通——广播也是一传传 50 台,既慢又泄密。

VLAN(Virtual LAN,虚拟局域网) 就是在一台(组)物理交换机上划分出多个逻辑隔离的局域网

  • 同一 VLAN 内的主机可以直接通信(二层通)。
  • 不同 VLAN 之间的主机默认不通(像隔了一堵墙),要通信必须经过路由器(三层转发)。
  • 广播只在同一个 VLAN 内传播——广播域被切小了。
一台交换机,划分两个 VLAN:
  VLAN 10(财务):端口 1-10,IP 段 192.168.10.0/24
  VLAN 20(研发):端口 11-30,IP 段 192.168.20.0/24

财务电脑 ping 研发电脑 → 不通(跨 VLAN 需要路由器/三层交换机转发)
广播只到本 VLAN 内 → 财务的广播不会打扰研发

好处:缩小广播域、增强安全隔离、管理灵活(一台交换机顶多台用,员工换部门只需改端口所属 VLAN,不用拔线)。

💡 记忆口诀"VLAN 在交换机里砌墙"——墙内二层直通,墙外靠路由器跨。

⚠️ 常见错误

  1. 以为 VLAN 能隔离冲突域:VLAN 隔离的是广播域;冲突域由交换机端口天然隔离。
  2. 以为不同 VLAN 完全不能通信:默认不通,但配好路由器/三层交换机后可以跨 VLAN 通信(要三层路由)。
  3. VLAN 是逻辑概念不是物理线:不用多拉网线,改端口配置即可把一个端口划进某个 VLAN。

🧠 记忆口诀

  • 链路层三件事:成帧(切快递单)、寻址(贴 MAC 门牌)、验错(CRC 验收)。
  • MAC 认邻居,IP 认全球:MAC 逐跳变,IP 全程不变。
  • CRC 除出余数挂后面,收方再除一次,非零就丢
  • CSMA/CD 先听后发、边发边听、撞了随机退让
  • 交换机学 MAC、查表精准发,隔离冲突不隔离广播
  • VLAN 交换机里砌墙:墙内直通,墙外靠路由

⭐ 考点清单

  1. 帧的结构与"网络层分组 → 链路层帧"的转换关系
  2. MAC 地址:48 位、全球唯一、OUI+序列号、只在本链路有效且逐跳变化
  3. CRC 检错原理:生成多项式除法求余、能检错不能纠错、错了靠重传
  4. 以太网 CSMA/CD:先听后发、碰撞检测、随机退避;与 CSMA/CA 的区别
  5. 交换机:MAC 地址表学习、按目的 MAC 精准转发、泛洪;隔离冲突域不隔离广播域
  6. VLAN:划分逻辑子网、缩小广播域、跨 VLAN 需路由器
  7. 集线器(广播所有端口)与交换机(按表转发)的对比
  8. CSMA/CD 最小帧长 64 字节及其原因(边发边听要能听到碰撞)
  9. 以太网帧格式:前导码、MAC、类型、数据(46~1500B)、FCS
  10. 交换机三种转发方式:存储转发/直通/无碎片 的对比

📌 中英术语表

中文 English 说明
数据链路层 data link layer 相邻节点间成帧、寻址、验错
frame 链路层的数据单元
MAC 地址 MAC address 网卡唯一标识,48 位
以太网 Ethernet 最主流的局域网技术
CSMA/CD Carrier Sense Multiple Access with Collision Detection 先听后发、碰撞检测的共享介质访问方式
CSMA/CA Carrier Sense Multiple Access with Collision Avoidance 无线网用的碰撞避免方式
冲突域 collision domain 可能发生碰撞的范围
广播域 broadcast domain 广播帧能传播到的范围
循环冗余校验 CRC 生成多项式除法检错
自动重传请求 ARQ 发现出错后重传的机制
海明码 Hamming code 既能检错也能纠错的编码
交换机 switch 二层设备,按 MAC 表转发
集线器 hub 物理层设备,广播所有端口
MAC 地址表 MAC address table 交换机学到的 MAC→端口 映射
泛洪 flooding 查不到目的 MAC 时向所有端口转发
虚拟局域网 VLAN 物理设备上划分的逻辑隔离子网
最小帧长 minimum frame size 以太网 64 字节,保证能检测碰撞
存储转发 / 直通转发 store-and-forward / cut-through 收完整帧再转 / 看到目的地址就转
最大传输单元 MTU 帧数据区上限,以太网 1500 字节
帧校验序列 FCS 帧尾的 CRC 校验码