TCP通過(guò)三次握手建立連接
為什么需要三次握手而不是兩次或者四次钥屈?
三次握手是為了保證可靠傳輸咽袜,兩次握手只能保證客戶端知道服務(wù)端準(zhǔn)備好了妨马,而服務(wù)端并不知道客戶端也準(zhǔn)備好了咐熙。三次握手的關(guān)鍵在于序列號(hào)seq的交換確認(rèn)弱恒。如果有一個(gè)包丟了,就會(huì)周期性超時(shí)重傳棋恼,直到確認(rèn)返弹。(但是第三次握手例外锈玉,當(dāng)client與server的第三次握手失敗了之后,即client發(fā)送至server的確認(rèn)建立連接報(bào)文段未能到達(dá)server义起,server在等待client回復(fù)ACK的過(guò)程中超時(shí)了拉背,那么server會(huì)向client發(fā)送一個(gè)RTS報(bào)文段并進(jìn)入關(guān)閉狀態(tài),即:并不等待client第三次握手的ACK包重傳默终,直接關(guān)閉連接請(qǐng)求椅棺,這主要是為了防止泛洪攻擊,即壞人偽造許多IP向server發(fā)送連接請(qǐng)求齐蔽,從而將server的未連接隊(duì)列塞滿两疚,浪費(fèi)server的資源。)
syn泛洪攻擊
通俗的理解是:當(dāng)?shù)谌挝帐譀](méi)有發(fā)送確認(rèn)信息時(shí)含滴,等待一段時(shí)間后鬼雀,主機(jī)就會(huì)斷開之前的半開連接并回收資源,這為dos(deny of service)攻擊埋下隱患蛙吏,當(dāng)主動(dòng)方主動(dòng)發(fā)送大量的syn數(shù)據(jù)包,但并不做出第三次握手響應(yīng)鞋吉,server就會(huì)為這些syn包分配資源(但并未使用)鸦做,就會(huì)使server占用大量?jī)?nèi)存,使server連接環(huán)境耗盡谓着,這就是syn洪泛攻擊
三次握手的過(guò)程
(1):第一次握手:客戶端發(fā)送syn包服務(wù)器泼诱,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)
(2):第二次握手:服務(wù)器收到syn包赊锚,確認(rèn)客戶的SYN治筒,同時(shí)自己也發(fā)送一個(gè)SYN包,即SYN+ACK包舷蒲,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)耸袜。
(3):第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK牲平,此包發(fā)送完畢堤框,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手纵柿。
握手過(guò)程中傳送的包里不包含數(shù)據(jù)蜈抓,三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)昂儒。理想狀態(tài)下沟使,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前渊跋,TCP連接都將被一直保持下去腊嗡。斷開連接時(shí)服務(wù)器和客戶端均可以主動(dòng)發(fā)起斷開TCP連接的請(qǐng)求着倾,斷開過(guò)程需要經(jīng)過(guò)“四次握手”
三次握手有什么缺陷可以被黑客利用,用來(lái)對(duì)服務(wù)器進(jìn)行攻擊叽唱?
黑客仿造IP大量的向server發(fā)送TCP連接請(qǐng)求報(bào)文包屈呕,從而將server的半連接隊(duì)列(上文所說(shuō)的未連接隊(duì)列,即server收到連接請(qǐng)求SYN之后將client加入半連接隊(duì)列中)占滿棺亭,從而使得server拒絕其他正常的連接請(qǐng)求虎眨。
怎么防范這種攻擊?
1镶摘,縮短服務(wù)器接收客戶端SYN報(bào)文之后的等待連接時(shí)間嗽桩,即SYN
timeout時(shí)間,也就是server接收到SYN報(bào)文段凄敢,到最后放棄此連接請(qǐng)求的超時(shí)時(shí)間碌冶,將SYN
timeout設(shè)置的更低,便可以成倍的減少server的負(fù)荷涝缝,但是過(guò)低的SYN
timeout可能會(huì)影響正常的TCP連接的建立扑庞,一旦網(wǎng)絡(luò)不通暢便可能導(dǎo)致client連接請(qǐng)求失敗
2,SYN cookie + SYN proxy 無(wú)縫集成(較好的解決方案)
- SYN
cookie:當(dāng)server接收到client的SYN之后拒逮,不立即分配資源罐氨,而是根據(jù)client發(fā)送過(guò)來(lái)的SYN包計(jì)算出一個(gè)cookie值,這個(gè)cookie值用來(lái)存儲(chǔ)server返回給client的SYN+ACK數(shù)據(jù)包中的初始序列號(hào)滩援,當(dāng)client返回第三次握手的ACK包之后進(jìn)行校驗(yàn)栅隐,如果校驗(yàn)成功則server分配資源,建立連接玩徊。- SYN proxy代理租悄,作為server與client連接的代理,代替server與client建立三次握手的連接恩袱,同時(shí)SYN
proxy與client建立好了三次握手連接之后泣棋,確保是正常的TCP連接,而不是TCP泛洪攻擊憎蛤,那么SYN
proxy就與server建立三次握手連接外傅,作為代理(網(wǎng)關(guān)?)來(lái)連通client與server俩檬。(類似VPN了解一下萎胰。)
為什么斷開連接需要四次揮手
注:
FIN 表示關(guān)閉連接
ACK 表示確認(rèn)
因?yàn)楫?dāng)服務(wù)端收到客戶端的 FIN 數(shù)據(jù)包后(第一次揮手),服務(wù)端不會(huì)立即close棚辽,為什么不立即close技竟?因?yàn)榭赡苓€有數(shù)據(jù)沒(méi)發(fā)完,服務(wù)端會(huì)先將 ACK 發(fā)過(guò)去告訴客戶端我收到你的斷開請(qǐng)求了(第二次揮手)屈藐,但請(qǐng)?jiān)俳o我一點(diǎn)時(shí)間榔组,這段時(shí)間用來(lái)發(fā)送剩下的數(shù)據(jù)報(bào)文熙尉,發(fā)完之后再將 FIN 包發(fā)給客戶端表示現(xiàn)在可以斷了(第三次揮手)〈瓿叮客戶端收到 FIN 包后發(fā)送 ACK 確認(rèn)斷開信息給服務(wù)端(第四次揮手)检痰。