三次握手
第一次握手:客戶端A將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值為seq=J(J的取值范圍為=1234567)的數(shù)據(jù)包到服務(wù)器烧给,客戶端A進(jìn)入SYN_SENT狀態(tài)暂雹,等待服務(wù)端B確認(rèn);
第二次握手:服務(wù)端B收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道客戶端A請求建立連接创夜,服務(wù)端B將標(biāo)志位SYN和ACK都置為1,ack=J+1仙逻,隨機(jī)產(chǎn)生一個(gè)值seq=K驰吓,并將該數(shù)據(jù)包發(fā)送給客戶端A以確認(rèn)連接請求,服務(wù)端B進(jìn)入SYN_RCVD狀態(tài)系奉。
第三次握手:客戶端A收到確認(rèn)后檬贰,檢查ack是否為J+1,ACK是否為1缺亮,如果正確則將標(biāo)志位ACK置為1翁涤,ack=K+1,并將該數(shù)據(jù)包發(fā)送給服務(wù)端B萌踱,服務(wù)端B檢查ack是否為K+1葵礼,ACK是否為1,如果正確則連接建立成功并鸵,客戶端A和服務(wù)端B進(jìn)入ESTABLISHED狀態(tài)鸳粉,完成三次握手,隨后客戶端A與服務(wù)端B之間可以開始傳輸數(shù)據(jù)了园担。
- 三次握手原因:為了防止已失效的連接請求報(bào)文段突然又傳送到了服務(wù)端届谈,因而產(chǎn)生錯(cuò)誤枯夜,如以下情況:client發(fā)出的第一個(gè)連接請求報(bào)文段并沒有丟失,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長時(shí)間的滯留了艰山,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server湖雹。本來這是一個(gè)早已失效的報(bào)文段。但server收到此失效的連接請求報(bào)文段后曙搬,就誤認(rèn)為是client再次發(fā)出的一個(gè)新的連接請求摔吏。于是就向client發(fā)出確認(rèn)報(bào)文段,同意建立連接织鲸。假設(shè)不采用“三次握手”舔腾,那么只要server發(fā)出確認(rèn),新的連接就建立了搂擦。由于現(xiàn)在client并沒有發(fā)出建立連接的請求稳诚,因此不會理睬server的確認(rèn),也不會向server發(fā)送數(shù)據(jù)瀑踢。但server卻以為新的運(yùn)輸連接已經(jīng)建立扳还,并一直等待client發(fā)來數(shù)據(jù)。這樣橱夭,server的很多資源就白白浪費(fèi)掉了氨距。采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生。例如剛才那種情況棘劣,client不會向server的確認(rèn)發(fā)出確認(rèn)俏让。server由于收不到確認(rèn),就知道client并沒有要求建立連接茬暇∈孜簦”。主要目的防止server端一直等待糙俗,浪費(fèi)資源勒奇。
四次揮手
第一次揮手:Client發(fā)送一個(gè)FIN,用來關(guān)閉Client到Server的數(shù)據(jù)傳送巧骚,Client進(jìn)入FIN_WAIT_1狀態(tài)赊颠。
第二次揮手:Server收到FIN后,發(fā)送一個(gè)ACK給Client劈彪,確認(rèn)序號為收到序號+1(與SYN相同竣蹦,一個(gè)FIN占用一個(gè)序號),Server進(jìn)入CLOSE_WAIT狀態(tài)沧奴。
第三次揮手:Server發(fā)送一個(gè)FIN草添,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)扼仲。
第四次揮手:Client收到FIN后远寸,Client進(jìn)入TIME_WAIT狀態(tài)抄淑,接著發(fā)送一個(gè)ACK給Server,確認(rèn)序號為收到序號+1驰后,Server進(jìn)入CLOSED狀態(tài)肆资,完成四次揮手。