1. 程式人生 > >迴圈冗餘校驗檢錯方案(CRC)

迴圈冗餘校驗檢錯方案(CRC)

1、crc校驗原理 crc校驗的根本思想就是在要傳送的幀後面附加一個二進位制序列,生成一個新幀傳送給接收端。當然,這個附加的數不是隨意的,它要使生成的新幀能與傳送端和接收端共同選定的某個特定數整除,需要注意的是,這裡不是採用的二進位制除法,而是採用“模2除法”。到達接收端後,再把接收到的新幀除以(模2除)這個選定的除數。因為在傳送端已經通過附加一個數做了去餘處理,故得出的結果應該沒有餘數。如果出現了餘數,則說明在傳輸的過程中出現了差錯。 【說明】“模2除法”和“算數除法”類似,但它既不向上借位,也不比較除數與被除數相同位的數的大小,只要以相同的位數整除即可。模2加法運算:1+1=0, 1+0=1, 0+0=0,無進位,也無借位。模2減法運算:1-1=0, 1-0=1, 0-1=1, 0-0=0,無進位,也無借位。這兩種運算相當於邏輯運算中的異或運算。如100101除以1110,結果得到商為110,餘數為1。 具體來說,crc校驗主要分為一下幾個步驟: 1)先選擇(可以隨機選擇,也可以按照標準選擇)一個用於在接收端進行校驗時,對接收的幀進行除法運算的除數(是二進位制位元串,通常以多項式表達,所以crc又稱多項式編碼方法,這個多項式也稱為“生成多項式”)。 2)假定所選的資料幀為k位,然後在要傳送的資料幀(假定m位)的後面補上k-1位“0”,然後用這個新幀(一共m+k-1位)以“模2除法”的方式除以上面這個除數,所得到的餘數(也是二進位制位元序列)就是該幀的crc校驗碼,也稱之為FCS(幀校驗序列)。但要注意的是,餘數的位數一定要只比除數的位數少一位,哪怕前面位是0,甚至全位0時都不能省略。
3)再把這個校驗碼附在原資料幀(就是m位的幀,不是生成的m+k-1位的幀)的後面,構建一個新幀傳送給接收端;最後再在接收端再把這個新幀以“模2除法”的方式除以前面選擇的除數,如果沒有餘數,則表明該幀在傳輸的過程中沒有出錯,否則出現了差錯。 從上面可以看出,CRC校驗中有兩個關鍵點:一是要確定一個傳送端可以接收端都用來作為除數的二進位制位元串(或多項式),二是把原始幀與上面選定的除數進行二進位制“模2除法”運算,計算出FCS,前者可以隨機選擇,也可以按照國際上通行的標準選擇,但是最高位和最低位必須均為“1”。如在IBM的SDLC(同步資料鏈路控制)規程中是用的CRC-16生成多項式g(x) = x^16 + x^15 + x^2 + 1(對應二進位制位元串位:11000000000000101
);而在ISO HDLC(高階資料鏈路控制)規程、ITU的SDLC、X.25、V.34、V.41、V.42等中是用CCITT-16生成多項式g(x) = x^16 + x^15 + x^5 + 1(對應二進位制位元串為:11000000000100001)。 2、crc校驗碼的計算示例 現假設選擇CRC生成多項式位g(x) =  x^4 + x^3 + 1,要求求出二進位制序列10110011的CRC校驗碼。 1)根據生成多項式可以得到二進位制位元序列除數位11001。 2)因為生成多項式的位數為5,得知CRC校驗碼的位數為4,所以在原始幀後面新增4個0,得到101100110000,然後把這個數以“模2除法”的方式除以生成多項式,得到餘數(CRC校驗碼)位0100
,計算過程如下:
3)把上面計算出來的校驗碼0100替換幀101100110000後面的四個0,得到新幀101100110100,再把這個幀傳送給接收端。 4)當接收端收到這個新幀後,會以“模2除法”的方式除以上面選定的除數11001,驗證餘數是否為0,如果為0,則說明上述幀在傳輸的過程中沒有發生差錯,否則出現了差錯。