CRC校驗

網上關於CRC校驗的文章已經有不少了,但是我總覺得有些繁瑣,其實對於大部分人只需要瞭解CRC是做什麼的,原理是什麼即可。因此,我想用盡量簡短的篇幅來向大家介紹CRC。

關於CRC,我只介紹以下幾點:

  1. 用來做什麼的
  2. 基本的原理
  3. 給出實例來幫助大家理解,畢竟光講一堆原理太抽象。

CRC是用來做什麼的?

最常見的用途就是差錯檢測。一般在計算機網絡的書籍都會講述CRC,其實說白了就是現實的網絡十分複雜,從一個主機傳輸數據到另一臺主機,怎麼知道數據完整到達了或者還是丟失了?

通過CRC檢驗就可以看數據是否出現差錯了還是丟失了還是完整無錯達到了!它本質上就是一種檢測機制。就像工廠裏面的工人對產品進行檢測看產品的質量如何。

CRC的基本原理

CRC(Cylic Redundancy Check)即循環冗餘檢驗。它要求在發送端將需要發送的數據加上一個數(這個數不是隨便的,必須遵循一定規則),一塊發送到接收端,當接收端收到數據+附加數時,接收者對這些數據進行“去餘”處理(也就已經能整除了),如果結果沒有餘數,說明數據無錯。如果有餘數,則表明該數據在傳輸過程中出現了差錯。

下面,我們來仔細講一講如何附加數,以及接收端如何檢測數據是否無錯誤。

首先要知道的是,發送的數據都是二進制形式的,也就是非0即1,因此這個附加數也是二進制數字,具體來說,對於一組數據,比如是k個比特,需要添加n個比特(也叫冗餘碼),這樣子我們需要將這k + n個比特位發送出去,以用來接收端進行差錯檢測。

那麼問題來了,這k + n個數如何獲得?k 位好說就是要發送的數據,這個n位是怎麼來的?方法如下:

  1. 假設原來的k個比特位數據爲M,將M * 2^n,也就是在M後面多加n個0,比如 101 * 2^2也就是 10100
  2. 將M * 2^n 這個數除以一個數P,注意這個P是n + 1位數字,得到餘數 Q
  3. 將這個餘數Q(冗餘碼)附加在數據M後發送出去即可

這種爲了檢錯而添加的冗餘碼有一個專用術語,名叫幀檢驗序列(Frame Check Seqence),這個沒什麼好說的,知道就行。

實例

說了這麼多了,可能大家還是不明白具體是怎麼做的,沒事,我們來看一個實例,結合實例理解上面的三個步驟:

假設我們需要傳輸的數據爲M = 101001,其中 k = 6,發送端和接收端約定除數 P = 1101,n = 3(P是n + 1位比特), 那麼如何求取這個餘數Q呢?也就是冗餘碼

M * 2^n 就是 101001 000, P爲1101

這裏寫圖片描述

求解Q的過程是如上圖,在這裏需要說明的是:

求餘數的過程類似於我們小學學的短除法,不過不同的是,這裏使用的是模二除法,我自己理解的就是異或運算,同時也採用模二減法具體來說就是:

  1. 對於商,如何判斷是該上1還是0?我教大家一個簡單的辦法:只看第一位,比如第一次,需要除的是1101,但是被除數是1010,1010 - 1101 第一位是夠減的於是上1;在中間的時候,出現了0111,需要除的數是1101,此時根據第一位,0111 - 1101是不夠的於是上0,其他依此類推

  2. 餘數位數必須爲n位,也就是比除數少一位,可以在前面補0

  3. 減法,直接採用異或運算即可(第一位0要省去)

1010
1101
結果爲0111

0110
0000
結果爲0110

因此發送端只需要發送原來的M = 101001 + 餘數Q(001)即可,也就是101 001 001。而在接收端只需要將這個數據除P(1101)看看餘數是否爲0

對於接收端有兩種情況:

  1. 餘數爲0,則數據無錯,直接接收
  2. 餘數不爲0,說明有錯,但是無法判斷具體哪一位或者哪幾位有錯,直接丟棄

另外,還有一種用多項式來表示循環冗餘校驗的,比如 P(x) = x^3 + x^2 +1,其實除數就是 1101,最高爲對應x^3,最低位對應x^0。


這裏寫圖片描述

發佈了96 篇原創文章 · 獲贊 119 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章