天天看點

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

第11章 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所示。

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

在該圖中,我們特地舉了一個奇數長度的資料報例子,因而在計算檢驗和時需要加上填充位元組。注意,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)。但是,許多系統沒有遵守這一點,隻是在出口檢驗和選項被打開時才驗證

接收到的檢驗和。

很難知道某個特定系統是否打開了 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資料報給标準回顯伺服器。

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

從這裡可以看出,三個系統中有兩個打開了 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檢驗和選項。

文獻[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的檢驗和,因為這些都隻是簡單的檢驗和,不能檢測出所有可能發生的差錯。

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