数据链路层:相邻两站怎么把货送对
物理层把比特运过去了,但它像个不看单子的搬运工——运丢、运错、撞车一概不负责。链路层给这条裸路装上单据、质检和红绿灯。传输单位从"比特"升级为"帧"。
一、链路层管什么
链路层的舞台是相邻两个节点之间(主机↔交换机、交换机↔路由器),四件事:
| 职责 | 解决什么 |
|---|---|
| 封装成帧 | 给比特流加上"头尾单据",标出一段数据的边界 |
| 差错控制 | 信号在电线上免不了出错,要能发现(甚至纠正)错误 |
| 可靠传输 | 丢了/错了怎么办:确认 + 重传 |
| 介质访问控制 | 一条线路大家共用,谁先说?(撞车问题) |
二、封装成帧
前后加帧头、帧尾(含定界符),中间是载荷:
| 帧头(目的MAC/源MAC/类型) | 上层数据(载荷) | FCS 校验 |
- 最大传送单元 MTU:以太网载荷上限 1500 字节——网络层要是塞来更大的包,就得分片(IPv4 的伏笔,网络层回收)
- 透明传输:数据里恰好出现和定界符一样的字节怎么办?——转义(字节填充)/比特填充,让"正文里的定界符"骗不过帧解析
三、差错控制:CRC 循环冗余校验
最常用的检错码。思想:把数据当二进制大数,除以约定的生成多项式,把余数附在帧尾;收方用同样的多项式再除一次,余数不为 0 = 出错了。
数据:101001,生成多项式 P = 1101(3 次方 → 先补 3 个 0)
101001000 ÷ 1101 (模 2 除法:不借位不进位,就是异或)
101001000
⊕ 1101
= 011101000
⊕ 1101
= 001000000
⊕ 1101
= 0101100
⊕ 1101
= 0110... → 余数 R = 110
发送:101001 + 110 = 101001110
收方拿 101001110 ÷ 1101,余 0 → 认为没错
🤔 CRC 检错几乎百发百中,但只能发现、不能定位——发现错了就整帧丢弃,交给上层处理。检错和纠错是两件事。
四、可靠传输:三个经典协议(408 重点)
链路层不一定要可靠(以太网和光纤就很稳),但可靠传输的机制是重点,且传输层 TCP 会原样借用这套思想——现在学好,TCP 那章就是复习。
1. 停止-等待协议(Stop-and-Wait)
发一帧 → 停下等确认 → 收到 ACK 再发下一帧。超时没等到就重传。
- 优点:简单。缺点:信道利用率极低——发 1ms 等 9ms,路上 90% 时间在干等
- 超时重传后收方收到重复帧?靠编号识别丢弃(这就是"帧要编号"的根源)
2. 回退 N 帧(GBN,Go-Back-N)
流水线思想:一口气发 N 帧,不用每帧都等。
- 发送窗口 ≤ N:错了之后从出错那帧起,后面全部重发
- 收方窗口 = 1:只按序收,乱序的一律丢弃
发送 1,2,3,4,5 → 3 丢了 → 4、5 到了也没用(不按序)
→ 重发 3,4,5
3. 选择重传(SR,Selective Repeat)
- 收方窗口 > 1:乱序到的先缓存,出错只补缺的那一帧,最后按序上交
- 用"存着等缺件"换重发量——缓存换带宽
| 停止-等待 | 回退 N | 选择重传 | |
|---|---|---|---|
| 发送窗口 | 1 | ≤ 2ⁿ-1 | ≤ 2ⁿ⁻¹ |
| 收方窗口 | 1 | 1 | ≤ 2ⁿ⁻¹ |
| 重发量 | 最少(但效率低) | 大 | 精准 |
| 复杂度 | 低 | 中 | 高(要缓存) |
💡 窗口大小和编号空间有约束(如 GBN 发送窗口 ≤ 2ⁿ-1),防的是"新帧编号恰好撞上旧帧"的歧义——408 计算题常客。
五、介质访问控制:一条马路谁先走
总线式网络里多个节点共用一条线路,同时发 = 碰撞。两类解法:
- 信道划分:静态分(就是物理层的复用,FDM/TDM/CDMA)
- 随机访问:大家抢,抢出问题再补救——CSMA/CD 是主角
CSMA/CD:以太网的交通规则
先听后发、边听边发、碰撞停发、指数退避:
- 发之前先"听"(载波侦听):线上有信号就等
- 一边发一边继续听:若检测到碰撞,立刻停发
- 碰撞后各自随机等一段时间再试(二进制指数退避:第 i 次碰撞,从 0~2ⁱ-1 里随机挑个等待数)
最小帧长 64 字节的账:碰撞信号传回来最快要 2τ(去一趟 + 回一趟)。要保证"发完之前能听到碰撞",就必须满足:
数据率 × 2τ ≤ 帧长 → 帧太短,发完了碰撞才回来,等于没监听
64 字节 × (10Mb/s) 对应争用期 51.2μs —— 不满 64B 的帧按"碎帧"丢弃
🤔 WiFi 为什么不用 CSMA/CD?无线环境里自己"边发边听"基本听不到别人的信号(自己的发射功率盖住一切),碰撞检测失效——所以 WiFi 用 CSMA/CA(避免碰撞:预约 + 确认),不是检测而是尽量避免。
六、MAC 地址
- 48 位,全球唯一,烧在网卡里;前 3 字节厂商标识(OUI),后 3 字节厂内序号
- 写法:
a4:83:e7:xx:xx:xx - MAC 和 IP 的分工(先埋个伏笔):MAC 像身份证号(出厂就定、终身不变、只在"本地小区"内有效);IP 像现居地址(跟着位置变、全国可达)。寄快递既要地址(IP 找人)也要收件人身份(MAC 交付)——网络层 的 ARP 就是把两者对上的翻译官
七、以太网与 PPP
以太网帧(V2)结构:
| 目的MAC 6B | 源MAC 6B | 类型 2B | 数据 46~1500B | FCS 4B |
类型字段标注载荷是谁(0x0800=IPv4、0x0806=ARP)——分层交接的接口。
PPP 协议:点对点拨号链路用(如宽带连接),两端点对点不需要 MAC 寻址,带协议字段和校验,还能协商网络层参数。
八、设备进化:集线器 → 交换机 → 路由器
| 集线器 Hub | 交换机 Switch | 路由器 Router | |
|---|---|---|---|
| 工作层 | 物理层 | 链路层 | 网络层 |
| 转发方式 | 无脑广播 | 查 MAC 表精确转发 | 查路由表跨网络转发 |
| 冲突域 | 全体共用一个 | 每端口一个 | 每端口一个 |
| 广播域 | 一个 | 一个 | 每个接口隔开一个 |
交换机的聪明之处:收到帧后记下"源 MAC 来自哪个端口"(自学习),下次直接从对应端口发出——把集线器的"大声吼"变成了"点对点耳语"。
💡 VLAN 一句:一台交换机用软件切成几台"虚拟交换机",广播只在小圈子里传——公司里财务部和开发部同网线不同广播域,就是这么切的。
九、盲点自测
- 帧定界和透明传输是什么关系? ——定界符标出帧边界;数据里出现同款字节就用填充转义,保证"正文里的定界符"不被误认。
- CRC 能纠错吗? ——不能,只检错;发现错误整帧丢弃,纠错交给上层或重传。
- GBN 和 SR 的核心区别? ——收方窗口:GBN 只按序收(乱序丢),SR 缓存乱序帧只补缺;重发量 GBN 大、SR 精准。
- 为什么以太网最小帧 64 字节? ——必须保证发完之前能听到最远端传回的碰撞信号(2τ 争用期),帧太短监听形同虚设。
- MAC 和 IP 分工? ——MAC=身份证(本地交付、终身不变),IP=现居地址(全局路由、随位置变);ARP 负责把 IP 翻译成 MAC。
- 交换机比集线器强在哪? ——自学习建 MAC 表,按端口精确转发:冲突域从 1 个变每端口 1 个,带宽不再共享。
- 路由器和交换机隔的是什么? ——交换机隔冲突域不隔广播域;路由器(网络层)隔广播域。
十、动手玩一把
# macOS / Linux:看网卡 MAC 与状态
ifconfig | grep -A1 en0 # ether 后面就是 MAC 地址
ip link # Linux 更现代的写法
# 看"IP→MAC 翻译官"的缓存(ARP,网络层的主角在这提前露脸)
arp -a
相邻两站送对了,但快递要跨几十个网络、几千公里——找路的大问题来了 → 04-网络层
💬 评论