TCP宛乃、UDP知識(shí)點(diǎn)

TCP、UDP蒸辆,以及他們的區(qū)別

  • TCP(Transmission Control Protocol)
    TCP充分實(shí)現(xiàn)了數(shù)據(jù)傳輸時(shí)各種控制功能征炼,可以進(jìn)行丟包的重發(fā)控制,還可以對(duì)次序亂掉的分包進(jìn)行順序控制躬贡。
    而這些在UDP中都沒(méi)有谆奥。此外,TCP作為一種面向有連接的協(xié)議拂玻,只有在確認(rèn)通信對(duì)端存在時(shí)才會(huì)發(fā)送數(shù)據(jù)酸些,從而可以控制通信流量的浪費(fèi)宰译。
    TCP通過(guò)檢驗(yàn)和、序列號(hào)魄懂、確認(rèn)應(yīng)答沿侈、重發(fā)控制、連接管理以及窗口控制等機(jī)制實(shí)現(xiàn)可靠性傳輸市栗。此處不一一敘述缀拭。

  • UDP(User Datagram Protocol)
    UDP不提供復(fù)雜的控制機(jī)制,利用IP提供面向無(wú)連接的通信服務(wù)填帽。并且它是將應(yīng)用程序發(fā)來(lái)的數(shù)據(jù)在收到的那一刻蛛淋,
    立刻按照原樣發(fā)送到網(wǎng)絡(luò)上的一種機(jī)制。
    即使是出現(xiàn)網(wǎng)絡(luò)擁堵的情況下篡腌,UDP也無(wú)法進(jìn)行流量控制等避免網(wǎng)絡(luò)擁塞的行為。此外诚卸,傳輸途中如果出現(xiàn)了丟包,
    UDP也不負(fù)責(zé)重發(fā)棠赛。甚至當(dāng)出現(xiàn)包的到達(dá)順序亂掉時(shí)也沒(méi)有糾正的功能睛约。如果需要這些細(xì)節(jié)控制哲身,那么不得不交給
    由采用UDP的應(yīng)用程序去處理。換句話說(shuō)怔揩,UDP將部分控制轉(zhuǎn)移到應(yīng)用程序去處理,自己卻只提供作為傳輸層協(xié)議的
    最基本功能晕拆。UDP有點(diǎn)類似于用戶說(shuō)什么聽(tīng)什么的機(jī)制,但是需要用戶充分考慮好上層協(xié)議類型并制作相應(yīng)的應(yīng)用程序赤惊。

  • TCP與UDP區(qū)別總結(jié):
    1、TCP面向連接(如打電話要先撥號(hào)建立連接);UDP是無(wú)連接的凰锡,即發(fā)送數(shù)據(jù)之前不需要建立連接
    2、TCP提供可靠的服務(wù)欲诺。也就是說(shuō)蛹含,通過(guò)TCP連接傳送的數(shù)據(jù),無(wú)差錯(cuò),不丟失是偷,不重復(fù)募逞,且按序到達(dá);UDP盡最大努力交付纠脾,即不保證可靠交付
    3、TCP面向字節(jié)流宗兼,實(shí)際上是TCP把數(shù)據(jù)看成一連串無(wú)結(jié)構(gòu)的字節(jié)流;UDP是面向報(bào)文的
    UDP沒(méi)有擁塞控制躏鱼,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)使源主機(jī)的發(fā)送速率降低(對(duì)實(shí)時(shí)應(yīng)用很有用,如IP電話殷绍,實(shí)時(shí)視頻會(huì)議等)
    4染苛、每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一,一對(duì)多主到,多對(duì)一和多對(duì)多的交互通信
    5茶行、TCP首部開(kāi)銷20字節(jié);UDP的首部開(kāi)銷小,只有8個(gè)字節(jié)
    6登钥、TCP的邏輯通信信道是全雙工的可靠信道拢军,UDP則是不可靠信道

TCP三次握手:

  • 所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個(gè)TCP連接時(shí)怔鳖,需要客戶端和服務(wù)端總共發(fā)送3個(gè)包以確認(rèn)連接的建立茉唉。在socket編程中,這一過(guò)程由客戶端執(zhí)行connect來(lái)觸發(fā)
    (1)第一次握手:Client將標(biāo)志位SYN置為1结执,隨機(jī)產(chǎn)生一個(gè)值seq=J度陆,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN_SENT狀態(tài)献幔,等待Server確認(rèn)懂傀。
    (2)第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請(qǐng)求建立連接,Server將標(biāo)志位SYN和ACK都置為1蜡感,ack=J+1蹬蚁,隨機(jī)產(chǎn)生一個(gè)值seq=K,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請(qǐng)求郑兴,Server進(jìn)入SYN_RCVD狀態(tài)犀斋。
    (3)第三次握手:Client收到確認(rèn)后,檢查ack是否為J+1情连,ACK是否為1叽粹,如果正確則將標(biāo)志位ACK置為1,ack=K+1,并將該數(shù)據(jù)包發(fā)送給Server虫几,Server檢查ack是否為K+1锤灿,ACK是否為1,
    如果正確則連接建立成功辆脸,Client和Server進(jìn)入ESTABLISHED狀態(tài)但校,完成三次握手,隨后Client與Server之間可以開(kāi)始傳輸數(shù)據(jù)了啡氢。
  • 簡(jiǎn)單來(lái)說(shuō)始腾,就是
    1、建立連接時(shí)空执,客戶端發(fā)送SYN包(SYN=i)到服務(wù)器浪箭,并進(jìn)入到SYN-SEND狀態(tài),等待服務(wù)器確認(rèn)
    2辨绊、服務(wù)器收到SYN包奶栖,必須確認(rèn)客戶的SYN(ack=i+1),同時(shí)自己也發(fā)送一個(gè)SYN包(SYN=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN-RECV狀態(tài)
    3门坷、客戶端收到服務(wù)器的SYN+ACK包宣鄙,向服務(wù)器發(fā)送確認(rèn)報(bào)ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)默蚌,完成三次握手冻晤,客戶端與服務(wù)器開(kāi)始傳送數(shù)據(jù)。
    題外話:可以去了解SYN攻擊


    三次握手建立連接绸吸,圖片出自《碼出高效》

TCP四次揮手:

  • 所謂四次揮手(Four-Way Wavehand)即終止TCP連接鼻弧,就是指斷開(kāi)一個(gè)TCP連接時(shí),需要客戶端和服務(wù)端總共發(fā)送4個(gè)包以確認(rèn)連接的斷開(kāi)锦茁。在socket編程中攘轩,這一過(guò)程由客戶端或服務(wù)端任一方執(zhí)行close來(lái)觸發(fā)
    由于TCP連接時(shí)全雙工的,因此码俩,每個(gè)方向都必須要單獨(dú)進(jìn)行關(guān)閉度帮,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后,發(fā)送一個(gè)FIN來(lái)終止這一方向的連接稿存,收到一個(gè)FIN只是意味著這一方向上沒(méi)有數(shù)據(jù)流動(dòng)了笨篷,即不會(huì)再收到數(shù)據(jù)了,但是在這個(gè)TCP連接上仍然能夠發(fā)送數(shù)據(jù)瓣履,直到這一方向也發(fā)送了FIN率翅。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方則執(zhí)行被動(dòng)關(guān)閉
    (1)第一次揮手:Client發(fā)送一個(gè)FIN拂苹,用來(lái)關(guān)閉Client到Server的數(shù)據(jù)傳送安聘,Client進(jìn)入FIN_WAIT_1狀態(tài)痰洒。
    (2)第二次揮手:Server收到FIN后瓢棒,發(fā)送一個(gè)ACK給Client浴韭,確認(rèn)序號(hào)為收到序號(hào)+1(與SYN相同,一個(gè)FIN占用一個(gè)序號(hào))脯宿,Server進(jìn)入CLOSE_WAIT狀態(tài)念颈。
    (3)第三次揮手:Server發(fā)送一個(gè)FIN,用來(lái)關(guān)閉Server到Client的數(shù)據(jù)傳送连霉,Server進(jìn)入LAST_ACK狀態(tài)榴芳。
    (4)第四次揮手:Client收到FIN后,Client進(jìn)入TIME_WAIT狀態(tài)跺撼,接著發(fā)送一個(gè)ACK給Server窟感,確認(rèn)序號(hào)為收到序號(hào)+1,Server進(jìn)入CLOSED狀態(tài)歉井,完成四次揮手柿祈。


    四次揮手?jǐn)嚅_(kāi)連接,圖片出自《碼出高效》
  • 為什么建立連接是三次握手哩至,而關(guān)閉連接卻是四次揮手呢躏嚎?
    這是因?yàn)榉?wù)端在LISTEN狀態(tài)下,收到建立連接請(qǐng)求的SYN報(bào)文后菩貌,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶端卢佣。而關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文時(shí)箭阶,僅僅表示對(duì)方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù)虚茶,
    己方也未必全部數(shù)據(jù)都發(fā)送給對(duì)方了,所以己方可以立即close仇参,也可以發(fā)送一些數(shù)據(jù)給對(duì)方后媳危,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示同意現(xiàn)在關(guān)閉連接,因此冈敛,己方ACK和FIN一般都會(huì)分開(kāi)發(fā)送待笑。


    兩次握手導(dǎo)致TCP臟連接,圖片出自《碼出高效》
  • 為什么TIME_WAIT狀態(tài)需要經(jīng)過(guò)2MSL(最大報(bào)文段生存時(shí)間)才能返回到CLOSE狀態(tài)抓谴?
    原因有二:
    一暮蹂、保證TCP協(xié)議的全雙工連接能夠可靠關(guān)閉
    二、保證這次連接的重復(fù)數(shù)據(jù)段從網(wǎng)絡(luò)中消失
    1.)先說(shuō)第一點(diǎn)癌压,如果Client直接CLOSED了仰泻,那么由于IP協(xié)議的不可靠性或者是其它網(wǎng)絡(luò)原因,導(dǎo)致Server沒(méi)有收到Client最后回復(fù)的ACK滩届。那么Server就會(huì)在超時(shí)之后繼續(xù)發(fā)送FIN集侯,此時(shí)由于Client已經(jīng)CLOSED了,
    就找不到與重發(fā)的FIN對(duì)應(yīng)的連接,最后Server就會(huì)收到RST而不是ACK棠枉,Server就會(huì)以為是連接錯(cuò)誤把問(wèn)題報(bào)告給高層浓体。這樣的情況雖然不會(huì)造成數(shù)據(jù)丟失,但是卻導(dǎo)致TCP協(xié)議不符合可靠連接的要求辈讶。
    所以命浴,Client不是直接進(jìn)入CLOSED,而是要保持TIME_WAIT贱除,當(dāng)再次收到FIN的時(shí)候生闲,能夠保證對(duì)方收到ACK,最后正確的關(guān)閉連接月幌。
    2.)再說(shuō)第二點(diǎn)碍讯,如果Client直接CLOSED,然后又再向Server發(fā)起一個(gè)新連接扯躺,我們不能保證這個(gè)新連接與剛關(guān)閉的連接的端口號(hào)是不同的捉兴。也就是說(shuō)有可能新連接和老連接的端口號(hào)是相同的。一般來(lái)說(shuō)不會(huì)發(fā)生什么問(wèn)題缅帘,但是還是有特殊情況出現(xiàn):假設(shè)新連接和已經(jīng)關(guān)閉的老連接端口號(hào)是一樣的轴术,如果前一次連接的某些數(shù)據(jù)仍然滯留在網(wǎng)絡(luò)中,這些延遲數(shù)據(jù)在建立新連接之后才到達(dá)Server钦无,由于新連接和老連接的端口號(hào)是一樣的逗栽,又因?yàn)門CP協(xié)議判斷不同連接的依據(jù)是socket pair,于是失暂,TCP協(xié)議就認(rèn)為那個(gè)延遲的數(shù)據(jù)是屬于新連接的彼宠,這樣就和真正的新連接的數(shù)據(jù)包發(fā)生混淆了。所以TCP連接還要在TIME_WAIT狀態(tài)等待2倍MSL弟塞,這樣可以保證本次連接的所有數(shù)據(jù)都從網(wǎng)絡(luò)中消失凭峡。

PS:

  • 三次握手:
    張三:李四你在嗎?
    李四:我在决记,張三你還在嗎摧冀?
    張三:張三我也還在,開(kāi)始講電話系宫。
  • 四次揮手:
    張三:李四索昂,我要掛電話了。
    李四:好扩借,我先拿紙寫下你剛才說(shuō)的地址(處理數(shù)據(jù))椒惨,寫好了在跟你說(shuō)(張三處于半關(guān)閉狀態(tài),只聽(tīng)不說(shuō))潮罪。
    李四:張三康谆,我寫好啦(處理完數(shù)據(jù))领斥,可以掛電話了。
    張三:好的李四沃暗,你掛吧月洛。(李四掛了)聽(tīng)到嘟嘟的聲音(2MSL后),張三也掛了描睦。

UDP:

  • UDP協(xié)議在IP協(xié)議上增加了復(fù)用膊存、分用和差錯(cuò)檢測(cè)功能导而。UDP的特點(diǎn):
    1)是無(wú)連接的忱叭。相比于TCP協(xié)議,UDP協(xié)議在傳送數(shù)據(jù)前不需要建立連接今艺,當(dāng)然也就沒(méi)有釋放連接韵丑。
    2)是盡最大努力交付的。也就是說(shuō)UDP協(xié)議無(wú)法保證數(shù)據(jù)能夠準(zhǔn)確的交付到目的主機(jī)虚缎。也不需要對(duì)接收到的UDP報(bào)文進(jìn)行確認(rèn)撵彻。
    3)是面向報(bào)文的。也就是說(shuō)UDP協(xié)議將應(yīng)用層傳輸下來(lái)的數(shù)據(jù)封裝在一個(gè)UDP包中实牡,不進(jìn)行拆分或合并陌僵。
    因此,運(yùn)輸層在收到對(duì)方的UDP包后创坞,會(huì)去掉首部后碗短,將數(shù)據(jù)原封不動(dòng)的交給應(yīng)用進(jìn)程。
    4)沒(méi)有擁塞控制题涨。因此UDP協(xié)議的發(fā)送速率不送網(wǎng)絡(luò)的擁塞度影響偎谁。
    5)UDP支持一對(duì)一、一對(duì)多纲堵、多對(duì)一和多對(duì)多的交互通信巡雨。
    6)UDP的頭部占用較小,只占用8個(gè)字節(jié)席函。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铐望,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茂附,更是在濱河造成了極大的恐慌正蛙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何之,死亡現(xiàn)場(chǎng)離奇詭異跟畅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)溶推,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門徊件,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奸攻,“玉大人,你說(shuō)我怎么就攤上這事虱痕《媚停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵部翘,是天一觀的道長(zhǎng)硝训。 經(jīng)常有香客問(wèn)我,道長(zhǎng)新思,這世上最難降的妖魔是什么窖梁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮夹囚,結(jié)果婚禮上纵刘,老公的妹妹穿的比我還像新娘。我一直安慰自己荸哟,他們只是感情好假哎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鞍历,像睡著了一般舵抹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劣砍,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天惧蛹,我揣著相機(jī)與錄音,去河邊找鬼秆剪。 笑死赊淑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仅讽。 我是一名探鬼主播陶缺,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洁灵!你這毒婦竟也來(lái)了饱岸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤徽千,失蹤者是張志新(化名)和其女友劉穎苫费,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體双抽,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡百框,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牍汹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铐维。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柬泽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫁蛇,到底是詐尸還是另有隱情锨并,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布睬棚,位于F島的核電站第煮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抑党。R本人自食惡果不足惜包警,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望新荤。 院中可真熱鬧揽趾,春花似錦台汇、人聲如沸苛骨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痒芝。三九已至,卻和暖如春牵素,著一層夾襖步出監(jiān)牢的瞬間严衬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工笆呆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留请琳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓赠幕,卻偏偏與公主長(zhǎng)得像俄精,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榕堰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容