正文大家好我是bug菌~最近跟同事聊到为什么现在的以太网还是够不上实时以太网呢其中有个同事说了下主要是因为载波监听机制导致发送的以太网数据存在碰撞于是我又想了想不对呀现在不都是用交换机吗交换机都是直接转发的也没有什么碰撞呀于是探究了一下。1载波监听首先我们来聊一下什么是网络中的载波监听机制其实全称也叫载波监听多路访问/冲突检测”,别说真的挺长的英文缩写为:CSMA/CD。它其实是以太网的核心媒体访问控制协议它就是用来解决: 当有多个设备同时当多个设备共享同一根线缆或集线器时如何协调发送以及发生冲突后如何恢复。他的工作流程总结下来就是:先听后说边听边说冲突则停随机重传。先载波监听检测线路上是否有其他设备在发送空闲了才发送由于存在发送延时和信号传播存在延迟两台设备可能几乎同时开始发送导致信号在线上叠加、破坏这就是冲突等待一段随机时间后重新尝试发送当然这中间还有一些退避算法其避免避免反复碰撞死锁。载波监听只能防止自己撞别人不能防止别人撞自己。这就是著名的“暴露站问题”你听着没声音开始发但如果远处另一个节点也在同一时刻听着没声音开始发信号传播到中间时还是会撞上。2交换机消灭冲突其实CSMA/CD在集线器的半双工时代做贡献 当我们进入廉价的交换机时代交换机将从两个层面优化了这个过程1、首先交换机每个端口都是一个独立的冲突域不像集线器会把信号复制给所有端口交换机解析帧里的目标 MAC 地址只向对应端口转发。这就好比把“大群对讲机”拆成了“交换机居中每个人跟交换机之间是一根专线”。端口 A 给端口 B 发数据时端口 C 和 D 完全不受影响。多个端口对可以同时通信互不干扰。2、交换机端口通常工作在全双工模式而且有缓存物理上收发分开网线里的发送线对和接收线对是独立的设备可以在发的同时也收不需要像对讲机那样“按下去就聋了”。缓存代替冲突解决如果多个端口同时要向同一个目标端口发数据交换机会把后来的帧暂时缓存起来排队转发。数据不会在介质上撞成一团只是多等一会儿。于是既没有信号碰撞也不需要在发之前侦听信道有没有人更不用“发中检测冲突”。于是CSMA/CD 的两大任务——“先听后说”和“碰撞检测”——全都不需要了。协议虽然还在但实际物理层上已经不用它了。可能你会问如果我不用交换机两根网线直连会不会触发CSMA/CD在现代网卡直连即使没有交换机的情况下通常不会触发载波监听CSMA/CD因为链路会工作在全双工模式。载波监听只在半双工模式下才会激活。而且全双工交换式以太网中网卡不再需要靠载波监听来避免冲突但载波监听电路仍然工作但解决的是“物理链路是否可用”而不是冲突。3为什么还不是实时网络既然交换机把路径都拉顺了为什么现在的以太网还是不能成为实时以太网呢交换机的本质是“存储-转发”遇到多个入口同时想往同一个出口发帧就会排队就是这一排队实时性就没了。比如说你在交换机端口1想给端口8发一个控制指令帧只有一帧非常小你觉的应该很快就能够到达目的地。可是刚巧与此同时端口2、端口3正在往端口8发满带宽的巨型文件——它们先到达输出队列。你的小指令帧就只能乖乖排在后面等前面的帧发完。而这个等待时间取决于当时其他端口的流量而那些流量可能是突发的、不可预测的队列可能深可能浅有的还有优先级但标准以太网的优先级只是“尽力而为”不能给你硬性保障。于是这一帧的延迟是不可预知的时大时小最坏情况可能是几十甚至上百毫秒。对工业运动控制等场景来说这已经失效了——它要的是“每 1ms 必达抖动小于 1μs”。当然如果你的是小数据、局域网、低负载 UDP经过合理的实时性调优实时内核、核隔离、中断绑定等也不是不可以实现可靠的 1 ms 周期通信。总的来说在没有任何改造的标准交换式以太网那确实很难达到硬实时。所以才有了TSN 及各种工业实时以太网协议。1、标准的TSN时间敏感网络在标准以太网上增加时间同步(802.1AS)、门控调度(802.1Qbv)、帧抢占(802.1Qbu)、流预留(802.1Qav)等把排队变得可预测且可调度。2、大名鼎鼎的EtherCAT虽然物理层用标准以太网但数据帧处理机制完全改变从站“飞速”读取/插入数据根本没有传统交换机的存储转发排队。3、西门子的PROFINET IRT在交换周期中划分实时通道和开放通道对实时帧用 TDMA 方式调度确保没有排队干扰。最后好了今天就跟大家分享这么多了如果你觉得有所收获一定记得点个赞~bug菌唯一、永久、免费分享嵌入式技术知识平台~推荐专辑 点击蓝色字体即可跳转☞MCU进阶专辑☞嵌入式C语言进阶专辑☞“bug说”专辑☞专辑|Linux应用程序编程大全☞专辑|学点网络知识☞专辑|手撕C语言☞专辑|手撕C语言☞专辑|经验分享☞专辑|电能控制技术☞专辑 | 从单片机到Linux