TCP三次握手與四次揮手全解析

🌊 TCP三次握手與四次揮手全解析(含序列號動態追蹤)


🔑 TCP 協議核心機制

  • 序列號 (seq):數據字節流的唯一標識(32位循環計數器)
  • 確認號 (ack):期望接收的下一個序列號(ack = 接收方seq + 1)
  • 標志位:SYN(建立連接)、ACK(確認)、FIN(關閉連接)

🛠? 三次握手詳解(連接建立)

ClientServerSYN=1, seq=X (隨機生成)狀態: SYN_SENTSYN=1, ACK=1, seq=Y, ack=X+1狀態: SYN_RECEIVEDACK=1, seq=X+1, ack=Y+1狀態: ESTABLISHED狀態: ESTABLISHEDClientServer

序列號變化追蹤(假設初始序列號:Client=1000, Server=5000)

步驟方向標志位seq 值ack 值關鍵說明
1C → SSYN=11000-客戶端隨機初始化seq
2S → CSYN=1,ACK=150001001服務端ack=客戶端seq+1
3C → SACK=110015001客戶端seq+1,ack=服務端seq+1

📌 SYN消耗序列號:發送SYN會使序列號+1(SYN標志位占據1字節序列空間)


🚪 四次揮手詳解(連接釋放)

ClientServerFIN=1, seq=U狀態: FIN_WAIT_1ACK=1, seq=V, ack=U+1狀態: CLOSE_WAIT狀態: FIN_WAIT_2FIN=1, ACK=1, seq=W, ack=U+1狀態: LAST_ACKACK=1, seq=U+1, ack=W+1狀態: TIME_WAIT (2MSL)狀態: CLOSEDClientServer

序列號變化追蹤(通信結束時:Client seq=8000, Server seq=12000)

步驟方向標志位seq 值ack 值狀態變化
1C → SFIN=18000-Client: ESTAB→FIN_WAIT_1
2S → CACK=1120008001Server: ESTAB→CLOSE_WAIT Client: FIN_WAIT_1→FIN_WAIT_2
3S → CFIN=1,ACK=1120018001Server: CLOSE_WAIT→LAST_ACK
4C → SACK=1800112002Client: FIN_WAIT_2→TIME_WAIT Server: CLOSED 等待2MSL后Client關閉

?? 序列號遞增規則

  1. FIN標志位消耗1序列號(與SYN相同)
  2. 發送數據時:seq增加 = 數據字節數
  3. 發送控制位:seq增加 = 標志位數量

🔥 關鍵機制深度解析

1. 初始序列號 (ISN) 的隨機性

  • 生成算法:ISN = (計時器 × 加密因子) mod 232
    (現代系統使用安全隨機數生成)
  • 目的:防止前序連接的報文混淆(舊連接相同端口復用)

2. TIME_WAIT 狀態(2MSL等待)

// Linux內核參數配置
net.ipv4.tcp_fin_timeout = 60    // 控制TIME_WAIT持續時間
net.ipv4.tcp_max_tw_buckets = 18000 // 最大TIME_WAIT連接數
  • MSL定義:Max Segment Lifetime(報文最大生存時間,通常30秒)
  • 2MSL = 60秒:保證網絡中殘余報文消亡

3. 半關閉狀態(Half-Close)

當一方發送FIN后進入半關閉狀態:

4. 序列號回繞處理

32位序列號在高速網絡中可能溢出(10Gbps≈1.2GB/s):

// Linux內核序列號比較函數
static inline bool tcp_before_seq(u32 seq1, u32 seq2) {return (s32)(seq1 - seq2) < 0;
}
// 處理示例: 
// seq1=0xFFFFFF00, seq2=0x00000010 → 判斷seq1 < seq2(溢出場景)

?? 高頻面試問題

  1. 為什么是三次握手?

    阻止歷史重復連接初始化(防止舊SYN干擾新連接)

  2. 為什么需要TIME_WAIT狀態?

    確保被動關閉方能收到最終ACK(防止LAST_ACK超時重傳FIN)

  3. 服務器如何應對大量TIME_WAIT?

    # 內核優化命令
    echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse    # 重用TIME_WAIT連接
    echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle  # 快速回收(慎用)
    
  4. 握手時的序列號為什么隨機?

    避免TCP序列號預測攻擊(如IP欺騙攻擊)

  5. 為什么揮手是四次而不是三次?

    TCP連接允許單向關閉(半關閉狀態),需要獨立確認雙向關閉

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

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

相關文章

7月26號打卡

作業&#xff1a;題目1&#xff1a;計算圓的面積 任務&#xff1a; 編寫一個名為 calculate_circle_area 的函數&#xff0c;該函數接收圓的半徑 radius 作為參數&#xff0c;并返回圓的面積。圓的面積 π * radius (可以使用 math.pi 作為 π 的值)要求&#xff1a;函數接收一…

C++/CLI與標準C++的語法差異(一)

&#x1f30c; C/CLI與標準C的語法差異&#xff08;一&#xff09;&#x1f52c; 第一章&#xff1a;類型系統革命 - 徹底解構三語言范式 &#x1f9ea; 1.1 類型聲明語義差異矩陣 #mermaid-svg-L5kQ3iy05pKo4vIj {font-family:"trebuchet ms",verdana,arial,sans-se…

輸電線路微氣象在線監測裝置:保障電網安全的科技屏障

在電力傳輸網絡中&#xff0c;輸電線路微氣象在線監測裝置通過集成專業傳感器與智能分析技術&#xff0c;實現對線路周邊環境參數的實時采集與動態分析&#xff0c;為電網運行安全提供數據支撐。該設備針對輸電線路特殊工況設計&#xff0c;具備高適應性、高可靠性特點。工作原…

基于springboot的圖書借閱系統

用戶&#xff1a;借閱信息管理&#xff0c;續借信息管理&#xff0c;還書信息管理&#xff0c;圖書信息&#xff0c;系統公告&#xff0c;留言板&#xff0c;我的中心管理員&#xff1a;圖書信息管理&#xff0c;圖書類型管理&#xff0c;借閱信息管理&#xff0c;續借信息管理…

Xinference vs SGLang:詳細對比分析

概述對比特性XinferenceSGLang定位通用AI模型推理平臺高性能LLM服務框架專注領域多模態模型統一接口LLM推理性能優化設計理念易用性和兼容性性能和效率核心架構對比 Xinference 架構特點 Xinference 架構&#xff1a; ├── API層&#xff08;REST/CLI/Python&#xff09; ├─…

雙非上岸985!專業課140分經驗!信號與系統考研專業課140+上岸中南大學,通信考研小馬哥

一&#xff0e;經驗分享個人情況&#xff1a;初試總分377&#xff0c;政治59&#xff0c;英語二75、數學二103、專業課140。本科為湖南一所雙非一本&#xff0c;專業是電子信息工程&#xff0c;本科成績一般&#xff0c;無獎學金無評優無科研競賽&#xff0c;屬于三無人員&…

配置DNS正反向解析

服務端master配置:yum install bind -y配置靜態ip&#xff1a;修改配置文件&#xff1a;主&#xff1a;區域&#xff1a;正向解析&#xff1a;反向解析&#xff1a;開啟服務&#xff1a;客戶端node1配置&#xff1a;yum install nginx -y配置靜態ip&#xff1a;使用xftp將文…

MyBatis-Plus 通用 Service

引言 在開發 Java Web 應用程序時&#xff0c;我們經常需要進行大量的數據庫操作&#xff0c;如創建、讀取、更新和刪除&#xff08;CRUD&#xff09;。MyBatis-Plus 作為一個強大的 MyBatis 增強工具&#xff0c;為我們提供了通用 Service 接口&#xff0c;極大地簡化了這些操…

聚類-一種無監督分類算法

目錄 1、聚類任務 2、性能度量 &#xff08;1&#xff09;外部指標 &#xff08;2&#xff09;內部指標 3、具體聚類方法 &#xff08;1&#xff09;原型聚類 &#xff08;2&#xff09;密度聚類 &#xff08;3&#xff09;層次聚類 “無監督學習”(unsupervised learnin…

ES6 標簽模板:前端框架的靈活利器

ES6&#xff08;ECMAScript 2015&#xff09;引入的模板字符串&#xff08;Template Literals&#xff09;為 JavaScript 開發者提供了更簡潔的字符串處理方式&#xff0c;而模板字符串標簽&#xff08;Tagged Template Literals&#xff09;則進一步擴展了其功能性。通過標簽函…

解鎖編程核心能力:深入淺出數據結構和算法

——為什么它們是你代碼效率的終極武器&#xff1f; &#x1f31f; 引言&#xff1a;程序世界的基石 想象你正在建造摩天大樓&#xff1a;數據結構是鋼筋骨架&#xff0c;決定建筑的結構與承重能力&#xff1b;算法則是施工藍圖&#xff0c;指導如何高效完成建造。兩者結合&am…

Jenkins運行pytest時指令失效的原因以及解決辦法

錯誤收集 Started by user 偷走晚霞的人 Running as SYSTEM Building in workspace C:\Users\Administrator\.jenkins\workspace\TestAAA [TestAAA] $ cmd /c call C:\Users\Administrator\AppData\Local\Temp\jenkins5821160869728612887.bat C:\Users\Administrator\.jenkins…

MySQL數據庫本地遷移到云端完整教程

一、準備工作 安裝MySQL客戶端工具獲取云端數據庫連接信息&#xff1a; 主機地址端口號用戶名密碼數據庫名二、本地數據庫導出 mysqldump -h 127.0.0.1 -P 4406 -u root -p 數據庫名 > backup.sql執行后會提示輸入密碼&#xff0c;完成后會在當前目錄生成backup.sql文件 三、…

InvokeRepeating避免嵌套調用

InvokeRepeating嵌套這會導致指數級增長的重復調用堆疊。使用單一協程PeriodicActionRoutine替代所有InvokeRepeating避免方法間相互調用造成的堆疊如果需要多層級時間控制&#xff08;如主循環子循環&#xff09;&#xff1a;IEnumerator MultiLevelTimer() {float mainInterv…

【工具】好用的瀏覽器AI助手

&#x1f9e8; 一、什么是 Sider&#xff1f; Sider 是一個 Chrome 瀏覽器插件&#xff0c;你可以把它看作一個「網頁邊上的 AI 小助手」。 &#x1f5e3;? 它就像你網頁旁邊的 AI 機器人&#xff0c;可以幫你回答問題、總結文章、翻譯、寫文案、改寫內容、甚至幫你學習英文&…

C++:list(2)list的模擬實現

list的模擬實現一.list與vector1.底層結構的本質區別2.模擬實現的核心差異2.1數據存儲的方式2.2 初始化的過程2.3 插入元素的操作2.4 刪除元素的操作2.5 訪問元素的效率3.總結二.頭文件list.h1. **命名空間與模板**2. **核心數據結構**3. **構造函數**4. **模板參數設計**5. **…

【595驅動8*8點陣】2022-9-11

緣由LED點陣屏只能一次亮一列-嵌入式-CSDN問答 #include "REG52.h" sbit dsP1^0;//數據線 595的14腳 sbit shP1^1;//數據輸入時鐘線 595的11腳 sbit stP1^2;//輸出存儲器鎖存時鐘線 595的12腳 void QuDong595(unsigned char sj) {unsigned char aa8;while(aa--){ds…

AI總結視頻以及谷歌瀏覽器插件安裝步驟

本篇介紹用AI一鍵總結全網視頻內容的獨家方法&#xff0c;支持B站、抖音、小紅書等任何平臺的視頻&#xff0c;提高學習效率&#xff0c;幫助一鍵提取視頻文案、劃分章節&#xff0c;還能生成雙語翻譯&#xff0c;這個方法直接在線總結所有視頻。 一.準備工作&#xff1a; 需要…

網絡協議HTTP、TCP

概述如何讓數據具有自我描述性?為什么網絡有層級的劃分?交換機、路由器要不要閱讀一個信息的頭部&#xff1f;要不要閱讀數據部分&#xff1f; 網卡&#xff1a;網卡可以完成幀的封裝和解封裝&#xff0c;工作在數據鏈路層。 中繼器&#xff1a;中繼器以比特方式將網絡信號進…

Linux選擇題

第12題&#xff08;多選題&#xff09;原題: 能夠為邏輯卷增加容量的命令有( )。A. lvresize: 此命令可以用來調整邏輯卷的大小&#xff0c;既可以增大也可以縮小。例如&#xff0c;lvresize -L 1G /dev/vgname/lvname 會增加1GB&#xff0c;lvresize -L 10G /dev/vgname/lvnam…