當前位置:編程學習大全網 - 源碼下載 - 數據鏈路層的差錯的檢測和恢復(奇偶校驗碼,CRC校驗,校驗和),各種運算

數據鏈路層的差錯的檢測和恢復(奇偶校驗碼,CRC校驗,校驗和),各種運算

在原始的物理傳輸線路上傳輸數據信號是有差錯的,存在壹定的誤碼率,數據鏈路層存在的目的就是給原始二進制位流增加壹些控制信息 ,實現如何在有差錯的線路上進行無差錯傳輸

數據設定為M位,冗余位設定為R位,如果位數滿足即認為不出錯,如果位數不滿足即肯定出錯

差錯產生的原因

信道的電氣特性引起信號幅度,頻率,相位的畸變,信號反射,串擾,閃電,大功率電機的啟停等

計算機網絡中出現的差錯是連續的還是離散的差錯? → 是連續的突發性的差錯

比如傳了壹個這樣的位串0001101001,連續的差錯:比如壹***出錯了3位,連續的出錯在壹起。離散的差錯:壹***出錯了3位,不是連續出的,是分散出的

保證幀正確,按序送交上層(順序要對,不能重復也不能跳幀)。在接收方能夠判斷接收的數據是否正確,若錯誤還可能要恢復錯誤

糾錯控制主要由接收方做,能檢查出錯並定位到是哪兒出錯了

接收方通過反饋機制告訴發送方出錯,發送方通過重發的方式恢復差錯

☆自動糾錯比檢錯反饋重發機制代價大,在發生數據丟失的情況下,只是自動糾錯機制無法進行差錯恢復,還是需要檢錯反饋重發機制

壹個幀包括m個數據位,r個校驗位(是冗余位,和m位的有效數據是無關的),稱為n位碼字(n=m+r),我們希望r盡量短,並且盡量有壹個固定長度

加入了冗余位,使接收方知道有差錯發生,但不知道什麽差錯,然後請求重發

加入了足夠多的冗余位,使接收方不僅知道有差錯發生,並知道哪些位發生差錯

兩個編碼的海明距離: 兩個編碼不相同位的個數

例:0000000000與0000011111的海明距離是5

編碼方案的海明距離: 編碼方案中任兩個編碼海明距離的最小值

ASCII這樣的連續編碼的海明距離都是1

為檢測d位錯,編碼方案的海明距離應至少為d+1

當發生d位錯時,不會由壹種合法編碼變為另壹種合法編碼,也就是想要由壹種合法編碼變為另壹種合法編碼,需要d+1以上出錯

對接收方來講,它判定壹個編碼是否出錯的唯壹依據是這個編碼是否是壹個合法的編碼。即使接收方收到了壹個合法的編碼,它也無法判斷是否是壹個合法編碼,因為它不知道這個合法編碼原本就是合法的,還是出錯以後也依然是壹個合法編碼。因此需要海明距離應至少為d+1

在數據鏈路層壹般是不用這種檢錯方法的,因為檢錯率太低

若接收方收到的字節奇偶結果不正確,就可以知道傳輸中發生了錯誤

增加奇偶校驗位後海明距離由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,離它最近的是第壹種編碼。它采用這種就近恢復的原則將

出錯的編碼恢復到原始編碼

數據鏈路層用的最多的壹種檢錯方法

但是高層(網絡層,傳輸層)是不用這種檢錯方法的,而用檢驗和的方法

生成多項式G(x)

發方,收方事前約定。這裏的約定是數據鏈路層的協議已經定義該協議使用什麽生成多項式

生成多項式的高位和低位必須為1

生成多項式必須比傳輸信息對應的多項式短

(現在最多用的是CRC-32,生成多項式是32位,能否保證生成多項式比傳輸的對應的多項式短呢?從原始數據來講保證不了,但是到數據鏈路層時加了傳輸層的頭,網絡層的頭之後肯定能保證大於32位。比如現在的Internet網絡,例如在傳輸層使用TCP加20個字節,在網絡層IP又加了20個字節,已經超過32位了,所以肯定能保證)

理論上來講生成多項式的階越高,檢錯率越高

硬件實現CRC校驗

四個多項式已經成為國際標準

CRC碼(增加的r位冗余位檢錯碼,即校驗和)加在幀尾(效率比較高),使帶CRC碼的幀的多項式能被G(x)除盡:接收方接收時,用G(x)去除它,若有余數,則傳輸出錯

? 模2加法運算定義為:(對應於邏輯異或)

0+0=0 0+1=1 1+0=1 1+1=0

例如0101+0011=0110

? 模2減法運算定義為:(對應於邏輯異或)

0-0=0 0-1=1 1-0=1 1-1=0

例如0110-0011=0101

? 模2乘法運算定義為:

0x0=0 0x1=0 1x0=0 1x1=1

? 模2除法運算定義為:

0 ÷1=0 1÷1=1

利用模2減求余數,余數最高位為1,則商1,否則商0,每商1位則余數減少1位,

直到余數位數少於除數位數

按位與運算:

按位與運算符”&”是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現

例如: 9 & 5

00001001(9的二進制補碼)

&

00000101 (5的二進制補碼)

00000001

可見9 & 5 =1

最高位作為符號位,若符號位為0,則表示正數,若符號位為1,則表示負數

其余各位代表數值本身的絕對值(以二進制表示)

絕對值相同的正數和負數,它們除了符號位不同外,其他各位都相同

壹個數如果值為正,則它的反碼與原碼相同

壹個數如果值為負,則將其符號位置為1,其余各位為對原碼相應數據位取反

(取反:二進制中有0和1兩種狀態,取反就是取與當前狀態相反的狀態,1取反等於0,0取反等於1)

正數的補碼與反碼,原碼相同

負數的補碼則將其最高位置為1,其余各位為對原碼的相應數據位取反,再對整個數加1

即 X為負數時,X補 = X反+1

(+0)補 = 00000000

(-0)反 = 11111111

(-0)補 = 11111111 + 1 = 100000000→進位1舍去→00000000

假設用壹個字節表示壹個數,補碼的表示範圍為:-128 ----- +127

用反碼表示的最小值為:-128,其反碼為:10000000

用反碼表示的最大值為:+127,其反碼為:01111111

按位或運算符”|”是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的兩個二進位有壹個為1時,結果位就為1.參與運算的兩個數均以補碼出現

例如:9|5

00001001

| 00000101

00001101(十進制為13)

可見9|5=13

~為單目運算符,具有右結合性。其功能是對參與運算的數的各二進位按位求反

例如:~9

~(0000000000001001)結果為:1111111111110110

按位異或運算符” ^ ”是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或。當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現

例如:9^5

00001001

^ 00000101

00001100(十進制為12)

左移運算符” << ”是雙目運算符。其功能是把 ” << ”左邊的運算數的各二進位全部左移若幹位,由” << ”右邊的數指定移動的位數,高位丟棄,低位補0

例如:a=00000011(十進制3),a << 4,結果為:00110000(十進制48)

右移運算符” >> ”是雙目運算符。其功能是把” >> ”左邊的運算數的各二進制全部右移若幹位,” >> ”右邊的數指定移動的位數

例如:a=15(00001111),a >>2,結果為00000011(十進制3)

計算方法例:

※CRC碼計算還有壹個好處:

我們希望不管m是多少位的,但是冗余位r是越短越好,而且最好位數是固定的。用這CRC碼的好處就是生成多項式是多少階的,那麽最後的余數(冗余位)的位數就是多少位。如果是n階的,那麽最後就是4位

循環冗余校驗法檢驗不出來的錯的情況:收到的位串雖然是錯誤的,但是恰巧能被生成多項式整除,這個時候檢測不出來

適用於高層協議,如IP,TCP,UDP等

校驗碼放在前面或後面影響都不大,所以絕大多數是放在前面的

檢錯率低於循環冗余校驗法

在↓例子中,如果第1位和第9位同時出錯,或者第2位和第10位同時出錯···出錯,那麽它們取反相加的數是不變的,這個時候是檢查不出錯的。但是網絡當中連續突發的錯占絕大部分,這種跳躍性的出錯概率很小,所以檢驗和的檢錯率還是比較高的

高層不用冗余校驗法的原因是,冗余校驗法主要采用除的計算方式,比累加的(校驗和)計算方式效率要低,而數據鏈路層用這種方法可以用硬件實現,但是網絡層和傳輸層壹般只能通過軟件實現,那麽效率就降低了。而且數據鏈路層已經提供了比較可靠的支持,所以高層就可以用這種檢錯率相對低壹點的檢錯法

檢驗字段初值置0,數據拆分成與檢驗字段等長的分片,不足部分補0,將所有分片逐位取反,並連續累加,丟棄最高進位,計算結果置於檢驗字段。接收端執行相同的過程(分段處理,取反累加,把累加出的校驗和與校驗碼字段當中保存的校驗和進行比對,如果是完全壹致就沒錯),並將計算結果和傳輸過來的檢驗和進行比較以確定是數據是否出現差錯

  • 上一篇:繼承viewgroup重寫onmeasure怎麽寫
  • 下一篇:C++課程設計題~高分求助...(單位員工信息管理)
  • copyright 2024編程學習大全網