TCP 三次握手、四次揮手

三次握手

三次握手形象版,快速理解

deepseek 的象形比喻:三次握手建立連接就像打電話一樣:
(1) A 打給 B,“喂, 你能聽到我說話嗎?”
(2) B 回答 A,“嗯,可以聽到,你能聽到我說話嗎?”
(3) A 回答 B,“沒問題,可以聽到,我們開始聊天吧!”
客戶端請求服務器的過程,可以將 A 當作客戶端,B 當作服務器,它們進行“握手”的目的是證明自己的接收能力和發送能力都是正常的。
第一次握手,客戶端向服務器發送消息,服務器收到消息后,服務器知道了:客戶端的發送能力和服務器的接收能力沒問題
第二次握手,服務器向客戶端發送消息,客戶端收到消息后,客戶端知道了:客戶端的發送能力、服務器的接收能力、服務器的發送能力、客戶端的接收能力都是沒問題的。但此時服務器不知道自己的發送能力和客戶端的接收能力是否正常
第三次握手,客戶端向服務器發送消息,服務器收到消息后,服務器就知道:自己的發送能力和客戶端的接收能力也沒問題(在第一次握手的時候,服務器已經知道了自己的接收能力和客戶端的發送能力沒問題)
三次握手結束,客戶端和服務器建立連接成功!

三次握手詳細過程

在 Tcp 報文頭部,有下面幾個比較關鍵的字段:
SYN:同步序列號,是一個控制位,當它為 1 時,表示這是一個用于建立連接的報文
ACK:也是一個控制位,當它位 1 時,表示報文中的ack字段是有效的,除了第一個 SYN 包,后續所有 ACK 位都必須是 1
seq:序列號,標識本報文所發送數據的第一個字節的編號(TCP 是可靠傳輸,每個字節都有編號,確保數據有效不丟失)
ack:確認號,期望收到對方下一個報文段的第一個數據字節的序列號,同時表示ack-1之前的所有數據都已正確收到
第一步,客戶端發送 SYN: 設置 SYN 標識位為1,并隨機生成一個初始序列號 x,放在 seq 字段里(服務器你好,我想和你建立連接,我數據的初始序列號為 x)
第二步,服務器回復 SYN-ACK: 服務器收到報文后,同意建立連接,于是回復一個報文,SYN-ACK 包,這個包將 TCP 標志位的 SYN 和 ACK 都設置為 1,同時,服務器也隨機生成自己的初始序列號 y,放在 seq 字段里,同時需要確認客戶端的 SYN 包。確認方法:將客戶端發來的序列號 x 加 1 作為 ack 的值發回去(客戶端你好,我同意建立連接,我數據的初始序列號是 y,并且我已經收到你的序列號 x,接下來期望從你的第 x+1 個字節的數據開始接收)
第三步,客戶端發送 ACK: 客戶端收到服務器的 SYN-ACK 包后,連接基本已經建立,客戶端需要發送最后一個確認包,將 ACK 標志位設置為1,seq 字段此時變為了 x+1,因為第一步的 SYN 包會消耗一個字節,同時,客戶端需要確認服務器的消息,因此,將 ack 字段設置為 y+1 發送回去(服務器,我已收到你的確認,接下來建立連接吧!接下來,客戶端發送的數據將從 x+1 開始,并且期望服務器從第 y+1 個字節的序列開始接收)

注意:x 和 y 都是隨機生成的,因此 x+1 和 y+1 只是一個象征性的編號,意思是將客戶端發送數據的起始位置命名為編號 x+1,服務器要發送的數據起始位置命名為編號 y+1。

三次握手之后,客戶端和服務端都會進入 ESTABLISHED 狀態

四次揮手

四次揮手象形理解

A 和 B 打電話,要禮貌的結束通話
(1) A 對 B 說,“我沒什么要說的了,我要掛了”(客戶端發送消息通知服務器,我的消息發送完了,準備斷開連接了)
(2) B 回答 A,“ok 我知道你說完了,但是稍等,我還有話要說”(服務器收到客戶端要結束連接的請求,但服務器的消息還沒有發送完,此時客戶端——>服務器的通道關閉,客戶端不能再給服務器發消息,但是服務器依然可以給客戶端發)
(3) B 對 A 說,“好了,我說完了,我要掛了!”(服務器消息發送完畢)
(4) A 對 B 說,“好的,我們掛了吧。”(雙方通道全部關閉)

四次揮手詳細過程

第一步,客戶端發送 FIN: 將 FIN 標志位設置位 1,這是連接結束的信號,報文中的 seq 字段為 u,u 表示客戶端已發送的數據最后一個字節的序列號加 1,客戶端進入 FIN-WAIT-1 狀態(客戶端對服務器說,我沒數據給你了,我要關閉我到你那邊的發送通道了)
第二步,服務器回復 ACK: 服務器收到 FIN 包后,發送一個確認包,ACK 的標志位設為 1,將客戶端發來的序列號加1,即將 ack 的值設置為 u+1,并發送回去,此時,客戶端進入 CLOSE-WAIT狀態,因為客戶端->服務器關閉,但服務器->客戶端未關閉,此時,服務器進入半關閉Half-Colse狀態 (服務器確認客戶端即將關閉連接通道,進入半關閉狀態)
第三步,服務器發送 FIN: 服務器向客戶端發送完消息了,也準備關閉連接。將 FIN 和 ACK 字段都設置為 1,seq 字段設置為 w,w 是服務器之前已經最后一個字節的序列號 + 1,ack 字段依然是 u+1,服務器進入LAST-ACK狀態(服務器發送完消息,通知客戶端,即將關閉發送通道)
第四步,客戶端回復 ACK: 客戶端收到服務器 FIN 包后,知道服務器發送完了,于是向服務器發送最后一個確認包,ACK 標志位設為1,將 ack 設置為服務器發來的序列號 w 加1,即 ack = w+1,客戶端進入 TIME-WAIT狀態,時間為2MSL(兩倍的最大報文段生存時間)當 TIME-WAIT 狀態結束后,變為 CLOSED,服務器收到這個 ACK 包后,釋放資源,狀態變為 CLOSED。如果服務器沒有收到 ACK,它就會再次發送 FIN,此時處于 TIME-WAIT 狀態的客戶端還能再次發送 ACK,這就是 TIME-WAIT 狀態存在的意義!

為什么不是三次揮手?
因為TCP是全雙工的,允許在兩個方向上獨立傳輸,所以 TCP 可以半關閉,需要耗費一個來回

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

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

相關文章

數據管理戰略|1概念及組成部分

【小語】前面兩個文章講到了“數據管理戰略數字化轉型、數據驅動”三者之間關系,數字化改革中的原則與邏輯,本節用三次文章學習數據管理戰略內容的組成部分(DAMA數據管理第1章1.2.6節)。 數據戰略 VS 數字化轉型 VS 數據驅動 數據管理戰略|熵減與熵增相容原則 下文為【…

3.遠程控制網絡編程的設計上

RemoteCtrl.cpp// RemoteCtrl.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。 //#include "pch.h" #include "framework.h" #include "RemoteCtrl.h"#ifdef _DEBUG #define new DEBUG_NEW #endif// 唯一的應用程序對象C…

畢業設計|基于Python的課程智能問答系統

4系統設計4.1功能模塊設計對本系統進行全面的系統功能的分析,可以得出基于Python《Python程序設計》課程智能問答系統的功能模塊圖,如圖4-1所示。圖4-1 系統功能模塊圖4.2數據庫設計4.2.1數據庫設計原則學習程序設計時,若想要深入理解數據庫管…

iOS原生開發和Flutter開發的看法

這是一個技術選型的問題。作為一名同時精通iOS原生和Flutter的開發者,我的看法是:這不是一個“二選一”的問題,而是一個“如何根據場景做最佳選擇”的問題。 它們不是替代關系,而是互補關系。以下是我對兩者的對比和看法&#xff…

docker桌面版 鏡像配置

配置內容 Docker Engine配置*(截止2025年09月10日能用) {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": [&q…

Java 面向對象基礎初步

Java 面向對象基礎初步 面向對象的核心概念概覽 面向對象的核心目標是 把數據和操作封裝在一起(對象),并通過抽象、繼承與多態組織程序。簡而言之,我們總是沒法回避程序設計的四個話題: 封裝(Encapsulation…

反向代理技術

一、核心比喻:公司的總機前臺 想象一下一家大公司: 客戶:想聯系公司里的某位員工(比如技術部的張三)。公司的總機號碼(唯一公開的號碼):比如 400-123-4567。前臺:接聽總機…

數據整理器(Data Collators)(90)

數據整理器(Data Collators) 數據整理器(Data Collators) 導致問題的“罪魁禍首”,往往是長度不一的序列。 指令格式 關鍵術語說明 數據整理器(Data Collators) 數據整理器負責將多個數據樣本拼接成一個迷你批次(mini-batch)。它通常處于“隱形”狀態——每次使用PyT…

PySpark EDA 完整案例介紹,附代碼(三)

本篇文章Why Most Data Scientists Are Wrong About PySpark EDA — And How to Do It Right適合希望高效處理大數據的從業者。文章的亮點在于強調了使用PySpark進行探索性數據分析(EDA)的重要性,避免了將Spark數據框轉換為Pandas的低效做法。…

leetcode18(無重復字符的最長子串)

給定一個字符串 s ,請你找出其中不含有重復字符的 最長 子串 的長度。示例 1:輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。思路:對于長度為0的數組單獨處理其他數組最小的可能…

計算機畢設 java 高校家教平臺 基于 SSM 框架的高校家教服務平臺 Java+MySQL 的家教預約與課程管理系統

計算機畢設java高校家教平臺75snd9 (配套有源碼 程序 mysql數據庫 論文)本套源碼可以先看具體功能演示視頻領取,文末有聯xi 可分享在高校家教需求增長的背景下,傳統家教對接依賴線下中介、信息分散,存在溝通成本高、課…

【自記】Python 的 SQLAlchemy 完整實踐教程

目錄 SQLAlchemy 介紹環境準備與安裝數據庫連接數據模型定義基本數據操作復雜查詢操作高級特性實戰項目示例性能優化與最佳實踐常見問題與解決方案 1. SQLAlchemy 介紹 1.1 什么是SQLAlchemy SQLAlchemy 是一個用于 Python 的 SQL 工具和對象關系映射(ORM&#x…

springboot rabbitmq 延時隊列消息確認收貨訂單已完成

供應商后臺-點擊發貨-默認3天自動收貨確認&#xff0c;更新訂單狀態已完成。1 pom.xml 引入依賴&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2 …

Linux內核TCP輸出引擎:深入解析數據傳輸的核心機制

引言 傳輸控制協議(TCP)作為互聯網最重要的基礎協議之一,其實現質量直接關系到網絡性能和應用體驗。在Linux內核中,TCP協議的輸出引擎是實現可靠數據傳輸的核心組件,負責將應用層數據高效、可靠地傳輸到網絡對端。本文將深入分析Linux內核中TCP輸出引擎的關鍵機制和實現原…

數據倉庫詳解

數據倉庫詳解第一節 數據倉庫構建方法論和實踐一、數據倉庫與數據庫的區別二、數據倉庫對于企業的價值三、數據倉庫的模型構建1、數據倉庫構建需要考慮的問題2、什么是數倉的數據模型3、如何構建數倉的數據模型&#xff08;1&#xff09;概念模型設計&#xff08;2&#xff09;…

單身杯1(web)

web簽到<?php# -*- coding: utf-8 -*- # Author: h1xa # Date: 2022-03-19 12:10:55 # Last Modified by: h1xa # Last Modified time: 2022-03-19 13:27:18 # email: h1xactfer.com # link: https://ctfer.comerror_reporting(0); highlight_file(__FILE__);$file $_…

RNN/LSTM/GRU/Transformer

RNN的局限1&#xff1a;長期依賴&#xff08;Long-TermDependencies&#xff09;問題但是同樣會有一些更加復雜的場景。比如我們試著去預測“I grew up in France...I speak fluent French”最后的詞“French”。當前的信息建議下一個詞可能是一種語言的名字&#xff0c;但是如…

瀏覽器開發CEFSharp+X86 (十六)網頁讀取電子秤數據——仙盟創夢IDE

一、東方仙盟智能瀏覽器&#xff1a;跨平臺&#xff0c;暢連百種硬件&#xff0c;速啟現場編譯東方仙盟 VOS 智能瀏覽器在網頁調用硬件 SDK 領域堪稱卓越典范。它全面兼容多平臺&#xff0c;無論是電腦、手機還是各類移動終端&#xff0c;都能完美適配&#xff0c;無縫對接。令…

騰訊云EdgeOne免費套餐:零成本開啟網站加速與安全防護

騰訊云EdgeOne免費套餐&#xff1a;零成本開啟網站加速與安全防護 ?一鍵解鎖全球3200節點&#xff0c;讓網站速度提升53%&#xff0c;同時獲得企業級安全防護作為一名站長或個人開發者&#xff0c;你是否曾為網站加載速度緩慢而苦惱&#xff1f;是否擔心網站遭遇DDoS攻擊或惡意…

服務器數據恢復—Raid6陣列崩潰導致上層分區無法訪問的數據恢復案例

服務器存儲數據恢復環境&#xff1a; 一臺infortrend某型號存儲&#xff0c;存儲設備上有12塊硬盤&#xff0c;組建一組raid6磁盤陣列。陣列上層有一個lun&#xff0c;映射到WINDOWS系統上使用。WINDOWS系統劃分了一個GUID Partition Table分區。服務器存儲故障&#xff1a; 存…