以太网帧校验序列始终附加到数据链路层中帧的末尾。为什么它被附加到帧的末尾而不是其他地方?
我考虑了一下,认为它可能与如何计算例如CRC校验和有关,如果帧的结构是header+payload+crc而不是header+crc+payload,那么硬件更容易执行。
CRC 执行(数据+填充)/除数形式的异或除法,对于最后一帧,填充被余数替换。然后接收器计算(数据+余数)/除数,如果结果为 0,则接受该帧。
以太网帧校验序列始终附加到数据链路层中帧的末尾。为什么它被附加到帧的末尾而不是其他地方?
我考虑了一下,认为它可能与如何计算例如CRC校验和有关,如果帧的结构是header+payload+crc而不是header+crc+payload,那么硬件更容易执行。
CRC 执行(数据+填充)/除数形式的异或除法,对于最后一帧,填充被余数替换。然后接收器计算(数据+余数)/除数,如果结果为 0,则接受该帧。
你是对的:将 CRC 放在帧的末尾可以减少数据包延迟并减少硬件缓冲要求。在发送端,硬件可以立即读取和发送帧的字节。发送器在数据通过时即时计算 CRC,然后简单地将 CRC 附加到帧的尾部。
考虑 CRC 出现在以太网报头某处的替代方案。硬件必须读取并存储整个帧才能计算 CRC。这相当于一个大的前瞻操作,并显着增加了传输延迟和硬件成本。对于接收方来说,情况也变得更加复杂。
事实上,这个位置与 CRC 的含义有很大关系:多项式除法。如果将 CRC 余数移动到有效负载比特流的前面,您将使某些 CRC 属性无效,例如突发错误检测。
理解这一点的关键是这样一个事实,即 CRC 始终在位流上运行,而不是字节或有效负载块。有时您会发现错误的 CRC 实现,其中位以小端方式传输,但实际上 CRC 是按大端方式计算的(根据单个字节内的位顺序)。