關于TCP三次握手和四次揮手過程中的狀態機、使用三次握手和四次揮手的原因、擁塞控制

關于傳輸層中的TCP協議,我們在之前的博客中對其報文格式、三次握手、四次揮手、流量控制、數據傳輸等機制進行了具體說明,接下來在前面所學的基礎上,我們再來講講TCP中三次握手和四次揮手各階段所處的狀態機以及為什么要使用三次握手和四次揮手?最后再來補充TCP的擁塞控制。

TCP三次握手和四次揮手過程中的狀態機

三次握手

三次握手詳細過程如下:

  1. 在未進行三次握手時,客戶端和服務端都處于closed狀態,當客戶端主動發起連接時,服務端被動打開,進入listen狀態。客戶端發送SYN置位,seq=x的包,表示想和服務端建立連接,稱為第一次握手,隨即客戶端接入SYN_SENT狀態;
  2. 服務端收到包后,立即回復SYN、ACK置位,seq=y,ack=x+1的包,表示同意和客戶端建立連接,并且自己也想和客戶端建立連接,稱為第二次握手,隨即進入SYN_RCVD狀態;
  3. 客戶端收到包后,發送ACK置位,seq=x+1,ack=y+1的包,表示同意和服務端建立連接,稱為第三次握手,隨即進入established狀態;
  4. 服務端收到包后,也進入established狀態,TCP連接成功建立。

三次握手中的哪一次握手可以開始傳輸數據?

第三次握手,表示客戶端和服務器都建立了連接,客戶端可以攜帶要傳輸的數據。

四次揮手

四次揮手詳細過程如下:

  1. 當客戶端數據傳輸完畢后,主動發送FIN置位,seq=u的包,表示想和服務端斷開連接,稱為第一次揮手,隨即客戶端接入FIN WAIT1狀態;
  2. 服務端收到包后,回應一個ACK置位,seq=v,ack=u+1的包,表示同意和客戶端斷開連接,稱為第二次揮手,隨即服務端接入CLOSE WAIT狀態;
  3. 客戶端收到包后,進入FIN WAIT2狀態;
  4. 等待服務端的數據傳輸完畢后,服務端主動發送FIN、ACK置位,seq=w,ack=u+1的包,表示想和客戶端斷開連接,稱為第三次揮手,隨即服務端進入LAST ACK狀態;
  5. 客戶端收到包后,回應一個ACK置位,seq=u+1,ack=w+1的包,表示同意和服務端斷開連接,稱為第四次揮手,隨即進入TIME WAIT狀態;
  6. 服務端收到包后,進入closed狀態;
  7. 等待TIME WAIT時間結束后,客戶端也進入closed狀態,TCP連接成功斷開。

為什么客戶端要等待TIME WAIT時間?

為了確保同意斷開連接的響應能安全發送到服務端,避免造成服務端收不到響應而無法關閉連接。

圖片來源:TCP三次握手與四次揮手詳解_三次握手和四次揮手-CSDN博客

使用三次握手和四次揮手的原因

三次握手

為什么TCP建立連接要使用三次握手,而不是兩次握手、四次握手?

為了避免歷史連接、避免服務器資源浪費、同時也為了初始化序列號。

  1. 避免歷史連接:在IP網絡中傳輸的數據是不安全的、無序的,當客戶端發送的第一個連接請求由于網絡延遲導致比第二個連接請求晚到服務端時,服務端對兩個連接請求都進行了回應,如果此時采用兩次握手的話,客戶端無法判斷出服務端回應的是哪一個請求,就造成了歷史連接。如果采用三次握手的話,客戶端就能夠判斷出服務端是對哪一個請求進行回應,就可以避免歷史連接。
  2. 避免服務器資源浪費:如果TCP連接采用的是兩次握手,當客戶端的連接請求在網絡中阻塞,客戶端沒有接收到確認報文,就會重新發送連接請求 ,由于沒有第三次握手,服務器不清楚客戶端是否收到了自己發送的確認信號,所以每收到一個 SYN 就只能先主動建立一個連接,那么服務器在收到請求后就會建立多個冗余的無效鏈接,造成資源浪費。若是采用三次握手,就不會產生這種情況。
  3. 初始化序列號:序列號在 TCP 連接中有著非常重要的作用,當客戶端發送攜帶序列號的連接請求的時候,需要服務端回應確認報文,表示客戶端的請求報文已被服務端成功接收,那當服務端發送攜帶序列號的連接請求給客戶端時,依然也要得到客戶端的回應,這樣一來一回,確保雙方的初始序列號能被可靠的同步,以上這種情況就需要進行三次握手。

四次揮手

為什么TCP連接斷開需要使用四次揮手,而不是兩次揮手、三次揮手?

因為TCP連接建立的是雙向的連接,既有客戶端到服務端的連接,也有服務端到客戶端的連接,而一個方向的連接斷開就需要請求和應答兩個報文,所以TCP斷開連接就需要四個報文,即四次揮手。

擁塞控制

TCP有了流量控制之后為什么還需要擁塞控制?

因為流量控制的作用是為了解決發送方和接收方速度不一致而導致數據丟失的問題,即兩個端點的問題,而擁塞控制是為了解決太多的數據注入到網絡中而導致網絡崩潰的問題,即兩個端點中間鏈路的問題。

流量控制方式:由接收端采用滑動窗口的形式,告知發送方允許/停止發包解決TCP丟包問題。

擁塞控制方式:由發送方采用擁塞窗口的形式去判斷網絡狀態,從而采取不同算法執行TCP動態發包解決網絡整體質量問題。

擁塞控制的四種算法:

  • 慢開始
  • 擁塞避免
  • 超時重傳
  • 快重傳和快恢復

具體原理請參考:TCP流量控制和擁塞控制詳解!圖解分,兩分鐘搞定TCP知識點!-CSDN博客

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

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

相關文章

學習筆記二十——Rust trait

🧩 Rust Trait 徹底搞懂版 👀 目標讀者:對 Rust 完全陌生,但想真正明白 “Trait、Trait Bound、孤島法則” 在做什么、怎么用、為什么這樣設計。 🛠 方法: 先給“心里模型”——用生活類比把抽象概念掰開揉…

es 混合檢索多向量

在結合向量相似度檢索的同時,可以通過 bool 查詢的 filter 或 must 子句實現關鍵詞過濾。以下是一個同時包含 關鍵詞匹配 和 多向量相似度計算 的完整示例: 參考博文:ES集群多向量字段檢索及混合檢索方法-CSDN博客 示例:帶關鍵詞過濾的多向量聯合檢索 GET /my_index/_sea…

HTML5好看的水果蔬菜在線商城網站源碼系列模板4

文章目錄 1.設計來源1.1 主界面1.2 關于我們1.3 商品信息1.4 新聞資訊1.5 聯系我們1.5 登錄注冊 2.效果和源碼2.1 動態效果2.2 源代碼 源碼下載 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/147264262 HTML5好看的水果…

Kubernetes(k8s)學習筆記(二)--k8s 集群安裝

1、kubeadm kubeadm 是官方社區推出的一個用于快速部署 kubernetes 集群的工具。這個工具能通過兩條指令完成一個 kubernetes 集群的部署&#xff1a; 1.1 創建一個 Master 節點$ kubeadm init 1.2 將一個 Node 節點加入到當前集群中$ kubeadm join <Master 節點的 IP 和…

AI數據分析的優勢分析

隨著科技的飛速發展&#xff0c;人工智能&#xff08;AI&#xff09;已經深入滲透到數據分析領域&#xff0c;為各行各業帶來了前所未有的變革。AI數據分析作為一種新興的技術手段&#xff0c;通過運用機器學習、深度學習等算法對海量數據進行挖掘和分析&#xff0c;顯著提升了…

leetcode(01)森林中的兔子

今天開始記錄刷題的過程&#xff0c;每天記錄自己刷題的題目和自己的解法&#xff0c;歡迎朋友們給出更多更好的解法。 森林中的兔子 森林中有未知數量的兔子&#xff0c;提問其中若干只兔子“還有多少只兔子與你&#xff08;被提問的兔子&#xff09;顏色相同”。將答案收集到…

基于SpringBoot+Vue實現的旅游景點預約平臺功能一

一、前言介紹&#xff1a; 1.1 項目摘要 隨著人們生活水平的提高和休閑時間的增多&#xff0c;旅游已經成為人們生活中不可或缺的一部分。旅游業作為全球經濟的重要支柱&#xff0c;其發展趨勢呈現出數字化、網絡化和智能化的特點。傳統的旅游服務方式&#xff0c;如人工預約…

【支付】支付寶支付

下面為你詳細介紹使用 Spring Boot 對接支付寶支付&#xff0c;實現支付與退款功能的具體步驟和代碼示例。 添加依賴 在 pom.xml 里添加支付寶 SDK 依賴&#xff1a; <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframewo…

shell 正則表達式與文本處理器

目錄 前言 一、正則表達式 &#xff08;一&#xff09;定義與用途 &#xff08;二&#xff09;基礎正則表達式 &#xff08;三&#xff09;基礎正則表達式元字符 &#xff08;四&#xff09;擴展正則表達式 二、文本處理器&#xff1a;Shell 編程的得力助手 &#xff0…

ASP.NET Core 最小 API:極簡開發,高效構建(上)

一、概述 構建最小 API&#xff0c;以創建具有最小依賴項的 HTTP API。 它們非常適合于需要在 ASP.NET Core 中僅包括最少文件、功能和依賴項的微服務和應用。 本文介紹使用 ASP.NET Core 生成最小 API 的基礎知識&#xff0c;將創建以下 API&#xff1a; API&#xff08;應用…

Apache Parquet 文件組織結構

簡要概述 Apache Parquet 是一個開源、列式存儲文件格式&#xff0c;最初由 Twitter 與 Cloudera 聯合開發&#xff0c;旨在提供高效的壓縮與編碼方案以支持大規模復雜數據的快速分析與處理。Parquet 文件采用分離式元數據設計 —— 在數據寫入完成后&#xff0c;再追加文件級…

IntelliJ IDEA 2025.1 發布 ,默認 K2 模式 | Android Studio 也將跟進

2025.1 版本已經發布&#xff0c;在此之前我們就聊過該版本的 《Terminal 又發布全新重構版本》&#xff0c;而現在 2025.1 中的 K2 模式也成為了默認選項。 可以預見&#xff0c;這個版本可能會包含不少大坑&#xff0c;為下個 Android Studio 祈禱。 首先有一點可以確定&…

云效部署實現Java項目自動化部署圖解

前言 記錄下使用云效部署Java項目&#xff0c;實現java項目一鍵化自動化部署。 云效流程說明&#xff1a; 1.云效拉取最新git代碼后 2.進行maven編譯打包后&#xff0c;上傳到指定服務器目錄 3.通過shell腳本&#xff0c;先kill java項目后&#xff0c;通過java -jar 啟動項…

國際數據加密算法(IDEA)詳解

以下是修正后的準確版本,已解決原文中的術語、符號及技術細節問題: ?國際數據加密算法(IDEA)? IDEA是一種分組加密算法,由Xuejia Lai(來學嘉)和James Massey于1990年設計。IDEA使用128位密鑰對64位明文分組進行加密,經過8輪迭代運算后生成64位密文分組。其安全性基于…

TensorFlow介紹

TensorFlow 是由 Google 開發 的開源機器學習框架&#xff0c;主要用于構建、訓練和部署機器學習模型。它支持深度學習、傳統機器學習和數值計算&#xff0c;適用于圖像識別、自然語言處理&#xff08;NLP&#xff09;、推薦系統、強化學習等多種任務。 核心特性 基于 數據流…

百級Function架構集成DeepSeek實踐:Go語言超大規模AI工具系統設計

一、百級Function系統的核心挑戰 1.1 代碼結構問題 代碼膨脹現象&#xff1a;單個文件超過2000行代碼路由邏輯復雜&#xff1a;巨型switch-case結構維護困難依賴管理失控&#xff1a;跨Function依賴難以追蹤 // 傳統實現方式的問題示例 switch functionName { case "fu…

嵌入式芯片中的 SRAM 內容細講

什么是 RAM&#xff1f; RAM 指的是“隨機存取”&#xff0c;意思是存儲單元都可以在相同的時間內被讀寫&#xff0c;和“順序訪問”&#xff08;如磁帶&#xff09;相對。 RAM 不等于 DRAM&#xff0c;而是一類統稱&#xff0c;包括 SRAM 和 DRAM 兩種主要類型。 靜態隨機存…

標準的JNI (Java Native Interface) 加載函數 JNI_OnLoad

1.JNI_OnLoad 在 Android Native 開發中&#xff0c;JNI_OnLoad 是動態注冊本地方法的標準入口點。以下是一個標準實現示例及其說明&#xff1a; JNI_OnLoad 標準實現 #include <jni.h> #include <string>// 聲明本地方法對應的 C/C 函數 jint native_add(JNIEnv…

算法導論思考題

2-1 在歸并排序中對小數組采用插入排序 c. 假定修改后的算法的最壞情況運行時間為 Θ \Theta Θ(nknlg(n/k))&#xff0c;要使修改后的算法與標準的歸并排序具有相同的運行時間&#xff0c;作為n的一個函數&#xff0c;借助 Θ \Theta Θ記號&#xff0c;k的最大值是什么&#…

JavaScript 性能優化

JavaScript 性能優化是提高 Web 應用性能的關鍵步驟,特別是在處理大量數據、復雜計算或頻繁的 DOM 操作時。以下是一些常見的 JavaScript 性能優化技巧和策略: 文章目錄 @[TOC]一、代碼層面優化1. **減少全局變量**2. **避免使用 `with` 語句**3. **使用局部變量**4. **減少 …