《TCP/IP詳解卷1:協議》第11章 UDP:使用者資料包協議-讀書筆記

QingLiXueShi發表於2015-04-21

章節回顧:

《TCP/IP詳解卷1:協議》第1章 概述-讀書筆記

《TCP/IP詳解卷1:協議》第2章 鏈路層-讀書筆記

《TCP/IP詳解卷1:協議》第3章 IP:網際協議(1)-讀書筆記

《TCP/IP詳解卷1:協議》第3章 IP:網際協議(2)-讀書筆記

《TCP/IP詳解卷1:協議》第4章 ARP:地址解析協議-讀書筆記

《TCP/IP詳解卷1:協議》第5章 RARP:逆地址解析協議-讀書筆記

《TCP/IP詳解卷1:協議》第6章 ICMP:Internet控制報文協議-讀書筆記

《TCP/IP詳解卷1:協議》第11章 UDP:使用者資料包協議-讀書筆記

《TCP/IP詳解卷1:協議》第17、18章 TCP:傳輸控制協議(1)-讀書筆記

《TCP/IP詳解卷1:協議》第17、18章 TCP:傳輸控制協議(2)-讀書筆記

《TCP/IP詳解卷1:協議》第19章 TCP的互動資料流-讀書筆記

 

1、引言

UDP是一個簡單的面向資料包的運輸層協議:程式的每個輸出操作都正好產生一個UDP資料包,並組裝成一份待傳送的IP資料包。UDP資料包封裝成一份IP資料包的格式如圖11-1所示。

說明:

(1)UDP不提供可靠性:它把應用程式傳給IP層的資料傳送出去,但是並不保證它們能到達目的地。

(2)應用程式必須關心IP資料包的長度。如果它超過網路的MTU,就要對IP資料包進行分片。如果需要,源端到目的端之間的每個網路都要進行分片,並不只是傳送端主機連線第一個網路才這樣做(路徑MTU與網路MTU的概念可以參考:《TCP/IP詳解卷1:協議》第2章 鏈路層-讀書筆記)。

 

2、UDP首部

UDP首部的各欄位如圖11-2所示。

說明:

(1)埠號表示傳送程式和接收程式。TCP埠號與UDP埠號是相互獨立的。如果TCP和UDP同時提供某種知名服務,兩個協議通常選擇相同的埠號,只是為了方便,而不是協議本身的要求。

(2)UDP長度欄位指的是UDP首部和UDP資料的位元組長度。該欄位的最小值為8位元組(傳送一份0位元組的UDP資料包是可以的)。這個UDP長度是有冗餘的。

(3)UDP資料包長度是全長減去IP首部的長度。

 

3、UDP檢驗和

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兩次檢查資料是否已經正確到達目的地。UDP資料包中的偽首部格式如圖11-3所示。

說明:

(1)UDP資料包的長度在檢驗和計算過程中出現兩次。

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

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

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

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

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

 

4、IP分片

物理、網路層一般要限制每次傳送資料幀的最大長度。任何時候IP層接收到一份要傳送的IP資料包時,它要判斷向本地哪個介面傳送資料(選路),並查詢該介面獲得其MTU。IP把MTU與資料包長度進行比較,如果需要則進行分片。

說明:

(1)分片可以發生在原始傳送端主機上,也可以發生在中間路由器上。

(2)把一份IP資料包分片以後,只有到達目的地才進行重新組裝。重新組裝由目的端的IP層來完成,目的是使分片和重新組裝過程對運輸層(TCP和UDP)是透明的。

注意:其他網路協議可能要求在下一站就進行進行重新組裝,而不是在最終的目的地。

(3)已經分片過的資料包有可能會再次進行分片(可能不止一次)。

IP首部中包含的資料為分片和重新組裝提供了足夠的資訊。

IP分片過程:

(1)對於傳送端傳送的每份IP資料包,標識欄位都包含一個唯一值,該值在資料包分片時被複制到每個片中。

(2)標誌欄位用其中一個位元來表示“更多的片”。除了最後一片外,其他每個組成資料包的片都要把該位元置1。

(3)片偏移欄位指的是該片偏移原始資料包開始處的位置。

說明:

(1)當資料包被分片後,每個片的總長度值要改為該片的長度值。

(2)標誌欄位中有一個位元稱作“不分片”位。如果將這一位元置1,IP將不對資料包進行分片。相反把資料包丟棄併傳送一個ICMP差錯報文給起始端。

(3)當IP資料包被分片後,每一片都成為一個分組,具有自己的IP首部,並在選擇路由時與其他分組獨立。當資料包的這些片到達目的端時有可能會失序,但在IP首部中有足夠的資訊讓接收端能正確組裝這些資料包片。

(4)在分片時,除最後一片外,其他每一片中的資料部分(除IP首部外的其餘部分)必須是8位元組的整數倍。

(5)任何運輸層首部只出現在第1片資料中。

 

5、ICMP不可達差錯(需要分片)

發生ICMP不可達差錯的另一種情況是(前面講過埠不一致也會導致ICMP不可達差錯),當路由器收到一份需要分片的資料包,而在IP首部又設定了不分片(DF)的標誌位元。

如果某個程式需要判斷到達目的端的路途中最小MTU是多少(路徑MTU發現機制),那麼這個差錯就可以被該程式使用。報文格式如圖11-9所示:

 

6、最大UDP資料包長度

理論上,IP資料包的最大長度是65535位元組(IP首部16位元總長度欄位)。去除20位元組的IP首部和8位元組的UDP首部,UDP資料包中使用者資料的最大長度為65507位元組。但實際大多數實現所提供的長度比這個最大值小。

(1)應用程式可能會受到其程式介面的限制

socket API提供了一個可供應用程式呼叫的函式,以設定接收和傳送快取的長度。這個長度與應用程式可以讀寫的最大UDP資料包的長度直接相關,現在的大部分系統都預設提供可讀寫大於8192位元組的UDP資料包。

(2)限制來自於TCP/IP的核心實現。

可能存在一些實現特性(或差錯),使IP資料包長度小於65535位元組。

資料包截斷:

IP能夠傳送或接收特定長度的資料包並不意味著接收應用程式可以讀取該長度的資料。UDP程式設計介面允許應用程式指定每次返回的最大位元組數。如果接收到的資料包長度大於應用程式所能處理的長度,發生的情況取決於程式設計介面和實現。例如:Berkeley版socket API對資料包進行截斷,並丟棄任何多餘的資料。

 

7、ICMP源站抑制差錯

當一個系統(路由器或主機)接收資料包的速度比其處理速度快時,可能產生這個差錯。

注意:“可能”產生這個差錯。即使一個系統已經沒有快取並丟棄資料包,也不要求它一定要傳送源站抑制報文。

 

8、UDP伺服器的設計

對於伺服器來說,它啟動後處於休眠狀態,等待客戶請求的到來。對於UDP來說,當客戶資料包到達時,伺服器甦醒過來,資料包中可能包含來自客戶的某種形式的請求訊息。

(1)客戶IP地址及埠號

IP首部包含源端和目的端IP地址,UDP首部包含了源端和目的端的UDP埠號。當一個應用程式接收到UDP資料包時,作業系統必須告訴它是誰傳送了這份訊息,即源IP地址和埠號。這個特性允許一個互動UDP伺服器對多個客戶進行處理。給每個傳送請求的客戶發回應答。

(2)目的IP地址

一些應用程式需要知道資料包是傳送給誰的,即目的IP地址。這要求作業系統從接收到的UDP資料包中將目的IP地址交給應用程式。

(3)UDP輸入佇列

大多數UDP伺服器是互動伺服器。這意味著,單個伺服器程式對單個UDP埠上(伺服器上的名知埠)的所有客戶請求進行處理。

通常程式所使用的每個UDP埠都與一個有限大小的輸入佇列相聯絡。來自不同客戶的差不多同時到達的請求將由UDP自動排隊。接收到的UDP資料包以其接收順序交給應用程式

排隊溢位造成核心中的UDP模組丟棄資料包的可能性是存在的。

1)應用程式並不知道其輸入佇列何時溢位。只是由UDP對超出資料包進行丟棄處理。

2)沒有發回任何資訊告訴客戶其資料包被丟棄。

 

(4)限制本地IP地址

大多數UDP伺服器在建立UDP端點時都使其本地IP地址具有萬用字元(wildcard)的特點。表明進入的UDP資料包如果其目的地為伺服器埠,那麼在任何本地介面均可接收到它。

另一方面當伺服器建立端點時,它可以把其中一個主機本地IP地址包括廣播地址指定為端點的本地IP地址。只有當目的IP地址與指定的地址相匹配時,進入的UDP資料包才能被送到這個端點。

(5)限制遠端IP地址

大多數系統都允許UDP端點對遠端地址進行限制,即端點將只能接收特定IP地址和埠號的UDP資料包。

(6)每個埠有多個接收者

大多數系統在某一時刻只允許一個程式端點與某個本地IP地址及UDP埠號相關聯。當目的地為該IP地址及埠號的UDP資料包到達主機時,就複製一份傳給該端點。

然而,在一個支援多播的系統上,多個端點可以使用同一個IP地址和UDP埠號。

當UDP資料包到達的目的IP地址為廣播地址或多播地址,而且在目的IP地址和埠號處有多個端點時,就向每個端點傳送一份資料包的複製。如果UDP資料包到達的是一個單播地址,那麼只向其中一個端點傳送一份資料包的複製。選擇哪個端點傳送資料取決於各個不同的系統實現

 

小結:

(1)UDP是一個簡單協議,它向使用者程式提供的服務位於IP層之上,包括埠號和可選的檢驗和。ICMP不可達差錯,是新的路徑MTU發現功能中的一部分。

(2)對於UDP和ARP之間的介面,大多數的ARP實現在等待ARP應答時只保留最近傳送給目的端的資料包。

(3)當系統接收IP資料包的速率超過這些資料包被處理的速率時,系統可能傳送ICMP源站抑制差錯報文。使用UDP時很容易產生這樣的ICMP差錯。

相關文章