物理层与数据链路层:从比特到帧的跨越

说实话,很多刚入行的朋友总觉得这两层太"底层",不够酷。我当年也这么想——直到有一次在数据中心排障,折腾了三天才发现是光纤接头脏了。嗯,从那以后我再也不敢小看物理层了。

这两层的关系,说白了就是:物理层负责把比特流扔出去,数据链路层负责让这些比特流别跑偏。咱们一层层拆开看。

物理层介质与信号

物理层解决的是最原始的问题:怎么把 0 和 1 变成能在介质上传输的信号?

常见的传输介质

介质类型 典型速率 最大距离 我踩过的坑
双绞线(Cat5e/6/6A) 1Gbps / 10Gbps 100m 超过 100 米必丢包,别信"差不多"
多模光纤(OM3/OM4) 10Gbps ~ 100Gbps 300m ~ 550m 弯曲半径太小会直接断信号
单模光纤(OS2) 100Gbps+ 10km ~ 80km 熔接工艺差,损耗能翻三倍
同轴电缆 10Mbps ~ 100Mbps 500m 现在基本淘汰,老机房还能见到
我的习惯:布线时永远留 10%~15% 的长度余量。别问我怎么知道的——有一次机柜门关不上,就是因为线绷太紧了。

信号编码与调制

物理层不关心你传的是什么数据,它只负责把比特变成电信号或光信号。常见的编码方式有:

  • NRZ(不归零编码):1 高电平,0 低电平。简单,但连续相同比特会丢失时钟同步。
  • 曼彻斯特编码:每个比特中间有跳变,自带时钟。以太网早期用过,现在基本退役了。
  • 4B/5B 编码:每 4 位数据映射成 5 位,保证足够多的跳变。100Base-TX 就在用。

你想想看,如果连续发 32 个 0,接收端怎么知道这是 32 个 0 还是 16 个 0?这就是编码要解决的问题。

数据链路层功能

数据链路层在物理层上面搭了个"架子"。它的核心职责就三个:封装成帧、差错控制、流量控制。

封装成帧

物理层只管比特流,数据链路层得把这些比特切成一个个"帧"。帧就像快递包裹——你得告诉别人包裹从哪来、到哪去、里面装了什么、有没有损坏。

帧的通用结构:

+----------+----------+----------+-----------+----------+
| 帧首定界符 | 目的地址  | 源地址   | 类型/长度  | 数据     | 帧校验序列 |
+----------+----------+----------+-----------+----------+

关键点:帧首定界符(SFD)告诉接收端"帧开始了"。我曾经见过一个项目,因为芯片的 SFD 检测逻辑有 bug,导致整批设备无法互通——最后只能换方案。

差错控制

信号在介质上传输,难免受干扰。数据链路层用 CRC(循环冗余校验) 来检测错误。以太网帧尾部有 4 字节的 FCS(帧校验序列),接收端算一遍 CRC,对不上就直接丢帧。

注意:CRC 只能检错,不能纠错。发现错误就丢帧,让上层(TCP)去重传。这是设计上的权衡——链路层纠错太慢,不如直接丢。

流量控制

发送方不能一股脑地发,得考虑接收方能不能接住。数据链路层的流量控制有两种方式:

  • 停等协议:发一帧,等确认,再发下一帧。效率低,但简单。
  • 滑动窗口协议:连续发多帧,接收方告诉发送方"我还能收多少"。效率高,现代网络都在用。

MAC 地址与帧结构

MAC 地址是数据链路层的"身份证"。48 位,前 24 位是 OUI(厂商代码),后 24 位是厂商分配的序列号。

MAC 地址类型 特征 用途
单播 第一个字节最低位为 0 点对点通信
多播 第一个字节最低位为 1 组播通信(如 ARP 请求)
广播 全 F(FF:FF:FF:FF:FF:FF) 广播到所有设备

以太网帧结构(IEEE 802.3):

+--------+--------+--------+--------+--------+--------+--------+
| 前导码  | SFD    | 目的MAC | 源MAC  | 长度/类型 | 数据   | FCS    |
| 7字节   | 1字节  | 6字节  | 6字节  | 2字节   | 46-1500| 4字节  |
+--------+--------+--------+--------+--------+--------+--------+

避坑指南:我曾经遇到过一台交换机 MAC 表满了,新设备直接不通。查了半天才发现是 MAC 泛洪攻击。后来我习惯在接入层配 MAC 地址限制,每个端口只学固定数量的 MAC。

以太网协议详解

以太网是数据链路层的事实标准。从 10Mbps 到 400Gbps,底层原理没变过。

CSMA/CD(载波监听多点接入/碰撞检测)

早期以太网是共享介质——所有设备连在同一根线上。CSMA/CD 的规则很简单:

  1. 先听再说:发之前先听介质上有无信号。
  2. 边发边听:发的时候也监听,看有没有冲突。
  3. 冲突就停:检测到冲突,发一个阻塞信号,然后随机等一段时间再重试。

现在全双工以太网已经不需要 CSMA/CD 了,但理解它有助于你明白为什么早期以太网效率那么低。

全双工与半双工

模式 特点 适用场景
半双工 同一时间只能一方发 集线器、老式无线
全双工 双方可以同时发 交换机直连、现代网络

我的经验:全双工模式下,两端必须协商一致。如果一端是全双工,另一端是半双工,会出现大量冲突和丢包。我排查过这种"双工不匹配"的问题,症状就是网络时断时续,特别坑。

交换机工作原理

交换机是数据链路层的核心设备。它不像集线器那样无脑转发,而是"聪明"地根据 MAC 地址做决策。

三大核心功能

  1. MAC 地址学习:收到帧时,记录源 MAC 地址和入端口。
  2. 帧转发/过滤:查 MAC 表,知道目的 MAC 在哪个端口就只往那个端口发。
  3. 环路避免:用 STP(生成树协议)防止广播风暴。

转发决策流程

收到帧 → 学习源MAC → 查目的MAC表
    ├─ 找到 → 单播转发到对应端口
    ├─ 没找到 → 泛洪(除入端口外所有端口)
    └─ 目的MAC是广播/多播 → 泛洪
注意:交换机刚启动时 MAC 表是空的,所有未知单播帧都会泛洪。这就是为什么新接入设备时,网络会短暂"抖动"一下。

SVG:交换机工作原理流程图

交换机工作原理流程图 交换机工作原理流程图 收到以太网帧 学习源 MAC → 端口映射 查 MAC 表 单播转发到对应端口 泛洪到所有端口(除入端口) 广播/多播 → 泛洪 说明:交换机通过 MAC 地址学习建立转发表,实现二层转发。未知单播和广播帧会泛洪。

总结一下

物理层和数据链路层是网络通信的基石。物理层管介质和信号,数据链路层管帧和寻址。交换机是这两层结合的典型产物——它读懂物理层的信号,再根据数据链路层的 MAC 地址做转发决策。

我个人习惯在排障时先看物理层:线缆通不通?光功率够不够?端口有没有 err-disable?这些搞定了,再往上查 MAC 表、ARP 表。很多时候问题就出在最底层,别一上来就抓包分析,那是最后的手段。