国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

快速理解TCP和UDP的差異

tomato / 1804人閱讀

摘要:由于本身發(fā)送的就是一份一份的數(shù)據(jù)報(bào),所以自然而然的就有一個(gè)上限的大小。并且由于本身的不可靠性以及無序性,如果發(fā)送了這三個(gè)數(shù)據(jù)報(bào)過來,端接收到的可能是任意順序任意個(gè)數(shù)三個(gè)數(shù)據(jù)報(bào)的排列組合。

前言

最頭疼的問題莫過于到底該選TCP還是UDP作為傳輸層協(xié)議。通過快速對(duì)比分析 TCP 和 UDP 的區(qū)別,來幫助即時(shí)通訊初學(xué)者快速了解這些基礎(chǔ)的知識(shí)點(diǎn),從而在IM、消息推送等網(wǎng)絡(luò)通信應(yīng)用場(chǎng)景中能準(zhǔn)確地選擇合適的傳輸層協(xié)議。

建立連接方式的差異 TCP

說到 TCP 建立連接,相信大多數(shù)人腦海里肯定可以浮現(xiàn)出一個(gè)詞,沒錯(cuò)就是--“三次握手”。TCP 通過“三次握手”來建立連接,再通過“四次揮手”斷開一個(gè)連接。在每次揮手中 TCP 做了哪些操作呢?

流程如下圖所示(TCP的三次握手和四次揮手):

上圖就從客戶端和服務(wù)端的角度,清楚的展示了 TCP 的三次握手和四次揮手??梢钥吹剑?dāng) TCP 試圖建立連接時(shí),三次握手指的是客戶端主動(dòng)觸發(fā)了兩次,服務(wù)端觸發(fā)了一次。

我們可以先明確一下 TCP 建立連接并且初始化的目標(biāo)是什么呢?

1初始化資源;

2告訴對(duì)方我的序列號(hào)。

所以三次握手的次序是這樣子的:

client端首先發(fā)送一個(gè)SYN包告訴Server端我的初始序列號(hào)是X;

Server端收到SYN包后回復(fù)給client一個(gè)ACK確認(rèn)包,告訴client說我收到了;

接著Server端也需要告訴client端自己的初始序列號(hào),于是Server也發(fā)送一個(gè)SYN包告訴client我的初始序列號(hào)是Y;

Client收到后,回復(fù)Server一個(gè)ACK確認(rèn)包說我知道了。

其中的 2 、3 步驟可以簡(jiǎn)化為一步,也就是說將 ACK 確認(rèn)包和 SYN 序列化包一同發(fā)送給 Client 端。到此我們就比較簡(jiǎn)單的解釋了 TCP 建立連接的“三次握手”。

UDP

我們都知道 TCP 是面向連接的、可靠的、有序的傳輸層協(xié)議,而 UDP 是面向數(shù)據(jù)報(bào)的、不可靠的、無序的傳輸協(xié)議,所以 UDP 壓根不會(huì)建立什么連接。

就好比發(fā)短信一樣,UDP 只需要知道對(duì)方的 ip 地址,將數(shù)據(jù)報(bào)一份一份的發(fā)送過去就可以了,其他的作為發(fā)送方,都不需要關(guān)心。

數(shù)據(jù)發(fā)送方式的差異

關(guān)于 TCP、UDP 之間數(shù)據(jù)發(fā)送的差異,可以體現(xiàn)二者最大的不同之處:

TCP:
由于 TCP 是建立在兩端連接之上的協(xié)議,所以理論上發(fā)送的數(shù)據(jù)流不存在大小的限制。但是由于緩沖區(qū)有大小限制,所以你如果用 TCP 發(fā)送一段很大的數(shù)據(jù),可能會(huì)截?cái)喑珊脦锥?,接收方依次的接收?/p>

UDP:
由于 UDP 本身發(fā)送的就是一份一份的數(shù)據(jù)報(bào),所以自然而然的就有一個(gè)上限的大小。

那么每次 UDP 發(fā)送的數(shù)據(jù)報(bào)大小由哪些因素共同決定呢?

UDP協(xié)議本身,UDP協(xié)議中有16位的UDP報(bào)文長(zhǎng)度,那么UDP報(bào)文長(zhǎng)度不能超過2^16=65536;

以太網(wǎng)(Ethernet)數(shù)據(jù)幀的長(zhǎng)度,數(shù)據(jù)鏈路層的MTU(最大傳輸單元);

socket的UDP發(fā)送緩存區(qū)大小

先來看第一個(gè)因素,UDP 本身協(xié)議的報(bào)文長(zhǎng)度為 2^16 - 1,UDP 包頭占 8 個(gè)字節(jié),IP 協(xié)議本身封裝后包頭占 20 個(gè)字節(jié),所以最終長(zhǎng)度為: 2^16 - 1 - 20 - 8 = 65507 字節(jié)。

只看第一個(gè)因素有點(diǎn)理想化了,因?yàn)?UDP 屬于不可靠協(xié)議,我們應(yīng)該盡量避免在傳輸過程中,數(shù)據(jù)包被分割。所以這里有一個(gè)非常重要的概念 MTU -- 也就是最大傳輸單元。

在 Internet 下 MTU 的值為 576 字節(jié),所以在 internet 下使用 UDP 協(xié)議,每個(gè)數(shù)據(jù)報(bào)最大的字節(jié)數(shù)為: 576 - 20 - 8 = 548

數(shù)據(jù)有序性的差異 TCP

對(duì)于 TCP 來說,本身 TCP 有著超時(shí)重傳、錯(cuò)誤重傳、還有等等一系列復(fù)雜的算法保證了 TCP 的數(shù)據(jù)是有序的,假設(shè)你發(fā)送了數(shù)據(jù) 1、2、3,則只要發(fā)送端和接收端保持連接時(shí),接收端收到的數(shù)據(jù)始終都是 1、2、3。

UDP

而 UDP 協(xié)議則要奔放的多,無論 server 端無論緩沖池的大小有多大,接收 client 端發(fā)來的消息總是一個(gè)一個(gè)的接收。

并且由于 UDP 本身的不可靠性以及無序性,如果 client 發(fā)送了 1、2、3 這三個(gè)數(shù)據(jù)報(bào)過來,server 端接收到的可能是任意順序、任意個(gè)數(shù)三個(gè)數(shù)據(jù)報(bào)的排列組合。

可靠性的差異

其實(shí)大家都知道 TCP 本身是可靠的協(xié)議,而 UDP 是不可靠的協(xié)議。

TCP

TCP 內(nèi)部的很多算法機(jī)制讓他保持連接的過程中是很可靠的。比如:TCP 的超時(shí)重傳、錯(cuò)誤重傳、TCP 的流量控制、阻塞控制、慢熱啟動(dòng)算法、擁塞避免算法、快速恢復(fù)算法 等等。

所以 TCP 是一個(gè)內(nèi)部原理復(fù)雜,但是使用起來比較簡(jiǎn)單的這么一個(gè)協(xié)議。

UDP

UDP 是一個(gè)面向非連接的協(xié)議,UDP 發(fā)送的每個(gè)數(shù)據(jù)報(bào)帶有自己的 IP 地址和接收方的 IP 地址,它本身對(duì)這個(gè)數(shù)據(jù)報(bào)是否出錯(cuò),是否到達(dá)不關(guān)心,只要發(fā)出去了就好了。

所以來研究下,什么情況會(huì)導(dǎo)致 UDP 丟包:

數(shù)據(jù)報(bào)分片重組丟失:在文章之前我們就說過,UDP 的每個(gè)數(shù)據(jù)報(bào)大小多少最合適,事實(shí)上 UDP 協(xié)議本身規(guī)定的大小是 64kb,但是在數(shù)據(jù)鏈路層有 MTU 的限制,大小大概在 5kb,所以當(dāng)你發(fā)送一個(gè)很大的 UDP 包的時(shí)候,這個(gè)包會(huì)在 IP 層進(jìn)行分片,然后重組。這個(gè)過程就有可能導(dǎo)致分片的包丟失。UDP 本身有 CRC 檢測(cè)機(jī)制,會(huì)拋棄掉丟失的 UDP 包;

UDP 緩沖區(qū)填滿:當(dāng) UDP 的緩沖區(qū)已經(jīng)被填滿的時(shí)候,接收方還沒有處理這部分的 UDP 數(shù)據(jù)報(bào),這個(gè)時(shí)候再過來的數(shù)據(jù)報(bào)就沒有地方可以存了,自然就都被丟棄了。

使用場(chǎng)景總結(jié)

在文章最后的一部分,聊聊 TCP、UDP 使用場(chǎng)景。

先來說 UDP 的吧,有很多人都會(huì)覺得 UDP 與 TCP 相比,在性能速度上是占優(yōu)勢(shì)的。

因?yàn)?UDP 并不用保持一個(gè)持續(xù)的連接,也不需要對(duì)收發(fā)包進(jìn)行確認(rèn)。

但事實(shí)上經(jīng)過這么多年的發(fā)展 TCP 已經(jīng)擁有足夠多的算法和優(yōu)化,在網(wǎng)絡(luò)狀態(tài)不錯(cuò)的情況下,TCP 的整體性能是優(yōu)于 UDP 的。

那在什么時(shí)候我們非用 UDP 不可呢?

對(duì)實(shí)時(shí)性要求高:比如實(shí)時(shí)會(huì)議,實(shí)時(shí)視頻這種情況下,如果使用 TCP,當(dāng)網(wǎng)絡(luò)不好發(fā)生重傳時(shí),畫面肯定會(huì)有延時(shí),甚至越堆越多。如果使用 UDP 的話,即使偶爾丟了幾個(gè)包,但是也不會(huì)影響什么,這種情況下使用 UDP 比較好;

多點(diǎn)通信:TCP 需要保持一個(gè)長(zhǎng)連接,那么在涉及多點(diǎn)通訊的時(shí)候,肯定需要和多個(gè)通信節(jié)點(diǎn)建立其雙向連接,然后有時(shí)在NAT環(huán)境下,兩個(gè)通信節(jié)點(diǎn)建立其直接的 TCP 連接不是一個(gè)容易的事情,而 UDP 可以無需保持連接,直接發(fā)就可以了,所以成本會(huì)很低,而且穿透性好。這種情況下使用 UDP 也是沒錯(cuò)的。

以上我們說了 UDP 的使用場(chǎng)景,在此之外的其他情況,使用 TCP 準(zhǔn)沒錯(cuò)。

畢竟有一句話嘛:

when in doubt,use TCP。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/73088.html

相關(guān)文章

  • 網(wǎng)絡(luò)協(xié)議 7 - UDP

    摘要:網(wǎng)絡(luò)協(xié)議五步登天路,我們一路邁過了物理層鏈路層,今天終于到了傳輸層。沒有花花腸子大量的數(shù)據(jù)結(jié)構(gòu)處理邏輯包頭字段,秉承性善論,相信網(wǎng)絡(luò)通路很容易到達(dá),不容易被丟棄輕信他人。我們之前認(rèn)識(shí)的就是基于協(xié)議的。 ????網(wǎng)絡(luò)協(xié)議五步登天路,我們一路邁過了物理層、鏈路層,今天終于到了傳輸層。從這一層開始,很多知識(shí)應(yīng)該都是服務(wù)端開發(fā)必備的知識(shí)了,今天我們就一起來梳理下。 ????其實(shí),講到 UDP,...

    moven_j 評(píng)論0 收藏0
  • 快速了解UDP協(xié)議

    摘要:是什么是的縮寫,是一種用戶數(shù)據(jù)報(bào)協(xié)議,又稱為用戶數(shù)據(jù)報(bào)文協(xié)議。協(xié)議所需資源多,首部需個(gè)字節(jié)不算可選項(xiàng),首部字段只需個(gè)字節(jié)。協(xié)議沒有數(shù)據(jù)邊界,有。因此容易發(fā)生粘包的現(xiàn)象。采用協(xié)議,通過服務(wù)器中轉(zhuǎn)方式。UDP是什么?UDP是User Datagram Protocol的縮寫,是一種用戶數(shù)據(jù)報(bào)協(xié)議,又稱為用戶數(shù)據(jù)報(bào)文協(xié)議。區(qū)別于TCP是面向連接的協(xié)議,UDP是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的傳輸層協(xié)議,UD...

    Tecode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<