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