最近在回顧電腦網路的知識,以前上課沒有認真學,只記得幾個高大上的術語,所以趁著這次回顧,把學到的知識用博客的形式記錄下來,一來加深自己的印象,二來希望讓你對這些基礎知識有一個更深入的瞭解。當然,我會儘量把 UDP 協議講清楚,講明白,讓你“不虛此行”。 UDP( User Datagram Pro ...
最近在回顧電腦網路的知識,以前上課沒有認真學,只記得幾個高大上的術語,所以趁著這次回顧,把學到的知識用博客的形式記錄下來,一來加深自己的印象,二來希望讓你對這些基礎知識有一個更深入的瞭解。當然,我會儘量把 UDP 協議講清楚,講明白,讓你“不虛此行”。
UDP( User Datagram Protocol )協議,翻譯過來就是用戶數據報協議 ,跟 TCP 協議一樣,都是位於 OSI 模型的傳輸層。不過比起 TCP 協議,UDP 協議就顯得簡單多了,因為它沒有「流量控制」、「擁塞控制」等複雜的處理機制。它甚至沒有重傳機制,也就是說,如果你的數據包半路走丟了,那就是真找不回來了,所以說 UDP 協議是不可靠的。當然了,這個重傳機制是針對傳輸層而言的,你完全可以在應用層寫一個協議來進行丟包處理,比如說像 TCP 一樣,增加 ACK 和序列號機制。
那你可能會疑惑了,為什麼放著可靠的 TCP 協議不用,而選擇 UDP 協議?
UDP 報文段結構
這當然要根據應用的需求來,不過在說這個話題之前,我們先來詳細瞭解一下 UDP 協議。
說實話,UDP 的報文段結構比 TCP 報文段簡潔多了(見下圖),畢竟 UDP 協議就沒有什麼多餘的機制。
言歸正傳,報文段里的「源埠號」和「目的埠號」是為了告訴傳輸層,我這個報文是從哪兒(哪個進程)來的,要到哪兒(哪個進程)去。但要註意一點:一個 UDP 套接字是由一個二元組標識的,這個二元組指的是目的 IP 地址和目的埠號,也就是說,伺服器上對應的進程,不在乎你是從哪個客戶端來的,我都放進一個套接字處理,處理完了再根據源埠號和源 IP 地址,把應答信息發送給客戶端。相較而言,TCP 套接字需要一個四元組來標識:源 IP 地址,源埠號,目的 IP 地址和目的埠號。這一點在講 TCP 協議的時候還會細講,所以這裡就不贅述了。
PS:你可能會問,這報文段里怎麼沒有 IP 地址啊?這是因為IP 地址保存在網路層的 IP 協議段里,傳輸層的報文段里當然就沒有了。
無連接
每次提到 TCP 協議,我們最先想到的就是三次握手和四次揮手,對 UDP 協議來說,這都是沒有的事兒~ 使用 UDP 協議的時候,如果客戶端要發送報文段給服務端,不用握手,直接就發出去了,也正因為這樣,UDP 協議被稱為是無連接的。
很容易想到,不需要握手這一過程的話,就沒有因為建立連接而造成的時延,一個字,快!這也是 DNS(功能變數名稱系統)運行在 UDP 協議之上的很大一部分原因。
但是 UDP 協議不可靠啊,傳輸過程中丟包了怎麼辦?最簡單的做法就是——忽略它!(否則就得像文章開頭說的那樣,在應用層實現重傳機制)就拿 DNS 來說吧,如果數據包丟失,客戶端重發就是了(有超時機制),而且在正常情況下,丟包的概率很低。但如果使用 TCP 協議的話,因為要建立連接,功能變數名稱查詢就會慢很多,除此之外,使用 UDP 協議的網路開銷更小——UDP 報文段有 8 個位元組的首部開銷,而 TCP 協議有 20 位元組的開銷(看前面的關於報文段的兩張圖)。 網路開銷小,意味著 DNS 伺服器能接受更多客戶端的請求。
還有一個方面,TCP 協議有擁塞控制機制,它會在網路擁塞時遏制 TCP 發送方,以至於延遲報文段的傳送,所以對於一些要求傳輸延遲小,且能夠容忍一些數據丟失的實時程式來說,UDP 協議可能是一個更好的選擇。路由選擇協議(RIP)、 網路管理協議(SNMP) 也都選擇了 UDP 來作為底層的傳輸協議。
最後,這是一張客戶端與服務端利用 UDP 協議通信的流程圖:
UDP 協議要講的內容不多,下次要講的 TCP 協議,就比較燒腦了,做好準備吧!