1紊婉、三次握手
(1)三次握手的詳述
首先Client端發(fā)送連接請(qǐng)求報(bào)文俏扩,Server端接受連接后回復(fù)ACK報(bào)文卿嘲,并為這次連接分配資源大刊。Client端接收到ACK報(bào)文后也向Server端發(fā)生ACK報(bào)文穷缤,并分配資源壁公,這樣TCP連接就建立了。seq是報(bào)文序號(hào)绅项,ack的值表示應(yīng)答對(duì)方哪一個(gè)seq紊册。
最初兩端的TCP進(jìn)程都處于CLOSED關(guān)閉狀態(tài),客戶端A主動(dòng)打開連接快耿,而服務(wù)端B被動(dòng)打開連接囊陡。(A、B關(guān)閉狀態(tài)CLOSED——B收聽狀態(tài)LISTEN——A同步已發(fā)送狀態(tài)SYN-SENT——B同步收到狀態(tài)SYN-RCVD——A掀亥、B連接已建立狀態(tài)ESTABLISHED)
B的TCP服務(wù)器進(jìn)程先創(chuàng)建傳輸控制塊TCB撞反,準(zhǔn)備接受客戶進(jìn)程的連接請(qǐng)求。然后服務(wù)器進(jìn)程就處于LISTEN(收聽)狀態(tài)搪花,等待客戶的連接請(qǐng)求遏片。若有連接請(qǐng)求,則作出響應(yīng)撮竿。
1)第一次握手:A的TCP進(jìn)程也是首先創(chuàng)建傳輸控制塊TCB吮便,然后向B發(fā)出連接請(qǐng)求報(bào)文段,(首部的同步位SYN=1幢踏,初始序號(hào)seq=x)髓需,(SYN=1的報(bào)文段不能攜帶數(shù)據(jù))但要消耗掉一個(gè)序號(hào),此時(shí)A的TCP進(jìn)程進(jìn)入SYN-SENT(同步已發(fā)送)狀態(tài)房蝉。
2)第二次握手:B收到連接請(qǐng)求報(bào)文段后僚匆,如同意建立連接,則向A發(fā)送確認(rèn)搭幻,在確認(rèn)報(bào)文段中(SYN=1咧擂,ACK=1,確認(rèn)號(hào)ack=x+1檀蹋,初始序號(hào)seq=y)松申,測(cè)試TCP服務(wù)器進(jìn)程進(jìn)入SYN-RCVD(同步收到)狀態(tài);
3)第三次握手:TCP客戶進(jìn)程收到B的確認(rèn)后,要向B給出確認(rèn)報(bào)文段(ACK=1攻臀,確認(rèn)號(hào)ack=y+1焕数,序號(hào)seq=x+1)(初始為seq=x纱昧,第二個(gè)報(bào)文段所以要+1)刨啸,ACK報(bào)文段可以攜帶數(shù)據(jù),不攜帶數(shù)據(jù)則不消耗序號(hào)识脆。TCP連接已經(jīng)建立设联,A進(jìn)入ESTABLISHED(已建立連接)。
當(dāng)B收到A的確認(rèn)后灼捂,也進(jìn)入ESTABLISHED狀態(tài)离例。
(2)總結(jié)三次握手過程:
第一次握手:起初兩端都處于CLOSED關(guān)閉狀態(tài),Client將標(biāo)志位SYN置為1悉稠,隨機(jī)產(chǎn)生一個(gè)值seq=x宫蛆,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN-SENT狀態(tài)的猛,等待Server確認(rèn)耀盗;
第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1得知Client請(qǐng)求建立連接,Server將標(biāo)志位SYN和ACK都置為1卦尊,ack=x+1叛拷,隨機(jī)產(chǎn)生一個(gè)值seq=y,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請(qǐng)求岂却,Server進(jìn)入SYN-RCVD狀態(tài)忿薇,此時(shí)操作系統(tǒng)為該TCP連接分配TCP緩存和變量;
第三次握手:Client收到確認(rèn)后躏哩,檢查ack是否為x+1署浩,ACK是否為1,如果正確則將標(biāo)志位ACK置為1扫尺,ack=y+1瑰抵,并且此時(shí)操作系統(tǒng)為該TCP連接分配TCP緩存和變量,并將該數(shù)據(jù)包發(fā)送給Server器联,Server檢查ack是否為y+1二汛,ACK是否為1,如果正確則連接建立成功拨拓,Client和Server進(jìn)入ESTABLISHED狀態(tài)肴颊,完成三次握手,隨后Client和Server就可以開始傳輸數(shù)據(jù)渣磷。
起初A和B都處于CLOSED狀態(tài)——B創(chuàng)建TCB婿着,處于LISTEN狀態(tài),等待A請(qǐng)求——A創(chuàng)建TCB,發(fā)送連接請(qǐng)求(SYN=1竟宋,seq=x)提完,進(jìn)入SYN-SENT狀態(tài)——B收到連接請(qǐng)求,向A發(fā)送確認(rèn)(SYN=ACK=1丘侠,確認(rèn)號(hào)ack=x+1徒欣,初始序號(hào)seq=y),進(jìn)入SYN-RCVD狀態(tài)——A收到B的確認(rèn)后蜗字,給B發(fā)出確認(rèn)(ACK=1打肝,ack=y+1,seq=x+1)挪捕,A進(jìn)入ESTABLISHED狀態(tài)——B收到A的確認(rèn)后粗梭,進(jìn)入ESTABLISHED狀態(tài)。
TCB傳輸控制塊Transmission Control Block级零,存儲(chǔ)每一個(gè)連接中的重要信息断医,如TCP連接表,到發(fā)送和接收緩存的指針奏纪,到重傳隊(duì)列的指針鉴嗤,當(dāng)前的發(fā)送和接收序號(hào)。
(3)為什么A還要發(fā)送一次確認(rèn)呢亥贸?可以二次握手嗎躬窜?
答:主要為了防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到了B,因而產(chǎn)生錯(cuò)誤炕置。如A發(fā)出連接請(qǐng)求荣挨,但因連接請(qǐng)求報(bào)文丟失而未收到確認(rèn),于是A再重傳一次連接請(qǐng)求朴摊。后來收到了確認(rèn)默垄,建立了連接。數(shù)據(jù)傳輸完畢后甚纲,就釋放了連接口锭,A工發(fā)出了兩個(gè)連接請(qǐng)求報(bào)文段,其中第一個(gè)丟失介杆,第二個(gè)到達(dá)了B鹃操,但是第一個(gè)丟失的報(bào)文段只是在某些網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間滯留了,延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)B春哨,此時(shí)B誤認(rèn)為A又發(fā)出一次新的連接請(qǐng)求荆隘,于是就向A發(fā)出確認(rèn)報(bào)文段,同意建立連接赴背,不采用三次握手椰拒,只要B發(fā)出確認(rèn)晶渠,就建立新的連接了,此時(shí)A不理睬B的確認(rèn)且不發(fā)送數(shù)據(jù)燃观,則B一致等待A發(fā)送數(shù)據(jù)褒脯,浪費(fèi)資源。
(4)Server端易受到SYN攻擊缆毁?
服務(wù)器端的資源分配是在二次握手時(shí)分配的番川,而客戶端的資源是在完成三次握手時(shí)分配的,所以服務(wù)器容易受到SYN洪泛攻擊积锅,SYN攻擊就是Client在短時(shí)間內(nèi)偽造大量不存在的IP地址爽彤,并向Server不斷地發(fā)送SYN包养盗,Server則回復(fù)確認(rèn)包缚陷,并等待Client確認(rèn),由于源地址不存在往核,因此Server需要不斷重發(fā)直至超時(shí)箫爷,這些偽造的SYN包將長(zhǎng)時(shí)間占用未連接隊(duì)列,導(dǎo)致正常的SYN請(qǐng)求因?yàn)殛?duì)列滿而被丟棄聂儒,從而引起網(wǎng)絡(luò)擁塞甚至系統(tǒng)癱瘓虎锚。
防范SYN攻擊措施:降低主機(jī)的等待時(shí)間使主機(jī)盡快的釋放半連接的占用,短時(shí)間受到某IP的重復(fù)SYN則丟棄后續(xù)請(qǐng)求衩婚。
2窜护、四次揮手
(1)四次揮手的詳述
假設(shè)Client端發(fā)起中斷連接請(qǐng)求,也就是發(fā)送FIN報(bào)文非春。Server端接到FIN報(bào)文后柱徙,意思是說"我Client端沒有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒有發(fā)送完成奇昙,則不必急著關(guān)閉Socket护侮,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK储耐,"告訴Client端羊初,你的請(qǐng)求我收到了,但是我還沒準(zhǔn)備好什湘,請(qǐng)繼續(xù)你等我的消息"长赞。這個(gè)時(shí)候Client端就進(jìn)入FIN_WAIT狀態(tài),繼續(xù)等待Server端的FIN報(bào)文闽撤。當(dāng)Server端確定數(shù)據(jù)已發(fā)送完成得哆,則向Client端發(fā)送FIN報(bào)文,"告訴Client端腹尖,好了柳恐,我這邊數(shù)據(jù)發(fā)完了伐脖,準(zhǔn)備好關(guān)閉連接了"。Client端收到FIN報(bào)文后乐设,"就知道可以關(guān)閉連接了讼庇,但是他還是不相信網(wǎng)絡(luò),怕Server端不知道要關(guān)閉近尚,所以發(fā)送ACK后進(jìn)入TIME_WAIT狀態(tài)蠕啄,如果Server端沒有收到ACK則可以重傳「甓停“歼跟,Server端收到ACK后,"就知道可以斷開連接了"格遭。Client端等待了2MSL后依然沒有收到回復(fù)哈街,則證明Server端已正常關(guān)閉,那好拒迅,我Client端也可以關(guān)閉連接了骚秦。Ok,TCP連接就這樣關(guān)閉了璧微!
數(shù)據(jù)傳輸結(jié)束后作箍,通信的雙方都可釋放連接,A和B都處于ESTABLISHED狀態(tài)前硫。(A胞得、B連接建立狀態(tài)ESTABLISHED——A終止等待1狀態(tài)FIN-WAIT-1——B關(guān)閉等待狀態(tài)CLOSE-WAIT——A終止等待2狀態(tài)FIN-WAIT-2——B最后確認(rèn)狀態(tài)LAST-ACK——A時(shí)間等待狀態(tài)TIME-WAIT——B、A關(guān)閉狀態(tài)CLOSED)
1)A的應(yīng)用進(jìn)程先向其TCP發(fā)出連接釋放報(bào)文段(FIN=1屹电,序號(hào)seq=u)阶剑,并停止再發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉TCP連接嗤详,進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)个扰,等待B的確認(rèn)。
2)B收到連接釋放報(bào)文段后即發(fā)出確認(rèn)報(bào)文段葱色,(ACK=1递宅,確認(rèn)號(hào)ack=u+1,序號(hào)seq=v)苍狰,B進(jìn)入CLOSE-WAIT(關(guān)閉等待)狀態(tài)办龄,此時(shí)的TCP處于半關(guān)閉狀態(tài),A到B的連接釋放淋昭。
3)A收到B的確認(rèn)后俐填,進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),等待B發(fā)出的連接釋放報(bào)文段翔忽。
4)B沒有要向A發(fā)出的數(shù)據(jù)英融,B發(fā)出連接釋放報(bào)文段(FIN=1盏檐,ACK=1,序號(hào)seq=w驶悟,確認(rèn)號(hào)ack=u+1)胡野,B進(jìn)入LAST-ACK(最后確認(rèn))狀態(tài),等待A的確認(rèn)痕鳍。
5)A收到B的連接釋放報(bào)文段后硫豆,對(duì)此發(fā)出確認(rèn)報(bào)文段(ACK=1,seq=u+1笼呆,ack=w+1)熊响,A進(jìn)入TIME-WAIT(時(shí)間等待)狀態(tài)。此時(shí)TCP未釋放掉诗赌,需要經(jīng)過時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后汗茄,A才進(jìn)入CLOSED狀態(tài)。
(2)總結(jié)四次揮手過程:
起初A和B處于ESTABLISHED狀態(tài)——A發(fā)出連接釋放報(bào)文段并處于FIN-WAIT-1狀態(tài)——B發(fā)出確認(rèn)報(bào)文段且進(jìn)入CLOSE-WAIT狀態(tài)——A收到確認(rèn)后境肾,進(jìn)入FIN-WAIT-2狀態(tài)剔难,等待B的連接釋放報(bào)文段——B沒有要向A發(fā)出的數(shù)據(jù)胆屿,B發(fā)出連接釋放報(bào)文段且進(jìn)入LAST-ACK狀態(tài)——A發(fā)出確認(rèn)報(bào)文段且進(jìn)入TIME-WAIT狀態(tài)——B收到確認(rèn)報(bào)文段后進(jìn)入CLOSED狀態(tài)——A經(jīng)過等待計(jì)時(shí)器時(shí)間2MSL后奥喻,進(jìn)入CLOSED狀態(tài)。
(3)為什么A在TIME-WAIT狀態(tài)必須等待2MSL的時(shí)間非迹?
MSL最長(zhǎng)報(bào)文段壽命Maximum Segment Lifetime环鲤,MSL=2
答:兩個(gè)理由:1)保證A發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)B。2)防止“已失效的連接請(qǐng)求報(bào)文段”出現(xiàn)在本連接中憎兽。
1)這個(gè)ACK報(bào)文段有可能丟失冷离,使得處于LAST-ACK狀態(tài)的B收不到對(duì)已發(fā)送的FIN+ACK報(bào)文段的確認(rèn),B超時(shí)重傳FIN+ACK報(bào)文段纯命,而A能在2MSL時(shí)間內(nèi)收到這個(gè)重傳的FIN+ACK報(bào)文段西剥,接著A重傳一次確認(rèn),重新啟動(dòng)2MSL計(jì)時(shí)器亿汞,最后A和B都進(jìn)入到CLOSED狀態(tài)瞭空,若A在TIME-WAIT狀態(tài)不等待一段時(shí)間,而是發(fā)送完ACK報(bào)文段后立即釋放連接疗我,則無法收到B重傳的FIN+ACK報(bào)文段咆畏,所以不會(huì)再發(fā)送一次確認(rèn)報(bào)文段,則B無法正常進(jìn)入到CLOSED狀態(tài)吴裤。
2)A在發(fā)送完最后一個(gè)ACK報(bào)文段后旧找,再經(jīng)過2MSL,就可以使本連接持續(xù)的時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失麦牺,使下一個(gè)新的連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求報(bào)文段钮蛛。
(4)為什么連接的時(shí)候是三次握手鞭缭,關(guān)閉的時(shí)候卻是四次握手?
答:因?yàn)楫?dāng)Server端收到Client端的SYN連接請(qǐng)求報(bào)文后魏颓,可以直接發(fā)送SYN+ACK報(bào)文缚去。其中ACK報(bào)文是用來應(yīng)答的,SYN報(bào)文是用來同步的琼开。但是關(guān)閉連接時(shí)易结,當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會(huì)立即關(guān)閉SOCKET柜候,所以只能先回復(fù)一個(gè)ACK報(bào)文搞动,告訴Client端,"你發(fā)的FIN報(bào)文我收到了"渣刷。只有等到我Server端所有的報(bào)文都發(fā)送完了鹦肿,我才能發(fā)送FIN報(bào)文,因此不能一起發(fā)送辅柴。故需要四步握手箩溃。
(5)為什么TIME_WAIT狀態(tài)需要經(jīng)過2MSL(最大報(bào)文段生存時(shí)間)才能返回到CLOSE狀態(tài)?
答:雖然按道理碌嘀,四個(gè)報(bào)文都發(fā)送完畢涣旨,我們可以直接進(jìn)入CLOSE狀態(tài)了,但是我們必須假設(shè)網(wǎng)絡(luò)是不可靠的股冗,有可能最后一個(gè)ACK丟失霹陡。所以TIME_WAIT狀態(tài)就是用來重發(fā)可能丟失的ACK報(bào)文。