以太网技术解析:从物理层到嵌入式与车载应用
1. 以太网到底是什么先用三个层面把它看穿很多人觉得自己懂以太网因为每天都在插网线、连Wi-Fi、上网课。但一旦真正开始做嵌入式开发、写网络驱动、给单片机移植以太网协议栈立刻会发现以太网远不是一根网线通到底这么简单。我见过不少做MCU开发的朋友第一次接触LAN8720、DM9000这类PHY芯片时对着原理图发懵因为芯片手册里的RMII接口MII接口MDIO总线这些词教材里从来没讲过。要理解以太网我建议别一上来就背帧格式而是按三层来拆。最底下是物理层解决0和1怎么变成能在网线里跑的电信号中间是数据链路层解决这一串0和1要怎么分组成帧、从哪台设备发给哪台设备上面才是大家熟悉的网络层和传输层比如IP地址、端口号这些。打个比方以太网物理层像是公路数据链路层像是货车——规定了车厢尺寸、门在哪边、牌照长什么样而IP协议是物流单写清楚了从哪个仓库发到哪个仓库TCP/UDP则是包裹里的分拣标签告诉收货人这个是易碎品还是普通件。没有公路包裹动不了没有货车包裹没法定制化打包没有物流单和分拣标签货物到了也无法准确分发到人。四者缺一不可。1.1 物理层网线里的电信号为什么不简单物理层的核心任务是把比特流变成适合在传输介质上传播的信号同时从信号里恢复出比特流。传统100M以太网用的是两对双绞线一对发送、一对接收采用MLT-3编码一种三电平编码方式通过电平跳变来传递信息。1000M以太网的物理层就复杂多了要求8根线全部参与并且采用5电平PAM-5编码用更复杂的线路编码来换取带宽。这里很多人会忽略一个点物理层不只是模电的事它直接决定了你能跑多快的速率。比如100M网口和1000M网口虽然都叫RJ45但内部电路完全不同。从PHY芯片的角度说它要负责编码、解码、时钟恢复、自适应均衡、回波抵消。这也是为什么MCU的以太网接口本质上是MAC控制器 外部PHY芯片的组合因为物理层那些模拟电路几乎不可能集成在普通单片机里。1.2 数据链路层MAC地址与数据装箱数据链路层的核心是多路访问控制和成帧。每个以太网接口都有一个全球唯一的MAC地址理论上的实际上可以通过寄存器覆盖它相当于是设备的身份证。当数据从IP层下来会被加上源MAC和目的MAC再附加上校验字段这就构成了一帧以太网数据。这层的关键在于网卡并不关心IP地址它只认MAC。哪怕你的IP配置错了只要MAC在同一个广播域内能通信数据帧照样能发出去。这就是为什么可以通过ping网关来判断本机网卡是否正常因为链路层先通了才能谈上层协议。1.3 网络层与传输层跨设备通信的接力棒网络层负责把数据从一个子网送到另一个子网核心是IP地址和路由。这就像寄包裹时你只知道对方的城市和门牌号但快递车怎么从A城市到B城市是路由器选路的结果。传输层则负责端口复用和端到端可靠性TCP要建立连接、确认重传UDP则只封装端口不管到达。对入门者来说不需要把TCP/IP协议栈所有细节背下来但必须清楚以太网帧只是TCP/IP这层体系的最底层载体。当你执行ping命令时实际发生的事情是ICMP报文 - IP层封装 - 加入MAC头 - 变成以太网帧 - 通过PHY芯片发出。搞清楚这条链路后面排查问题才不至于抓瞎。2. 一帧数据从网口发出到被接收中间发生了什么理解以太网绕不开帧格式。很多人背了帧格式但不知道意义我建议反过来先想场景你要给对方发一句hello网卡拿到这句话后要做什么2.1 以太网帧格式逐个字段拆解标准以太网帧IEEE 802.3长这样字段长度说明前导码 Preamble7字节交替的0和1用于接收方时钟同步帧起始符 SFD1字节固定0xD5表示帧正式开始目的MAC地址6字节接收方网卡地址源MAC地址6字节发送方网卡地址长度/类型2字节小于0x0600表示长度大于等于0x0600表示上层协议类型如0x0800是IPv4数据 Payload46~1500字节上层数据帧校验 FCS4字节CRC32校验发端计算、收端验证前导码和SFD其实在物理层就被处理完了所以抓包软件里通常看不到。MAC头最容易被忽略的是长度/类型字段的双重含义如果值是0x0800说明后面跟着的是IP包如果是0x8100说明后面还带VLAN标签。这也是判断一个帧是普通IPv4还是带802.1Q标签的核心依据。2.2 帧间隔与最小帧长为什么会有这些奇怪限制两个帧之间必须存在一个帧间隔IFG标准规定是96 bit时间。也就是说发完一帧之后网卡必须等96个比特位的时间才能发下一帧。为什么因为接收端的处理速度是有限的它需要时间完成DMA搬运、校验、上报上层协议栈。这个96 bit时间在10Mbps下约等于9.6微秒100Mbps下约等于0.96微秒速率越高留给接收方处理的时间越短——这也是网卡和驱动做得不够好时高速小包转发容易丢包的根源之一。最小帧长是64字节从目的MAC到FCS。这个限制源自CSMA/CD时代半双工下发送方必须保证在自己发完这帧之前最远端的设备如果发生碰撞信号能传回来让发送方感知到。以太网规定冲突域最大直径约200米信号往返加上中继器延迟必须小于发送64字节的时间这样才能边发边听。全双工交换机普及后CSMA/CD基本退场但64字节最小帧长被保留下来变成了标准。所以如果你看到某台设备发了一个小于64字节的帧那叫runt帧短帧说明物理层或驱动有异常。2.3 从半双工碰撞检测到交换机全双工早期以太网是总线型拓扑一根同轴电缆上挂着多台设备大家都在一条管道里发数据就可能撞车。CSMA/CD载波侦听多路访问/冲突检测的机制是发之前先听信道空闲才发发的时候同时监听如果发现有冲突立即停发并发送一个拥塞信号然后随机退避一段时间再重试。现在的以太网都靠交换机连接每个端口和终端之间是点对点全双工链路不存在碰撞的问题了。所以如今的网卡默认工作在自动协商模式协商出最高的双工模式和速率。这个转变意味着一条简单的道理半双工时带宽要打对折全双工时收发可以同时进行100M口全双工理论吞吐就是200M。很多人测网速时忽略这个前提其实挺冤的。3. 网线、速率与接口选型前先看懂硬件形态做硬件或者做系统集成经常要在用什么样的网口、什么速率、什么线序上做选择。这块看似简单踩坑的人真不少。3.1 速率与双工协商100M和1000M的玩法差异两个以太网设备对接要统一速率和双工模式才能正常工作。自动协商靠发送快速链路脉冲FLP来沟通各自的能力集。常见的组合是1000M全双工 100M全双工 100M半双工 10M全双工 10M半双工。协商结果取决于双方能力集的交集取最优。这里有个经典坑某些老旧设备不支持自动协商被强制设为100M全双工而对端是100M半双工这时候链路指示灯可能显示正常但通信表现为严重丢包、速度极慢。因为全双工方不会边发边听半双工方一旦检测到冲突就会退避导致大量重传。排查链路高丢包时一定要先确认两端工作模式别急着怀疑线缆或交换芯片。3.2 RJ45线序与交叉线那点事RJ45网线里的8根线不是全都用来传数据的。10M/100M只用1、2、3、6四根其中1、2是发送对TX、TX-3、6是接收对RX、RX-4、5、7、8闲置。但千兆必须8根全用每对线都承担双向传输。线序上常见T568A和T568B两种标准。A标准的1、2为白绿/绿3、6为白橙/橙B标准的1、2为白橙/橙3、6为白绿/绿。直通线两端都用同一标准交叉线一端A一端B。现在绝大多数网卡和交换机都支持MDI-X自适应翻转交叉线基本退役了。但做项目时如果要现场临时做一根短网线还是要分清有些老的工业设备网口不带自动翻转功能就必须做交叉线才能和电脑直连。3.3 电口与光口什么时候该上光纤电口成本低、施工方便但传输距离和抗干扰能力有限Cat5e跑千兆一般限制在100米内。光纤的优势是距离远、抗电磁干扰强工业现场或者跨楼宇的场合光口几乎是唯一选择。SFP光模块可以灵活插拔百兆、千兆、万兆都有。我个人在选择时的原则是100米以内、室内环境、成本敏感用电口超过100米、室外布线、强电磁环境、或要求隔离直接上光纤别图省钱。另外提醒一句光模块和光纤的接口类型波长一定要匹配之前见过买错单模模块配多模光纤链路死活起不来查了半天才发现波长和光纤模式不匹配。4. 单片机接以太网MAC、PHY与RMII的协作接下来聊嵌入式开发最关心的部分。很多人一开始看原理图会困惑为什么STM32F407明明有以太网外设还要在外部挂一个LAN8720或者DP83848这不是重复吗4.1 为什么MCU都要外接PHY而不是直接出网口MCU内部的以太网MAC只负责数据链路层的活儿组帧、解析、DMA搬运、地址过滤。但要把数字信号变成能在双绞线上传输的模拟差分信号需要PHY芯片来完成比如编码、电平驱动、时钟恢复、自动协商。这就像MAC是物流调度中心PHY是货车司机调度中心不可能自己去开车得外包给专业车队。市面上常用的PHY芯片有LAN8720A百兆RMII接口、DP83848百兆MII/RMII、RTL8211系列千兆。选型时主要看接口类型、参考时钟来源、以及驱动生态。ESP32、STM32这些平台都有现成的驱动例程入门阶段别搞太冷门的PHY否则光调驱动就够折腾。4.2 RMII接口的引脚与时序要点MIIMedia Independent Interface是标准介质无关接口发送和接收各用4根数据线配合时钟100M时时钟25MHz。RMIIReduced MII把数据线砍到2根时钟提到50MHz总共只需要TX_EN、TXD[1:0]、RXD[1:0]、CRS_DV、MDC、MDIO这几根关键信号省PIN。RMII的核心是50MHz参考时钟REF_CLK。这个时钟可以从外部晶振产生也可以由PHY芯片自己提供或者由MAC输出。常见的坑就在这里ESP32接LAN8720通常采用外部25MHz晶振 LAN8720内部PLL倍频到50MHz的方案此时LAN8720要把50MHz时钟通过CLKOUT引脚回送给ESP32而STM32F407接DP83848则常用MCO1输出50MHz给PHY。时序对不上以太网就会能link但收不到数据。4.3 ESP32LAN8720调试中常遇到的3个问题结合我自己和身边朋友的实际调试经历ESP32接LAN8720最容易栽在下面这三个地方问题一50MHz REF_CLK没配置对表现为能识别PHY但ping不通。如果采用25MHz晶振方案需要确保LAN8720的CLKOUT输出50MHz并接到ESP32的GPIO。ESP32的RMII时钟输入引脚不是随便选的具体取决于芯片的IO MUX映射。这在官方例程里有明确说明开板的时候千万对照原理图确认别想当然。问题二复位时序太短或复位引脚悬空导致PHY状态不稳定。LAN8720的复位需要维持足够长的低电平时间数据手册通常要求至少几十毫秒。如果复位引脚接到RC延时电路上电后复位时间不足PHY内部寄存器的默认值可能没加载好接着MDIO读到0xFFFF或者寄存器值怪异说明PHY没准备好。解决方式是用GPIO控制复位并在初始化代码里先拉低、延时再拉高。问题三PHY地址不对。LAN8720的SMI接口PHY地址由PHYAD0引脚的上下拉决定常见是0x00或0x01。如果板子上PHYAD0接了低电平代码里却初始化地址为1MDIO通信就会失败。这个坑最隐蔽因为编译不报错、板子也正常供电但初始化PHY时就是读不到ID。排查办法用MDIO读寄存器2和3PHY ID和LAN8720的数据手册对比看能不能读到0x0007这个厂商号。接线方面ESP32和LAN8720的RMII接口至少要连TXD0、TXD1、TX_EN、RXD0、RXD1、CRS_DV、MDC、MDIO、REF_CLK再加上电源和地一共十几根线。画PCB时建议MDC/MDIO尽量短避免高速信号反射。4.4 STM32F407与DP83848的RMII配置提醒STM32F407自带MAC使用RMII接口时有个容易被忽略的点需要开启ETH时钟AHB1外设时钟并设置MCO1输出50MHz作为PHY的时钟源或由PHY提供50MHz给MAC。如果选择MCO1输出要确认PA8引脚的AF配置正确频率配到50MHz否则PHY收不到时钟RX/TX完全无法工作。另外RMII的CRS_DV信号在F407上对应PA7在接线时要严格按照参考设计来。用Cubemx配置时图形界面会帮你分配引脚但硬件上必须一致否则软件层根本没机会跑通。我见过板子LAYOUT时把TXD0和TXD1接反导致完全无法通信的情况表现是RMII初始化不报错但网络中完全收不到设备。排查这类问题唯一的办法就是逐引脚用万用表量通断或者根据PHY的回环模式做测试。5. Windows里的以太网故障从驱动到虚拟网卡做嵌入式开发免不了和Windows网络设置打交道尤其是调试虚拟机、开发板网络时网卡没了以太网选项消失这类问题层出不穷。5.1 Win11突然找不到以太网选项Win11系统里明明插了网线但设置页看不到以太网选项常见原因有三个一是网卡驱动被卸载或被Windows更新冲掉了二是快速启动Fast Startup机制导致网卡驱动加载异常三是BIOS里把板载网卡禁用了。处理顺序建议先查看设备管理器里网络适配器下有没有带黄色感叹号的条目如果有就更新或回退驱动如果没有网卡条目看看查看菜单里勾选显示隐藏的设备再用“扫描检测硬件改动”还不行就重启进BIOS确认板载LAN功能是Enabled。快速启动引发的以太网消失很坑特征是重启之后问题消失但关机后再开机又复现。这是因为快速启动让系统假关机后网卡驱动处于挂起状态物理设备没被正确枚举。解决方法是关闭快速启动或者在电源设置里禁用启用快速启动选项。5.2 VirtualBox的host-only adapter报错VirtualBox装好后常见报错interface (virtualbox host-only ethernet adapter) is not a host-only adapter。这通常发生在Windows上安装VirtualBox后虚拟网卡驱动没有正确安装或者系统存在Hyper-V / 内核隔离等冲突。检查路径是设备管理器 - 网络适配器看有没有Host-Only Ethernet Adapter如果设备上有感叹号多半是驱动签名问题需要用管理员权限重新安装VirtualBox或者单独安装VBoxNetLwf驱动。如果设备管理器里根本看不到去控制面板 - 程序和功能 - VirtualBox选择修复安装。理论上讲只要Host-Only虚拟网卡在Windows网络连接里出现VirtualBox就不应该再报这个错了。5.3 网络适配器消失的通用排查顺序网卡消失算是个高频问题我总结的排查顺序是先软件后硬件先驱动后BIOS。设备管理器里刷新看是否枚举出网卡。检查网卡是否被禁用设备管理器里条目可能还在但属性里显示禁用。检查BIOS中板载网卡/PCIe网卡是否启用。更换网线或强制端口速率排除物理层问题。重置网络栈管理员运行netsh winsock reset和netsh int ip reset然后重启。这套顺序能覆盖90%以上的“以太网选项消失”问题。最后一步重置winsock会清掉LSP分层服务提供程序对虚拟机和加速器类软件可能有影响执行前留个心眼。6. 以太网在车载与工业场景中的变种既然能搜到车载以太网TC8测试Kepware连接DL645-2007电能表这些词说明很多人关心的不止是PC和单片机的以太网更想了解它在汽车、工业这些行业里怎么落地。这部分值得展开讲因为以太网在这些场景里不是插网线上网而是作为车内或厂区通信骨干。6.1 车载以太网为什么不用CAN那一套传统汽车总线以CAN为主带宽只有1Mbps左右虽然可靠但绝对带宽太低传输音视频、海量数据根本不够用。车载以太网的出现就是为了在车内搭建一个高带宽、确定性低时延的通信网络。车载以太网和普通以太网的最大区别是物理层它用单对非屏蔽双绞线传输采用100BASE-T1或1000BASE-T1标准通过PAM3或PAM5编码在一对线上同时实现双向通信配合回波抵消技术。这样做的好处是线缆更轻、更便宜、更容易布线并且支持PoDL数据线供电。但代价是链路长度限制在15米左右不能像普通以太网那样拉100米。6.2 车载以太网的协议架构与TC8测试车载以太网并不是一种新协议而是在标准以太网基础上叠加了一套针对汽车场景的分层架构。底层物理层是100BASE-T1/1000BASE-T1数据链路层沿用802.3网络层和传输层还是IP和TCP/UDP。为了让有限带宽里高优先级流量不被挤掉车载以太网引入了AVB/TSN技术栈对时延和带宽预留做了增强比如802.1Qav流控、802.1AS时间同步。应用层常见的协议有SOME/IP服务导向中间件、DoIP诊断over IP等用来实现服务发现、远程诊断这些功能。TC8测试规范是OPEN Alliance SIG制定的一套车载以太网一致性测试标准覆盖从物理层到应用层各层协议的一致性验证目的是确保不同供应商的ECU能互通。做车载以太网开发时TC8用例基本是认证必过项涉及连接管理、数据收发时序、错误处理等多个方面。想在入门阶段理解TC8重点看网络层和传输层的一致性与互操作测试这一块和传统以太网测试的思路差别最大。6.3 工业协议走以太网封装的实例DL/T 645电表采集工业现场有大量老旧设备走串口协议比如电能表常用的DL/T 645-2007。要让上位机能远程采集多台电表数据传统做法是一台采集器一对一接串口但现在的主流方案是把DL/T 645报文封装进以太网帧里通过TCP/IP传输。Kepware就是一个典型的工业OPC服务器软件内置DL/T 645驱动。它通过以太网连接串口服务器或者带网口的电表集中器把DL/T 645的请求和响应拆装成TCP报文周期轮询上位机再用OPC UA读取转发后的数据。这里要理解的关键是以太网只是个运输管道上层跑的依然是DL/T 645的应用逻辑。这和TCP/IP承载HTTP是同一个套路只是把HTTP换成了DL/T 645。这种协议换管道的思路就是工业以太网最常见的落地姿势。从入门到能干活我对以太网的体会是别被协议栈吓住也别被各种硬件接口绕晕。先把物理层、链路层这两个地基打牢再结合自己手上的实际项目不管是ESP32、STM32、Windows还是车载/工业组网逐个攻破比抱着协议规范啃几个月效率高得多。最后分享一个小技巧无论在哪一层遇到问题先保证物理层链路是通的、双工速率协商对了、时钟和复位没有问题再谈上层协议排查。我自己调试过太多以太网相关的问题一半以上最后都倒在这三条最底层的前提上。