在 OSI 七层模型里,物理层 Layer 1 与数据链路层 Layer 2 一上一下,相隔仅一步,却负责网络通信中截然不同的两类职责:一方令抽象的比特真实地跃入电压、光脉冲或无线射频;另一方则把这些比特重新组织成可以识别、管理、检错、排队的帧,并赋予地址与访问控制。本文通过逻辑推演、工程实例和可运行代码,把二者的设计目标、工作对象、关键技术和典型设备逐项剖开,帮助读者在脑海里建立一条清晰的界线。
OSI 模型中的层次邻接关系
网络通信被抽象为七个互相叠合的功能层,越靠下越贴近物理世界。物理层负责把0/1翻译成信号;数据链路层在此基础上提供点到点链路的可靠传输服务(Wikipedia)。在 TCP/IP 四层体系里,这两层常被压缩为“Link”层,但在工程细化时仍应区别对待(Super User)。
物理层:比特世界的信号舞台
任务与关键技术
-
信号编码与调制:如 NRZ、曼彻斯特、8b/10b,通过电平翻转或频率变化把比特映射到介质(GeeksforGeeks, Electrical Engineering Stack Exchange)。
-
时钟同步:在无单独时钟通道时,编码方案需自带时钟信息保证发送端与接收端步调一致(GeeksforGeeks)。
-
物理媒介规格:定义电气、电光、射频参数及连接器,例如 RJ‑45 双绞线、LC 光纤、2.4 GHz OFDM 信道(GeeksforGeeks, Imperva)。
-
拓扑与碰撞检测:CSMA/CD 时代,物理层负责检测载波并在冲突时发出碰撞信号(IEEE 802)。
工作单位与设备
-
单位:原始比特流;不存在地址或帧头。
-
典型设备:再生中继器、集线器、光收发模块,这些设备只放大或转发信号,不理解帧结构(Computer Networking Notes)。
数据链路层:从比特到帧的秩序管理者
职责与组成
-
成帧:把比特组装为帧并加起始定界、长度/类型字段、帧尾(Computer Networking Notes)。
-
物理寻址:为每个网卡分配全球唯一的 MAC 地址,供同一链路内寻址(Huawei Support)。
-
差错检测与恢复:在帧尾附加 FCS/CRC,接收端验证并可请求重传(Wikipedia, GeeksforGeeks)。
-
流控与重排:在全双工链路上通过 PAUSE 帧或滑动窗口调节速率,避免缓冲溢出(GeeksforGeeks)。
-
媒介访问控制:决定何时占用共享媒介,典型方案有 CSMA/CD、CSMA/CA、TDMA。
-
两级子层:IEEE 802.2 LLC 提供统一的服务访问点,IEEE 802.3 MAC 在具体媒介上实现访问控制与寻址(Wikipedia, IEEE 802)。
工作单位与设备
-
单位:帧。
-
典型设备:以太网交换机、无线接入点、网桥。它们解析 MAC 头,根据地址转发或过滤帧(Super User, Server Fault)。
核心差异对照
| 维度 | 物理层 | 数据链路层 |
|---|---|---|
| 抽象对象 | 比特/信号 | 帧 |
| 主要功能 | 编码、调制、再生、同步 | 成帧、寻址、检错、媒介访问 |
| 差错处理 | 检测物理错误、重定时 | CRC/FCS 检错,可能重传 |
| 地址概念 | 无 | MAC 地址 |
| 依赖标准 | IEEE 802.3 PHY、ITU‑T G 系列 | IEEE 802.3 MAC、802.11 MAC、PPP |
| 硬件实现 | 收发器、集线器 | 交换机、AP、网桥 |
(表中内容综合多份规范与教科书(IEEE 802, Wikipedia, ccnablog.com))
以以太网收发流程为例
-
应用生成的数据经过上层封装后交给数据链路层;该层组装 MAC 头、计算 CRC,并把整帧推送到 MAC 控制器发送队列。
-
物理层开始工作:SERDES 将帧序列化,按 8b/10b 规则映射到电平;MII 口把信号送入双绞线(IEEE 802)。
-
对端 PHY 检测线路电压变化,恢复时钟并解码得到比特流;MAC 校验 CRC,若无错则向网络层上交数据。
-
若线路出现噪声导致位翻转,物理层可通过自适应均衡减轻衰减;残留错误由数据链路层的 CRC 捕获并驱动重传。
Python 示例:体验 CRC 与曼彻斯特
下面代码片段分别演示 IEEE 802.3 使用的 CRC32 计算与一种极简曼彻斯特编码。运行后可直观看到 Layer 1 与 Layer 2 的职责分界。
import binascii
def crc32_eth(frame_bytes: bytes) -> bytes:
# Ethernet 采用 0x04C11DB7 多项式并在发送时取反
crc = binascii.crc32(frame_bytes) & 0xFFFFFFFF
return (~crc & 0xFFFFFFFF).to_bytes(4, byteorder='little')
def manchester_encode(bits: str) -> str:
# 曼彻斯特: 0→低高, 1→高低
return ''.join('01' if b == '0' else '10' for b in bits)
if __name__ == '__main__':
payload = b'hello'
eth_header = b'\xff\xff\xff\xff\xff\xff' + b'\x00\x11\x22\x33\x44\x55' + b'\x08\x00'
frame = eth_header + payload
fcs = crc32_eth(frame)
full_frame = frame + fcs
bit_stream = ''.join(f'{byte:08b}' for byte in full_frame)
encoded = manchester_encode(bit_stream)
print('CRC32 (hex LE):', fcs.hex())
print('Manchester stream (前 64 位):', encoded[:64])
-
crc32_eth展示数据链路层为帧尾附加 FCS 的过程; -
manchester_encode则模拟物理层把比特流转换为电平翻转序列。
常见困惑与澄清
-
Link 与 Data Link:TCP/IP 把物理和数据链路合并称 Link 层,但底层硬件仍严格区分两级功能模块(Stack Overflow)。
-
交换机是否“懂”物理层:交换机内置 PHY 与 MAC;PHY 处理信号,MAC 做转发决策,二者同在一块 ASIC,却属于不同层面。
-
Wi‑Fi 的位置:802.11 拆分为 PHY 与 MAC;PHY 规定调制(OFDM/CCK 等),MAC 负责 CSMA/CA、帧重传(Imperva)。
结语
物理层关心的是0/1在铜线、光纤、空中的呈现方式;数据链路层关心的是这些0/1组成的帧如何在一段链路内有序、安全、高效地流动。两层合作的界面像一条流水线:前者把比特塑造成原料,后者把原料加工成可识别、可搬运的半成品,再交给网络层继续远行。在任何网络设计或故障排查现场,只要牢记“信号问题找 Layer 1,帧与地址问题找 Layer 2”,就能迅速定位思路,事半功倍。