TCP 三次握手與四次揮手過程

TCP 作為一種面向連接的、可靠的傳輸層協議,其連接管理機制對于保障數據的可靠傳輸至關重要。

三次握手(建立連接)

三次握手是 TCP 建立連接時所采用的機制,其目的在于確保客戶端和服務器雙方都具備發送和接收數據的能力,同時協商初始序列號。以下是三次握手的具體步驟:

  1. 客戶端向服務器發送 SYN 包
    客戶端想要與服務器建立連接,會向服務器發送一個 SYN(Synchronize Sequence Numbers)包。此包包含客戶端的初始序列號(ISN,Initial Sequence Number),假設為 x。這意味著客戶端告知服務器自己有發送數據的意愿,并且初始化了序列號。

  2. 服務器回應 SYN - ACK 包
    服務器接收到客戶端的 SYN 包后,會向客戶端發送一個 SYN - ACK 包。該包一方面對客戶端的 SYN 進行確認(ACK),確認號為 x + 1,表示服務器已正確收到客戶端的 SYN 包;另一方面,服務器也發送自己的 SYN 包,包含服務器的初始序列號 y。這表明服務器同意建立連接,同時也初始化了自身的序列號。

  3. 客戶端發送 ACK 包
    客戶端收到服務器的 SYN - ACK 包后,會向服務器發送一個 ACK 包。此包的確認號為 y + 1,表示客戶端已正確收到服務器的 SYN 包。至此,三次握手完成,客戶端和服務器之間的連接成功建立,可以開始傳輸數據。

以下是一個簡單的圖示來展示三次握手的過程:

客戶端                      服務器|                          ||--- SYN(x) -----------> ||                          || <--- SYN - ACK(y, x + 1)--- ||                          ||--- ACK(y + 1) --------> ||                          |

四次揮手(關閉連接)

四次揮手是 TCP 關閉連接時所采用的機制,其目的是確保雙方都能正常關閉連接,避免數據丟失。以下是四次揮手的具體步驟:

  1. 客戶端向服務器發送 FIN 包
    當客戶端完成數據傳輸后,會向服務器發送一個 FIN(Finish)包,表示客戶端已經沒有數據要發送了,請求關閉連接。該包包含客戶端的序列號,假設為 u

  2. 服務器回應 ACK 包
    服務器收到客戶端的 FIN 包后,會向客戶端發送一個 ACK 包,確認號為 u + 1,表示服務器已正確收到客戶端的 FIN 包。此時,服務器進入半關閉狀態,即服務器還可以向客戶端發送數據,但客戶端不能再向服務器發送數據。

  3. 服務器向客戶端發送 FIN 包
    當服務器也完成數據傳輸后,會向客戶端發送一個 FIN 包,表示服務器也已經沒有數據要發送了,請求關閉連接。該包包含服務器的序列號,假設為 v

  4. 客戶端回應 ACK 包
    客戶端收到服務器的 FIN 包后,會向服務器發送一個 ACK 包,確認號為 v + 1,表示客戶端已正確收到服務器的 FIN 包。至此,四次揮手完成,客戶端和服務器之間的連接成功關閉。

以下是一個簡單的圖示來展示四次揮手的過程:

客戶端                      服務器|                          ||--- FIN(u) -----------> ||                          || <--- ACK(u + 1) ------- ||                          || <--- FIN(v) ----------- ||                          ||--- ACK(v + 1) --------> ||                          |

綜上所述,三次握手和四次揮手是 TCP 連接管理的核心機制,它們確保了數據的可靠傳輸和連接的正常關閉。

技術細節與生活化比喻

用生活中的對話或交易場景類比,能更直觀地理解這些機制如何保障互聯網的穩定性。

一、三次握手:建立連接的“雙向確認”

技術細節補充:

  1. 序列號的作用

    • 客戶端初始序列號(ISN)通常是隨機生成的(如 x),防止歷史殘留的重復包干擾新連接。
    • 服務器的確認號 x+1 表示“我已收到你的 SYN,期待下一個字節的數據”。
    • 服務器的 ISN(如 y)同樣隨機生成,客戶端的 ACK 確認 y+1 表示“我已收到你的 SYN”。
  2. 為什么需要三次握手?

    • 防止重復連接:若網絡延遲導致舊 SYN 包后到達,服務器若僅兩次握手(如 SYN-ACK)會誤以為是新連接,三次握手可避免此類“半開連接”。
    • 雙向確認:確保雙方都能發送和接收數據(例如,客戶端可能無法接收服務器的 SYN-ACK,但服務器無法知曉,三次握手可發現問題)。

生活化比喻:
想象你給朋友打電話訂外賣:

  1. 你撥號(SYN):“喂,是 XX 餐館嗎?我想訂一份披薩。”
  2. 餐館確認(SYN-ACK):“是的,我這邊可以接單,你那邊能聽清嗎?”
  3. 你回應(ACK):“沒問題,我可以聽清,現在下單。”
    此時雙方確認溝通正常,訂單開始處理。
二、四次揮手:優雅關閉連接的“禮貌告別”

技術細節補充:

  1. FIN 與 ACK 的分離

    • 服務器收到 FIN 后,可能仍有數據需要發送(如未完成的響應),因此先回復 ACK,待自身數據發送完畢后再發送 FIN。
    • 客戶端收到服務器的 FIN 后,需等待 2MSL(最大段生命周期)時間,確保所有數據包已過期,避免干擾后續連接。
  2. 狀態轉換

    • 客戶端發送 FIN 后進入 FIN_WAIT_1,收到 ACK 后進入 FIN_WAIT_2,收到服務器 FIN 后進入 TIME_WAIT,最后關閉連接。
    • 服務器收到 FIN 后進入 CLOSE_WAIT,發送自身 FIN 后進入 LAST_ACK,收到 ACK 后關閉連接。

生活化比喻:
假設你和朋友在電話中聊天:

  1. 你說(FIN):“我這邊有點事,先掛了哈。”
  2. 朋友回應(ACK):“好的,我知道了,不過我還有最后一件事要告訴你。”
  3. 朋友說完(FIN):“說完了,再見!”
  4. 你確認(ACK):“再見!”
    此時雙方都確認對方已無數據要發送,正式結束通話。

常見問題與深入理解

  1. 為什么四次揮手需要四次?

    • 因為服務器可能需要先處理完剩余數據,再發送 FIN,導致 FIN 和 ACK 分開傳輸。
  2. SYN 攻擊(三次握手的安全隱患)

    • 攻擊者偽造大量 SYN 請求,耗盡服務器資源(半連接隊列溢出)。解決方案:SYN Cookie、縮短超時時間等。
  3. 應用場景舉例

    • 三次握手:瀏覽器訪問網站時,TCP 先建立連接,再發送 HTTP 請求。
    • 四次揮手:視頻通話結束時,雙方依次關閉數據傳輸通道。

TCP 的三次握手和四次揮手是網絡通信中“可靠連接”的基石:

  • 三次握手:通過雙向確認,確保雙方“準備就緒”。
  • 四次揮手:通過有序關閉,避免數據丟失。

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

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

相關文章

【線程安全的單例模式和STL是否是線程安全/智能指針是否是線程安全】

文章目錄 一、單例模式的特點二、餓漢模式實現單例三、懶漢模式實現單例四、STL線程安全嗎&#xff1f;五、智能指針線程安全嗎&#xff1f; 一、單例模式的特點 一個類&#xff0c;只應該實例化了一個對象&#xff0c;就是單例。 二、餓漢模式實現單例 舉個餓漢模式的例子&…

力扣DAY24 | 熱100 | 回文鏈表

前言 簡單 √ 是反轉鏈表的衍生題&#xff0c;很快寫完了。不過沒考慮到恢復鏈表結構的問題。 題目 給你一個單鏈表的頭節點 head &#xff0c;請你判斷該鏈表是否為回文鏈表。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 示例 1&#xff1a; 輸…

【GL010】C++

1.C中的const關鍵字有哪些用法&#xff1f; 1.修飾變量&#xff1a;表示變量的值不可修改。 const int a 10; 2.修飾指針&#xff1a; const int* p&#xff1a; // 指針指向的內容不可修改。 int* const p&#xff1a; // 指針本身不可修改。 const int* const…

金融行業 UE/UI 設計:解鎖高效體驗,重塑行業界面

在數字化浪潮中&#xff0c;金融行業的競爭日益激烈&#xff0c;用戶體驗&#xff08;UE&#xff09;和用戶界面&#xff08;UI&#xff09;設計成為企業脫穎而出的關鍵。蘭亭妙微憑借豐富的經驗和創新的方法&#xff0c;為金融行業打造了一套行之有效的 UE/UI 解決方案&#x…

C語言字符函數,字符串函數以及內存函數

那么博主寫這一片博客的目的就是為下一篇c的string類做鋪墊&#xff0c;那么下面就請期待博主的下一篇文章吧。 目錄 1.字符函數 2.字符串函數&#xff08;均在string.h頭文件中&#xff09; strlen的使用和模擬實現 strcpy 的使用和模擬實現 strcat 的使用和模擬實現 s…

_DISPATCHER_HEADER結構中的WaitListHead和_KWAIT_BLOCK的關系

第一部分&#xff1a; // // Wait block // // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *R…

flutter 自定義控件RenderObjectWidget使用

CustomWidget的自定義組件的注釋還是比較清晰的 參考文檔Flutter實戰 import package:flutter/cupertino.dart; import package:flutter/gestures.dart; import package:flutter/material.dart; /* * 如果組件不會包含子組件&#xff0c;則我們可以直接繼承自 LeafRenderObject…

機器視覺場景應用中,有沒有超景深的工業鏡頭

在機器視覺領域,確實存在具有超景深特性的工業鏡頭,這類鏡頭通過特殊的光學設計或技術手段,能夠顯著擴大清晰成像的縱向范圍,從而滿足復雜檢測場景中對多平面物體清晰成像的需求。以下是相關技術要點及典型鏡頭類型: 1. 遠心鏡頭 遠心鏡頭是超景深鏡頭的典型代表,其特點包…

【Linux】同步原理剖析及模擬BlockQueue生產消費模型

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

光流 | 基于KLT算法的人臉檢測與跟蹤原理及公式,算法改進,matlab代碼

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人臉檢測與跟蹤 一、KLT算法原理與分析1. 核心思想2. 數學模型二、人臉…

<數據集>軌道異物識別數據集<目標檢測>

數據集下載鏈接&#xff1a;https://download.csdn.net/download/qq_53332949/90527370 數據集格式&#xff1a;VOCYOLO格式 圖片數量&#xff1a;1659張 標注數量(xml文件個數)&#xff1a;1659 標注數量(txt文件個數)&#xff1a;1659 標注類別數&#xff1a;6 標注類別…

LabVIEW液壓振動錘控制系統

在現代工程機械領域&#xff0c;液壓振動錘的高效與精準控制日益顯得重要。本文通過LabVIEW軟件&#xff0c;展開液壓振動錘啟停共振控制技術的研究與應用&#xff0c;探討如何通過改進控制系統來優化液壓振動錘的工作性能&#xff0c;確保其在復雜工況下的穩定性與效率。 ? …

【開源寶藏】30天學會CSS - DAY7 第七課 CSS 關鍵幀打造Preloader 追逐動畫

你的代碼實現了一個 方形軌跡預加載動畫&#xff08;Preloader Animation&#xff09;&#xff0c;其中三個 span 元素沿著一個 22 網格 軌跡循環移動。現在&#xff0c;我們將 拆解核心實現步驟&#xff0c;讓你能一步步理解并調整動畫效果。 第 0 步&#xff1a;項目概覽 你…

在shell腳本內部獲取該腳本所在目錄的絕對路徑

目錄 需求描述 方法一&#xff1a;使用 dirname 和 readlink 命令 方法二&#xff1a;使用 BASH_SOURCE 變量 方法三&#xff1a;僅使用純 Bash 實現 需求描述 工作中經常有這樣情況&#xff0c;需要在腳本內部獲取該腳本自己所在目錄的絕對路徑。 假如有一個腳本/a/b/c/…

常考計算機操作系統面試習題(一下)

目錄 操作系統基本類型 操作系統的功能 操作系統的主要任務 進程與線程 進程狀態轉變 內存管理 文件系統與文件管理 虛擬存儲器 設備管理 磁盤調度 死鎖 信號量機制 文件打開與管理 進程與線程的互斥與同步 進程同步 進程調度 文件分配磁盤塊的方法 程序執行…

GPT-SoVITS本地部署:低成本實現語音克隆遠程生成音頻全流程實戰

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 今天要給大家安利一個絕對能讓你大呼過癮的聲音黑科技——GPT-SoVITS&#xff01;這款由花兒不哭大佬精心打造的語音克隆神…

JVM(基礎篇)

一.初識JVM 1.什么是JVM JVM全稱Java Virtyal Machine&#xff0c;中文譯名 Java虛擬機 。JVM本質上是一個運行在計算機上的程序&#xff0c;他的職責是運行Java字節碼文件(將字節碼解釋成機器碼)。 2.JVM的功能 解釋和運行&#xff1a;對字節碼文件中的指令號&#xff0c;實時…

【高并發內存池】第四彈---深入理解PageCache:整體設計、核心實現及Span獲取策略詳解

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】【C詳解】【Linux系統編程】【Linux網絡編程】【項目詳解】 目錄 1、pagecache 1.1、整體設計 1.2、核心實現 1.3、獲取Span 1.3.1、獲取一個非空的Span 1.3…

深入理解C語言數據結構之快速排序三路劃分

在數據結構和算法的世界里&#xff0c;排序算法是基石一般的存在。快速排序作為一種高效的排序算法&#xff0c;以其平均情況下的優秀時間復雜度而被廣泛應用。今天&#xff0c;讓我們深入探討快速排序的一種變體——三路劃分的快速排序&#xff0c;看看它是如何在C語言中施展魔…

Java實現后量子密碼(PQC)與國密算法(SM4)混合加密

以下是使用Java實現一種后量子密碼(PQC)與國密算法(SM4)混合加密的示例方案。該方案結合了后量子密碼的抗量子特性與國密算法的國產化合規要求,適合需要雙重安全保障的場景。 一 . 方案驗證 1.代碼截圖 2.運行測試 二 . 方案設計 密鑰交換:使用后量子密碼(如Kyber)生…