計算機網絡學習筆記:TCP三報文握手、四報文揮手

文章目錄

  • 前言
  • 一、TCP三報文握手
  • 二、TCP四報文揮手
  • 三、TCP保活計時器


前言

??TCP通信,通常需要經歷三個階段:三報文握手->發送,接收數據->四報文揮手。
在這里插入圖片描述

一、TCP三報文握手

??三報文握手處于TCP的連接建立階段,主要解決了以下的問題:

  • 使TCP通信的雙方知道對方的存在,確認雙方的接收與發送能力。
    • 客戶端發送 SYN 報文,請求建立連接。
    • 服務器回復 SYN + ACK 報文,表示“我收到了你的請求,也同意建立連接”。
    • 客戶端再次回復 ACK 報文,表示“我也收到了你的確認”。
  • 在握手報文中可以攜帶 TCP 選項字段,允許雙方就這些參數進行協商,使得通信性能更優。
    • MSS(最大報文段長度)
    • Window Scale(窗口擴大因子)
    • SACK(選擇性確認)
    • Timestamps(時間戳)等
  • 使TCP雙方可以對運輸的實體資源進行分配和初始化。在三次握手完成后,操作系統會:
    • 在內核中為該連接分配 socket 緩存(接收緩沖區、發送緩沖區)
    • 初始化連接狀態(如 TCP 狀態機進入 ESTABLISHED 狀態)

??三報文握手的流程如下,分為TCP服務TCP客戶兩個角色:

  1. 最初,兩端的TCP進程都處于關閉的狀態。TCP連接進程首先創建傳輸控制塊**(服務端和客戶都要)**,用于存儲TCP連接中的一些重要信息,隨后TCP服務進入監聽狀態。

  2. TCP客戶發送連接請求報文段,該請求報文段不能攜帶數據,TCP客戶進入同步已發送狀態,連接請求報文段的關鍵參數:

    • SYN:1
    • seq:設置為初始值x,作為TCP客戶進程的初始序號。
      在這里插入圖片描述
  3. TCP服務接收到TCP客戶的連接請求報文段,并且向TCP客戶發送連接請求確認報文段(不能攜帶數據),TCP服務進入同步已接收狀態,連接請求確認報文段的關鍵參數:

    • SYN:1
    • ACK:1
    • seq:設置為初始值y,作為TCP服務進程的初始序號。
    • ack:x + 1
      在這里插入圖片描述
  4. TCP客戶接收到TCP服務的請求確認報文后,最后向服務器發送一個普通TCP確認報文段**(可以攜帶數據,也可以不攜帶,如果不攜帶數據,TCP客戶進程要發送的下一個數據報文段的seq依舊是x + 1,否則是x + 2)**,TCP客戶進入連接已建立狀態。普通TCP確認報文段的關鍵參數:

    • ACK:1
    • seq:x + 1
    • ack:y + 1
      在這里插入圖片描述
      在這里插入圖片描述
  5. TCP服務在接收到普通TCP確認報文段后,就會進入連接已建立狀態。然后雙方基于已建立的連接,進行通信。
    在這里插入圖片描述

TCP服務和TCP客戶,初始都是關閉狀態,由TCP客戶去主動打開。
當TCP服務創建了傳輸控制塊后,進入監聽狀態
TCP客戶發送第一次握手的消息時,進入同步已發送狀態
TCP服務發送第二次握手的消息時,進入同步已接收狀態
TCP客戶發送第三次握手的消息時,進入連接已建立狀態
TCP服務接收到TCP客戶的最后一次握手消息,進入連接已建立狀態。
三報文握手,TCP客戶占兩次,TCP服務占一次。

??為什么TCP服務在接收到TCP客戶的連接請求報文段,并且向TCP客戶發送連接請求確認報文段后**(二次握手),不是立刻進入連接已建立狀態,而是需要等待TCP服務再次發送一個普通TCP確認報文段,才會進入連接已建立狀態?(三次握手)**
??假設使用二次握手,那么可能會存在如下圖的情況。所以TCP服務需要等到TCP客戶在接收到連接請求確認報文段后,再發送一個普通TCP確認報文段,才能進入連接已建立狀態。
在這里插入圖片描述

二、TCP四報文揮手

??四報文揮手處于TCP的連接終止階段,是由TCP客戶發起的。它的流程:

  1. TCP客戶主動關閉連接,發送TCP連接釋放報文段并進入終止等待1狀態,TCP連接釋放報文段的關鍵參數:
    • FIN:1
    • ACK:1
    • seq:u = TCP客戶進程傳送過的最后一個字節的序號 + 1
    • ack:v = TCP客戶進程已收到的最后一個字節的序號 + 1

在這里插入圖片描述

  1. TCP服務進程,在接收到TCP客戶釋放連接的報文后,會發送一個普通的TCP確認報文段,并且自身進入關閉等待狀態。普通的TCP確認報文段的關鍵參數:
    • ACK:1
    • seq:v
    • ack:u + 1,作為對于TCP連接釋放報文段的確認

??這時的TCP連接處于半關閉狀態,也就是TCP客戶已經沒有數據需要發送了,但是TCP服務如果有數據需要發送,TCP客戶還是需要接收的。

在這里插入圖片描述

  1. TCP客戶在接收到確認報文段后,進入終止等待2狀態。等待TCP服務發送TCP連接釋放報文段。(等到TCP服務已經沒有數據要發送了)
  2. TCP服務發送TCP連接釋放報文段,進入最后確認狀態,TCP連接釋放報文段的關鍵參數:
    • FIN:1
    • ACK:1
    • seq:w,因為在半關閉狀態下,TCP服務可能又發送了一些數據。
    • ack:u + 1,對收到的TCP客戶的連接釋放報文的重復確認

在這里插入圖片描述

  1. TCP客戶在接收到TCP服務的連接釋放報文段后,發送TCP普通確認報文段,進入時間等待狀態。TCP普通確認報文段的關鍵參數:
    • ACK:1
    • seq:u + 1,先前TCP客戶發送的連接釋放報文段,雖然不攜帶數據,但是要消耗一個序號。
    • ack:w + 1,對收到的TCP服務連接釋放報文段的確認。

在這里插入圖片描述

6. TCP服務在接收到TCP客戶的TCP普通確認報文段后,就進入關閉狀態,TCP服務進程撤銷傳輸控制塊(是在建立連接時新建的)。TCP客戶進程在經過2倍的msl后,才能進入關閉狀態,撤銷傳輸控制塊。
在這里插入圖片描述
??TCP客戶在發送最后一個TCP普通確認報文段后,為什么不直接進入關閉狀態?如同下圖的場景
在這里插入圖片描述

??關鍵點就在于,最后一次TCP客戶發送的TCP普通確認報文段,可能存在丟失的問題。如果發生該問題,那么TCP服務的超市重傳,TCP客戶已經處于關閉狀態,是無法進行處理的。
在這里插入圖片描述

TCP服務和TCP客戶,都是處于連接狀態,由TCP客戶去主動發起關閉。
TCP客戶發送第一次揮手的消息后,進入終止等待1狀態。
TCP服務發送第二次揮手的消息后,進入關閉等待狀態。
TCP客戶接收第二次揮手的消息后,進入終止等待2狀態。
TCP服務發送第三次揮手的消息后,進入最后確認狀態。
TCP客戶接收第三次揮手的消息后,并且發送第四次揮手,進入時間等待狀態,。
TCP服務接收第四次揮手的消息后,就進入關閉狀態,撤銷傳輸控制塊
TCP客戶進程在經過2倍的msl后,才能進入關閉狀態,撤銷傳輸控制塊。
四報文揮手,TCP客戶占兩次,TCP服務占兩次。
客戶端的狀態流轉:終止等待1 -> 終止等待2 -> 時間等待 -> 關閉
服務端的狀態流轉:關閉等待 -> 最后確認 -> 關閉

三、TCP保活計時器

??如果TCP連接建立后,客戶端出現了故障,那么服務端是如何知道客戶端發生故障的呢?
??TCP保活計時器正是用于解決這樣的問題,**類似于注冊中心的心跳機制。**服務端在接收到客戶端的數據后,會重新設置并啟動保活計時器,假設TCP客戶出現問題,超過保活計時器的時限后仍然沒有發送數據,則服務端會發送一個TCP探測報文段,每隔75s發送一次,如果發送10次客戶端仍然沒有響應,TCP服務進程就確認客戶出現了故障,就斷開連接。
在這里插入圖片描述

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

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

相關文章

kafka部署和基本操作

一、部署kafka 解壓 tar xzvf kafka_2.12-3.9.1.tgz tar -zxf kafka_2.12-3.9.1.tgz 1.修改config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # …

Bootstrap 5學習教程,從入門到精通,Bootstrap 5 導航語法知識點及案例代碼(17)

Bootstrap 5 導航語法知識點及案例代碼 Bootstrap 5 提供了強大的導航組件,幫助開發者快速構建響應式且美觀的導航欄。 一、Bootstrap 5 導航組件概述 Bootstrap 5 提供了多種導航組件,主要包括: 導航欄(Navbar)&am…

清除 docker 無用的 鏡像/容器

清除 docker 無用的 鏡像/容器 刪除 <none> 的 docker 鏡像 使用以下命令刪除所有 的 Docker 鏡像&#xff08;即懸空鏡像 / dangling images&#xff09;&#xff1a; docker image prune -f這會自動刪除所有沒有 tag 的鏡像&#xff08;&#xff09;&#xff0c;不會…

使用Charles抓包工具提升API調試與性能優化效率

在軟件開發過程中&#xff0c;網絡請求調試和性能優化往往成為開發者遇到的挑戰&#xff0c;尤其是在進行API接口調試時。開發者需要確保網絡請求的正確性、響應時間以及系統的整體性能。然而&#xff0c;傳統的調試方法常常無法提供足夠的細節來深入分析問題&#xff0c;進而影…

如何協調各項目關鍵節點的沖突與依賴

在多項目并行的環境下&#xff0c;關鍵節點間的沖突與依賴是導致項目延期、資源浪費和溝通誤解的主要根源。要高效協調此類問題&#xff0c;企業應重點從建立透明的進度依賴圖、使用項目管理工具對齊節點、推動跨部門協同機制入手。其中&#xff0c;通過Gantt圖或關鍵路徑法實現…

mongodb單節點改副本集模式

前一陣將三節點的副本集改成了單節點&#xff0c;但后面業務代碼出現問題&#xff1a;無法使用事務&#xff0c;因為事務只有在副本集上能用&#xff0c;單節點無法使用&#xff0c;故需要改回副本集模式&#xff0c;而我目前僅有一臺服務器&#xff0c;所以考慮在一臺服務器上…

Android 修改了頁面的xml布局,使用了databinding,這時候編譯時需要用到apt嗎

deepseek回答&#xff1a; 在 Android 開發中使用 DataBinding 時&#xff0c;不需要顯式使用 apt&#xff08;Annotation Processing Tool&#xff09;。以下是詳細說明&#xff1a; 1. DataBinding 的編譯機制 DataBinding 是 Android Gradle 插件原生支持的功能&#xff…

服務器如何從http升級到https(nginx)

1.證書申請 可以到阿里云或者華為云去申請證書&#xff0c;申請完下載證書是個壓縮包&#xff0c;然后解壓 可以到到幾個文件夾&#xff0c;找到 .Nginx 文件夾打開 會有兩個文件&#xff0c;將這兩個文件上傳至nginx/conf/cert文件夾下&#xff08;cert需要手…

6.19_JAVA_微服務

1、跑后端的時候要把數據庫跑起來&#xff0c;否則會報錯。 2、predicate斷言&#xff1a; 預言&#xff1a;predict 3、gateway&#xff1a;出路口 4、API&#xff1a;List.of("a", "b", "c");把abc編程一個集合。 5、 6、shortcutFieldOrd…

Linux 基礎命令:`ls`、`cd`、`du` 快速入門

在 Linux 系統中&#xff0c;ls、cd 和 du 是日常操作中最常用的三個命令。掌握它們能大幅提升文件管理效率。 1. ls&#xff1a;查看目錄內容 用途&#xff1a;列出當前或指定目錄下的文件和子目錄。 常用命令&#xff1a; ls -l # 詳細列表&#xff08;權限、大…

408第一季 - 數據結構 - 散列表

散列表 概念 散列表本身就是為了查找 原始人思想 散列表思想 6%5 是 1 1%5 也是1 沖突 沖突怎么辦&#xff1f; 線性探測法 就往后找&#xff0c;1跑到索引為2 然后查找&#xff0c;可以發現&#xff0c;只要沒沖突就只用查找1次 然后你想找10的話&#xff0c;發現索引為0…

Spring Boot 集成 Elasticsearch(含 ElasticsearchRestTemplate 示例)

Elasticsearch 是一個基于 Lucene 的分布式搜索服務器&#xff0c;具有高效的全文檢索能力。在現代應用中&#xff0c;尤其是需要強大搜索功能的系統中&#xff0c;Elasticsearch 被廣泛使用。 Spring Boot 提供了對 Elasticsearch 的集成支持&#xff0c;使得開發者可以輕松地…

CMake實踐:指定gcc版本編譯和交叉編譯

目錄 1.指定gcc版本編譯 1.1.通過CMake參數來實現 1.2.使用 RPATH/RUNPATH 直接指定庫路徑 1.3.使用符號鏈接和 LD_LIBRARY_PATH 1.4.使用 wrapper 腳本封裝 LD_LIBRARY_PATH 2.交叉編譯 2.1.基本用法 2.2.工具鏈文件關鍵配置 2.3.多平臺工具鏈示例 2.4.注意事項 2.…

詳解鴻蒙Next倉頡開發語言中的全屏模式

大家好&#xff0c;今天跟大家分享一下倉頡開發語言中的全屏模式。 和ArkTS一樣&#xff0c;倉頡的新建項目默認是非全屏模式的&#xff0c;如果你的應用顏色比較豐富&#xff0c;就會發現屏幕上方和底部的留白&#xff0c;這是應用自動避讓了屏幕上方攝像頭區域和底部的導航條…

LoRA 淺析

1. 核心思想 LoRA 是一種參數高效的微調方法&#xff0c;旨在減少微調大型語言模型 (LLMs) 所需的計算資源和存儲空間。其核心思想是&#xff1a; 凍結預訓練模型權重&#xff1a; 在微調過程中&#xff0c;保持預訓練 LLM 的原始權重不變。引入低秩矩陣&#xff1a; 對于 LL…

軟件范式正在經歷第三次革命

核心主題&#xff1a;軟件范式正在經歷第三次根本性革命&#xff08;軟件3.0&#xff09;&#xff0c;其核心是“智能體”&#xff08;Agent&#xff09;&#xff0c;未來十年將是“智能體的十年”。 邏輯模塊解析&#xff1a; 軟件的三次重生革命 軟件1.0&#xff1a; 傳統編…

JavaScript 變量與運算符全面解析:從基礎到高級應用

昨天學長說可以放緩一下學習進度,剛好最近期末復習也不是很緊張,所以來重新復習一下js的一些知識點。 一&#xff1a;變量 &#xff08;1&#xff09;變量聲明 來簡單看一下變量的一些知識點。首先是變量聲明&#xff1a;變量聲明盡量使用數組字母下劃線 來舉幾個例子&#x…

移動語義對性能優化的具體示例

前言 本文章對比了&#xff1a;小中大字符串在普通傳值、傳值移動、傳左值引用、傳右值引用、模板完美轉發、內聯版本等多種測試&#xff0c;對比各個方式的性能優異&#xff1a; 測試代碼1 #include <iostream> #include <string> #include <chrono> #incl…

C/C++ 和 OpenCV 來制作一個能與人對弈的實體棋盤機器人

項目核心架構 整個系統可以分為四個主要模塊&#xff1a; 視覺感知模塊 (Vision Perception Module): 任務: 使用攝像頭“看懂”棋盤。工具: C, OpenCV。功能: 校準攝像頭、檢測棋盤邊界、進行透視變換、分割 64 個棋盤格、識別每個格子上的棋子、檢測人類玩家的走法。 決策模…

SpringBoot擴展——日志管理!

Spring Boot擴展 在Spring Boot中可以集成第三方的框架如MyBatis、MyBatis-Plus和RabbitMQ等統稱為擴展。每一個擴展會封裝成一個集成&#xff0c;即Spring Boot的starter&#xff08;依賴組件&#xff09;。starter是一種非常重要的機制&#xff0c;不需要煩瑣的配置&#xf…