循環冗餘校驗碼(CRC),是一種能力相當強的具有檢錯、糾錯能力的校驗碼,常用於串行傳送的輔助存儲器與主機的數據通信和計算機網絡中
爲什麼要使用CRC?
(在計算機網絡中的應用)
數據在傳輸過程中,可能會產生比特差錯:1可能變爲0, 0可能變爲1,因此爲了保證數據傳輸的可靠性,必須採用各種差錯檢測措施
目前在數據鏈路層中廣泛採用的就是循環冗餘檢驗CRC的檢錯技術
(CRC技術也很容易實現)
CRC碼
CRC碼又稱多項式碼,任何一個二進制數都可以和一個對應的多項式建立一一對應的關係
舉例
1011011對應的多項式爲
解析:對應位上爲1,則加上對應位的x多少次方
比如,以上,第六位爲1(二進制數最右面是第0位),則加上 ;第五位爲0,則不加;第四位爲1,則加上,以此類推
思考
對應的代碼是多少?
答案:110101
模2運算
對應位進行異或操作:相同爲0,不同爲1
CRC原理
CRC運算就是在發送的數據後面加上 r 位冗餘位,構成一個由 k 位信息位,加上 r 位冗餘位組成的 n = k + r 位碼字發出去
也許直接看概念或者原理,可能會不容易理解,所以這裏直接給出例題進行講解
例題:
當我們要發送一幀數據時,要發送的數據爲101110。採用CRC 生成多項式是。試求應添加在數據後面的餘數
- 每組比特數 k = 6(因爲數據101110有6位)
- 除數 = 1001,n = 3(因爲根據得出對應二進制爲1001,最高次冪爲3,所以n = 3)
- 先進行移位,得被除數 = 101110000(就是將要發送的數據後面補 n 個0)
- 求餘:進行模二除法,得餘數 = 011(求餘過程如下)
圖中可以看到,最後的餘數爲 011
所以當我們發送數據的時候,就可以將此餘數添加到要發送的數據後面,也就是 101110011,這就是編碼後的CRC碼,我們將其發送即可
當碼字到達接收端時
- 若CRC碼在接收端能被除數 1001 整除,則說明接收正確
- 若CRC碼不能被除數整除,則檢測到出錯
循環冗餘校驗碼的檢錯能力:
- 可檢測出所有奇數位錯
- 可檢測出所有雙比特的錯
- 可檢測出所有小於、等於校驗位長度的突發錯
總結
採用CRC時,需要約定一個生成多項式(除數)
發送方:信息位 + 冗餘位 = 發送碼字 (冗餘位就是上面例題中求的餘數)
接收方:用收到的CRC碼字除以生成多項式(除數),判斷餘數是否爲0
- 爲0:接收正確,接收數據幀
- 不爲0:接收有錯,丟棄數據幀