網絡原理考點之差錯編碼

如題2019年4月

又如2019年10月

其實這些考點都是很有用的,代表了網絡的思想。 

還是那句話,這些詞看着挺熟悉,但具體什麼意思,還真一時想不起來……。

檢錯重發:典型差錯控制方式,發送端對發送數據進行差錯編碼,傳輸後,接收端利用差錯編碼檢錯,對於出錯的數據,要求發送端重發。單片機項目中用的CRC、校驗和等都是這種方式。對應的網絡停等、滑動窗口協議都是這種方式。

檢錯丟棄:出錯後,直接丟棄。適用於容許一定比例差錯存在,只適用於實時性要求較高的系統。

反饋校驗:接收端將收到數據原封不對返回,很簡單的檢錯方法,傳輸效率低、實時性差。

前向糾錯:差錯糾正,接收方利用糾錯碼進行糾錯。前向:指對接收的數據向前檢查哪一個出錯,並糾正。

所謂差錯控制都是指  檢錯後的處理方式。如何檢錯沒說。上面兩題答案不說了,自己看!

如何檢錯?其實就是CRC、奇偶校驗、漢明碼這些,詳見2019-9-20《軟考考點筆記之校驗碼》

軟考這篇筆記,沒有記錄漢明碼,因爲之前作爲新奇的東西,記在了本子上面,現在越來越覺得,本子查看不是很方便!以個網上例子再總結一下。記不住也沒什麼,再看一遍就是了,但總要有個印象吧,以後再遇到同樣的問題時能知道個方向,這就是夯實基礎的意義,也是自考專業另一層意義,再說應用其實是小菜了。

海明碼:

下面本例以1010110爲例進行海明碼編碼。

第一步先確定需要多少位校驗碼;

設數據有n位,校驗碼有x位。則校驗碼一共有2^x種取值方式。其中需要一種取值方式表示數據正確,剩下(2^x)−1種取值方式表示有一位數據出錯。因爲編碼後的二進制串有n+x位,都可能出錯,因此x應該滿足:(2^x)−1≥n+x;軟考其實就是考這個公式。
使不等式成立的x的最小值就是校驗碼的位數。在本例中,n=7,解得x=4。


第二步,確定校驗碼的位置

校驗碼在二進制串中的位置爲2的整數冪,即1、2、4、8、16……..剩下的位置是信息碼,綠色爲校驗位:

這裏寫圖片描述

本例的校驗碼位置如下圖:要具體分析是大端還是小端,這個表是小端,所以只是借鑑思路,沒有問題。

這裏寫圖片描述

 

第三步,計算校驗位的值

由於奇偶校驗原理一樣,偶校驗的計算更爲簡單,實際中多用偶校驗,本例中也以偶校驗進行計算。

這裏寫圖片描述

如圖中:
第一行中每個X跳過1位;第一行所有的X值進行異或是0;第一行的X對應的數據位位置轉化爲二進制最後一位都是1,即是xxx1這種形式;
第二行中每2個X跳過2位;第二行所有的X值進行異或是0;第二行的X對應的數據位位置轉化爲二進制倒數第二位一位都是,即是xx1x這種形式;
第三行中每4個X跳過4位;第三行所有的X值進行異或是0;第三行的X對應的數據位位置轉化爲二進制倒數第三位一位都是1,即是x1xx這種形式;
第四行中每8個X跳過8位;第四行所有的X值進行異或是0;第四行的X對應的數據位位置轉化爲二進制倒數第四位一位都是1,即是1xxx這種形式;
……..
每一行都是從對應的校驗位開始校驗,即從第(2^n)/2位開始校驗,校驗(2^n)/2個,然後跳過(2^n)/2個
下面計算本例子,將表格中的位置用二進制表示:

這裏寫圖片描述

x1的計算:
x1是第一個校驗碼,位置對應欄所有最後一位爲1(xxx1格式)的相異或爲0,即

這裏寫圖片描述

x1⊕1⊕0⊕0⊕1⊕0=0;則x1=0;

x2計算:
x2是第二個校驗碼,位置對應欄所有倒數第二位爲1(xx1x格式)的相異或爲0,即

這裏寫圖片描述

 

x2⊕1⊕1⊕0⊕1⊕0=0;則x2=1;

x3計算:
x3是第三個校驗碼,位置對應欄所有倒數第三位爲1(x1xx格式)的相異或爲0,即

這裏寫圖片描述

 x3⊕0⊕1⊕0=0;則x3=1;

x4計算:
x4是第四個校驗碼,位置對應欄所有倒數第四位爲1(1xxx格式)的相異或爲0,即

這裏寫圖片描述

x4⊕1⊕1⊕0=0;則x4=0;

所以最終的海明碼是01110100110。

這裏寫圖片描述

如何校驗:??

接收到數據後

分別計算校驗碼所校驗的位置的模二加法。

G1=X1 ⊕ D1 ⊕.. ⊕ D7

G2=X2  ⊕ D1  ⊕... ⊕ D7

...幾個校驗位列幾個。

按十六進制G4G3G2G1=0101H,就代表出錯的位置。

 

補充CRC循環冗餘校驗的原理:

假設數據傳輸過程中需要發送15位的二進制信息g=101001110100001,這串二進制碼可表示爲代數多項式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,對應g(x)中x^k的係數。將g(x)乘以x^m(m代表h(x)的最高階數值),既將g後加m個0(完成以上被除數的處理),然後除以m階多項式h(x),得到的(m-1)階餘項r(x)對應的二進制碼r就是CRC編碼。

其中,h(x)就代表多項式,除數,注意:所選生成多項式最高階與最低階對應的係數必須爲1。

 

            g(x) 代表要發送信息。

 

舉一個例子使用CRC-8算法求101001110100001的效驗碼。CRC-8標準的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二進制串111010101。 

      

經過迭代運算後,最終得到的r是10001100,這就是CRC效驗碼。

如CRC16的

計算法一般都是:

(1)預置1個16位的寄存器爲十六進制FFFF(即全爲1),稱此寄存器爲CRC寄存器;
(2)把第一個8位二進制數據(既通訊信息幀的第一個字節)與16位的CRC寄存器相異或,把結果放於CRC寄存器;CRC高8位異或0相當於沒變,低8位相當於除FF(模二除法)爲什麼呢?

按照常規的思想CRC初始化爲0,然後第一個字節先進CRC高位,判斷將要左移一們是否爲1,若爲1則將左移,並且將CRC寄存器高8個字節(其實存的是數據)與多項式(從第二位起)異或(相當於執行了除法),不爲1,則光左移?

這時腦子裏一定要腦補出這樣的圖來

這裏由於CRC初始化爲FFFF,並且往右移,正好反過來了,那麼數據肯定也要“反過來”;這樣才能保持數據不變。如何反?就是拿數據跟當前CRC裏面的數據值異或。
(3)把CRC寄存器的內容右移一位(朝低位)用0填補最高位,並檢查右移後的移出位;
(4)如果移出位爲0:重複第3步(再次右移一位);如果移出位爲1,CRC寄存器與多項式(例如:1010 0000 0000 0001)進行異或;
(5)重複步驟3和4,直到右移8次,這樣整個8位數據全部進行了處理;
(6)重複步驟2到步驟5,進行通訊信息幀下一個字節的處理;
(7)將該通訊信息幀所有字節按上述步驟計算完成後(全部的數據按字節都要過一遍CRC校驗,這樣才叫校驗),得到的16位CRC寄存器的高、低字節進行交換;(腦補出的圖,往左移的話,就不用交換了)
(8)最後得到的CRC寄存器內容即爲:CRC碼。發送時,將數據後+CRC碼一塊發送出去。

對於接收端的處理:

把CRC+數據,理解成二進制數就好了,其實就是已經能整除了,這樣發送端再除以之前選定的CRC16多項式,就可以得到零,不是零的話,就說明出錯了。

以上計算步驟中的多項式A001(1010 0000 0000 0001)是8005按位顛倒後的結果。

參考https://blog.csdn.net/qq_27312943/article/details/52723965

查表法:

將移位異或的計算結果做成了一個表,就是將0~256放入一個長度爲16位的寄存器中的低八位,高八位填充0,然後將該寄存器與多項式例如:1010 0000 0000 0001)按照上述3、4步驟,直到八位全部移出,最後寄存器中的值就是表格中的數據,高八位、低八位分別單獨一個表。

項目會用到的CRC:

標準CRC多項式如下表:

注:簡記式是把 生成多項式的最高冪次項係數是固定的1,將最高的1統一去掉了。如CRC16  多項式係數爲11000000000000101,將最高位去掉1000000000000101,十六進制形式爲8005

 CRC校驗碼使用:

在線CRC計算:https://www.lammertbies.nl/comm/info/crc-calculation.html

剛開始時,可以參照這個驗證下算法對不對。這樣可以提高信心。

CRC算法參數模型解釋:

NAME:參數模型名稱。

WIDTH:寬度,即CRC比特數。

POLY:生成項的簡寫,以16進製表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成項是0x104C11DB7。

INIT:這是算法開始時寄存器(crc)的初始化預置值,十六進制表示。

REFIN:待測數據的每個字節是否按位反轉,True或False。

REFOUT:在計算後之後,異或輸出之前,整個數據是否按位反轉,True或False。

XOROUT:計算結果與此參數異或後得到最終的CRC值。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章