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)歉井,完成四次揮手柿祈。
-
為什么建立連接是三次握手哩至,而關(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ā)送待笑。
為什么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é)席函。