詳解TCP和UDP的區(qū)別?教你快速理解三次握手和四次揮手撒桨!

前言:

之前我們有了解IP地址和端口號查刻,通過IP地址能夠找到對應(yīng)的設(shè)備,然后再通過端口號找到對應(yīng)的端口凤类,再通過端口把數(shù)據(jù)傳輸給應(yīng)用程序穗泵,這里要注意,數(shù)據(jù)不能隨便發(fā)送谜疤,在發(fā)送之前還需要選擇一個對應(yīng)的傳輸協(xié)議佃延,保證程序之間按照指定的傳輸規(guī)則進行數(shù)據(jù)的通信现诀,而這個傳輸協(xié)議就是我今天要分享的內(nèi)容。

要想理解 TCP 和 UDP 的區(qū)別履肃,首先要明白什么是 TCP仔沿?什么是 UDP

1尺棋,UDP介紹

UDP 是User Datagram Protocol的簡稱封锉, 中文名是用戶數(shù)據(jù)報協(xié)議,是OSI(Open System Interconnection膘螟,開放式系統(tǒng)互聯(lián)) 參考模型中一種無連接的傳輸層協(xié)議成福,提供面向事務(wù)的簡單不可靠信息傳送服務(wù),IETF RFC 768是UDP的正式規(guī)范荆残。UDP在IP報文的協(xié)議號是17奴艾。

udp數(shù)據(jù)報.jpg

UDP是一種面向無連接的協(xié)議,每個數(shù)據(jù)報都是一個獨立的信息脊阴,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地蚯瞧,因此能否到達目的地嘿期,到達目的地的時間以及內(nèi)容的正確性都是不能被保證的。

由上圖可以看出埋合,UDP 除了端口號备徐,基本啥都沒有了。如果沒有這兩個端口號甚颂,數(shù)據(jù)就不知道該發(fā)給哪個應(yīng)用蜜猾。

UDP的特點:

  • UDP是一個無連接協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接.
  • 一臺服務(wù)機可同時向多個客戶機傳輸相同的消息
  • UDP信息報的標(biāo)題很短振诬,只有8個字節(jié)蹭睡,相對于TCP的20個字節(jié)信息報而言UDP的額外開銷很小。
  • 它不屬于連接型協(xié)議赶么,因而具有資源消耗小肩豁,處理速度快

正是由于UDP無連接、開銷小辫呻、速度快這一特性清钥,所以通常音頻、視頻和普通數(shù)據(jù)在傳送時使用UDP較多放闺,因為它們即使偶爾丟失一兩個數(shù)據(jù)包祟昭,也不會對接收結(jié)果產(chǎn)生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協(xié)議怖侦。

UDP舉例說明:
  • 直播篡悟。 直播對實時性的要求比較高谜叹,寧可丟包,也不要卡頓的恰力,所以很多直播應(yīng)用都基于 UDP 實現(xiàn)了自己的視頻傳輸協(xié)議
  • 實時游戲叉谜。游戲的特點也是實時性比較高,在這種情況下踩萎,采用自定義的可靠的 UDP 協(xié)議停局,自定義重傳策略,能夠把產(chǎn)生的延遲降到最低香府,減少網(wǎng)絡(luò)問題對游戲造成的影響
  • 物聯(lián)網(wǎng)董栽。一方面,物聯(lián)網(wǎng)領(lǐng)域中斷資源少企孩,很可能知識個很小的嵌入式系統(tǒng)锭碳,而維護 TCP 協(xié)議的代價太大了;另一方面勿璃,物聯(lián)網(wǎng)對實時性的要求也特別高擒抛。比如 Google 旗下的 Nest 簡歷 Thread Group,推出了物聯(lián)網(wǎng)通信協(xié)議 Thread补疑,就是基于 UDP 協(xié)議的

簡單的理解:把udp想象成寫信模式歧沪,把信投入郵箱,收件人是否收到信莲组,不確定诊胞。這也就是驗證了,為什么udp傳輸過程中會丟包的原因锹杈,以及它的不安全性撵孤。


2,TCP介紹

TCP的英文全拼(Transmission Control Protocol)簡稱傳輸控制協(xié)議竭望,它是一種面向連接的邪码、可靠的、基于字節(jié)流的傳輸層通信協(xié)議咬清。

TCP的傳輸步驟如下:

創(chuàng)建連接
傳輸數(shù)據(jù)
關(guān)閉連接

TCP的特點:

1.面向連接:

  • 通信雙方必須先建立好連接才能進行數(shù)據(jù)的傳輸霞扬,數(shù)據(jù)傳輸完成后,雙方必須斷開此連接枫振,以釋放系統(tǒng)資源喻圃。

2.可靠傳輸:

  • TCP 采用發(fā)送應(yīng)答機制
  • 超時重傳
  • 錯誤校驗
  • 流量控制和阻塞管理

簡單理解:把TCP想象成打電話模式,在通信開始之前粪滤,一定要先建立好連接斧拍,才能發(fā)送數(shù)據(jù),通信結(jié)束要關(guān)閉連接杖小。


3肆汹,TCP三次握手:

所有的問題愚墓,首先都要建立連接,所以首先是連接維護的問題
TCP 的建立連接稱為三次握手昂勉,在了解之前浪册,我們先分析一下tcp數(shù)據(jù)報情況:


tcp數(shù)據(jù)報.jpg

由上圖可知:

  • 序列號seq:占4個字節(jié),用來標(biāo)記數(shù)據(jù)段的順序
  • 確認(rèn)號ack:占4個字節(jié)岗照,期待收到對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號,一般回復(fù)消息+1即為確認(rèn)號
  • 確認(rèn)ACK:占1位村象,僅當(dāng)ACK=1時,確認(rèn)號字段才有效攒至。ACK=0時厚者,確認(rèn)號無效
  • 同步SYN:連接建立時用于同步序號。當(dāng)SYN=1迫吐,ACK=0時表示:這是一個連接請求報文段库菲。若同意連接,則在響應(yīng)報文段中使得SYN=1志膀,ACK=1
  • 終止FIN:用來釋放一個連接熙宇。FIN=1表示:此報文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放運輸連接
  • PS:ACK溉浙、SYN和FIN這些大寫的單詞表示標(biāo)志位烫止,其值要么是1,要么是0放航;ack烈拒、seq小寫的單詞表示序號圆裕。

三次握手詳解:

最開始的時候客戶端和服務(wù)器都是處于CLOSED狀態(tài)广鳍。主動打開連接的為客戶端吓妆,被動打開連接的是服務(wù)器。

三次握手.png

A:您好行拢,我是 A
B:您好 A,我是 B
A:您好 B

1,TCP服務(wù)器進程先創(chuàng)建傳輸控制塊TCB舟奠,時刻準(zhǔn)備接受客戶進程的連接請求,此時服務(wù)器就進入了LISTEN(監(jiān)聽)狀態(tài)沼瘫;

2,TCP客戶進程也是先創(chuàng)建傳輸控制塊TCB,然后向服務(wù)器發(fā)出連接請求報文耿戚,這是報文首部中的同部位SYN=1湿故,同時選擇一個初始序列號 seq=x ,此時坛猪,TCP客戶端進程進入了 SYN-SENT(同步已發(fā)送狀態(tài))狀態(tài)脖阵。TCP規(guī)定,SYN報文段(SYN=1的報文段)不能攜帶數(shù)據(jù)墅茉,但需要消耗掉一個序號命黔。

3,TCP服務(wù)器收到請求報文后,如果同意連接躁锁,則發(fā)出確認(rèn)報文纷铣。確認(rèn)報文中應(yīng)該 ACK=1,SYN=1战转,確認(rèn)號是ack=x+1搜立,同時也要為自己初始化一個序列號 seq=y,此時槐秧,TCP服務(wù)器進程進入了SYN-RCVD(同步收到)狀態(tài)啄踊。這個報文也不能攜帶數(shù)據(jù),但是同樣要消耗一個序號刁标。

4,TCP客戶進程收到確認(rèn)后颠通,還要向服務(wù)器給出確認(rèn)。確認(rèn)報文的ACK=1膀懈,ack=y+1顿锰,自己的序列號seq=x+1,此時启搂,TCP連接建立硼控,客戶端進入ESTABLISHED(已建立連接)狀態(tài)。TCP規(guī)定胳赌,ACK報文段可以攜帶數(shù)據(jù)牢撼,但是如果不攜帶數(shù)據(jù)則不消耗序號。

當(dāng)服務(wù)器收到客戶端的確認(rèn)后也進入ESTABLISHED狀態(tài)疑苫,此后雙方就可以開始通信了熏版。


4,TCP四次揮手:

說完建立連接,再說下斷開連接捍掺,也被稱為四次揮手撼短,可以簡單理解如下


四次揮手.png

A:B 啊,我不想玩了
B:哦挺勿,你不想玩了啊曲横,我知道了
這個時候,只是 A 不想玩了满钟,即不再發(fā)送數(shù)據(jù)胜榔,但是 B 可能還有未發(fā)送完的數(shù)據(jù)胳喷,所以需要等待 B 也主動關(guān)閉。
B:A 啊夭织,好吧吭露,我也不玩了,拜拜
A:好的尊惰,拜拜
數(shù)據(jù)傳輸完畢后,雙方都可釋放連接弄屡。最開始的時候,客戶端和服務(wù)器都是處于ESTABLISHED狀態(tài)迈嘹,然后客戶端主動關(guān)閉全庸,服務(wù)器被動關(guān)閉。

1,客戶端進程發(fā)出連接釋放報文神僵,并且停止發(fā)送數(shù)據(jù)覆劈。釋放數(shù)據(jù)報文首部,F(xiàn)IN=1炮障,其序列號為seq=u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個字節(jié)的序號加1)鹦筹,此時址貌,客戶端進入FIN-WAIT-1(終止等待1)狀態(tài)。 TCP規(guī)定练对,F(xiàn)IN報文段即使不攜帶數(shù)據(jù),也要消耗一個序號虚青。

2,服務(wù)器收到連接釋放報文螺男,發(fā)出確認(rèn)報文纵穿,ACK=1谓媒,ack=u+1何乎,并且?guī)献约旱男蛄刑杝eq=v,此時抢野,服務(wù)端就進入了CLOSE-WAIT(關(guān)閉等待)狀態(tài)各墨。TCP服務(wù)器通知高層的應(yīng)用進程,客戶端向服務(wù)器的方向就釋放了贬堵,這時候處于半關(guān)閉狀態(tài),即客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了详恼,但是服務(wù)器若發(fā)送數(shù)據(jù)引几,客戶端依然要接受。這個狀態(tài)還要持續(xù)一段時間敞掘,也就是整個CLOSE-WAIT狀態(tài)持續(xù)的時間楣铁。

3,客戶端收到服務(wù)器的確認(rèn)請求后,此時赫冬,客戶端就進入FIN-WAIT-2(終止等待2)狀態(tài)溃列,等待服務(wù)器發(fā)送連接釋放報文(在這之前還需要接受服務(wù)器發(fā)送的最后的數(shù)據(jù))。

4,服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后补鼻,就向客戶端發(fā)送連接釋放報文,F(xiàn)IN=1咨跌,ack=u+1硼婿,由于在半關(guān)閉狀態(tài),服務(wù)器很可能又發(fā)送了一些數(shù)據(jù)加酵,假定此時的序列號為seq=w,此時冗澈,服務(wù)器就進入了LAST-ACK(最后確認(rèn))狀態(tài)陋葡,等待客戶端的確認(rèn)。

5,客戶端收到服務(wù)器的連接釋放報文后捌归,必須發(fā)出確認(rèn)岭粤,ACK=1,ack=w+1巾兆,而自己的序列號是seq=u+1虎囚,此時,客戶端就進入了TIME-WAIT(時間等待)狀態(tài)圃伶。注意此時TCP連接還沒有釋放蒲列,必須經(jīng)過2? *?MSL(最長報文段壽命)的時間后,當(dāng)客戶端撤銷相應(yīng)的TCB后嫉嘀,才進入CLOSED狀態(tài)魄揉。

6,服務(wù)器只要收到了客戶端發(fā)出的確認(rèn),立即進入CLOSED狀態(tài)瓣俯。同樣,撤銷TCB后腔剂,就結(jié)束了這次的TCP連接驼仪。可以看到绪爸,服務(wù)器結(jié)束TCP連接的時間要比客戶端早一些。


4,常見面試題解析:

【問題1】為什么連接的時候是三次握手介褥,關(guān)閉的時候卻是四次握手?

答:因為當(dāng)Server端收到Client端的SYN連接請求報文后递惋,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應(yīng)答的睛廊,SYN報文是用來同步的。但是關(guān)閉連接時喉前,當(dāng)Server端收到FIN報文時王财,很可能并不會立即關(guān)閉SOCKET,所以只能先回復(fù)一個ACK報文见咒,告訴Client端挂疆,"你發(fā)的FIN報文我收到了"。只有等到我Server端所有的報文都發(fā)送完了缤言,我才能發(fā)送FIN報文,因此不能一起發(fā)送庆揩。故需要四步握手。

【問題2】為什么TIME_WAIT狀態(tài)需要經(jīng)過2MSL(最大報文段生存時間)才能返回到CLOSE狀態(tài)订晌?

答:因為網(wǎng)絡(luò)沒有絕對的安全,有可能最后一個ACK丟失砌庄。所以TIME_WAIT狀態(tài)就是用來重發(fā)可能丟失的ACK報文娄昆。在Client發(fā)送出最后的ACK回復(fù)缝彬,但該ACK可能丟失。Server如果沒有收到ACK杆怕,將不斷重復(fù)發(fā)送FIN片段。所以Client不能立即關(guān)閉陵珍,它必須確認(rèn)Server接收到了該ACK违施。Client會在發(fā)送出ACK之后進入到TIME_WAIT狀態(tài)。Client會設(shè)置一個計時器留潦,等待2MSL的時間辣往。如果在該時間內(nèi)再次收到FIN,那么Client會重發(fā)ACK并再次等待2MSL站削。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網(wǎng)絡(luò)中最大的存活時間十偶,2MSL就是一個發(fā)送和一個回復(fù)所需的最大時間园细。如果直到2MSL,Client都沒有再次收到FIN狮崩,那么Client推斷ACK已經(jīng)被成功接收,則結(jié)束TCP連接厉亏。

【問題3】為什么不能用兩次握手進行連接烈和?

答:3次握手完成兩個重要的功能招刹,既要雙方做好發(fā)送數(shù)據(jù)的準(zhǔn)備工作(雙方都知道彼此已準(zhǔn)備好),也要允許雙方就初始序列號進行協(xié)商疯暑,這個序列號在握手過程中被發(fā)送和確認(rèn)。
假設(shè)由于網(wǎng)絡(luò)原因幻馁,消息被阻塞在了某個節(jié)點越锈,然后阻塞的時間超出設(shè)定的時間,服務(wù)器會一直認(rèn)為稀拐,客戶端沒有收到消息丹弱,會重復(fù)發(fā)消息,造成資源浪費蜓洪。 當(dāng)客戶端和服務(wù)器通信完成后坯苹,這個被瀏覽器認(rèn)為失效的消息,到達了服務(wù)器刚操,此時再芋,服務(wù)器以為是新的連接,然后回應(yīng)鉴逞,而瀏覽器認(rèn)為沒有給服務(wù)器發(fā)送過消息,所以不會理睬服務(wù)器构捡,又造成資源浪費。
第三次握手看似多余其實不然滑凉,這主要是為了防止已失效的請求報文段突然又傳送到了服務(wù)端而產(chǎn)生連接的誤判

【問題4】如果已經(jīng)建立了連接喘帚,但是客戶端突然出現(xiàn)故障了怎么辦吹由?

答:TCP還設(shè)有一個保活計時器粗合,顯然,客戶端如果出現(xiàn)故障隙疚,服務(wù)器不能一直等下去玫荣,白白浪費資源捅厂。服務(wù)器每收到一次客戶端的請求后都會重新復(fù)位這個計時器,時間通常是設(shè)置為2小時焙贷,若兩小時還沒有收到客戶端的任何數(shù)據(jù),服務(wù)器就會發(fā)送一個探測報文段啡彬,以后每隔75秒鐘發(fā)送一次故硅。若一連發(fā)送10個探測報文仍然沒反應(yīng),服務(wù)器就認(rèn)為客戶端出了故障吃衅,接著就關(guān)閉連接徘层。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末利职,一起剝皮案震驚了整個濱河市猪贪,隨后出現(xiàn)的幾起案子讯私,更是在濱河造成了極大的恐慌,老刑警劉巖妄帘,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抡驼,死亡現(xiàn)場離奇詭異肿仑,居然都是意外死亡尤慰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門逛漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事霜医。” “怎么了署海?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵砸狞,是天一觀的道長镀梭。 經(jīng)常有香客問我,道長撒强,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任胚想,我火速辦了婚禮芽隆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牙躺。我一直安慰自己腕扶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布脓恕。 她就那樣靜靜地躺著窿侈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪史简。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天跺讯,我揣著相機與錄音衙傀,去河邊找鬼。 笑死火本,一個胖子當(dāng)著我的面吹牛聪建,可吹牛的內(nèi)容都是我干的金麸。 我是一名探鬼主播擎析,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揍魂?” 一聲冷哼從身側(cè)響起桨醋,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎现斋,沒想到半個月后喜最,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡庄蹋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年瞬内,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片限书。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡虫蝶,死狀恐怖倦西,靈堂內(nèi)的尸體忽然破棺而出舟陆,到底是詐尸還是另有隱情耻矮,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布哨免,位于F島的核電站,受9級特大地震影響采桃,放射性物質(zhì)發(fā)生泄漏普办。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一橱健、第九天 我趴在偏房一處隱蔽的房頂上張望畴博。 院中可真熱鬧,春花似錦亮隙、人聲如沸溢吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迅耘。三九已至,卻和暖如春栖秕,著一層夾襖步出監(jiān)牢的瞬間簇捍,已是汗流浹背垦写。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尔艇,地道東北人终娃。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓柠新,卻偏偏與公主長得像蕊退,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子输硝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354