摘要:由于本身發送的就是一份一份的數據報,所以自然而然的就有一個上限的大小。并且由于本身的不可靠性以及無序性,如果發送了這三個數據報過來,端接收到的可能是任意順序任意個數三個數據報的排列組合。
前言
最頭疼的問題莫過于到底該選TCP還是UDP作為傳輸層協議。通過快速對比分析 TCP 和 UDP 的區別,來幫助即時通訊初學者快速了解這些基礎的知識點,從而在IM、消息推送等網絡通信應用場景中能準確地選擇合適的傳輸層協議。
建立連接方式的差異 TCP說到 TCP 建立連接,相信大多數人腦海里肯定可以浮現出一個詞,沒錯就是--“三次握手”。TCP 通過“三次握手”來建立連接,再通過“四次揮手”斷開一個連接。在每次揮手中 TCP 做了哪些操作呢?
流程如下圖所示(TCP的三次握手和四次揮手):
上圖就從客戶端和服務端的角度,清楚的展示了 TCP 的三次握手和四次揮手。可以看到,當 TCP 試圖建立連接時,三次握手指的是客戶端主動觸發了兩次,服務端觸發了一次。
我們可以先明確一下 TCP 建立連接并且初始化的目標是什么呢?
1初始化資源;
2告訴對方我的序列號。
所以三次握手的次序是這樣子的:
client端首先發送一個SYN包告訴Server端我的初始序列號是X;
Server端收到SYN包后回復給client一個ACK確認包,告訴client說我收到了;
接著Server端也需要告訴client端自己的初始序列號,于是Server也發送一個SYN包告訴client我的初始序列號是Y;
Client收到后,回復Server一個ACK確認包說我知道了。
其中的 2 、3 步驟可以簡化為一步,也就是說將 ACK 確認包和 SYN 序列化包一同發送給 Client 端。到此我們就比較簡單的解釋了 TCP 建立連接的“三次握手”。
UDP我們都知道 TCP 是面向連接的、可靠的、有序的傳輸層協議,而 UDP 是面向數據報的、不可靠的、無序的傳輸協議,所以 UDP 壓根不會建立什么連接。
就好比發短信一樣,UDP 只需要知道對方的 ip 地址,將數據報一份一份的發送過去就可以了,其他的作為發送方,都不需要關心。
數據發送方式的差異關于 TCP、UDP 之間數據發送的差異,可以體現二者最大的不同之處:
TCP:
由于 TCP 是建立在兩端連接之上的協議,所以理論上發送的數據流不存在大小的限制。但是由于緩沖區有大小限制,所以你如果用 TCP 發送一段很大的數據,可能會截斷成好幾段,接收方依次的接收。
UDP:
由于 UDP 本身發送的就是一份一份的數據報,所以自然而然的就有一個上限的大小。
那么每次 UDP 發送的數據報大小由哪些因素共同決定呢?
UDP協議本身,UDP協議中有16位的UDP報文長度,那么UDP報文長度不能超過2^16=65536;
以太網(Ethernet)數據幀的長度,數據鏈路層的MTU(最大傳輸單元);
socket的UDP發送緩存區大小
先來看第一個因素,UDP 本身協議的報文長度為 2^16 - 1,UDP 包頭占 8 個字節,IP 協議本身封裝后包頭占 20 個字節,所以最終長度為: 2^16 - 1 - 20 - 8 = 65507 字節。
只看第一個因素有點理想化了,因為 UDP 屬于不可靠協議,我們應該盡量避免在傳輸過程中,數據包被分割。所以這里有一個非常重要的概念 MTU -- 也就是最大傳輸單元。
在 Internet 下 MTU 的值為 576 字節,所以在 internet 下使用 UDP 協議,每個數據報最大的字節數為: 576 - 20 - 8 = 548
數據有序性的差異 TCP對于 TCP 來說,本身 TCP 有著超時重傳、錯誤重傳、還有等等一系列復雜的算法保證了 TCP 的數據是有序的,假設你發送了數據 1、2、3,則只要發送端和接收端保持連接時,接收端收到的數據始終都是 1、2、3。
UDP而 UDP 協議則要奔放的多,無論 server 端無論緩沖池的大小有多大,接收 client 端發來的消息總是一個一個的接收。
并且由于 UDP 本身的不可靠性以及無序性,如果 client 發送了 1、2、3 這三個數據報過來,server 端接收到的可能是任意順序、任意個數三個數據報的排列組合。
可靠性的差異其實大家都知道 TCP 本身是可靠的協議,而 UDP 是不可靠的協議。
TCPTCP 內部的很多算法機制讓他保持連接的過程中是很可靠的。比如:TCP 的超時重傳、錯誤重傳、TCP 的流量控制、阻塞控制、慢熱啟動算法、擁塞避免算法、快速恢復算法 等等。
所以 TCP 是一個內部原理復雜,但是使用起來比較簡單的這么一個協議。
UDPUDP 是一個面向非連接的協議,UDP 發送的每個數據報帶有自己的 IP 地址和接收方的 IP 地址,它本身對這個數據報是否出錯,是否到達不關心,只要發出去了就好了。
所以來研究下,什么情況會導致 UDP 丟包:
數據報分片重組丟失:在文章之前我們就說過,UDP 的每個數據報大小多少最合適,事實上 UDP 協議本身規定的大小是 64kb,但是在數據鏈路層有 MTU 的限制,大小大概在 5kb,所以當你發送一個很大的 UDP 包的時候,這個包會在 IP 層進行分片,然后重組。這個過程就有可能導致分片的包丟失。UDP 本身有 CRC 檢測機制,會拋棄掉丟失的 UDP 包;
UDP 緩沖區填滿:當 UDP 的緩沖區已經被填滿的時候,接收方還沒有處理這部分的 UDP 數據報,這個時候再過來的數據報就沒有地方可以存了,自然就都被丟棄了。
使用場景總結在文章最后的一部分,聊聊 TCP、UDP 使用場景。
先來說 UDP 的吧,有很多人都會覺得 UDP 與 TCP 相比,在性能速度上是占優勢的。
因為 UDP 并不用保持一個持續的連接,也不需要對收發包進行確認。
但事實上經過這么多年的發展 TCP 已經擁有足夠多的算法和優化,在網絡狀態不錯的情況下,TCP 的整體性能是優于 UDP 的。
那在什么時候我們非用 UDP 不可呢?
對實時性要求高:比如實時會議,實時視頻這種情況下,如果使用 TCP,當網絡不好發生重傳時,畫面肯定會有延時,甚至越堆越多。如果使用 UDP 的話,即使偶爾丟了幾個包,但是也不會影響什么,這種情況下使用 UDP 比較好;
多點通信:TCP 需要保持一個長連接,那么在涉及多點通訊的時候,肯定需要和多個通信節點建立其雙向連接,然后有時在NAT環境下,兩個通信節點建立其直接的 TCP 連接不是一個容易的事情,而 UDP 可以無需保持連接,直接發就可以了,所以成本會很低,而且穿透性好。這種情況下使用 UDP 也是沒錯的。
以上我們說了 UDP 的使用場景,在此之外的其他情況,使用 TCP 準沒錯。
畢竟有一句話嘛:
when in doubt,use TCP。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73088.html
摘要:網絡協議五步登天路,我們一路邁過了物理層鏈路層,今天終于到了傳輸層。沒有花花腸子大量的數據結構處理邏輯包頭字段,秉承性善論,相信網絡通路很容易到達,不容易被丟棄輕信他人。我們之前認識的就是基于協議的。 ????網絡協議五步登天路,我們一路邁過了物理層、鏈路層,今天終于到了傳輸層。從這一層開始,很多知識應該都是服務端開發必備的知識了,今天我們就一起來梳理下。 ????其實,講到 UDP,...
閱讀 1698·2021-11-12 10:36
閱讀 1615·2021-11-12 10:36
閱讀 3441·2021-11-02 14:46
閱讀 3797·2019-08-30 15:56
閱讀 3531·2019-08-30 15:55
閱讀 1462·2019-08-30 15:44
閱讀 1043·2019-08-30 14:00
閱讀 2735·2019-08-29 18:41