5. 数据链路层(Data Link Layer)
1. 核心定位:它在做什么?
在相邻节点之间建立逻辑链路,把网络层交下来的 IP 数据报封装成帧,在链路上传送,并尽量保证无差错(或至少能发现差错)。
| 对比 | 物理层 | 数据链路层 |
|---|---|---|
| 比喻 | “路”——电缆、光纤、调制方式、比特流 | “车”——成帧、寻址(MAC)、差错控制 |
| 关心什么 | 0/1 如何在介质上传输 | 一帧从哪到哪、是否损坏、多机如何共用信道 |
与上层的关系:网络层负责端到端、跨网段;链路层负责一跳(hop)——本机到下一跳路由器或同一局域网内的另一台主机。
MAC 地址:链路层的“设备身份证”
- 长度与形式:以太网 MAC 为 48 位,常写作
AA:BB:CC:DD:EE:FF六组十六进制。 - 作用:在同一链路 / 同一广播域内标识网卡;交换机查表转发时看的是 目的 MAC。
为什么已有 IP 还要 MAC?
如果说 IP 是收件地址(北京路 1 号),MAC 是身份证号(这台设备是谁)。在局域网内传送数据包时,仅有 IP 是不够的,因为网卡只认 MAC 地址
跨网段通信时:主机仍用 ARP把下一跳 IP 解析成 MAC,把帧交给网关或下一跳;IP Header 里的目的 IP 始终不变(源路由除外),而每跳的以太网帧头里的目的 MAC 会变。
2. 三大支柱
2.1 封装成帧(Framing)
物理层只提供连续比特流,链路层必须划出帧的边界。
| 字段名称 | 字节大小 (Bytes) | 作用 |
|---|---|---|
| 前导码 (Preamble) | 8 | 告诉接收方网卡:“注意,数据要来了!”用于时钟同步。 |
| 目的 MAC 地址 | 6 | 本跳接收者的物理地址。 |
| 源 MAC 地址 | 6 | 本跳发送者的物理地址。 |
| 类型 (Type) | 2 | 标识里面装的是什么协议(通常是 0x0800 代表 IP 协议)。 |
| 数据部分 (Payload) | 46 - 1500 | 真正传输的内容(IP 数据报)。 |
| 帧校验序列 (FCS) | 4 | “防伪防撞”。利用 CRC 算法确保数据在传输中没被干扰。 |
- 帧定界:用起始标志、长度字段或特殊比特模式标明一帧从哪里开始、到哪里结束。
- 透明传输:若数据里恰好出现与定界符相同的比特/字节序列,要通过比特填充或字节填充等方法,使接收端仍能正确还原载荷,对上层“透明”。
常见实现里,以太网用前导码 + 帧起始定界;PPP 等则用标志字节与转义规则。
2.2 差错检测(Error Detection)
信道噪声、干扰会导致比特翻转。链路层普遍在帧尾加检错码,接收端计算后与帧内携带的值比对;不一致则丢弃该帧(通常不负责纠错,纠错多在上层或物理层编码里做)。
- CRC(循环冗余校验):工业界事实标准(如以太网 FCS 常用 CRC-32)。数学上不能证明“一定没错”,但碰撞概率极低,硬件实现便宜。
2.3 可靠传输(Reliable Delivery)——并非所有链路都需要
- 检错 + 丢弃:以太网等多数局域网链路不重传,由 TCP 等上层保证可靠。
- 确认与重传:在误码率高或需要本地可靠性的场景,使用 ACK、超时重传;经典机制包括停止等待、回退 N、选择重传等滑动窗口思想。
3. 两类信道与介质访问控制
3.1 点对点信道
一对一链路,没有“别人抢信道”的问题,协议相对简单。
- 代表:PPP(拨号、部分广域网接入)。负责成帧、链路建立/认证、可选的简单差错检测等。
3.2 广播信道(共享介质)
多台主机共用同一传输介质,核心问题是:同时发送会冲突(碰撞)。
- 有线以太网(经典半双工):CSMA/CD——载波监听多路访问 / 冲突检测。现代交换机端口多为全双工点对点,碰撞域被缩小到几乎不存在,CSMA/CD 在日常交换式以太网中已很少遇到。
- 无线(WLAN):无法像有线那样可靠地“边发边听”,常用 CSMA/CA(冲突避免)配合退避、RTS/CTS 等减少隐藏终端问题。
4. 链路层设备:交换机(Switch)
Hub
Hub 是交换机出现之前的产物,它工作在物理层。可以把它看作一根折叠起来的总线。
当 A 电脑给 B 电脑发数据时,Hub 根本不看数据包里的 MAC 地址。它会把信号增强后,直接转发给除了 A 以外的所有接口。
核心缺陷
- 共享带宽:如果这是一个 100M 的 Hub,连了 10 台电脑,每台电脑平均只能分到 10M。
- 冲突域(Collision Domain):因为它本质上是一根导线,如果 A 和 C 同时说话,信号就会在电缆里“撞车”变成噪音。
- 安全性极差:D 电脑只要想听,就能通过抓包工具看到 A 发给 B 的所有内容。
Switch
为了解决 Hub 的问题,我们发明了交换机(Switch)。
交换机通过 MAC 地址表实现了点对点通信,隔离了“冲突域”。A 给 B 说话,C 不会听到,也不会撞车。
学习:收到帧时看源 MAC + 入端口,写入/刷新 MAC 地址表;可顺带提老化时间 转发:看目的 MAC → 表里有端口则单播到该端口;没有则泛洪;目的端口与入端口相同则丢弃等。
但是,交换机无法隔离“广播域”:
- 在局域网中,有些协议(比如 ARP 寻找 MAC 地址、DHCP 获取 IP)必须通过“广播”来完成。
- 如果一个交换机连接了 1000 台电脑,其中一台发一个 ARP 广播,交换机会把这个包转发给剩下的 999 台。
- 当网络规模大到一定程度,这种“广播风暴”会占用大量 CPU 和带宽,导致网络瘫痪。
VLAN
VLAN (Virtual Local Area Network) 的出现,就是为了在不增加物理路由器的情况下,把一个大的广播域切分成多个小的、逻辑上的广播域。
它在标准的以太网帧头里加了一个“标签”(802.1Q Tag),里面写着这个数据包属于哪个 VLAN。
它的核心作用
- 隔离广播域:即使大家连在同一个物理交换机上,VLAN 10 的广播包也绝对传不到 VLAN 20。这就像在同一个大办公室里建了几间“隔音房”。
- 安全性:财务部的电脑(VLAN 10)和宿舍区的电脑(VLAN 20)在二层是完全隔离的。如果宿舍区有人中了木马企图扫描局域网,他根本找不到财务部的机器。
与集线器(Hub)、路由器对比
| 特性 | 集线器 (Hub) | 交换机 (Switch) | 路由器 (Router) |
|---|---|---|---|
| 工作层次 | 物理层(再生比特) | 数据链路层(按 MAC 转发) | 网络层(按 IP 转发) |
| 碰撞域 | 所有端口同一碰撞域 | 每个端口独立碰撞域(全双工下几乎无碰撞) | 各接口多为独立网段,二层上自然分隔冲突域 |
| 转发方式 | 广播式复制到所有端口 | 按 MAC 表定向转发(未知则泛洪) | 查路由表按 IP 转发;未知单播走路由/默认路由,不做二层泛洪 |
| 广播域 | 不隔离 | 默认不隔离(整台交换机同一广播域;VLAN 可划分) | 隔离(不将本子网广播转发到其他三层接口) |