一、四次握手的過程
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→BA在接收到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