1. 程式人生 > >TCP的三次握手和四次揮手過程

TCP的三次握手和四次揮手過程

-1 連接狀態 字段 osi listen 情況 time 連接 -a

技術分享

TCP包頭:其中ACK,SYN,FIN在這兩個過程中會用到,簡單介紹如下:

ACK:表示是否前面的確認號字段是否有效,ACK=1,表示有效,只有當ACK=1時,前面的確認號字段才有效,TCP規定,連接建立後,ACK必須為1,帶ACK標誌的TCP報文段稱為確認報文段。

SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標誌的TCP報文段稱為同步報文段。

FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢,如果FIN=1,即告訴對方:""我的數據已經發送完畢,你可以釋放連接了""帶FIN標誌的TCP報文段稱為結束報文段.。

三次握手的過程

技術分享

CLOSED:沒有任何連接狀態

LISTEN:傾聽狀態,等待來自遠方TCP端口的連接請求

SYN-SENT:在發送連接請求後,等待對方確認。

SYN-RECEIVED:在收到和發送一個連接請求後,等待對方確認。

ESTABLISHED:代表傳輸連接建立,雙方進入數據傳送狀態。

在沒有建立連接之前,客戶端與服務器處於關閉狀態,第一次握手 當客戶端想與服務器建立連接時,它就會主動向服務器發送信號,此時SYN=1,ACK=0,表示主動請求建立連接。TCP規定SYN=1時不能攜帶數據,但要消耗一個序號,因此聲明自己的序號是 seq=x。發送連接請求後,客戶端就進入SYN-SENT狀態,等待對方確認

第二次握手 當服務器收到客戶端的請求連接時,如想與客戶端建立連接,就會給客戶端發一個確認信號。此時SYN=1,ACK=1時,表示同意建立連接。然後進入SYN-RECEIVED狀態,等待對方確認。

第三次握手 當客戶端收到了服務器同意建立連接的信號後, 會給服務器再發一次確認信號,然後兩者就進入了建立連接狀態。開始數據傳輸了。

為什麽要進行三次握手呢(兩次確認)

主要是為了防止客戶端已失效的連接請求報文段突然又送到了服務器端,因此產生錯誤。

現在假定出現一種異常情況:客戶端發出的第一個連接請求報文段並沒有丟失,而是在某些

絡節點長時間滯留了,以致延誤到連接釋放以後的某個時間才能到達服務器,本來這是一個早已失效的報文段,但服務器收到此失效的連接請求報文段後,就誤認為是客戶端又發出一次新的連接請求,於是就像客戶端發出確認報文段,同意建立連接,假定不采用三次握手,那麽只要服務器發出確認,新的連接就建立了。由於現在客戶端並沒有發出建立連接的請求,因此不會理睬服務器端的確認,也不會向服務器端發送數據,但服務器端卻以為新的傳輸連接已經建立了,並一直等待客戶端發來數據,服務器端的許多資源就這樣白白浪費了。

采用三次握手的方法可以防止上述現象的發生,在剛才的情況下,客戶端不會向服務器端的確認發出確認,服務器端收不到來自客戶端的確認,就知道客戶端並沒有要求建立連接。

四次揮手的過程

技術分享

FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認。

FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求

TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失

CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,並已確認。

LAST-ACK 被動關閉,等待最後一個關閉傳輸連接確認,並等待所有分組消失。

CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認。

第一次揮手 當客戶端想與服務器斷開連接時,就會主動向服務器發一個終止包。此時FIN=1,表示可以釋放連接了。然後進入終止等待1狀態。

第二次揮手 服務器收到客戶端發來的請求斷開連接的包,就會給服務器發一個確認信息。此時ACK=1,表示已經收到客戶端發來的請求斷開連接的請求了。然後進入關閉等待狀態。而客戶端收到服務器端的確認後,進入終止等待2狀態,等待對方發送關閉傳輸連接請求

第三次揮手 服務器端同意斷開連接時,向客戶端發送同意斷開連接的數據包。然後進入LAST-ACK狀態,等待最後確認。

第四次揮手 客戶端收到服務器端發來的同意斷開連接的請求,會給服務器端發一個確認信息,然後進入TIME-WAIT狀態,時間較長,完成雙向傳輸連接關閉,等待所有分組消失。然後再進入CLOSED狀態。服務器端收到確認信息,斷開連接,然後進入CLOSED狀態。

TCP的三次握手和四次揮手過程