常用校验方式以及优缺点(奇偶校验,CRC校验,校验和)
一、差錯產生的原因
在原始的物理傳輸線路上傳輸數據信號是有差錯的,存在一定的誤碼率,數據鏈路層存在的目的就是給原始二進制位流增加一些控制信息 ,實現如何在有差錯的線路上進行無差錯傳輸
?
信道的電氣特性引起信號幅度,頻率,相位的畸變,信號反射,串擾,閃電,大功率電機的啟停等
?
計算機網絡中出現的差錯是連續的還是離散的差錯?→ 是連續的突發性的差錯
比如傳了一個這樣的位串0001101001,連續的差錯:比如一共出錯了3位,連續的出錯在一起。離散的差錯:一共出錯了3位,不是連續出的,是分散出的
差錯控制的目的:
保證幀正確,按序送交上層(順序要對,不能重復也不能跳幀)。在接收方能夠判斷接收的數據是否正確,若錯誤還可能要恢復錯誤
二、差錯控制的方法
檢錯碼:
數據和冗余位.png
數據設定為M位,冗余位設定為R位,如果位數滿足即認為不出錯,如果位數不滿足即肯定出錯
自動糾錯機制:
糾錯控制主要由接收方做,能檢查出錯并定位到是哪兒出錯了
檢錯反饋重發機制:
接收方通過反饋機制告訴發送方出錯,發送方通過重發的方式恢復差錯
☆自動糾錯比檢錯反饋重發機制代價大,在發生數據丟失的情況下,只是自動糾錯機制無法進行差錯恢復,還是需要檢錯反饋重發機制
碼字(codeword)
一個幀包括m個數據位,r個校驗位(是冗余位,和m位的有效數據是無關的),稱為n位碼字(n=m+r),我們希望r盡量短,并且盡量有一個固定長度
檢錯碼(error-detecting code)
加入了冗余位,使接收方知道有差錯發生,但不知道什么差錯,然后請求重發
糾錯碼(error-correcting code)
加入了足夠多的冗余位,使接收方不僅知道有差錯發生,并知道哪些位發生差錯
海明定理
海明距離
兩個編碼的海明距離:兩個編碼不相同位的個數
例:0000000000與0000011111的海明距離是5
編碼方案的海明距離:編碼方案中任兩個編碼海明距離的最小值
ASCII這樣的連續編碼的海明距離都是1
海明定理
為檢測d位錯,編碼方案的海明距離應至少為d+1
當發生d位錯時,不會由一種合法編碼變為另一種合法編碼,也就是想要由一種合法編碼變為另一種合法編碼,需要d+1以上出錯
對接收方來講,它判定一個編碼是否出錯的唯一依據是這個編碼是否是一個合法的編碼。即使接收方收到了一個合法的編碼,它也無法判斷是否是一個合法編碼,因為它不知道這個合法編碼原本就是合法的,還是出錯以后也依然是一個合法編碼。因此需要海明距離應至少為d+1
三、奇偶校驗碼
在數據鏈路層一般是不用這種檢錯方法的,因為檢錯率太低
?
奇偶校驗碼.png
若接收方收到的字節奇偶結果不正確,就可以知道傳輸中發生了錯誤
增加奇偶校驗位后海明距離由1變為2,因此根據“為檢測d位錯,編碼方案的海明距離應至少為d+1”,可以檢查出一位二進制位的差錯
用這種方法,有一位出錯時,就會由合法編碼(奇校驗時1的個數為奇數,偶校驗時1的個數為偶數)變成一種非合法編碼(奇數校驗時1的個數為偶數,偶校驗時1的個數為奇數)
為糾正d位錯,編碼方案的海明距離應至少為2d+1
當發生d位錯時,出錯編碼仍然最接近于原始的正確編碼
例:現在有一個編碼方案,這個編碼方案之中只有4種合法編碼↓
0000000000
0000011111
1111100000
1111111111
它們之間的海明距離為5,按照定理,能夠糾正2位錯
假設接收方收到了這樣的編碼:0001100000,很明顯這是個非法編碼,怎么樣糾正
呢?我們知道出錯的位數是≤ 2位的,它和第一種的海明距離為2,和第二種為7,和
第三種為3,和第四種為8,離它最近的是第一種編碼。它采用這種就近恢復的原則將
出錯的編碼恢復到原始編碼
四、循環冗余校驗法CRC
數據鏈路層用的最多的一種檢錯方法
但是高層(網絡層,傳輸層)是不用這種檢錯方法的,而用檢驗和的方法
?
循環冗余碼.png
生成多項式G(x)
發方,收方事前約定。這里的約定是數據鏈路層的協議已經定義該協議使用什么生成多項式
生成多項式的高位和低位必須為1
生成多項式必須比傳輸信息對應的多項式短
(現在最多用的是CRC-32,生成多項式是32位,能否保證生成多項式比傳輸的對應的多項式短呢?從原始數據來講保證不了,但是到數據鏈路層時加了傳輸層的頭,網絡層的頭之后肯定能保證大于32位。比如現在的Internet網絡,例如在傳輸層使用TCP加20個字節,在網絡層IP又加了20個字節,已經超過32位了,所以肯定能保證)
理論上來講生成多項式的階越高,檢錯率越高
硬件實現CRC校驗
四個多項式已經成為國際標準
?
四個多項式.png
CRC校驗基本思想
CRC碼(增加的r位冗余位檢錯碼,即校驗和)加在幀尾(效率比較高),使帶CRC碼的幀的多項式能被G(x)除盡:接收方接收時,用G(x)去除它,若有余數,則傳輸出錯
?
※CRC碼計算還有一個好處:
我們希望不管m是多少位的,但是冗余位r是越短越好,而且最好位數是固定的。用這CRC碼的好處就是生成多項式是多少階的,那么最后的余數(冗余位)的位數就是多少位。如果是n階的,那么最后就是4位
循環冗余校驗法檢驗不出來的錯的情況:收到的位串雖然是錯誤的,但是恰巧能被生成多項式整除,這個時候檢測不出來
五、檢驗和
適用于高層協議,如IP,TCP,UDP等
校驗碼放在前面或后面影響都不大,所以絕大多數是放在前面的
檢錯率低于循環冗余校驗法
在↓例子中,如果第1位和第9位同時出錯,或者第2位和第10位同時出錯···出錯,那么它們取反相加的數是不變的,這個時候是檢查不出錯的。但是網絡當中連續突發的錯占絕大部分,這種跳躍性的出錯概率很小,所以檢驗和的檢錯率還是比較高的
高層不用冗余校驗法的原因是,冗余校驗法主要采用除的計算方式,比累加的(校驗和)計算方式效率要低,而數據鏈路層用這種方法可以用硬件實現,但是網絡層和傳輸層一般只能通過軟件實現,那么效率就降低了。而且數據鏈路層已經提供了比較可靠的支持,所以高層就可以用這種檢錯率相對低一點的檢錯法
?
參考:https://www.jianshu.com/p/99b2713d5f05
?
總結
以上是生活随笔為你收集整理的常用校验方式以及优缺点(奇偶校验,CRC校验,校验和)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网软件开发和传统软件开发的不同(转型
- 下一篇: MySQL之desc查看表结构的详细信息