在Linux中,如何理解Tcp/ip協議三次握手?

黄嘉波發表於2024-03-13

在Linux(以及其他支援TCP/IP協議的作業系統)中,TCP(Transmission Control Protocol,傳輸控制協議)為了建立一個可靠的資料傳輸連線,採用了三次握手(Three-way Handshake)的過程來初始化連線。以下是TCP三次握手的詳細步驟和解釋:

  1. 第一次握手(SYN)

    • 客戶端(Client)想要與伺服器(Server)建立連線時,它會隨機生成一個初始序列號(ISN),併傳送一個SYN(同步)段給伺服器,請求建立連線。此訊息中包含了客戶端的初始序列號(ISN_C)。
    Client -> Server: SYN (ISN_C)
    

    這個階段客戶端的狀態變為SYN_SENT

  2. 第二次握手(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狀態。

  3. 第三次握手(ACK)

    • 客戶端收到伺服器的SYN+ACK訊息後,確認伺服器的SYN(ACK欄位填入ISN_S + 1),並向伺服器傳送一個ACK訊息,表示客戶端同意建立連線。
    Client -> Server: ACK (ISN_S + 1)
    

    客戶端收到伺服器的ACK確認後,連線正式建立,客戶端和伺服器的狀態都轉變為ESTABLISHED

綜上所述,透過三次握手,雙方能夠互相確認對方的接收能力和傳送能力,並且協商了一套雙方都認可的初始序列號,以便後續資料傳輸時進行校驗和避免資料丟失。在三次握手過程中,雙方都得到了一次相互的確認,保證了連線的可靠性。只有當三次握手全部完成後,客戶端和伺服器才會開始交換資料。

相關文章