本節書摘來自異步社群《unix網絡程式設計 卷1:套接字聯網api(第3版)》一書中的第2章,第2.3節,作者:【美】w. richard stevens , bill fenner , andrew m. rudoff著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
udp是一個簡單的傳輸層協定,在rfc 768[postel 1980]中有詳細說明。應用程序往一個udp套接字寫入一個消息,該消息随後被封裝(encapsulating)到一個udp資料報,該udp資料報進而又被封裝到一個ip資料報,然後發送到目的地。udp不保證udp資料報會到達其最終目的地,不保證各個資料報的先後順序跨網絡後保持不變,也不保證每個資料報隻到達一次。
我們使用udp進行網絡程式設計所遇到的問題是它缺乏可靠性。如果一個資料報到達了其最終目的地,但是校驗和檢測發現有錯誤,或者該資料報在網絡傳輸途中被丢棄了,它就無法被投遞給udp套接字,也不會被源端自動重傳。如果想要確定一個資料報到達其目的地,可以往應用程式中添置一大堆的特性:來自對端的确認、本端的逾時與重傳等。
每個udp資料報都有一個長度。如果一個資料報正确地到達其目的地,那麼該資料報的長度将随資料一道傳遞給接收端應用程序。我們已經提到過tcp是一個位元組流(byte-stream)協定,沒有任何記錄邊界(見1.2節),這一點不同于udp。
我們也說udp提供無連接配接的(connectionless)服務,因為udp客戶與伺服器之間不必存在任何長期的關系。舉例來說,一個udp客戶可以建立一個套接字并發送一個資料報給一個給定的伺服器,然後立即用同一個套接字發送另一個資料報給另一個伺服器。同樣地,一個udp伺服器可以用同一個udp套接字從若幹個不同的客戶接收資料報,每個客戶一個資料報。