1. 程式人生 > >迴圈冗餘檢驗演算法(CRC)與幀檢驗序列(FCS)

迴圈冗餘檢驗演算法(CRC)與幀檢驗序列(FCS)

在資料鏈路層要解決資料傳輸的三個問題:

  • 封裝成幀
  • 透明傳輸
  • 差錯檢驗

這裡,重點討論一下差錯檢測裡面最常用的一種檢測演算法,迴圈冗餘演算法(CRC)以及通過這個演算法生成的幀檢驗序列(FCS)

首先,我們知道,資料在傳輸過程中可能會因為外界的電磁干擾從而使資料產生差錯。使原來的0變為1,原來的1變為0。這叫做位元差錯。在一段時間內,傳輸錯誤的位元佔傳輸位元總數的比率稱為誤位元速率。所以說,正因為如此,我們開始採用各種檢驗差錯的措施,而最廣泛使用的就是迴圈冗餘檢驗(CRC)

通過一個例子來說明CRC的原理:

首先在傳送端,先把需要傳送的資料劃分為組,假定每組k個位元。現假定待傳送的資料M為101001(k=6)。CRC運算就是在資料M的後面新增供差錯檢驗用的n位冗餘碼,然後構成一個幀傳送出去,一共傳送了(k+n)位。

這n位冗餘碼可以利用以下的這個方法得到:

CRC

首先我們在原來的資料後面加n個0,這樣原來的資料就相當於左移了3位,也就是M*8,然後將加0之後得到的(k+n)位的數除以雙方事先商定好的長度為(n+1)位的除數P,得出的商是Q而餘數為R(n位)。接下來,讓我們看看這個計算過程:

  • 1、資料前四位是1010,首位是1,除數為1101,所以我們先商1
  • 2、然後寫在下面的就是1101,與1010進行不進位加法,結果為1110
  • 3、1110的首位依然是1,繼續商1,然後進行不進位加法,結果為0111
  • 4、0111的首位為0,所以商0,然後同樣不進位加法,結果為1110
  • 5、就這樣一直往後算,直到最後求得餘數R

從圖中可以看出,最後得出的餘數R為001,這個餘數R就作為資料M後面新增的n位冗餘碼。即,R就是所謂的幀檢驗序列(FCS)

強調一下:迴圈冗餘檢驗CRC是一種檢驗方法,而FCS是新增在資料後面的幀檢驗序列。檢錯方法有很多,我們也可以選用別的檢錯方法。

然後,就是接收端接收的時候,對接收到的資料以幀為單位進行CRC檢測:把收到的每一幀都除以同樣的除數P,然後檢測得到的餘數R。

如果傳輸過程中沒有差錯,那麼經過CRC檢驗後得出的餘數一定為0;如果R≠0,那麼再傳輸過程中,肯定會有差錯,則這個幀就丟棄。

還有一種情況就是:如果出現誤碼,餘數R仍然等於0。通過實際檢測計算,出現這種情況的概率非常非常小。

在資料鏈路層,傳送端幀檢驗序列FCS的生成和接收端的CRC檢驗都是用硬體完成的,處理很迅速,因此並不會延誤資料的傳輸。

從上述我們也可以看出,如果想要進行差錯檢驗,加入冗餘碼,就必須以幀為單位來傳送資料,然後每一幀都加入冗餘碼,一幀一幀傳送,接收端一幀一幀檢驗。

注:CRC檢驗只能保證接收端接收到的幀沒有差錯,至於有沒有出現幀丟失,幀重複,幀失序,是無法判斷的。

過去,由於通訊鏈路質量不好引起差錯的概率比較大,所以,我們要求資料鏈路層向網路層提供可靠傳輸,增加了幀編號,確認和重傳機制。提供可靠傳輸的協議是高階資料鏈路控制(HDLC)。但是,現在由於通訊鏈路的質量已經大大提高,誤位元速率大大降低,所以對於現在的Internet採取了區別對待的方法:

  • 對於通訊質量良好的有限傳輸鏈路,資料鏈路層不提供可靠傳輸,如果資料鏈路層的資料出了差錯,則改正差錯的的任務就由上層協議來完成。
  • 對於通訊質量較差的無線傳輸鏈路,資料鏈路層使用確認和重傳機制,向上層提供可靠的傳輸服務。

通過實踐證明,這樣做可以提高通訊效率。