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…