尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用Wireshark分析10BASE-T1S总线PLCA轮询机制

用Wireshark分析10BASE-T1S总线PLCA轮询机制 第一次拿到10BASE-T1S总线上的pcap时我下意识地在Wireshark里搜“PLCA”这个协议名结果一无所获。后来才琢磨明白一个关键事实PLCA不在以太网帧头里它藏在物理层的调度逻辑中Wireshark能分析的只是标准以太网报文而PLCA的轮询规律全部体现在报文到达的时间戳和源MAC地址的出场顺序里。这其实正是不少刚接触车载以太网的人会卡住的地方——总线是通的报文也抓到了但怎么证明“PLCA真的在按预期工作”轮询周期对不对、时隙够不够、某个节点为什么总延迟发送这些问题靠肉眼看几十个包根本看不出来。这篇文章我会从原理讲到操作用一份典型的8节点示例pcap做演示把Wireshark里分析PLCA轮询的完整思路拆开讲透适合正在做车载以太网测试、嵌入式通信调试以及想搞懂T1S总线底层机制的工程师参考。1. PLCA这个东西为什么必须用抓包去看才踏实1.1 为什么CSMA/CD在车里不够用传统的共享式以太网用的是CSMA/CD载波侦听多路访问/冲突检测。节点在发数据前先听总线总线空闲才发万一两个节点同时开嗓冲突之后各自随机退避一会儿再重传。这套机制在办公网络里够用因为延迟抖动大点没关系顶多多等几毫秒。但车上不一样。ADAS域控制器要周期性读取雷达、摄像头的状态数据刹车控制报文更是要求端到端延迟稳定可控。CSMA/CD的随机退避会让“这一帧多久能发出去”变成一个概率问题最坏情况下延迟上界根本算不出来——这对功能安全来说是不可接受的。10BASE-T1S作为IEEE 802.3cg定义的车载以太网物理层标准速率10Mbps用单对非屏蔽双绞线传输支持多点总线拓扑。它引入PLCAPhysical Layer Collision Avoidance物理层冲突避免机制本质上就是把“随机抢总线”改成了“按顺序轮流使用总线”用确定性的轮询换取可计算的最坏延迟。这也是PLCA被称为“物理层冲突避免”而不是“冲突检测”的原因——它从根本上避免冲突。1.2 PLCA的轮询节奏PLCA的工作方式不复杂但理解它需要先记住两个角色一个是COMMIT节点通常节点ID为0负责在每个轮询周期开始时发送BEACON信号另一个是普通节点它们各自有唯一的NODE_ID。流程如下COMMIT节点发送BEACON宣告新一轮轮询开始BEACON之后节点0最先获得发送机会如果它有数据要发就在自己时隙内发送发完就闭嘴节点0的时隙结束轮到节点1然后是节点2、节点3……依次推进某个节点在这个周期内没有数据要发它的时隙就静默空过所有配置的节点时隙都轮完后COMMIT节点再次发送BEACON开始下一个周期。这里最关键的一点每个节点只有在属于自己的时隙才能往总线上发送数据其他时间必须保持静默。这样就从根本上消除了两个节点同时发送导致冲突的可能性。1.3 Wireshark里为什么看不到“PLCA协议层”这一点必须先说清楚否则后面所有操作都会让你怀疑人生。Wireshark的协议栈解析是从OSI第二层数据链路层开始的显示的是以太网帧头、IP、UDP/TCP、应用层这些内容。而PLCA是OSI第一层物理层的机制它产生的BEACON是一种特殊的物理层信号不是以太网帧不会出现在pcap文件里。每个节点在自己的时隙发送的仍然是普通以太网帧帧头里也没有任何字段标注“我是PLCA节点”。所以分析PLCA轮询的实质是通过以太网帧的到达顺序、源MAC地址序列、相邻帧之间的时间间隔反推出物理层的调度规律。只要总线拓扑是T1S多点共享且抓包时间戳足够精确这套反推方法完全可行。2. 抓包环境搭建T1S总线怎么接入Wireshark2.1 硬件怎么搭分析仪还是PHY转接板10BASE-T1S的物理介质是单对差分信号线和普通RJ45网口完全不兼容。想用Wireshark抓T1S总线上的包前提是得有硬件把总线上的物理信号转成标准以太网抓包接口能识别的数据。我常用的方案有两种。第一种是专业的车载以太网分析仪支持10BASE-T1S接口的型号可以直接并联到总线上以旁路监听的方式捕获所有报文并打上纳秒级硬件时间戳最后导出标准pcap文件。这套方案最省事适合量产调试和台架测试缺点是设备价格不低。第二种是自研或半自研的PHY转接方案用一颗支持T1S的PHY芯片比如Microchip的LAN8670系列、TI的DP83TG720S等把差分信号转成MII/RMII接口再接逻辑分析仪或MCU通过软件把捕获的数据封装成pcap格式。这套方案成本低但时间戳精度完全取决于你后端的采样和处理能力误差容易做到微秒级已经足够分析PLCA轮询周期。不管你用哪种方式有一个前提必须满足——抓包的时间戳精度至少要达到微秒级。PLCA轮询中BEACON和相邻节点时隙之间的间隔常常只有几微秒到几十微秒如果时间戳误差到毫秒级整个时序分析就没有意义了。2.2 Wireshark关键设置Wireshark版本建议直接用4.0以上新版对时间列、IO Graph和统计工具的交互体验都有明显改进。打开pcap后建议先做两步设置把时间显示格式改成相对时间。路径是View - Time Display Format - Seconds Since Beginning of Capture。这样每行的时间戳都从抓包起点开始计算方便看周期。把“Delta time displayed”列加出来。右键点击列标题栏选择Column Preferences添加一个新列字段类型选“Delta time displayed”。这一列显示的是“当前帧与前一帧之间的时间差”是分析轮询空档最重要的工具。2.3 拿到pcap后先做质量检查分析之前我会先确认这份pcap是不是“完整”的监听数据而不是一堆断断续续的碎片。检查点有两个看时间戳是否连续。如果同一辆总线上的相邻帧之间经常出现几十毫秒级别的空洞说明抓包工具可能在丢帧或者分析仪进入了过滤状态。PLCA轮询周期通常是微秒到毫秒级连续帧之间的间隔如果出现异常大的跳变要警惕。看源MAC集合是否与总线节点匹配。正常情况下一份T1S总线的pcap里源MAC地址应该只有固定的几个对应总线上实际配置的节点。如果冒出来一个完全陌生的MAC十有八九是抓包链路混入了其他网络流量或者是某个PHY芯片配置异常导致模拟了错误地址。3. 从pcap里识别PLCA轮询的四个步骤3.1 第一步列出全部MAC和帧数打开pcap后先走Statistics - Endpoints切换到Ethernet选项卡。这里会列出所有出现过的源MAC地址以及各自的帧数。对一份正常的PLCA总线抓包来说MAC地址数量应该与总线上的节点数一致而且各节点的帧数分布通常有规律可循——比如某个雷达节点固定每个周期发一帧它的总帧数就会和轮询周期数基本对应。这一步能帮你快速确认抓包范围是否干净、有没有混入非T1S设备的数据、哪些节点是“活跃发送者”、哪些节点长期静默。3.2 第二步建立参考时间看同一节点的发包节奏在Wireshark里选中某个节点比如源MAC对应雷达节点的第一帧按CtrlT设置时间参考这一帧的时间会变成0.000000。然后往下翻找到这个节点的下一帧看相对时间差。例子如果雷达节点每两个轮询周期才发一次数据且轮询周期是2ms你会看到这个节点每隔约4ms出现一帧如果它每个周期都发间隔会稳定在2ms左右。连续多个间隔如果高度一致基本可以确定PLCA轮询在正常工作。这一步的核心是“以节点为单位看周期”而不是盯着全部报文看。不看发送源直接算总流量只会看到一大堆帧混在一起什么规律也找不出来。3.3 第三步用ΔT列找出固定空档现在把注意力放到Delta time displayed列。PLCA轮询的一个显著特征是每一轮周期内相邻两个节点的发送时刻之间存在一个“基础间隔”这个基础间隔由前一帧的传输时间、PHY层处理时间、时隙配置共同决定。以示例pcap为例你会看到这样的时间差序列数值做了简化方便理解相邻帧关系Delta time displayed含义节点三 - 节点四约12 µs节点四在自己的时隙立即发包节点五 - 节点六约40 µs节点五的时隙空闲多了空时隙等待节点六 - 节点七约10 µs正常切换节点七 - 节点零下一轮约90 µs一个完整周期结束等待BEACON首时隙如果某个固定长度的“空档”反复出现比如每隔几个帧就出现一个相同的较长间隔那几乎可以肯定是某个节点在该时隙没有数据发送总线静默等待时隙结束。这一步做得多了你甚至能凭ΔT列的节奏“听”出总线的心跳。3.4 第四步用IO Graph验证周期性IO Graph是验证PLCA周期性的利器。Statistics - IO Graph把时间间隔调小比如0.1ms或0.2msX轴显示时间Y轴显示Packets/Tick或Bits/Tick。正常工作的PLCA总线会呈现非常规律的尖峰脉冲每个周期内某些节点发包所以在固定的间隔上出现波峰波峰之间的时间差就是轮询周期。如果波峰间距忽大忽小说明轮询周期不稳定如果波峰消失或者变成一片嘈杂说明要么节点没有按配置工作要么总线负载已经严重超限。示例pcap用IO Graph看能明显看到每2ms出现一组脉冲脉冲内部有7个小峰对应7个活跃节点。这比肉眼翻包高效得多。4. 一个轮询周期的时间线解剖从BEACON到下一个BEACON4.1 示例pcap中的一轮时序下面这段时序来自一份8节点总线配置的示例pcap其中节点3在本轮没有数据要发其他节点各发了一帧。时间戳为相对时间。相对时间源MAC按节点号长度说明0.000000节点064 B本轮第一帧BEACON之后节点0时隙立即发包0.000012节点1128 B正常切换节点1在自己的时隙发送0.000026节点264 B正常切换0.000071节点464 B节点3时隙空闲多等了约40µs0.000083节点596 B正常切换0.000095节点664 B正常切换0.000108节点764 B正常切换0.000198节点064 B下一轮BEACON后的节点0轮询周期约198µs如果把这张表里“节点3的40µs空档”忽略其他节点的切换间隔都在12µs左右说明总线的基础调度非常稳定。这个示例的意义在于给你一个参考模板拿着你自己的pcap按同样的格式排出来如果相邻节点间隔总体稳定、空时隙规律出现、周期首尾对齐PLCA就没问题。4.2 连续多帧与burst的区分有时候你会看到一个节点在自己的时隙内连续发了多帧帧间间隔非常短微秒级看起来像“抢发”。这要分两种情况理解。第一种是正常的PLCA burst机制。IEEE 802.3cg允许节点在一个时隙内连续发送多个帧前提是配置了PLCA_BURST且这些帧的总长度不超过burst允许的上限。这就像排队时一个人可以连续说三句话再说“完毕”。第二种是正常的分包发送。比如一个大应用层消息被拆成多个TCP/IP分片也会出现同一个源MAC连续多帧的情况。区分方法很简单看这两组连续帧的间隔是否与其他节点的正常时隙切换一致。如果帧间间隔异常地短小于常规的帧间隙大概率是burst如果间隔与正常切换没什么区别那就是普通的连续发送。4.3 空时隙的判据空时隙是分析PLCA时最容易误解的地方。很多新手看到总线上有一段时间没有任何报文以为是抓包丢帧其实那可能是某个节点在这个周期里没有数据时隙被静默空过了。空时隙的典型特征是在一组正常的相邻帧切换之后突然出现一个比其他间隔长一截的固定空档而且这个空档的长度在多个周期里可以复现。比如每轮都在“节点2之后、节点4之前”出现40µs空档那基本可以断定节点3没有参与本轮发送。空时隙本身不是故障它恰恰证明了PLCA的确定性——即使某个节点不说话总线依然为它保留了完整的时隙。5. 最容易翻车的几个地方与我的排查链路5.1 现象节点4的周期报文总是晚到说一个真实的调测场景。当时一条T1S总线上挂了7个节点应用层报文监控程序报警说节点4的状态报文经常“迟到”——正常应该每2ms报一次实际有时要拖到4ms甚至6ms才出现而且延迟越来越严重。直观反应是节点4出了问题马上把它拉出来单看源MAC对应节点4的帧确实还存在但它的发送时刻在总线时间轴上不断往后漂移。换句话说节点4没有按照它应该被轮询到的顺序及时发送。5.2 完整排查链路排掉干扰信息后我是按下面的链路一步步定位的。第一先确认轮询周期本身有没有乱。看IO Graph总线整体周期还是稳定的2ms说明COMMIT节点的BEACON发送和各节点时隙分配没有大问题。第二单独看节点4在每一轮周期中出现的位置。正常的PLCA行为里同一个节点在每轮周期中的相对位置应该固定不变。但我发现节点4的帧偶尔出现在节点5甚至节点6之后有时候又出现在节点7后面——这说明节点4实际使用的NODE_ID与标定表里的不一致。第三查物理节点配置。T1S PHY的NODE_ID一般由硬件引脚或寄存器配置决定我让人检查节点4对应ECU的PHY配置结果发现这颗PHY的NODE_ID引脚被覆铜短路到了一侧电平实际读到的ID是6而不是标定表里写的4。第四验证根因。节点4实际以ID6的身份参与轮询所以总线在轮到ID4的时隙时没有设备说话这个时隙空过而轮到ID6的时隙时“真正的节点4”才发出报文。应用层按“节点4周期”去判断自然觉得它延迟了整整两个时隙。5.3 根因分析与处理结果这个问题的本质不是物理层冲突而是“逻辑身份”和“物理身份”错位。它暴露了一个多节点T1S总线的常见风险NODE_ID配置错误不会导致收发失败报文照样能发出来但总线顺序会乱应用层的时序判断也会随之出错。处理方式不只是改引脚配置我还在测试规范里加了两条强制检查项抓包后第一步就核对每个MAC对应的实际节点ID而不是先看业务报文是否正确定期用空时隙分布核对总线节点数。如果配置了8个节点但pcap里每轮只出现7个活跃发送者必须确认剩下那个是“真的没数据”还是“ID配置错了”。这个案例也说明PLCA总线调试和传统以太网调试最大的不同在于你不仅要看包的内容还要看包在时间轴上的位置。6. 从pcap反推总线参数节点数、时隙和带宽余量6.1 从pcap反推节点数配置文档可能丢失、总线可能被非法接入额外节点这些时候pcap能帮你还原真实的节点数。方法是用空时隙规律做推断。你把一轮周期内的帧序列全部列出来标记出每个固定空档的位置然后数一数“活跃发送者数量固定空档数量”基本上就等于这个总线上实际配置的NODE_COUNT。比如示例pcap里活跃节点有7个节点3的时隙固定空闲那NODE_COUNT很可能就是8。如果数出来的空档位置在多个周期里不断漂移说明可能有节点在随机退避模式下工作——这在PLCA总线里是不正常的需要立刻排查。6.2 估算信道占用率PLCA是时分轮询每个周期的时间是有限的。计算信道占用率时可以用一个周期内所有报文的总传输时间除以轮询周期。在Wireshark里用IO Graph看Bits/Tick得到平均比特率然后除以10Mbps就是粗略的信道占用率。更精确的做法是把一帧的传输时间按“帧字节数×8÷10Mbps”估算再把每轮所有帧的传输时间累加除以轮询周期。示例pcap中每轮7个节点各发一帧平均帧长64字节左右总传输时间约360µs轮询周期约2ms信道占用率大概18%。这个数字说明总线余量充足可以继续增加报文或者缩短轮询周期。6.3 优化时隙配置的思路如果计算出的占用率已经偏高比如超过60%就需要考虑调整PLCA参数了。可调的主要有三个方向。减少NODE_COUNT。如果总线上实际只有5个活跃节点就不要配置成8个节点的轮询周期否则每轮多出的3个空时隙都在白白浪费时间。调整slot time。时隙长度必须大于单帧在总线上的最长传输时间但如果总线报文普遍很短过大的slot time就是浪费。可以在满足最长报文要求的前提下压缩时隙。合理利用burst。如果一个节点周期性发送多条小报文与其让它每轮只发一条然后等下一轮不如配置burst允许它在单时隙内连发多条这样能显著压缩整轮周期。有一点要提醒PLCA参数修改后总线上所有节点的配置必须同步更新否则轮询节奏一旦错位总线会立刻出现大量静默和超时。改完参数别急着上业务先空跑抓包确认每轮的帧序列和时隙间隔恢复正常再挂业务。最后再分享一个我个人的小习惯分析任何一份T1S抓包文件前我先不急着看高层的应用数据而是先发呆几分钟纯看时间列和源MAC序列的节奏。PLCA的确定性意味着总线像节拍器一样稳定——当你对“稳定的节奏”形成肌肉记忆任何异常都会特别扎眼。这个习惯帮我省下的排障时间远超我学习Wireshark操作所花的时间。
返回列表