為什么TCP需要三次握手?一文講透!

哈嘍,小伙伴們!今天小米要給大家帶來的是網絡基礎中的一顆明珠——TCP三次握手。作為程序員的你,是不是常常聽到這個詞,卻又對它的具體過程和原理有些模糊呢?別擔心,今天我們就來深入淺出地聊聊這個話題,讓你徹底搞清楚TCP三次握手的奧秘!
什么是TCP三次握手?
TCP三次握手是TCP協議建立連接的過程。簡單來說,它是客戶端和服務端在正式傳輸數據之前,進行的一種“握手”操作,通過這種操作,雙方能夠確認彼此的存在,并同步彼此的狀態。具體來說,TCP三次握手分為以下三個步驟:
1. 第一次握手:客戶端發送SYN包
首先,客戶端向服務端發送一個帶有SYN(Synchronize)標志的數據包,這個包用來表示客戶端希望建立連接,并且在包中包含了一個初始序列號(Sequence Number)。發送這個包之后,客戶端進入SYN_SENT狀態,等待服務端的響應。
2. 第二次握手:服務端發送SYN/ACK包
當服務端收到客戶端的SYN包后,會發送一個帶有SYN和ACK(Acknowledgment)標志的數據包作為響應,這個包中包含了服務端自己的初始序列號,同時對客戶端的序列號進行確認(ACK)。發送這個包后,服務端進入SYN_RCVD狀態,等待客戶端的確認。
3. 第三次握手:客戶端發送ACK包
最后,客戶端收到服務端的SYN/ACK包后,會發送一個帶有ACK標志的數據包,表示確認收到了服務端的SYN包,同時也帶上了自己對服務端序列號的確認。發送這個包后,客戶端進入ESTABLISHED狀態,服務端收到這個ACK包后,也進入ESTABLISHED狀態,此時,連接正式建立,雙方可以開始數據傳輸了。
為什么需要三次握手?
可能有的小伙伴會問了,為什么要這么復雜,要三次握手呢?兩次握手不行嗎?這里,小米就來詳細解釋一下。
建立可靠的通信信道:首先,TCP協議是一種面向連接的、可靠的傳輸協議。在通信過程中,為了保證數據的完整性和可靠性,TCP需要確保客戶端和服務端雙方都具備發送和接收數據的能力。三次握手正是為了達到這個目的。
防止已失效的請求報文:假設只進行兩次握手,那么會存在一種情況:假如客戶端發出的第一個SYN包由于網絡問題延遲到達,當這個包到達服務端時,客戶端可能已經不再需要建立連接了。如果此時服務端收到這個SYN包,并且返回一個ACK包,連接就會建立起來,但實際上客戶端并不需要這個連接,從而浪費了資源。而三次握手可以有效避免這種情況。
確認雙方序列號:在TCP通信中,序列號是非常重要的。它用于標識數據包,并且在數據傳輸過程中起到跟蹤和確認的作用。通過三次握手,客戶端和服務端可以相互告知各自的初始序列號,并確認對方已經收到了這個序列號,從而確保雙方的通信是可靠和同步的。
為什么兩次握手不行?
兩次握手的問題主要體現在以下幾個方面:
防止已失效的請求報文:如上所述,兩次握手無法有效防止已失效的請求報文導致的資源浪費問題。而三次握手通過客戶端的最后一個ACK包來確認服務端的SYN/ACK包,從而避免了這種情況的發生。
確保雙向通信的可靠性:兩次握手只能保證單向通信的可靠性。TCP通信要求雙方都能確認對方的初始序列號,從而實現可靠的數據傳輸。如果只進行兩次握手,只有連接發起方的初始序列號能被確認,而對方的序列號無法確認,這樣就無法保證雙向通信的可靠性。
確保連接的同步:三次握手的過程確保了連接的同步。客戶端和服務端通過三次握手可以確認彼此的存在,并且同步各自的狀態和序列號,從而為后續的數據傳輸打下堅實的基礎。
TCP三次握手的過程詳解
第一次握手:SYN包的發送和接收
當客戶端希望與服務端建立連接時,會發送一個SYN包,這個包中包含了客戶端的初始序列號。這個序列號用于標識客戶端即將發送的數據包,并且在后續的通信中起到跟蹤和確認的作用。發送SYN包后,客戶端進入SYN_SENT狀態,等待服務端的響應。
服務端收到SYN包后,會分配資源來處理這個連接請求,并生成一個自己的初始序列號。然后,服務端會發送一個SYN/ACK包給客戶端,這個包中包含了服務端的初始序列號,以及對客戶端序列號的確認。發送SYN/ACK包后,服務端進入SYN_RCVD狀態,等待客戶端的確認。
第二次握手:SYN/ACK包的發送和接收
客戶端收到服務端的SYN/ACK包后,會檢查其中的確認信息,以確保服務端正確接收了自己的序列號。同時,客戶端也會生成一個ACK包來確認服務端的序列號。這個ACK包表示客戶端已經收到了服務端的SYN/ACK包,并且確認了其中的序列號。發送ACK包后,客戶端進入ESTABLISHED狀態,等待服務端的確認。
服務端收到ACK包后,會檢查其中的確認信息,以確保客戶端正確接收了自己的序列號。此時,服務端進入ESTABLISHED狀態,表示連接已經建立,雙方可以開始數據傳輸了。
第三次握手:ACK包的發送和接收
在第三次握手中,客戶端發送的ACK包包含了對服務端序列號的確認。這個包表示客戶端已經收到了服務端的SYN/ACK包,并且確認了其中的序列號。發送ACK包后,客戶端進入ESTABLISHED狀態,表示連接已經建立。
服務端收到ACK包后,會檢查其中的確認信息,以確保客戶端正確接收了自己的序列號。此時,服務端也進入ESTABLISHED狀態,表示連接已經建立,雙方可以開始數據傳輸了。
END
通過三次握手,TCP協議確保了客戶端和服務端雙方都具備發送和接收數據的能力,從而建立了可靠的通信信道。這種設計不僅避免了已失效的請求報文導致的資源浪費問題,還確保了雙向通信的可靠性和連接的同步。

























