【8】TCP/IP協議族詳解-UDP協議

聲明:本博客參考自《TCP/IP詳解卷一:協議》

1.概述

UDP是一個簡單的面向數據報的運輸層協議。進程的每個輸出操作都會產生一個UDP數據報,並組裝成一份待發送的IP數據報。

UDP把應用程序傳給IP層的數據報發送出去,但是並不保證數據報一定到達,是一種不可靠的傳輸協議。正是因爲它不做任何的檢測,所以它有着很快的傳輸速率,適合對實時性要求比較高的通信環境。

2.UDP首部

①端口號用來區分發送進程(源端口)和接收進程(目的端口)。注意TCP端口和UDP端口是相互獨立的,同一個端口號可以用於TCP和UDP。但是,如果TCP和UDP同時提供某種知名服務,它們的端口一般是相同的。

②UDP長度字段指的是UDP首部和UDP數據的字節長度。該字段的最小值爲8字節(0字節UDP數據報)。IP數據報長度指的是數據報全長,因此UDP數據報長度是全長減去IP首部的長度。

③UDP檢驗和覆蓋UDP首部和UDP數據。UDP的數據報的長度可以爲奇數字節,但是計算檢驗和的時候是16bit字相加。這種時候一般會在最後填充0字節。UDP數據報和TCP數據報都會在計算檢驗和的時候增加僞首部,其目的是讓UDP兩次檢查數據是否正確到達目的地。下圖是計算檢驗和時,各個字段的內容。

如果發送端沒有計算檢驗和而接收端檢測到檢驗和有差錯,那麼UDP數據報被悄悄丟棄,不產生任何差錯報文。

3. IP分片

物理網絡一般要限制每次發送數據幀的最大長度。任何時候IP層接收到一份要發送的IP數據報時,它要判斷向本地哪個接口發送數據(選路),並查詢該接口獲得其MTU,並確定是否需要分片。當一份數據報分片之後,只有到達目的地之後才進行重組,重組的操作是由IP層來進行處理的。已經分片過的數據報可能會再分片,這要根據路徑上的MTU來決定。

對於發送端發送的每一份IP數據報來說,其標識字段都包含唯一值。該值在數據報分片時被複制到每一片中。對照着下面IP首部的報文格式,我們來說明一下。

3位標誌字段其中一個比特來表示"更多的片"。除最後一片外,其它每個組成數據報的片都把該比特置1。片偏移字段指的是該片偏移原始數據報開始處的位置。3位標誌字段中的“不分片”位,表示如果將該比特置1,IP將不對數據分片。需要分片的時候,會將該數據報丟棄併發送一個ICMP差錯報文("需要分片但設置了不分片比特差錯")給發送端。

使用UDP發送1473字節的用戶數據,IP層分片的格式如下:

①在分片時,除最後一片外,其他每一片的數據部分(除IP首部外)必須是8字節的整數倍。

②分片的每一片都有IP首部,但只有第一片有傳輸層首部。

③MTU的最大長度:IP首部(20)+UDP首部(8)+用戶數據(1472)=1500

4. ICMP不可達差錯(需要分片)

當路由器接收到一份需要分片的數據報,而在IP首部又設置了不分片(DF)的標誌比特,就會產生一份需要分片但又設置不分片標誌比特的ICMP不可達差錯報文。這種類型的報文可以被用來發現到達目的端的路途中最小MTU是多少。下圖是這種ICMP不可達差錯報文的格式:

如果路由器不提供通告MTU的選項或者進行了特殊設置,則下一站網絡MTU會被設置成0。

5. Traceroute

Traceroute程序可以記錄IP數據報從一臺主機到另一臺主機所經過的路由。ping程序的記錄路由選項(RR)有着諸多的限制,而Traceroute程序只需要目的端運行一個UDP模塊即可。

Traceroute程序使用ICMP報文和IP首部的TTL字段。每個處理數據報的路由器都需要把TTL的值減1,當路由器收到一份IP數據報,如果其TTL字段是0或1,則路由器不轉發報文並向發送端發送一份ICMP“超時信息”。Traceroute程序的關鍵在於包含這份ICMP信息的IP報文的發送端是該路由器的IP地址。

5.1 Traceroute程序原理

Traceroute程序的操作過程如下面的描述所示:

①它發送一份TTL字段爲1的UDP數據報給目的主機。處理這份數據報的第一個路由器將TTL的值減1,丟棄該報文併發回一份超時ICMP報文,這樣就得到該路徑中的第一個路由器的地址。

②它發送一份TTL字段爲2的UDP數據報給目的主機,同理可以得到第二個路由器的地址。依此類推,可得的第n個路由器地址。

③由於Traceroute程序發送的UDP數據報,它選擇一個不可能的值作爲UDP端口,當數據到達目的主機時,將使目的主機的UDP模塊產生一份"端口不可達"錯誤的ICMP報文。發送端就可以以此判斷數據報到達目的主機。

Traceroute程序發送的UDP數據報一共40個字節:IP首部(20)+UDP首部(8)+用戶數據(12)。其中用戶數據包含每發一個數據報就加一的序列號,送出TTL的副本以及發送數據的時間。

ICMP"超時"報文的格式如下:

這種由TTL產生的報文,代碼字段爲0。主機在組裝分片的時候也有可能發生超時,這時發送的超時報文代碼字段爲1。

關於Traceroute的幾點說明:

①不能保證現在的路由也是將來所有采用的路由,甚至兩份連續的IP數據報都可能採用不同的路由。

②不能保證ICMP報文的路由與Traceroute程序發送的UDP數據報採用同一路由,這表明Traceroute計算的往返時間可能不準。

③返回ICMP報文中的發送端IP地址是UDP數據報到達的路由器接口的IP地址。注意與IP記錄路由選項區分開來。

5.2 IP源站路由選項

通常IP路由是動態的,每個路由器自主判斷數據報的轉發路由器,應用程序不應該進行控制。但是源站路由的選項打破了這個限制。源站路由(source routing)是由發送者指定路由,它可以採用如下的兩種形式:

①嚴格源站路由。發送端指明IP數據報所必須採用的確切路徑。如果某一個路由器發現源站路由所指定的下一個路由器不在其直接連接的網絡上,那麼它就返回一個"源站路由失敗"的ICMP差錯報文。

②寬鬆源站路由。發送端指明一個數據報經過的IP地址清單,但是數據報在清單上指明任意兩個地址之間可以通過其他路由器。

IP首部中源站路由選項的通用格式如下:

這個格式與記錄路由選項的格式基本相同。不同之處在於,對於源站路由選項,在發送IP之前必須填充IP地址清單;而記錄路由選項,需要爲IP地址清單分配一些空間,並讓路由器填充該清單的各項。

對於寬鬆源站路由來說code字段爲0x83,而嚴格源站是0x89。

在上圖中,主機上的應用程序發送一份數據報到D,指定源站路由爲R1,R2和R3。#b表示指針字段,對應源站路由選項通用格式的ptr。

說明:

①發送主機從應用程序接收源站路由清單,將最終目的地址D換成R1,將源站路由表向前移動,將D放入源站路由表最後。

③每經過一個路由器都將現在的目的地址放入路由表最後,將路由表第一個地址放入下一站地址中。

當應用程序接收到由發送端指定的路由數據時,在發送應答時,應該讀出接收到的路由值,並提供反向路由。

traceroute如何設置:

寬鬆源站路由:traceroute -g IP或域名          最多可以指定8個

嚴格源站路由:traceroute -G IP或域名         最多可以指定8個

5.3 用Traceroute確定路徑MTU

可以通過traceroute來確定路徑MTU,要做的是發送分組,並設置“不分片”標誌比特。發送的第一個分組的長度正好與出口MTU相等,每次收到ICMP“不能分片”差錯時就減小分組的長度。如果路由器發送的ICMP差錯報文包含MTU,那麼就用該MTU值來發送,否則就用下一個最小的MTU值來發送。

6. 最大UDP數據報長度

理論上IP數據報的最大長度是65535字節,這是由IP首部16比特總長度字節所限制的。去除20字節的IP首部和8字節的UDP首部。UDP數據報中用戶數據的最長長度爲65507字節。但是大多數實現所提供的長度比這個最大值小。

第一:應用程序可能會受到程序接口的限制。

第二:TCP/IP的內核實現。可能存在一些實現特性,使IP數據報的長度小於65535字節。

UDP編程接口允許應用程序指定每次返回的最大字節數,如果接收到的數據報長度大於應用程序所能處理的長度,數據會被截斷。而TCP提供的是字節流,數據沒有邊界,所以不會發生數據截斷的情況。

7. ICMP源站抑制

當一個系統(路由器或主機)接收數據的速度比其處理數據的速度快的時候,可能會發生這個差錯,但是不一定會發生。即使系統已經開始丟棄數據。

下圖是源站抑制報文的格式:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章