TCP的三次握手和四次揮手
TCP/IP是面向連接的協(xié)議卵沉。運(yùn)輸連接是用來發(fā)送TCP報文的宁舰。TCP的運(yùn)輸連接又三個過程棚亩,即建立連接蓖议,傳輸數(shù)據(jù)和連接釋放虏杰。
TCP的連接建立:
image.png
1.首先,客戶機(jī)與服務(wù)器的TCP進(jìn)程都處于CLOSED(關(guān)閉)狀態(tài)勒虾,當(dāng)要進(jìn)行TCP連接時纺阔,客戶機(jī)主動打開連接,服務(wù)器被動打開連接
2.然后修然,服務(wù)器的TCP進(jìn)程先創(chuàng)建傳輸控制塊TCB(傳輸控制塊TCB存儲了每一個連接中的重要信息笛钝,如:TCP連接表,指向發(fā)送和接收緩存的指針愕宋,指向重傳隊(duì)列的指針玻靡,當(dāng)前的發(fā)送和接收序號,等等)中贝,此時囤捻,服務(wù)器就處于LISTEN(收聽)狀態(tài)。同樣的邻寿,客戶機(jī)也會首先創(chuàng)建一個傳輸控制塊TCB發(fā)送給服務(wù)器最蕾。這樣,準(zhǔn)備工作就做好了老厌。
3.開始真正的三次握手了瘟则。首先客戶端會給服務(wù)器發(fā)送一個同步位SYN=1(這個時候SYN=1說明,客戶端想要給服務(wù)器發(fā)送數(shù)據(jù))枝秤,同時隨機(jī)生成一個初始序號x(表明醋拧,下次客戶端發(fā)送數(shù)據(jù)的時候?yàn)閤+1),那么此時客戶機(jī)就會進(jìn)入同步發(fā)送狀態(tài)。
4.當(dāng)服務(wù)器收到客戶端的請求后淀弹,如果同意與該客戶端進(jìn)行連接丹壕,那么這時就會給客戶端發(fā)送確認(rèn)報文,首部中的同步位SYN=1(表明服務(wù)器想要和客戶端進(jìn)行連接)薇溃,ACK=1(表明這時服務(wù)器同同意和客戶端進(jìn)行連接)菌赖,并且隨機(jī)生成一個初始序號y,確認(rèn)號為x+1(表明服務(wù)器希望收到的下一個報文段的第一個數(shù)據(jù)字節(jié)的序號沐序,因?yàn)橹翱蛻舳税l(fā)送的是x琉用,所以下一個序號為x+1),那么此時的服務(wù)器就會進(jìn)入一個同步收到狀態(tài)。
(前面的兩個握手階段會發(fā)生SYN flooding攻擊)
5.TCP客戶端收到了服務(wù)器的確認(rèn)后策幼,那么這時就會給服務(wù)器再次給出確認(rèn)邑时。確認(rèn)報文的首部同步位ACK=1(表明客戶端同意和服務(wù)器進(jìn)行連接),確認(rèn)號為y+1(表明客戶端希望收到服務(wù)器的下一個報文的第一個數(shù)據(jù)字節(jié)為y+1),此時客戶機(jī)發(fā)送的序號為x+1,那么此時的客戶機(jī)和服務(wù)器就會進(jìn)行已連接狀態(tài)特姐。
通俗點(diǎn)說: 晶丘、
客戶端:服務(wù)器我想和你建立連接(SYN=1),你同意嗎?
服務(wù)器:客戶端,我同意和你連接(ACK=1),發(fā)送連接請求(SYN=1);
客戶端:服務(wù)器浅浮,我同意和你連接(ACK=1)沫浆。
TCP的連接建釋放:
image.png
1.如果數(shù)據(jù)傳輸結(jié)束后,通信的雙方都會釋放連接滚秩,但是此時的客戶端和服務(wù)器都處于一個已建立連接的狀態(tài)专执。
2.假如客戶機(jī)請求的資源完畢了以后,想要釋放連接叔遂,首先會給服務(wù)器發(fā)送連接釋放的報文段他炊,報文段的首部終止控制FIN為1(表明客戶端想要和服務(wù)器斷開連接)争剿,并且發(fā)送序號u(此時的u不是隨機(jī)產(chǎn)生的已艰,而是客戶端傳送的最后一個字節(jié)+1),那么此時客戶端就會進(jìn)入終止等待1狀態(tài),等待服務(wù)器的確認(rèn)蚕苇。
3.服務(wù)器在收到客戶端的請求斷開的報文后哩掺,發(fā)出確認(rèn)報文,將報文首部的ACK置為1(表明服務(wù)器同意與客戶端斷開連接)涩笤,并且產(chǎn)生序號v(此時的序號也不會隨機(jī)產(chǎn)生的嚼吞,而是服務(wù)器給客戶端發(fā)送數(shù)據(jù)的最后一個字節(jié)+1),并且發(fā)出確認(rèn)序號u+1,此時服務(wù)器就進(jìn)入關(guān)閉等待狀態(tài),客戶機(jī)就進(jìn)入終止等待2的狀態(tài)蹬碧。
時啊舱禽,客戶端收到服務(wù)器的的確認(rèn)報文后就釋放了,也就是說恩沽,客戶端已經(jīng)沒有數(shù)據(jù)向服務(wù)端發(fā)送了誊稚,但是如果服務(wù)端向客戶端發(fā)送數(shù)據(jù),客戶端任然需要接受罗心,也就是說客戶端到服務(wù)器的連接已經(jīng)被釋放了里伯,但是服務(wù)器到客戶端的連接并沒有被釋放。tcp處于一個半關(guān)閉狀態(tài)渤闷。
4.如果服務(wù)器已經(jīng)不向客戶端發(fā)送數(shù)據(jù)了疾瓮,那么服務(wù)器的應(yīng)用進(jìn)程就可以向客戶端發(fā)送連接釋放的報文段,該報文的首部終止位FIN為1(表明服務(wù)器想要和客戶端斷開連接)飒箭,ACK置為1狼电,并且序號為w(w并不一定等于v+1,因?yàn)樵诳蛻舳酸尫胚B接后,可能服務(wù)器還向客戶端發(fā)送過數(shù)據(jù)弦蹂,總而言之如果發(fā)送給那么就是發(fā)送的最后一個數(shù)據(jù)的字節(jié)+1),再發(fā)送u+1的確認(rèn)序號(因?yàn)橹鞍l(fā)送了u),此時服務(wù)器就進(jìn)入了最后確認(rèn)的狀態(tài)漫萄。
5.那么在客戶端收到了服務(wù)器的釋放報文后,必須對此進(jìn)行確認(rèn)盈匾。在該報文中將ACK置為1腾务,確認(rèn)號為w+1,產(chǎn)生序號為u+1(上次客戶端發(fā)送的序號為u)削饵,此時的服務(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ī)近于癱瘓严里。
image.png
SYN FLOODING就是利用紅色框中的階段進(jìn)行攻擊新啼。
攻擊者向服務(wù)器或者主機(jī)發(fā)送SYN請求連接,服務(wù)器或者目標(biāo)主機(jī)在收到請求時會進(jìn)行請求確定刹碾,即向攻擊者進(jìn)行連接確定燥撞,而此時的攻擊者會停止向服務(wù)器發(fā)送確認(rèn)連接的確認(rèn)包,因此迷帜,服務(wù)器就處在了等待確認(rèn)的狀態(tài)物舒,在正常的情況下,服務(wù)器或者目標(biāo)主機(jī)在等待一定的時間后就會停止等待戏锹,此次的連接也就自然而然的結(jié)束了冠胯,也就不會造成什么危害。但是攻擊者會在短時間內(nèi)偽造大量的SYN請求連接包發(fā)給服務(wù)器锦针,即使每條SYN包請求會在短時間內(nèi)被丟棄递雀,但是大量的請求包在同一時間進(jìn)行請求連接茫陆,服務(wù)器或者目標(biāo)主機(jī)就沒有足夠的時間去處理這些請求包,因此就會使服務(wù)器或者目標(biāo)主機(jī)的Cpu利用率下降,甚至使服務(wù)器癱瘓
其實(shí)袁铐,還可以進(jìn)行FIN flooding攻擊鸳粉,原理與SYN攻擊一樣断医,攻擊者向服務(wù)器或者目標(biāo)主機(jī)發(fā)送大量的FIN請求包黔衡,由于攻擊者并未和服務(wù)器進(jìn)行過通訊,因此耗美,在服務(wù)器或目標(biāo)主機(jī)接收到該FIN請求后京髓,會對FIN包進(jìn)行分析,這就耗費(fèi)了服務(wù)器或者目標(biāo)主機(jī)的時間商架,當(dāng)攻擊者向服務(wù)器或者目標(biāo)主機(jī)發(fā)送大量的FIN數(shù)據(jù)包時堰怨,就會消耗大量的CPU使用率,達(dá)到和SYN FLOOD一樣的效果蛇摸。