TCP四次握手釋放連接

一、四次握手的過程


TCP需要三次握手才能建立連接,整個過程如下圖所示:


假設A運行的是TCP客戶端進程,而B運行的是TCP服務端進程。最開始的時候兩端的TCP進程都處於ESTABLISHED(已建立連接)狀態。

這時候,A主動關閉,請求釋放連接。


(1)第一次握手  A→ B

A的TCP客戶進程向B發出釋放連接請求報文段,其中FIN(終止位)=1,seq(序號)=u

TCP規定,當報文段的FIN=1時,表明此報文段的發送方的數據已發生完畢,並要求釋放連接;FIN報文段(FIN=1的報文段)不能攜帶數據,但是要消耗掉一個序號。

在A發送完畢之後,A的TCP客戶端進程進入FIN-WAIT-1(終止等待1狀態。


(2)第二次握手  B→A

B在收到連接釋放連接請求報文段之後,隨即向A發送確認報文段。其中ACK=1,seq=v,ack(確認號)=u+1

在B發送完畢之後,B的TCP服務端進程進入CLOSE-WAIT(關閉等待)狀態。

TCP服務器進程這時應該通知高層應用經常,從A到B這個方向的連接就要釋放了,這時的TCP連接處於半關閉(half-close)狀態。

A在收到B的確認報文段之後,就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文段。


(3)第三次握手 B→A
若B已經沒有要向A發送的數據,其應用進程就通知TCP釋放連接。B向A發出釋放連接報文段,其中FIN=1,ACK=1,seq=w,ack=u+1
TCP規定,當報文段的FIN=1時,表明此報文段的發送方的數據已發生完畢,並要求釋放連接;FIN報文段(FIN=1的報文段)不能攜帶數據,但是要消耗掉一個序號。

在B發送完畢之後,B的TCP服務端進程進入LAST-ACK(最後確認狀態。


(4)第四次握手 A→B

A在接收到B的釋放連接請求報文段之後,必須對此發出確認。其中ACK=1,seq=u+1,ack=w+1


A在發送完畢之後,進入到TIME-WAIT(時間等待)狀態。B在接收到A的確認之後,進入到CLOSED(關閉)狀態。


在經過時間等待計時器設置的時間2MSL之後,A才進入到CLOSED狀態。


以上就是所說的四次握手過程。



二、四次握手的原因


四次握手可以看成是兩個二次握手,分別是A的TCP客戶端進程請求釋放連接和B的TCP服務端進程請求釋放連接。


爲什麼A在發送最後一次確認報文段之後還需要等待2MSL時間呢?主要有兩個原因,一是爲了讓B能夠按照正常步驟進入CLOSED狀態,二是爲了防止已失效的請求連接報文段出現在下次連接中,因而產生錯誤。


原因如下:

第一,爲了保證A發送的最後一個ACK報文段能夠到達B。因爲這個ACK報文段有可能丟失,這樣B就無法接收到而進入CLOSED狀態。於是B會重傳請求釋放連接的報文段,A在這段等待時間接收到了,重傳ACK報文段,這樣B還是會順利接收到確認報文段,進入CLOSED狀態。如果此時A已經關閉了,那麼就無法收到B的請求報文段,也不會發送ACK報文段,這樣B就無法進入CLOSED狀態了。


第二,在這2MSL的等待時間內,本次連接的所有報文都已經從網絡中消失,從而不會出現失效的報文出現在下次連接中。


參考資料:

1、TCP協議中的三次握手和四次揮手(圖解) http://blog.csdn.net/whuslei/article/details/6667471

2、簡析TCP的三次握手與四次分手 http://www.jellythink.com/archives/705

3、TCP三次握手詳解及釋放連接過程  http://blog.csdn.net/oney139/article/details/8103223




發佈了87 篇原創文章 · 獲贊 190 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章