3. OSI模型与以太网分层:物理层、数据链路层主要功能及接口
3.1 OSI七层模型 vs 以太网实际分层
讲以太网测试之前,我觉得有必要把OSI模型和以太网实际分层的对应关系先捋清楚。很多刚入行的朋友会拿着书本上的七层模型去套以太网协议栈,结果发现怎么都对不上。其实原因很简单——以太网压根儿就没按OSI那套标准走。
OSI模型是理论上的完美分层架构,而以太网是实战派。实际以太网的协议栈只涉及物理层和数据链路层,往上就是TCP/IP的主场了。说白了,以太网标准(IEEE 802.3)只关心数据怎么在线上跑,以及同一网段的设备怎么通信,不关心上层怎么封装。
我个人习惯用下面这个表格来对比两者的对应关系,这样看起来一目了然:
| OSI七层模型 | 以太网实际分层 | 关键协议/标准 | 我关注的点 |
|---|---|---|---|
| 应用层 | 上层协议栈 | HTTP, FTP, SMTP | 一致性测试一般不碰这些 |
| 表示层 | 加密、编码 | 非以太网范畴 | |
| 会话层 | 会话管理 | 非以太网范畴 | |
| 传输层 | 传输层 | TCP, UDP | 与IP层配合测试 |
| 网络层 | 网络层 | IP, ARP | IP层一致性 |
| 数据链路层 | 数据链路层(LLC + MAC) | IEEE 802.2, 802.3 | 测试重点区域 |
| 物理层 | 物理层 | 802.3 Clause 1~93 | 测试重点区域 |
为什么要强调这个对应关系?因为很多一致性测试用例其实是跨层次的。比如你测一个千兆以太网的信号质量,表面上看是物理层的事,但信号的时序抖动量会直接影响MAC层的帧同步。我在项目中遇到过好几次这样的情况——技术人员拿着物理层的测试报告说“眼图合格了”,结果连帧都收不到,最后查出来是PCS层的编码器配置有问题。
核心观点:以太网一致性测试必须同时关注物理层和数据链路层的行为,单测一层往往会漏掉边界问题。
3.2 物理层主要功能与接口
物理层,说白了就是让数据在线缆上能跑起来。它做的事情可以分成三块:介质相关、编码相关、信令相关。我会从下往上讲。
3.2.1 物理层的子层划分
IEEE 802.3把物理层又拆成了几个子层,每个子层负责转一道手。我列个清单大家看看:
- PMD(物理介质相关子层):管最底层的信号收发,比如光模块的激光器、铜缆的差分信号驱动。你想想看,双绞线和光纤的信号方式完全不同,就是这里分的。
- PMA(物理介质接入子层):负责串行/并行的转换,还有时钟恢复。嗯,这里经常出问题,后面我会细说。
- PCS(物理编码子层):做编码/解码,比如8B/10B、64B/66B这些。编码的目的是保证直流平衡和时钟恢复的稳定性。
- FEC(前向纠错子层):不是所有以太网都有这层。25G和更高速率的会用RS-FEC来抗干扰。
避坑指南:我曾经接手过一个10GBase-R的测试项目,PCS层编码一直报错。检查了三天,发现是PMA和PCS之间的接口电平没对齐。两块芯片来自不同厂家,对PCS状态机复位时序的理解不一样,导致编码器启动时吞了前几个码字。
3.2.2 MII接口家族
物理层和数据链路层之间的接口,就是通过MII(介质独立接口)来完成的。MII这个家族很庞大,我挑几个最常用的来说:
| 接口类型 | 数据宽度 | 时钟频率 | 典型应用 |
|---|---|---|---|
| MII | 4位 | 25 MHz | 10/100 Mbps 百兆以太网 |
| GMII | 8位 | 125 MHz | 1000 Mbps 千兆以太网 |
| RGMII | 4位(DDR) | 125 MHz(双沿采样) | 千兆以太网(减少引脚数) |
| SGMII | 串行1位 | 625 MHz | 千兆/SFP模块接口 |
| XGMII | 32位 | 312.5 MHz | 万兆以太网 |
我建议在实际测试中,不要只盯着MII接口的电气特性,还要看它和MAC层的握手协议。比如GMII的TX_CLK和RX_CLK要不要同源?我见过一个案例,交换机厂商在设计时让RX_CLK走独立的晶体振荡器,结果在链路聚合场景下因为时钟漂移导致不定时丢包。
为什么会这样?因为GMII标准里其实隐含了TX_CLK和RX_CLK必须相位对齐的要求。虽然文档没写死,但你想想看,MAC层在发送数据时用的是TX_CLK的域,接收回来时却换到了RX_CLK的域,如果两个时钟偏差超过一定范围,FIFO就会溢出。
3.3 数据链路层主要功能与接口
数据链路层在以太网里分成了两个子层:LLC(逻辑链路控制)和MAC(介质访问控制)。但实际测试中,LLC的存在感比较弱,MAC才是核心。
3.3.1 MAC子层核心功能
MAC子层做的事情,我可以归纳为以下几点:
- 帧封装与解封装:加上前导码、帧开始定界符(SFD)、目标地址、源地址、长度/类型字段、数据载荷、FCS。这一套流程就是MAC对上一层传来的数据进行打包。
- 介质访问控制:通过CSMA/CD(载波监听多路访问/冲突检测)来管理总线共享。不过现在全双工模式下已经不依赖这个了,但协议里还保留着兼容代码。
- 地址识别:MAC地址的过滤,只接收匹配本机地址、广播地址、组播地址的帧。
- 错误检测:通过FCS校验序列(CRC32)来检查接收到的帧是否有误码。
- 帧间间隔(IFG)控制:两个连续帧之间至少要间隔96比特时间,不能紧挨着发。
警告:一致性测试中最容易翻车的就是IFG。我测过一款交换机芯片,它在满负载情况下IFG只有84比特时间,差12个比特没到位。虽然能通,但后续级联Jumbo帧时直接触发MAC层溢出错误。测试时一定要卡死96这个数值,多一比特少一比特都不行。
3.3.2 MAC与物理层的接口——MII的作用
MAC通过MII接口把封装好的帧数据交给物理层。这里有一个容易混淆的点——MII接口上有两个数据通道:TX(MAC→PHY)和RX(PHY→MAC)。每个通道都包含数据、时钟、使能信号和错误指示。我简单描述一下传送流程:
- 发送方向:MAC在TX_CLK的上升沿送出TX_DATA[3:0]和TX_EN(发送使能)。物理层收到后开始对数据进行编码,然后通过MDI向外发送。
- 接收方向:物理层解码后,在RX_CLK的上升沿将数据放在RX_DATA[3:0]上,同时拉高RX_DV(数据有效)指示MAC层可以读取了。如果物理层检测到信号质量有问题(比如码型违规),它会通过RX_ER(接收错误)标志位通知MAC。
我个人习惯把这个流程画成一张图,方便团队成员理解各子层和接口之间的关系:
3.3.3 LLC子层的作用
LLC(逻辑链路控制)在数据链路层的顶端,负责把不同网络层协议(比如IP、IPX)的数据封装到MAC帧的Data字段里。它通过DSAP(目标服务访问点)和SSAP(源服务访问点)来标识上层协议。你想想看,如果没有LLC,MAC层就没法区分这个帧是给IP层处理的还是给ARP用的。
不过在实际一致性测试中,LLC层的测试项目不多。大部分测试用例会跳过LLC头部,直接构造带特定Type字段的Ethernet II帧来检验MAC的行为。
3.4 接口在一致性测试中的关键作用
前面讲了这么多接口和分层,其实落到测试层面就是一件事——接口是测试的“插装点”。我们的测试设备往往不是直接挂在链路上测的,而是通过MII、MDI等接口来注入激励和观测响应。
具体到测试方法上,我总结了几种常见手段:
| 测试接口 | 常用测试方法 | 测什么 |
|---|---|---|
| MDI(介质相关接口) | 眼图测试、抖动分析、模板测试 | 物理信号质量(电压、上升时间、抖动) |
| MII / GMII | 协议分析仪抓包、定时器测量 | 帧结构、IFG、FCS校验、碰撞检测 |
| 管理接口(MDIO) | 寄存器读写、状态轮询 | PHY配置、链路状态、自协商结果 |
实用技巧:我建议在测试环境搭建时,优先留出一个MII/ GMII的物理探测点。很多时候物理层眼图看起来没问题,但MII接口上的信号质量已经劣化了。你想想看,如果MAC层的RX_DV信号占空比都不到40%,那帧同步迟早出问题。提前在MII口上挂个逻辑分析仪,能节省大量排查时间。
3.5 一个典型的测试案例
最后我分享一个实际项目中的测试场景吧。有一次在做新产品的1000Base-T一致性测试,设备送测前我们内部先预跑了一遍。使用的标准是IEEE 802.3 Clause 40,测试项包括电压模板、峰值抖动、回波损耗、近端串扰等。
测到第三次的时候发现回波损耗超标了,返回去检查硬件设计,发现RJ45座子到PHY芯片的差分走线有一个阻抗不连续的点——因为布局时为了避开电源层,改了一小段走线宽度。这就是物理层PMD子层和介质接口之间的配合问题,如果你不了解分层的结构,可能根本无法定位到具体的子层。
嗯,我觉得理解OSI模型和以太网分层的映射关系,不仅仅是为了考试,更是为了在实际排查问题时能快速定位到“哪一层出故障了”。下次遇到丢包问题时,不妨先问自己一句:是物理层的信号不行,还是MAC层的帧解析不对?分开测,一针见血。