循環冗余檢測(CRC)
鏈路層通常會具有差錯檢測的功能,使用的方法是發送方 在數據字段D 后加上EDC字段,在接收方會檢驗EDC字段來查看D是否出錯。而如今廣泛應用的計數就是 循環冗余檢測(CRC)。
我們考慮d bit的數據D,發送結點要將它發送給接受結點。
詳解
發送方
- 發送方首先與接收方協商一個 r+1 bit的數字當除數,這個數字成為生成多項式,記為G——可以隨機選擇,也可按國際上通行的標准選擇,但最高位和最低位必須均為“1”;
- 生成多項式,若它給你的為 P(x) = x3+1,那么G = 1001
- 在數據M后面添加供差錯檢測的 r 位冗余碼,然后構成一幀發送出去,一共發送(d+r)位;
- 雖然添加n位冗余碼增大了數據傳送的開銷,但是可以進行差錯檢測,當傳輸可能出現差錯時,付出這種代價是值得的。
- 冗余碼計算:
- 用二進制模2運算進行D * 2r(相當於D左移r位)的運算。意思就是在D后面補r個0。現在D就變成了d+r位;
- 用M除以收發雙方事先商定的長度為r+1的除數G;
- 得到的余數R,這個R就是FCS(幀檢驗序列)。將這個FCS序列加到M上然后發出去。
接收方
- 在接受端把接受到的數據以幀為單位進行CRC校驗 ;
- 把收到的每一個幀都除以同樣的除數G,然后檢查余數R;
- 如果余數R為0,如果在傳輸過程中沒有差錯;
- 如果出現誤碼,那么余數R為零的概率是非常小的。
例子
D=101001 G=1101 r=3。
在發送端:
- M=D * 2r ;
則:M=101001000; - 用M除以P
- 得到余數R也就是FCS,將FCS加到M上,就得到了要發送的幀。
D=101001000+FCS=101001001
在接收端:
接收到的每一幀都要進行差錯檢驗,假設收到101001001,P=1101。
最后余數R=0,則判定這個幀沒有出錯。