TCP的三次握手和四次揮手實現過程。以及為什么需要三次握手?四次揮手?

三次握手和四次揮手的實現原理,以及為什么要這樣設計?

    • 三次握手的實現
      • 三次握手的核心角色與參數
      • 三次握手的具體步驟
        • 第一步:客戶端 → 服務器(發送 `SYN` 報文)
        • 第二步:服務器 → 客戶端(發送 `SYN+ACK` 報文)
        • 第三步:客戶端 → 服務器(發送 `ACK` 報文)
      • 三次握手的核心目的
      • 為什么需要三次握手,而不是兩次?
      • 總結
    • 四次揮手的實現
      • 四次揮手的核心背景
      • 四次揮手的具體步驟
        • 第一步:客戶端 → 服務器(發送 `FIN` 報文)
        • 第二步:服務器 → 客戶端(發送 `ACK` 報文)
        • 第三步:服務器 → 客戶端(發送 `FIN` 報文)
        • 第四步:客戶端 → 服務器(發送 `ACK` 報文)
      • 四次揮手的核心目的
      • 為什么需要四次揮手,而不是三次?
      • 總結

三次握手的實現

TCP 三次握手(Three-Way Handshake)是建立 TCP 連接的核心過程,其目的是確保客戶端和服務器雙方的發送能力與接收能力均正常,并協商初始序列號(用于后續數據傳輸的有序性和完整性校驗)。以下是詳細過程:

三次握手的核心角色與參數

  • 客戶端:主動發起連接的一方(如瀏覽器)。
  • 服務器:被動接受連接的一方(如 Web 服務器)。
  • 序列號(Sequence Number,seq:發送方為每個數據包分配的唯一編號,用于接收方確認數據順序和完整性(避免重復或丟失)。
  • 確認號(Acknowledgment Number,ack:接收方告知發送方“已收到的最大序列號 + 1”,表示期望接收的下一個數據編號。
  • 標志位
    • SYN(Synchronize):用于發起連接,請求同步序列號。
    • ACK(Acknowledgment):用于確認已收到數據。

三次握手的具體步驟

第一步:客戶端 → 服務器(發送 SYN 報文)
  • 客戶端行為
    客戶端向服務器發送一個 SYN 報文(同步請求),表示“我想和你建立連接”。
    報文中包含:

    • 標志位:SYN = 1(表示這是一個連接請求)。
    • 初始序列號:seq = xx 是客戶端隨機生成的 32 位整數,如 1000)。
  • 服務器狀態變化
    服務器收到 SYN 報文后,從“關閉狀態”進入“同步收到狀態(SYN-RCVD)”,表示“已收到連接請求,準備回應”。

第二步:服務器 → 客戶端(發送 SYN+ACK 報文)
  • 服務器行為
    服務器向客戶端回復一個 SYN+ACK 報文(同步 + 確認),表示“我收到了你的請求,也想和你建立連接”。
    報文中包含:

    • 標志位:SYN = 1(服務器發起自己的同步請求)、ACK = 1(確認收到客戶端的請求)。
    • 服務器的初始序列號:seq = yy 是服務器隨機生成的整數,如 2000)。
    • 確認號:ack = x + 1(表示“已收到客戶端序列號為 x 的報文,下一次期望接收 x+1 及以后的數據”)。
  • 客戶端狀態變化
    客戶端收到 SYN+ACK 報文后,從“同步發送狀態(SYN-SENT)”進入“建立連接狀態(ESTABLISHED)”,表示“確認服務器已準備好,連接即將建立”。

第三步:客戶端 → 服務器(發送 ACK 報文)
  • 客戶端行為
    客戶端向服務器發送一個 ACK 報文(確認),表示“我收到了你的回應,連接可以正式建立了”。
    報文中包含:

    • 標志位:ACK = 1(僅確認,無新的同步請求)。
    • 客戶端的序列號:seq = x + 1(基于第一步的 x 遞增,符合 TCP 序列號連續的規則)。
    • 確認號:ack = y + 1(表示“已收到服務器序列號為 y 的報文,下一次期望接收 y+1 及以后的數據”)。
  • 服務器狀態變化
    服務器收到 ACK 報文后,從“同步收到狀態(SYN-RCVD)”進入“建立連接狀態(ESTABLISHED)”,表示“雙方確認完畢,TCP 連接正式建立”。

三次握手的核心目的

  1. 驗證雙向通信能力

    • 第一步:客戶端確認服務器“能接收”(服務器收到 SYN)。
    • 第二步:服務器確認客戶端“能發送也能接收”(客戶端收到 SYN+ACK)。
    • 第三步:客戶端確認服務器“能發送”(服務器收到 ACK)。
      三次交互后,雙方確認彼此的發送和接收功能均正常。
  2. 協商初始序列號
    客戶端和服務器通過前兩步交換各自的初始序列號(xy),后續數據傳輸將基于這些序列號遞增,確保數據有序且可校驗(如通過序列號檢測丟包或重復數據)。

為什么需要三次握手,而不是兩次?

  • 若僅用兩次握手,服務器在發送 SYN+ACK 后就認為連接已建立,但客戶端可能因網絡延遲等原因未收到該報文,此時服務器會一直等待客戶端發送數據,造成資源浪費。
  • 三次握手的最后一步(客戶端發送 ACK)確保客戶端確實收到了服務器的回應,避免服務器“單方面”建立無效連接,減少資源消耗。

總結

三次握手的本質是“雙向確認”:
客戶端請求連接 → 服務器確認并請求連接 → 客戶端確認
通過三次交互,雙方驗證了通信能力并協商了初始序列號,最終建立可靠的 TCP 連接,為后續數據傳輸奠定基礎。

四次揮手的實現

在 TCP 協議中,四次揮手(Four-Way Wavehand) 是關閉 TCP 連接的過程,用于確保雙方都已完成數據傳輸,并安全釋放連接資源。與三次握手建立連接不同,四次揮手需要四次交互,核心原因是 TCP 連接是全雙工的(雙方可同時發送數據),關閉連接時需各自獨立終止發送方向的數據流。

四次揮手的核心背景

TCP 連接是“全雙工”模式,即客戶端和服務器可以同時向對方發送數據。因此,關閉連接時需分兩步:

  1. 一方先終止向對方發送數據(關閉發送通道);
  2. 另一方確認并終止自己的發送通道。
    這一過程需要四次交互來完成雙向確認。

四次揮手的具體步驟

假設客戶端主動發起關閉請求(實際中服務器也可主動發起),步驟如下:

第一步:客戶端 → 服務器(發送 FIN 報文)
  • 客戶端行為
    客戶端完成數據發送后,向服務器發送 FIN 報文(Finish,結束),表示“我已完成數據發送,請求關閉我向你發送數據的通道”。
    報文中包含:

    • 標志位:FIN = 1(表示終止發送)。
    • 序列號:seq = uu 是客戶端已發送的最后一個字節的序列號 + 1,如客戶端最后發送的序列號是 1000,則 u = 1001)。
  • 客戶端狀態變化
    從“建立連接狀態(ESTABLISHED)”進入“終止等待 1 狀態(FIN-WAIT-1)”,等待服務器確認。

第二步:服務器 → 客戶端(發送 ACK 報文)
  • 服務器行為
    服務器收到 FIN 報文后,回復 ACK 報文,表示“已收到你關閉發送通道的請求,我會處理剩余數據”。
    報文中包含:

    • 標志位:ACK = 1(確認)。
    • 序列號:seq = v(服務器當前的序列號,基于自身已發送的數據)。
    • 確認號:ack = u + 1(表示“已收到序列號 uFIN 報文,下一次期望接收 u+1”)。
  • 服務器狀態變化
    從“ESTABLISHED”進入“關閉等待狀態(CLOSE-WAIT)”,此時客戶端到服務器的發送通道已半關閉(客戶端不再發送數據,但服務器仍可向客戶端發送數據)。

  • 客戶端狀態變化
    收到 ACK 后,從“FIN-WAIT-1”進入“終止等待 2 狀態(FIN-WAIT-2)”,等待服務器發送自己的 FIN 報文。

第三步:服務器 → 客戶端(發送 FIN 報文)
  • 服務器行為
    服務器完成所有數據發送后,向客戶端發送 FIN 報文,表示“我也已完成數據發送,請求關閉我向你發送數據的通道”。
    報文中包含:

    • 標志位:FIN = 1ACK = 1(通常同時攜帶確認)。
    • 序列號:seq = w(服務器最后發送的字節序列號 + 1,基于 v 遞增)。
    • 確認號:ack = u + 1(與第二步的確認號一致,因未收到新數據)。
  • 服務器狀態變化
    從“CLOSE-WAIT”進入“最后確認狀態(LAST-ACK)”,等待客戶端的最終確認。

第四步:客戶端 → 服務器(發送 ACK 報文)
  • 客戶端行為
    客戶端收到服務器的 FIN 報文后,回復 ACK 報文,表示“已收到你關閉發送通道的請求,連接即將完全關閉”。
    報文中包含:

    • 標志位:ACK = 1
    • 序列號:seq = u + 1(基于第一步的 u 遞增)。
    • 確認號:ack = w + 1(表示“已收到序列號 wFIN 報文,下一次期望接收 w+1”)。
  • 客戶端狀態變化
    從“FIN-WAIT-2”進入“時間等待狀態(TIME-WAIT)”,并啟動一個 2MSL(Maximum Segment Lifetime,報文最大生存時間,通常為 2 分鐘) 的計時器。

    • 目的:確保服務器能收到最終的 ACK 報文(若服務器未收到,會重發 FIN,客戶端在 2MSL 內可再次回復)。
    • 2MSL 后,客戶端進入“關閉狀態(CLOSED)”。
  • 服務器狀態變化
    收到 ACK 后,從“LAST-ACK”直接進入“CLOSED”狀態,釋放連接資源。

四次揮手的核心目的

  1. 確保雙向數據傳輸完成
    雙方分別通過 FIN 報文告知對方“自己的發送已結束”,通過 ACK 確認對方已知曉,避免數據丟失。
  2. 避免連接關閉后的報文干擾
    客戶端的 2MSL 等待時間,確保網絡中殘留的舊報文(屬于當前連接)已過期,防止其干擾新連接(新連接可能使用相同的端口)。

為什么需要四次揮手,而不是三次?

  • 三次握手時,服務器的 SYNACK 可合并為一次報文(第二步 SYN+ACK),因為此時服務器無需處理未完成的數據發送。
  • 四次揮手時,服務器收到客戶端的 FIN 后,可能還有未發送完的數據,因此需先回復 ACK 確認(第二步),待數據發送完畢后再發送 FIN(第三步),無法合并為一次報文,因此需要四次交互。

總結

四次揮手是 TCP 全雙工連接關閉的必然過程:
客戶端請求關閉發送通道 → 服務器確認 → 服務器請求關閉發送通道 → 客戶端確認并等待
通過四次交互,雙方安全終止雙向數據流,并通過時間等待機制確保連接資源的徹底釋放,是 TCP 可靠性的重要體現。

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

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

相關文章

Java開發時出現的問題---架構與工程實踐缺陷

除語言和并發層面,代碼設計、工程規范的缺陷更易導致系統擴展性差、維護成本高,甚至引發線上故障。1. 面向對象設計的常見誤區過度繼承與脆弱基類:通過繼承復用代碼(如class A extends B),會導致子類與父類…

項目評審管理系統(源碼+文檔+講解+演示)

引言 在當今快速發展的商業環境中,項目評審和管理是確保項目成功的關鍵環節。項目評審管理系統作為一種創新的數字化工具,通過數字化手段優化項目評審和管理的全流程,提高項目管理效率,降低風險,提升項目成功率。本文將…

ComfyUI 安裝WanVideoWrapper

目錄 方法2:通過 ComfyUI-Manager 安裝 方法3:手動下載并解壓 測試代碼: WanVideoWrapper 方法2:通過 ComfyUI-Manager 安裝 在 ComfyUI 界面頂部找到 Manager(管理器)選項。 進入 Install Custom Nod…

react合成事件大全,如onClick,onDrag

1. 鼠標事件onClick - 點擊事件onContextMenu - 右鍵菜單事件onDoubleClick - 雙擊事件onDrag - 拖拽事件onDragEnd - 拖拽結束事件onDragEnter - 拖拽進入目標區域事件onDragExit - 拖拽離開目標區域事件onDragLeave - 拖拽離開事件onDragOver - 拖拽懸停事件onDragStart - 拖…

從《中國開源年度報告》看中國開源力量的十年變遷中,Apache SeaTunnel 的躍遷

如果把開源世界比作一條奔涌的大河,過去十年里,中國開發者已經從“岸邊試水”變成了“中流擊水”。在最近落下帷幕的 Community Over Code Asia 2025,華東師范大學教授王偉老師基于《中國開源年度報告》進行的一場分享,用一組數字…

JAVA 程序員cursor 和idea 結合編程

cursor 是基于vscode改良而來的,外加上Claude大語言模型而產生的AI編輯器,市面上也有阿里的靈碼qianwen3-coder大語言模型。我個人電腦還是喜歡用idea集成靈碼插件開發。但是也稍微介紹下習慣idea的人只是使用cursor代碼生成的話,這有個小妙招…

查看部署在K8S服務的資源使用情況

要查看 Pod中 server 的資源使用情況(CPU 和內存),你需要使用 Kubernetes 的監控工具。最常用的是 kubectl top 命令。? 方法一:使用 kubectl top(推薦) 1. 查看 Pod 的 CPU 和內存使用 kubectl top pod s…

uni-app vue3 小程序接入 aliyun-rtc-wx-sdk

安裝依賴&#xff1a; npm install aliyun-rtc-wx-sdk crypto-jsuni-app&#xff0c;新建一個頁面&#xff0c;粘貼以下代碼 在阿里云實時音視頻補充appId、appKey即可&#xff0c; <template><view class"container"><!-- 用戶輸入區域 --><vi…

Java技術棧/面試題合集(3)-Java并發篇

場景 Java入門、進階、強化、擴展、知識體系完善等知識點學習、性能優化、源碼分析專欄分享: Java入門、進階、強化、擴展、知識體系完善等知識點學習、性能優化、源碼分析專欄分享_java高級進階-CSDN博客 通過對面試題進行系統的復習可以對Java體系的知識點進行查漏補缺。…

[AI 生成] Spark 面試題

spark 基礎問題面試題以下是 Spark 基礎面試題的全面梳理&#xff0c;涵蓋核心概念、架構原理和編程模型&#xff0c;幫助快速掌握高頻考點&#xff1a;一、核心概念1. Spark 核心組件組件作用Driver執行 main() 方法&#xff0c;調度任務&#xff0c;管理集群資源Executor在 W…

MySQL的DML增刪改操作:

目錄 添加數據&#xff1a; 方式1&#xff1a;一條一條添加數據&#xff1a; 方式2&#xff1a;將查詢結果插入到表中&#xff1a; 更新數據&#xff1a; 刪除數據&#xff1a; MySQL8的新特性&#xff1a;計算列&#xff1a; 本文介紹了MySQL數據庫操作語言(DML)的基本使…

MySQL運維常用語法速查

&#x1f5c3;? 一、數據庫操作 CREATE DATABASE db_name; USE db_name; DROP DATABASE db_name; SHOW DATABASES;&#x1f517; 官方文檔 &#x1f4ca; 二、表操作 表創建示例 CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,email V…

汽車以太網通信協議——SOME/IP

1. 背景 SOME/IP是一種汽車中間件解決方案&#xff0c;其全稱是Scalable Service-Oriented Middleware over IP&#xff0c;即位于 IP 協議層以上的一種面向服務的可擴展的中間件。 中間件&#xff1a;該術語起源于復雜的軟件系統開發&#xff0c;用以實現軟件組件之間的數據交…

什么是負載均衡,有哪些常見算法?

文章目錄1.什么是負載均衡2.負載均衡的分類2.1 二層負載均衡2.2 三層負載均衡2.3 四層負載均衡2.4 七層負載均衡3.負載均衡工具3.1 LVS3.2 Nginx3.3 HAProxy4.常見負載均衡算法5.面試回答模板1.什么是負載均衡 為了提升web應用的各方面能力&#xff0c;我們一般會把多臺機器組…

PyTorch 核心三件套:Tensor、Module、Autograd

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄引言1 Tensor1.1 &#x1f6e0;?Tensor 的核心用…

python源碼是如何運行起來的

為什么要了解底層原理 寫出高質量代碼 問題定位 滿足好奇心 機械通感 開始 當我們編寫并運行一行 print(Hello, World!) 時&#xff0c;背后究竟發生了什么&#xff1f;Python 代碼是如何從我們可讀的文本&#xff0c;變成計算機可以執行的指令的呢&#xff1f; 很多人將…

MacOS Docker 安裝指南

MacOS Docker 安裝指南 引言 Docker 是一個開源的應用容器引擎,它允許開發者打包他們的應用以及應用的依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app)。Docker …

Cisco 3750X交換機更新到IOS 15.2后無法啟動 提示:Boot process failed...

背景及故障現象 一臺新購入的二手Cisco 3750X-48P&#xff0c;原機自帶IOS軟件版本為12.x&#xff0c;可以正常工作。 但將IOS版本升級到15.2之后&#xff0c;在啟動過程中卡住。 第一次加載IOS軟件時是正常的&#xff0c;提示&#xff1a; Loading "flash:/c3750e-uni…

Redis Redis 常見數據類型

Redis 提供了 5 種數據結構&#xff0c;理解每種數據結構的特點對于 Redis 開發運維非常重要&#xff0c;同時掌握每種數據結構的常見命令&#xff0c;會在使用 Redis 的時候做到游刃有余。 一、預備知識 官方文檔&#xff1a;Commands | Docs (redis.io) 1、最核心的兩個命令…

金融風控實戰:Spring Boot + LightGBM 貸款預測模型服務化(超詳細版)

金融風控實戰&#xff1a;Spring Boot LightGBM 貸款預測模型服務化&#xff08;超詳細版&#xff09;一、整體架構設計二、模型訓練與優化1. 特征工程&#xff08;Python&#xff09;2. 模型評估與優化三、Spring Boot 服務實現1. 項目結構2. ONNX 模型服務3. 特征工程服務4.…