1.三次握手
握手之前主動打開連接的客戶端結束CLOSED階段,被動打開的服務器端也結束CLOSED階段,并進入LISTEN階段。隨后開始“三次握手”:
(1)首先客戶端向服務器端發送一段TCP報文,其中:
標記位為SYN,表示“請求建立新連接”;序號為Seq=X(X一般為1);隨后客戶端進入SYN-SENT階段。
(2)服務器端接收到來自客戶端的TCP報文之后,結束LISTEN階段。并返回一段TCP報文,其中:
標志位為SYN和ACK,表示“確認客戶端的報文Seq序號有效,服務器能正常接收客戶端發送的數據,并同意創建新連接”(即告訴客戶端,服務器收到了你的數據);序號為Seq=y;確認號為Ack=x+1,表示收到客戶端的序號Seq并將其值加1作為自己確認號Ack的值;隨后服務器端進入SYN-RCVD階段。
(3)客戶端接收到來自服務器端的確認收到數據的TCP報文之后,明確了從客戶端到服務器的數據傳輸是正常的,結束SYN-SENT階段。并返回最后一段TCP報文。其中:
標志位為ACK,表示“確認收到服務器端同意連接的信號”(即告訴服務器,我知道你收到我發的數據了);序號為Seq=x+1,表示收到服務器端的確認號Ack,并將其值作為自己的序號值;確認號為Ack=y+1,表示收到服務器端序號Seq,并將其值加1作為自己的確認號Ack的值;隨后客戶端進入ESTABLISHED階段。服務器收到來自客戶端的“確認收到服務器數據”的TCP報文之后,明確了從服務器到客戶端的數據傳輸是正常的。結束SYN-SENT階段,進入ESTABLISHED階段。
在客戶端與服務器端傳輸的TCP報文中,雙方的確認號Ack和序號Seq的值,都是在彼此Ack和Seq值的基礎上進行計算的,這樣做保證了TCP報文傳輸的連貫性。一旦出現某一方發出的TCP報文丟失,便無法繼續"握手",以此確保了"三次握手"的順利完成。
此后客戶端和服務器端進行正常的數據傳輸。這就是“三次握手”的過程。
2.四次揮手
揮手之前主動釋放連接的客戶端結束ESTABLISHED階段。隨后開始“四次揮手”:
(1)首先客戶端想要釋放連接,向服務器端發送一段TCP報文,其中:
標記位為FIN,表示“請求釋放連接“;序號為Seq=U;隨后客戶端進入FIN-WAIT-1階段,即半關閉階段。并且停止在客戶端到服務器端方向上發送數據,但是客戶端仍然能接收從服務器端傳輸過來的數據。注意:這里不發送的是正常連接時傳輸的數據(非確認報文),而不是一切數據,所以客戶端仍然能發送ACK確認報文。
(2)服務器端接收到從客戶端發出的TCP報文之后,確認了客戶端想要釋放連接,隨后服務器端結束ESTABLISHED階段,進入CLOSE-WAIT階段(半關閉狀態)并返回一段TCP報文,其中:
標記位為ACK,表示“接收到客戶端發送的釋放連接的請求”;序號為Seq=V;確認號為Ack=U+1,表示是在收到客戶端報文的基礎上,將其序號Seq值加1作為本段報文確認號Ack的值;隨后服務器端開始準備釋放服務器端到客戶端方向上的連接??蛻舳耸盏綇姆掌鞫税l出的TCP報文之后,確認了服務器收到了客戶端發出的釋放連接請求,隨后客戶端結束FIN-WAIT-1階段,進入FIN-WAIT-2階段
前"兩次揮手"既讓服務器端知道了客戶端想要釋放連接,也讓客戶端知道了服務器端了解了自己想要釋放連接的請求。于是,可以確認關閉客戶端到服務器端方向上的連接了
(3)服務器端自從發出ACK確認報文之后,經過CLOSED-WAIT階段,做好了釋放服務器端到客戶端方向上的連接準備,再次向客戶端發出一段TCP報文,其中:
標記位為FIN,ACK,表示“已經準備好釋放連接了”。注意:這里的ACK并不是確認收到服務器端報文的確認報文。序號為Seq=W;確認號為Ack=U+1;表示是在收到客戶端報文的基礎上,將其序號Seq值加1作為本段報文確認號Ack的值。隨后服務器端結束CLOSE-WAIT階段,進入LAST-ACK階段。并且停止在服務器端到客戶端的方向上發送數據,但是服務器端仍然能夠接收從客戶端傳輸過來的數據。
(4)客戶端收到從服務器端發出的TCP報文,確認了服務器端已做好釋放連接的準備,結束FIN-WAIT-2階段,進入TIME-WAIT階段,并向服務器端發送一段報文,其中:
標記位為ACK,表示“接收到服務器準備好釋放連接的信號”。序號為Seq=U+1;表示是在收到了服務器端報文的基礎上,將其確認號Ack值作為本段報文序號的值。確認號為Ack=W+1;表示是在收到了服務器端報文的基礎上,將其序號Seq值作為本段報文確認號的值。隨后客戶端開始在TIME-WAIT階段等待2MSL
為什么要客戶端要等待2MSL呢?見后文。
服務器端收到從客戶端發出的TCP報文之后結束LAST-ACK階段,進入CLOSED階段。由此正式確認關閉服務器端到客戶端方向上的連接。
客戶端等待完2MSL之后,結束TIME-WAIT階段,進入CLOSED階段,由此完成“四次揮手”。
后“兩次揮手”既讓客戶端知道了服務器端準備好釋放連接了,也讓服務器端知道了客戶端了解了自己準備好釋放連接了。于是,可以確認關閉服務器端到客戶端方向上的連接了,由此完成“四次揮手”。
與“三次揮手”一樣,在客戶端與服務器端傳輸的TCP報文中,雙方的確認號Ack和序號Seq的值,都是在彼此Ack和Seq值的基礎上進行計算的,這樣做保證了TCP報文傳輸的連貫性,一旦出現某一方發出的TCP報文丟失,便無法繼續"揮手",以此確保了"四次揮手"的順利完成。
浙公網安備 33010602011771號