NET-03 数据链路层
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 字节。
⚠️ 常见错误
- 把帧和分组混了:分组/数据报是网络层的数据单元,帧是链路层的。链路层给分组"加头加尾"就变成了帧。
- 以为帧里存的是原始比特流:帧是"切分+打包"后的结构,有明确的帧头帧尾边界。
- 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 是跨省市的邮政地址。快递到你家门口最后一步靠门牌,这最后一步就是链路层的活。
⚠️ 常见错误
- 以为 MAC 地址跨网络不变:帧每经过一个路由器,MAC 头会被重写(目的 MAC 改成下一跳),但 IP 地址不变。
- 把 MAC 记成 32 位:IPv4 地址是 32 位,MAC 地址是 48 位(6 字节),写成 6 组十六进制。
- MAC 是"网卡"的不是"电脑"的:一台电脑有 Wi-Fi 和有线两张网卡,就有两个 MAC 地址。
3.3 差错控制:CRC 循环冗余校验 ⭐⭐⭐
怎么知道传过来的货有没有坏
比特在线路上跑,可能受干扰翻几个位(1 变 0、0 变 1)。接收方怎么发现"这单货坏了"?用差错检测码。链路层最常用的是 CRC(Cyclic Redundancy Check,循环冗余校验)。
思路(不用背手算过程,理解逻辑即可):
- 发送方:把数据看成一个二进制多项式,除以一个约定的生成多项式 G(x),得到余数,把余数附加在数据后面一起发送。
- 接收方:用同一个 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,附加在数据后正好凑成"整除"。
⚠️ 常见错误
- 把 CRC 说成能纠错:CRC 只检错不纠错,纠错靠重传(ARQ);海明码才直接纠错。
- 以为 CRC 能保证 100% 检测所有错误:CRC 是概率性的——绝大多数错误能查出,但存在极小概率查不出(校验位也恰好被破坏成"看似正确")。
- 把 CRC 和校验和(checksum)混为一谈:CRC 是"按位多项式除法",用在链路层;checksum 是"按字节求和取反",用在 IP/TCP/UDP 报头,机制不同。
3.4 以太网与 CSMA/CD ⭐⭐⭐
共享一条线的"先听后说"
以太网(Ethernet) 是最主流的局域网技术(你的有线网、办公室网络基本都是它)。早期以太网用一根共享总线:多台电脑连在同一根线上,谁都能发。
问题来了:多台电脑同时发数据就会碰撞,信号搅在一起全乱。怎么避免?用 CSMA/CD(Carrier Sense Multiple Access with Collision Detection,载波监听多路访问/碰撞检测),规则像"多人抢一个话筒":
- 先听后说(载波监听 CS):发数据前先"听"线路上有没有人正在发。有人发就等,没人发才发。
- 边说边听(碰撞检测 CD):发的同时继续监听,如果发现信号强度异常(撞上了),立刻停止发送。
- 随机退避:撞了之后,各自随机等一段时间再重试,避免又同时抢。
A 想发 → 先听线 → 空闲 → 发!
↓ ↑
B 也发 → 撞车了! → 双方停,各自随机等再试
💡 一句话:CSMA/CD = "先听后发、边发边听、撞了退让"。它是"共享介质"时代的方案。现在的以太网都用交换机全双工互连,几乎不碰撞了,CSMA/CD 更多作为原理被学习。
CSMA/CD 的一个衍生考点:最小帧长。为什么要有最小帧长?因为发送方要能"边发边听"——如果帧太短,发完了才撞上,发送方已经停了监听,检测不到碰撞。以太网规定最小帧长为 64 字节,确保在最坏情况下(两端相距最远),发送方在发完前就能听到碰撞。帧比 64 字节短(比如填充不足),算无效帧。
最远两端各发一帧,信号一来一回需要时间:
碰撞发生在靠近接收端处,发送方要等"去 + 回"的时间才知道撞了
→ 帧长必须足够大,保证发送期间能收到碰撞信号 → 最小帧长 64 字节
⚠️ 常见错误
- 把 CSMA/CD 当成现代必用:交换式以太网是全双工点对点,不存在碰撞,不需要 CSMA/CD;它主要用在早期共享式总线以太网和教学里。
- 漏掉"随机退避":撞了不是立刻重发,而是随机等待一段时间,否则两人同时重发又撞。
- CSMA/CD 与 CSMA/CA 混淆:CD(Collision Detection)用于有线以太网(碰撞能检测到);CA(Collision Avoidance)用于Wi-Fi 无线网(半双工,难检测碰撞,所以尽量"避免")。
3.5 交换机(switch)⭐
从"广播喊话"升级到"精准投递"
早期的集线器(hub)收到数据,给所有端口都发一遍(广播),谁的目标 MAC 对上谁收。浪费且不安全。
交换机(switch) 更聪明,它是二层设备,学过的关键:
- 学习:每收到一帧,把"源 MAC + 进来的端口"记进MAC 地址表(转发表)。
- 转发:收到一帧,查表找"目的 MAC 在哪个端口",只往那个端口发——精准投递。
- 泛洪:表里查不到目的 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、学一张表、精准发"——学源地址,查目的地址,查不到才泛洪。转发快慢看方式:存储转发最稳最慢,直通最快但不验错。
⚠️ 常见错误
- 把交换机说成"隔离广播域":交换机隔离冲突域(端口间不碰撞),但不隔离广播域(广播仍全网传播)。
- 以为交换机会修改 MAC:交换机只看不改帧里的 MAC 地址,只是按表转发;改 MAC 的是路由器。
- 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 在交换机里砌墙"——墙内二层直通,墙外靠路由器跨。
⚠️ 常见错误
- 以为 VLAN 能隔离冲突域:VLAN 隔离的是广播域;冲突域由交换机端口天然隔离。
- 以为不同 VLAN 完全不能通信:默认不通,但配好路由器/三层交换机后可以跨 VLAN 通信(要三层路由)。
- VLAN 是逻辑概念不是物理线:不用多拉网线,改端口配置即可把一个端口划进某个 VLAN。
🧠 记忆口诀
- 链路层三件事:成帧(切快递单)、寻址(贴 MAC 门牌)、验错(CRC 验收)。
- MAC 认邻居,IP 认全球:MAC 逐跳变,IP 全程不变。
- CRC 除出余数挂后面,收方再除一次,非零就丢。
- CSMA/CD 先听后发、边发边听、撞了随机退让。
- 交换机学 MAC、查表精准发,隔离冲突不隔离广播。
- VLAN 交换机里砌墙:墙内直通,墙外靠路由。
⭐ 考点清单
- 帧的结构与"网络层分组 → 链路层帧"的转换关系
- MAC 地址:48 位、全球唯一、OUI+序列号、只在本链路有效且逐跳变化
- CRC 检错原理:生成多项式除法求余、能检错不能纠错、错了靠重传
- 以太网 CSMA/CD:先听后发、碰撞检测、随机退避;与 CSMA/CA 的区别
- 交换机:MAC 地址表学习、按目的 MAC 精准转发、泛洪;隔离冲突域不隔离广播域
- VLAN:划分逻辑子网、缩小广播域、跨 VLAN 需路由器
- 集线器(广播所有端口)与交换机(按表转发)的对比
- CSMA/CD 最小帧长 64 字节及其原因(边发边听要能听到碰撞)
- 以太网帧格式:前导码、MAC、类型、数据(46~1500B)、FCS
- 交换机三种转发方式:存储转发/直通/无碎片 的对比
📌 中英术语表
| 中文 | 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 校验码 |