发现以太网这个东西真的涉及到太多了,我没有系统地学过网络通信,所以欠缺的东西还很多,越学发现越需要学的更多。这里补充一下以太网数据传输中的几个“校验功能”和mdc,mdio的传输时序配置。
首先说一下我们采取的以太网通信方式以便单独阅读此文章的朋友能够看懂:我们从下到上采用的是以太网V2 MAC帧协议----->IP协议(IPV4版本)------>UDP协议。
FCS(帧检验序列)是在以太网数据帧的尾部的4个字节的序列,而CRC是循环冗余校验码,也就是说FCS是真正位于以太网数据帧里面用于检验数据是否出错的序列,而CRC是一种给出FCS检测序列的检验方法。
FCS检验的原理大概如下:在数据打包完毕之后,我们同时也运用CRC来给出了FCS检验序列随着数据帧一并发给接收端,接收端在接收了这个包之后,会再按照CRC的方法计算一次FCS检验序列,如果这个结果和之前的不一样,那么说明再传输过程中出现了错误,就丢弃这个数据包。
CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
其中模2除法是指普通除法把想减那一步换成按位进行异或计算。如下图:
具体步骤:
- 选择合适的除数
- 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
- 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。
注意这个除数实际上是一个多项式,比如X^3+X+1 这个多项式,作为除数的时候就是1011,常用的CRC码生成多项式如下: