1. 程式人生 > 其它 >TCP三次握手與四次揮手

TCP三次握手與四次揮手

TCP基本資訊

預設埠號:80

LINUX中TIME_WAIT的預設時間是30s

TCP三次握手

三次握手過程:每行代表發起握手到另一方剛剛收到資料包時的狀態
客戶端   服務端 客戶端狀態 服務端狀態
  握手前   CLOSE LISTEN
客戶端傳送帶有SYN標誌的資料包到服務端 一次握手   SYN_SEND LISTEN
  二次握手 服務端傳送帶有SYN/ACK標誌的資料包到客戶端 SYN_SEND SYN_RCVD
客戶端傳送帶有ACK標誌的資料包到服務端 三次握手   ESTABLISHED SYN_RCVD
  握手結束   ESTABLISHED ESTABLISHED

為什麼是三次握手,兩次不行嗎?

三次握手主要是為了建立可靠的通訊通道,是客戶端和服務端同時具有傳送和接收資料的能力.

兩次握手只能保證單向連線是暢通的.(為了實現可靠資料傳輸,TCP協議的通訊雙方,都必須維護一個序列號,已標誌傳送出去的資料包中,哪些是已經被對方接收了的.三次握手的過程即是通訊雙方互相告知序列號起始值,並確認對方已經收到了序列號起始值的畢竟步驟;如果只是兩次握手,至多隻有連線發起放的起始序列號能夠被確認,另一方選擇的序列號則得不到確認)

三次握手能防止已經失效的連線請求又傳到服務端,建立多餘的連線,浪費系統資源.(假設客戶端第一次握手時傳送的請求報文SYN_1超時,攜帶Seqnum=90,客戶端再次發起第一次握手請求報文SYN_2,攜帶Seqnum=100,若此時SYN_1先於SYN_2到達客戶端.若為兩次握手,此時服務端傳送SYN_ACK_1到客戶端,攜帶Seqnum=91,建立連線.SYN_2到達客戶端,再建立一個連線,因此會造成資源浪費.若使用三次握手,客戶端接收到SYN_ACK_1後發現其攜帶的Seqnum不對,便將其廢棄,知道SYN_ACK_2到達,發現其符合條件,傳送ACK到服務端,建立連線)

TCP四次揮手

四次揮手過程:

客戶端   服務端 客戶端狀態 服務端狀態
  揮手前   ESTABLISTED ESTABLISTED
客戶端傳送帶有FIN標誌的資料包到服務端 一次揮手   FIN-WAIT-1 ESTABLISTED
  二次揮手 服務端收到這個FIN,它發回一個ACK,確認序號為收到的序號+1 FIN-WAIT-1 CLOSED-WAIT
  三次揮手 服務端傳送一個FIN資料包到客戶端,關閉與客戶端的連線 FIN-WAIT-2 LAST_ACK
客戶端收到這個FIN,發揮ACK報文確認,並將確認序號設定為收到的序號+1 四次揮手  
TIME-WAIT LAST_ACK
經過2MSL 揮手完成   CLOSE CLOSE

CLOSED-WAIT:表示等待關閉

TIME-WAIT:為了解決網路的丟包和網路不穩定所帶來的其他問題,確保連線方能在時間範圍內,關閉自己的連線.

  • 揮手前,客戶端和服務端的狀態都是ESTABLISHED(連線建立)

  • 第一次揮手,客戶端傳送帶有FIN標誌的資料包給服務端,客戶端狀態變為FIN-WAIT-1.

  • 第二次揮手,服務端收到客戶端的資料包後,傳送ACK確認幀給客戶端,服務端狀態變為CLOSED-WAIT.

  • 第三次揮手,客戶端收到服務端的ACK確認幀後,狀態變為FIN-WAIT-2.此時服務端可能有些資料還未處理完,待服務端處理完資料會發送帶有FIN的資料包到客戶端,此時服務端狀態變更為LAST-ACK.

  • 第四次揮手,客戶端收到服務端FIN報文後,迴應一個ACK確認報文,此時客戶端狀態變更為TIME-WAIT.服務端收到ACK確認報文後狀態變更為CLOSE,至此服務端完成連線的關閉.客戶端等待2MSL時間後,自動進入CLOSE狀態,至此客戶端關閉連線.

參考文章

TCP三次握手

TCP四次揮手