TCP連接建立:為什么是三次握手?

接下來,以三個方面分析三次握手的原因:

1、三次握手才可以阻止重復歷史連接的初始化(主要原因)

2、三次握手才可以同步雙方的初始化序列號

3、三次握手才可以避免資源浪費

原因一:避免歷史連接

? ? ? ? 簡單來說,三次握手的首要原因是為了防止舊的重復連接初始化造成混亂。

? ? ? ? 我們考慮個場景,客戶端發送了SYN(seq=90)報文,然后客戶端宕機了,而且這個SYN報文還被網絡阻塞了,服務端并沒有收到,接著客戶端重啟后,又重新向服務端建立連接,發送了SYN(seq=100)報文。? ? ? ?

? ? ? ? 三次握手是如何阻止歷史連接的?

? ? ? ? ?客戶端連續發送多次SYN(都是同一個四元組)建立連接的報文,在網絡擁堵情況下:

  • ? 一個舊SYN報文比最新的SYN報文早到達了服務端,那么此時服務端就會回一個SYN+ACK報文給客戶端,此報文中的確認號是91(90+1)。
  • 客戶端收到后,發現自己期望收到的確認號是100+1,而不是90+1,于是就會回RST報文。
  • 服務端收到RST報文后,就會釋放連接。
  • 后續最新的SYN抵達了服務端后,客戶端與服務端就可以正常的完成三次握手了。

? ? ? ? 上述中的“舊SYN報文”稱為歷史連接,TCP使用三次握手建立連接的最主要原因就是防止歷史連接初始化了連接。

? ? ? ? 如果是兩次握手連接,就無法阻止歷史連接,那為什么TCP兩次握手無法阻止歷史連接呢?

? ? ? ? 因為在兩次握手的情況下,服務器沒有中間狀態給客戶端來阻止歷史連接,導致服務端可能建立一個歷史連接,造成資源浪費。

原因二:同步雙方初始序列號

? ? ? ? TCP協議的通信雙方,都必須維護一個序列號,序列號是可靠傳輸的一個關鍵因素,它的作用:

  • ? 接收方可以去除重復的數據;
  • 接收方可以根據數據包的序列號按序接收;
  • 可以標識發送出去的數據包中,哪些是已經被對方收到的(通過ACK報文中的序列號知道);

? ? ? ? 可見,序列號在TCP連接中占據著非常重要的作用,所以當客戶端發送攜帶初始序列號的SYN報文的時候,需要服務端回一個ACK應答報文,表示客戶端的SYN報文已被服務端成功接收,那當服務端發送初始序列號給客戶端的時候,依然也要得到客戶端的應答回應,這樣一來一回,才能確保雙方的初始序列號能被可靠的同步。

? ? ? ? 四次握手其實也能夠可靠的同步雙方的初始化序號,但由于第二步和第三步可以優化成一步,所以就成了三次握手。

原因三:避免資源浪費

? ? ? ? 如果服務端發送的SYN報文在網絡中阻塞了,重復發送多次SYN報文,那么服務端在收到請求后就會建立多個冗余的無效連接,造成不必要的資源浪費。(缺少中間狀態--RST)

總結

? ? ? ? TCP建立連接時,通過三次握手能防止歷史連接的建立,能減少不必要的資源開銷,能幫助雙方同步初始化序列號。序列號能保證數據包不重復、不丟棄和按序傳輸。

? ? ? ? 不使用兩次握手和四次握手的原因?

  • ? 兩次握手:無法防止歷史連接的建立,會造成雙方資源的浪費,也無法可靠的同步雙方序列號。
  • 四次握手:三次握手就已經理論上最少可靠連接建立,所以不需要使用更多的通信次數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79370.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Table類型的表單

形如下面的圖片 1 label與prop屬性 const columns[{label: "文件名",prop: "fileName",scopedSlots: "fileName",},{ label: "刪除時間",prop: "recoveryTime",width: "200",},{ label: "大小",prop:…

Cesium 加載 本地 b3dm 格式文件 并且 獲取鼠標點擊處經緯度 (親測可用)

很奇怪cesium 里面只支持 相對路徑 不支持絕對路徑 我把 模型放在 /***/Cesium-1.128/Apps/SampleData/Cesium3DTiles/Tilesets 下面 "../../SampleData/Cesium3DTiles/Tilesets/terra_b3dms/tileset.json",所有源碼 const viewer new Cesium.Viewer("cesiu…

Spring AI核心之“ChatClient”-來自DeepSeek

在 Spring AI 生態中,ChatClient 是一個面向開發者設計的高層抽象接口,它簡化了與大型語言模型(LLMs)的交互流程,尤其適用于需要快速構建端到端 AI 應用(如聊天機器人、RAG 問答系統等)的場景。…

購買電腦時,主要需要關注以下核心配置,它們直接影響性能、使用體驗和價格。根據需求(辦公、游戲、設計、編程等),側重點會有所不同。看看Deepseek的建議

1. 處理器(CPU) 作用:電腦的“大腦”,影響整體運算速度和多任務處理能力。關鍵參數: 品牌與型號:Intel(酷睿i3/i5/i7/i9)或 AMD(銳龍R3/R5/R7/R9)。核心/線程…

408數據結構緒論刷題001

答案:D 解析: ? A選項:數據元素是組成數據對象的基本單位 ,它只是數據的基本個體,不能完整定義數據結構,所以A選項錯誤。 ? B選項:數據對象是性質相同的數據元素的集合,僅僅描述…

c++STL——vector的使用和模擬實現

文章目錄 vector的使用和模擬實現vector的使用vector介紹重點接口的講解迭代器部分默認成員函數空間操作增刪查改操作迭代器失效問題(重要)調整迭代器 vector的模擬實現實現的版本模擬實現結構預先處理的函數尾插函數push_backswap函數賦值重載size函數reserve函數 迭代器默認成…

Java深入

String相關的類 1.String不可變的類 源碼&#xff1a; public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for th…

【Java編程】【計算機視覺】一種簡單的圖片加/解密算法

by Li y.c. 一、內容簡介 本文介紹一種簡單的圖片加/解密算法&#xff0c;算法的基本原理十分簡單&#xff0c;即逐個&#xff08;逐行、逐列&#xff09;地獲取圖片的像素點顏色值&#xff0c;對其進行一些簡單的算數運算操作進行加密&#xff0c;解密過程則相應地為加密運算…

從GPT到Gemini 大模型進化史

從GPT到Gemini&#xff1a;大模型進化史 在過去的幾年里&#xff0c;人工智能領域經歷了翻天覆地的變化&#xff0c;其中最引人注目的莫過于大規模語言模型的發展。從最初的GPT系列到最近的Gemini&#xff0c;這些模型不僅在技術上取得了重大突破&#xff0c;還在實際應用中展…

【AI提示詞】中國歷史與世界發展對比器

提示說明 輸入特定年份&#xff0c;輸出該時期中國與世界的發展狀況。 提示詞 # Role 中國歷史與世界發展對比器## Profile - author: xxx - version: 1.0 - description: 輸入特定年份&#xff0c;輸出該時期中國與世界的發展狀況。## Attention 請深入挖掘歷史資料&#x…

阿里云OSS應對DDoS攻擊策略

阿里云對象存儲服務&#xff08;OSS&#xff09;若遭遇DDoS攻擊&#xff0c;可結合阿里云提供的安全服務與自身配置優化進行綜合防御。以下是具體的解決方案及步驟&#xff1a; 1. 啟用阿里云DDoS防護服務 防護服務類型&#xff1a;阿里云提供基礎DDoS防護&#xff08;默認免費…

MyCat 分庫分表

介紹 問題分析 隨著互聯網及移動互聯網的發展&#xff0c;應用系統的數據量也是成指數式增長&#xff0c;若采用單數據庫進行數據存 儲&#xff0c;存在以下性能瓶頸&#xff1a; 1. IO瓶頸&#xff1a;熱點數據太多&#xff0c;數據庫緩存不足&#xff0c;產生大量磁盤IO&a…

C++筆記-list

list即是我們之前學的鏈表&#xff0c;這篇主要還是講解list的底層實現&#xff0c;前面會講一些list區別于前面string和vector的一些接口以及它們的注意事項。 一.list的基本使用 和之前的string&#xff0c;vector一樣&#xff0c;有很多之前見過的一些接口&#xff0c;經過…

unityTEngine學習記錄2

上一篇了解了下載項目與外部調用的接口&#xff0c;接下來就繼續學習根據這個框架來加載場景首先打開te官網&#xff0c;進入教程。 了解框架目錄以及功能 首先要了解的就是這個框架的文件結構目錄&#xff0c;知道他都是干啥的&#xff0c;在官網的目錄結構中介紹了其中重要…

邏輯過期怎么設計

設計“邏輯過期”通常用于緩存、令牌管理、數據有效性驗證等場景&#xff0c;其核心是通過業務邏輯判斷數據是否過期&#xff08;而非單純依賴物理時間&#xff09;。以下是設計邏輯過期的關鍵思路和實現方案&#xff1a; 1. 核心思想 物理過期&#xff1a;基于固定的時間&…

DAY 47 leetcode 232--棧與隊列.用棧實現隊列

題號232 請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;/** Initialize your data structure here. */pu…

邏輯回歸 (Logistic Regression)

文章目錄 邏輯回歸 (Logistic Regression)問題的引出Sigmoid function邏輯回歸的解釋決策邊界 (Decision boundary)邏輯回歸的代價函數機器學習中代價函數的設計1. 代價函數的來源&#xff08;1&#xff09;從概率模型推導而來&#xff08;統計學習視角&#xff09;&#xff08…

關于C語言的模擬物理模型

聲明&#xff1a;本文全部代碼效果基于C語言easyx圖形界面庫。 引言 關于很多游戲和模型的開發&#xff0c;都需要模擬真實的物理模型 比如&#xff1a;基本矢量運動模型&#xff08;位移&#xff0c;速度&#xff0c;加速度&#xff09;&#xff0c;重力模型&#xff0c;碰撞…

C++編譯與鏈接:從源碼到可執行文件的魔法之旅(Visual Studio實踐)

文章目錄 **C++編譯與鏈接:從源碼到可執行文件的魔法之旅(Visual Studio實踐)****一、C++編譯器的工作流程****二、Visual Studio環境配置實戰****三、示例項目:Hello World全流程解析****四、高級技巧與工具鏈****五、總結與參考資料**C++編譯與鏈接:從源碼到可執行文件的…

現代C++的范式演進與工程實踐深度解析(本文序號不知道怎么整的,有點問題)

引言:C++的復興時代 在經歷了"已死語言"的質疑后,現代C++正迎來前所未有的復興。據2024年TIOBE指數顯示,C++以8.33%的占比穩居第三,較2020年上升2.1個百分點。這種復興并非偶然——隨著C++20標準的全面落地和C++23特性的逐步實現,這門已有40年歷史的語言正在系…