網絡編程之 TCP 建立連接的三次握手機制和關閉連接的四次揮手機制

一、TCP建立連接的三次握手機制

1.TCP 3次握手建立連接

建立TCP連接:在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接:

  1. 建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
    SYN:同步序列編號(Synchronize Sequence Numbers)
  2. 服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
  3. 客戶端收到服務器的SYN+ACK包(此時客戶端進入ESTABLISHED狀態),向服務器發送確認包ACK(ack=k+1),此包發送完畢,服務端收到這個包後進入ESTABLISHED狀態,客戶端和服務器都進入ESTABLISHED狀態,完成三次握手。
    三次握手的關鍵就在於,它可以應變連接請求是否失效。

三次握手建立連接的流程如下:
image

2.爲什麼需要第三次握手

需要第三次握手根本原因是防止失效的連接請求報文段被服務端接收,從而產生錯誤,具體表現:若建立連接只需兩次握手,客戶端並沒有太大的變化,仍然需要獲得服務端的應答後才進入ESTABLISHED狀態,而服務端在收到連接請求後就進入ESTABLISHED狀態。此時如果網絡擁塞,客戶端發送的連接請求遲遲到不了服務端,客戶端便超時重發請求,如果服務端正確接收並確認應答,雙方便開始通信,通信結束後釋放連接。此時,如果那個失效的連接請求抵達了服務端,由於只有兩次握手,服務端收到請求就會進入ESTABLISHED狀態,等待發送數據或主動發送數據。但此時的客戶端早已進入CLOSED狀態,服務端將會一直等待下去,這樣浪費服務端連接資源。

二、TCP關閉連接的四次揮手機制

1.TCP 4次握手關閉連接

對於一個已經建立的連接,TCP使用改進的三次握手來釋放連接(使用一個帶有FIN附加標記的報文段)。TCP關閉連接的步驟如下:

  1. 客戶端向服務器發送一個帶有FIN附加標記的報文段(FIN表示英文finish),客戶端進入FIN_WAIT_1狀態;
  2. Server收到FIN後,並不立即用FIN報文段回覆客戶端,而是先向客戶端發送一個確認序號ACK,同時通知自己相應的應用程序:對方要求關閉連接(先發送ACK的目的是爲了防止在這段時間內,對方重傳FIN報文段),此時服務器進入CLOSE_WAIT狀態;
  3. 服務器關閉與客戶端的連接:當服務器發送的數據完成之後會單獨向客戶端發送一個FIN報文段,表示同意關閉連接;服務器進入LAST_ACK狀態
  4. 客戶端收到服務端的FIN報文段後,客戶端進入TIME_WAIT狀態,向服務端發送ACK表示連接徹底釋放,服務端進入CLOSED狀態,完成四次握手。

四次揮手關閉連接的流程:
image

2.爲什麼是四次揮手

因爲TCP連接是雙向連接的,即客戶端會向服務端發送數據請求,服務端會向客戶端發送響應的數據,TCP是一種可靠的連接方式。客戶端發送完數據,服務端不一定把所有的響應數據發送完成,關閉連接時需要斷開客戶端向服務端發送數據的連接(此時客戶端還可以接收服務端發送的數據)和服務端向客戶端發送響應的連接,即服務端對客戶端關閉連接的請求的響應ACK和服務端同意關閉連接的FIN字段需要分開發送。

PS:建立連接時的第二次握手時服務端向客戶端發送的響應包括SYN和ACK。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章