UDP是一個簡單的面向數據報的運輸層協議:進程的每一個輸出操做都正好產生一個UDP數據報,並組裝成一份待發送的IP數據報。
UDP數據報封裝成一份IP數據報的格式如圖。算法
UDP不提供可靠性:它把應用程序傳給IP層的數據發送出去,可是並不保證他們能到達目的地。
應用程序必須關心IP數據報的長度。若是它超過忘了的MTU,那麼就要對IP數據報進行分片,若是須要,源端到目的端之間的每一個忘了都要進行分片,並不僅是發送端主機鏈接第一個網絡才這樣。網絡
如圖:blog
(1)16位源端口號:端口號表示發送進程和接收進程,TCP和UDP用目的端口號來分用來自IP層的數據的過程。因爲IP層已經把IP數據報分配給TCP或UDP(根據IP首部中協議字段值),所以TCP端口號由TCP來查看,而UDP端口號由UDP來查看。TCP端口號與UDP端口號是相互獨立的。儘管相互獨立,若是TCP和UDP同時提供某種知名服務,兩個協議一般選擇相同的端口號。這純粹是爲了使用方便,而不是協議自己要求。
(2)16位目的端口號
(3)16位UDP長度:UDP首部和UDP數據的字節長度。該字段的最小值爲8字節(發送一份0字節的UDP數據報是能夠的)。這個UDP長度是冗餘的。由於UP數據報長度是IP數據報全程,所以UDP數據報長度是全長減去IP首部的長度。
(4)16位UDP檢驗和:UDP檢驗和覆蓋UDP首部和UDP數據。IP首部的檢驗和,它只覆蓋IP的首部--並不覆蓋UP數據報中的任何數據。UDP和TCp在首部中都有覆蓋他們首部和數據的檢驗和。UDP的檢驗和是可選的,而TCP的檢驗和是必須的。進程
儘管UDP檢驗和的基本計算方法與IP首部檢驗和計算方法相相似(16bit字的二進制反碼和),可是他們之間存在不一樣的地方。首先,UDP數據報的長度能夠爲奇數字節,可是檢驗和算法是把若干個16bit字相加。
解決方法是必要時在最後增長填充字節0,折只是爲了檢驗和的計算(也就是說,可能增長的填充字節不被傳送)。
其次,UDP數據報和TCp端都包含一個12字節長的僞首部,它是爲了計算校驗和而設置的。僞首部包含IP收一些字段。其目的是讓UDP兩次檢查數據是否已經正確到達目的地。(例如,IP沒有接受地址不是本主機的數據報,以及IP沒有吧應傳給另外一高層的數據報傳給UDP)
UDP數據報中的僞首部格式如圖:it
上圖中,特意舉了一個奇數長度的數據報例子,所以在計算檢驗和時須要加上填充字段。二進制
若是發送端沒有計算檢驗和而接收端檢測到檢驗和有差錯,那麼UDP數據報就要被悄悄丟棄,不產生任何差錯報文(當IP層檢測到IP首部檢驗和有差錯時也這樣作)。
UDP檢驗和是一個端到端的檢驗和。它由發送端計算,而後由接收端驗證。其目的是爲了發現UDP首部和數據在發送端到接收端之間發生的任何改動。
不是全部的以太網數據幀都是IP數據報,至少以太網還要使用ARP協議。不是全部的IP數據報都是UDP或TCP數據,由於ICMP也用IP傳送數據。程序