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,哪個更勝一籌呢?