在Linux(以及其他支援TCP/IP協議的作業系統)中,TCP(Transmission Control Protocol,傳輸控制協議)為了建立一個可靠的資料傳輸連線,採用了三次握手(Three-way Handshake)的過程來初始化連線。以下是TCP三次握手的詳細步驟和解釋:
-
第一次握手(SYN):
- 客戶端(Client)想要與伺服器(Server)建立連線時,它會隨機生成一個初始序列號(ISN),併傳送一個SYN(同步)段給伺服器,請求建立連線。此訊息中包含了客戶端的初始序列號(ISN_C)。
Client -> Server: SYN (ISN_C)
這個階段客戶端的狀態變為
SYN_SENT
。 -
第二次握手(SYN+ACK):
- 伺服器接收到客戶端的SYN訊息後,會回覆一個SYN+ACK訊息。伺服器會確認客戶端的SYN(即ACK(Acknowledgment)欄位填入ISN_C + 1),同時也會生成自己的初始序列號(ISN_S),並將其包含在SYN訊息中傳送給客戶端。
Server -> Client: SYN (ISN_S), ACK (ISN_C + 1)
此時,伺服器進入
SYN_RECEIVED
狀態。 -
第三次握手(ACK):
- 客戶端收到伺服器的SYN+ACK訊息後,確認伺服器的SYN(ACK欄位填入ISN_S + 1),並向伺服器傳送一個ACK訊息,表示客戶端同意建立連線。
Client -> Server: ACK (ISN_S + 1)
客戶端收到伺服器的ACK確認後,連線正式建立,客戶端和伺服器的狀態都轉變為
ESTABLISHED
。
綜上所述,透過三次握手,雙方能夠互相確認對方的接收能力和傳送能力,並且協商了一套雙方都認可的初始序列號,以便後續資料傳輸時進行校驗和避免資料丟失。在三次握手過程中,雙方都得到了一次相互的確認,保證了連線的可靠性。只有當三次握手全部完成後,客戶端和伺服器才會開始交換資料。