TCP 和 UDP,哪个更胜一筹
作為 TCP/IP 中兩個最具有代表性的傳輸層協議,TCP 和 UDP 經常被拿出來相互比較。這些協議具體有什么區別,又是什么作用呢?
在 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 確保數據的可靠性,端到端傳遞,重新排序和重傳,直到達到超時條件或接收到數據包的確認為止。
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,哪個更勝一籌呢?
總結
以上是生活随笔為你收集整理的TCP 和 UDP,哪个更胜一筹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当我谈 HTTP 时,我谈些什么?
- 下一篇: 网关速率限制实践