天天看點

《計算機網絡課程設計(第2版)》——2.3節相關知識

2.3 相關知識

校驗和的概念

網絡上的資料最終都是通過實體傳輸線路進行傳輸的,如果高層沒有采用差錯控制,那麼實體層傳輸的資料可能有差錯。為了保證傳輸資料的正确性,在實體層的基礎上設計了資料鍊路層。設計資料鍊路層的主要目的就是在原始的、有差錯的實體傳輸線路的基礎上,采用差錯檢測、差錯控制與流量控制等方法,将有差錯的實體線路改進成邏輯上無差錯的資料鍊路,以向網絡層提供高品質的服務。

目前,進行差錯檢測和控制的主要方法是:發送方在需要發送的資料後面增加一定的備援資訊,這些備援資訊通常是通過對發送的資料進行某種算法計算而得到的。接收方對接收資料進行同樣的計算,然後與資料後面附加的備援資訊進行比較,如果比較結果不同就說明在傳輸中出現了差錯,并要求發送方重新傳送該資料,以此達到確定資料準确性的目的。

在普遍使用的網絡協定(例如ip、icmp、igmp、udp與tcp等)中,通常都設定了校驗和字段以儲存這些備援資訊。計算這些校驗和的算法稱為網絡校驗和算法,就是将被校驗的資料按16位進行累加,然後取反碼,如果資料位元組長度為奇數,則資料尾部補一個位元組的0以湊成偶數。關于計算校驗和算法的詳細資訊請參考rfc 1071。

計算校驗和

有很多數學方法可以用來提高校驗和的計算速度,下面我們将就此展開讨論。

(1) 交換性與結合性

因為校驗和主要考慮被校驗資料中所包含位元組的數量是奇數還是偶數,是以校驗和的計算可以以任意順序進行,甚至可以把資料進行分組後再計算。

例如,用a,b,c,d,…,y,z分别表示一系列八位組,用[a,b]這樣形式的位元組組來表示a×256 + b的整數,那麼16位校驗和就可以通過以下形式給出:

所得到的結果與[1]式是相同的(當然結果也是要進行一次反轉的)。為什麼會是這樣呢?我們發現兩種順序獲得的進位是相同的,都是從第15位到第0位進位以及從第7位到第8位進位。這也就是說,交換位元組位置隻是改變高低位位元組的排列順序,但并沒有改變它們的内在聯系。

是以,無論底層的硬體設定中對位元組的接收順序如何,校驗和都可以被準确地校驗出來。例如,假設校驗和是以主機序(高位位元組在前低位位元組在後)計算的資料幀,但以網絡序(低位位元組在前高位位元組在後)存放在記憶體中。每一個16位的字中的位元組在傳送過程中都交換了順序,在計算校驗和之後仍會先交換位置再存入記憶體,這樣就與接收到的原本以網絡序存儲的資料幀中的校驗和項保持一緻了。

(3) 并行計算

某些機器的字處理長度是16位的倍數,這樣可以提高它的計算速度。由于加法所具有的結合性,我們沒有必要按照順序對每個位元組進行累加。相反,我們可以利用這一特點對它們進行并行累加。

并行地計算校驗和隻是增加了每次累加的資訊長度。例如,在一個32位的機器上,我們可以一次增加4位元組,即[a, b, c, d]+鍘<撲憬崾笤侔牙奂雍汀罷鄣逼鹄矗岩桓?2位的數值變為16位,這樣産生的新的進位也要循環累加起來。

此外,在此仍不需考慮位元組順序的問題,我們可以用訹d, c, b, a]+鍘騕b, a, d, c] +鍘庋乃承蚶醇撲阈Q楹停钪趙偻ü換?6位校驗和中的位元組序來得到正确的值。這些改變順序的方法都是為了讓所有的偶數位元組進入一個校驗和位元組,所有的奇數位元組進入一個校驗和位元組。

示例

下面将通過一個簡單的例子來示範通過上述的幾種方法所得到的校驗和的情況。

《計算機網絡課程設計(第2版)》——2.3節相關知識
《計算機網絡課程設計(第2版)》——2.3節相關知識

一些編碼技術可以提高校驗和的計算速度

(1) 延遲進位法

這種方法在主要的累加循環結束之後再把進位值累加進和值。其實作方式就是用32位的累加器獲得16位校驗和,這樣溢出就産生在高16位上。這種方法避免了累加器中進位傳感器機構的設定,但是它要求的容量是原來的累加器容量的兩倍,是以它更多地依賴于硬體條件。

(2) 反向循環法

這種方法可以減少由循環而産生的負荷,有效地展開内部的累加循環,把循環過程中的一系列加法指令複制下來。這種技術通常可以節省大量的時間,但是程式的邏輯設計會比較複雜。

(3) 合并資料拷貝法

計算校驗和以及讀入資料都需要将資料從記憶體的一個位置轉移到另一個位置,這樣會占用記憶體總線的帶寬,而記憶體總線的傳輸效率是提高校驗和計算速度的瓶頸,尤其是對于某些機器(如一些簡單的慢速的微型機)來說,這個問題尤為嚴重。

為了解決這個問題,可以把資料讀入的過程與校驗的過程合二為一,也就是在讀入資料的同時計算校驗和,這樣就可以省去一次資料移動的過程,進而提高校驗和的計算速度。

繼續閱讀