引用https://blog.csdn.net/wenqiang1208/article/details/71641414
為什么引入CRC
現實的通信鏈路都不會是理想的。這就是說,比特在傳輸的過程中可能會產生差錯:1可能會變成0,0可能會變成1,這就叫做比特差錯。在一段是時間內,傳輸錯誤的比特占所傳輸比特總數的比率成為誤碼率BER(Bit Error Rate)。誤碼率與信噪比有很大的關系,在實際通信中不可能使誤碼率下降到零。
因此,為了保證數據傳輸的可靠性,在計算機網絡傳輸數據時,必須采用各種差錯檢測措施。
目前在數據鏈路層廣泛使用了循環冗余檢測CRC的檢測技術
CRC的原理
CRC運算實際上就是在數據長為k的后面添加供差錯檢測用的n位冗余碼,然后構成幀k+n位發送出去。
首先來介紹幾個概念
(1)模2運算:實際上是按位異或運算,即相同為0,相異為1,也就是不考慮進位、借位的二進制加減運算。如:1111+1010 = 0101
(2)FCS:其實就是冗余碼,幀檢驗序列(Frame Check Sequence)
(3)生成多項式:其實就是除數,比如下面將要用到的除數p = 1101
計算n位冗余碼
現假定待傳輸的數據M = 101001(k = 6),除數p = 1101 (n = 3)比n多一位
這n位冗余碼可以用下面的方法得出。
(1)用二進制的模2運算進行(2^n)乘M的運算,相當於在M后面添加n個0。
即M后面添加3個0
(2)現在得到M = 101001000(k+n = 9)位的數除以除數p(n = 3)位,
得到商是Q(不關心),余數R =001(n位)R就是冗余碼FCS
現在加上FCS后發送的幀是101001001
在接收端把接收到的數據M = 101001001以幀為單位進行CRC檢驗:把收到的每一個幀都除以相同的除數p(模2運算),然后檢查得到的余數R。
如果在傳輸過程中沒有差錯,那么經過檢驗后得到余數R肯定是0。
(讀者可以自己檢驗下,被除數現在是M = 101001001,除數P= 1101,看余數是否為0)
總之,在接收端對接收到的每一個幀經過CRC檢驗后,有兩種情況:
(1)余數R = 0,則判斷這個幀沒有問題,就接受
(2)余數R != 0,則判斷這個幀有差錯,就丟棄。
總結一下:
在數據鏈路層若僅僅使用CRC差錯檢驗技術,則只能做到對幀的無差錯接收。