前端也要知道的TCP和UDP

TCP 和 UDP

作為一個前端已經(jīng)不止一次的在面試中被問到 TCP 和 UDP 協(xié)議了哩治。為了讓自己的回答不那么敷衍,從前端的角度對 TCP 和 UDP 在基礎(chǔ)層面進(jìn)行了一下總結(jié)苍蔬。

TCP 和 UDP 是運輸層的兩種協(xié)議,什么是運輸層呢?

運輸層(Transport Layer)就是負(fù)責(zé)向兩臺主機(jī)進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù),應(yīng)用進(jìn)程利用該服務(wù)傳送應(yīng)用層報文枢贿。
這里的通用是指并不針對某一個特定的網(wǎng)絡(luò)應(yīng)用,而是多種應(yīng)用可以使用同一個運輸層服務(wù)抬吟。

TCP 協(xié)議是一種面向連接的萨咕、可靠的數(shù)據(jù)傳輸服務(wù)统抬』鸨荆可靠指得是通過 TCP 協(xié)議傳送數(shù)據(jù)可以無差錯、不丟失聪建、不重復(fù)钙畔、并且按序到達(dá);
并且 TCP 協(xié)議還具有以下特點:

  • 雙方在連接建立之后金麸,都可以在任何時候進(jìn)行數(shù)據(jù)發(fā)送
  • 有緩存擎析,發(fā)送和接收時都可以利用緩存臨時存放數(shù)據(jù)
  • TCP 是面向字節(jié)流的

UDP 協(xié)議是無連接的、不可靠的。具有以下特點:

  • 無連接
  • 因為無連接所以不可靠
  • UDP 是面向報文的
  • 支持 n 對 n 的交互通信
  • UDP 無擁塞控制

擁塞控制:
我們知道揍魂,兩臺主機(jī)在傳輸數(shù)據(jù)包的時候桨醋,如果發(fā)送方遲遲沒有收到接收方反饋的ACK,那么發(fā)送方就會認(rèn)為它發(fā)送的數(shù)據(jù)包丟失了现斋,進(jìn)而會重新傳輸這個丟失的數(shù)據(jù)包喜最。然而實際情況有可能此時有太多主機(jī)正在使用信道資源,導(dǎo)致網(wǎng)絡(luò)擁塞了庄蹋,而A發(fā)送的數(shù)據(jù)包被堵在了半路瞬内,遲遲沒有到達(dá)B。這個時候A誤認(rèn)為是發(fā)生了丟包情況限书,會重新傳輸這個數(shù)據(jù)包虫蝶。結(jié)果就是不僅浪費了信道資源,還會使網(wǎng)絡(luò)更加擁塞倦西。因此能真,我們需要進(jìn)行擁塞控制。

由于 UDP 具有無連接扰柠、傳輸速度更快舟陆、效率更高、并且沒有擁塞控制耻矮,所以源主機(jī)發(fā)送速率不受網(wǎng)絡(luò)擁塞的影響秦躯,因此 UDP 協(xié)議被廣泛的應(yīng)用到直播和實時視頻的領(lǐng)域。

與 UDP 相反裆装,TCP 協(xié)議在速度踱承、效率方面沒有優(yōu)勢,但是 TCP 協(xié)議可以很好的保證數(shù)據(jù)傳輸?shù)目煽啃陨诿猓旅鎭砜纯?TCP 是如何做到可靠的茎活。

  1. 校驗:如果接收端校驗出包有錯,則進(jìn)行丟棄且不進(jìn)行響應(yīng)
  2. 排序:在將數(shù)據(jù)包交給應(yīng)用層之前琢唾,TCP 協(xié)議會保證數(shù)據(jù)包的有序性
  3. 去重:丟棄重復(fù)的數(shù)據(jù)
  4. 應(yīng)答:接收方接收到數(shù)據(jù)后载荔,將發(fā)送確認(rèn)信息給發(fā)送方
  5. 超時重發(fā):當(dāng)發(fā)送方發(fā)出數(shù)據(jù)后,會啟動一個定時器采桃,當(dāng)超過定時器時限后懒熙,會重新發(fā)這個報文段
  6. 流量控制:利用固定大小的緩沖空間防止接收方緩沖區(qū)溢出

三次握手

我想不管你了不了解這些協(xié)議,你都會聽說過三次握手普办。

我們把客戶端和服務(wù)器每一次交互都比喻成一次握手工扎,那么簡單來說,當(dāng)建立一個 TCP 連接的時候衔蹲,整個過程需要客戶端和服務(wù)端交互三個包肢娘,交互這些包的目的是連接服務(wù)器指定端口,建立 TCP 連接,并同步連接雙方的序列號和確認(rèn)號以及交換 TCP 窗口大小橱健。

在這里插入圖片描述

第一次握手
開始建立連接時而钞,客戶端向服務(wù)器發(fā)出連接請求報文,報文首部中的同部位 SYN = 1拘荡,同時選擇一個初始序列號 seq = x 笨忌,
此時客戶端進(jìn)程進(jìn)入了 SYN-SENT (同步已發(fā)送狀態(tài))狀態(tài),等待服務(wù)器確認(rèn)俱病。

第二次握手
服務(wù)器收到 syn 包后官疲,如果同意連接,則發(fā)出確認(rèn)報文亮隙;確認(rèn)報文 ACK = 1途凫,SYN = 1,確認(rèn)號是 ack = x + 1溢吻,同時也要為自己初始化一個序列號 seq = y出革,
此時服務(wù)器進(jìn)程進(jìn)入了 SYN-RCVD(同步收到)狀態(tài)姐刁。

第三次握手
客戶端收到服務(wù)器的 SYN + ACK 包,要向服務(wù)器給出確認(rèn)。確認(rèn)報文的 ACK = 1膝宁,ack = y + 1碍论,自己的序列號 seq = x + 1透敌。此時抗果,TCP 連接建立,
此時客戶端進(jìn)入 ESTABLISHED (已建立連接)狀態(tài)迅耘。

四次揮手

當(dāng)斷開連接時的四次揮手


在這里插入圖片描述

第一次揮手
客戶端進(jìn)程發(fā)出連接釋放報文贱枣,并且停止發(fā)送數(shù)據(jù)。此時颤专,客戶端進(jìn)入 FIN-WAIT-1(終止等待 1)狀態(tài)纽哥。

第二次揮手
服務(wù)器收到連接釋放報文,發(fā)出確認(rèn)報文栖秕,此時春塌,服務(wù)端就進(jìn)入了 CLOSE-WAIT(關(guān)閉等待)狀態(tài)。

第三次揮手
服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后簇捍,就向客戶端發(fā)送連接中斷報文只壳,此時,服務(wù)器就進(jìn)入了 LAST-ACK(最后確認(rèn))狀態(tài)垦写,等待客戶端的確認(rèn)吕世。

第四次揮手
客戶端收到服務(wù)器的連接釋放報文后彰触,必須發(fā)出確認(rèn)梯投,客戶端就進(jìn)入了 TIME-WAIT(時間等待)狀態(tài)。
最后服務(wù)器只要收到了客戶端發(fā)出的確認(rèn),立即進(jìn)入 CLOSED 狀態(tài)分蓖。就結(jié)束了這次的 TCP 連接

了解了整個建立和斷開連接的過程尔艇,思考幾個問題:
1.TCP 建立連接為什么需要三次握手,一次握手行不行么鹤?

答案是當(dāng)然不行终娃,為什么不能一次握手:因為 TCP 是面向連接的,一次握手蒸甜,只發(fā)一條信息出去棠耕,沒有任何回信肯定無法建立連接。

2.兩次握手是否可行柠新?

假設(shè)只有兩次握手窍荧,當(dāng) A(客戶端) 想要建立連接時發(fā)送一個 SYN ,然后等待 ACK 恨憎,結(jié)果這個 SYN 因為網(wǎng)絡(luò)問題沒有及時到達(dá) B(服務(wù)端)蕊退,所以 A 在一段時間內(nèi)沒收到 ACK 后,會再發(fā)送一個 SYN 憔恳,這次 B 成功收到瓤荔,并向 A 發(fā)送了 ACK ,然后 A 也收到 ACK 钥组,但是此時 A 發(fā)送的第一個 SYN 終于到了 B输硝,對于 B 來說這是一個新連接請求,然后 B 又為這個連接申請資源程梦,返回 ACK 腔丧,然而這個 SYN 是個無效的請求,A 收到這個 SYN 的 ACK 后也并不會理會它作烟,而 B 卻不知道愉粤,B 會一直為這個連接維持著資源,造成資源的浪費拿撩。

3.那為什么三次握手就可以解決這些問題衣厘?

兩次握手的問題在于服務(wù)器端不知道一個 SYN 是否是無效的,而三次握手機(jī)制因為客戶端會給服務(wù)器回復(fù)第二次握手压恒,也意味著服務(wù)器會等待客戶端的第三次握手影暴,如果第三次握手遲遲不來,在嘗試重發(fā)后仍未收到探赫,服務(wù)器便會認(rèn)為這個 SYN 是無效的型宙,釋放相關(guān)資源。但這時有個問題就是客戶端完成第二次握手便認(rèn)為連接已建立伦吠,而第三次握手可能在傳輸中丟失妆兑,服務(wù)端會認(rèn)為連接是無效的魂拦,這時如果客戶端向服務(wù)端寫數(shù)據(jù),服務(wù)端將以 RST 包響應(yīng)搁嗓,客戶端就可以感知到錯誤芯勘。

4.如果第三次握手失敗怎么辦?

與第三題類似腺逛,當(dāng)客戶端收到服務(wù)端的 SYN+ACK 應(yīng)答后荷愕,其狀態(tài)變?yōu)?ESTABLISHED,并會發(fā)送 ACK 包給服務(wù)端棍矛,準(zhǔn)備發(fā)送數(shù)據(jù)了安疗。如果此時 ACK 在網(wǎng)絡(luò)中丟失,過了超時計時器后够委,那么Server端會重新發(fā)送 SYN+ACK 包茂契,默認(rèn)是5次。如果重傳指定次數(shù)到了后慨绳,仍然未收到 ACK 應(yīng)答掉冶,那么一段時間后,服務(wù)端自動關(guān)閉這個連接脐雪。但是客戶端認(rèn)為這個連接已經(jīng)建立厌小,如果客戶端端向服務(wù)端寫數(shù)據(jù),服務(wù)端端將以 RST 包響應(yīng)战秋,客戶端就可以感知到錯誤璧亚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脂信,隨后出現(xiàn)的幾起案子癣蟋,更是在濱河造成了極大的恐慌,老刑警劉巖狰闪,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疯搅,死亡現(xiàn)場離奇詭異,居然都是意外死亡埋泵,警方通過查閱死者的電腦和手機(jī)幔欧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丽声,“玉大人礁蔗,你說我怎么就攤上這事⊙闵纾” “怎么了浴井?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霉撵。 經(jīng)常有香客問我磺浙,道長洪囤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任屠缭,我火速辦了婚禮箍鼓,結(jié)果婚禮上崭参,老公的妹妹穿的比我還像新娘呵曹。我一直安慰自己,他們只是感情好何暮,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布奄喂。 她就那樣靜靜地躺著,像睡著了一般海洼。 火紅的嫁衣襯著肌膚如雪跨新。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天坏逢,我揣著相機(jī)與錄音域帐,去河邊找鬼。 笑死是整,一個胖子當(dāng)著我的面吹牛肖揣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浮入,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼龙优,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了事秀?” 一聲冷哼從身側(cè)響起彤断,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎易迹,沒想到半個月后宰衙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡睹欲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年菩浙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片句伶。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡劲蜻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出考余,到底是詐尸還是另有隱情先嬉,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布楚堤,位于F島的核電站疫蔓,受9級特大地震影響含懊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衅胀,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一岔乔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滚躯,春花似錦雏门、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丧凤,卻和暖如春募闲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愿待。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工浩螺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仍侥。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓要出,卻偏偏與公主長得像,于是被迫代替她去往敵國和親访圃。 傳聞我的和親對象是個殘疾皇子厨幻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355