1. 程式人生 > >11、資料鏈路層的設計問題與差錯檢測糾正(資料鏈路層)

11、資料鏈路層的設計問題與差錯檢測糾正(資料鏈路層)

1、資料鏈路層的設計問題

引言

  • 資料鏈路層主要完成的功能包括:(1)向網路層提供一個定義良好的介面(2)處理傳輸錯誤(3)調節資料流,確保慢速接收方不會被快速傳送方淹沒。
  • 資料鏈路層將從網路層獲取的資料包封裝成幀以便傳輸。每個幀包含一個幀頭、一個有效載荷(存放資料包)以及一個幀尾。

1.1提供給網路層的服務

  • 在源機器的網路層有一個實體(稱為程序),它將一些位元交給資料鏈路層,要求傳送到目標機器。資料鏈路層的任務就是將這些位元傳輸給目標機器,然後交付給網路層,如圖a;實際傳輸如圖b,但很容易將這個過程想象成兩個資料鏈路層的程序使用一個數據鏈路協議進行通訊。本章中將隱式使用圖a模型。在這裡插入圖片描述
  • 資料鏈路層提供的服務因具體協議的不同而有所差異。一般情況下,資料鏈路層提供以下3種可能的服務:(1)無確認的無連線服務(2)有確認的無連線服務(3)有確認的有連線服務
  • 無確認的無連線服務是指源機器向目標機器傳送獨立的幀,目標機器並不對這些幀進行確認。乙太網就是一個提供此類服務的資料鏈路層極好例項。這種連線,事先不必建立邏輯連線,事後不必釋放連線;若由於線路噪聲造成了某一幀的丟失,資料鏈路層並不試圖檢測這種情況,更不會恢復。這類服務使用於兩種場合:一種是錯誤率極低的場合,差錯恢復可以由上層完成;一種是實時通訊,及時交付比準確交付更重要。
  • 有確認的無連線服務。當網路層提供這種服務時,資料鏈路層仍然沒有建立邏輯連線,但傳送的幀需要單獨確認,使傳送方知道傳送幀是否到達目的地。如果沒有在一個指定的間隔到達,則傳送方再次傳送該幀,但可能導致一個幀被收發多次,浪費頻寬。這類服務適用於不可靠通道,比如無線系統。802.11(WiFi)是此類服務的一個例子。
  • 有確認的有連線服務。傳送方和接收方在傳輸資料之前需要建立一個連線,連線上傳送的每一幀都被編號,資料鏈路層保證發出的每一幀都被接收方收到。它還保證每個幀只被接收一次,並且按正確的順序接收。它適用於長距離且不可靠的鏈路,比如衛星通訊或者長途電話電路。

1.2成幀

  • 物理層所做的只是接收一個原始位元流並傳給目標機器,如果通道存在噪聲,物理層會在訊號中新增某種冗餘以便將誤位元速率降到一定程度。但資料鏈路層接收的位元流並不一定正確,可能出現值的變化或者位元數量的不一致,因而需要檢錯和糾錯。
  • 資料鏈路層將位元流拆分成多個離散的幀,為每一個幀計算一個稱為校驗和的短令牌,並插入到幀中傳輸。目標機器需要重新計算該幀的校驗和,如果計算出來的校驗和與該幀包含的校驗和不同,則資料鏈路層知道傳輸過程中出現了錯誤,它會採取一定措施(比如丟棄或者發回一個錯誤報告)。
  • 拆分位元流需要使得接收方發現一個幀的開始,同時要使得所用頻寬最少。常用的方法有:(1)位元組計數法(2)位元組填充的標誌位元組法(3)位元填充的標誌位元法(4)物理層編碼違禁法
  • 位元組計數法。利用頭部中的一個欄位表示該幀中的字元數。接收方因此知道該幀有多少位元組、在哪裡結束,如圖a。這個演算法的問題在於計數值可能因一個傳輸錯誤而被弄混。例如第二幀中的計數值5因為一個位元值反轉變成7,如圖b,那麼接收方就會失去同步,它再也不可能找到下一幀的開始處。即使要求重傳,接收方也不知道該跳過多少位元組才能到達重傳的開始處,因而位元組計數法使用很少。
    在這裡插入圖片描述
  • 位元組填充法。它讓每個幀用一些特殊的位元組作為開始和結束,這些位元組稱為標誌位元組。如圖a中的FLAG所示。兩個連續的標誌性位元組代表了一幀的結束和開始。因此接收方失去同步也能通過搜尋兩個標誌性位元組找到當前幀的結束和下一幀的開始。當標誌性位元組出現在資料中時,採用特殊的轉義字元(ESC)插入其前;接收方的資料鏈路層在將資料傳輸給網路層之前必須刪除轉義位元組。如果轉義字元也出現在資料中,同樣使用一個轉義字元插入其前,接收方將刪除第一個轉義字元。如圖b,圖中描述的位元組填充方案是PPP(Pont-to-Point Protocol)協議使用的略微簡化形式(PPP在SONET/SDH鏈路中使用的是0位元填充法)。在這裡插入圖片描述
  • 位元填充法。幀的劃分可以在位元級完成,因而幀可以包含任意大小單元(而不只是以8位元為單元)組成的二進位制位元數。這種方法是為曾經流行的HDLC(高階資料鏈路控制)協議開發。每幀的開始和結束由一個特殊的位元模式,01111110或十六進位制的0x7E標記。這種模式是一個標誌性位元組。每當傳送方的資料鏈路層在資料中遇到連續5個1,它便自動在輸出的位元流中插入一個位元0,接收方會自動刪除插入的0。位元填充確保了轉換的最小密度,這將有助於物理層保持同步。USB(通用序列匯流排)採用了位元填充技術。位元填充保證了標誌位元組只可能出現在幀的邊界,而不會出現在幀內資料中。其副作用是一幀的長度取決於它所攜帶的資料內容。例如,資料中沒有標誌位元組,100個位元組資料或許只需要一個100位元組左右的幀所攜帶;然而如果資料全由標誌性位元組組成,那麼每個位元組中插入1個0,幀的增幅大約為12.5%。
  • 物理編碼違禁法。物理層中敘述的位元編碼成訊號方法通常包含一些冗餘位元,以便幫助接收器同步接收。例如在4B/5B線性編碼模式下,4個數據位被對映成5個訊號位元,通過這種方法確保線路上的訊號有足夠的跳變。但32個可用的訊號中有16個不會被使用,我們可以利用這些保留的訊號來指示幀的開始和結束。
  • 許多鏈路層協議為安全起見綜合使用了這些方法。乙太網和802.11使用了共同的分界模式,即用一個定義良好的的位元模式來標識一幀的開始,該位元模式稱為前導碼。這種定界模式可能很長(802.11典型使用72位),目的是讓接收方準備接收輸入的資料包。前導碼之後是頭的長度欄位(即計數),這個欄位將被用來定位幀的結束處。

1.3差錯控制

  • 對於可靠的、面向連線的服務,資料鏈路層還需要確保所有的幀被傳輸到目標機器,並且保持正確的順序。常用方法是向傳送方提供一些有關線路另一端狀況的反饋資訊。通常情況下,協議要求接收方發回一些特殊的控制幀來對它所接收到的幀進行肯定和否定的確認,如果丟失幀,那麼這幀必須重傳。
  • 如果一幀完全丟失,接收方沒有任何根據做出反應,更不知如何處理。在一個協議中,傳送方發出來一幀之後就等待肯定或者否定的確認,為了防止接收方的確認幀也丟失,資料鏈路層引入了計時器。當傳送方發出一幀時,還要啟動一個計時器。該計時器的超時值應該設定得足夠長,以便保證在正常情況下,該幀能夠到達接收方,並在接收方處理後再將確認幀返回到傳送方。一般情況下,在計時器超時前,該幀應該被正確接收,並且確認幀也被傳了回來,在這種情況下,計時器被取消。否則,如果幀丟失或者確認幀丟失,計時器將被觸發,從而警告發送方存在一個潛在的問題,一種解決方案就是重傳,然而,當有的幀多次傳送後,接收方可能多次收到同一幀,並將它多次傳輸給網路層。為了避免這種情形,一般有必要給發出去的幀分配序號,這樣接收方可以根據幀的序號來區分原始幀和重傳幀。
  • 管理好計時器以便保證每一幀最終都恰好一次被傳輸給目標機器的網路層,這是資料鏈路層(以及上層)工作的重要組成部分。

1.4流量控制

  • 另一個設計問題是如果傳送方傳送幀的速度超過了接收方接收這些幀的速度,傳送方該如何處理。當傳送方執行在一臺效能強大的計算機上,而接收方執行在一臺效能差的機器上時,這種情況便會容易發生。例如一個智慧手機向一個超強伺服器請求一個web頁面,接收方將無法以資料到來的速度那樣快地處理持續到來的幀,此時必然會丟棄一些幀。
  • 解決方案有兩種。一種是基於反饋的流量控制,接收方給傳送方返回資訊,允許它傳送更多的資料,或者至少告訴傳送方自己的情況如何。一種是基於速率的流量控制,使用這種方案的協議有一種內建的機制,它能限制傳送方傳輸資料的速率,而無需利用接收方的反饋資訊。
  • 本章將學習基於反饋的流量控制方案,因為基於速率的方案僅在傳輸層的一部分可見,而基於反饋的方案則可同時出現在鏈路層和更高的層次。後者近年來較為常見,在這種情況中,鏈路層硬體設計的執行速度足夠快到不會造成丟幀。例如,作為鏈路層硬體實現的網路介面卡(NIC),有時聲稱能以“線速”執行,這意味著它們能以幀到達的速度來處理幀。因而,任何過載不在是鏈路層的問題,它們必須由高層處理。基於反饋的流量控制方案有多種,但大多數使用了相同的基本原理。協議包含了許多定義良好的規則,這些規則規定了傳送方什麼時候可以傳送下一幀,傳送方在沒有得到接收方允許之前禁止傳送幀。

2、差錯檢測和糾正

引言

  • 通訊通道有許多不同特徵。光纖很少發生傳輸錯誤,其他通道,尤其是無線鏈路和老化的本地迴路錯誤率相對光纖來說非常高。資料鏈路層需要處理這些傳輸錯誤。
  • 一種策略是在每一個傳送的資料塊中包含足夠多的冗餘資訊,以便接收方能據此推斷被髮送的資料是什麼。另一種策略也是包含一些冗餘資訊,但這些資訊只能讓接收方推斷出是否出現傳輸錯誤(而不推斷是哪個發生了錯誤),然後接收方請求重傳。前一種策略使用了糾錯碼(也稱前向糾錯),後一種策略使用了檢錯碼。在高度可靠的通道上(如光纖)較為合理的方法是使用檢錯碼,當偶爾發生錯誤時重傳整個資料塊;在錯誤發生頻繁的通道上(比如無線鏈路)則應使用糾錯碼,因為重傳資料塊也可能出錯。無論是糾錯碼還是檢錯碼都有可能出現傳輸錯誤,為了避免這種情況,編碼必須足夠強大到足以應付預期錯誤。
  • 在兩種錯誤模型中,突發性錯誤相比單個位元錯誤各有特點。由於計算機總是成塊傳送的,假設資料塊大小為1000個位元,誤差率為每位元0.001。如果錯誤是獨立的,大多數塊將包含一個錯誤,但如果錯誤以100個位元的突發形式出現,則平均來說100塊中只有一塊受到影響。突發錯誤的缺點在於當它們發生時比單個錯誤更難以糾正。還有一種型別的錯誤,由於物理層接收到的一個模擬訊號遠離了0或1的預期值,因而可以宣佈該位元被丟失。這種情況稱為擦除通道。擦除通道的錯誤,我們可以知道哪個比特出了錯,相比把位元值反轉的通道更易於糾錯。

2.1糾錯碼

  • 常用糾錯碼:(1)海明碼(2)二進位制卷積碼(3)裡德所羅門碼(4)低密度奇偶校驗碼。上述所有編碼都將冗餘資訊加入到待發送資訊中。一幀由m個數據位(資訊)和r個冗餘位(校檢)組成。在碼塊中,r個校驗碼是作為與之相關的m個數據位的函式計算獲得的,就好像在一張大表中找到m位資料對應的r校驗位。在系統碼中,直接傳送m個數據位,然後傳送r個校驗位,而不是在傳送前對它們進行編碼。線上性碼中,r個校驗位是作為m個數據位的線性函式被計算出來的。異或(XOR)或者模2加是函式的流行選擇,這意味著編碼過程可以用諸如矩陣乘法或簡單邏輯電路來完成。除非另有說明,本節中考察線性碼、系統碼和塊狀碼。
  • 令資料塊總長度為n(n=m+r),將此描述為(n,m)碼,稱為n碼字。位元速率定義為m/n。實際上這個位元速率變化很大,在一個有噪聲通道上位元速率或許是1/2;而在高品質通道上位元速率接近1,只有少數的校驗位被新增到一個大塊訊息中。

海明碼

  • 給定兩個被髮送或接收的碼字,為了確定有多少位不同,只需要異或兩個數字,並計算兩個結果中的1個數,1的個數稱為海明距離。給定計算校檢位的演算法,完全可以構建一個完整的合法碼字列表,然後從這兩個列表中找出兩個具有最小海明距離的碼字,這個距離就是整個編碼的海明距離。在大多數資料傳輸應用中,所有2m種可能的資料報文都是合法的;但是,根據校驗位的計算方法,並非所有2n種可能的碼字都會被用到。事實上,對於r位校驗位,可能的報文中只有很少一部分是2m/2n(=1/2r)是合法的碼字。正是這種空間稀疏的方法,使得接收方能檢測並糾正錯誤。
  • 塊碼的檢錯和糾錯特性跟它的海明距離有關。為了可靠地檢測d個錯誤,需要一個距離為d+1的編碼方案(如海明距離為2,編碼類似於0011、1100,錯誤的碼字是0001,可以知道碼字至少有一個錯誤;如果海明距離為1,則編碼類似於0000、0001,這樣是無法檢測錯誤碼字的),當接收方看到一個無效碼字時,它就知道傳輸發生了錯誤。類似的,為了糾正d個錯誤,需要一個距離為2d+1的編碼方案,因為只有足夠距離的編碼方案才能達到糾錯的目的。
  • 考慮一個只有下列4個有效碼字的編碼方案:0000000000、0000011111、1111100000、1111111111。該編碼方案的距離是5,這意味著它可以糾正2個位錯誤或者檢測4個位的錯。如果接收到碼字0000000111並且期望只有單個或2個錯誤,則接收方一定知道原始碼字是0000011111。然而,如果發生3個錯誤,0000000000變成了0000000111,則就無法糾正錯誤了。很明顯在這個例子中,我們不能同時糾正2個錯誤和檢測4個錯誤,因為這需要我們用兩種不同的方式來解釋收到的碼字(編碼方案也有異)。
  • 設計一種編碼方案,每個碼字有m個訊息位和r個校驗位,並且能糾正所有單個錯誤。對於2m個合法訊息,任何一個訊息都對應有n個非法的碼字,它們與該訊息的距離為1。這些非法碼字可以這樣構成:將該訊息對應的合法碼字的n位,逐個取反,可以得到n個距離為1的非法碼字。因此。每個2m中的合法訊息需要n+1個位模式來標識它們(如果是n個位模式,那麼只能用n個非法碼字標識合法的訊息了,顯然是不合理的;如果有7個模式是非法字元,那麼需要第8個模式標識合法訊息,注意海明距離是1)。由於總共有2n個位模式,所有我們必須有(n+1)2m≦2n。由於n=m+r,因此上式可以化為(m+r+1)≦2r。在給定m的情況下,這個條件給出了糾正單個錯誤所需要的校檢位數的下限。
  • 在海明碼中,碼字的位從左至右被連續編號。2的冪次方位(1,2,4,8等)是校檢位,其餘位用來填充m個數據位。如圖所示,7個數據位和4個校檢位。這11個位元都需要校檢,第1個位元用第20=1校檢位校檢,第2個位元用第21=2校檢位校檢,第3個位元用第20=1、第21=2(1+2=3)兩個校檢位校檢。換句話說,要檢驗k位,必須將k改寫成2的冪次方之和,例如11=1+2+8,校檢1、2和8位就可以確定11是否出錯。
  • 此例子中將採用偶校檢計算ASCII字母“A”的校檢和。首先需要在資料中插入校檢碼,以2的冪次方插入:??1?000?001,第一個校檢碼p1需要校檢的位包括1、3、5、7、9、11,並以此為一組,對應位數的值是?10001,這個組合值中1的個數是偶數,根據偶校檢,組合值中1的個數需要保持偶數,那麼確定?值是0。依此法,推算出校檢碼為0001,插入資料中。這種結構給出了海明距離為3的編碼,意味著它可以糾正1個錯誤(或檢測2個錯誤)。當接收到碼字後,接收機器重新計算其校檢位,得到校檢結果,偶校檢的結果必須全為0,否則資料就出現了差錯。圖中接收時,出現了1個錯誤。將1、3、5、7、9、11位上的組合值異或得到1,將2、3、6、7、10、11位上的組合值異或得到0,依次得到1010,將結果反轉得0101,這個0101稱為錯誤綜合集,0101=5,按照設計方案,這意味著第五位有誤。把不正確的位取反,就可以得到正確訊息。
    在這裡插入圖片描述

卷積碼

  • 海明距離對理解塊碼是有價值的,而且海明碼還被用在糾錯儲存器中。然而,大多數網路使用了更強大的編碼。第二個要考察的編碼是卷積碼。這是我們討論中唯一不屬於塊碼的編碼。在卷積碼中,編碼器處理一個輸入位序列,並生成一個輸出位序列。輸出取決於當前的輸入和以前的輸入(在塊碼中沒有自然訊息大小和編碼邊界),也就是說編碼器有記憶體。決定當前輸出的以前輸入位數稱為程式碼的約束長度。卷積碼由它們的速率和約束長度標識。
  • 卷積碼已經被廣泛應用於實際部署的網路中,例如它已經成為GSM行動電話系統的一部分,在衛星通訊和802.11中都得到應用。圖中給出了一個流行的卷積碼。這個程式碼稱為NASA(美國航天局)卷積碼,其r=1/2和k=7,因為它是第一個被用在1977年的旅行者號航天飛行任務中的編碼,現在已成為802.11的一部分。在這裡插入圖片描述
  • 圖中(兩個模2加法器,6個暫存器,1個暫存器對應1個位的值)左邊每個輸入位產生右邊的兩個輸出位。輸出位是輸入位和內部狀態的XOR和。由於它處理的是位元位並執行線性運算,因此是二進位制的線性卷積碼。又因為1個輸入產生2個輸出,因此位元速率為1/2。這裡的輸出不位是簡單的輸入位,從而它不屬於系統碼。內部狀態儲存在6個記憶體暫存器中。每當輸入一位,暫存器的值就右移一位。例如,輸入序列為111,初始狀態都是0(6個暫存器中都是1個0值),則在輸入第一、二、三位後從左至右的內部狀態為100000、110000、111000。對應輸出位分別是11、10和01(輸入的第一個值是1,與000000異或,圖中input到S1之間的數字是輸入值1,該值被連線到一個輸出對應的模2加法器,它連線了5個值,最終計算得模2加法器輸出處輸出1,另一個也是1,所以輸入1時,對應輸出值是11)。這個過程需要7次移位才能完全清除輸入,從而不影響輸出,因此該卷積碼的約束長度是7。
  • 卷積碼的解碼過程是針對一個輸入位序列,找出最有可能產生觀察到的輸出位序列。對於較小值的k,一種廣泛使用的演算法是由Viterbi開發的,該演算法逐個檢查觀察到的序列,記住每一步和輸入序列的每個可能的內部狀態,即輸入序列產生觀察序列可能產生的錯誤。最終其中那個具有最少錯誤的輸入序列就是最有可能的訊息。
  • 卷積碼實際上非常流行,它之所以很容易被採納的一個因素在於解碼0或1的不確定性。例如,假設-1V表示邏輯0,+1V表示邏輯1,接收方可能接收到的2位分別是0.9V和-0.1V。卷積碼不是簡單地將這些訊號絕對對映成邏輯1和0,而是把0.9V看成“很可能是1”,把-0.1V看成“很可能是0”;從而最終獲得正確的整個序列。Viterbi演算法的擴充套件適用於這些不確定因素,因而能提供更強的糾錯功能。這種帶有1位元不確定性的工作方法稱為軟判決解碼。相反,在執行糾錯之前就決定了每個位是0或1的工作方法稱為硬判決解碼。

裡德所羅門碼

  • 裡德所羅門碼是線性塊碼,而且往往也是系統碼。但與海明碼不同的是,裡德所羅門碼對m位符號進行操作,而不是針對單個位處理。由於這將涉及較多數學理論,所以我們將用類比方法描述該方案。
  • 裡德所羅門碼基於這樣的事實:每一個n次多項式是由n+1點唯一確定的。例如,一條具有ax+b形式的線由兩個點確定。同一條線上的額外點是冗餘的,這將有助於糾錯。可以想象有兩個資料點代表了一條線,並且我們給這兩個資料點額外加上兩個校驗點,該兩個校驗點選自同一條線。如果收到的其中一個點出現了錯誤,我們仍然可以通過接收點的擬合線來恢復這個資料點。三個點將處於同一直線上,而出錯的那個點不在這條線上,只要找到這條線,我們就可以糾正錯誤。
  • 裡德所羅門碼實際上被定義成在一個有限域上操作的多項式,但工作方式相同。對於m位符號而言,碼字長2m-1個符號。一種流行的選擇是m=8,這樣符號就是位元組。因此,一個碼字為255個位元組長。(255,233)碼被廣泛使用,他在233個數據符號上增加了32個冗餘符號。帶有糾錯功能的解碼演算法有Berlekamp 和 Massey開發,它能有效執行中等長度的解碼。
  • 裡德所羅門碼得到廣泛運用的原因還在於其強大的糾錯效能,尤其針對突發性錯誤。它們被用在DSL、線纜上的資料通訊、衛星通訊、CD、DVD和藍光光碟。因為它們基於m位符號,因此1位錯誤和m位突發錯誤都只是作為一個出錯訊號來處理。當加入2t個冗餘符號後,裡德所羅門碼能夠糾正傳輸符號中的任意t個錯誤。例如在(255,233)中,32個冗餘符號可以糾正多達16個符號錯誤。因為符號是連續的,並且每個8位長,所以可以糾正高達128位的突發性錯誤。在這種情況下,高達2t個錯誤都可以更正。
  • 裡德所羅門碼通常與其他編碼結合在一起使用,如卷積碼。這種想法的依據在於:卷積碼在處理孤立的位元錯誤時很有效,但當接收到的位元流中有太多的錯誤(和突發性錯誤類似),卷積碼就無法處理了。在卷積碼中加入裡德所羅門碼,兩者的結合就能將糾錯任務完成得很好,綜合起來的編碼模式對單個錯誤和突發性錯誤都有良好的保障作用。

低密度奇偶校檢碼

  • 低密度奇偶校檢碼(LDPC)是線性碼,由Robert Gallagher在它的博士論文中首次提出。LDPC碼中的每個輸出位由一小部分的輸入位形成。這樣使得編碼可以用一個1的密度很低的矩陣來表示,這也是編碼名稱的由來。接收到的碼字通過一個近似演算法解碼獲得,該演算法通過迭代不斷改進接收到的資料與合法碼字的最佳匹配,如此糾正錯誤。LDPC碼比較適用於大塊資料,而且具有出色的糾錯能力,因而效能優於其他許多編碼(包括前述)。真是基於這個原因,它們迅速被新的協議所採納,成為數字視訊廣播、萬兆乙太網、電力線網路,以及最新版802.11標準的一部分。

2.2檢錯碼

糾錯編碼被廣泛應用於無線鏈路。相比光纖,無線鏈路很容易嘈雜不堪而且容易出錯,如果沒有糾錯碼,將很難從該鏈路獲得任何資訊。然而,光纖或者高品質銅線的錯誤率要低得多,因此對於偶爾出現的錯誤採用差錯檢測和重傳的處理方式通常更加有效。常用檢錯碼:(1)奇偶(2)校檢和(3)迴圈冗餘校檢(CRC)

奇偶

  • 把單個奇偶校檢位附加到資料中。奇偶位的選擇原則是使得碼字中位元1的數目是偶數(或奇數)。這樣處理等同於對資料位進行模2加或異或操作來獲得奇偶位。例如當以偶校檢方式傳送1011010時,在資料末尾在資料末尾加一位0,保證資料中1的個數是偶數;否則新增1。具有單個校檢位的編碼具有碼距2,因為任何1位錯誤都將使得碼字的奇偶校檢碼出錯,這意味著奇偶碼可以檢測出1位錯誤。
  • 考慮這樣的通道,其上發生的錯誤都是孤立的。令資料塊大小為1000位,根據公式(m+r+1)≦2r可知需要10個校檢位;因此1兆大小的資料塊將需要10000個校檢位。如果只為檢測出該塊資料中是否存在1位錯誤,每塊資料僅一個校檢位就足夠了,每1000個數據塊中有1塊出現錯誤,只需要重傳額外的一塊(1000個數據位加上1個校檢位)即可修復錯誤,每1兆資料用於錯誤檢測和重傳的總開銷只有2001位,相比海明碼需要的10000位顯然要高效。這種校檢方案的困難在於單個檢驗位只能可靠地檢測出1位錯誤。如果資料塊因一個長的突發錯誤造成嚴重亂碼,那麼這種錯誤檢測出來的概率只有1/2(資料位異或為偶為奇各佔1/2),顯然這是令人難以接受的。如果傳送的每個資料塊作為一個n位寬和k位高的長方形矩陣來處理,則檢測出錯誤的概率可望得到很大提高,如果我們為每一行計算和傳送一個校檢位,只要每一行最多隻有一個錯誤發生,那麼我們就能可靠地檢測出k位錯誤。
  • 為了提高對突發錯誤的檢測能力,可以改變計算校檢位的次序,即以不同於資料位傳送的次序來計算校檢位。這種處理方式就是所謂的交錯校檢。在這種情況下,我們將為n列中的每列計算校檢位,按k行傳送全部的資料位,傳送次序是從上到下發送每一行,行內資料為通常按照從左到右的次序傳送。在最後一行,傳送n個校檢位。這種傳輸如圖,其中n=7,k=7。
    在這裡插入圖片描述
  • 交錯校檢是一種將檢測(或糾正)單個錯誤的編碼轉換成能檢測(或糾正)突發錯誤的通用性技術。在圖中,放發生一個長度為n=7的突發錯誤,出錯的位恰好分散在不同的列(突發錯誤並不隱含著所有的位都出錯),n列中至多隻有1位收到影響,因此這些列中的校檢位將能檢測到該錯誤。這種方法對於nk長度的資料塊使用了n個校檢位就能檢測出一個長度小於等於n的突發錯誤。但是當一個長度為n+1或者一列中的兩位都反轉,那麼這樣的錯誤無法檢測出來。如果資料塊被一個長突發錯誤或多個短突發錯誤所擾亂,該n列中任何一列有正確校檢位的概率偶爾有1/2,所以一個不該接收而被接受的壞塊的概率是(1/2)n

校檢和

  • 第二類檢錯碼是校檢和,與一組奇偶校檢位相關。校檢和這個詞通常用來指與資訊相關的一組校檢位,不管這些校檢位是如何計算出來的。一組奇偶校檢位是校檢和的一個例子。然而,還有其他種類的校檢和,強大的校檢和基礎是對訊息中的資料位進行求和計算。校檢和通常放置在訊息的末尾,作為求和功能的補充。這樣一來,通過對整個接收到的碼字(包含了資料位和校檢和)進行求和計算就能檢測出錯誤。如果計算結果是0,則沒有檢測出錯誤。
  • 校檢和的一個例子是16位的Internet校檢和,作為IP協議的一部分用在所有Internet資料包中。該校驗和是按16位字計算得出的訊息位總和。由於此方法針對字而不是像奇偶校檢那樣針對位進行操作,因此奇偶校檢沒能檢測出的錯誤此時仍然影響著校檢和,從而能被檢測出來。例如,如果兩個字的最低位都從0錯誤變成了1,上述的奇偶校檢將無法檢測這個錯誤,但是兩個1增加到16位校檢和中將產生不同的結果,這個錯誤將被檢測出來。
  • Internet校檢和是以補碼運算而非216模加運算得到的。在補碼運算中,負數是其正數的按位補。現代計算機採用雙補演算法,負數是該數的補碼加1。在雙補計算機中,一個數的補碼等價於模216加,並且任何高序位溢位將被放回低序位上。該演算法為校檢和提供了更均勻的資料覆蓋面。否則兩個高序位可能因相加、溢位而被丟失,從而對校檢和沒有任何作用。這種雙補演算法還有另一個好處,0的補碼有兩種表示方法:全0和全1。這就允許一個值(例如全0)表示沒有校檢和而不需要用額外一個欄位作特別說明。
  • Internet校檢和在某些情況下提供的保護很弱,正因為它只是一個簡單的和。它檢測不出0資料的增加或刪除,也檢測不出被替換的那部分,而且對兩個資料包拼接起來的訊息只有弱保護作用。這些錯誤在隨機過程中似乎不太可能發生,但恰恰是一種發生在有缺陷硬體上的錯誤。一個更好的選擇是Fletcher校檢和。它包括一個位置元件,將資料和其位置的乘積新增到總和中。這樣能對資料位置的變化提供更強大的檢測作用。

迴圈冗餘校檢碼

  • 也稱多項式編碼。多項式編碼的基本思想是:將位串看成是係數為0或1的多項式。一個k幀看做是一個k-1次多項式的係數列表,該多項式有k項,從Xk-1到X0。例如,110001有6位,因此代表了一個由6項的多項式,其係數分別為1、1、0、0、0和1:即1X5+1X41X3+1X2+1X1+1X0
  • 多項式的算術運算遵守代數域理論規則,以2為模來完成。加法沒有進位,減法沒有借位,等同於異或。使用多項式編碼時,傳送方和接收方必須預先商定一個生成多項式G(x)。生成多項式的最高位和最低位係數必須是1。假設1幀有m位,它對應於多項式M(x),為了計算它的CRC,該幀必須比生成多項式長。基本思想是在幀尾附加一個校檢和,使得附加之後幀所對應的多項式能夠被G(x)除盡。當接收方收到了帶校檢和的幀之後,它試著用G(x)去除它。如果有餘數的話,則表明傳輸過程中有誤。
  • 計算CRC的演算法如下:(1)假設G(x)的階為r。在幀的低位加上r個0位,使得該幀包含m+r位,對應多項式為XrM(x)。(2)利用模2除法,用對應於G(x)的位串去除對應於XrM(x)的位串。(3)利用模2減法,從對應於XrM(x)的位串中減去(相等於異或)餘數(總是小於等於r位)。結果就是將被傳輸的帶校檢和的幀。它的多項式不妨設為T(x)。圖中顯示了多項式為G(x)=X4+X+1計算1101011111校檢和的情形。在這裡插入圖片描述
  • 顯然T(x)可以被G(x)除盡。在任何一種除法中,如果將被除數減掉餘數,則剩下的差值一定可以被除數除盡。想象一下在傳輸過程中發生了一個錯誤,因此接收方收到的不是T(x),而是T(x)+E(x),其中E(x)對應的每位1都變反了。如果E(x)中有k個1,則表明發生了k個錯誤。單個突發錯誤可以這樣描述:初始位是1,然後是0和1的混合,最後一位也是1,所有其他位都是0。接收方在收到了帶校檢和的幀之後,用G(x)來除它,即[T(x)+E(x)]/G(x)。T(x)/G(x)是0,因此計算結果簡化為E(x)/G(x)。如果錯誤恰好發生在作為因子的G(x)多項式中,那麼將無法檢測到,其他所有錯誤版本都能夠被檢測出來。如果只有一位發生錯誤,即E(x)=xi,這裡 i 決定了錯誤發生在哪一位上。如果G(x)包含兩項或者更多項,則它永遠也除不盡E(x),所以,所有的一位錯誤都將被檢測到。
  • 如果有兩個獨立的一位錯誤,則E(x)=xi+xj,這裡 i > j 。如果我們假定G(x)不能被x除盡,則所有的雙位錯誤都能夠檢測出來的充分條件是:對於任何小於等於i - j 最大值(即小於等於最大幀長)的k值,G(x)都不能除盡xk+1。簡單地說,低階的多項式可以保護長幀。例如,對於任何 k <32768,x15+x14+1都不能除盡xk+1。如果有奇數個位發生了錯誤,則E(x)包含奇數項(比如x5+x2+1,但不能是x2+1)。有意思的是,在模2系統中,沒有一個奇數項多項式包含x+1因子。因此,以x+1作為G(x)的一個因子,我們就可以捕捉到所有包含奇數個位變反的錯誤情形。
  • 最後,也是最重要的,帶r個校檢位的多項式編碼可以檢測到所有長度小於等於r的突發錯誤。長度為k的突發錯誤可以用xi(xk-1+xk-2+……+1)來表示,這裡 i 決定了突發錯誤的位置距離幀的最右端有多遠。如果G(x)包含一個x0的項,則它不可能有xi因子,所以,如果括號內表示式的階小於G(x)的階,則餘數永遠不可能為0。如果突發錯誤的長度為r+1,則當且僅當突發錯誤與G(x)一致時(括號表示式與G(x)相同),錯誤多項式除以G(x)的餘數才為0。根據突發錯誤的定義,第一位和最後一位必須為1,所以它是否與G(x)匹配取決於其他 r-1 箇中間位。如果所有的組合被認為是等概率的話,則這樣一個不正確的幀被當做有效幀接收的概率是1/2r-1。同樣可以證明,當一個長度大於r+1位的突發錯誤發生時,或者幾個短突發錯誤發生時,一個壞幀這當做有效幀通過檢測的概率為1/2r,這裡假定所有的幀模式都是等概率的。
  • 一些特殊幀已經成為國際標準,其中一個被IEEE 802用在乙太網示例中,多項式為:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x1+1
  • 除了其他優良特性外,該多項式還能檢測到長度小於等於32的所有突發錯誤,以及影響到奇數位的全部突發錯誤,20世紀80年代後它得到了廣泛應用。Castagnoli (1993) 和 Koopman (2002)採用窮盡計算搜尋,發現了最好的CRC。這些CRC針對典型訊息長度獲得的海明距離為6,而IEEE標準的CRC-32的海明距離只有4。雖然計算CRC所需的運算看似複雜,但硬體上通過簡單的移位暫存器電路很容易計算和驗證CRC,實際上,這樣的硬體幾乎一直被使用著。數十種網路標準採用了不同的CRC,包括幾乎所有的區域網(如乙太網,802.11)和點到點鏈路(SONET上的資料包)。