1.1 什么是CRC校驗?
CRC即循環冗余校驗碼:是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,並將得到的結果附在幀的后面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性。
1.2.1 CRC校驗原理
其根本思想就是先在要發送的幀后面附加一個數(這個就是用來校驗的校驗碼,但要注意,這里的數也是二進制序列的,下同),生成一個新幀發送給接收端。當然,這個附加的數不是隨意的,它要使所生成的新幀能與發送端和接收端共同選定的某個特定數整除(注意,這里不是直接采用二進制除法,而是采用一種稱之為“模2除法”)。到達接收端后,再把接收到的新幀除以(同樣采用“模2除法”)這個選定的除數。因為在發送端發送數據幀之前就已通過附加一個數,做了“去余”處理(也就已經能整除了),所以結果應該是沒有余數。如果有余數,則表明該幀在傳輸過程中出現了差錯。
1.2.2 CRC原理介紹
1.2.2.1發送端
①在發送端先將數據分組,每組k個數據。假定要傳送的數據是M。
②在數據M后面添加供差錯檢測的n位冗余碼,然后構成一幀發送出去,一共發送(k+n)位。 雖然添加n位冗余碼增大了數據傳送的開銷,但是可以進行差錯檢測,當傳輸可能出現差錯時,付出這種代價是值得的。
③冗余碼可以用下面的方法得出:
A、用二進制模2運算進行2^n*M(相當於M左移n位)的運算。意思就是在M后面補n個0。現在M就變成了k+n位。
B、用M除以收發雙方事先商定的長度為n+1的除數P。
C、得到的余數R,這個R就是FCS(幀檢驗序列)。將這個FCS序列加到M上然后發出去。
1.2.2.2接受端
A、在接受端把接受到的數據以幀為單位進行CRC校驗
B、把收到的每一個幀都除以同樣的除數P,然后檢查余數R。
C、如果余數R為0,如果在傳輸過程中沒有差錯。
D、如果出現誤碼,那么余數R為零的概率是非常小的。
總結:在接收端對接收到的每一幀進行CRC檢驗后,若余數R為,則表示這個幀沒有錯,就接受。若R不為0,則判定這個幀出錯,就丟棄。
1.3 模2除法
模2除法與算術除法類似,但每一位除的結果不影響其它位,即不向上一位借位,所以實際上就是異或。在循環冗余校驗碼(CRC)的計算中有應用到模2除法。
例:M=101001,P=1101,n=3。
在發送端:
①M=(2^n*M);
則:M=101001000
②用M除以P
③得到余數R也就是FCS,將FCS加到M上,就得到了要發送的幀。
M=101001000+FCS=101001001
1.4 CRC校驗碼計算示例
現假設選擇的CRC生成多項式為G(X) = X4 + X3 + 1,要求出二進制序列10110011的CRC校驗碼。下面是具體的計算過程:
①將多項式轉化為二進制序列,由G(X) = X4 + X3 + 1可知二進制一種有五位,第4位、第三位和第零位分別為1,則序列為11001
②多項式的位數位5,則在數據幀的后面加上5-1位0(除數是n位,就加n-1個0),數據幀變為101100110000,然后使用模2除法除以除數11001,得到余數。
③將計算出來的CRC校驗碼添加在原始幀的后面,真正的數據幀為101100110100,再把這個數據幀發送到接收端。
④接收端收到數據幀后,用上面選定的除數,用模2除法除去,驗證余數是否為0,如果為0,則說明數據幀沒有出錯。
參考文獻:
[3GPP TS 38.212] R15
https://blog.csdn.net/d_leo/article/details/73572373
https://blog.csdn.net/xinyuan510214/article/details/80104356