CRC32的C语言源代码。
static uint32_t crc32(uint8_t *buf, int len)
{
int i, j;
uint32_t crc, mask;
crc = 0xFFFFFFFF;
for (i = 0; i < len; i++) {
crc = crc ^ (uint32_t)buf[i];
for (j = 7; j >= 0; j--) { // Do eight times.
mask = -(crc & 1);
crc = (crc >> 1) ^ (0xEDB88320 & mask);
}
}
return ~crc;
}
差错控制
传输过程中可能会出现’`比特差错’:1可能变为0,0也可能变为1.
在一段时间内,传输错误的比特占所传输比特总数的比率被称为误码率 BER
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
通过循环冗余检验(CRC)来进行差错检测,得到FCS(帧检验序列)
循环冗余校验的计算过程
CRC差错检测技术
仅用循环冗余校验CRC差错检测技术只能做到无差错接受。
“无差错接受”是指:“凡是接受的帧,我们都能以接近于1的概率认为这些帧 在传输过程中没有产生差错”,也就是说:“凡是接收端数据链路层接受的帧都没有传输差错(有传输差错的帧就直接丢弃了)”
要想做到可靠传输就必须加上确认和重传机制。考虑:帧重复、帧丢失、帧乱序的情况。
可以说CRC是一种无比特差错,而不是无传输差错的监测机制。