1. 程式人生 > >網絡是怎樣連接的學習筆記-第二章-UDP協議的收發操作

網絡是怎樣連接的學習筆記-第二章-UDP協議的收發操作

復雜 tro 圖像 單純 火墻 返回 查錯 block 6.2

2.6 UDP 協議的收發操作

2.6.1 不需要重發的數據用 UDP 發送更高效

大多數的應用程序都像之前介紹的一樣使用 TCP 協議來收發數據,但當然也有例外。

有些應用程序不使用 TCP 協議,而是使用 UDP 協議來收發數據。

向 DNS 服務器查詢 IP 地址的時候我們用的也是 UDP 協議。下面就簡單介紹一下 UDP 協議。

TCP 為什麽要設計得如此復雜

因為我們需要將數據高效且可靠地發送給對方。為了實現可靠性,我們就需要確認對方是否收到了我們發送的數據,如果沒有還需要再發一遍。

要實現上面的要求,最簡單的方法是數據全部發送完畢之後讓接收方返回一個接收確認。

這樣一來,如果沒收到直接全部重新發送一遍就好了,根本不用像 TCP 一樣要管理發送和確認的進度。

但是,如果漏掉了一個包就要全部重發一遍,怎麽看都很低效。

為了實現高效的傳輸,我們要避免重發已經送達的包,而是只重發那些出錯的或者未送達的包。TCP 之所以復雜,就是因為要實現這一點。

可以不使用TCP的情形

數據很短,用一個包就能裝得下時,即便沒有 TCP 這樣復雜的機制,我們也能夠高效地重發數據。

如果只有一個包,就不用考慮哪個包未送達了,因為全部重發也只不過是重發一個包而已

如果不使用 TCP,也不需要發送那些用來建立和斷開連接的控制包了。

此外,我們發送了數據,對方一般都會給出回復,只要將回復的數據當作接收確認就行了,也不需要專門的接收確認包了。

像 DNS 查詢等交換控制信息的操作基本上都可以在一個包的大小範圍內解決,這種場景中就可以用 UDP 來代替TCP。

2.6.2 控制用的短數據

UDP和TCP的區別

UDP不需要交換控制信息

UDP 沒有 TCP 的接收確認、窗口等機制,因此在收發數據之前也不需要交換控制信息。

也就是說不需要建立和斷開連接的步驟,只要在從應用程序獲取的數據前面加上 UDP 頭部,然後交給 IP 進行發送就可以了。

UDP接收只需要IP地址和端口號

接收也很簡單,只要根據 IP 頭部中的接收方和發送方 IP 地址,以及 UDP 頭部中的接收方和發送方端口號,找到相應的套接字並將數據交給相應的應用程序就可以了。

UDP只負責發送包

UDP遇到錯誤或者丟包也一概不管,因為 UDP 只負責單純地發送包而已,並不像TCP 一樣會對包的送達狀態進行監控,所以協議棧也不知道有沒有發生錯誤。

但這樣並不會引發什麽問題,因此出錯時就收不到來自對方的回復,應用程序會註意到這個問題,並重新發送一遍數據。

這樣的操作本身並不復雜,也並不會增加應用程序的負擔。

UDP可發送的數據長度

UDP 可發送的數據最大長度為 IP 包的最大長度減去 IP 頭部和 UDP 頭部的長度,這個長度與 MTU、MSS 不是一個層面上的概念。

MTU 和MSS 是基於以太網和通信線路上網絡包的最大長度來計算的,而 IP 包的最大長度是由 IP 頭部中的“全長”字段決定的。

“全長”字段的長度為 16比特,因此從 IP 協議規範來看,IP 包的最大長度為 65 535 字節,再減去IP 頭部和 UDP 頭部的長度,就是 UDP 協議所能發送的數據最大長度。

如果不考慮可選字段的話,一般來說 IP 頭部為 20 字節,UDP 頭部為 8 字節,因此 UDP 的最大數據長度為 65 507 字節。

當然,這麽長的數據已經超過了以太網和通信線路的最大傳輸長度,因此需要讓 IP 模塊使用分片功能拆分之後再傳輸。

技術分享圖片

2.6.3 音頻和視頻數據

有另一個場景會使用 UDP,就是發送音頻和視頻數據的時候。

音頻和視頻數據必須在規定的時間內送達,一旦送達晚了,就會錯過播放時機,導致聲音和圖像卡頓。

如果像 TCP 一樣通過接收確認響應來檢查錯誤並重發,重發的過程需要消耗一定的時間,因此重發的數據很可能已經錯過了播放的時機。

一旦錯過播放時機,重發數據也是沒有用的,因為聲音和圖像已經卡頓了,這是無法挽回的。

當然,我們可以用高速線路讓重發的數據能夠在規定的時間內送達,但這樣一來可能要增加幾倍的帶寬才行。

UDP 經常會被防火墻阻止,因此當需要穿越防火墻傳輸音頻和視頻數據時,盡管需要消耗額外的帶寬,但有時候也只能使用 TCP。

此外,音頻和視頻數據中缺少了某些包並不會產生嚴重的問題,只是會產生一些失真或者卡頓而已,一般都是可以接受的。

在這些無需重發數據,或者是重發了也沒什麽意義的情況下,使用UDP 發送數據的效率會更高。

章節測驗

表示網絡包收件人的接收方 IP 地址是位於 IP 頭部還是 TCP 頭部中呢?

IP頭部

端口號用來指定服務器程序的種類,那麽它位於 TCP 頭部還是 IP頭部中呢?

TCP頭部

會對包是否正確送達進行確認的是 TCP 還是 IP 呢?

IP

根據 IP 地址查詢 MAC 地址的機制叫什麽?

ARP

在收到 ACK 號之前繼續發送下一個包的方式叫什麽?

滑動窗口

網絡是怎樣連接的學習筆記-第二章-UDP協議的收發操作