TCP的三次握手和四次揮手
TCP/IP是面向連接的協(xié)議阅羹。運(yùn)輸連接是用來發(fā)送TCP報(bào)文的为居。TCP的運(yùn)輸連接又三個(gè)過程枯途,即建立連接忌怎,傳輸數(shù)據(jù)和連接釋放。
TCP的連接建立:
1.首先酪夷,客戶機(jī)與服務(wù)器的TCP進(jìn)程都處于CLOSED(關(guān)閉)狀態(tài)榴啸,當(dāng)要進(jìn)行TCP連接時(shí),客戶機(jī)主動(dòng)打開連接晚岭,服務(wù)器被動(dòng)打開連接
2.然后鸥印,服務(wù)器的TCP進(jìn)程先創(chuàng)建傳輸控制塊TCB(傳輸控制塊TCB存儲(chǔ)了每一個(gè)連接中的重要信息,如:TCP連接表坦报,指向發(fā)送和接收緩存的指針库说,指向重傳隊(duì)列的指針,當(dāng)前的發(fā)送和接收序號(hào)片择,等等)潜的,此時(shí),服務(wù)器就處于LISTEN(收聽)狀態(tài)构回。同樣的夏块,客戶機(jī)也會(huì)首先創(chuàng)建一個(gè)傳輸控制塊TCB發(fā)送給服務(wù)器。這樣纤掸,準(zhǔn)備工作就做好了脐供。
3.開始真正的三次握手了。首先客戶端會(huì)給服務(wù)器發(fā)送一個(gè)同步位SYN=1(這個(gè)時(shí)候SYN=1說明借跪,客戶端想要給服務(wù)器發(fā)送數(shù)據(jù))政己,同時(shí)隨機(jī)生成一個(gè)初始序號(hào)x(表明,下次客戶端發(fā)送數(shù)據(jù)的時(shí)候?yàn)閤+1),那么此時(shí)客戶機(jī)就會(huì)進(jìn)入同步發(fā)送狀態(tài)掏愁。
4.當(dāng)服務(wù)器收到客戶端的請(qǐng)求后歇由,如果同意與該客戶端進(jìn)行連接卵牍,那么這時(shí)就會(huì)給客戶端發(fā)送確認(rèn)報(bào)文,首部中的同步位SYN=1(表明服務(wù)器想要和客戶端進(jìn)行連接)沦泌,ACK=1(表明這時(shí)服務(wù)器同同意和客戶端進(jìn)行連接)糊昙,并且隨機(jī)生成一個(gè)初始序號(hào)y,確認(rèn)號(hào)為x+1(表明服務(wù)器希望收到的下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)谢谦,因?yàn)橹翱蛻舳税l(fā)送的是x释牺,所以下一個(gè)序號(hào)為x+1),那么此時(shí)的服務(wù)器就會(huì)進(jìn)入一個(gè)同步收到狀態(tài)。
(前面的兩個(gè)握手階段會(huì)發(fā)生SYN flooding攻擊)
5.TCP客戶端收到了服務(wù)器的確認(rèn)后回挽,那么這時(shí)就會(huì)給服務(wù)器再次給出確認(rèn)没咙。確認(rèn)報(bào)文的首部同步位ACK=1(表明客戶端同意和服務(wù)器進(jìn)行連接),確認(rèn)號(hào)為y+1(表明客戶端希望收到服務(wù)器的下一個(gè)報(bào)文的第一個(gè)數(shù)據(jù)字節(jié)為y+1),此時(shí)客戶機(jī)發(fā)送的序號(hào)為x+1,那么此時(shí)的客戶機(jī)和服務(wù)器就會(huì)進(jìn)行已連接狀態(tài)千劈。
通俗點(diǎn)說: 祭刚、
客戶端:服務(wù)器我想和你建立連接(SYN=1),你同意嗎?
服務(wù)器:客戶端墙牌,我同意和你連接(ACK=1),發(fā)送連接請(qǐng)求(SYN=1);
客戶端:服務(wù)器涡驮,我同意和你連接(ACK=1)。
TCP的連接建釋放:
1.如果數(shù)據(jù)傳輸結(jié)束后喜滨,通信的雙方都會(huì)釋放連接遮怜,但是此時(shí)的客戶端和服務(wù)器都處于一個(gè)已建立連接的狀態(tài)。
2.假如客戶機(jī)請(qǐng)求的資源完畢了以后鸿市,想要釋放連接锯梁,首先會(huì)給服務(wù)器發(fā)送連接釋放的報(bào)文段,報(bào)文段的首部終止控制FIN為1(表明客戶端想要和服務(wù)器斷開連接)焰情,并且發(fā)送序號(hào)u(此時(shí)的u不是隨機(jī)產(chǎn)生的陌凳,而是客戶端傳送的最后一個(gè)字節(jié)+1),那么此時(shí)客戶端就會(huì)進(jìn)入終止等待1狀態(tài),等待服務(wù)器的確認(rèn)内舟。
3.服務(wù)器在收到客戶端的請(qǐng)求斷開的報(bào)文后合敦,發(fā)出確認(rèn)報(bào)文,將報(bào)文首部的ACK置為1(表明服務(wù)器同意與客戶端斷開連接)验游,并且產(chǎn)生序號(hào)v(此時(shí)的序號(hào)也不會(huì)隨機(jī)產(chǎn)生的充岛,而是服務(wù)器給客戶端發(fā)送數(shù)據(jù)的最后一個(gè)字節(jié)+1),并且發(fā)出確認(rèn)序號(hào)u+1,此時(shí)服務(wù)器就進(jìn)入關(guān)閉等待狀態(tài),客戶機(jī)就進(jìn)入終止等待2的狀態(tài)耕蝉。
時(shí)啊崔梗,客戶端收到服務(wù)器的的確認(rèn)報(bào)文后就釋放了,也就是說垒在,客戶端已經(jīng)沒有數(shù)據(jù)向服務(wù)端發(fā)送了蒜魄,但是如果服務(wù)端向客戶端發(fā)送數(shù)據(jù),客戶端任然需要接受,也就是說客戶端到服務(wù)器的連接已經(jīng)被釋放了谈为,但是服務(wù)器到客戶端的連接并沒有被釋放旅挤。tcp處于一個(gè)半關(guān)閉狀態(tài)。
4.如果服務(wù)器已經(jīng)不向客戶端發(fā)送數(shù)據(jù)了伞鲫,那么服務(wù)器的應(yīng)用進(jìn)程就可以向客戶端發(fā)送連接釋放的報(bào)文段粘茄,該報(bào)文的首部終止位FIN為1(表明服務(wù)器想要和客戶端斷開連接),ACK置為1秕脓,并且序號(hào)為w(w并不一定等于v+1,因?yàn)樵诳蛻舳酸尫胚B接后驹闰,可能服務(wù)器還向客戶端發(fā)送過數(shù)據(jù),總而言之如果發(fā)送給那么就是發(fā)送的最后一個(gè)數(shù)據(jù)的字節(jié)+1),再發(fā)送u+1的確認(rèn)序號(hào)(因?yàn)橹鞍l(fā)送了u),此時(shí)服務(wù)器就進(jìn)入了最后確認(rèn)的狀態(tài)撒会。
5.那么在客戶端收到了服務(wù)器的釋放報(bào)文后,必須對(duì)此進(jìn)行確認(rèn)师妙。在該報(bào)文中將ACK置為1诵肛,確認(rèn)號(hào)為w+1,產(chǎn)生序號(hào)為u+1(上次客戶端發(fā)送的序號(hào)為u)默穴,此時(shí)的服務(wù)器進(jìn)入等待狀態(tài)怔檩。但是TCP連接還沒有被釋放掉,必須要經(jīng)過4分鐘后服務(wù)器才進(jìn)入closed狀態(tài)蓄诽。
通俗來講:
客戶端:服務(wù)器薛训,我想和你斷開連接(FIN=1)
服務(wù)器:同意斷開連接(ACK=1)
服務(wù)器:客戶端,我想和你斷開連接(FIN=1)
客戶端:同意(ACK=1)
SYN FLOODING與FIN FLOODING攻擊仑氛?
syn flooding是一種很古老的攻擊乙埃,該攻擊蛀牙是利用了TCP/IP的三次握手,利用大量虛假ip的身份建立不完整連接锯岖,消耗主機(jī)的CPU,從而使主機(jī)近于癱瘓介袜。
SYN FLOODING就是利用紅色框中的階段進(jìn)行攻擊。
攻擊者向服務(wù)器或者主機(jī)發(fā)送SYN請(qǐng)求連接出吹,服務(wù)器或者目標(biāo)主機(jī)在收到請(qǐng)求時(shí)會(huì)進(jìn)行請(qǐng)求確定遇伞,即向攻擊者進(jìn)行連接確定,而此時(shí)的攻擊者會(huì)停止向服務(wù)器發(fā)送確認(rèn)連接的確認(rèn)包捶牢,因此鸠珠,服務(wù)器就處在了等待確認(rèn)的狀態(tài),在正常的情況下秋麸,服務(wù)器或者目標(biāo)主機(jī)在等待一定的時(shí)間后就會(huì)停止等待渐排,此次的連接也就自然而然的結(jié)束了,也就不會(huì)造成什么危害灸蟆。但是攻擊者會(huì)在短時(shí)間內(nèi)偽造大量的SYN請(qǐng)求連接包發(fā)給服務(wù)器飞盆,即使每條SYN包請(qǐng)求會(huì)在短時(shí)間內(nèi)被丟棄,但是大量的請(qǐng)求包在同一時(shí)間進(jìn)行請(qǐng)求連接,服務(wù)器或者目標(biāo)主機(jī)就沒有足夠的時(shí)間去處理這些請(qǐng)求包吓歇,因此就會(huì)使服務(wù)器或者目標(biāo)主機(jī)的Cpu利用率下降孽水,甚至使服務(wù)器癱瘓
其實(shí),還可以進(jìn)行FIN flooding攻擊城看,原理與SYN攻擊一樣女气,攻擊者向服務(wù)器或者目標(biāo)主機(jī)發(fā)送大量的FIN請(qǐng)求包,由于攻擊者并未和服務(wù)器進(jìn)行過通訊测柠,因此炼鞠,在服務(wù)器或目標(biāo)主機(jī)接收到該FIN請(qǐng)求后,會(huì)對(duì)FIN包進(jìn)行分析轰胁,這就耗費(fèi)了服務(wù)器或者目標(biāo)主機(jī)的時(shí)間谒主,當(dāng)攻擊者向服務(wù)器或者目標(biāo)主機(jī)發(fā)送大量的FIN數(shù)據(jù)包時(shí),就會(huì)消耗大量的CPU使用率赃阀,達(dá)到和SYN FLOOD一樣的效果霎肯。