三次握手
在TCP層,有個(gè)FLAGS字段,這個(gè)字段有以下幾個(gè)標(biāo)識(shí):SYN, FIN, ACK, PSH, RST, URG.其中,對(duì)于我們?nèi)粘5姆治鲇杏玫木褪乔懊娴奈鍌€(gè)字段。它們的含義是:SYN表示建立連接赡若,F(xiàn)IN表示關(guān)閉連接,ACK表示響應(yīng)团甲,PSH表示有DATA數(shù)據(jù)傳輸逾冬,RST表示連接重置。
第一次握手:Client將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值seq=x身腻,并將該數(shù)據(jù)包發(fā)送給Server产还,Client進(jìn)入SYN_SENT狀態(tài),等待Server確認(rèn)嘀趟。
第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請(qǐng)求建立連接脐区,Server將標(biāo)志位SYN和ACK都置為1,ack=x+1她按,隨機(jī)產(chǎn)生一個(gè)值seq=y牛隅,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請(qǐng)求,Server進(jìn)入SYN_RCVD狀態(tài)酌泰。
第三次握手:Client收到確認(rèn)后媒佣,檢查ack是否為x+1,ACK是否為1陵刹,如果正確則將標(biāo)志位ACK置為1默伍,ack=y+1,并將該數(shù)據(jù)包發(fā)送給Server衰琐,Server檢查ack是否為y+1也糊,ACK是否為1,如果正確則連接建立成功羡宙,Client和Server進(jìn)入ESTABLISHED狀態(tài)显设,完成三次握手,隨后Client與Server之間可以開始傳輸數(shù)據(jù)了辛辨。
為何使用三次握手
由于網(wǎng)絡(luò)延時(shí),server收到一個(gè)失效的連接請(qǐng)求后瑟枫,就誤認(rèn)為是client再次發(fā)出的一個(gè)新的連接斗搞。于是就向client發(fā)出確認(rèn)報(bào)文段,同意建立連接慷妙。假設(shè)不采用“三次握手”僻焚,那么只要server發(fā)出確認(rèn),新的連接就建立了膝擂。由于現(xiàn)在client并沒有發(fā)出建立連接的請(qǐng)求虑啤,因此不會(huì)理睬server的確認(rèn),也不會(huì)向server發(fā)送數(shù)據(jù)架馋。但server卻以為新的運(yùn)輸連接已經(jīng)建立狞山,并一直等待client發(fā)來數(shù)據(jù)。這樣叉寂,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)序號(hào)為收到序號(hào)+1(與SYN相同驳遵,一個(gè)FIN占用一個(gè)序號(hào))淫奔,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)序號(hào)為收到序號(hào)+1来庭,Server進(jìn)入CLOSED狀態(tài)妒蔚,完成四次揮手。
為何使用4次揮手
服務(wù)端在LISTEN狀態(tài)下月弛,收到建立連接請(qǐng)求的SYN報(bào)文后肴盏,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶端。而關(guān)閉連接時(shí)帽衙,當(dāng)收到對(duì)方的FIN報(bào)文時(shí)菜皂,僅僅表示對(duì)方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對(duì)方了厉萝,所以己方可以立即close恍飘,也可以發(fā)送一些數(shù)據(jù)給對(duì)方后,再發(fā)送FIN報(bào)文給對(duì)方來表示同意現(xiàn)在關(guān)閉連接谴垫,因此章母,己方ACK和FIN一般都會(huì)分開發(fā)送。