1. 程式人生 > >《TCP/IP協議族》:UDP協議

《TCP/IP協議族》:UDP協議

1. UDP概述

UDP:User Datagram Protocol 使用者資料報協議

2. UDP 有如下的特點:

無連線、不可靠

無連線:意思就是在通訊之前不需要建立連線,直接傳輸資料。

不可靠:是將資料報的分組從一臺主機發送到另一臺主機,但並不保證資料報能夠到達另一端,任何必須的可靠性都由應用程式提供。在 UDP 情況下,雖然可以確保傳送訊息的大小,卻不能保證訊息一定會達到目的端。沒有超時和重傳功能當 UDP 資料封裝到 IP 資料報傳輸時,如果丟失,會發送一個 ICMP 差錯報文給源主機。即使出現網路阻塞情況,UDP 也無法進行流量控制。此外,傳輸途中即使出現丟包,UDP 也不負責重發

,甚至當出現包的到達順序雜亂也沒有糾正的功能。

UDP是一種無連線的, 即傳送資料前不需要建立連線,因此減小的開銷和傳送資料的延遲

UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連線狀態表

UDP沒有擁塞控制,因此網路出現的擁塞不會使主機的傳送率降低

UDP支援一對一,一對多,多對一和多對多的互動通訊

UDP首部開銷小,只有8位元組,比TCP的20個位元組的首部要短

在網路質量令人十分不滿意的環境下,UDP 協議資料包丟失會比較嚴重。但是由於 UDP 的特性:它不屬於連線型協議,因而具有資源消耗小,處理速度快的優點,所以通常音訊、視訊和普通資料在傳送時使用 UDP 較多

,因為它們即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。比如我們聊天用的 ICQ 和 QQ 就是使用的 UDP 協議。

3. UDP報文格式

UDP在IP報文中的位置如圖所示:

UDP報文格式如圖所示:

UDP首部

源埠號:佔16位,源主機的應用程序所使用的埠號

目標埠號:佔16位,目標主機的應用程序所使用的埠號,也就是我們需要通訊的目標程序

UDP(包)報長度:UDP使用者資料報的長度,資料部分+UDP首部之和為UDP報長度。最小8個位元組(傳送一份0位元組的UDP資料報是可以的

檢驗和:

檢驗和是為了提供可靠的 UDP 首部和資料而設計,這裡不要和上面的不可靠傳輸搞混淆了,這裡提供可靠的UDP首部,是因為一個程序可能接受多個程序過來的報文,那麼如何區分他們呢?

當進行檢驗和計算時,要在UDP資料報之前增加臨時的12個位元組偽首部,就是通過5個東西來進行區分的, “源 IP 地址”、“目的 IP 地址”、“協議號”、“源埠號”、“目標埠號”的,這個檢測可靠,是檢測接受哪個正確的報文,也就是說是哪個報文要進這個埠。那個不可靠,說的是這個報文可能丟失,可能其中資料損壞了我們不關心,但是這些的前提是,你得傳輸到正確的目的地去,不然亂出亂髮資料報,豈不是亂套了。

詳細說明下:

1. UDP資料報的長度在檢驗和計算過程中出現兩次。(偽首部和首部)

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

3. 如果傳送端沒有計算檢驗和而接收端檢測到檢驗和有差錯,UDP資料報就要被丟棄。不產生任何差錯報文(當IP層檢測到IP首部檢驗和有差錯時也這樣做)。

4. UDP檢驗和是一個端到端的檢驗和。它由傳送端計算,然後由接收端驗證。其目的是為了發現UDP首部和資料在傳送端到接收端之間發生的任何改動。

5. 儘管UDP檢驗和是可選的,但是它們應該總是在用。

6. UDP檢驗和(事實上,TCP/IP協議簇中所有的檢驗和)是簡單的16 bit和。它們檢測不出交換兩個16 bit的差錯。

UDP偽首部

就是拿到IP層的一些資料,因為要進行檢驗和,就必須要有這些資料。其中檢驗的演算法跟IP層中檢驗首部的辦法是一樣的。

一個目標程序中,其中的報文協議,目標埠,目標ip地址肯定都是一樣的,但是源IP地址和源埠就可能不一樣,這就說明了不同源而同一目的地的報文會定位到同一佇列。通過這5個引數進行校驗和才能給到正確的目的地。

補充:

UDP檢驗和覆蓋UDP首部和UDP資料。而IP首部的檢驗和,只覆蓋IP的首部,並不覆蓋IP資料報中的任何資料。UDP和TCP在首部中都有覆蓋它們首部和資料的檢驗和。UDP的檢驗和是可選的,而TCP的檢驗和是必需的。UDP檢驗和的基本計算方法IP首部檢驗和計算方法相似(16 bit字的二進位制反碼和),但它們之間存在不同的地方:

1. UDP資料報的長度可以為奇數字節,但檢驗和演算法是把若干個16 bit字相加。解決方法是必要時在最後增加填充位元組0,這只是為了檢驗和的計算,可能增加的填充位元組不被傳送。

2. UDP資料報和TCP段都包含一個12位元組長的偽首部,它是為了計算檢驗和而設定的。偽首部包含IP首部一些欄位,目的是讓UDP兩次檢查資料是否已經正確到達目的地。