UDP 協議的那點事兒

2022-07-04 22:30:15 字數 1920 閱讀 9553

最近在回顧計算機網路的知識,以前上課沒有認真學,只記得幾個高大上的術語,所以趁著這次回顧,把學到的知識用部落格的形式記錄下來,一來加深自己的印象,二來希望讓你對這些基礎知識有乙個更深入的了解。當然,我會盡量把 udp 協議講清楚,講明白,讓你「不虛此行」。

udp( user datagram protocol )協議,翻譯過來就是使用者資料報協議,跟 tcp 協議一樣,都是位於 osi 模型的傳輸層。不過比起 tcp 協議,udp 協議就顯得簡單多了,因為它沒有「流量控制」、「擁塞控制」等複雜的處理機制。它甚至沒有重傳機制,也就是說,如果你的資料報半路走丟了,那就是真找不回來了,所以說 udp 協議是不可靠的。當然了,這個重傳機制是針對傳輸層而言的,你完全可以在應用層寫乙個協議來進行丟包處理,比如說像 tcp 一樣,增加 ack 和序列號機制。

那你可能會疑惑了,為什麼放著可靠的 tcp 協議不用,而選擇 udp 協議?

這當然要根據應用的需求來,不過在說這個話題之前,我們先來詳細了解一下 udp 協議。

說實話,udp 的報文段結構比 tcp 報文段簡潔多了(見下圖),畢竟 udp 協議就沒有什麼多餘的機制。

言歸正傳,報文段裡的「源埠號」和「目的埠號」是為了告訴傳輸層,我這個報文是從哪兒(哪個程序)來的,要到哪兒(哪個程序)去。但要注意一點:乙個 udp 套接字是由乙個二元組標識的,這個二元組指的是目的 ip 位址和目的埠號,也就是說,伺服器上對應的程序,不在乎你是從哪個客戶端來的,我都放進乙個套接字處理,處理完了再根據源埠號和源 ip 位址,把應答資訊傳送給客戶端。相較而言,tcp 套接字需要乙個四元組來標識:源 ip 位址,源埠號,目的 ip 位址和目的埠號。這一點在講 tcp 協議的時候還會細講,所以這裡就不贅述了。

每次提到 tcp 協議,我們最先想到的就是三次握手和四次揮手,對 udp 協議來說,這都是沒有的事兒~ 使用 udp 協議的時候,如果客戶端要傳送報文段給服務端,不用握手,直接就發出去了,也正因為這樣,udp 協議被稱為是無連線的。

很容易想到,不需要握手這一過程的話,就沒有因為建立連線而造成的時延,乙個字,快!這也是 dns(網域名稱系統)執行在 udp 協議之上的很大一部分原因。

但是 udp 協議不可靠啊,傳輸過程中丟包了怎麼辦?最簡單的做法就是——忽略它!(否則就得像文章開頭說的那樣,在應用層實現重傳機制)就拿 dns 來說吧,如果資料報丟失,客戶端重發就是了(有超時機制),而且在正常情況下,丟包的概率很低。但如果使用 tcp 協議的話,因為要建立連線,網域名稱查詢就會慢很多,除此之外,使用 udp 協議的網路開銷更小——udp 報文段有 8 個位元組的首部開銷,而 tcp 協議有 20 位元組的開銷(看前面的關於報文段的兩張圖)。 網路開銷小,意味著 dns 伺服器能接受更多客戶端的請求。

還有乙個方面,tcp 協議有擁塞控制機制,它會在網路擁塞時遏制 tcp 傳送方,以至於延遲報文段的傳送,所以對於一些要求傳輸延遲小,且能夠容忍一些資料丟失的實時程式來說,udp 協議可能是乙個更好的選擇。路由選擇協議(rip)、 網路管理協議(snmp) 也都選擇了 udp 來作為底層的傳輸協議。

最後,這是一張客戶端與服務端利用 udp 協議通訊的流程圖:

udp 協議要講的內容不多,下次要講的 tcp 協議,就比較燒腦了,做好準備吧!

C 的那點事兒

一 預處理 定義 在編譯之前所做的處理,主要包括 標頭檔案 預處理會展開 巨集定義 預處理會替換掉 條件編譯 二 標頭檔案 作用 將一些公用 如函式原型宣告,型別宣告,全域性變數宣告,巨集定義等,放到乙個檔案中,以提供跨工程 復用,減少 重複書寫。處理方式 內容展開 若標頭檔案中有遞迴包含逐級展開 ...

游標那點事兒

兩種迴圈跳出方法 1 稍顯複雜點 create procedure dbo.usp cralltables client id varchar 256 asdeclare table name varchar 50 set nocount on declare t name cur cursor l...

imu那點事兒

一.對於bosch晶元的總結 offset 是指sensor的零偏。datasheet 裡邊描述的是在不同的情況下offset 的spec.offa,int 表示sensor 出廠時最初的offset spec,是component level offa,board 表示sensor 在貼到pcb ...