数据链路层:相邻两站怎么把货送对

物理层把比特运过去了,但它像个不看单子的搬运工——运丢、运错、撞车一概不负责。链路层给这条裸路装上单据、质检和红绿灯。传输单位从"比特"升级为""。

一、链路层管什么

链路层的舞台是相邻两个节点之间(主机↔交换机、交换机↔路由器),四件事:

职责 解决什么
封装成帧 给比特流加上"头尾单据",标出一段数据的边界
差错控制 信号在电线上免不了出错,要能发现(甚至纠正)错误
可靠传输 丢了/错了怎么办:确认 + 重传
介质访问控制 一条线路大家共用,谁先说?(撞车问题)

二、封装成帧

前后加帧头、帧尾(含定界符),中间是载荷:

| 帧头(目的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:以太网的交通规则

先听后发、边听边发、碰撞停发、指数退避

  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 交付)——网络层 的 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. 路由器和交换机隔的是什么? ——交换机隔冲突域不隔广播域;路由器(网络层)隔广播域。

十、动手玩一把

# macOS / Linux:看网卡 MAC 与状态
ifconfig | grep -A1 en0        # ether 后面就是 MAC 地址
ip link                        # Linux 更现代的写法

# 看"IP→MAC 翻译官"的缓存(ARP,网络层的主角在这提前露脸)
arp -a

相邻两站送对了,但快递要跨几十个网络、几千公里——找路的大问题来了 → 04-网络层

⬅️ 物理层 🏠 00-基础与理论 ➡️ 网络层