TCP三次握手和四次揮手理解

人生夢復夢發表於2021-01-05
  • 在瞭解三次握手和四次揮手之前,先知道TCP報文內部包含了哪些東西。

一、TCP報文格式

在這裡插入圖片描述

  • TCP報頭中的源埠號和目的埠號同IP資料包中的源IP與目的IP唯一確定一條TCP連線。

  • TCP在傳送資料前必須在彼此間建立連線,這裡連線意思是:雙方需要儲存對方資訊(例如:IP,Port…)

  • 報文主要段的意思

序號:表示傳送的資料位元組流,確保TCP傳輸有序,對每個位元組編號

確認序號:傳送方期待接收的下一序列號,接收成功後的資料位元組序列號加 1。只有ACK=1時才有效。

ACK:確認序號的標誌,ACK=1表示確認號有效,ACK=0表示報文不含確認序號資訊

SYN:連線請求序號標誌,用於建立連線,SYN=1表示請求連線

FIN:結束標誌,用於釋放連線,為1表示關閉本方資料流

二、三次握手

2.1 三次握手過程

  • 建立TCP連線時,需要客戶端和伺服器共傳送3個包。
第一次:客戶端傳送初始序號x和syn=1請求標誌

第二次:伺服器傳送請求標誌syn,傳送確認標誌ACK,傳送自己的序號seq=y,傳送客戶端的確認序號ack=x+1

第三次:客戶端傳送ACK確認號,傳送自己的序號seq=x+1,傳送對方的確認號ack=y+1

在這裡插入圖片描述

2.2 三次握手過程分析:

  • 第一次:客戶端傳送請求到伺服器,伺服器知道客戶端傳送,自己接收正常。
    SYN=1,seq=x
  • 第二次:伺服器發給客戶端,客戶端知道自己傳送、接收正常,伺服器接收、傳送正常。
    ACK=1,ack=x+1,SYN=1,seq=y
  • 第三次:客戶端發給伺服器,伺服器知道客戶端傳送,接收正常,自己接收,傳送也正常。
    seq=x+1,ACK=1,ack=y+1

結論:從分析過程可以看出,握手兩次達不到能讓雙方能正常的進行資料傳輸。

三、四次揮手

3.1 四次揮手過程

客戶端請求斷開連線

  • 第一次揮手:客戶端發出釋放FIN=1,自己序列號seq=u,進入FIN-WAIT-1狀態
  • 第二次揮手:伺服器收到客戶端的後,發出ACK=1確認標誌和客戶端的確認號ack=u+1,自己的序列號seq=v,進入CLOSE-WAIT狀態
  • 第三次揮手:客戶端收到伺服器確認結果後,進入FIN-WAIT-2狀態。此時伺服器傳送釋放FIN=1訊號,確認標誌ACK=1,確認序號ack=u+1,自己序號seq=w,伺服器進入LAST-ACK(最後確認態)
  • 第四次揮手:客戶端收到回覆後,傳送確認ACK=1,ack=w+1,自己的seq=u+1,客戶端進入TIME-WAIT(時間等待)。客戶端經過2個最長報文段壽命後,客戶端CLOSE;伺服器收到確認後,立刻進入CLOSE狀態。

在這裡插入圖片描述

3.2 四次揮手過程分析

第一次:客戶端請求斷開FIN,seq=u

第二次:伺服器確認客戶端的斷開請求ACK,ack=u+1,seq=v

第三次:伺服器請求斷開FIN,seq=w,ACK,ack=u+1

第四次:客戶端確認伺服器的斷開ACK,ack=w+1,seq=u+1

四、其他問題

4.1 為什麼三次握手和四次揮手?

  • 三次握手時,伺服器同時把ACK和SYN放在一起傳送到了客戶端那裡
  • 四次揮手時,當收到對方(客戶端)的 FIN 報文時,僅僅表示對方不再傳送資料了但是還能接收資料,己方(服務端)是否現在關閉傳送資料通道,需要上層應用來決定,因此,己方 ACK 和 FIN 一般都會分開傳送。

4.2 為什麼三次握手是三次?

  • 也可以理解為,為什麼TCP客戶端最後還要傳送一次確認呢?
1) 主要防止已經失效的連線請求報文突然又傳送到了伺服器,從而產生錯誤。
2) 如果採用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文並且回覆了確認報文,但是客戶端不會再次發出
確認。由於伺服器收不到確認,就知道客戶端並沒有請求連線。

4.3 為什麼四次揮手是四次?

  • 因為揮手過程中有一個半關閉狀態
	在半關閉狀態下,客戶端沒有請求/資料需要向服務端傳輸(即客戶端不再傳送資料給服務端,但能接收資料),但是服務端需要持續
的連線客戶端,下載資料。所以,在客戶端申請了斷開連線的請求後,會等待服務端確認並且提出斷開請求後,才會斷聯。
  • 所以,在服務端下載完資料前,不會傳送斷開請求,這是揮手需要四次的原因。

4.4 為什麼客戶端最後還要等待2MSL?

  • 客戶端需要保證最後一次傳送的ACK報文到伺服器,如果伺服器未收到,可以請求客戶端重發,這樣客戶端還有時間再發,重啟2MSL計時。

4.5 如果已經建立了連線,但是客戶端突然出現故障了怎麼辦?

  • TCP還設有一個保活計時器,顯然,客戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。
  • 伺服器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設定為2小時,若兩小時還沒有收到客戶端的任何資料,伺服器就會傳送一個探測報文段,以後每隔75分鐘傳送一次。若一連傳送10個探測報文仍然沒反應,伺服器就認為客戶端出了故障,接著就關閉連線。

相關文章