一、產生差錯的原因
概括來說,傳輸中的差錯都是由於噪聲引起的。
全局性
由於線路本身電氣特性所產生的 隨機噪聲 (熱噪聲),是信道固有的,隨機存在的。
解決辦法:提高信噪比來減少或避免干擾。(對傳感器下手)
局部性
外界特定的短暫原因所造成的 沖擊噪聲 ,是產生差錯的 主要原因 。
解決辦法:通常利用編碼技術來解決。
二、差錯類型
差錯分為兩類:
- 位錯(比特錯)
比特位出錯,1變成0,0變成1 - 幀錯
發送:[#1]-[#2]-[#3]
發生幀錯:- 丟失:收到[#1]-[#3]
- 重復:收到[#1]-[#2]-[#2]-[#3]
- 失序:收到[#1]-[#3]-[(2]
鏈路層為網絡層提供服務:無確認無連接服務,有確認無連接服務,有確認面向連接服務。
通信質量好、有線傳輸鏈路:不使用確認和重傳機制
通信質量差的無線傳輸鏈路:使用確認和重傳機制
三、差錯控制
這里主要討論比特錯(位錯)
冗余編碼
在有效數據(信息位)發送之前,先按某種關系附加上一定的冗余位,構成一個符合某一規則的碼字后再發送。
- 當要發送的有效數據變化時,相應的冗余位也隨之變化,使碼字遵從不變的規則。
- 接收端根據收到碼字是否仍符合原規則,從而判斷是否出錯。
檢錯編碼
檢錯編碼都采用冗余編碼技術。
- 僅能檢查出錯誤,不能糾正錯誤
- 常見的檢錯編碼有奇偶校驗碼和循環冗余碼。
奇偶校驗碼
奇偶校驗碼是奇校驗碼和偶校驗碼的統稱,它由n-1位信息元和1位校驗元組成
奇校驗碼
- 在附加一個校驗元后,碼長為n的碼字中"1"的個數為奇數
偶校驗碼
- 在附加一個校驗元以后,碼長為n的碼字中"1"的個數為偶數
例:
如果一個字符S的ASCI編碼從低到高依次為1100101,采用奇校驗,在下述收到的傳輸后字符中,哪種錯誤不能檢測?
A. 11000011 B. 11001010 C. 11001100 D.11010011
答案:D
奇偶校驗碼特點
- 只能檢查出 奇數個 比特錯誤,檢錯能力為 50% 。
例:11100100 奇校驗:1 11100100
- 1位錯:1 11100101,可以發現
- 2位錯:1 01100101,不能發現
CRC循環冗余碼
循環冗余碼(Cyclic Redundancy Code,CRC)又稱多項式碼。
序列對應多項式
任何一個由二進制數位串組成的代碼都可以與一個只含有0和1兩個系數的多項式建立一一對應關系:
- 一個 k 位幀可以視為從 X k-1 到 X 0 的 k 次多項式的系數序列,這個多項式的階數為 k-1,高位是 X k-1 項的系數,下一位是 X k-2的系數,以此類推。
例:
1110011有7位,表示成多項式是 X 5 +X 4 +X 2 +X+1
多項式 X 6 +X 5 +X 4 +X+1 對應的數位串是 110110
模2除法
類似普通除法,按照模2運算規則,加法不進位,減法不借位,與 按位異或 相同。
計算: 按位異或
幀檢驗序列
給定一個 m bit的幀或報文,發送器生成一個 r bit的序列(位數有規定,即 r 是確定的),稱為幀檢驗序列(FCS)。這樣所形成的幀將由 m+r 比特組成。
判斷差錯
發送方和接收方事先商定一個多項式G(x)(最高位和最低位必須為1),使這個帶檢驗碼的幀剛好能被預先確定的多項式 G(x) 整除。接收方用相同的多項式去除收到的幀,如果無余數,那么認為無差錯。
計算冗余碼
假設一個幀有m位,其對應的多項式為M(x), 多項式 G(x) 的階為 r,則計算冗余碼的步驟如下:
- 加0:在幀的低位端加上 r 個 0,得到被除數。
- 模2除法。利用模2除法,用G(x)對應的數據串去除被除數,得到的余數即為冗余碼(共 r 位,前面的 0 不可省略)。
例:
要發送的數據是1101 0110 11,采用CRC校驗,生成多項式是10011,那么最終發送的數據應該是?
答案:
多項式階數 r = 4,在要發送的數據后添加4個0得到被除數1101 0110 11 0000。用10011除被除數,得到余數1110,則幀檢驗序列(FCS)為1110。最終發送的數據是要發送的原數據拼接上幀檢驗序列,即1101 0110 11 1110。
接收端檢錯
把收到的每一個幀都除以同樣的除數,然后檢查得到的余數。
- 余數為0,判定這個幀沒有差錯,接受。
- 余數為不為0,判定這個幀有差錯(無法確定到位), 丟棄 。
FCS的生成以及接收端CRC檢驗都是 由硬件實現 ,處理很迅速,因此不會耽誤數據的傳輸。
在數據鏈路層僅僅使用循環冗余檢驗CRC差錯檢測技術,只能做到對幀的無差錯接收即“凡是接收端數據鏈路層接受的幀,我們都能以 非常接近於1的概率 認為這些幀在傳輸過程中沒有產生差錯”。接收端丟棄的幀雖然曾收到了,但是最終還是因為有差錯被丟棄。
“凡是接收端數據鏈路層接收的幀均無差錯”。
糾錯編碼
海明碼
海明碼:發現雙比特錯,只能糾正單比特錯。
工作原理:動一發而牽全身
工作流程:
- 確定校驗碼位數r
- 確定校驗碼和數據的位置
- 求出校驗碼的值
- 檢錯並糾錯
確定校驗碼位數r
海明不等式:2 r ≥ k + r + 1
r 為冗余信息位(校驗位),k 為信息位,一共發送 k + r 位。
例:要發送的數據:D = 101101
數據的位數 k = 6,滿足 2 r ≥ k + r + 1 的最小 r 為 4,也就是D = 101101 的海明碼應該有 6 + 4 = 10位,男性英文名其中原數據 6 位,效驗碼 4 位。
確定校驗碼和數據的位置
假設這4位校驗碼分別為 P 1 、P 2 、P 3 、P 4 ;數據從左到右為 D 1 、 D 2 … D 6
校驗碼放在 2 n 的位置,n = 0,1,…
例:要發送的數據:D = 101101,需插入校驗碼 P 1 、P 2 、P 3 、P 4
海明碼:
數據位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
代碼 | P 1 | P 2 | D 1 | P 3 | D 2 | D 3 | D 4 | P 4 | D 5 | D 6 |
值 | 待定 | 待定 | 1 | 待定 | 0 | 1 | 1 | 待定 | 0 | 1 |
求出校驗碼的值
-
求二進制位數
看最后一個數據位數二進制表示是多少位
例:數據 D = 101101,數據位數為10,用二進制表示為1010,一共4位 -
求二進制
將數據位用二進制表示二進制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 代碼 P 1 P 2 D 1 P 3 D 2 D 3 D 4 P 4 D 5 D 6 值 待定 待定 1 待定 0 1 1 待定 0 1 -
校驗分組
P i 校驗二進制第 i 位 為 1 的數據
例:P 1 校驗 D 1 ,D 2 ,D 4 ,D 5二進制 000 1 0010 001 1 0100 010 1 0110 011 1 1000 100 1 1010 代碼 P 1 P 2 D 1 P 3 D 2 D 3 D 4 P 4 D 5 D 6 值 待定 待定 1 待定 0 1 1 待定 0 1 -
確定校驗位的值
校驗位的值為被校驗數據異或運算所得值
例:數據 D = 101101:
P 1 = D 1 ⊕ D 2 ⊕ D 4 ⊕ D 5 = 1 ⊕ 0 ⊕ 1 ⊕ 0 = 0;
P 2 = D 1 ⊕ D 3 ⊕ D 4 ⊕ D 6 = 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0;
P 3 = D 2 ⊕ D 3 ⊕ D 4 = 0 ⊕ 1 ⊕ 1 = 0;
P 4 = D 5 ⊕ D 6 = 0 ⊕ 1 = 1;二進制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 代碼 P 1 P 2 D 1 P 3 D 2 D 3 D 4 P 4 D 5 D 6 值 0 0 1 0 0 1 1 1 0 1 故101101的海明碼為0010011101
檢錯並糾錯
-
計算錯誤位號
對於每個檢錯碼 P i ,與其校驗的數據進行異或運算,得到錯誤位位號的第 i 位(從右往左數,二進制) S i
例:101101 的海明碼為 0010011101。假設第五位出錯,因此接收到的數據位 0010 1 11101。
令所有要校驗的位異或運算。二進制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 代碼 P 1 P 2 D 1 P 3 D 2 D 3 D 4 P 4 D 5 D 6 值 0 0 1 0 1 1 1 1 0 1 S 1 = P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 ⊕ D 5 = 0 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 0 = 1;
S 2 = P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 ⊕ D 6 = 0 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0;
S 3 = P 3 ⊕ D 2 ⊕ D 3 ⊕ D 4 = 0 ⊕ 1 ⊕ 1 ⊕ 1 = 1;
S 4 = P 4 ⊕ D 5 ⊕ D 6 = 1 ⊕ 0 ⊕ 1 = 0;
得到錯誤位為 S 4 S 3 S 2 S 1 = 0101 -
糾錯
若錯誤位號為 0,則說明無錯,否則出錯的位位號即為錯誤位號。
例:101101 的海明碼為 0010011101,第五位出錯。錯誤位為 0101
二進制序列為0101,恰好對應十進制 5,即出錯位是第5位。
習題
1、為了糾正2比特的錯誤,編碼的海明距應該為( )。
A. 2 B. 3 C. 4 D. 5
答案:B
解析:
海明碼"糾錯"d位,需要碼距為 2d+1 的編碼方案;"檢錯"d位,,則只需碼距為 d+1。