TCP協議中的三次握手與四次揮手

Better-HTQ發表於2024-11-06

三次握手

三次握手(Three-Way Handshake)是 TCP/IP 協議中建立連線的過程,它用於確保通訊雙方都能準備好開始資料傳輸,並且能同步雙方的初始序列號。三次握手是一個可靠的連線建立過程,目的是為了確保雙方的連線狀態一致,且資料傳輸能夠順利進行。

三次握手的步驟

三次握手的過程是透過三個資料包來完成的,它的步驟如下:

  1. 客戶端 → 伺服器:SYN(同步請求)
    客戶端首先向伺服器傳送一個 SYN(Synchronize)包,用來請求建立連線。這個包包含客戶端的初始序列號(Seq),即客戶端從哪個序列號開始傳送資料。此時,客戶端處於 SYN_SEND 狀態。

    傳送的包格式:

    • SYN = 1
    • Seq = X(客戶端的初始序列號)
  2. 伺服器 → 客戶端:SYN + ACK(同步應答)
    伺服器收到客戶端的 SYN 包後,回覆一個 SYN + ACK(同步應答)包,表示同意建立連線,並將自己的初始序列號 Seq 設定為伺服器選擇的初始序列號(Y)。同時,伺服器會將客戶端的序列號加 1 作為應答號(Ack = X + 1),以告訴客戶端它已經成功接收到客戶端的請求。

    傳送的包格式:

    • SYN = 1
    • ACK = 1
    • Seq = Y(伺服器的初始序列號)
    • Ack = X + 1(確認客戶端的序列號)
  3. 客戶端 → 伺服器:ACK(確認)
    客戶端收到伺服器的 SYN + ACK 包後,會傳送一個確認包 ACK,表示自己已經接收到伺服器的應答,並且確認序列號為 Y + 1。此時,客戶端和伺服器之間的連線就正式建立起來了。

    傳送的包格式:

    • SYN = 0
    • ACK = 1
    • Seq = X + 1(客戶端確認號)
    • Ack = Y + 1(確認伺服器的序列號)

三次握手的狀態變化

  1. 客戶端

    • CLOSEDSYN_SENT(傳送 SYN 包)
    • SYN_SENTESTABLISHED(接收到 ACK 包,連線建立成功)
  2. 伺服器

    • CLOSEDLISTEN(等待客戶端的連線請求)
    • LISTENSYN_RECEIVED(接收到 SYN 包,傳送 SYN + ACK 包)
    • SYN_RECEIVEDESTABLISHED(接收到客戶端的 ACK 包,連線建立成功)

三次握手的作用

  • 同步序列號:三次握手過程中,雙方會交換初始的序列號,確保後續資料傳輸時雙方的序列號是同步的。每次連線的建立都會選擇新的序列號。
  • 確認雙方的接收能力:三次握手確保雙方都可以接收資料,並且知道對方可以傳送和接收資料。
  • 建立連線時的確認機制:透過三次握手,雙方可以確認對方的存在、連線能力以及對資料包的響應能力。

為什麼是三次?

  1. 第一次握手:客戶端傳送一個 SYN 包,告知伺服器自己希望建立連線,並同步初始序列號。
  2. 第二次握手:伺服器收到客戶端的 SYN 包後,傳送一個 SYN + ACK 包,表示自己同意建立連線,並確認客戶端的序列號。
  3. 第三次握手:客戶端收到伺服器的 SYN + ACK 包後,傳送一個 ACK 包,表示確認接收到伺服器的序列號和連線建立請求。

只有在這三次交換完成後,客戶端和伺服器才能正式開始資料通訊。

三次握手與可靠性

三次握手的三個步驟,確保了以下幾個方面的可靠性:

  • 雙方的確認:透過交換序列號和確認號,確保雙方的初始連線序列號一致。
  • 連線的雙向確認:客戶端和伺服器都會明確地確認對方是否準備好建立連線。
  • 防止舊連線干擾:由於每次建立連線都會選擇新的序列號,這避免了過去的連線對新連線產生干擾。

三次握手與四次揮手的對比

  • 三次握手用於連線的建立,確保通訊雙方準備好進行資料傳輸。
  • 四次揮手用於連線的終止,確保雙方都沒有更多的資料需要傳送,從而安全關閉連線。

舉個簡單例子

假設有一個客戶端和伺服器:

  1. 客戶端 → 伺服器:SYN
    客戶端想要與伺服器建立連線,傳送一個帶有 SYN 標誌的資料包,告訴伺服器開始連線。
    SYN = 1, Seq = X

  2. 伺服器 → 客戶端:SYN + ACK
    伺服器收到客戶端的 SYN 包後,響應一個帶有 SYN 和 ACK 標誌的資料包,表示同意連線。伺服器還會隨機選擇自己的初始序列號。
    SYN = 1, ACK = 1, Seq = Y, Ack = X + 1

  3. 客戶端 → 伺服器:ACK
    客戶端收到伺服器的 SYN + ACK 包後,向伺服器傳送一個帶 ACK 標誌的資料包,表示自己也收到了伺服器的序列號,連線正式建立。
    ACK = 1, Seq = X + 1, Ack = Y + 1

透過這三次資料包交換,客戶端和伺服器之間的連線正式建立,雙方可以開始資料傳輸。

總結

三次握手是 TCP/IP 協議中用於建立連線的過程,確保了雙方的通訊雙方的同步和確認。在這個過程中,客戶端和伺服器交換了初始序列號,確保了雙方的連線狀態一致,能夠安全有效地開始資料傳輸。

四次揮手(Four-Way Handshake)是指在 TCP 協議中,關閉一個連線的過程。它是 TCP 連線終止的標準過程。四次揮手確保了雙方都可以正常關閉連線,且資料傳輸的完整性得到保證。

在 TCP 協議中,資料傳輸是透過 三次握手(Three-Way Handshake)建立連線的,而斷開連線則需要透過四次揮手。

四次揮手

四次揮手的過程

四次揮手的過程如下:

  1. 客戶端發起連線終止(FIN)

    • 客戶端(主動關閉方)向伺服器傳送一個 FIN(Finish)報文段,表示客戶端的資料已經傳送完畢,希望關閉連線。
    • 客戶端進入 FIN_WAIT_1 狀態,等待伺服器的確認。
  2. 伺服器確認客戶端的請求(ACK)

    • 伺服器收到客戶端的 FIN 請求後,傳送一個 ACK 報文段作為確認,確認號是客戶端的 SEQ + 1
    • 伺服器進入 CLOSE_WAIT 狀態。
  3. 伺服器傳送連線終止(FIN)

    • 伺服器傳送一個 FIN 報文段,表示伺服器也已經沒有資料要傳送了,準備關閉連線。
    • 伺服器進入 LAST_ACK 狀態,等待客戶端的確認。
  4. 客戶端確認伺服器的請求(ACK)

    • 客戶端收到伺服器的 FIN 報文後,傳送一個 ACK 報文段作為確認,確認號是伺服器的 SEQ + 1
    • 客戶端進入 TIME_WAIT 狀態,等待可能存在的延遲的 ACK 報文段。
    • 客戶端等待一段時間(通常是 2MSL,最大報文段生存時間)以確保伺服器收到了確認,然後進入 CLOSED 狀態,連線完全關閉。

四次揮手過程的狀態變化:

  • 客戶端狀態

    • FIN_WAIT_1:等待伺服器確認關閉連線。
    • FIN_WAIT_2:等待伺服器傳送關閉請求。
    • TIME_WAIT:等待可能延遲的包到達,確保伺服器收到確認。
    • CLOSED:連線完全關閉。
  • 伺服器狀態

    • CLOSE_WAIT:等待應用層關閉連線。
    • LAST_ACK:等待客戶端確認關閉連線。
    • CLOSED:連線完全關閉。

為什麼是四次?

四次揮手的原因是,在 TCP 協議中,連線是全雙工的,即每一方向的資料傳輸是獨立的。因此,客戶端和伺服器需要分別確認各自的資料已經傳送完畢,才能安全地關閉連線。

  1. 第一步:客戶端希望關閉連線,傳送 FIN,表示客戶端沒有資料要傳送了。
  2. 第二步:伺服器收到 FIN 後,傳送 ACK,表示確認客戶端沒有資料要傳送了,但伺服器可能仍然有資料要傳送。
  3. 第三步:伺服器傳送 FIN,表示伺服器也沒有資料要傳送了,準備關閉連線。
  4. 第四步:客戶端收到伺服器的 FIN 後,傳送 ACK,確認連線的關閉。

四次揮手與三次握手的區別:

  • 三次握手用於連線的建立,確保雙方都準備好開始通訊。
  • 四次揮手用於連線的關閉,確保雙方都能安全地關閉連線,防止資料丟失。

示例:

  1. 客戶端 → 伺服器: FIN
  2. 伺服器 → 客戶端: ACK(確認收到 FIN
  3. 伺服器 → 客戶端: FIN
  4. 客戶端 → 伺服器: ACK(確認收到伺服器的 FIN

在四次揮手完成後,TCP 連線會被完全關閉,雙方的通訊完全結束。

總結:

四次揮手是 TCP 連線斷開的標準過程,透過這種方式,雙方確保各自的所有資料都已經成功傳輸,並且在適當的時機安全地關閉連線。

相關文章