如果TCP不握手三次,改成兩次或者四次會怎樣?

2021-12-28 網絡工程師俱樂部

- 這是老楊寫的114篇文章 | 預計閱讀6min -

TCP到底是個啥,又為啥要握手,怎麼握手幾次都還要管,還只能固定握手呢?

哎呀,管好多啊,怎麼肥事……

今天老楊給你重新梳理一遍,適合小白閱讀,轉發收藏一波先

到底啥是TCP?

TCP的中文名叫做傳輸控制協議,是供已經連接網際網路的計算機進行通信的通信協議。

計算機通信協議是對那些計算機必須遵守以便彼此通信的的規則的描述。TCP是網際網路協議之一,也是主要的協議之一。

為啥?

因為它起源於最初的網絡實施,在網絡實施中,它對網際網路協議起到了重要的補充作用。因此,整個套件通常被人稱呼為TCP/IP。

TCP/IP 定義了電子設備(比如計算機)如何連入網際網路,以及數據如何在它們之間傳輸的標準。

TCP主要是給在用IP網絡通信的主機上運行的應用程式之間,提供一種可靠、有序且經過錯誤檢查的八位字節流傳遞。全球資訊網、文件傳輸、遠程管理等主要網際網路應用都依賴於TCP。

如果是那種不需要靠數據流服務的應用程式,就可以使用UDP(用戶數據報協議),它和TCP(傳輸控制協議)不同,前者強調降低延遲,後者強調可靠有序。

再說一點:TCP負責發現傳輸的問題,一有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。而IP則是給網際網路的每一臺電腦規定一個地址。

有小白看到這裡會問,那為啥計算機裡一定要用到「xx協議」來傳輸信息呢?

因為單一的計算機並沒有辦法為人類發揮出最大的效用,只有把一臺又一臺的電腦連接起來,才能發揮出我們現在的功效。

這個連接不僅僅是單純的網絡連接,連起來也並不是簡單的用電線把你的心和我的心串一串就可以解決的,那咋整?

我舉個例子啊:

每個電腦都運行著不同的作業系統,來給你提供對應的服務,對吧?

那麼,電腦基於不同的系統,它們對於同個信息的表達是完全不一樣的,就想美國人說Good Morning,日本人說哦害喲,我說早啊大兄弟。

那語言不通,不能友好交流,就得想個辦法,我們一起制定一個共通的規則來進行交流就行了嘛。

於是TCP/IP這樣的協議就出現了。

計算機因為有了這類型的很多協議,就像人類學了多門外語一樣,就終於可以和其他的計算機終端放飛自我的交流了。



TCP是啥時候出現的?

講到TCP的誕生,就要回顧到1974年的那個夏天。

卡恩描述了一種使用網絡節點間分組交換來共享資源的網際網路協議,這就是TCP/IP的雛形。

1974年的那個冬天,卡恩和瑟夫的第一份tcp協議詳細說明正式發表。

當時,他們做了一個試驗,將信息包通過點對點的衛星網絡,通過陸地電纜,再通過衛星網絡,然後由地面傳輸,貫串歐洲和美國,經過各種電腦系統,全程9.4萬公裡,竟然沒有丟失一個數據位!

這樣的遠距離可靠數據傳輸,證明了TCP/IP協議的成功。

1983年元旦,運行了比較長時間的、曾被人們習慣了的NCP被停止使用,從此以後,TCP/IP協議就成了網際網路上所有主機間的共同協議,被作為一種必須遵守的規則被肯定和應用。


TCP的「三次握手」是什麼意思?

介紹完了TCP到底是個啥,現在我們來講講,TCP這個「握手」是怎麼個回事兒。

「握手」你可以理解為是TCP發功時所需要的儀式。

因為TCP常常用來發送大批量的數據,所以,為了提供可靠的的傳送服務,TCP在發送數據之前,都需要用一種特定的順序將數據包編號,並將這些數據包傳送給目標,再確認消息。當對應的程序收到數據後,確認收到也需要用到TCP。

其實呢,三次握手就是為了對每次發送的數據量進行跟蹤與協商,確保數據段的發送和接收同步,根據所接收到的數據量而確認數據發送、接收完畢後何時撤消聯繫,並建立虛連接。

那說了半天,到底握手是怎麼握?

 Step  1 

TCP客戶端準備發送一個syn段,用來指明客戶打算連結的伺服器埠以及isn(初始序號)。那麼這個syn就被稱為「報文段1」。

 Step  2 

那麼,接下來,TCP服務端就會發回包含TCP服務端isn的syn段(即報文段2)作為回應。與此同時,TCP服務端會將確認序號設置為TCP客戶端的isn+1,以對TCP客戶端的s y n報文段進行確認。

 Step  3 

最後,TCP客戶端也必須將確認的序號設置為TCP服務端的isn+1,作為對TCP服務端syn報文段的確認(即報文段3)這三個報文段就代表了連接的建立,而這個過程,就是TCP的三次握手(three-wayhandshake)。



TCP 為什麼是三次握手

而不是兩次或四次?

當有人談論這個問題的時候,實則是在談論:

當 TCP 服務端發送連接請求確認報文段之後,當 TCP 客戶端收到這個報文,其實就算建立連接了,這個時候直接發送數據不就行了,為什麼還要再次發送一個 TCP 普通確認報文段呢?這就這個問題的「真實翻譯」。

我們從兩個角度來解釋一下:

 01  過程論證 

我們就把這個過程簡單點說吧,別整的那麼複雜。

我們假設一下,如果只握手兩次,會是什麼情況?

假設,客戶端發送的第一個連接請求沒有成功,那服務端就沒辦法收到這個報文段,對吧?

你如果給女朋友發微信沒發出去,肯定會再發一次啊。那客戶端也是這麼想的啊,它準備重新發送連接+請求報文段,那,伺服器這下可算收到這個報文段了,進入連接建立好了狀態。

客戶端這個時候,也進入了連接,建立狀態,可以進行數據傳輸了對吧?

但是呢,第一次的請求報文發送失敗了,它悄咪咪的開始了超時重傳,但客戶端和服務端都早已建立好了連結,這個時候就導致TCP的服務端白白等待,浪費大量資源。

所以兩次握手性價比不高,穩定性不足。

再簡單一點舉個例子:小明給小紅髮消息,小紅呢,收到小明消息後,回了個消息。

那麼證明了一點,就是小明發送能力沒有問題,小紅接收能力也沒有問題。

那如果小明不回了,那小明到底看到沒看到消息就無法判斷了,小紅就會想:到底是啥原因他不回我消息啊?我做錯了啥啊?

所以啊,小明如果在再發一次消息給小紅的話,就確認了小明其實看到了小紅的消息,也確認了小明的接收能力是正常的。

同時,小紅也的確真的給小明發了消息,所以他才會回復,所以小紅的發送能力也是正常的。

這就是TCP非要握手三次不可的原因。



 02  他人論證 

還不懂得的,可以圍觀一下謝希仁版的《計算機網絡》,它全面介紹了計算機網絡的發展和原理體系結構、物理層、數據鏈路層等內容,應該沒有沒看過的IT人吧?

書裡說過,TCP的握手,其實是為了保證雙方互相明確對方收發能力的最低值。兩次太少,四次太多,三次正正好。

而且啊,其實不論握手多少次都不能確認一條信道是「可靠」的,但通過3次握手可以至少確認它是「可用」的,再往上加握手次數,其實就不過是提高「它是可用的」這個結論的可信程度。

而且嚴格來說,三次握手其實是雙方各握手一次,然後各確認一次,其中,一次握手+確認是合併在一起的,這才是「三次」的由來。

-end-

我是老楊,一個從事網工行業8年的中年吃貨。關注我,和你每天聊幾句關於網工的那些事兒。

添加好友請備註「網工提升」

資源領取 | 學習培訓 | 網工提升 | 深度交流

相關焦點

  • TCP三次握手,四次揮手,你真的懂嗎?
    本文來自於作者投稿,公眾號:碼農桃花源這時候我會「胸有成竹」地「背誦」前期準備好的「答案」,第一次怎麼怎麼,第二次……答完後就沒有下文了,面試官貌似也沒有深入下去的意思,深入下去我也不懂,皆大歡喜!作為程式設計師,要有「刨根問底」的精神,知其然,更要知其所以然。這篇文章希望能抽絲剝繭,還原背後的原理。
  • 35 張圖解被問千百遍的 TCP 三次握手和四次揮手面試題
    TCP 連接狀態查看為什麼是三次握手?不是兩次、四次?相信大家比較常回答的是:「因為三次握手才能保證雙方具有接收和發送的能力。」這回答是沒問題,但這回答是片面的,並沒有說出主要的原因。如果是兩次握手連接,就不能判斷當前連接是否是歷史連接,三次握手則可以在客戶端(發送方)準備發送第三次報文時,客戶端因有足夠的上下文來判斷當前連接是否是歷史連接:如果是歷史連接(序列號過期或超時),則第三次握手發送的報文是 RST 報文,以此中止歷史連接;如果不是歷史連接,則第三次發送的報文是 ACK 報文,通信雙方就會成功建立連接;所以, TCP 使用三次握手建立連接的最主要原因是防止歷史連接初始化了連接
  • TCP三次握手及四次揮手詳細圖解
    TCP三次握手所謂三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和伺服器總共發送3個包。三次握手的目的是連接伺服器指定埠,建立TCP連接,並同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息.在socket編程中,客戶端執行connect()時。將觸發三次握手。
  • 理解TCP/IP三次握手與四次揮手的正確姿勢
    註:以下情節純屬虛構方案TCP建立連接為什麼是三次握手,而不是兩次或四次?TCP,名為傳輸控制協議,是一種可靠的傳輸層協議,IP協議號為6。若5s內收到了我的回覆「4」,則她確認 ②我可以聽見她的消息這樣,如果上面的對話得以完成,就證明雙方都可以確認自己可以聽到對方的聲音,對方也可以聽到自己的聲音!這個故事可以解釋TCP為什麼要三次握手嗎 ...
  • 以女朋友為例講解 TCP/IP 三次握手與四次揮手
    這種情況很蛋疼,那麼怎樣才能找一個簡單的辦法,讓兩個人都確認自己可以聽到對方的聲音,對方也可以聽到自己的聲音呢?註:以下情節純屬虛構方案TCP建立連接為什麼是三次握手,而不是兩次或四次?TCP,名為傳輸控制協議,是一種可靠的傳輸層協議,IP協議號為6。
  • TCP 三次握手原理,你真的理解嗎?
    1.間歇性得出現client向server建立連接三次握手已經完成,但server的selector沒有響應到這連接。2.出問題的時間點,會同時有很多連接出現這個問題。3.selector沒有銷毀重建,一直用的都是一個。4.程序剛啟動的時候必會出現一些,之後會間歇性出現。
  • 一文徹底搞懂 TCP三次握手、四次揮手過程及原理
    這種情況很蛋疼,那麼怎樣才能找一個簡單的辦法,讓兩個人都確認自己可以聽到對方的聲音,對方也可以聽到自己的聲音呢?註:以下情節純屬虛構 方案TCP建立連接為什麼是三次握手,而不是兩次或四次?TCP,名為傳輸控制協議,是一種可靠的傳輸層協議,IP協議號為6。
  • 從源碼看tcp三次握手(上)
    著名的TCP三次握手 前面已經介紹過常用套接字接口函數,也就是伺服器調用bind、listen 以及 accept 等待客戶端進行連接,而客戶端connect函數主動請求連接伺服器。客戶在調用函數 connect 前不必非得調用 bind 函數,因為如果需要的話,內核會確定源IP 地址,並按照一定的算法選擇一個臨時埠作為源埠。當客戶端使用tcp套接字進行連接時,調用 connect 函數將激發 TCP 的三次握手過程。
  • 為什麼 TCP 建立連接需要三次握手
    如果讓我們簡單說說 TCP 建立連接的過程,相信很多準備過面試的人都會非常了解,但是一旦想要深究『為什麼 TCP 建立連接需要三次握手?』,作者相信大多數人都沒有辦法回答這個問題或者會給出錯誤的答案,這邊文章就會討論究竟為什麼我們需要三次握手才能建立 TCP 連接?
  • 關於 TCP 三次握手和四次揮手,滿分回答在此
    前言 在面試中,計算機網絡的 TCP 三次握手和四次揮手是很常見的問題,但是在實際面試中,面試官會更願意聽到怎樣的回答呢?詳細程度是怎樣的?越簡單常見的問題越不可小覷,萬丈高樓平地起,把簡單的問題深入化,才更能拉開與競爭者的距離。
  • 關於TCP三次握手和四次揮手,滿分回答在此
    前 言在面試中,計算機網絡的 TCP 三次握手和四次揮手是很常見的問題,但是在實際面試中,面試官會更願意聽到怎樣的回答呢?詳細程度是怎樣的?越簡單常見的問題越不可小覷,萬丈高樓平地起,把簡單的問題深入化,才更能拉開與競爭者的距離。
  • Wireshark 基本介紹和學習 TCP 三次握手
    記得大學的時候就學習過TCP的三次握手協議,那時候只是知道,雖然在書上看過很多TCP和UDP的資料,但是從來沒有真正見過這些數據包, 老是感覺在雲上飄一樣,學得不踏實。有了wireshark就能截獲這些網絡數據包,可以清晰的看到數據包中的每一個欄位。更能加深我們對網絡協議的理解。對我而言, wireshark 是學習網絡協議最好的工具。
  • 面試官問:為什麼 TCP 建立連接需要三次握手 ?
    如果讓我們簡單說說 TCP 建立連接的過程,相信很多準備過面試的人都會非常了解,但是一旦想要深究『為什麼 TCP 建立連接需要三次握手?』,作者相信大多數人都沒有辦法回答這個問題或者會給出錯誤的答案,這邊文章就會討論究竟為什麼我們需要三次握手才能建立 TCP 連接?
  • TCP的 「三次握手」 和「四次揮手」,到底是什麼鬼?
    請看圖,記住有三個箭頭,四個對話框,就可以記住口訣:三次握手與四次揮手:TCP的三次握手,那麼你了解什麼是TCP了嗎?我相信有的人還記得,但是總會有人又忘記了,了解TCP頭部報文,還有為什麼是TCP的三次握手,而不是其他次數呢?在TCP三次握手過程中,有什麼區別或者是說變化。TCP,請記住中文名,傳輸控制協議,是一種面向連接的,可靠的,基於字節流的傳輸層通信協議,TCP的頭部報文,你了解嗎?不了解即可百度。
  • TCP 三次握手、四手揮手,這樣說你能明白吧!
    可選項欄位 選項(Option):長度不定,但長度必須是 32bits 的整數倍。 TCP建立連接 TCP建立連接需要三個步驟,也就是大家熟知的三次握手。
  • TCP/IP三次握手與四次揮手學習筆記(一)
    劃重點:TCP(傳輸控制協議)和IP(網際協議) 是最先定義的兩個核心協議,所以才統稱為TCP/IP協議族TCP的三次握手四次揮手TCP是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,在發送數據前,通信雙方必須在彼此間建立一條連接。
  • 重學TCP/IP協議和三次握手四次揮手
    TCP可以看成是一種字節流,它會處理IP層或以下的層的丟包、重複以及錯誤問題。在連接的建立過程中,雙方需要交換一些連接的參數。這些參數可以放在TCP頭部。一個TCP連接由一個4元組構成,分別是兩個IP位址和兩個埠號。一個TCP連接通常分為三個階段:連接、數據傳輸、退出(關閉)。通過三次握手建立一個連結,通過四次揮手來關閉一個連接。
  • TCP為什麼需要三次握手?用最通俗的話解釋給你聽
    TCP實現原理和為什麼需要三次握手?兩次握手不可以?四次握手不可以?讀者可以帶著疑問,看一遍本篇博客的詳細講解ok,首先解釋原因之前還是要先複習一下TCP的基本知識和三次握手協議:1、什麼是TCP協議?
  • 拜託,不要再問我三次握手和四次揮手了!
    見過比較典型的面試場景是這樣的:面試官:請介紹下三次握手求職者:第一次握手就是客戶端給伺服器端發送一個報文,第二次就是伺服器收到報文之後,會應答一個報文給客戶端,第三次握手就是客戶端收到報文後再給伺服器發送一個報文,三次握手就成功了。面試官:然後呢?求職者:這就是三次握手的過程,很簡單的。面試官:。。。。。。
  • 面試官,不要再問我三次握手和四次揮手
    見過比較典型的面試場景是這樣的:面試官:請介紹下三次握手求職者:第一次握手就是客戶端給伺服器端發送一個報文,第二次就是伺服器收到報文之後,會應答一個報文給客戶端,第三次握手就是客戶端收到報文後再給伺服器發送一個報文,三次握手就成功了。面試官:然後呢?求職者:這就是三次握手的過程,很簡單的。面試官:。。。。。。