色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

用UDP就一定比用TCP快嗎?什么情況下用UDP會比用TCP慢

小林coding ? 來源:小白debug ? 作者:小白 ? 2022-11-16 14:20 ? 次閱讀

八股文網站:xiaolincoding.com

話說,UDP比TCP快嗎?

相信就算不是八股文老手,也會下意識的脫口而出:""。

這要追問為什么,估計大家也能說出個大概。

但這也讓人好奇,用UDP就一定比用TCP快嗎?什么情況下用UDP會比用TCP慢?

我們今天就來聊下這個話題

使用socket進行數據傳輸

作為一個程序員,假設我們需要在A電腦的進程發一段數據到B電腦的進程,我們一般會在代碼里使用socket進行編程

socket就像是一個電話或者郵箱(郵政的信箱)。當你想要發送消息的時候,撥通電話或者將信息塞到郵箱里,socket內核會自動完成將數據傳給對方的這個過程。

基于socket我們可以選擇使用TCP或UDP協議進行通信

對于TCP這樣的可靠性協議,每次消息發出后都能明確知道對方收沒收到,就像打電話一樣,只要"喂喂"兩下就能知道對方有沒有在聽。

而UDP就像是給郵政的信箱寄信一樣,你寄出去的信,根本就不知道對方有沒有正常收到,丟了也是有可能的。

這讓我想起了大概17年前,當時還沒有現在這么發達的網購,想買一本《掌機迷》雜志,還得往信封里塞錢,然后一等就是一個月,好幾次都懷疑信是不是丟了。我至今印象深刻,因為那是我和我哥攢了好久的錢。。。

回到socket編程的話題上。

創建socket的方式就像下面這樣。

fd=socket(AF_INET,具體協議,0);

注意上面的"具體協議",如果傳入的是SOCK_STREAM,是指使用字節流傳輸數據,說白了就是TCP協議

503b9ce8-6572-11ed-8abf-dac502259ad0.pngTCP是什么

如果傳入的是SOCK_DGRAM,是指使用數據報傳輸數據,也就是UDP協議

5052786e-6572-11ed-8abf-dac502259ad0.png

UDP是什么

返回的fd是指socket句柄,可以理解為socket的身份證號。通過這個fd你可以在內核中找到唯一的socket結構。

如果想要通過這個socket發消息,只需要操作這個fd就行了,比如執行 send(fd, msg, ...),內核就會通過這個fd句柄找到socket然后進行發數據的操作。

如果一切順利,此時對方執行接收消息的操作,也就是 recv(fd, msg, ...),就能拿到你發的消息。

506ab762-6572-11ed-8abf-dac502259ad0.gif

udp發送接收過程

對于異常情況的處理

但如果不順利呢?

比如消息發到一半,丟包了呢?

丟包的原因有很多,之前寫過的《用了TCP協議,就一定不會丟包嗎?》有詳細聊到過,這里就不再展開。

那UDP和TCP的態度就不太一樣了。

UDP表示,"哦,是嗎?然后呢?關我x事"

TCP態度就截然相反了,"啊?那可不行,是不是我發太快了呢?是不是鏈路太堵被別人影響到了呢?不過你放心,我肯定給你補發"

TCP老實人石錘了。我們來看下這個老實人在背后都默默做了哪些事情。

重傳機制

對于TCP,它會給發出的消息打上一個編號(sequence),接收方收到后回一個確認(ack)。發送方可以通過ack的數值知道接收方收到了哪些sequence的包。

如果長時間等不到對方的確認,TCP就會重新發一次消息,這就是所謂的重傳機制

5086da78-6572-11ed-8abf-dac502259ad0.png

TCP重傳

流量控制機制

但重傳這件事本身對性能影響是比較嚴重的,所以是下下策

于是TCP就需要思考有沒有辦法可以盡量避免重傳

因為數據發送方和接收方處理數據能力可能不同,因此如果可以根據雙方的能力去調整發送的數據量就好了,于是就有了發送和接收窗口,基本上從名字就能看出它的作用,比如接收窗口的大小就是指,接收方當前能接收的數據量大小發送窗口的大小就指發送方當前能發的數據量大小。TCP根據窗口的大小去控制自己發送的數據量,這樣就能大大減少丟包的概率。

5096da40-6572-11ed-8abf-dac502259ad0.png

流量控制機制

滑動窗口機制

接收方的接收到數據之后,會不斷處理,處理能力也不是一成不變的,有時候處理的快些,那就可以收多點數據,處理的慢點那就希望對方能少發點數據。

畢竟發多了就有可能處理不過來導致丟包,丟包會導致重傳,這可是下下策。因此我們需要動態的去調節這個接收窗口的大小,于是就有了滑動窗口機制

看到這里大家可能就有點迷了,流量控制和滑動窗口機制貌似很像,它們之間是啥關系?我總結一下。其實現在TCP是通過滑動窗口機制來實現流量控制機制的

50a87b4c-6572-11ed-8abf-dac502259ad0.png

滑動窗口機制

擁塞控制機制

但這還不夠,有時候發生丟包,并不是因為發送方和接收方的處理能力問題導致的。而是跟網絡環境有關,大家可以將網絡想象為一條公路。

馬路上可能堵滿了別人家的車,只留下一輛車的空間。那就算你家有5輛車,目的地也正好有5個停車位,你也沒辦法同時全部一起上路。

于是TCP希望能感知到外部的網絡環境,根據網絡環境及時調整自己的發包數量,比如馬路只夠兩輛車跑,那我就只發兩輛車。但外部環境這么復雜,TCP是怎么感知到的呢?

TCP會先慢慢試探的發數據,不斷加碼數據量,越發越多,先發一個,再發2個,4個…。直到出現丟包,這樣TCP就知道現在當前網絡大概吃得消幾個包了,這既是所謂的擁塞控制機制

不少人會疑惑流量控制和擁塞控制的關系。我這里小小的總結下。流量控制針對的是單個連接數據處理能力的控制,擁塞控制針對的是整個網絡環境數據處理能力的控制。

50c0b4aa-6572-11ed-8abf-dac502259ad0.png

分段機制

但上面提到的都是怎么降低重傳的概率,似乎重傳這個事情就是無法避免的,那如果確實發生了,有沒有辦法降低它帶來的影響呢?

有。當我們需要發送一個超大的數據包時,如果這個數據包丟了,那就得重傳同樣大的數據包。但如果我能將其分成一小段一小段,那就算真丟了,那我也就只需要重傳那一小段就好了,大大減小了重傳的壓力,這就是TCP的分段機制

而這個所謂的一小段的長度,在傳輸層叫MSSMaximum Segment Size),數據包長度大于MSS則會分成N個小于等于MSS的包。

50cfbaa4-6572-11ed-8abf-dac502259ad0.gif

MSS分包

而在網絡層,如果數據包還大于MTU(Maximum Transmit Unit),那還會繼續分包。

50e821ac-6572-11ed-8abf-dac502259ad0.gif

MTU分包

一般情況下,MSS=MTU-40Byte,所以TCP分段后,到了IP層大概率就不會再分片了

51038910-6572-11ed-8abf-dac502259ad0.png

MSS和MTU的區別

亂序重排機制

既然數據包會被分段,鏈路又這么復雜還會丟包,那數據包亂序也就顯得不奇怪了。比如發數據包1,2,3。1號數據包走了其他網絡路徑,2和3數據包先到,1數據包后到,于是數據包順序就成了2,3,1。這一點TCP也考慮到了,依靠數據包的sequence,接收方就能知道數據包的先后順序。

后發的數據包先到是吧,那就先放到專門的亂序隊列中,等數據都到齊后,重新整理好亂序隊列的數據包順序后再給到用戶,這就是亂序重排機制

511aaf46-6572-11ed-8abf-dac502259ad0.png

亂序隊列等待數據包的到來

連接機制

前面提到,UDP是無連接的,而TCP是面向連接的。

這里提到的連接到底是啥?

TCP通過上面提到的各種機制實現了數據的可靠性。這些機制背后是通過一個個數據結構來實現的邏輯。而為了實現這套邏輯,操作系統內核需要在兩端代碼里維護一套復雜的狀態機(三次握手,四次揮手,RST,closing等異常處理機制),這套狀態機其實就是所謂的"連接"。這其實就是TCP的連接機制,而UDP用不上這套狀態機,因此它是"無連接"的。

網絡環境鏈路很長,還復雜,數據丟包是很常見的。

我們平常用TCP做各種數據傳輸,完全對這些事情無感知。

哪有什么歲月靜好,是TCP替你負重前行。

這就是TCP三大特性"面向連接、可靠的、基于字節流"中"可靠"的含義。

不信你改用UDP試試,丟包那就是真丟了,丟到你懷疑人生。

用UDP就一定比用TCP快嗎?

這時候UDP就不服了:"正因為沒有這些復雜的TCP可靠性機制,所以我很快啊"

嗯,這也是大部分人認為UDP比TCP快的原因。

實際上大部分情況下也確實是這樣的。這話沒毛病。

那問題就來了。

有沒有用了UDP但卻比TCP慢的情況呢?

其實也有。

在回答這個問題前,我需要先說下UDP的用途

實際上,大部分人也不會嘗試直接拿裸udp放到生產環境中去做項目。

那UDP的價值在哪?

在我看來,UDP的存在,本質是內核提供的一個最小網絡傳輸功能

很多時候,大家雖然號稱自己用了UDP,但實際上都很忌憚它的丟包問題,所以大部分情況下都會在UDP的基礎上做各種不同程度的應用層可靠性保證。比如王者農藥用的KCP,以及最近很火的QUIC(HTTP3.0),其實都在UDP的基礎上做了重傳邏輯,實現了一套類似TCP那樣的可靠性機制。

教科書上最愛提UDP適合用于音視頻傳輸,因為這些場景允許丟包。但其實也不是什么包都能丟的,比如重要的關鍵幀啥的,該重傳還得重傳。除此之外,還有一些亂序處理機制。舉個例子吧。

打音視頻電話的時候,你可能遇到過丟失中間某部分信息的情況,但應該從來沒遇到過亂序的情況吧。

比如對方打網絡電話給你,說了:"我好想給小林來個點贊在看!"

這時候網絡信號不好,你可能會聽到"我….點贊在看"。

但卻從來沒遇到過"在看小林好想贊"這樣的亂序場景吧?

所以說,雖然選擇了使用UDP,但一般還是會在應用層上做一些重傳機制的

于是問題就來了,如果現在我需要傳一個特別大的數據包

在TCP里,它內部會根據MSS的大小分段,這時候進入到IP層之后,每個包大小都不會超過MTU,因此IP層一般不會再進行分片。這時候發生丟包了,只需要重傳每個MSS分段就夠了。

512e925e-6572-11ed-8abf-dac502259ad0.gif

TCP分段

但對于UDP,其本身并不會分段,如果數據過大,到了IP層,就會進行分片。此時發生丟包的話,再次重傳,就會重傳整個大數據包

51456646-6572-11ed-8abf-dac502259ad0.gif

UDP不分段

對于上面這種情況,使用UDP就比TCP要慢

當然,解決起來也不復雜。這里的關鍵點在于是否實現了數據分段機制,使用UDP的應用層如果也實現了分段機制的話,那就不會出現上述的問題了

總結

TCP為了實現可靠性,引入了重傳機制、流量控制、滑動窗口、擁塞控制、分段以及亂序重排機制。而UDP則沒有實現,因此一般來說TCP比UDP慢。

TCP是面向連接的協議,而UDP是無連接的協議。這里的"連接"其實是,操作系統內核在兩端代碼里維護的一套復雜狀態機。

大部分項目,會在基于UDP的基礎上,模仿TCP,實現不同程度的可靠性機制。比如王者農藥用的KCP其實就在基于UDP在應用層里實現了一套重傳機制。

對于UDP+重傳的場景,如果要傳超大數據包,并且沒有實現分段機制的話,那數據就會在IP層分片,一旦丟包,那就需要重傳整個超大數據包。而TCP則不需要考慮這個,內部會自動分段,丟包重傳分段就行了。這種場景下,其實TCP更快。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1353

    瀏覽量

    79055
  • UDP
    UDP
    +關注

    關注

    0

    文章

    325

    瀏覽量

    33931
  • SOCKEt編程
    +關注

    關注

    0

    文章

    11

    瀏覽量

    1489

原文標題:UDP 一定比 TCP 快嗎?

文章出處:【微信號:小林coding,微信公眾號:小林coding】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么情況下UDP通訊而不使用TCP通訊

    根據實際情況確定使用UDP通訊還是TCP通訊
    發表于 05-04 09:23

    TCPUDP的區別分析

      傳輸層協議主要有TCPUDPUDP提供無連接的通信,不能保證數據包被發送到目標地址,典型的即時傳輸少量數據的應用程序通常使用UDPTCP
    發表于 09-18 10:29 ?2次下載

    tcpudp的應用場景

    從特點上我們已經知道,TCP 是可靠的但傳輸速度UDP 是不可靠的但傳輸速度。因此在選用具體協議通信時,應該根據通信數據的要求而決定。若通信數據完整性需讓位與通信實時性,則應該
    發表于 12-08 10:16 ?1.5w次閱讀
    <b class='flag-5'>tcp</b>和<b class='flag-5'>udp</b>的應用場景

    tcpudp協議的異同

    UDP 協議 UDP 協議是無連接、不可靠的個傳輸層協議。下圖是 UDP 數據報格式。 端口號用來區分發送進程和接收進程。UDP 總長度表
    的頭像 發表于 11-12 14:45 ?4070次閱讀
    <b class='flag-5'>tcp</b>和<b class='flag-5'>udp</b>協議的異同

    STM32F103RE和STM32F407VE單片機lwip 2.1.2驅動88W8801 WiFi模塊,如何提高TCPUDP的傳輸速率

    STM32F103RE和STM32F407VE單片機lwip 2.1.2驅動88W8801 WiFi模塊,如何提高TCPUDP的傳輸速率
    發表于 11-23 17:51 ?4次下載
    STM32F103RE和STM32F407VE單片機<b class='flag-5'>用</b>lwip 2.1.2驅動88W8801 WiFi模塊,如何提高<b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>的傳輸速率

    TCPUDP的原理以及區別

    最近重新認知了一下TCPUDP的原理以及區別,做個簡單的總結。
    發表于 08-08 14:34 ?1491次閱讀

    TCPUDP協議的區別

    最近重新認知了一下TCPUDP的原理以及區別,做個簡單的總結。
    發表于 11-03 10:25 ?873次閱讀

    什么情況下UDP會比TCP

    UDP是什么 返回的fd是指socket句柄,可以理解為socket的身份證號。通過這個fd你可以在內核中找到唯的socket結構。 如果想要通過這個socket發消息,只需要操作這個fd
    發表于 11-15 20:37 ?713次閱讀

    TCP對比UDP誰比較快 什么情況下UDP會比TCP

    TCP通過上面提到的各種機制實現了數據的可靠性。這些機制背后是通過個個數據結構來實現的邏輯。而為了實現這套邏輯,操作系統內核需要在兩端代碼里維護套復雜的狀態機(三次握手,四次揮手,RST,closing等異常處理機制)。
    發表于 12-16 11:06 ?1086次閱讀

    UDP一定TCP更快嗎?什么情況下UDP會更慢?

    方面,UDP種無連接的協議。這意味著發送數據之前不需要建立連接,因此不需要進行三次握手過程。由于UDP不會確保數據的完整性和可靠性,因此它可能會丟失
    的頭像 發表于 03-25 09:58 ?1047次閱讀

    TCPUDP的特點及使用場景

    個不算嚴謹的說法總結 TCP 就是,女孩子如果遇到 TCP 這樣的男生,就嫁了吧。因為TCP的核心特點就是靠譜。他的特定包括,面向連接、
    的頭像 發表于 05-18 17:20 ?1755次閱讀

    UDP一定TCP更快嗎?什么情況下UDP會更慢?

    當談到網絡傳輸時,大多數人可能認為TCP是最好的選擇。因為TCP種可靠的協議,它可以確保數據的可靠性和完整性。但是,當考慮到UDP時,
    的頭像 發表于 04-03 09:38 ?1573次閱讀
    <b class='flag-5'>UDP</b><b class='flag-5'>一定</b><b class='flag-5'>比</b><b class='flag-5'>TCP</b>更快嗎?<b class='flag-5'>什么情況下</b><b class='flag-5'>用</b><b class='flag-5'>UDP</b>會更慢?

    TCPUDP的區別

    1.TCPUDP的區別 TCP是面向連接的,UDP是面向無連接的; TCP只能一對一通信,
    的頭像 發表于 11-09 09:35 ?5956次閱讀
    <b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>的區別

    TCPUDP的基本區別

    TCPUDP基本區別 基于連接與無連接 TCP要求系統資源較多,UDP較少; UDP程序結構較簡單 流模式(
    的頭像 發表于 11-13 15:27 ?4614次閱讀
    <b class='flag-5'>TCP</b>與<b class='flag-5'>UDP</b>的基本區別

    UDPTCP的主要區別 UDP能否像TCP樣實現可靠傳輸?

    據包的傳輸不進行確認和重傳,而TCP種面向連接的協議,通過確認和重傳來實現可靠的數據傳輸。 首先,UDP無連接的特點使得它在傳輸時的開銷較小。UDP的數據包不需要建立和維護連接,僅
    的頭像 發表于 01-22 16:10 ?811次閱讀
    主站蜘蛛池模板: 中文字幕伊人香蕉在线| 伊人久久大香线蕉综合电影| 亚洲性无码av在线| 91亚洲 欧美 国产 制服 动漫| 成人中文在线| 精品无码国产自产在线观看| 欧美精品高潮呻吟AV久久| 日韩hd高清xxxⅹ| 诱受H嗯啊巨肉舍友1V1| 草比比过程图| 巨黄的肉辣文np| 日韩AV成人无码久久精品老人| 无人区尖叫之夜美女姐姐视频| 在线观看中文字幕码2021不用下载| 99视频精品全部免费免费观| 国产精品AV无码免费播放| 男欢女爱免费视频| 一二三四在线视频社区8| 国产成人在线播放视频| 蜜柚影院在线观看免费高清中文| 亚洲精品成人无码A片在线| HEYZO无码中文字幕人妻| 精品国产一区二区三区久久影院| 欧美 亚洲 有码中文字幕| 亚洲视频免费| 国产免费人成在线视频有码| 人与禽物videos另类| 英国video性精品高清最新| 国产午夜在线观看视频播放| 欧美乱码卡一卡二卡四卡免费| 又粗又大又爽又黄的免费视频| 国产毛片视频网站| 偷窥欧美wc经典tv| 俄罗斯12一15处交| 乳液全集电影在线观看| 菠萝蜜国际一区麻豆| 免费撕开胸罩吮胸视频| 97视频在线观看免费播放| 乱叫抽搐流白浆免费视频| 中文日产无乱码AV在线观| 精品一二三区久久AAA片|