--- title: "03-数据链路层:相邻两站怎么把货送对" aliases: - 数据链路层 created: 2026-08-29 tags: - 基础与理论 - 计算机网络 - "408" --- # 数据链路层:相邻两站怎么把货送对 > 物理层把比特运过去了,但它像个不看单子的搬运工——运丢、运错、撞车一概不负责。链路层给这条裸路装上**单据、质检和红绿灯**。传输单位从"比特"升级为"**帧**"。 ## 一、链路层管什么 链路层的舞台是**相邻两个节点之间**(主机↔交换机、交换机↔路由器),四件事: | 职责 | 解决什么 | | --- | --- | | **封装成帧** | 给比特流加上"头尾单据",标出一段数据的边界 | | **差错控制** | 信号在电线上免不了出错,要能**发现**(甚至纠正)错误 | | **可靠传输** | 丢了/错了怎么办:确认 + 重传 | | **介质访问控制** | 一条线路大家共用,谁先说?(撞车问题) | ## 二、封装成帧 前后加**帧头、帧尾**(含定界符),中间是载荷: ``` | 帧头(目的MAC/源MAC/类型) | 上层数据(载荷) | FCS 校验 | ``` - **最大传送单元 MTU**:以太网载荷上限 1500 字节——网络层要是塞来更大的包,就得**分片**(IPv4 的伏笔,[[04-网络层|网络层]]回收) - **透明传输**:数据里恰好出现和定界符一样的字节怎么办?——转义(字节填充)/比特填充,让"正文里的定界符"骗不过帧解析 ## 三、差错控制: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:以太网的交通规则 **先听后发、边听边发、碰撞停发、指数退避**: 1. 发之前先"听"(载波侦听):线上有信号就等 2. 一边发一边继续听:若检测到碰撞,立刻停发 3. 碰撞后各自**随机等一段时间**再试(二进制指数退避:第 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 交付)——[[04-网络层|网络层]] 的 ARP 就是把两者对上的翻译官 ## 七、以太网与 PPP **以太网帧**(V2)结构: ``` | 目的MAC 6B | 源MAC 6B | 类型 2B | 数据 46~1500B | FCS 4B | ``` 类型字段标注载荷是谁(0x0800=IPv4、0x0806=ARP)——分层交接的接口。 **PPP 协议**:点对点拨号链路用(如宽带连接),两端点对点**不需要 MAC 寻址**,带协议字段和校验,还能协商网络层参数。 ## 八、设备进化:集线器 → 交换机 → 路由器 | | 集线器 Hub | 交换机 Switch | 路由器 Router | | --- | --- | --- | --- | | 工作层 | 物理层 | 链路层 | 网络层 | | 转发方式 | 无脑广播 | 查 **MAC 表**精确转发 | 查**路由表**跨网络转发 | | 冲突域 | 全体共用一个 | **每端口一个** | 每端口一个 | | 广播域 | 一个 | 一个 | **每个接口隔开一个** | 交换机的聪明之处:收到帧后记下"源 MAC 来自哪个端口"(自学习),下次直接从对应端口发出——**把集线器的"大声吼"变成了"点对点耳语"**。 > 💡 **VLAN 一句**:一台交换机用软件切成几台"虚拟交换机",广播只在小圈子里传——公司里财务部和开发部同网线不同广播域,就是这么切的。 ## 九、盲点自测 1. **帧定界和透明传输是什么关系?** ——定界符标出帧边界;数据里出现同款字节就用填充转义,保证"正文里的定界符"不被误认。 2. **CRC 能纠错吗?** ——不能,只检错;发现错误整帧丢弃,纠错交给上层或重传。 3. **GBN 和 SR 的核心区别?** ——收方窗口:GBN 只按序收(乱序丢),SR 缓存乱序帧只补缺;重发量 GBN 大、SR 精准。 4. **为什么以太网最小帧 64 字节?** ——必须保证发完之前能听到最远端传回的碰撞信号(2τ 争用期),帧太短监听形同虚设。 5. **MAC 和 IP 分工?** ——MAC=身份证(本地交付、终身不变),IP=现居地址(全局路由、随位置变);ARP 负责把 IP 翻译成 MAC。 6. **交换机比集线器强在哪?** ——自学习建 MAC 表,按端口精确转发:冲突域从 1 个变每端口 1 个,带宽不再共享。 7. **路由器和交换机隔的是什么?** ——交换机隔冲突域不隔广播域;路由器(网络层)隔广播域。 ## 十、动手玩一把 ```bash # macOS / Linux:看网卡 MAC 与状态 ifconfig | grep -A1 en0 # ether 后面就是 MAC 地址 ip link # Linux 更现代的写法 # 看"IP→MAC 翻译官"的缓存(ARP,网络层的主角在这提前露脸) arp -a ``` --- 相邻两站送对了,但快递要跨几十个网络、几千公里——**找路**的大问题来了 → [[04-网络层]] ⬅️ [[02-物理层|物理层]] 🏠 [[00-基础与理论|00-基础与理论]] ➡️ [[04-网络层|网络层]]