三次握手
三次握手(Three-Way Handshake)是 TCP/IP 協議中建立連線的過程,它用於確保通訊雙方都能準備好開始資料傳輸,並且能同步雙方的初始序列號。三次握手是一個可靠的連線建立過程,目的是為了確保雙方的連線狀態一致,且資料傳輸能夠順利進行。
三次握手的步驟
三次握手的過程是透過三個資料包來完成的,它的步驟如下:
-
客戶端 → 伺服器:SYN(同步請求)
客戶端首先向伺服器傳送一個 SYN(Synchronize)包,用來請求建立連線。這個包包含客戶端的初始序列號(Seq
),即客戶端從哪個序列號開始傳送資料。此時,客戶端處於 SYN_SEND 狀態。傳送的包格式:
- SYN = 1
- Seq = X(客戶端的初始序列號)
-
伺服器 → 客戶端:SYN + ACK(同步應答)
伺服器收到客戶端的 SYN 包後,回覆一個 SYN + ACK(同步應答)包,表示同意建立連線,並將自己的初始序列號Seq
設定為伺服器選擇的初始序列號(Y
)。同時,伺服器會將客戶端的序列號加 1 作為應答號(Ack = X + 1
),以告訴客戶端它已經成功接收到客戶端的請求。傳送的包格式:
- SYN = 1
- ACK = 1
- Seq = Y(伺服器的初始序列號)
- Ack = X + 1(確認客戶端的序列號)
-
客戶端 → 伺服器:ACK(確認)
客戶端收到伺服器的 SYN + ACK 包後,會傳送一個確認包 ACK,表示自己已經接收到伺服器的應答,並且確認序列號為Y + 1
。此時,客戶端和伺服器之間的連線就正式建立起來了。傳送的包格式:
- SYN = 0
- ACK = 1
- Seq = X + 1(客戶端確認號)
- Ack = Y + 1(確認伺服器的序列號)
三次握手的狀態變化
-
客戶端:
- CLOSED → SYN_SENT(傳送 SYN 包)
- SYN_SENT → ESTABLISHED(接收到 ACK 包,連線建立成功)
-
伺服器:
- CLOSED → LISTEN(等待客戶端的連線請求)
- LISTEN → SYN_RECEIVED(接收到 SYN 包,傳送 SYN + ACK 包)
- SYN_RECEIVED → ESTABLISHED(接收到客戶端的 ACK 包,連線建立成功)
三次握手的作用
- 同步序列號:三次握手過程中,雙方會交換初始的序列號,確保後續資料傳輸時雙方的序列號是同步的。每次連線的建立都會選擇新的序列號。
- 確認雙方的接收能力:三次握手確保雙方都可以接收資料,並且知道對方可以傳送和接收資料。
- 建立連線時的確認機制:透過三次握手,雙方可以確認對方的存在、連線能力以及對資料包的響應能力。
為什麼是三次?
- 第一次握手:客戶端傳送一個 SYN 包,告知伺服器自己希望建立連線,並同步初始序列號。
- 第二次握手:伺服器收到客戶端的 SYN 包後,傳送一個 SYN + ACK 包,表示自己同意建立連線,並確認客戶端的序列號。
- 第三次握手:客戶端收到伺服器的 SYN + ACK 包後,傳送一個 ACK 包,表示確認接收到伺服器的序列號和連線建立請求。
只有在這三次交換完成後,客戶端和伺服器才能正式開始資料通訊。
三次握手與可靠性
三次握手的三個步驟,確保了以下幾個方面的可靠性:
- 雙方的確認:透過交換序列號和確認號,確保雙方的初始連線序列號一致。
- 連線的雙向確認:客戶端和伺服器都會明確地確認對方是否準備好建立連線。
- 防止舊連線干擾:由於每次建立連線都會選擇新的序列號,這避免了過去的連線對新連線產生干擾。
三次握手與四次揮手的對比
- 三次握手用於連線的建立,確保通訊雙方準備好進行資料傳輸。
- 四次揮手用於連線的終止,確保雙方都沒有更多的資料需要傳送,從而安全關閉連線。
舉個簡單例子
假設有一個客戶端和伺服器:
-
客戶端 → 伺服器:SYN
客戶端想要與伺服器建立連線,傳送一個帶有 SYN 標誌的資料包,告訴伺服器開始連線。
SYN = 1, Seq = X
-
伺服器 → 客戶端:SYN + ACK
伺服器收到客戶端的 SYN 包後,響應一個帶有 SYN 和 ACK 標誌的資料包,表示同意連線。伺服器還會隨機選擇自己的初始序列號。
SYN = 1, ACK = 1, Seq = Y, Ack = X + 1
-
客戶端 → 伺服器:ACK
客戶端收到伺服器的 SYN + ACK 包後,向伺服器傳送一個帶 ACK 標誌的資料包,表示自己也收到了伺服器的序列號,連線正式建立。
ACK = 1, Seq = X + 1, Ack = Y + 1
透過這三次資料包交換,客戶端和伺服器之間的連線正式建立,雙方可以開始資料傳輸。
總結
三次握手是 TCP/IP 協議中用於建立連線的過程,確保了雙方的通訊雙方的同步和確認。在這個過程中,客戶端和伺服器交換了初始序列號,確保了雙方的連線狀態一致,能夠安全有效地開始資料傳輸。
四次揮手(Four-Way Handshake)是指在 TCP 協議中,關閉一個連線的過程。它是 TCP 連線終止的標準過程。四次揮手確保了雙方都可以正常關閉連線,且資料傳輸的完整性得到保證。
在 TCP 協議中,資料傳輸是透過 三次握手(Three-Way Handshake)建立連線的,而斷開連線則需要透過四次揮手。
四次揮手
四次揮手的過程
四次揮手的過程如下:
-
客戶端發起連線終止(FIN):
- 客戶端(主動關閉方)向伺服器傳送一個 FIN(Finish)報文段,表示客戶端的資料已經傳送完畢,希望關閉連線。
- 客戶端進入 FIN_WAIT_1 狀態,等待伺服器的確認。
-
伺服器確認客戶端的請求(ACK):
- 伺服器收到客戶端的 FIN 請求後,傳送一個 ACK 報文段作為確認,確認號是客戶端的 SEQ + 1。
- 伺服器進入 CLOSE_WAIT 狀態。
-
伺服器傳送連線終止(FIN):
- 伺服器傳送一個 FIN 報文段,表示伺服器也已經沒有資料要傳送了,準備關閉連線。
- 伺服器進入 LAST_ACK 狀態,等待客戶端的確認。
-
客戶端確認伺服器的請求(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 協議中,連線是全雙工的,即每一方向的資料傳輸是獨立的。因此,客戶端和伺服器需要分別確認各自的資料已經傳送完畢,才能安全地關閉連線。
- 第一步:客戶端希望關閉連線,傳送 FIN,表示客戶端沒有資料要傳送了。
- 第二步:伺服器收到 FIN 後,傳送 ACK,表示確認客戶端沒有資料要傳送了,但伺服器可能仍然有資料要傳送。
- 第三步:伺服器傳送 FIN,表示伺服器也沒有資料要傳送了,準備關閉連線。
- 第四步:客戶端收到伺服器的 FIN 後,傳送 ACK,確認連線的關閉。
四次揮手與三次握手的區別:
- 三次握手用於連線的建立,確保雙方都準備好開始通訊。
- 四次揮手用於連線的關閉,確保雙方都能安全地關閉連線,防止資料丟失。
示例:
- 客戶端 → 伺服器:
FIN
- 伺服器 → 客戶端:
ACK
(確認收到FIN
) - 伺服器 → 客戶端:
FIN
- 客戶端 → 伺服器:
ACK
(確認收到伺服器的FIN
)
在四次揮手完成後,TCP 連線會被完全關閉,雙方的通訊完全結束。
總結:
四次揮手是 TCP 連線斷開的標準過程,透過這種方式,雙方確保各自的所有資料都已經成功傳輸,並且在適當的時機安全地關閉連線。