在嵌入式网络开发里,多数工程师都会遇到一个非常真实的困境:设备网口灯亮但 ping 不通、速率协商异常、链路频繁抖动、VLAN 配置不生效、交换机端口不转发、抓包只能看到发出去却看不到回来……这些问题看似五花八门,可根源几乎都集中在最底层——物理层与数据链路层,也就是我们常说的 L1 和 L2。
很多人觉得 OSI 模型只是教科书上的概念,真正做项目用不上,这种想法在嵌入式领域是站不住脚的,因为嵌入式网络和 PC 网络完全不同,PC 几乎不用关心 PHY、RGMII、MDIO、Autonegotiation 这些底层细节,而嵌入式设备从硬件设计到驱动移植,再到系统配置,每一步都和 L1/L2 强相关。可以说,不懂 L1/L2,就永远无法真正搞定嵌入式网络问题。
本篇从工程实践出发,阐述 OSI 模型、物理层、以太网帧、交换机、VLAN 这些底层知识。
一、OSI 七层模型
OSI 七层模型全称 Open Systems Interconnection,是上世纪 70 年代制定的网络协议设计参考标准。它的初衷并不是为了让大家背诵层级名称,而是把复杂的网络行为拆成互相解耦的层次,让每一层只专注做一件事。这种分层思想,也完全被 Linux 网络栈继承,成为我们定位问题的思路。
很多教程喜欢把七层模型列成表格,然后让读者记忆,这种方式对实际开发帮助很小。我们换一种更贴近嵌入式的理解方式:每一层出问题,表现出来的现象完全不一样。
Open Systems Interconnection最顶端的应用层、表示层、会话层,基本都运行在用户态,比如 HTTP、MQTT、RPC 等,它们负责业务数据的格式、会话的建立与释放。在嵌入式里,这部分通常由应用程序实现,内核基本不参与,所以当我们做底层网络调试时,可以暂时把这三层忽略。真正决定嵌入式设备“能不能通、稳不稳定、快不快”的,是下面四层:传输层、网络层、数据链路层、物理层。
传输层对应 TCP、UDP,负责数据的可靠传输、重传、流控,表现出来的问题通常是卡顿、延迟、重传多、速率上不去。
网络层对应 IPv4、IPv6、路由,负责地址和路径选择,问题通常是 ping 不通、跨网段不通、路由错误、ARP 不响应。
而我们本篇重点讲的数据链路层与物理层,则是整个网络的地基。地基不稳,上面所有协议都无从谈起。
物理层负责数字信号 0/1 与电信号、光信号、无线信号之间的转换,它的问题最直接:网口不亮、灯不闪、插上线没反应、协商失败、速率只有 10M等等。
数据链路层负责把信号组成可识别的“帧”,用 MAC 地址做设备标识,实现点到点传输,它的问题通常是:能看到物理层 UP,但二层不通、广播能通单播不通、交换机不转发、VLAN 不隔离。
当我们以后遇到网络不通时,只要按照从下到上的顺序排查:先看 L1 是否 UP、再看 L2 有无帧交互、再看 L3 有无 ARP、再看 L4 有无端口监听,有助于定位问题。
二、物理层(L1)
物理层是整个网络的最底层,它不关心数据是什么、从哪里来到哪里去,只关心一件事:如何把比特流稳定地传输出去,并正确接收回来。
在嵌入式以太网系统里,物理层的核心载体就是PHY 芯片,我们在网关、摄像头、路由器上看到的网口旁边,通常都会有一颗独立的 PHY,它负责把 MAC 输出的数字信号,转换成网线上的差分信号,同时完成自动协商、链路检测、信号补偿等工作。
物理层最核心的机制就是速率的自动协商(Autonegotiation)。当我们把网线插入网口时,MAC 和对端设备(交换机或另一张网卡)会通过特定信号互相通告能力:支持 10M/100M/1000M 哪种速率、是半双工还是全双工、是否支持流控,双方会自动选择共同支持的最优模式。
这个过程完全由 PHY 硬件自动完成,不需要 CPU 参与。但一旦协商失败,就会出现最经典的问题:一端是 1000M 全双工,另一端变成 100M 半双工,此时不仅速度极慢,还会出现大量丢包、冲突、延迟飙升等现象。
除了速率和双工,物理层还定义了一系列标准,比如我们最常见的: 10Base-T —— 10M 双绞线 100Base-TX —— 百兆双绞线 1000Base-T —— 千兆双绞线 1000Base-FX —— 千兆光纤,还有近几年在车载和工业里大量使用的 10Base-T1L、100Base-T1 单对以太网,只需要一对线就能传输网络信号,极大节省线束成本。
物理层的另一个关键点是介质与接口。在嵌入式系统里,MAC 和 PHY 之间的接口叫作 MII 接口,常见的有 MII、RMII、GMII、RGMII、SGMII 等。其中 RGMII 是千兆场景最普遍的接口,它的设计对时序要求极高,时钟信号必须有固定延迟,这也是很多硬件设计失误导致网口不通的核心原因。
简单说,物理层就是网络的“公路”,路没铺好、信号不稳、电压异常、时序不对、延迟没配,数据包根本跑不起来。所以在嵌入式网络调试里,永远记住一句话:先看 L1,再调 L2。
三、数据链路层(L2)
如果说物理层是公路,那数据链路层就是在公路上画车道、设路标、管交通的系统。它的核心任务是:将物理信号组织成有结构、可校验、可寻址的帧,并实现同一局域网内设备之间的点到点传输。
在嵌入式领域,数据链路层几乎等同于以太网,我们所有的网口设备、交换机、网桥,都工作在这一层。
L2 最核心的标识是 MAC 地址,48 位全球唯一地址,用来标识每一个网络设备,网卡出厂时就烧录了唯一 MAC,内核启动后会读取并赋值给 net_device。
L2 最核心的数据单元是 以太网帧,理解以太网帧结构,是理解所有网络协议的起点。
一个标准的以太网帧从前往后依次是:前导码、帧起始符、目的 MAC、源 MAC、类型字段、数据载荷、最后是校验序列。
以太网帧前导码和帧起始符是物理层用来同步时钟的,相当于告诉设备:“准备接收,帧要开始了”。
目的 MAC 和源 MAC 标识了这一帧要发给谁、是谁发的,交换机就是靠这两个字段完成转发决策。
类型字段非常关键,它标识了载荷里封装的是什么协议,例如 0x0800 表示 IPv4,0x0806 表示 ARP,0x8100 表示 VLAN 标签。
最后的 FCS 是整帧的校验和,如果接收端计算不一致,就会直接丢弃这一帧。这也是我们在抓包时偶尔看到“坏帧”“错误帧”的原因。
以太网还有两个非常重要的限制:MTU 和最小帧长。
MTU 指最大传输单元,默认 1500 字节,意味着载荷部分不能超过 1500。如果数据太长,就必须在 IP 层分片。而最小帧长限制为 64 字节,不足时硬件会自动填充,这是为了保证冲突检测机制能够正常工作。
四、网桥与交换机:L2 最核心的转发设备
在嵌入式项目里,多网口网关、NVR、工业交换机、车载网关,都会用到 交换机,而交换机本质上就是一个工作在 L2 的高性能网桥。
网桥的逻辑很简单:把多个网口绑定在一起,让它们处于同一个局域网,实现端口之间的帧转发。Linux 内核自带软件网桥功能,我们可以用 ip link add br0 type bridge 来创建,相当于一个纯软件实现的简易交换机。而硬件交换机则是把转发逻辑放在 ASIC 芯片里,性能极高,几乎不占用 CPU。
交换机的工作机制可以用一句话概括:学习、泛洪、转发、老化。
当一个帧从某个端口进入交换机,交换机会先读取帧里的源 MAC 地址,并把这个 MAC 地址和端口号记录在自己的转发数据库 FDB 里。这就是学习。
bridge当交换机需要发送一个帧时,会查找目的 MAC 是否在 FDB 中。如果存在,就只从对应的端口发出;如果不存在,就从除接收端口外的所有端口发送,这就是泛洪。
随着设备不断上下线,FDB 会不断更新,旧的、不活跃的表项会被自动删除,这就是老化。
正是这套简单而高效的机制,让交换机可以在局域网内实现无冲突、高效率的转发。在调试多网口不通时,查看 FDB 表项是否正确,是最常用的手段之一。
五、VLAN:嵌入式 L2 常用的隔离技术
在嵌入式网关、企业路由、工业设备、车载以太网中,VLAN 几乎是必用技术。它的全称是虚拟局域网,可以在不改变物理布线的情况下,把一个物理网络划分成多个逻辑隔离的网络。
VLANsVLAN 的核心标准是 802.1Q,它通过在以太网帧中插入一个 4 字节的标签,来标识这个帧属于哪个 VLAN。标签里包含优先级字段和 VLAN ID,其中 VLAN ID 范围是 1~4094,足够大多数场景使用。
VLAN - 802.1QVLAN 带来的好处非常明显: 第一,隔离广播域,减少网络风暴,提升整体稳定性。 第二,实现业务隔离,比如 WAN、LAN、摄像头网、管理网互不干扰。 第三,简化布线,一根网线可以同时传输多个 VLAN 的数据。
在实际使用中,端口会分为 Access 口和 Trunk 口。Access 口只属于一个 VLAN,发出的帧不带标签;Trunk 口允许多个 VLAN 通过,帧携带标签。Linux 内核对 802.1Q 有完善的支持,我们可以很方便地创建 VLAN 子接口,例如 eth0.10、eth0.20 等。
六、Linux 内核对 L1/L2 的支持:一切都有标准框架
Linux 作为常用的嵌入式开发的操作系统,对物理层和数据链路层提供了极其完善的支持,而且全部采用统一、标准化的框架。
对于物理层 PHY,内核提供了 phylib 与 phylink 框架,统一管理不同厂商的 PHY 芯片,自动处理协商、链路状态、中断、速率切换。
对于数据链路层,内核实现了完整的以太网协议栈、网桥、VLAN、MACVLAN、Bonding、端口镜像、流量统计等功能。不管是真实的物理网卡,还是虚拟的 VLAN 接口、网桥端口,在内核里都以 net_device 结构呈现,拥有统一的操作接口。
这也是为什么嵌入式开发如此依赖 Linux:不管硬件怎么变,L1/L2 的调试方法、工具、配置逻辑都是统一的。ethtool 查看 PHY 状态、ip link 配置 VLAN、bridge 查看网桥信息、tcpdump 抓取二层帧,这些工具可以通用于各种嵌入式平台。
七、总结
截止到这里我们把 OSI 模型、物理层、数据链路层、以太网帧、交换机、VLAN 这些最基础也最重要的知识完整梳理了一遍。对于嵌入式工程师来说,L1 决定链路是否存在,L2 决定设备是否能在局域网内找到彼此。绝大多数问题,比如网口 UP 但 ping 不通、速率异常、双工不匹配、VLAN 不生效、交换机不转发、丢包严重,根源都在这两层。