TCP的三次握手
所謂的三次握手即TCP連接的建立沪蓬。這個連接必須是一方主動打開,另一方被動打開的挎扰。以下為客戶端主動發(fā)起連接的圖解:
握手之前主動打開的客戶端結(jié)束CLOSED階段给赞,被動打開的服務(wù)器也結(jié)束CLOSED階段颖对,并進(jìn)入LISTEN階段。隨后開始“三次握手”:
1管呵、首先客戶端向服務(wù)器發(fā)送一段TCP報文涧衙,其中:
- 標(biāo)記位為SYN,表示“請求建立新連接”斋攀;
- 序號為seq=X(X一般為1);
- 隨后客戶端進(jìn)入SYN-SENT階段已卷。
2、服務(wù)器端接收到來自客戶端的TCP報文之后淳蔼,結(jié)束LISTEN階段侧蘸,并返回一段TCP報文,其中:
- 標(biāo)志位為SYN和ACK鹉梨,表示“確認(rèn)客戶端的報文seq有效讳癌,服務(wù)器能正常接收客戶端發(fā)送的數(shù)據(jù),并同意創(chuàng)建新連接”存皂;
- 序號為seq=y;
- 確認(rèn)號為ack=x+1晌坤,表示收到客戶端的序號seq逢艘,并將其值+1作為自己確認(rèn)號ack的值;隨后服務(wù)器端進(jìn)入SYN-RCVD階段骤菠。
3它改、客戶端接收到來自服務(wù)器端的確認(rèn)收到數(shù)據(jù)的TCP報文之后,明確了從客戶端到服務(wù)器的數(shù)據(jù)傳輸是正常的商乎,結(jié)束SYN-SENT階段央拖。并返回最后一段TCP報文。其中:
- 標(biāo)志位為ACK鹉戚,表示“確認(rèn)收到服務(wù)器端同意連接的信號”鲜戒;
- 序號為seq=x+1,表示收到服務(wù)器端的確認(rèn)號ack,并將其值作為自己的序號值崩瓤;
- 確認(rèn)號為Ack=y+1袍啡,表示收到服務(wù)器端序號Seq,并將其值加1作為自己的確認(rèn)號ack的值却桶;
- 隨后客戶端進(jìn)入ESTABLISHED階段境输。
服務(wù)器收到來自客戶端的”確認(rèn)收到服務(wù)器數(shù)據(jù)“的TCP報文之后,明確了從服務(wù)器到客戶端的數(shù)據(jù)傳輸是正常的颖系。結(jié)束SYN-SENT階段嗅剖,進(jìn)入ESTABLISHED階段。
在客戶端與服務(wù)器端傳輸?shù)?TCP報文中嘁扼,雙方的確認(rèn)號ack和序號seq的值信粮,都是在彼此ack和seq值的基礎(chǔ)上進(jìn)行計算的,這樣做保證了TCP報文傳輸?shù)倪B貫性趁啸。一單出現(xiàn)某一方發(fā)出的TCP報文丟失强缘,便無法繼續(xù)”握手“,以此確保了”三次握手“的順利完成不傅。
此后客戶端和服務(wù)器端進(jìn)行正常的數(shù)據(jù)傳輸旅掂。這就是”三次握手“的過程。
TCP的四次揮手
所謂的四次揮手即TCP連接的釋放(解除)访娶。連接的釋放必須是一方主動釋放商虐,另一方被動釋放。以下為客戶端主動發(fā)起釋放連接的圖解:
揮手之前主動釋放連接的客戶端結(jié)束ESTABLISHED階段崖疤。隨后開始“四次揮手”:
1秘车、首先客戶端想要釋放連接,向服務(wù)器端發(fā)送一段TCP報文劫哼,其中:
標(biāo)記位為FIN叮趴,表示“請求釋放連接“;序號為Seq=U权烧;隨后客戶端進(jìn)入FIN-WAIT-1階段眯亦,即半關(guān)閉階段咳蔚。并且停止在客戶端到服務(wù)器端方向上發(fā)送數(shù)據(jù),但是客戶端仍然能接收從服務(wù)器端傳輸過來的數(shù)據(jù)搔驼。注意:這里不發(fā)送的是正常連接時傳輸?shù)臄?shù)據(jù)(非確認(rèn)報文),而不是一切數(shù)據(jù)侈询,所以客戶端仍然能發(fā)送ACK確認(rèn)報文舌涨。
2、服務(wù)器端接收到從客戶端發(fā)出的TCP報文之后扔字,確認(rèn)了客戶端想要釋放連接囊嘉,隨后服務(wù)器端結(jié)束ESTABLISHED階段,進(jìn)入CLOSE-WAIT階段(半關(guān)閉狀態(tài))并返回一段TCP報文革为,其中:
標(biāo)記位為ACK扭粱,表示“接收到客戶端發(fā)送的釋放連接的請求”;序號為Seq=V震檩;確認(rèn)號為Ack=U+1琢蛤,表示是在收到客戶端報文的基礎(chǔ)上,將其序號Seq值加1作為本段報文確認(rèn)號Ack的值抛虏;隨后服務(wù)器端開始準(zhǔn)備釋放服務(wù)器端到客戶端方向上的連接博其。客戶端收到從服務(wù)器端發(fā)出的TCP報文之后迂猴,確認(rèn)了服務(wù)器收到了客戶端發(fā)出的釋放連接請求慕淡,隨后客戶端結(jié)束FIN-WAIT-1階段,進(jìn)入FIN-WAIT-2階段
前"兩次揮手"既讓服務(wù)器端知道了客戶端想要釋放連接沸毁,也讓客戶端知道了服務(wù)器端了解了自己想要釋放連接的請求峰髓。于是,可以確認(rèn)關(guān)閉客戶端到服務(wù)器端方向上的連接了
3息尺、服務(wù)器端自從發(fā)出ACK確認(rèn)報文之后携兵,經(jīng)過CLOSED-WAIT階段,做好了釋放服務(wù)器端到客戶端方向上的連接準(zhǔn)備掷倔,再次向客戶端發(fā)出一段TCP報文眉孩,其中:
標(biāo)記位為FIN,ACK勒葱,表示“已經(jīng)準(zhǔn)備好釋放連接了”浪汪。注意:這里的ACK并不是確認(rèn)收到服務(wù)器端報文的確認(rèn)報文。序號為Seq=W凛虽;確認(rèn)號為Ack=U+1死遭;表示是在收到客戶端報文的基礎(chǔ)上,將其序號Seq值加1作為本段報文確認(rèn)號Ack的值凯旋。隨后服務(wù)器端結(jié)束CLOSE-WAIT階段呀潭,進(jìn)入LAST-ACK階段钉迷。并且停止在服務(wù)器端到客戶端的方向上發(fā)送數(shù)據(jù),但是服務(wù)器端仍然能夠接收從客戶端傳輸過來的數(shù)據(jù)钠署。
4糠聪、客戶端收到從服務(wù)器端發(fā)出的TCP報文,確認(rèn)了服務(wù)器端已做好釋放連接的準(zhǔn)備谐鼎,結(jié)束FIN-WAIT-2階段舰蟆,進(jìn)入TIME-WAIT階段,并向服務(wù)器端發(fā)送一段報文狸棍,其中:
標(biāo)記位為ACK身害,表示“接收到服務(wù)器準(zhǔn)備好釋放連接的信號”。序號為Seq=U+1草戈;表示是在收到了服務(wù)器端報文的基礎(chǔ)上塌鸯,將其確認(rèn)號Ack值作為本段報文序號的值。確認(rèn)號為Ack=W+1唐片;表示是在收到了服務(wù)器端報文的基礎(chǔ)上丙猬,將其序號Seq值作為本段報文確認(rèn)號的值。隨后客戶端開始在TIME-WAIT階段等待2MSL牵触。
服務(wù)器端收到從客戶端發(fā)出的TCP報文之后結(jié)束LAST-ACK階段淮悼,進(jìn)入CLOSED階段。由此正式確認(rèn)關(guān)閉服務(wù)器端到客戶端方向上的連接揽思。
客戶端等待完2MSL之后袜腥,結(jié)束TIME-WAIT階段,進(jìn)入CLOSED階段钉汗,由此完成“四次揮手”羹令。