TCP連接的“三次握手”與“四次揮手”

TCP的三次握手

所謂的三次握手即TCP連接的建立。這個連接必須是一方主動打開,另一方被動打開的。以下為客戶端主動發(fā)起連接的圖解:

握手之前主動打開的客戶端結束CLOSED階段,被動打開的服務器也結束CLOSED階段,并進入LISTEN階段。隨后開始“三次握手”:
1、首先客戶端向服務器發(fā)送一段TCP報文,其中:

  • 標記位為SYN,表示“請求建立新連接”;
  • 序號為seq=X(X一般為1);
  • 隨后客戶端進入SYN-SENT階段。

2、服務器端接收到來自客戶端的TCP報文之后,結束LISTEN階段,并返回一段TCP報文,其中:

  • 標志位為SYN和ACK,表示“確認客戶端的報文seq有效,服務器能正常接收客戶端發(fā)送的數(shù)據(jù),并同意創(chuàng)建新連接”;
  • 序號為seq=y;
  • 確認號為ack=x+1,表示收到客戶端的序號seq,并將其值+1作為自己確認號ack的值;隨后服務器端進入SYN-RCVD階段。

3、客戶端接收到來自服務器端的確認收到數(shù)據(jù)的TCP報文之后,明確了從客戶端到服務器的數(shù)據(jù)傳輸是正常的,結束SYN-SENT階段。并返回最后一段TCP報文。其中:

  • 標志位為ACK,表示“確認收到服務器端同意連接的信號”;
  • 序號為seq=x+1,表示收到服務器端的確認號ack,并將其值作為自己的序號值;
  • 確認號為Ack=y+1,表示收到服務器端序號Seq,并將其值加1作為自己的確認號ack的值;
  • 隨后客戶端進入ESTABLISHED階段。

服務器收到來自客戶端的”確認收到服務器數(shù)據(jù)“的TCP報文之后,明確了從服務器到客戶端的數(shù)據(jù)傳輸是正常的。結束SYN-SENT階段,進入ESTABLISHED階段。

在客戶端與服務器端傳輸?shù)?TCP報文中,雙方的確認號ack和序號seq的值,都是在彼此ack和seq值的基礎上進行計算的,這樣做保證了TCP報文傳輸?shù)倪B貫性。一單出現(xiàn)某一方發(fā)出的TCP報文丟失,便無法繼續(xù)”握手“,以此確保了”三次握手“的順利完成。

此后客戶端和服務器端進行正常的數(shù)據(jù)傳輸。這就是”三次握手“的過程。

TCP的四次揮手

所謂的四次揮手即TCP連接的釋放(解除)。連接的釋放必須是一方主動釋放,另一方被動釋放。以下為客戶端主動發(fā)起釋放連接的圖解:

揮手之前主動釋放連接的客戶端結束ESTABLISHED階段。隨后開始“四次揮手”:
1、首先客戶端想要釋放連接,向服務器端發(fā)送一段TCP報文,其中:

標記位為FIN,表示“請求釋放連接“;序號為Seq=U;隨后客戶端進入FIN-WAIT-1階段,即半關閉階段。并且停止在客戶端到服務器端方向上發(fā)送數(shù)據(jù),但是客戶端仍然能接收從服務器端傳輸過來的數(shù)據(jù)。注意:這里不發(fā)送的是正常連接時傳輸?shù)臄?shù)據(jù)(非確認報文),而不是一切數(shù)據(jù),所以客戶端仍然能發(fā)送ACK確認報文。

2、服務器端接收到從客戶端發(fā)出的TCP報文之后,確認了客戶端想要釋放連接,隨后服務器端結束ESTABLISHED階段,進入CLOSE-WAIT階段(半關閉狀態(tài))并返回一段TCP報文,其中:

標記位為ACK,表示“接收到客戶端發(fā)送的釋放連接的請求”;序號為Seq=V;確認號為Ack=U+1,表示是在收到客戶端報文的基礎上,將其序號Seq值加1作為本段報文確認號Ack的值;隨后服務器端開始準備釋放服務器端到客戶端方向上的連接??蛻舳耸盏綇姆掌鞫税l(fā)出的TCP報文之后,確認了服務器收到了客戶端發(fā)出的釋放連接請求,隨后客戶端結束FIN-WAIT-1階段,進入FIN-WAIT-2階段

前"兩次揮手"既讓服務器端知道了客戶端想要釋放連接,也讓客戶端知道了服務器端了解了自己想要釋放連接的請求。于是,可以確認關閉客戶端到服務器端方向上的連接了

3、服務器端自從發(fā)出ACK確認報文之后,經(jīng)過CLOSED-WAIT階段,做好了釋放服務器端到客戶端方向上的連接準備,再次向客戶端發(fā)出一段TCP報文,其中:

標記位為FIN,ACK,表示“已經(jīng)準備好釋放連接了”。注意:這里的ACK并不是確認收到服務器端報文的確認報文。序號為Seq=W;確認號為Ack=U+1;表示是在收到客戶端報文的基礎上,將其序號Seq值加1作為本段報文確認號Ack的值。隨后服務器端結束CLOSE-WAIT階段,進入LAST-ACK階段。并且停止在服務器端到客戶端的方向上發(fā)送數(shù)據(jù),但是服務器端仍然能夠接收從客戶端傳輸過來的數(shù)據(jù)。

4、客戶端收到從服務器端發(fā)出的TCP報文,確認了服務器端已做好釋放連接的準備,結束FIN-WAIT-2階段,進入TIME-WAIT階段,并向服務器端發(fā)送一段報文,其中:

標記位為ACK,表示“接收到服務器準備好釋放連接的信號”。序號為Seq=U+1;表示是在收到了服務器端報文的基礎上,將其確認號Ack值作為本段報文序號的值。確認號為Ack=W+1;表示是在收到了服務器端報文的基礎上,將其序號Seq值作為本段報文確認號的值。隨后客戶端開始在TIME-WAIT階段等待2MSL。

服務器端收到從客戶端發(fā)出的TCP報文之后結束LAST-ACK階段,進入CLOSED階段。由此正式確認關閉服務器端到客戶端方向上的連接。

客戶端等待完2MSL之后,結束TIME-WAIT階段,進入CLOSED階段,由此完成“四次揮手”。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容