HarmonyOS-ArkUI Web控件基礎鋪墊4--TCP協議- 斷聯-四次揮手解析

HarmonyOS-ArkUI: Web組件加載流程1

HarmonyOS-ArkUI Web控件基礎鋪墊1-HTTP協議-數據包內容

HarmonyOS-ArkUI Web控件基礎鋪墊2-DNS解析

HarmonyOS-ArkUI Web控件基礎鋪墊3--TCP協議- 從規則本質到三次握手-CSDN博客

接上文,上文我們講解了:

  • 數據在四層網絡岑層架構中流轉方式
  • 傳輸層存在的意義
  • TCP協議具備的能力分析
  • TCP數據包部分字段設計由來
  • TCP建立連接的三次握手。

本文續上文講。將TCP是如何斷開連接的。

TCP的全雙工

TCP連接是全雙工的。雙工的意思就是,同時可以進行信號的雙向傳輸。也就是 A->B, 與 B->A可以同時發生。

我們在上文中其實提到過,TCP建立連接之前,會讓操作系統為在內核區劃分一些緩存。等到真正的建連之后,又會新建自己專門處理TCP事宜的緩沖區。這些緩存如果注意的話,您會發現均有一個,

  • 發送緩沖區。
  • 接收緩沖區。

開了倆緩沖區,就是為了更好的實現全雙工!如圖:

TCP協議,全生命周期中,都是按照全雙工來處理的。包括三次握手這么早的操作也是全雙工。 所以我們才會那么強調 發送包與響應包要--對得上,因為可能會收到"野包"!所以三次握手的時候,便強調了seq字段和ack字段的搭配規則,因為要用他們排除野包。

TCP斷聯,最主要斷的是什么

TCP斷開連接其實就是AB雙方比較安全的不再對數據包進行處理的過程。確定了可以不再處理之后便可以釋放自己本地的資源。我們知道了全雙工這種支持,無論是A還是B,其代碼運行時中必然會包含:

  • 發送數據處理邏輯,以及運行時發送相關占用的資源,如內核中的發送緩沖區。
  • 接收數據處理邏輯,以及運行時接收相關占用的資源,如內核中的接收緩沖區。

如下圖所示,A和B如果他倆想斷聯,回收掉自己占用的資源,則必須打斷二者通路:

而TCP中的斷聯,就是將這套全雙工通路斷聯,也就是兩個方向的傳輸全部斷聯

斷掉一個方向上的傳輸是由哪一方決定的?

答: 發送方!

斷掉一個方向上的傳輸發起者,無非是發送方,和接收方。

  • 假設發送方是發起者
    • 發送方最了解自己的數據,什么時候結尾它最清楚!發完了就斷聯,也順理成章。
  • 假設接收方是發起者
    • 接收方就是個被動接收者,著實不知道對方傳來的數據是什么情況。 傳沒傳完不知道,提前斷聯數據會丟失。 斷聯的太晚了,發送方數據早傳輸完了它還不斷聯,自己的資源被占用啥活也干不成。

綜上,發起斷聯者必定是,發送方!

而 A 和 B這套系統里,因為是全雙工工作, 他倆是互為發送方的!

僅斷掉一個方向上的傳輸,怎么做?

那就是發送方向接收方發送一個數據, 這個數據里的內容可以讓對方檢測出,自己想要斷掉這條連路,以后不會傳輸業務數據了! 解決辦法就是用 FIN 字段標記:

FIN為finish的縮寫,表示發送方已經完成數據傳輸,并請求關閉連接。占用1個Bit位。其核心作用便是通知對端,本方向的數據傳輸已經結束了。

如圖所示為單方向斷掉連接發生的細節, 也是TCP四次揮手中,前兩次揮手的細節!尤其要注意一下最左側的紅色備注,這個關系到對各個字段設置的理解:

上圖中值得注意的是,第一次的揮手包, 我們的ACK=0, ack序列也是無效的。但是之后服務端處理的時候,它的ACK倒是1, ack也是正常的。 這是為什么呢??如果您之前了解四次揮手,會曉得第三次揮手,服務端發過來的包ACK = 1 !如下圖為四次揮手的全部字段變化:

揮手

方向

SYN

ACK

FIN

seq

ack

第一次揮手

A -> B

0

0

1

a

-

第二次揮手

B -> A

0

1

0

b

a+1

第三次揮手

B -> A

0

1

1

b+ n(半關閉數據長度)

a+1

第四次揮手

A -> B

0

1

0

a + 1

b+ n+ 1

因為斷開聯接是一個事務!不可被打斷,不可被顛倒!

A第一次揮手的時候ACK=0, 既代表著A以后都不打算發送業務數據包了,這個包就是一個控制包,還是自己主動發起的!并且以此為TCP斷開連接的起點。之后不容打斷。。也就是假設A已經關閉了 A -> B的通路時候,萬一收到一個包,這個包的格式正是服務端發起的第一次揮手包, 就直接被扔掉不予處理。避免混亂!

TCP全雙工斷聯--四次揮手

到目前為止我們已經處理完一半了,如果具象化的話,現在A 和 B之間應是這樣的場景!

也就是此時其實B仍然可以向A發數據的!可能有信息還沒有傳完,需要繼續傳輸。 也可能也沒什么數據好傳了。但任務總有完成的那一刻。完工后便要發起 B -> A 方向的斷聯了!

接下來是第三次揮手和第四次揮手的流程:

四次揮手總結:

我們上文著重講了下原理。下方為四次揮手的流程歸納:

第一次揮手(Client → Server)

字段值:SYN=0, ACK=0, FIN=1, seq=u, ack=v(無效)

  • seq=u:u為客戶端最后發送數據的下一字節序號(例:最后數據字節序號為100,則u=101)
  • ACK=0:因主動發起關閉,無需確認對方數據
  • FIN=1:觸發關閉流程,占用1序列號(下次seq=u+1)
  • 狀態變化:Client → FIN_WAIT_1
2. 第二次揮手(Server → Client)

字段值:SYN=0, ACK=1, FIN=0, seq=v, ack=u+1

  • ack=u+1:確認客戶端的FIN(FIN占1序列號,故+1)
  • seq=v:v為服務器當前數據流位置(與客戶端FIN無關)
  • FIN=0:僅確認關閉請求,不立即關閉本方連接
  • 狀態變化:Server → CLOSE_WAIT, Client → FIN_WAIT_2
3. 第三次揮手(Server → Client)

字段值:SYN=0, ACK=1, FIN=1, seq=w, ack=u+1

  • seq=w:w = v + 半關閉期間數據長度(例:第二次揮手后發送80字節數據,則w=v+80)
  • ack=u+1:仍為首次揮手的FIN確認(客戶端無新數據)
  • FIN=1:服務端數據發送完畢,關閉本方通道
  • 狀態變化:Server → LAST_ACK
4. 第四次揮手(Client → Server)

字段值:SYN=0, ACK=1, FIN=0, seq=u+1, ack=w+1

  • seq=u+1:首次揮手的FIN消耗序號u,故下一序號為u+1
  • ack=w+1:確認服務端的FIN(FIN占1序列號,故w+1)
  • ACK=1:必須置1以確認FIN
  • 狀態變化:Client → TIME_WAIT(2MSL后關閉),Server → CLOSED

為什么揮手要四次

仍是一個八股問題。以下是貼的答案:

服務器在收到客戶端的 FIN 報文段后,可能還有一些數據要傳輸,所以不能馬上關閉連接,但是會做出應答,返回 ACK 報文段.

接下來可能會繼續發送數據,在數據發送完后,服務器會向客戶單發送 FIN 報文,表示數據已經發送完畢,請求關閉連接。服務器的ACK和FIN一般都會分開發送,從而導致多了一次,因此一共需要四次揮手。

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

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

相關文章

如何用AI 生成論文/書籍的摘要

不知道大家是否有這樣的感覺,上網瀏覽信息,看到好的文章就興奮地下載了下來,文件的名稱通常是一串奇奇怪怪的字符串。過了幾天就在電腦中找不著了。沒有網絡上搜索不到的文章,而是在你的電腦中卻找不到它們。幾年下來,…

ubuntu系統+N卡 | docker compose+ollama+dify(dify和ollama在同一容器)

1、安裝NVIDIA驅動 2、安裝docker,docker compose 3、安裝NVIDIA Container Toolkit Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit(僅 GPU 場景需要) # Configure the production repository: curl -fsSL https://…

實習手記:基于大模型的搜索引擎開發實踐

初入團隊:從理論到實踐的跨越五月份開始,我懷著忐忑又期待的心情以線上的方式加入了公司AI研發中心的搜索引擎優化小組。作為一名數據科學與大數據技術專業的學生,這是我第一次參與工業級AI項目的開發,團隊的任務是構建一個基于大…

用Python實現神經網絡(二)

#Overfitting是機器學習的主要問題。下面我們來看一下過擬合現像:import numpy as npimport matplotlib.pyplot as pltimport matplotlib as mplimport tensorflow as tffrom scipy.optimize import curve_fit# Generic matplotlib parameters for plots and figure…

數據結構入門 (二):掙脫連續空間的束縛 —— 單向鏈表詳解

TOC(目錄) 引言:整齊的代價 在上一篇文章中,我們一起探索了數據結構大家族的第一位成員——順序表。我們了解到,順序表作為一種線性結構,其最大的特點在于邏輯順序與物理順序的一致性,即元素之間不僅存在邏輯上的前后關…

AI-視頻一致性與多幀控制在AIGC中的技術挑戰與突破!

全文目錄:開篇語前言1. 視頻中人物一致性建模的難點與現有解決方案**人物一致性建模的挑戰****現有解決方案****案例代碼:基于姿態估計的多幀一致性保持**2. 光照/紋理/姿態跨幀保持方法剖析**跨幀光照與紋理一致性****跨幀姿態一致性**3. 幀間插值與關鍵…

基于Qwen2.5-3B-Instruct的LoRA微調與推理實戰指南

前言 大語言模型(LLM)的微調是當前AI領域的熱門話題,而參數高效微調方法(如LoRA)因其低成本和高效率備受關注。本文將手把手教你如何使用Qwen2.5-3B-Instruct模型進行LoRA微調,并構建完整的推理流程。 一、環境準備 1.1 硬件要求 ? GPU: 至少16GB顯存(如…

電腦插上u盤不顯示怎么回事

對于經常使用電腦的用戶來說,U盤是一種再熟悉不過的存儲工具。不管是拷貝資料、備份文件,還是制作啟動盤,U盤都發揮著重要作用。然而,有時候你可能會遇到這樣的情況:“U盤插上電腦,燈亮了,但電腦…

2025年6月GESP(C++二級): 冪和數

2025年6月GESP(C++二級): 冪和數 題目描述 對于正整數 n n n,如果 n n n 可以表為兩個

Windows、macOS、liunx下使用qemu搭建riscv64/linux

背景 在Windows、macOS和Linux環境下使用QEMU搭建RISC-V 64位Linux系統,網絡上存在大量過時、不完整或錯誤的教程。且部分AI生成的內容“幻覺”現象嚴重,導致關鍵步驟錯誤且難以進行。為確保可靠性,本教程基于最新實測驗證,涵蓋三…

簡單使用MCP

1、說明# 測試環境服務器 CPU數量:2核 內存:4GB 磁盤:50GB# 補充 如果不想使用Docker進行操作,只需要跳過Docker相關命令操作 即:使用Ollama運行模型,使用Python來創建MCP2、安裝Docker# 安裝Docker https:…

電腦裝機軟件一鍵安裝管理器

軟件使用 現在的裝機軟件很多,主要幾種類型就是辦公、看圖、影音、下載等,如果每次裝機之后,手動一個一個去安裝,費時費力還容易安裝到全家桶。 就有人整理了網絡上常用的一系列裝機軟件純凈和諧版本,并打包到一起&a…

深度學習入門-深度學習簡介

深度學習是加深了層的深度神經網絡。只需通過疊加層,就可以創建深度網絡。1、 加深網絡將深度學習中的重要技術(構成神經網絡的各種層、學習時的有效技巧、對圖像特別有效的CNN、參數的最優化方法等)匯總起來,創建一個深度網絡&am…

Linux 下安裝DM8數據庫詳細教程

Linux 下安裝DM8數據庫詳細教程 一、環境準備 1.操作系統要求 DM 數據庫支持多種操作系統,如 Windows、Linux 等。對于 Linux 系統,確保內核版本符合要求,例如 CentOS 7 或更高版本。同時,要保證系統有足夠的磁盤空間(建議至少 10GB 以上)和內存(至少 1GB 以上)。 對…

搭建基于Gitee文檔筆記自動發布

搭建基于Gitee文檔筆記自動發布由于現在gitee不支持代理靜態頁面,并且github.io需要VPN,實際使用的話gitee更為方便。一、為服務器和個人PC添加免密push和pull 參考鏈接:https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE…

【Lua】閉包可能會導致的變量問題

先思考下面這個問題:local function counter()local count 0return function()count count 1return countend endlocal a counter() local b counter()print(a()) --> ? print(a()) --> ? print(b()) --> ? print(a()) --> ?輸出結果&#xff…

可觀測性、OpenTracing、OpenCensus、OpenTelemetry、Jaeger

監控與觀測 隨著軟件應用從單片架構向分布式微服務體系轉變,應用監控(Monitoring)和觀測(Observability)的需求也隨之提升。兩者存在相同的定義,目的都是為了發現應用程序中的問題。但還是有差別: 監控:目的是為了捕獲已知的問題…

Linux下使用原始socket收發數據包

在Linux系統中,使用非原始的socket,可以收發TCP或者UDP等網絡層數據包。如果要處理網絡層以下的數據包,比如ICMP、ARP等,或者更底層,比如鏈路層數據包,就得使用原始socket了。 創建socket 創建socket要使用…

暑期自學嵌入式——Day05補充(C語言階段)

接續上文:暑期自學嵌入式——Day05(C語言階段)-CSDN博客 主頁點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!! 主頁: 一位搞嵌入式的 genius-CSDN博…

.NET Core EFCore零基礎快速入門簡單使用

一、什么是 Entity Framework (EF) Core Entity Framework (EF) Core 是輕量化、可擴展和跨平臺版的對象關系映射程序 (O/RM)數據訪問技術,。 它將開發人員從編寫大量 SQL 語句中解放出來。 二、EF的相關程序包 Microsoft.EntityFrameworkCore 核心程序包&#x…