全双工和半双工在以太网报文收发过程中的核心区别
MCU A (集成MAC) -> PHY A -> 网线 -> PHY B -> MCU B (集成MAC) ,这种点对点直连的场景(不使用交换机或集线器),详细说明全双工和半双工在以太网报文收发过程中的核心区别。
核心区别根源:
• 物理通道:
o 全双工: 网线内部使用两对独立的差分线(例如百兆以太网中的线对1-2和3-6)。一对(如1-2)专门用于A -> B的发送(TX A -> RX B),另一对(如3-6)专门用于B -> A的发送(TX B -> RX A)。发送和接收物理通道完全分离。
o 半双工: 网线内部通常只使用一对共享的差分线(例如百兆以太网中的线对1-2)。所有通信(A->B 和 B->A)都挤在这一对线上轮流进行。发送和接收共享同一个物理通道。
报文收发过程详解:
场景1:节点A 向 节点B 发送数据 (节点B 此时不主动发送)
- MCU A (MAC):
o 构造以太网帧(源MAC=A, 目的MAC=B, 数据, FCS)。
o 通过MII/RMII接口将帧数据发送给PHY A。 - PHY A:
o 全双工:
接收到MAC A的数据。
立即、无条件地 将数字信号调制,并通过 TX A (线对1-2) 发送出去。完全不关心 RX A (线对3-6) 上是否有信号。
o 半双工:
接收到MAC A的数据。
先侦听共享线路(CS - Carrier Sense):
如果检测到线路上没有载波信号(空闲),则切换到发送模式(关闭接收电路)。
将数字信号调制,并通过共享线对 (线对1-2) 发送出去。
在发送过程中,持续监听自己发送的信号(CD - Collision Detection)。
(本例假设B未发送,线路空闲,无冲突)
如果检测到线路忙(有载波),则推迟发送,等待线路空闲。 - 网线:
o 全双工: 信号在线对1-2 (TX A -> RX B) 上传输。线对3-6 (RX A <- TX B) 此时空闲。
o 半双工: 信号在共享线对 (线对1-2) 上传输。 - PHY B:
o 全双工:
通过RX B (线对1-2) 接收到信号。
同时,PHY B 的 TX B (线对3-6) 可以自由地发送数据(如果MCU B有数据要发),完全不受RX接收的影响。
将接收到的信号解调、恢复时钟,转换成数字信号。
通过MII/RMII接口将数字信号发送给MAC B。
o 半双工:
通过共享线对 (线对1-2) 接收到信号。
PHY B 必须处于接收模式(发送电路关闭),因为它检测到了载波信号。
将接收到的信号解调、恢复时钟,转换成数字信号。
通过MII/RMII接口将数字信号发送给MAC B。 - MCU B (MAC):
o 接收PHY B送来的数据,解析帧,校验,若目的MAC匹配则交给上层。
场景1小结 (A->B, B空闲):
• 全双工: A发送给B的过程丝毫不影响B同时发送数据给A的可能性(如果B有数据要发)。PHY A 的 TX 和 RX 电路、PHY B 的 TX 和 RX 电路都独立并行工作。双向通信可同时进行。
• 半双工: A发送时,B只能接收,不能发送。整个物理通道被A独占。PHY A 和 PHY B 都必须将共享线路用于A->B的传输。双向通信不能同时进行。
场景2:节点A 和 节点B 同时尝试发送数据给对方
- MCU A & MCU B:
o A 和 B 的应用层几乎同时需要发送数据给对方。
o MAC A 和 MAC B 各自构建帧(源A->B, 源B->A),传给各自的PHY。 - PHY A & PHY B:
o 全双工:
PHY A: 接收到数据,立即、无条件地通过 TX A (线对1-2) 发送给B。
PHY B: 接收到数据,立即、无条件地通过 TX B (线对3-6) 发送给A。
两者同时发送,互不干扰! 因为使用的物理线对不同。
o 半双工:
假设两者几乎同时开始侦听:
PHY A 侦听共享线路,初始空闲 -> 准备发送。
PHY B 侦听共享线路,初始空闲 -> 准备发送。
两者几乎同时开始发送:
PHY A 切换到发送模式,开始通过共享线对 (线对1-2) 发送信号。
PHY B 切换到发送模式,开始通过共享线对 (线对1-2) 发送信号。
冲突发生:
信号在共享线对上叠加、畸变。
冲突检测:
PHY A 在发送过程中监听线路,发现接收到的信号与自己发送的预期信号不符 -> 检测到冲突!
PHY B 同样检测到冲突!
冲突处理:
PHY A 和 PHY B 立即停止发送当前帧。
各自向自己的MAC报告冲突发生。
各自发送一个阻塞信号 (Jam Signal) 到共享线对上(确保对方也感知到冲突)。
退避:
MAC A 和 MAC B 收到冲突报告,启动二进制指数退避 (Backoff) 算法。
各自随机等待一段时间后,重新尝试发送(回到CSMA/CD流程)。 - 网线:
o 全双工:
线对1-2 (TX A -> RX B) 承载着A发给B的帧。
线对3-6 (TX B -> RX A) 承载着B发给A的帧。
信号清晰,无干扰。
o 半双工:
共享线对 (线对1-2) 上承载着叠加畸变的冲突信号,随后是Jam信号。 - PHY A & PHY B (接收端):
o 全双工:
PHY B:通过RX B (线对1-2) 正常接收到A发来的清晰帧,解调后送给MAC B。
PHY A:通过RX A (线对3-6) 正常接收到B发来的清晰帧,解调后送给MAC A。
双方都成功、同时收到了对方发来的帧。
o 半双工:
PHY A 和 PHY B 在冲突期间都处于发送模式(试图发送),接收电路效果差。
检测到线路上是冲突/Jam信号,知道不是有效帧,丢弃接收到的信号。
不会向各自的MAC传递任何有效数据。发送失败。
场景2小结 (A和B同时互发):
• 全双工: A->B 和 B->A 的帧同时、独立地在不同的线对上传输,双方都能成功接收对方的数据。吞吐量达到理论最大值(例如100Mbps Full-Duplex 意味着 A->B 100Mbps 同时 B->A 100Mbps)。
• 半双工: 必然发生冲突! A和B的发送尝试都失败,需要退避重试。整个通信通道被浪费,造成延迟。 理论最大吞吐量减半(50%用于发送,50%用于接收,还受冲突影响实际更低),且同一时刻只能有一个方向通信。
结论:
在 MCU A (MAC) - PHY A - 网线 - PHY B - MCU B (MAC) 的点对点直连中:
• 全双工 依靠独立的物理发送和接收通道(网线中的不同线对),实现了真正的、无冲突的、同时的双向通信。节点A发送数据给B的同时,节点B可以毫无阻碍地发送数据给A。PHY的发送和接收电路始终并行工作,带宽利用率达到理论最大值(双向各100%)。这是现代以太网的标准和期望模式。
• 半双工 受限于单一的共享物理通道,迫使通信双方轮流使用线路。它依赖CSMA/CD机制(载波侦听、冲突检测、退避重试)来协调共享介质的访问。这导致:
o 同一时刻只能进行一个方向的通信(A->B 或 B->A)。
o A和B同时尝试发送必然导致冲突,造成通信失败和延迟。
o 带宽利用率低下(理论最大值不超过50%,实际更低)。
o PHY需要在发送和接收状态之间切换。
因此,在设计和配置这种点对点连接时,必须确保两端协商或强制设置为全双工模式,以获得最佳性能和可靠性。半双工模式会严重限制性能并引入不必要的冲突风险。