網絡編程中的TCP——TCP的連接的建立、關閉、狀態轉移

網絡編程中的TCP——TCP的連接的建立、關閉、狀態轉移

TCP連接的建立和關閉

wireshark捕獲數據:

在這里插入圖片描述

TCP三次握手+四次揮手的時序圖:

在這里插入圖片描述

三次握手:

  1. 報文段1包含SYN標志,這是一個同步報文段,表示發起連接請求,包含自己起始的序號值0;
  2. 報文段2是服務端同意建立連接,發送了自己的起始序號并對第一個報文進行了確認;
  3. 報文3是對服務端第二個報文的確認;

四次揮手:

  1. 報文14:由客戶端發起了關閉連接的請求,帶有FIN標志位,以及此時的序號和對服務器上一個報文的確認;
  2. 報文15:服務器確認了客戶端的關閉請求,此時進入半關閉狀態;
  3. 報文16:服務器發出斷開連接請求,開始等待客戶端最后一個確認;
  4. 報文17:客戶端進行最后的確認;

半關閉狀態

TCP是全雙工的,所以允許兩個方向的數據傳輸單獨關閉。也即是通信的一端可以發送結束報文給對方,告知對方本端已完成數據的發送,但是允許繼續接收來自對方的數據,直到對方也發送報文段關閉連接

以上面那個例子來說,客戶端主動發起了關閉請求,在服務器返回確認之后,就進入了半關閉狀態,客戶端不會繼續向服務端發送新的數據,但是還可以接收服務端的數據

TCP狀態轉移

在這里插入圖片描述

上圖描述了完整的TCP狀態轉移,下面是狀態轉移時序圖:

在這里插入圖片描述

三次握手建立連接:

  1. 客戶端和服務器初始都處于CLOSED狀態;
  2. 例子中由客戶端發起連接請求SYN,發送完后客戶端變成SYN_SENT狀態;
  3. 服務器開啟之后首先變成LISTEN狀態,在接收到客戶端的SYN后變成SYN_RCVD狀態;
  4. 服務器發送SYN+ACK,客戶端接收到之后,變成ESTABLISHED狀態,發送最后一個ACK
  5. 最后服務器收到ACK之后也變成ESTABLISHED狀態,建立連接完成;

四次揮手:

  1. 例子中由客戶端首先發起關閉連接請求,客戶端發送完FIN后首先變成FIN_WAIT_1狀態;
  2. 服務器收到關閉連接的請求之后變成CLOSE_WAIT狀態,然后發送ACK表示同意關閉連接;
  3. 客戶端收到服務器的ACK進入半關閉狀態,FIN_WAIT_2
  4. 此時客戶端不會繼續發送數據,但如果服務器還有數據,服務器會繼續發送數據;
  5. 服務器發起關閉請求,進入LASK_ACK狀態,表示等待客戶端發送最后一個ACK
  6. 客戶端收到FIN請求,進入TIME_WAIT狀態,發送最后一個ACK
  7. 服務器在收到最后一個ACK后首先進入完全關閉狀態;

TIME_WAIT

  1. 處于TIME_WAIT狀態要等待2 * msl才能完全關閉,原因如下:
    • 可靠的終止TCP連接;
    • MSL是報文段在網絡中最大生存時間,2MSL保證網絡上兩個傳輸方向上尚未被接受到、遲到的TCP報文段都已經消失,保證新的連接在這個端口建立起來之后不會收到上一個連接的數據;
  2. TIME_WAIT是第一個主動發起關閉連接的一端才會有的狀態,如果是服務器先發起關閉連接的請求,在收到對方的關閉請求后也會變成TIME_WAIT狀態;
  3. 處于TIEM_WAIT的這個端口不能立即被用來建立新的連接,要等連接徹底關閉;
  • 對于客戶端來說,處于TIME_WAIT狀態的端口無法立即重新使用不是什么問題,因為客戶端一般使用系統自動分配的臨時端口號來建立連接,一般不會剛好分配到程序上一次用到的端口;
  • 但是對于服務器來說,他總是使用一個固定端口。如果服務器程序剛剛關閉后又希望立即重新啟動,就要等待2MSL,避免的方式是可以在創建socket時升值SO_REUSEADDR來強制進程可以立即使用處于TIME_WAIT狀態的端口;

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

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

相關文章

SQL 語句拼接在 C 語言中的實現與安全性分析

代碼解析 // 構建SQL插入語句 char *sql_insert (char *)malloc(sizeof(char) * 200); // 分配200字節內存 strcpy(sql_insert, "INSERT INTO user(username, passwd) VALUES("); // 復制基礎SQL語句 strcat(sql_insert, ""); // 添加單引號 strcat(sq…

`lock()` 和 `unlock()` 線程同步函數

1) 函數的概念與用途 lock() 和 unlock() 不是特定的標準庫函數,而是線程同步原語的一般概念,用于在多線程環境中保護共享資源。在不同的編程環境和庫中,這些函數有不同的具體實現(如 POSIX 線程的 pthread_mutex_lock() 或 C 的 …

升級openssh后ORACLE RAC EM 安裝失敗處理

升級過程中由于SCP傳輸時目標目錄/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans 不存在導致的OC4J配置失敗:WARNING: /usr/bin/scp: dest open "/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans": No such file or directory/usr/bin/scp…

ADB 調試工具的學習[特殊字符]

一、ADB 的工作原理 1.1 ADB 概念 ADB (Android Debug Bridge):Android 調試橋,是開發/測試 Android 應用必備的調試工具。作用:通過 電腦終端命令 操作 安卓手機/模擬器。 1.2 ADB 構成與原理 ADB 由三部分組成: Client 端&#…

用一根“數據中樞神經”串起業務從事件流到 Apache Kafka

1. 為什么是“事件流”? 在一個軟件定義、自動化、永遠在線的世界里,系統之間最需要的是:把發生了什么這件事,第一時間、按正確順序、可靠地傳到該知道的人/系統那里。 事件流就像企業的中樞神經:它把數據庫更新、設備…

【RAGFlow代碼詳解-4】數據存儲層

數據庫基礎設施 RAGFlow 使用關系數據庫(MySQL 或 PostgreSQL)作為主要元數據存儲,通過具有連接池和重試機制的 Peewee ORM 進行管理。 連接管理 數據庫連接通過 service_conf.yaml 和環境變量進行配置。該系統支持具有可配置連接池的 MySQL …

ES_映射

一、 映射(Mapping)是什么? 簡單來說,映射就像是關系型數據庫中的表結構定義(Schema)。它定義了索引(Index)中的文檔(Document)可以包含哪些字段(…

【Linux | 網絡】多路轉接IO之poll

一、poll函數二、poll的優缺點三、實現poll服務器(只關心讀事件)3.1 Log.hpp(日志)3.2 Lockguard.hpp(自動管理鎖)3.3 Socket.hpp(封裝套接字)3.4 PollServer.hpp(服務端…

一站式資源共享平臺模板,助力快速搭建專屬資源站源碼

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 這個資源分享網站模板是一個功能完整、設計現代的單頁網站,非常適合快速搭建資源分享平臺。以下是關于這個模板的詳細介紹,幫助你更好地理解并發布到自己的網站&a…

ngnix的部分配置

1. 禁止特定IP地址訪問你可以通過在Nginx配置文件中添加deny指令來阻止特定IP地址或IP地址段的訪問。server {listen 80;server_name example.com;location / {deny 192.168.1.0/24;allow all;} }2. 允許特定IP地址訪問如果你想允許只有特定IP地址或IP地址段的訪問,…

Qwt7.0-打造更美觀高效的Qt開源繪圖控件庫

概述 Qt 生態里能畫圖的庫不多,主流的為QCustomPlot、Qwt、Qt Charts和KDChart,Qt6.8之后把原來的 Qt Charts(2D) 與 Qt DataVisualization(3D) 合并為統一的Qt Graphs模塊(注意不是Qt Graphic…

NFC線圈設計計算

對工作于13.56MHz的電感耦合的NFC系統,針對小距離的傳統天線通常是環形或者矩形的扁平線圈。 圓形扁平線圈計算評估 對于二階估計,我們可以由匝數決定的電感等式為 考慮到線圈的物理參數,設置平均直徑:D_averD0-N(gw) 線圈周長: ;d2*(w t)/π 初始設置中的這種電感…

mac設置鼠標滾輪方向

mac中滾輪的滑動方向和windows是相反的,如果需要設置和windows相同,設置如下:將自然滾動關閉即可。

QSpinBox的用法及其使用QSS對其美化

摘要 在現代應用程序開發中,提供一個直觀且用戶友好的界面至關重要。Qt框架提供了豐富的控件和工具,幫助開發者實現這一目標。本文將詳細介紹如何使用Qt的QSpinBox控件讓用戶輸入數值,并通過Qt Style Sheets (QSS) 美化界面,提升…

18 繼續學習

要設計出一個好的系統,需要多年的知識積累。有一個捷徑是研究真實世界的系統架構。本文將介紹一些有幫助的閱讀材料。 務必留意那些真實系統之間共通的原理和相同的底層技術。研究每個技術并了解它解決了什么問題, 這是一個鞏固基礎知識和完善設計過程的…

深度學習篇---混淆矩陣

要理解混淆矩陣(Confusion Matrix),我們可以從它的名字入手:它本質是一張 “幫你理清模型預測結果到底‘混淆’在哪里” 的表格,核心作用是評估分類模型的表現 —— 比如判斷一張圖片是 “貓” 還是 “狗”、一封郵件是…

MySQL重大隱患!mysqlpump的--set-gtid-purged參數在5.7和8.0的雷區

MySQLPump是MySQL官方提供的一個用于備份和恢復MySQL數據庫的工具。它于MySQL 5.7.8版本中首次引入,旨在提供一種快速、可靠且高效的備份和恢復解決方案。MySQL Pump首次支持了并行導出、壓縮導出,可以利用多核CPU來提高備份能力,在效率上要比…

低質量視頻變高清AI:告別模糊,重現清晰畫質

在數字時代,視頻內容的創作和消費日益普及,然而,許多早期拍攝或存儲的視頻,由于技術限制或壓縮等原因,往往存在畫質不佳的問題,如模糊、噪點多、分辨率低等。這不僅影響觀看體驗,也限制了這些珍…

Linux入門教程 第十二章 防火墻

文章目錄前言一、 iptables 概述Netfilter二、iptables 的表、鏈結構2.1 ptables的四表五鏈結構介紹2.1.1 四表五鏈2.1.2 四表2.1.3 **五鏈**2.2 數據包過濾的匹配流程(數據包到防火墻)2.2.1 規則鏈之間的匹配順序:主機型防火墻:2.2.2 規則鏈內的匹配順序…

單詞搜索+回溯法

題目&#xff1a;思考&#xff1a; 1.經典回溯 實現&#xff1a; class Solution { public:bool find_word(vector<vector<char>>&board,string word,int pos,int i,int j){bool retfalse;if (posword.size()-1) return board[i][j]word[pos];if (board[i][j…