TCP 和 UDP,哪一個更勝一籌

做爲 TCP/IP 中兩個最具備表明性的傳輸層協議,TCP 和 UDP 常常被拿出來相互比較。這些協議具體有什麼區別,又是什麼做用呢?html

在 IT 圈混跡多年的小夥伴們,對 TCP 和 UDP 確定再熟悉不過了。做爲計算機網絡專業畢業多年的二狗子,除了 OSI 七層和 TCP/IP 四層模型,就是對網絡協議印象比較深入了。在面試中,網絡協議也是咱們必需要掌握的知識。做爲 TCP/IP 中兩個最具備表明性的傳輸層協議,TCP 和 UDP 常常被拿出來相互比較。面試

今天咱們就來簡單聊聊 TCP 和 UDP,不過在講 TCP 和 UDP以前,咱們先來了解一下 TCP/IP。瀏覽器

TCP/IP 網絡模型

網絡設備之間要互相通訊,雙方就必須基於相同的方法。好比,如何探測到通訊目標、由哪一邊先發起通訊、使用哪一種語言進行通訊、怎樣結束通訊等規則都須要事先肯定。不一樣的硬件、操做系統之間的通訊,全部的這一切都須要一種規則。而這種規則就稱之爲協議(Protocol)。安全

TCP/IP 是互聯網相關的各種協議族的總稱,它以兩個原始協議:傳輸控制協議(TCP)和Internet 協議(IP)來命名。好比:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都屬於 TCP/IP 族內的協議。TCP/IP 模型是互聯網的基礎,它能夠劃分爲四層,分別爲鏈路層、網絡層、傳輸層和應用層。服務器

  • 鏈路層:負責封裝和解封裝 IP 報文,發送和接受 ARP/RARP 報文等。
  • 網絡層:負責路由以及把分組報文發送給目標網絡或主機。
  • 傳輸層:負責對報文進行分組和重組,並以 TCP 或 UDP 協議格式封裝報文。
  • 應用層:負責向用戶提供應用程序,好比 HTTP、FTP、Telnet、DNS、SMTP 等。

下面咱們主要來介紹一下傳輸層協議:TCP 和 UDP。網絡

TCP

TCP 全稱爲傳輸控制協議(Transmission Control Protocol),它由 IETF 的 RFC 793 定義,是一種面向鏈接的點對點傳輸通訊協議,它以有序順序將數據包做爲非結構化字節流發送。工具

TCP 經過使用序列號和確認消息,從發送節點提供有關傳輸到目標節點的數據包的傳遞的信息。TCP 確保數據的可靠性,端到端傳遞,從新排序和重傳,直到達到超時條件或接收到數據包的確認爲止。spa

TCP 是 Internet 上最經常使用的協議。當咱們在瀏覽器中請求網頁時,計算機會將 TCP 數據包發送到 Web 服務器的地址,要求它將網頁返還給咱們。Web 服務器經過發送 TCP 數據包流進行響應,而後瀏覽器將這些數據包縫合在一塊兒以造成網頁。TCP 的所有意義在於它的可靠性,它經過對數據包編號來對其進行排序,並且它會經過讓服務器將響應發送回瀏覽器說「已收到」來進行錯誤檢查。所以在傳輸過程當中不會丟失或破壞任何數據。操作系統

咱們接下來看下 TCP 的鏈接過程:計算機網絡

1.TCP 的鏈接過程(三次握手)

  • 主機 A 經過將 TCP SYN 數據包發送到主機 B 來創建鏈接。其中包含了隨機序列號(4321),該號標記了 A 將要發送數據的序號的開始。
  • B 接收到數據包並以本身的序列號(5501)進行響應。響應中還包含確認號,該號是 A 的序列號加 1(4322)。
  • A 經過發送確認號來確認服務器的響應,該確認號是 B 的序列號加 1(5502)。

2.TCP 終止鏈接

TCP 是全雙工的,在斷開鏈接時兩端都須要發送 FIN 和 ACK。

  • 若客戶端 A 認爲數據發送完成,則它須要向服務端 B 發送鏈接釋放請求。
  • B 收到鏈接釋放請求後,會告訴應用層要釋放 TCP 連接。而後會發送 ACK 包,並進入 CLOSE_WAIT 狀態,此時代表 A 到 B 的鏈接已經釋放,再也不接收 A 發的數據了。可是由於 TCP 鏈接是雙向的,因此 B 仍舊能夠發送數據給 A。
  • B 若是此時還有沒發完的數據會繼續發送,完畢後會向 A 發送鏈接釋放請求,而後 B 便進入 LAST-ACK 狀態。
  • A 收到釋放請求後,向 B 發送確認應答,此時 A 進入 TIME-WAIT 狀態。該狀態會持續 2MSL(最大段生存期,指報文段在網絡中生存的時間,超時會被拋棄) 時間,若該時間段內沒有 B 的重發請求的話,就進入 CLOSED 狀態。當 B 收到確認應答後,也便進入 CLOSED 狀態。

UDP

用戶數據報協議(User Datagram Protocol)是一種無鏈接的傳輸層通訊協議,用於創建低容錯和丟失等待時間的鏈接,能夠在網絡內或跨網絡傳遞服務或數據包。UDP 有不提供數據包分組、組裝和不能對數據包進行排序的缺點。也就是說,當報文發送以後,是沒法得知其是否安全完整到達的。

當應用程序使用 UDP 時,數據包僅發送到目標。發送者沒必要等待確保接收者已收到該數據包,它會繼續發送下一個數據包。若是目標錯過了一些數據包,則它們只會被丟掉,發送者不會從新發送它們。這也意味着設備能夠更快地進行通訊。

例如在遊戲中,若是咱們由於網絡緣由錯過了接收一些 UDP 數據包,那當收到較新的數據包時,遊戲畫面可能會跳幀。若是錯過了舊數據包,錯過了就是錯過了,由於就算沒有咱們,遊戲也會繼續運行。在遊戲中重要的是正在發生的事情,而不是幾秒鐘前發生的事情。拋棄一些錯誤有助於加快遊戲鏈接速度並減小延遲。

大多數應用程序都須要 TCP 的可靠性和糾錯機制,可是某些應用程序也須要 UDP 的高效性和下降開銷。咱們能夠經過一些諸如 Wireshark、Fiddler 等網絡分析工具,就能夠看到發送和接收不一樣類型的數據包。

TCP vs UDP

TCP 和 UDP 有許多區別和類似之處。它們都是經過 Internet 發送數據包的最經常使用的協議。而且它們都在 TCP/IP 協議棧的傳輸層上工做。

一個簡單的例子,能夠清楚地瞭解二者的差別:

假設有兩座房子,House1 和 House2,而且必須從 H1 發送一封信到 H2。可是這兩座房子之間有一條河。如今咱們如何寄信?

解決方案 1:在河上架橋,而後將其交付。

解決方案 2:經過鴿子運送。

將第一個解決方案視爲 TCP,必須進行鏈接(橋)才能傳遞數據(信)。

這樣獲得的數據是可靠的,由於它能夠直接到達另外一端而不會丟失或者出錯。

第二種解決方案相似 UDP,無需鏈接便可發送數據。與須要創建鏈接(橋)的 TCP 相比,該過程更快。可是數據並不可靠:由於咱們並不知道這隻鴿子是否會朝正確的方向前進,或者會在途中掉信或遇到一些其餘問題。

簡單總結下 TCP 和 UDP 的區別:

鏈接和無鏈接:TCP 是面向鏈接的協議,而 UDP 是無鏈接協議。TCP 能夠在發送數據以前在發送方和接收方之間創建鏈接。而 UDP 在發送數據以前不會先創建鏈接。

可靠性:TCP 是可靠的。使用 TCP 協議發送的數據能夠保證傳遞到接收。若是數據在傳輸過程當中丟失,它會恢復數據並從新發送。TCP 還將檢查數據包中的錯誤並跟蹤數據包,以保證數據不會丟失或損壞。

而 UDP 是不可靠的,它不能提供有保證質量的傳遞,而且數據報包可能會在傳輸中損壞或丟失。

流量控制:TCP 使用流控制機制來確保發送者不會一次發送太多數據包而壓倒接收者。TCP 將數據存儲在發送緩衝區中,並在接收緩衝區中接收數據。當應用程序準備就緒時,它將從接收緩衝區讀取數據。若是接收緩衝區已滿,則接收器將沒法處理更多數據並將其丟棄。爲了保持能夠發送給接收方的數據量,接收方會告訴發送方接收緩衝區中有多少剩餘空間(接收窗口)。每次接收到數據包時,都會使用當前接收窗口的值向發送方發送一條消息。UDP 不提供流控制。使用 UDP,數據包以連續流的形式到達或被丟棄。

速度:TCP 比 UDP 慢,由於它「顧慮」比較多:TCP 必須創建鏈接,進行錯誤檢查,並確保按照發送順序接收文件。而 UDP 則更簡單,更高效。

使用場景:TCP 最適合用於對時序不太關心的,且要求高可靠性的應用程序。

  • 萬維網(HTTP,HTTPS)
  • 安全外殼(SSH)
  • 文件傳輸協議(FTP)
  • 電子郵件(SMTP,IMAP / POP)

UDP 最適合須要速度和效率的應用程序。

  • 串流影片
  • 線上遊戲
  • 現場直播
  • 域名系統(DNS)
  • 互聯網協議語音(VoIP)
  • 普通文件傳輸協議(TFTP)

聊了這麼多,相信你對 TCP 和 UDP 也有了基本的瞭解,那麼你認爲:TCP 和 UDP,哪一個更勝一籌呢?

推薦閱讀

重新冠疫情出發,漫談 Gossip 協議

從 301 跳轉,聊聊邊緣規則的那些小妙用

相關文章
相關標籤/搜索