1. 程式人生 > >網路_TCP連線的建立與釋放

網路_TCP連線的建立與釋放

三報文握手

1.概述

TCP是面向連線的協議。TCP建立連線的過程叫做握手,握手需要在客戶和伺服器之間交換三個TCP報文段,即我們說的“三次握手”(嚴格講是一次握手過程中交換了三個報文)。

2.過程

一開始客戶端和伺服器端中的TCP程序都處於關閉狀態,假設客戶端主動開啟連線,伺服器端被動開啟連線;這時客戶端TCP程序建立傳輸控制模組TCB,伺服器端程序也建立傳輸控制模組TCB並監聽客戶請求,以便及時響應。

  • 第一次 客戶端打算建立TCP連線時,向伺服器端傳送連線請求報文段,其首部中的同步位SYN=1,ACK=0,並選擇一個初始序號seq=x,這時客戶端TCP程序進入同步已傳送狀態(SYN-SENT)。
  • 第二次 伺服器端收到連線請求報文段後,如果同意連線,則向客戶端傳送確認報文段,其首部中的同步位和ACK位都為1,確認號為ack=x+1,並選擇一個初始序號為seq=y,這時伺服器端TCP程序進入同步已收到狀態(SYN-RCVD)。
  • 第三次 客戶端收到伺服器端的確認後,還需要向伺服器端傳送確認報文段,其首部中的同步位和ACK位都為1,確認號為ack=y+1,自己的序號為seq=x+1,這時客戶端TCP程序進入已建立連線狀態(ESTABLISHED)。

當伺服器端收到客戶端的確認後,也進入已建立連線狀態(ESTABLISHED)。

3.過程圖示

4.四報文握手

在三報文握手中的第二次報文傳送時,可以先發送一個確認報文段(ACK=1,ack=x+1),再發送一個同步報文段(SYN=1,seq=y),這就變成了四報文握手。

四報文揮手

1.概述

TCP釋放連線的過程叫做揮手。揮手需要在客戶和伺服器之間交換四個TCP報文段。

2.過程

資料傳輸結束後,通訊的雙方都可釋放連線。假設客戶端停止傳送資料,先主動關閉TCP連線。

  • 第一次 客戶端TCP程序傳送連線釋放報文段並進入終止等待1狀態(FIN-WAIT-1),其中報文段首部的終止控制位FIN=1,其序號seq=u(u等於已傳送過的資料的最後一個位元組的序號加1)。
  • 第二次 伺服器端收到連線釋放報文段後發出確認報文段並進入關閉等待狀態(CLOSE-WAIT),其中報文段首部確認號為ack=u+1,其序號為seq=v(v等同於u)。 客戶端收到伺服器端的確認後,進入終止等待2狀態(FIN-WAIT-2),等待伺服器端傳送連線釋放報文段。 這時TCP連線處於半關閉狀態,即客戶端到伺服器端的連線釋放了,但是伺服器端仍可傳送資料,客戶端仍可以接收資料。
  • 第三次 當伺服器端停止傳送資料,其應用程序會通知TCP釋放連線。 伺服器端TCP程序傳送連線釋放報文段並進入最後確認狀態(LAST-ACK),其中報文段首部的終止控制位FIN=1,其序號seq=w(半關閉狀態時可能傳送了資料),確認號ack=u+1。
  • 第四次 客戶端收到連線釋放報文段後發出確認報文段並進入時間等待狀態(TIME-WAIT),其中報文段首部的ACK=1,確認號ack=w+1,其序號為seq=u+1。 此時TCP連線還沒有釋放,等待時間等待計時器設定的2MSL時間後(建議四分鐘),客戶端才進入關閉狀態。

3.圖示

幾個問題

  • 1.三報文握手為什麼客戶端最後還要傳送一次確認呢? 為了防止已失效的連線請求報文段又發給伺服器端而產生錯誤。 比如客戶端傳送的第一個請求報文段在某些網路節點滯留了,導致連線釋放後的某個時間才到達伺服器端,伺服器端會向客戶端傳送確認報文段。 如果不採用三報文握手,那麼新的連線就建立了,但客戶端不知道建立了連線,就不會發送資料導致伺服器端一直等待; 而採用三報文握手,客戶端不會向伺服器端的確認發出確認,伺服器端收不到確認,就不會建立連線。
  • 2.為什麼四報文揮手客戶端在時間等待狀態需要等待2MSL? 其一是為了保證客戶端傳送的最後一個確認報文段能到達伺服器端。因為最後一個ACK報文段可能丟失,伺服器端收不到這個報文段會超時重傳FIN報文段,在2MSL時間內客戶端能收到重傳的FIN報文段並重傳ACK報文段,保證客戶端和伺服器端正常關閉TCP連線。 其二是防止已失效的請求連線報文段出現在本次連線中。客戶端在傳送完最後一個ACK報文段後經過2MSL時間後,本次連線內的所有報文段將消失,下一次新的連線中就不會有本次的無效的請求連線報文段了。