天天看點

tcp 連接配接詳細關閉過程

TCP協定的連接配接是全雙工連接配接,一個TCP連接配接存在雙向的讀寫通 道。 

簡單說來是 “先關讀,後關寫”,一共需要四個階段。以客戶機發起關閉連接配接為例 :

1.伺服器讀通道關閉

2.客戶機寫通道關閉

3.客戶機讀通道關閉

4.伺服器寫通道關閉

關閉行為是在發起方資料發送完畢之後,給對方發出一個FIN(f inish)資料段。直到 接收到對方發送的FIN,且對方收到了接收确認ACK之後 ,雙方的資料通信完全結束,過程中每次接收都需要 傳回确認資料段ACK。

詳細過程:

        第一階段     客戶機發送完資料之後,向伺服器發送一個 FIN 資料段, 序 列号為 i ;

       1.伺服器收到 FIN(i) 後,傳回确認段 ACK ,序列号為 i+1 , 關閉伺服器讀通道 ;

       2.客戶機收到 ACK(i+1) 後, 關閉客戶機寫通道 ;

      (此時,客戶機仍能通過讀通道讀取伺服器的資料,伺服器仍能通過寫通道寫資料 )

        第二階段  伺服器發送完資料之後,向客戶機發送一個FIN資料段 ,序列号為j;

       3.客戶機收到 FIN(j) 後,傳回确認段 ACK ,序列号為 j+1 , 關閉客戶機讀通道 ;

       4.伺服器收到 ACK(j+1) 後, 關閉伺服器寫通道 。

這是标準的TCP關閉兩個階段,伺服器和客戶機都可以發起關閉,完全對稱。

FIN辨別是通過發送最後一塊資料時設定的,标準的例子中,伺服器還在發送資料,是以要等到發送完的時候,設定FIN(此時可稱為TCP連接配接處于 半關閉狀态, 因為資料仍可從被動關閉一方向主動關閉方 傳送)。如 果在伺服器收到FIN(i)時,已經沒有資料需要發送, 可以在傳回ACK(i+1)的時候就設定FIN(j)辨別,這樣就相當于可以合并第二步和第三步。

  • 伺服器端首先執行 LISTEN 原語進入被動打開狀态( LISTEN ),等待用戶端連接配接;
  • 當用戶端的一個應用程式發出 CONNECT 指令後,本地的 TCP 實體為其建立一個連接配接記錄并标記為 SYN SENT 狀态,然後給伺服器發送一個 SYN 封包段;
  • 伺服器收到一個 SYN 封包段,其 TCP 實體給用戶端發送确認 ACK 封包段同時發送一個 SYN 信号,進入 SYN RCVD 狀态;
  • 用戶端收到 SYN + ACK 封包段,其 TCP 實體給伺服器端發送出三次握手的最後一個 ACK 封包段,并轉換為 ESTABLISHED 狀态;
  • 伺服器端收到确認的 ACK 封包段,完成了三次握手,于是也進入 ESTABLISHED 狀态。

   在此狀态下,雙方可以自由傳輸資料。當一個應用程式完成資料傳輸任務後,它需要關閉 TCP 連接配接。假設仍由用戶端發起主動關閉連接配接。

  • 用戶端執行 CLOSE 原語,本地的 TCP 實體發送一個 FIN 封包段并等待響應的确認(進入狀态 FIN WAIT 1 );
  • 伺服器收到一個 FIN 封包段,它确認用戶端的請求發回一個 ACK 封包段,進入 CLOSE WAIT 狀态;
  • 用戶端收到确認 ACK 封包段,就轉移到 FIN WAIT 2 狀态,此時連接配接在一個方向上就斷開了;
  • 伺服器端應用得到通告後,也執行 CLOSE 原語關閉另一個方向的連接配接,其本地 TCP 實體向用戶端發送一個 FIN 封包段,并進入 LAST ACK 狀态,等待最後一個 ACK 确認封包段;
  • 用戶端收到 FIN 封包段并确認,進入 TIMED WAIT 狀态,此時雙方連接配接均已經斷開,但 TCP 要等待一個 2 倍封包段最大生存時間 MSL ( Maximum Segment Lifetime ),確定該連接配接的所有分組全部消失,以防止出現确認丢失的情況。當定時器逾時後, TCP 删除該連接配接記錄,傳回到初始狀态( CLOSED )。
  • 伺服器收到最後一個确認 ACK 封包段,其 TCP 實體便釋放該連接配接,并删除連接配接記錄,傳回到初始狀态( CLOSED )。

繼續閱讀