速讀原著-TCP/IP(UDP檢驗和)

第11章 UDP:用戶數據報協議

11.3 UDP檢驗和

U D P檢驗和覆蓋U D P首部和U D P數據。回想I P首部的檢驗和,它只覆蓋 I P的首部—並不覆蓋I P數據報中的任何數據。

U D P和T C P在首部中都有覆蓋它們首部和數據的檢驗和。 U D P的檢驗和是可選的,而T C P的檢驗和是必需的。

儘管U D P檢驗和的基本計算方法與我們在 3 . 2節中描述的 I P首部檢驗和計算方法相類似(16 bit字的二進位反碼和),但是它們之間存在不同的地方。首先, U D P數據報的長度可以為奇數位元組,但是檢驗和演算法是把若干個 16 bit字相加。解決方法是必要時在最後增加填充位元組0,這只是為了檢驗和的計算(也就是說,可能增加的填充位元組不被傳送)。

其次,U D P數據報和T C P段都包含一個 1 2位元組長的偽首部,它是為了計算檢驗和而設置的。偽首部包含 I P首部一些欄位。其目的是讓 U D P兩次檢查數據是否已經正確到達目的地(例如, I P沒有接受地址不是本主機的數據報,以及 I P沒有把應傳給另一高層的數據報傳給U D P)。U D P數據報中的偽首部格式如圖 11 - 3所示。

在該圖中,我們特地舉了一個奇數長度的數據報例子,因而在計算檢驗和時需要加上填充位元組。注意,U D P數據報的長度在檢驗和計算過程中出現兩次。

如果檢驗和的計算結果為 0,則存入的值為全 1(6 5 5 3 5),這在二進位反碼計算中是等效的。如果傳送的檢驗和為0,說明發送端沒有計算檢驗和。

如果發送端沒有計算檢驗和而接收端檢測到檢驗和有差錯,那麼 U D P數據報就要被悄悄地丟棄。不產生任何差錯報文(當 I P層檢測到I P首部檢驗和有差錯時也這樣做)。

U D P檢驗和是一個端到端的檢驗和。它由發送端計算,然後由接收端驗證。其目的是為了發現U D P首部和數據在發送端到接收端之間發生的任何改動。

儘管U D P檢驗和是可選的,但是它們應該總是在用。在 8 0年代,一些電腦產商在默認條件下關閉U D P檢驗和的功能,以提高使用 U D P協議的N F S(Network File System)的速度。

在單個區域網中這可能是可以接受的,但是在數據報通過路由器時,通過對鏈路層數據幀進行循環冗餘檢驗(如乙太網或令牌環數據幀)可以檢測到大多數的差錯,導致傳輸失敗。不管相信與否,路由器中也存在軟體和硬體差錯,以致於修改數據報中的數據。如果關閉端到端的U D P檢驗和功能,那麼這些差錯在 U D P數據報中就不能被檢測出來。另外,一些數據鏈路層協議(如S L I P)沒有任何形式的數據鏈路檢驗和。

Host Requirements RFC聲明,U D P檢驗和選項在默認條件下是打開的。它還聲明,如果發送端已經計算了檢驗和,那麼接收端必須檢驗接收到的檢驗和(如接收到檢驗和不為0)。但是,許多系統沒有遵守這一點,只是在出口檢驗和選項被打開時才驗證 接收到的檢驗和。

11.3.1 tcpdump輸出

很難知道某個特定系統是否打開了 U D P檢驗和選項。應用程式通常不可能得到接收到的U D P首部中的檢驗和。為了得到這一點,作者在 t c p d u m p程式中增加了一個選項,以列印出接收到的U D P檢驗和。如果列印出的值為 0,說明發送端沒有計算檢驗和。

測試網路上三個不同系統的輸出如圖 11 - 4所示(參見封面二)。運行我們自編的 s o c k程式(附錄C),發送一份包含9個位元組數據的U D P數據報給標準回顯伺服器。

從這裡可以看出,三個系統中有兩個打開了 U D P檢驗和選項。

還要注意的是,在這個簡單例子中,送出的數據報與收到的數據報具有相同的檢驗和值(第3和第4行,第5和第6行)。從圖11-3可以看出,兩個IP地址進行了交換,正如兩個埠號一樣。

偽首部和U D P首部中的其他欄位都是相同的,就像數據回顯一樣。這再次表明 U D P檢驗和(事實上,TCP/IP協議簇中所有的檢驗和)是簡單的16 bit和。它們檢測不出交換兩個16 bit的差錯。作者在1 4 . 2節中在8個域名伺服器中各進行了一次 D N S查詢。D N S主要使用U D P,結果只有兩台伺服器打開了UDP檢驗和選項。

11.3.2 一些統計結果

文獻[Mogul 1992 ]提供了在一個繁忙的N F S伺服器上所發生的不同檢驗和差錯的統計結果,時間持續了 4 0天。統計數字結果如圖 11 - 5所示。

最後一列是每一行的大概總數,因為乙太網和 I P層還使用其他的協議。例如,不是所有的乙太網數據幀都是 I P數據報,至少以 太網還要使用 A R P協議。不是所有的 I P數據報都是U D P或T C P數據,因為I C M P也用I P傳送數據。

注意,T C P發生檢驗和差錯的比例與 U D P相比要高得多。這很可能是因為在該系統中的T C P連接經常是「遠程」連接(經過許多路由器和網橋等中間設備),而U D P一般為本地通訊。

從最後一行可以看出,不要完全相信數據鏈路(如乙太網,令牌環等)的 C R C檢驗。應該始終打開端到端的檢驗和功能。而且,如果你的數據很有價值,也不要完全相信 U D P或T C P的檢驗和,因為這些都只是簡單的檢驗和,不能檢測出所有可能發生的差錯。

Tags: