11.1 引言
- 簡單的面向數據報的運輸層協議:進程的每個輸出操作產生一個UDP數據報,並組裝成一份待發送的IP數據報;
- 不提供可靠性,不保證能達到目的地;
- IP數據報分片;
11.2UDP首部
- TCP與UDP的端口號是相互獨立的。
- UDP長度指的是UDP首部和UDP數據的直接長度,最小為8字節,即數據量為0;
- UDP數據報長度是全長減去IP首部的長度
11.3UDP校驗和
- 檢驗范圍包括首部和數據
- 檢驗和是可選的
- 根據16bit校驗和算法,由於校驗數據個數可能為奇數個,因此計算是可能會增加一個填充字節;但此字節可能不會被傳送
- UDP和TCP數據報都包含一個12字節的偽首部
11.5IP分片
- 發送IP報文前,會先查詢對應接口的MTU。大於MTU將分片
- 每次分片后,在下一站就進行組裝,整個傳輸過程中,可能會多次分片
- 標志字段有一個比特稱為“部分片“位。如果置1,IP將不會分片。反而會丟棄,並發送一個ICMP差錯報文
- 分片的IP數據報到達時,可能是失序的
- IP協議沒有超時重傳,由更高級協議實現
- 如果傳輸過程中丟失一包IP報文,整個報文都將重傳,因為起始端無法知道數據報是如何分片的
- 分片時,拆分的范圍是UDP首部和UDP數據報,即UDP首部只在第一個分組中出現
11.6ICMP不可達差錯(需要分片)
- 當路由器收到一份需要分片的數據報,而IP首部又設置了不分片(DF)的標識比特,此時將產生ICMP不可達差錯報文(需要分片)
- 此差錯報文可以用來判斷到達目的端路途中最小MTU是多少,即路徑MTU發現機制
11.7用Traceroute確定路徑MTU
- 基本原理:發送已知長度的IP報文,通過檢查收到的ICMP“不能分片”差錯來判斷整個路徑中的最小MTU;當收到差錯時,減小分組長度,知道到達目的端口。
11.9UDP和ARP之間的交互作用
首先,清除arp緩存。arp -a
- 當發送一個會被分為6組的IP數據報時,每個IP數據報片都會發送一個ARP請求
- 在收到ARP請求的回復后,只發送最后一個數據報片,大多數實現都是這樣的
其次,超時后,並未收到ICMP差錯報文,原因有:
- Berkeley派生的實現從不產生該差錯,只是在定時器溢出是將該報文片丟棄
- 並未收到包含UDP首部的偏移量為0的第一 個數據報片,則不要求產生ICMP差錯,原因是沒有運輸層首部,無法去人哪個進程發送的數據報
11.10最大UDP數據報長度
- UDP編程接口允許應用程序制定每次返回的最大字節數。
- TCP已應用程序讀操作時所允許的長度來發送數據,因此,不會發生數據丟失
11.11ICMP源站抑制差錯
當一個系統接收數據報的速度比起處理速度比其處理速度快時,可能產生這個差錯。
協議提出路由器不應該產生源站抑制差錯報文。因其會消耗網絡帶寬,對於擁塞來說是一種無效而不公平的調整。
- BSD實現通常忽略接收到的源站抑制報文,因為當收到此報文時,可能造成此報文的進程已經終止了
UDP協議如果希望知道接收端是否收到數據,可在應用程序中建立一些應答機制。
11.12UDP服務器的設計
- 客戶IP地址及端口號:應用收到UDP數據報是,操作系統必須告訴它是誰發送了這份消息,即源IP地址和端口號。
- 目的IP地址:一些應用需要知道數據報是發送給誰的。即目的源IP。
- UDP輸入隊列:UDP接收隊列有可能能溢出,溢出直接丟棄,沒有其他類似源站抑制處理。此隊列是FIFO的。
- 限制本地IP地址:大多數UDP服務器在創建UDP端點時都使其本地IP具有通配符的特點。即如果UDP數據報目的地為服務端口,那么本地任何接口均可接收它。
- 限制遠端IP地址:允許UDP端點對遠端地址進行限制。
- 每個端口有多個接收者:多個端點可使用同一個IP地址和端口號。如果目的IP地址和端口號處有多個端點時,就行每個端點傳送一根數據報復制。
小結:
- UDP想用戶進程提供的服務位於IP成之上,包括端口號和可選的校驗和。
- ICMP不可達差錯,它是新路徑MTU發現功能的一部分。
- ICMP源站抑制差錯報文,處理速度慢於接收速度。
- 等待ARP應答時只保留最近傳送目的端的數據報。