由於TCP連線是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據傳送任務後就能傳送一個FIN來終止這個方向的連線。收到一個 FIN只意味著這一方向上沒有數據流動,一個TCP連線在收到一個FIN後仍能傳送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
(1)客戶端A傳送一個FIN,用來關閉客戶A到伺服器B的數據傳送(報文段4)。
(2)伺服器B收到這個FIN,它發回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將占用一個序號。
(3)伺服器B關閉與客戶端A的連線,傳送一個FIN給客戶端A(報文段6)。
(4)客戶端A發回ACK報文確認,並將確認序號設定為收到序號加1(報文段7)
TCP 採用四次揮手關閉連線如圖所示為什麼建立連線協定是三次握手,而關閉連線卻是四次握手呢?
這是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文里來傳送。但關閉連線時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據傳送給你了;但未必你所有的數據都全部傳送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要傳送一些數據給對方之後,再傳送FIN報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ACK報文和FIN報文多數情況下都是分開發送的。