圖解網(wǎng)絡(luò):TCP三次握手背后的原理,為啥兩次握手不可以?
TCP是 Internet 協(xié)議套件的主要協(xié)議之一,它位于應(yīng)用層和網(wǎng)絡(luò)層之間,用于提供可靠的連接服務(wù),是一種面向連接的通信協(xié)議,有助于通過網(wǎng)絡(luò)在不同設(shè)備之間交換消息。
提到TCP,那么一定就會提到TCP的三次握手,這個是TCP連接核心中的核心,那么TCP三次握手是怎么樣的過程,有什么優(yōu)秀的設(shè)計之處呢?
今天瑞哥帶您用圖解的形式好好的解釋一波,讓我們直接開始吧。
什么是TCP?
- 英文全稱:Transmission Control Protocol
- 中文名稱:傳輸控制協(xié)議
TCP是一種面向連接的協(xié)議,可確保將數(shù)據(jù)完整地傳送到其目的地,TCP 首先通過使用 TCP 三向握手與每個主機(jī)上的 TCP 端口建立會話,然后它以數(shù)據(jù)包的形式傳輸數(shù)據(jù),每個數(shù)據(jù)包都有一個序列號,當(dāng)在目的地收到數(shù)據(jù)包時,TCP 會向發(fā)送主機(jī)生成確認(rèn),如果未收到序列中的數(shù)據(jù)包,則發(fā)送主機(jī)上的 TCP 在一定時間間隔后重新傳輸數(shù)據(jù)包。
TCP三次握手
TCP 在建立和關(guān)閉兩個設(shè)備之間的連接期間會發(fā)生 3 次握手過程,也就是建立和關(guān)閉連接需要經(jīng)歷三個步驟,下面我們來詳細(xì)的了解一下這三個過程。
生活中的三次握手
我們先以生活中的例子形象的說明一下三次握手過程:
生活中的三次握手
小明想打電話給小美,但是不確定對方是不是小美,所以會經(jīng)歷以下過程:
- 小明:你好,請問是小美嗎?【第一次握手】
- 小美:是的,我是小美。【第二次握手】
- 小明:好的,我知道你是小美了?!镜谌挝帐帧?/li>
經(jīng)歷三次握手后,小明可以可以很明確的確定對方就是小美,非常可靠!
假如只有一次握手,那么小明問完“你好,請問是小美嗎?”,小明壓根不確定對方有沒有收到這個問候,更不要談對方是否是小美了。
假如只有兩次握手,那么小明收到小美的“是的,我是小美?!钡幕貜?fù)后,小美是不知道小明是否收到她的回復(fù),所以接下來她不確定是否要跟電話中詢問她的人通信。
所以三次握手剛剛好。
專業(yè)角度的三次握手
下面我們來看下專業(yè)的三次握手。
三次握手涉及到的專業(yè)名詞
服務(wù)端:服務(wù)端是專用于運行服務(wù)以滿足其他計算機(jī)需求的物理計算機(jī)
客戶端-服務(wù)端
- 客戶端:客戶端是訪問服務(wù)器提供的服務(wù)的計算機(jī)硬件設(shè)備或軟件
- SYN:同步序列號(Synchronize Sequence Number),這是從客戶端到服務(wù)端的第一個數(shù)據(jù)包,可以描述為建立連接的請求,如果 SYN 為 1,則表示設(shè)備要建立安全連接,否則不。
SYN抓包
ACK:確認(rèn)(Acknowledgement),可以說是SYN的響應(yīng),如果 ACK 為 1,則設(shè)備已收到 SYN 消息并確認(rèn),否則沒有。
ACK抓包
三次握手步驟
三次握手步驟
第一步:客戶端將 SYN 標(biāo)志設(shè)置為 1 將消息發(fā)送到服務(wù)端。
第二步:服務(wù)端通過將 ACK 標(biāo)志設(shè)置為 1 來確認(rèn)客戶端請求。
第三步:客戶端收到來自服務(wù)端的同步(SYN)后,向服務(wù)端發(fā)送確認(rèn)(ACK)。
從客戶端得到(ACK)后,客戶端和服務(wù)端之間建立連接,現(xiàn)在數(shù)據(jù)可以在客戶端和服務(wù)器端之間傳輸。
更詳細(xì)的過程
三次握手更詳細(xì)的過程
第一步:TCP客戶端向服務(wù)端發(fā)送 TCP SYN 數(shù)據(jù)包來開始連接,數(shù)據(jù)包包含一個隨機(jī)序列號n,它表示客戶端應(yīng)傳輸?shù)臄?shù)據(jù)的序列號的開始。
第二步:服務(wù)端收到數(shù)據(jù)包,并用它的序列號(m)進(jìn)行響應(yīng),它的響應(yīng)還包括確認(rèn)號,即客戶端的序列號加 1,此處為n+1。
第三步:客戶端通過發(fā)送確認(rèn)號來響應(yīng)服務(wù)器,該確認(rèn)號是服務(wù)端的序列號加 1,此處為m+1.
TCP三次握手抓包分析
再多的理論不經(jīng)過實踐都是徒勞,所以驗證我們理論的最好的方式就是抓包看一下TCP三次握手過程。
TCP三次握手抓包分析
如圖,主機(jī)172.16.16.128:2826和主機(jī)212.58.226.142:80建立三次握手過程:
- 第一步:主機(jī)172.16.16.128:2826向主機(jī)212.58.226.142:80發(fā)送[SYN] Seq=0
- 第二步:主機(jī)212.58.226.142:80向主機(jī)172.16.16.128:2826發(fā)送[SYN,ACK] Seq=0,Ack=1
- 第三步:主機(jī)172.16.16.128:2826向主機(jī)212.58.226.142:80發(fā)送[ACK] Seq=1,Ack=1
這就是詳細(xì)的三次握手報文,我覺得此時此刻,大家可以打開自己的wireshark抓包工具盡情的體驗一下TCP三次握手的神奇之處了。
TCP窗口
大家在看上圖中的wireshark抓包截圖的時候,肯定注意到了Win=8192的字眼,這個就是TCP窗口。
客戶端向服務(wù)端發(fā)送一堆數(shù)據(jù),然后服務(wù)端驗證所有數(shù)據(jù)包級別的校驗和并發(fā)送一個ACK數(shù)據(jù)包,表明一切數(shù)據(jù)都已正確接收。
如果沒有收到所有內(nèi)容,則需要重新傳輸部分或全部數(shù)據(jù),每個設(shè)備都維護(hù)一個所有數(shù)據(jù)的緩沖區(qū),以防需要再次發(fā)送,接收到 ACK 數(shù)據(jù)包意味著設(shè)備可以將舊數(shù)據(jù)從緩沖區(qū)中清除。
TCP 窗口
TCP 窗口就是在接收到 ACK 之前可以發(fā)送的最大字節(jié)數(shù)。
如果網(wǎng)絡(luò)不可靠,最好將TCP 窗口設(shè)置小一點,這樣,如果出現(xiàn)問題,就不必重新傳輸非常大的數(shù)據(jù)。
TCP還有一個絕佳的設(shè)計,那就是滑動窗口,即設(shè)備可以動態(tài)更改窗口大小,在擁塞時將窗口縮小,在正常時將窗口放大。
其他參數(shù)
抓包截圖中不僅僅有TCP 窗口,還有其他的參數(shù):
- MSS(Maximum Segment Size),最大段大小。
- WS(Windows Scaling),用于控制最大 TCP 接收窗口大小。
TCP為什么不能二次握手建立連接
我們要知道Server 和 Client 想要建立連接,必須滿足以下四個條件:
- 服務(wù)端需要確認(rèn)服務(wù)端可以從客戶端接收數(shù)據(jù)包
- 客戶端需要確認(rèn)客戶端可以從服務(wù)端接收數(shù)據(jù)包
- 客戶端需要確認(rèn)服務(wù)端可以從客戶端接收數(shù)據(jù)包
- 服務(wù)端需要確認(rèn)客戶端可以從服務(wù)端接收數(shù)據(jù)包
四個條件看起來很繞,其實說白了就是:
- 小明問:“你好,請問時小美嗎?”:發(fā)送成功后,小明確定可以他從小美接收信息,驗證了第一個條件【服務(wù)端需要確認(rèn)服務(wù)端可以從客戶端接收數(shù)據(jù)包】
- 小美回:“是的,我是小美”:發(fā)送成功后,小美確定她可以從小明接收信息,也能確認(rèn)小明可以從她這邊接收信息,驗證了第二、第三個條件【客戶端需要確認(rèn)客戶端可以從服務(wù)端接收數(shù)據(jù)包】【客戶端需要確認(rèn)服務(wù)端可以從客戶端接收數(shù)據(jù)包】
- 小明回:“好的,我知道你是小美了”:發(fā)送成功后,小明確定可以小美可以從他這邊接收信息,驗證了四個條件【服務(wù)端需要確認(rèn)客戶端可以從服務(wù)端接收數(shù)據(jù)包】
TCP 是一種雙向通信協(xié)議,這意味著任何一端都應(yīng)該能夠可靠地發(fā)送數(shù)據(jù),所以三次握手剛剛好。