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 )。