三次握手和四次揮手
在客戶(hù)端和服務(wù)器進(jìn)行數(shù)據(jù)傳輸前會(huì)經(jīng)歷三次握手和四次揮手,那三次握手和四次揮手具體是做了些什么呢冬竟?
三次握手
含義:三次握手其實(shí)是指在客戶(hù)端和服務(wù)端建立一個(gè)TCP連接時(shí)欧穴,會(huì)經(jīng)歷總共發(fā)送3個(gè)包;
目的: 是為了確保雙方的發(fā)送和接收是否正常泵殴,并指定自己的初始化序列號(hào)為后面正常傳輸數(shù)據(jù)做準(zhǔn)備涮帘。
狀態(tài):
初始狀態(tài):客戶(hù)端-closed 服務(wù)端-listen
第一次握手:客戶(hù)端發(fā)送數(shù)據(jù)包:SYN=1,seq=x
客服端發(fā)送一段SYN(同步序列編號(hào))的報(bào)文,指明客戶(hù)端初始化序列號(hào)ISN笑诅。
注:
SYN: 用于建立連接的同步序列號(hào) SYN=1,表示一個(gè)連接請(qǐng)求调缨,握手完成后會(huì)變?yōu)?
seq: 客戶(hù)端的序列號(hào)x
狀態(tài): 客戶(hù)端-SYN_SENT
第二次握手:服務(wù)端發(fā)送數(shù)據(jù)包:SYN=1, seq=y,ACK=1, ack=x(客服端的seq)+1
服務(wù)端接收客戶(hù)端報(bào)文后弦叶,將客戶(hù)端的SYN+1作為ACK 的值俊犯,并返回發(fā)送自己的SYN報(bào)文和初始化序列號(hào)ISN(server);
注:
ACK: 確認(rèn)序列號(hào)是否有效標(biāo)識(shí)伤哺,1為有效燕侠,0為無(wú)效
ack:確認(rèn)序列號(hào),值為對(duì)方序列號(hào)+1
seq: 服務(wù)器的序列號(hào)y
狀態(tài):服務(wù)端-SYN_RCVD
第三次握手:客戶(hù)端發(fā)送數(shù)據(jù)包: ACK=1, seq=x+1, ack=y(服務(wù)端的seq)+1
客戶(hù)端接收到服務(wù)端的報(bào)文后立莉,會(huì)返回發(fā)送一個(gè) ACK 報(bào)文(服務(wù)端的seq+1)和自己的序列號(hào)
注:
ACK: 確認(rèn)序列號(hào)是否有效標(biāo)識(shí)绢彤,1為有效,0為無(wú)效
ack:確認(rèn)序列號(hào)蜓耻,值為對(duì)方序列號(hào)+1
seq: 自己初始+1
狀態(tài):客戶(hù)端-ESTABLISHED 服務(wù)端-ESTABLISHED
為什么要三次握手
確認(rèn)對(duì)方的發(fā)送和接收能力
第一次握手:客戶(hù)端=》服務(wù)端-----服務(wù)端確認(rèn)了客服端發(fā)送能力
第二次握手:服務(wù)端=》客戶(hù)端-----客戶(hù)端確認(rèn)了服務(wù)端的接收和發(fā)送能力
第三次握手:客服端=》服務(wù)端-----服務(wù)端確認(rèn)了客服端的接收能力
半連接隊(duì)列:
服務(wù)端在第一次接收客服端SYN之后茫舶,會(huì)處于SYN_RCVD狀態(tài),此時(shí)服務(wù)端會(huì)把客服端的請(qǐng)求放在隊(duì)列里刹淌,這種隊(duì)列就是半連接隊(duì)列饶氏;
在半連接隊(duì)列的客服端如果在定時(shí)的時(shí)候沒(méi)有收到客服的ACK,則會(huì)重發(fā)服務(wù)端ACK報(bào)文(linux 默認(rèn)5次)有勾,超過(guò)則會(huì)斷開(kāi)連接疹启;
半連接隊(duì)列滿(mǎn):服務(wù)端會(huì)直接丟棄當(dāng)前客戶(hù)端 SYN 包(Client端由于多次重發(fā)SYN包得不到響應(yīng)而拋出connection time out錯(cuò)誤)
全連接隊(duì)列
三次握手完成的連接會(huì)放入全連接狀態(tài)
SYN攻擊
SYN攻擊是短時(shí)間內(nèi)偽造大量不存在的IP地址,并向Server不斷地發(fā)送SYN包柠衅,server則回復(fù)ack確認(rèn)包,由于源ip地址是偽造的籍琳,客服端不會(huì)有回復(fù)菲宴,server就不斷的重發(fā)直至超時(shí),此時(shí)偽造的大量的SYN包會(huì)占用半連接隊(duì)列趋急,導(dǎo)致正常的SYN請(qǐng)求因隊(duì)列滿(mǎn)被丟棄喝峦,從而引進(jìn)網(wǎng)絡(luò)癱瘓甚至系統(tǒng)癱瘓。
常見(jiàn)防御方法:
縮短SYN Timeout時(shí)間呜达,增加最大半連接數(shù)谣蠢,過(guò)濾網(wǎng)關(guān)防護(hù),SYN cookies技術(shù)
四次揮手
TCP提供了在一端結(jié)束發(fā)送的同時(shí)可以保留接收數(shù)據(jù)能力查近,即TCP的half-close(半關(guān)閉)眉踱,因此結(jié)束一段連接需要四次揮手。
第一次揮手 客戶(hù)端發(fā)送報(bào)文段:FIN=1,seq=u
客戶(hù)端斷開(kāi)連接霜威,并發(fā)送(連接釋放報(bào)文端)即FIN報(bào)文谈喳,報(bào)文中攜帶一段序列號(hào)seq。
狀態(tài):客戶(hù)端-FIN_WAIT1 等待服務(wù)端的確認(rèn)
第二次揮手 服務(wù)端發(fā)送報(bào)文段:ACK=1,ack=u+1,seq=v
服務(wù)端接收到客服端的釋放連接報(bào)文后戈泼,發(fā)送確認(rèn)報(bào)文段婿禽。此時(shí)TCP連接處于半關(guān)閉狀態(tài)赏僧。
客戶(hù)端接收到確認(rèn)報(bào)文段后,處于FIN_WAIT2狀態(tài)扭倾,繼續(xù)等待服務(wù)端的連接釋放報(bào)文段
狀態(tài):客戶(hù)端-FIN_WAIT2 服務(wù)端-CLOSE_WAIT
第三次揮手 服務(wù)端發(fā)送報(bào)文段:FIN=1淀零,ACK=1,seq=w ack=u+1
服務(wù)端斷開(kāi)連接膛壹,和客戶(hù)端一樣發(fā)送一段FIN報(bào)文驾中,等待客戶(hù)端的確認(rèn)
狀態(tài):服務(wù)端-LAST_ACK
第四次揮手 客戶(hù)端發(fā)送報(bào)文段:ACK=1,seq=u+1恢筝,ack=w+1
客戶(hù)端接收到服務(wù)端的連接釋放報(bào)文后哀卫,發(fā)出確認(rèn)報(bào)文端。服務(wù)端接收確認(rèn)報(bào)文段后就關(guān)閉連接撬槽,進(jìn)入CLOSED狀態(tài)此改,客戶(hù)段處于TIME_WAIT(時(shí)間等待)狀態(tài),等待2MSL(報(bào)文在網(wǎng)絡(luò)中最大生存時(shí)間)后進(jìn)入關(guān)閉狀態(tài)侄柔;
狀態(tài):服務(wù)端-CLOSED 客戶(hù)端- TIME_WAIT
為什么要四次揮手
第一次和第二次為客戶(hù)端關(guān)閉連接報(bào)文和服務(wù)端確認(rèn)報(bào)文共啃,第二次第三次為服務(wù)端關(guān)閉連接和客戶(hù)端確認(rèn)報(bào)文
客戶(hù)端為什么要等待2MSL
確保服務(wù)端正常關(guān)閉連接≡萏猓客戶(hù)端在發(fā)送服務(wù)端的確認(rèn)報(bào)文后移剪,如果確認(rèn)報(bào)文在發(fā)送的過(guò)程中丟失,服務(wù)端接收不到客戶(hù)端的確認(rèn)報(bào)文薪者,會(huì)一直處于LAST-ACK狀態(tài)纵苛,無(wú)法正常關(guān)閉。服務(wù)端如果超時(shí)沒(méi)接收到客戶(hù)端的確認(rèn)報(bào)文言津,會(huì)重發(fā)FIN_ACK報(bào)文段攻人,客戶(hù)端接收后重置2MSI等待時(shí)間。