網絡協議 7 - UDP 協議:性善碰到城會玩

    網絡協議五步登天路,咱們一路邁過了物理層、鏈路層,今天終於到了傳輸層。從這一層開始,不少知識應該都是服務端開發必備的知識了,今天咱們就一塊兒來梳理下。html

    其實,講到 UDP,就少不了 TCP。這倆貨簡直就是個「連體兄弟」,只要出現一個,另外一個確定就在不遠處等着你。面試

    博主相信,絕大多數的服務端開發都碰到過「TCP 與 UDP 的區別」這樣的面試題,而在實際業務開發中,也會對比 TCP 與 UDP,選擇合適的協議進行開發。服務器

    因此,我們仍是老生常談,先來看看這倆兄弟的區別。網絡

TCP 與 UDP 的區別

    相信不少人都知道,TCP 是面向鏈接的,UDP 是面向無鏈接的。數據結構

    那麼,什麼是面向鏈接,什麼是面向無鏈接呢?異步

    在互通以前,面向鏈接的協議會先創建鏈接,再進行通訊。就像 TCP 會進行三次握手,而 UDP 不會。性能

    那爲何會創建鏈接呢?TCP 進行三次握手,UDP 就不能發三個數據包玩玩,有什麼區別呢?ui

    其實這裏所謂的創建鏈接,就是經過創建必定的數據結構來維護客戶端和服務端交互的狀態,用這樣的數據結構來保證所謂的面向鏈接的特性。cdn

    上面這段話中,有一個很重要的詞-狀態。也就是說,TCP 實質上是一個有狀態的服務。這個狀態,能夠說是它和 UDP 的本質區別。視頻

    通俗點講,有狀態的 TCP 就是有腦子的,它會記住數據是否已經精確發送了,發到哪裏了,應該接收哪一個數據,不能容忍一點錯誤。

    與之對應的,UDP 就是沒腦子的,天真無邪,發出去的數據就發出去,不會考慮網絡世界的「惡意」。

TCP 既然有腦子,那確定能作到不少 UDP 作不到的事情,例如:

  1. 提供可靠交付。經過 TCP 鏈接傳輸的數據,無差錯、不丟失、不重複,且按序到達。而 UDP 則是不保證不丟失,不保證按序到達
  2. 面向字節流。TCP 發送的時候是一個流,沒有頭尾。而 UDP 是基於數據報,一個個發,一個個收
  3. 可進行擁塞控制。TCP 意識到包丟棄或者網絡環境很差的時候,會調整本身的行爲,決定要發快點,仍是發慢點。而 UDP 則是應用讓我發,我就發,管它洪水滔天。。

UDP 包頭

    發送的 UDP 包到達目標機器後,發現 MAC 地址匹配,因而取下來,而後再交給 IP 層處理,發現 IP 匹配,接下來呢?數據包給誰呢?

    發送的時候,接收機器怎麼知道數據包是 UDP 的包呢?因此在 IP 頭裏面有個 8 位協議,這裏會存放,數據包到底是 TCP 仍是 UDP。

    處理完傳輸層的事情,內核的事情基本上就幹完了,裏面的數據應該交給應用程序本身去處理。但是,一臺機器上跑着那麼多的應用程序,應該給誰呢?

    不管應用程序寫的是使用 TCP 傳呼機,仍是 UDP 傳數據,都要監聽一個端口。正式這個端口,用來區分應用程序。

    這樣,UDP 頭裏面的內容就都出來了,以下圖:

    當咱們看到 UDP 包頭的時候,發現的確有端口號,有源端口號和目標端口號。可是它除了端口號,就再沒有其餘的,和 TCP 頭比起來,簡單的一塌糊塗。

UDP 三大特色

上面提過,UDP 像個小孩子同樣,比較簡單,有如下特色:

  1. 溝通簡單。沒有花花腸子(大量的數據結構、處理邏輯、包頭字段),秉承「性善論」,相信網絡通路很容易到達,不容易被丟棄;
  2. 輕信他人。不會創建鏈接,只認端口號,誰均可以給他傳數據,他也能夠傳給任何人數據,甚至能夠同時傳給多人數據;
  3. 愣頭青,作事不懂權變。不會根據網絡的請求進行擁塞控制,無論網絡再差,它該怎麼發還怎麼發。

UDP 使用場景

    正所謂「禍兮福所倚」,雖然 UDP 有着不少問題,但也能夠在特定場景中發揮更好的做用。

    第一,須要資源少,在網絡狀況比較好的內網,或者對於丟包不敏感的應用。這很好理解,就像你是領導,你會讓大家組剛畢業的小夥伴去作一些沒有那麼難,或者是失敗了也能忍受的實驗性項目。

咱們以前認識的 DHCP 就是基於 UDP 協議的。通常的獲取 IP 地址都是內網請求,並且一次獲取不到 IP 也不要緊,過一會還能夠請求獲取。

    第二,不須要創建鏈接,一對一溝通,並且須要廣播的應用。 UDP 的不面向鏈接的功能,能夠承載廣播或多播的協議。DHCP 就是一種廣播的形式。

對於多播,咱們以前提到的 IP 地址中的 D 類地址,也就是組播地址。使用這個地址,能夠將包組播給一批機器。當一臺機器上的某個進程想監聽某個組播地址時,須要發送 IGMP 包,所在網絡的路由器收到這個包,知道有個機器有個進程在監聽這個組播地址。當路由器收到這個組播地址的數據包時,就會將包轉發給這臺機器,這樣就實現了跨路由器的組播。

    第三,須要處理速度快、延時低、能夠容忍少數丟包,可是要求即使網絡阻塞,也絕不退縮,勇往直前的時候

    UDP 簡單、處理速度快,不像 TCP 那樣操那麼多的心。而且,TCP 在網絡很差出現丟包的時候,它的擁塞策略會主動的下降發送速度,這就至關於原本環境就差,還自斷臂膀,用戶原本就卡,這下更卡了。

    當前不少應用都是要求低時延的,他們可不想用 TCP 如此複雜的機制,而是想根據本身的場景,實現本身的可靠和鏈接保證。例如,若是應用以爲,有的包丟了就丟了,不必重傳了,而有的比較重要的包丟了,則應用本身重傳,不依賴 TCP。

    因爲 UDP 十分簡單,基本啥都沒作,也就給了應用「城會玩」的機會。就像在和平年代,每一個人應該有獨立的思考和行爲,應該可靠且禮讓。可是若是在戰爭年代,每每不太須要過於獨立的思考,而須要士兵簡單服從命令便可。

基於 UDP 的「城會玩」的五個例子

城會玩 一:網頁或 APP 的訪問

    網頁和手機 APP 都是基於 HTTP 協議的,而HTTP 協議是基於 TCP 的,創建鏈接都須要屢次交互,對於時延比較大的移動互聯網來說,創建一次鏈接須要的時間會比較長,並且移動互聯網仍是在移動中,TCP 可能還會斷了重連,這也是很耗時的。

    除此以外,目前的 HTTP 協議,每每採起多個數據通道共享一個鏈接的狀況這樣原本爲了加快傳輸速度,可是 TCP 的嚴格順序策略使得哪怕共享通道,前一個不來,後一個和前一個即使不要緊,也要等着,時延也會加大。

    而 QUIC(Quik UDP Internet Connections,快速 UDP 互聯網鏈接)是 Google 提出的一種基於 UDP 改進的通訊協議,其目的是下降網絡通訊的延遲,提供更好的用戶互動體驗。

    QUIC 在應用層會本身實現快速鏈接創建、減小重傳時延,自適應擁塞控制,是應用層「城會玩」的表明。

「城會玩」 二:流媒體的協議

    直播協議多使用 RTMP,這個協議就是基於 UDP 的。TCP 的嚴格順序傳輸要保證前一個收到了,下一個才能確認。對於直播來說,這顯然是不合適的,由於老的視頻幀丟了就丟了,就算再傳過來用戶也不在乎,他們要看新的了,若是一直沒來,用戶就會一直顯示卡頓,新的也看不了。因此,對於直播,實時性比較重要,寧肯丟包,也不要卡頓的。

    另外,對於丟包,其實對於食品播放來說,有的包能夠丟,有的包不能丟,由於視頻的連續幀裏面,有的包重要,有的包不重要,若是必需要丟包,隔幾個幀丟一個,其實看視頻的人不會感知,可是若是連續丟幀,用戶就會有感知了。所以,在網絡很差的狀況下,應用但願選擇性的丟幀。

    還有就是,當網絡很差的時候,TCP 會主動下降發送速度。這對原本就卡的看視頻來說是要命的,原本應該立刻重傳,而不是主動讓步。所以,不少直播應用,都基於 UDP 實現了本身的視頻傳輸協議。

「城會玩」 三:實時遊戲

    遊戲有一個特色,就是實時性比較高。快一秒你幹掉別人,慢一秒就被別人爆頭,因此不少職業玩家會買很是專業的鼠標和鍵盤,爭分奪秒。

    於是,實時遊戲中客戶端和服務端要創建長鏈接,來保證明時傳輸,可是遊戲玩家不少,服務器卻很少,因爲維護 TCP 鏈接須要在內核維護一些數據結構,於是一臺機器可以支撐的 TCP 鏈接數量是有限的。而 UDP 因爲是沒有鏈接的,在異步 IO 機制引入以前,經常是應對海量客戶端鏈接的策略。

    另外仍是 TCP 的強順序問題,對戰的遊戲,對網絡的要求很簡單,玩家經過客戶端發送給服務器鼠標和鍵盤行走的位置,服務器會處理每一個用戶發送過來的全部廠家,處理完再返回給客戶端,客戶端解析響應,渲染最新的場景展現給玩家。

    若是出現一個數據包丟失,全部事情都須要停下來等待這個數據包重發。客戶端會出現等待接收數據,然而玩家並不關心過時的數據,相信你們玩CF 的時候,若是激戰中卡 1 秒,是否是就有拍鍵盤的衝動?

    遊戲對實時要求較爲嚴格的狀況下,採用自定義的 UDP 協議,自定義重傳策略,可以把丟包產生的延遲降到最低,儘可能減小網絡問題對遊戲性能形成的影響。

「城會玩」 四:IoT物聯網

    一方面,物聯網領域終端資源少,極可能只是內存很是小的嵌入式系統,而維護 TCP 協議代價太大。另外一方面,物聯網對實時性要求也很高。Google 旗下的 Nest 創建 Thread Group,推出了物聯網通訊協議 Thread,就是基於 UDP 協議的。

「城會玩」 五:移動通訊領域

    在 4G 網絡裏,移動流量上網的數據協議 GTP-U 也是基於 UDP 的。由於移動網絡協議比較複雜,而 GTP 協議自己就包含複雜的手機上線下線的通訊協議。

總結

  • 若是把 TCP 比做成熟的社會人,那麼 UDP 就是頭腦簡單的小朋友。TCP 複雜,UDP 簡單;TCP 維護鏈接,UDP 誰都相信;TCP 會知進退,UDP 愣頭青一個,一往無前;

  • UDP 雖然簡單,可是它能夠用在環境簡單、須要多播、應用層本身控制傳輸的地方。例如 DHCP、QUIC 等。

原文地址:www.cnblogs.com/BeiGuo-Feng…

相關文章
相關標籤/搜索