以太网实时性不好,载波监听机制可不背锅~
正文
大家好,我是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
