TCP和UDP區(qū)別
首先概括一下基本的區(qū)別:
TCP是一個(gè)面向連接的、可靠的吓著、基于字節(jié)流的傳輸層協(xié)議鲤嫡。
而UDP是一個(gè)面向無(wú)連接的傳輸層協(xié)議。(就這么簡(jiǎn)單夜矗,其它TCP的特性也就沒(méi)有了)泛范。
具體來(lái)分析,和 UDP 相比紊撕,TCP 有三大核心特性:
- 面向連接罢荡。所謂的連接,指的是客戶端和服務(wù)器的連接对扶,在雙方互相通信之前区赵,TCP 需要三次握手建立連接,而 UDP 沒(méi)有相應(yīng)建立連接的過(guò)程浪南。
- 可靠性笼才。TCP 花了非常多的功夫保證連接的可靠,這個(gè)可靠性體現(xiàn)在哪些方面呢络凿?一個(gè)是有狀態(tài)骡送,另一個(gè)是可控制。
TCP 會(huì)精準(zhǔn)記錄哪些數(shù)據(jù)發(fā)送了絮记,哪些數(shù)據(jù)被對(duì)方接收了摔踱,哪些沒(méi)有被接收到,而且保證數(shù)據(jù)包按序到達(dá)怨愤,不允許半點(diǎn)差錯(cuò)派敷。這是有狀態(tài)。
當(dāng)意識(shí)到丟包了或者網(wǎng)絡(luò)環(huán)境不佳,TCP 會(huì)根據(jù)具體情況調(diào)整自己的行為篮愉,控制自己的發(fā)送速度或者重發(fā)腐芍。這是可控制。
相應(yīng)的试躏,UDP 就是無(wú)狀態(tài)
,不可控的
猪勇。
- 面向字節(jié)流。UDP 的數(shù)據(jù)傳輸是基于數(shù)據(jù)報(bào)的冗酿,這是因?yàn)閮H僅只是繼承了 IP 層的特性埠对,而 TCP 為了維護(hù)狀態(tài),將一個(gè)個(gè) IP 包變成了字節(jié)流裁替。
說(shuō)說(shuō) TCP 三次握手的過(guò)程项玛?為什么是三次而不是兩次、四次弱判?
從最開(kāi)始雙方都處于CLOSED狀態(tài)襟沮。然后服務(wù)端開(kāi)始監(jiān)聽(tīng)某個(gè)端口,進(jìn)入了LISTEN狀態(tài)昌腰。
然后客戶端主動(dòng)發(fā)起連接开伏,發(fā)送 SYN , 自己變成了SYN-SENT狀態(tài)。
服務(wù)端接收到遭商,返回SYN和ACK(對(duì)應(yīng)客戶端發(fā)來(lái)的SYN)固灵,自己變成了SYN-REVD。
之后客戶端再發(fā)送ACK給服務(wù)端劫流,自己變成了ESTABLISHED狀態(tài)巫玻;服務(wù)端收到ACK之后,也變成了ESTABLISHED狀態(tài)祠汇。
另外需要提醒你注意的是仍秤,從圖中可以看出,SYN 是需要消耗一個(gè)序列號(hào)的可很,下次發(fā)送對(duì)應(yīng)的 ACK 序列號(hào)要加1诗力,為什么呢?只需要記住一個(gè)規(guī)則:
凡是需要對(duì)端確認(rèn)的我抠,一定消耗TCP報(bào)文的序列號(hào)苇本。
SYN 需要對(duì)端的確認(rèn), 而 ACK 并不需要菜拓,因此 SYN 消耗一個(gè)序列號(hào)而 ACK 不需要瓣窄。
為什么不是兩次?
若不采用“三次握手”尘惧,那么只要 Server 發(fā)出確認(rèn)數(shù)據(jù)包康栈,新的連接就建立了递递。由于 Client 此時(shí)并未發(fā)出建立連接的請(qǐng)求喷橙,所以其不會(huì)理睬 Server 的確認(rèn)啥么,也不與 Server 通信;而這時(shí) Server 一直在等待 Client 的請(qǐng)求贰逾,這樣 Server 就白白浪費(fèi)了一定的資源悬荣。
為什么不是四次?
三次握手的目的是確認(rèn)雙方發(fā)送和接收的能力疙剑,那四次握手可以嘛氯迂?
當(dāng)然可以,100 次都可以言缤。但為了解決問(wèn)題嚼蚀,三次就足夠了,再多用處就不大了管挟。
三次握手過(guò)程中可以攜帶數(shù)據(jù)么轿曙?
第三次握手的時(shí)候,可以攜帶僻孝。前兩次握手不能攜帶數(shù)據(jù)导帝。
如果前兩次握手能夠攜帶數(shù)據(jù),那么一旦有人想攻擊服務(wù)器穿铆,那么他只需要在第一次握手中的 SYN 報(bào)文中放大量數(shù)據(jù)您单,那么服務(wù)器勢(shì)必會(huì)消耗更多的時(shí)間和內(nèi)存空間去處理這些數(shù)據(jù),增大了服務(wù)器被攻擊的風(fēng)險(xiǎn)荞雏。
第三次握手的時(shí)候虐秦,客戶端已經(jīng)處于ESTABLISHED狀態(tài),并且已經(jīng)能夠確認(rèn)服務(wù)器的接收讯檐、發(fā)送能力正常羡疗,這個(gè)時(shí)候相對(duì)安全了,可以攜帶數(shù)據(jù)别洪。
同時(shí)打開(kāi)會(huì)怎樣叨恨?
如果雙方同時(shí)發(fā) SYN報(bào)文,狀態(tài)變化會(huì)是怎樣的呢挖垛?
這是一個(gè)可能會(huì)發(fā)生的情況痒钝。
狀態(tài)變遷如下:
在發(fā)送方給接收方發(fā)SYN報(bào)文的同時(shí),接收方也給發(fā)送方發(fā)SYN報(bào)文痢毒,兩個(gè)人剛上了!
發(fā)完SYN送矩,兩者的狀態(tài)都變?yōu)镾YN-SENT。
在各自收到對(duì)方的SYN后哪替,兩者狀態(tài)都變?yōu)镾YN-REVD栋荸。
接著會(huì)回復(fù)對(duì)應(yīng)的ACK + SYN,這個(gè)報(bào)文在對(duì)方接收之后,兩者狀態(tài)一起變?yōu)镋STABLISHED晌块。
這就是同時(shí)打開(kāi)情況下的狀態(tài)變遷爱沟。
說(shuō)說(shuō) TCP 四次揮手的過(guò)程
過(guò)程拆解
剛開(kāi)始雙方處于ESTABLISHED狀態(tài)。
客戶端要斷開(kāi)了匆背,向服務(wù)器發(fā)送 FIN 報(bào)文呼伸,在 TCP 報(bào)文中的位置如下圖:
發(fā)送后客戶端變成了FIN-WAIT-1狀態(tài)。注意, 這時(shí)候客戶端同時(shí)也變成了half-close(半關(guān)閉)狀態(tài)钝尸,即無(wú)法向服務(wù)端發(fā)送報(bào)文括享,只能接收。
服務(wù)端接收后向客戶端確認(rèn)珍促,變成了CLOSED-WAIT狀態(tài)铃辖。
客戶端接收到了服務(wù)端的確認(rèn),變成了FIN-WAIT2狀態(tài)猪叙。
隨后澳叉,服務(wù)端向客戶端發(fā)送FIN,自己進(jìn)入LAST-ACK狀態(tài)沐悦,
客戶端收到服務(wù)端發(fā)來(lái)的FIN后成洗,自己變成了TIME-WAIT狀態(tài),然后發(fā)送 ACK 給服務(wù)端藏否。
注意了瓶殃,這個(gè)時(shí)候,客戶端需要等待足夠長(zhǎng)的時(shí)間副签,具體來(lái)說(shuō)遥椿,是2個(gè) MSL(Maximum Segment Lifetime,報(bào)文最大生存時(shí)間), 在這段時(shí)間內(nèi)如果客戶端沒(méi)有收到服務(wù)端的重發(fā)請(qǐng)求淆储,那么表示 ACK 成功到達(dá)冠场,揮手結(jié)束,否則客戶端重發(fā) ACK本砰。
等待2MSL的意義
如果不等待會(huì)怎樣碴裙?
如果不等待,客戶端直接跑路点额,當(dāng)服務(wù)端還有很多數(shù)據(jù)包要給客戶端發(fā)舔株,且還在路上的時(shí)候,若客戶端的端口此時(shí)剛好被新的應(yīng)用占用还棱,那么就接收到了無(wú)用數(shù)據(jù)包载慈,造成數(shù)據(jù)包混亂。所以珍手,最保險(xiǎn)的做法是等服務(wù)器發(fā)來(lái)的數(shù)據(jù)包都死翹翹再啟動(dòng)新的應(yīng)用办铡。
那照這樣說(shuō)一個(gè) MSL 不就不夠了嗎辞做,為什么要等待 2 MSL?
- 1 個(gè) MSL 確保四次揮手中主動(dòng)關(guān)閉方最后的 ACK 報(bào)文最終能達(dá)到對(duì)端
- 1 個(gè) MSL 確保對(duì)端沒(méi)有收到 ACK 重傳的 FIN 報(bào)文可以到達(dá)
這就是等待 2MSL 的意義。
為什么是四次揮手而不是三次寡具?
因?yàn)榉?wù)端在接收到FIN, 往往不會(huì)立即返回FIN, 必須等到服務(wù)端所有的報(bào)文都發(fā)送完畢了凭豪,才能發(fā)FIN。因此先發(fā)一個(gè)ACK表示已經(jīng)收到客戶端的FIN晒杈,延遲一段時(shí)間才發(fā)FIN。這就造成了四次揮手孔厉。
如果是三次揮手會(huì)有什么問(wèn)題拯钻?
等于說(shuō)服務(wù)端將ACK和FIN的發(fā)送合并為一次揮手,這個(gè)時(shí)候長(zhǎng)時(shí)間的延遲可能會(huì)導(dǎo)致客戶端誤以為FIN沒(méi)有到達(dá)客戶端撰豺,從而讓客戶端不斷的重發(fā)FIN粪般。
同時(shí)關(guān)閉會(huì)怎樣?
如果客戶端和服務(wù)端同時(shí)發(fā)送 FIN 污桦,狀態(tài)會(huì)如何變化亩歹?如圖所示:
文章也會(huì)持續(xù)更新,可以微信搜索「 邁莫coding 」第一時(shí)間閱讀凡橱。