TCP三次握手和四次揮手詳細過程

    這篇文章對TCP的三次握手和四次揮手詳細過程進行總結。

1. TCP連接的建立—三次握手:

先對相關的符號作一下說明:

  • 確認號字段(ack):佔四個字節,是期望收到對方的下一個報文段的數據的第一個字節的序號。若ack = N,則表明到序號N-1爲止的所有數據都已正確收到。
  • 確認位(ACK):只有當ACK=1時確認號字段纔有效。當ACK=0時,確認號無效。
  • 同步位(SYN):同步 SYN=1 表示這是一個連接請求或連接接收報文。當SYN=1,ACK=0時,表明這是一個連接請求報文,對方若同意建立連接,則在響應報文中使用SYN=1,ACK=1。即,SYN=1就表示這是一個連接請求或連接接收報文。

    TCP的連接的建立採用客戶/服務器的方式。主動發起連接建立的應用進程叫做客戶機,而被動等待連接建立的應用進程叫做服務器。連接的建立分爲3步,如下圖所示。

                             

                                                                                    圖1  TCP三次握手

    第一步:客戶機的TCP首先向服務器的TCP發送一個連接請求報文段。這個特殊的報文段中不含應用層數據,其首部中的SYN標誌位被置爲1。另外,客戶機會隨機選擇一個起始序列號 seq = x(連接請求報文不攜帶數據,但要消耗掉一個序號)。

    第二步:服務器的TCP收到連接請求報文段後,如同意建立連接,就向客戶機發回確認,並未該TCP連接分配TCP緩存和變量。在確認報文段中,SYN和ACK位都被置爲1,確認號字段的值爲x+1,並且服務器隨機產生起始序列號 seq = y(確認報文不攜帶數據,但也要消耗掉一個序號)。確認報文段同樣不包含應用層數據。

    第三步:當客戶機收到確認報文段後,還要向服務器給出確認,並且也要給該連接分配緩存和變量。這個報文段的ACK標誌位被置爲1,序號字段爲 x+1,確認號字段 ack = y+1。該報文段可以攜帶數據,如果不攜帶數據則不消耗序號。

    在成功進行了以上三步之後,TCP連接就建立了,接下來就可以傳送應用層數據了。TCP提供的是全雙工通信,因此通信雙方的應用進程在任何時候都能發送數據。需要注意的是,服務器端的資源是在完成第二次握手時分配的,而客戶端的資源是在完成第三次握手時分配的。這就使得服務器易於受到SYN泛洪攻擊。

連接狀態:

  1. CLOSE : 起始狀態,無任何連接;
  2. LISTEN : 服務端建立socket之後需要listen進入LISTEN(偵聽)模式,偵聽來自遠方的TCP連接請求。
  3. SYN_SENT : 客戶端建立socket之後需要connect服務器,向服務端發送seq=x(隨機數)申請連接,然後進入SYN_SENT狀態。
  4. SYN_RECVD : 服務端在**偵聽模式 *下收到seq後會向客戶端迴應ack=x+1,同時發送seq=y,然後進入SYN_RCVD狀態。
  5. ESTABLISHED : 客戶端收到ack後進行驗證,同時迴應服務端發來的seq,返回ack=y+1,然後進入ESTABLISHED狀態。服務端收到最後一個ack後驗證,然後進入ESTABLISHED。表示雙方的連接建立完成,可以進行數據傳輸。

TCP連接的釋放—四次揮手

相關符號說明:

  • 終止位(FIN):用來釋放連接。FIN=1表明此報文段的發送方的數據已發送完畢,並要求釋放傳輸連接。

  參與TCP連接的兩個進程中的任何一個都能終止連接,釋放步驟分爲四步。釋放連接過程圖如下所示。

 2MSL (Maximum Segment Lifetime):  最大報文生存時間;

                           

                                                                                    圖2 TCP四次揮手

    第一步:客戶機打算關閉連接,就向其TCP發送一個連接釋放報文段,並停止再發送數據,主動關閉TCP連接,該報文段的FIN標誌位被置爲1,seq = u,它等於前面已傳送過的數據的最後一個自己的序號加1(FIN報文段即使不攜帶數據,也要消耗一個序號)。TCP是全雙工的,即可以想象成是一條TCP連接上有兩條數據通路。當發送FIN報文時,發送FIN報文的一段就不能再發送數據,也就是關閉了其中一條數據通路,但對方還可以發送數據。

    第二步:服務器收到連接釋放報文段後即發出確認,確認號是ack = u+1,而這個報文段自己的序號是v,等於它們前面已傳送過的數據的最後一個字節的序號加1。此時,從客戶機到服務器這個方向的連接就釋放了,TCP連接處於半關閉狀態。但服務器若發送數據,客戶機仍要接收,即從服務器到客戶機這個方向的連接並未關閉。

    第三步:若服務器已經沒有要向客戶機發送的數據,就通知TCP釋放連接,此時其發出FIN=1的連接釋放報文段。

    第四步:客戶機收到連接釋放報文段後,必須發出確認。在確認報文段中,ACK字段被置爲1,確認號ack = w+1,序號seq = u+1。此時TCP連接還沒有釋放掉,必須經過時間等待計時器設置的時間2MSL後,A才進入到連接關閉狀態。

連接狀態:

  1. FIN_WAIT_1 : 在ESTABLISHED(連接)狀態下,主動斷開連接會向對端發送FIN=1,然後進入FIN_WAIT_1狀態。
  2. CLOSED_WAIT : 被動斷開連接的一端收到FIN之後,會迴應ack,然後進入CLOSED_WAIT狀態,在CLOSED_WAIT狀態下,連接只能發送數據不能接收數據。
  3. FIN_WAIT_2 : 主動斷開連接的一端收到FIN的ack迴應後會進入FIN_WAIT_2狀態。此時無法再發送數據但是可以接受數據。
  4. LAST_ACK : 被動斷開連接的一端在緩衝區數據發送完成後會發送FIN = 1然後進入LAST_ACK狀態。如果程序健壯性較差,在socket收到文件結束符之後沒有關閉socket,此處不會發出FIN,導致連接停留在CLOSED_WAIT&FIN_WAIT_2狀態。
  5. TIME_WAIT : 主動斷開連接的一端在收到對端的FIN後迴應ACK然後進入TIME_WAIT。此狀態下連接已斷開,但爲了避免最後一個ACK在網絡中迷路,而導致的狀態紊亂,端口會被保留2*MSL的時長。
  6. CLOSED : 在TIME_WAIT狀態停留時間達到2*MSL之後進入CLOSED狀態,表示無任何連接。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章