圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

2022.07.08
圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

TCP 是一種雙向通信協議,這意味著任何一端都應該能夠可靠地發送數據,所以三次握手剛剛好。

TCP是Internet 協議套件的主要協議之一,它位於應用層和網絡層之間,用於提供可靠的連接服務,是一種面向連接的通信協議,有助於通過網絡在不同設備之間交換消息。

提到TCP,那麼一定就會提到TCP的三次握手,這個是TCP連接核心中的核心,那麼TCP三次握手是怎麼樣的過程,有什麼優秀的設計之處呢?

今天瑞哥帶您用圖解的形式好好的解釋一波,讓我們直接開始吧。

什麼是TCP?

  • 英文全稱:Transmission Control Protocol
  • 中文名稱:傳輸控制協議

TCP是一種面向連接的協議,可確保將數據完整地傳送到其目的地,TCP 首先通過使用TCP 三向握手與每個主機上的TCP 端口建立會話,然後它以數據包的形式傳輸數據,每個數據包都有一個序列號,當在目的地收到數據包時,TCP 會向發送主機生成確認,如果未收到序列中的數據包,則發送主機上的TCP 在一定時間間隔後重新傳輸數據包。

TCP三次握手

TCP 在建立和關閉兩個設備之間的連接期間會發生3 次握手過程,也就是建立和關閉連接需要經曆三個步驟,下面我們來詳細的了解一下這三個過程。

生活中的三次握手

我們先以生活中的例子形象的說明一下三次握手過程:

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

生活中的三次握手

小明想打電話給小美,但是不確定對方是不是小美,所以會經歷以下過程:

  • 小明:你好,請問是小美嗎?【第一次握手】
  • 小美:是的,我是小美。【第二次握手】
  • 小明:好的,我知道你是小美了。【第三次握手】

經曆三次握手後,小明可以可以很明確的確定對方就是小美,非常可靠!

假如只有一次握手,那麼小明問完“你好,請問是小美嗎?”,小明壓根不確定對方有沒有收到這個問候,更不要談對方是否是小美了。

假如只有兩次握手,那麼小明收到小美的“是的,我是小美。”的回復後,小美是不知道小明是否收到她的回复,所以接下來她不確定是否要跟電話中詢問她的人通信。

所以三次握手剛剛好。

專業角度的三次握手

下面我們來看下專業的三次握手。

三次握手涉及到的專業名詞

服務端:服務端是專用於運行服務以滿足其他計算機需求的物理計算機

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

客戶端-服務端

  • 客戶端:客戶端是訪問服務器提供的服務的計算機硬件設備或軟件
  • SYN:同步序列號(Synchronize Sequence Number),這是從客戶端到服務端的第一個數據包,可以描述為建立連接的請求,如果SYN 為1,則表示設備要建立安全連接,否則不。

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

SYN抓包

ACK:確認(Acknowledgement),可以說是SYN的響應,如果ACK 為1,則設備已收到SYN 消息並確認,否則沒有。

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

ACK抓包

三次握手步驟

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

三次握手步驟

第一步:客戶端將SYN 標誌設置為1 將消息發送到服務端。

第二步:服务端通过将 ACK 标志设置为 1 来确认客户端请求。

第三步:客户端收到来自服务端的同步(SYN)后,向服务端发送确认(ACK)。

从客户端得到(ACK)后,客户端和服务端之间建立连接,现在数据可以在客户端和服务器端之间传输。

更详细的过程

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

三次握手更详细的过程

第一步:TCP客户端向服务端发送 TCP SYN 数据包来开始连接,数据包包含一个随机序列号n,它表示客户端应传输的数据的序列号的开始。

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

第二步:服务端收到数据包,并用它的序列号(m)进行响应,它的响应还包括确认号,即客户端的序列号加 1,此处为n+1。

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

第三步:客户端通过发送确认号来响应服务器,该确认号是服务端的序列号加 1,此处为m+1.

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

TCP三次握手抓包分析

再多的理论不经过实践都是徒劳,所以验证我们理论的最好的方式就是抓包看一下TCP三次握手过程。

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

TCP三次握手抓包分析

如图,主机172.16.16.128:2826和主机212.58.226.142:80建立三次握手过程:

  • 第一步:主机172.16.16.128:2826向主机212.58.226.142:80发送[SYN] Seq=0
  • 第二步:主机212.58.226.142:80向主机172.16.16.128:2826发送[SYN,ACK] Seq=0,Ack=1
  • 第三步:主机172.16.16.128:2826向主机212.58.226.142:80发送[ACK] Seq=1,Ack=1

这就是详细的三次握手报文,我觉得此时此刻,大家可以打开自己的wireshark抓包工具尽情的体验一下TCP三次握手的神奇之处了。

TCP窗口

大家在看上图中的wireshark抓包截图的时候,肯定注意到了Win=8192的字眼,这个就是TCP窗口。

客户端向服务端发送一堆数据,然后服务端验证所有数据包级别的校验和并发送一个ACK数据包,表明一切数据都已正确接收。

如果没有收到所有内容,则需要重新传输部分或全部数据,每个设备都维护一个所有数据的缓冲区,以防需要再次发送,接收到 ACK 数据包意味着设备可以将旧数据从缓冲区中清除。

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

TCP 窗口

TCP 窗口就是在接收到 ACK 之前可以发送的最大字节数。

如果网络不可靠,最好将TCP 窗口设置小一点,这样,如果出现问题,就不必重新传输非常大的数据。

TCP还有一个绝佳的设计,那就是滑动窗口,即设备可以动态更改窗口大小,在拥塞时将窗口缩小,在正常时将窗口放大。

其他参数

抓包截图中不仅仅有TCP 窗口,还有其他的参数:

  • MSS(Maximum Segment Size),最大段大小。
  • WS(Windows Scaling),用于控制最大 TCP 接收窗口大小。

TCP为什么不能二次握手建立连接

我们要知道Server 和 Client 想要建立连接,必须满足以下四个条件:

  • 服务端需要确认服务端可以从客户端接收数据包
  • 客户端需要确认客户端可以从服务端接收数据包
  • 客户端需要确认服务端可以从客户端接收数据包
  • 服务端需要确认客户端可以从服务端接收数据包

四个条件看起来很绕,其实说白了就是:

圖解網絡:TCP三次握手背後的原理,為啥兩次握手不可以?

  • 小明问:“你好,请问时小美吗?”:发送成功后,小明确定可以他从小美接收信息,验证了第一个条件【服务端需要确认服务端可以从客户端接收数据包】
  • 小美回:“是的,我是小美”:发送成功后,小美确定她可以从小明接收信息,也能确认小明可以从她这边接收信息,验证了第二、第三个条件【客户端需要确认客户端可以从服务端接收数据包】【客户端需要确认服务端可以从客户端接收数据包】
  • 小明回:“好的,我知道你是小美了”:发送成功后,小明确定可以小美可以从他这边接收信息,验证了四个条件【服务端需要确认客户端可以从服务端接收数据包】

TCP 是一种双向通信协议,这意味着任何一端都应该能够可靠地发送数据,所以三次握手刚刚好。