以太网的 CSMA/CA 变体处理由于重复碰撞而导致的过多传输失败丢弃当前帧并依靠上层进行重传:
16 次尝试后,B 站将重置其碰撞计数器,使其能够再次更加积极地竞争。但它也会丢弃它试图传输的帧,要求软件重新排队等待传输。
我意识到在现代(即交换)以太网上,不再使用 CSMA/CA,并且不会发生源中提到的通道捕获效应,但我试图理解所实现的网络层分离和交互在这种情况下由 Linux 内核执行。
在 Linux 上,这些重传是在哪一层处理的?是否会在 IP 层完成,还是丢弃的以太网帧也会导致丢弃网络层数据包以及丢弃 TCP 段或 UDP 数据报?
两种方法之间的区别似乎在于,在第二种情况下,过度重试将被解释为拥塞并导致 TCP 拥塞窗口大小减小。是否会发生这种情况,或者丢弃的帧对 TCP 来说是透明的?
答案1
IP 不提供传送保证,事实上,许多构建在 IP 之上的协议(可能最著名的是 UDP)也不提供此类保证。
TCP/IP 中的传送保证由 TCP 处理。TCP 可以在保证传送协议上工作,但其设计方式并不需要它。如果底层协议不保证传送,则 TCP 会保证传送。
因此,在 TCP/IP 的正常情况下,丢失的以太网帧会导致丢失或损坏的 IP 数据包,而 IP 数据包又会转换为丢失或损坏的 TCP 或 UDP 数据包。如果是 TCP(或其他提供传送保证的协议),则 TCP 负责检测故障并重试传输。
这与操作系统或 IP 堆栈实现无关,因为它涉及协议本身。任何不检测较低级别(IP 或更低级别)传输故障的 TCP 实现都违反了规范。
另请注意,彻底的冲突只是数据包损坏或损坏的一种方式,而 TCP 无法阻止且只能检测(并做出反应)。 IP 也可以在非以太网运营商上工作;看RFC 1149举个例子。