一、差錯控制
數據在傳輸過程中,由於信道受到噪聲干擾的影響,信號波形傳到接收方就可能會發生錯誤,為了把這些錯誤減到預期要求,就需要進行差錯控制。
差錯控制的原理很簡單,就是在被傳送的K位信息后附加r位的冗余位,接收方對收到的信息應用同一算法,將結果與發送方的結果進行比較,若不相等則數據出現了差錯。如果接收方知道有差錯發生,但不知道是怎樣的差錯,然后向發送方請求重傳,這種策略稱為檢錯;如果接收方知道有差錯,而且知道是怎樣的差錯,這種策略稱為糾錯。
差錯控制有兩種,分別是位出錯和幀出錯。
位出錯:就是傳輸的比特位出錯,如1變為0,0變為1。
幀出錯:有三種可能分別是丟失,重復,失序。實例如下:
發送方:發送 幀1、幀2、幀3 三個幀。
接收方(丟失):只收到幀1、幀3,這就是丟失。
接收方(重復):收到幀1、幀2、幀2、幀3,就是重復了。
接收方(失序):收到幀1、幀3、幀2,這就是幀失序。
出現了相關的錯誤,那我們就需要從數據鏈路層向網絡層提供的服務上去詢求解決問題的辦法,數據鏈路層向網絡層提供三種基本功能:1、無確認無連接服務,2、有確認無連接服務,3、有確認面向連接服務。
二、數據鏈路層的差錯控制
如圖:
比如PCA要與PCB進行通信,那么需要一條通信的鏈路及一系列的通信設備,如果整條通信線路沒有差錯控制機制,那么PCA的數據幀要發送到PCB之后,才發現數據是錯誤的;如果在通信鏈路上的路由器上有差錯控制機制,那么從PCA向PCB發送的數據,就會在距PCA最近的路由器處被檢測出錯有數據幀出錯,需要PCA重新發送,正確的數據幀可以先發向PCB端,那么這整條鏈路就可以節省資源,這就是數據層的差錯控制方式。
數據鏈路層的差錯控制主要針對在鏈路上傳輸的比特位出錯,主要有兩種控制方法,分就是檢錯編碼和糾錯編碼上面提到過相關的概念。檢錯編碼包含奇偶校驗碼和循環冗余碼CRC,而糾錯編碼包含海明碼。
數據鏈路層的編碼與物理層編碼的區別:
數據鏈路層編碼與物理層編碼和調制不同,物理層編碼針對的是單個比特,解決傳輸過程中比特的同步問題,如曼徹斯特編碼。數據鏈路層的編碼針對的是一組比特數據,它通過冗余碼的技術實現一組二進制比特數據在傳輸過程的差錯控制。
三、檢錯編碼(奇偶校驗碼)
奇偶校驗碼由N-1位信息元和1位校驗元組成。N-1位的信息元就是我們發送信息里的有效數據,而1位校驗元就是用於檢錯的冗余碼。
奇偶校驗碼可以分為奇校驗碼和偶校驗碼。
奇校驗:這串序列1的個數如果為偶數則在前面加個1,使1的個數變成奇數,否則加0。
偶校驗:這串序列1的個數如果為奇數則在前面加個1,使1的個數變成偶數,否則加0。
實例:
(1)1111 奇校驗就是 11111 偶校驗就是 01111。
(2)1110 奇校驗就是 01110 偶校驗就是 11110。
奇偶校驗碼的特點:
只能檢查出奇數個比特錯誤,檢錯的能力為50%,無法糾錯。
怎么理解這個特點呢?
我們來看一個實例:比如PCA向PCB發送一串比特位是1101010,采用奇校驗碼,那么通過奇校驗加入冗余位的比特位是11101010,當PCB收到比特位是11101011,那么通過奇校驗,我們就知道了在傳輸過程中有數據發生錯誤,因為此時1的個數變成了偶數。當如果PCB收到的比較位是11101001,1的個數任然是奇數,此時采用的奇校驗是無法檢測出錯誤的,所以,采用奇檢驗只有50%的檢錯能力。
四、檢錯編碼(CRC循環冗余檢驗碼)
CRC循環冗余檢驗碼是一種通過多項式除法檢測錯誤的方法,將每個比特串看作一個多項式,采用模2運算。下面是一個簡單的CRC循環冗余檢驗碼的原理圖:
然后,我們再來做一個實例,就很容易的可以理解CRC循環冗余檢驗碼,當發送方要發送的幀為1101011011,生成多項式 G(x)= x4 + x + 1,則 r = 4,r為何是4,其實就是生成多項式最大的x4 ,此時 r = 4 ,所以則在幀后附加4個0。
幀為:1101011011
生成多項式 G(x)= x4 + x + 1 = 10011 (對應x位寫1,沒有對應的位填0,就成為相應的生成多項式G(x))。
發送端計算的過程是:要發送的數據幀 + r 位的校檢序列 得到要發送的數據幀然后與生成多項式進行模2除法運算,取余數,這個余數就是需要增加的FCS幀檢驗序列。
通過計算,可以得到余數為1110,那么實際發送的幀為11010110111110。
接收端計算的過程是:當接收端收到幀11010110111110 與 生成多項式進行模2除法運算,然后檢查得到的余數,如果余數為0,則表示傳輸過程是正常的則接收數據,則否是存在錯誤的則丟棄數據。
注:在數據鏈路層僅使用CRC循環冗余檢驗碼差錯控制技術,只能做到對幀的無差錯接收,有錯誤的幀會被丟棄。鏈路層使用的CRC循環冗余檢驗碼差錯控制技術,能實現比特幀的無差錯傳輸,但這還不是可靠傳輸。
五、糾錯編碼(海明碼)
海明碼是奇偶校驗碼的另一種擴充。和奇偶檢驗碼的不同之處在於海明碼采用多位校驗的方式,在這些多個校驗位中的每一位都對不同的信息數據位進行奇偶校驗,通過合理地安排每個檢驗位對原始數據進行的校驗的組合,可以達到發現錯誤、糾正錯誤的目的。
假設數據位有m位,如何設定校驗位(冗余位)k的長度才能滿足糾正一位錯誤的要求呢?這里做一個推導。
k位的檢驗碼可以有2k個值。顯然,其中一個值表示數據是正確的,而剩下的 2k -1 個值意味着數據中存在錯誤,如果能夠滿足2k -1個值意味着數據中存在錯誤,如果能夠滿足 2k -1 > m + k ( m + k為編碼后的數據總長度),則在理論上 k 個校驗碼就可以判斷是哪一位(包括信息碼和校驗碼)出現了問題。
當 m = 4 時,計算得 K = 3 。
注:海明碼可以同時發現兩位比特錯誤,糾正一位比特錯誤錯誤。
注意:檢錯編碼與糾錯編碼的區別:檢錯編碼可以發現錯誤,但是它並不能具體到哪一位發生錯誤,而糾錯編碼則不同,它不僅可以發現錯誤,還可以知道是那一位發生了錯誤,並糾正錯誤。