[Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制
目录
一. 认识TCP协议的报头
1.TCP头部格式
2. TCP协议的特点
二. TCP如何封装与分用
TCP 报文封装与解包
如何封装解包,如何分用
分离有效载荷
隐含问题:TCP 与 UDP 报头的区别
封装和解包的逆向过程
如何分用 TCP 报文
如何通过端口号找到绑定的进程?
数据交付给进程的过程
总结
三. TCP 的可靠性
学习 TCP 可靠性 (确认应答) && 提高传送效率
1. 网络传输中的不可靠问题
2. 网络传输中的不可靠性场景
3. TCP 可靠性的保证机制
4. TCP 收发消息的工作模式
5. 捎带应答机制
6. 批量确认的工作模式
四. 理解TCP的报头
1. 4位首位长度
2. 序号和确认序号:TCP 全双工通信与确认应答机制
2.1. TCP 真实工作模式
2.2. 问题分析
2.3. TCP 报文序号机制
2.4. 确认应答的机制
2.5. 丢包场景下的应答机制
2.6. 两组序号的必要性
2.7. 数据到达顺序与序号
3. 窗口大小:TCP缓冲区与流量控制
缓冲区的作用
数据传输过程
流量控制的必要性
流量控制机制
全双工通信
交换接收能力
TCP报头细节很多,我们打算这样开始
- 认识TCP协议的报头 — 字段
- 如何理解TCP的报头
- 如何封装解包,如何分用
- 学习TCP可靠性(确认应答) && 提高传送效率
一. 认识TCP协议的报头
1.TCP头部格式
TCP全称“传输控制协议”(Transmission Control Protocol),它对数据传输进行了详细的控制。TCP头部包含多个字段,每个字段都有特定的功能,以确保数据能够可靠地从一个端点传输到另一个端点。
理解TCP的报头:
Linux内核是C语言写的,在UDP说过报头是协议的表现,而协议本质就是结构体数据。所有tcp报头就是一个结构化或位段。
struct tcp_hdr这是一个类型,可以定义出一个对象。
把应用层的数据拷贝到缓冲区里,然后把报头拷贝到前面,不就是添加报头吗~
TCP协议报文也有自己的报头+有效载荷,这个有效载荷是应用层的报文,当然包含应用层报头和有效载荷。
- 源/目的端口号: 表示数据是从哪个远端进程来, 到服务器哪个进程去
- 序列号:用于解决网络包乱序问题,每次发送数据时累加数据字节数。
- 确认应答号:指下一次期望收到的序列号,帮助解决丢包问题。
- 4位TCP报头长度:表示该TCP头部有多少个32位比特,最大长度为60字节。
6位标志位:
- SYN: 希望建立连接。
- ACK: 确认应答字段有效。
- FIN: 断开连接。
- PSH: 提示接收端应用程序立刻读取数据。
- RST: 要求重新建立连接。
- URG: 表示紧急指针字段有效。
- 16位窗口大小:表明接收缓冲区还能容纳多少数据。
- 16位校验和:验证整个TCP段的完整性。
- 16位紧急指针:标识紧急数据的位置。
- 40字节头部选项:提供额外的信息或功能。
2. TCP协议的特点
- 面向连接:TCP必须先建立连接才能进行数据传输。
- 可靠:无论网络状况如何变化,TCP都能保证数据的正确传递。
- 字节流:消息无边界,可以传输任意大小的数据,并且保持顺序。
二. TCP如何封装与分用
- 4位首部长度:表示TCP头部的总长度。
- 如何封装:将应用层的数据加上TCP头部后交付给IP层。
- 如何分用:根据头部长度计算出有效载荷的位置并提取数据。
TCP 报文封装与解包
- 报文宽度:0-31 bit 是这个报文的宽度。每行4个字节,总共5行,因此标准 TCP 报文的长度是20字节,选项部分暂不考虑。
- TCP 报文标准长度:标准 TCP 报文长度是20字节。
如何封装解包,如何分用
作为接收方,如何保证把一个 TCP 报文全部读完呢?其实很简单,具体步骤如下:
- 读取 TCP 标准报头:
-
- TCP 协议有标准长度:20字节。因此,先读取前 20 字节。
- 这 20 字节转换为结构化数据后,立刻提取报头中的 4 位首部长度字段。
- 计算 TCP 报头总长度:
-
- 4 位首部长度字段表示的 TCP 报头总长度。其值范围为 0000-1111,即 [0,15]。
- 4 位首部长度字段单位为 4 字节,因此 TCP 报头总长度 = 4 位首部长度 * 4 字节。报头长度范围为 [0,60] 字节。由于标准报头长度是 20 字节,因此最终 TCP 报头长度范围为 [20,60] 字节。
- 确定报头长度的计算:
-
- 若报头长度是 20 字节,则 4 位首部长度应填写为:
x * 4 = 20
,因此 x = 5,即 0101。
- 若报头长度是 20 字节,则 4 位首部长度应填写为:
- 计算选项长度:
-
- 如果 TCP 报头长度为
x * 4
,则减去 20 字节的标准长度后,剩下的即是选项的长度字节数。 - 若无选项,则
x * 4 - 20 = 0
;若有选项,则继续读取选项部分长度。
- 如果 TCP 报头长度为
分离有效载荷
一旦读取完 TCP 报头,剩下的数据即为有效载荷,将其放入 TCP 接收缓冲区供上层继续读取。
隐含问题:TCP 与 UDP 报头的区别
- UDP 报头:包含了 UDP 报文的长度,因此很容易确定 UDP 有效载荷的长度。
- TCP 报头:仅包含 TCP 报头长度,但并未明确有效载荷长度。这是因为 TCP 是面向字节流的协议。
封装和解包的逆向过程
解包完成后,封装的过程也可以反向推导出来。只要能解包,就可以逆向封装报文。
如何分用 TCP 报文
在 TCP 报头中有 目的端口号,通过该端口号可以定位应用层的进程,将数据交付给相应进程。
如何通过端口号找到绑定的进程?
当接收到一个报文,如何找到绑定了特定端口的进程呢?以下是过程解析:
- 网络协议栈与文件的关系:
-
- 虽然 PCB(协议控制块)通过双链表进行组织和管理,但为了快速定位进程,系统将每个 PCB 添加到一个数据结构中——哈希表。
- 系统中,
bind
绑定一个端口时,会在 OS 中以端口号作为 key 维护一张哈希表。
- 通过哈希表定位进程:
-
- 当收到一个目的端口号 8080 的报头时,OS 会使用端口号查找哈希表,迅速找到与该端口绑定的进程 PCB。
数据交付给进程的过程
- 找到进程后如何交付数据?
-
- 每个进程的 PCB 都维护有一个文件描述符表。文件描述符表的 0、1、2 是默认占用的,假设进程打开的文件描述符是 3,此时 socket 对应的就是 3。
- Linux 文件系统与网络协议栈的关系:
-
- 在 Linux 下,一切皆文件。OS 为了维护文件,创建了一个
struct file
结构,内含许多读写方法的函数指针。 - Linux 下文件的读写方法通过函数指针实现,对应文件的读写方法实际是传输层的读写方法。
- 文件还有自己的缓冲区,用于存放数据。
- 在 Linux 下,一切皆文件。OS 为了维护文件,创建了一个
- 读写过程:
-
- 当传输层收到 TCP 报文后,会将报头和有效载荷分离。有效载荷被放入文件的缓冲区中,上层应用通过文件描述符读取缓冲区,即可获取数据。
总结
数据报文经过 OS 各层处理,最终将有效载荷存放到文件的缓冲区中。上层应用可以通过文件的方式统一读取网络数据,实现了网络数据的封装与解包。
三. TCP 的可靠性
- 32位序列号:对每个字节的数据编号,确保按序到达。
- 32位确认应答号:响应历史数据,确保数据被正确接收。
- 确认机制:通过序列号和确认应答号来保证数据的可靠性。
学习 TCP 可靠性 (确认应答) && 提高传送效率
1. 网络传输中的不可靠问题
❓ 谈 TCP 必谈可靠性,但在讨论可靠性之前,先考虑几个问题:
- 为什么网络传输时会存在不可靠的问题?
- 不可靠问题常见的场景有哪些?
- TCP 的可靠性如何保证?
以前我们学过冯诺依曼体系结构,里面包括 CPU、内存、外设(如显示器、键盘、鼠标、磁盘等),这些设备都是独立的。但我们可以将键盘的数据放入内存,也可以将内存中的数据传送到 CPU,这说明各个硬件并非孤立的,它们之间是有联系的。这些设备通过计算机中的“线”连接。
- 内存和外设之间通信:通过 I/O 总线。
- 内存和 CPU 之间通信:通过 系统总线。
内存和外设之间的通信也有自己的协议。因为有协议,所以可以控制外设。而这类协议的开发者通常属于“嵌入式”领域。
虽然内存和外设之间有通信协议,但我们并未讨论它们之间的可靠性问题。原因在于它们之间的距离很近,不存在网络传输中的可靠性问题。
2. 网络传输中的不可靠性场景
为什么网络传输时会存在不可靠的问题?
- 原因:传输距离变长了。
常见的不可靠场景有哪些?
- 丢包
- 乱序
- 重复
- 校验错误
3. TCP 可靠性的保证机制
如何理解 TCP 的可靠性?
假设两个人 A 和 B 之间相隔 500 米,A 问 B:“你吃饭了吗?” A 不能确定 B 听到了,除非 A 收到 B 的应答。所以,只有在收到应答的情况下,A 才能确认 B 听到了这句话。
但当 B 给 A 回复“我吃了”时,B 也无法确定 A 是否收到了这条信息。同样,只有当 A 回应后,B 才能确定 A 收到了“我吃了”这条信息。
这个例子说明了以下两点:
- 只有收到了应答,才能100%确认对方收到了之前的信息。
—— 确认应答后,消息才算可靠。 - 通信中总会存在最新消息没有得到应答的情况。
—— 最新消息一般无法保证可靠性。
因此,传输距离变长后,不可能存在绝对可靠性,只能保证相对可靠性。只要收到应答,就能保证该报文的可靠性。这就是 TCP 可靠性的基础:确认应答机制。
4. TCP 收发消息的工作模式
在学习 TCP 时,需要理解两种工作模式:
- 理论上的便捷理解方式。
- 实际工作中的 TCP 工作模式。
实际通信过程:
- Client 发起请求,Server 必须给确认。
由于应答的存在,Client 可以确认 Server 100% 收到了请求,因此可以保证 Client->Server 的可靠性。 - Server 回应 Client,Client 也必须给确认。
同理,这也保证了 Server->Client 的可靠性。
因此,通过确认应答机制,双方的数据传输都能保证可靠性。这些请求和应答是通过封装成 TCP 报文进行发送的。在实际通信中,除了正常的数据段,通信时也包含确认数据段。
5. 捎带应答机制
在实际工作模式中,确认应答可以与对请求的响应一起打包发送。以 A 和 B 的例子为例,A 问 B “你吃饭了吗?” B 本来应先确认收到消息,再回复“我吃了”。但 B 可以直接回复“我吃了”,这一条消息既是对 A 的确认应答,也是 B 给 A 的新消息。这就是所谓的 捎带应答。
6. 批量确认的工作模式
另一种工作模式是 批量确认。Client 可以一次性给 Server 发出多个请求,Server 则可以批量确认这些请求,而非逐条应答。这种模式下,请求和应答是并发的。
不管是串行确认还是批量确认,原则上,无论是 C->S 还是 S->C,每个正常的数据段都需要应答来保证可靠性。但最新的一条消息是没有的
明确了上面的理论知识,可以帮助接下来我们谈tcp报头里序号和确认序号
四. 理解TCP的报头
16位校验和+选项我们不考虑,接下来学习tcp报头剩余字段以及背后的知识。
1. 4位首位长度
序号和确认序号等会谈,先谈4位首位长度
上面其实已经提到了,概述如下:
- 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节),所以TCP头部最大长度是15 * 4 = 60
2. 序号和确认序号:TCP 全双工通信与确认应答机制
今天,客户端 (c) 可能向服务器 (s) 发送信息,也可能是服务器向客户端发送信息。由于双方都使用 TCP 协议,所以 TCP 的双方地位是对等的。要了解 TCP,只需要搞清楚一个方向的通信过程,反过来,另一个方向的通信也是一样的。
2.1. TCP 真实工作模式
- Client 可能一次给 Server 发送多个请求报文,而 Server 也可以一次给 Client 发送多个确认应答。
2.2. 问题分析
- 数据的顺序问题:
如果客户端一次给服务器发送多个请求,数据到达对方的顺序是否和发送顺序一样?
答案是不一定!数据在网络传输中可能乱序到达。 - 确认与请求的对应关系:
当 Server 连续收到多个请求后,要对请求进行确认。那么,Client 如何知道这些确认是对应哪个请求的呢?
假设客户端发了4个请求,服务器只回了3个确认,那客户端必须知道自己发了4个请求,且只收到了3个确认,这样才能判断哪个报文丢失了。
2.3. TCP 报文序号机制
为了保证每个请求和应答可以对应上,TCP 请求报文(数据段)需要有方式标识数据段本身,因此每个数据段都有自己的 32位序号。
- 每一个请求和确认应答都是一个 TCP 报文,有数据的包含有效载荷,没数据的只包含 TCP 报头。
- 每个 TCP 报文都会填充一个序号,确保报文有序。
2.4. 确认应答的机制
Server 给 Client 的应答报文中,需要和请求报文一一对应。因此,应答报文的报头中会包含确认序号,这样 Client 可以知道应答是对哪个请求的。
- 序号与确认序号的对应规则:
-
- 假设 Client 发送了序号为 1000 的报文,Server 的确认序号将是 1001。
- 如果 Client 发送了序号为 2000 的报文,Server 的确认序号则为 2001。
- 也就是说,你发过来的报文序号是多少,确认序号就是发过来的序号 + 1。
- 确认序号的含义:
确认序号表示接收方已经收到了该序号之前的所有报文(连续且无遗漏),并告知对方下次发送从该确认序号开始。
2.5. 丢包场景下的应答机制
如果某个报文丢失了,比如:
- Client 发送了序号为 2000 的报文丢失了,Server 只收到了序号为 1000 和 3000 的报文。
- Server 对序号为 1000 的报文返回确认序号 1001,但由于 2000 丢失了,即使收到了 3000 号报文,确认序号依然是 1001,因为 2000 之前的报文不是连续的。
- 为什么这样设计?
这是为了支持 TCP 的滑动窗口机制,使得确认序号可以线性右移,从而保持可靠的数据传输。
2.6. 两组序号的必要性
❓ TCP 报文为什么要有两组序号?
- 请求和应答的序号不能共享吗?
不能。因为 TCP 是全双工通信,双方可以同时发送和接收数据。
-
- 当 Client 给 Server 发信息时,Client 使用自己的序号,Server 给出确认序号。
- 同时,Server 也可能给 Client 发送信息,这时 Server 需要自己的序号,Client 也需要给出对应的确认序号。
因此,TCP 报头必须有两组独立的序号:一组用于发送方的数据序号,另一组用于接收方的确认序号。
- 捎带应答:
当发送应答时,可能同时捎带发送给对方的数据,因此需要同时包含序号和确认序号。这是 TCP 通信中的常见模式。
2.7. 数据到达顺序与序号
如果客户端一次给服务器发送多个请求,数据的到达顺序可能与发送顺序不同。但是,由于报文中携带了序号,可以通过序号对乱序报文进行排序,保证数据的完整性和可靠性。
3. 窗口大小:TCP缓冲区与流量控制
缓冲区的作用
- 发送缓冲区:用于暂时保存应用层通过IO接口拷贝过来的数据,等待通过网络发送。
- 接收缓冲区:用于暂时保存从网络接收到的数据,直到被应用层读取。
数据传输过程
- 客户端(Client)将数据从应用层拷贝到其发送缓冲区。
- 数据通过网络传输到服务器(Server)的接收缓冲区。
- 服务器同样将响应数据从其应用层拷贝到发送缓冲区,并通过网络发送回客户端的接收缓冲区。
流量控制的必要性
- 地理位置远近:客户端与服务器可能相隔很远。
- 发送速度不匹配:
-
- 如果客户端发送数据过快,而服务器来不及处理,会导致服务器接收缓冲区溢出,后续到达的数据包将被丢弃。
- 反之,如果发送速度过慢,则会影响对方上层业务的正常处理速度。
- 合适的速度:为了确保数据传输既不过快也不过慢,需要一种机制来调节发送速率。
流量控制机制
- 反馈机制:发送方需要知道接收方的接收缓冲区剩余空间大小,以调整自己的发送速率。
- 16位窗口大小:TCP头部中的16位窗口大小字段表示的是接收方当前接收缓冲区的剩余空间大小。
-
- 发送方根据这个窗口大小调整其发送速率。
- 这个字段填入的是接收方的接收缓冲区剩余空间大小,而不是发送方的。
全双工通信
- 双向控制:在全双工通信中,双方都需要知道对方的接收缓冲区剩余空间大小。
-
- 客户端和服务器都需要保证对方能够以适当的速度接收数据。
- 因此,每个方向上的TCP报文都包含一个16位窗口大小字段,表示自己的接收缓冲区剩余空间大小。
交换接收能力
- 双向流量控制:这套规则对客户端和服务器同样适用,实现了双方在两个方向上的流量控制。
- 目的:确保双方都能以合适的速度进行数据交换,避免缓冲区溢出或处理速度跟不上。
通过这种方式,TCP协议不仅确保了数据的可靠传输,还有效地管理了网络带宽的使用,提高了整体的通信效率。
下篇文章讲继续讲解 6 个标记位,结合应用层和传输层的角度,解释三次握手四次挥手~
相关文章:

[Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制
目录 一. 认识TCP协议的报头 1.TCP头部格式 2. TCP协议的特点 二. TCP如何封装与分用 TCP 报文封装与解包 如何封装解包,如何分用 分离有效载荷 隐含问题:TCP 与 UDP 报头的区别 封装和解包的逆向过程 如何分用 TCP 报文 如何通过端口号找到绑…...

【中短文】区分神经网络中 表征特征、潜层特征、低秩 概念
1. 表征特征(Representational Feature): 表征特征通常指的是输入数据经过NN处理就得到的中间表示或输出表示。 这些特征由NN经学习过程自动提取,能更好捕捉输入数据的本质属性。 例如:在图像识别任务中&…...

MySQL8.0环境部署+Navicat17激活教程
安装MySQL 下载MySQL MySQL官网下载当前最新版本,当前是8.0.39。 选择No thanks, just start my download等待下载即可。 安装MySQL 下载完成后,双击安装进入安装引导页面。选择Custom自定义安装。 选择MySQL Server 8.0.39 - X64安装。 点击Execute执…...

每日读则推(十)——Elon Musk‘s speech on self-driving at Tesla‘s annual meeting
Elon Musk: You cant solve self-driving unless you have millions of cars on the road. n.自动驾驶 v.限制,约束,强迫,迫使“We are no longer compute-constrained for training. 不再 n/v.估算,计…...

C++新特性——外部模板
1、What C++11标准引入的一种机制,允许在头文件中声明模板,但仅在一个单独的源文件中显式实例化这些模板。这一机制使得编译器只需要在源文件中实例化模板一次,其它源文件引用已经实例化的模板,从而减少编译时间和生成的二进制文件大小。 2、Why 2.1 优化编译时间 模板实…...

字节跳动青训营开始报名了!
关于青训营: 青训营是字节跳动技术团队发起的技术系列培训 &人才选拔项目;面向高校在校生,旨在培养优秀且具有职业竞争力的开发工程师。 本次技术训练营由掘金联合豆包MarsCode 团队主办课程包含前端、后端和 A 方向,在这个飞速发…...

从SQL Server过渡到PostgreSQL:理解模式的差异
前言 随着越来越多的企业转向开源技术,商业数据库管理员和开发者也逐渐面临向PostgreSQL迁移的需求。 虽然SQL Server和PostgreSQL共享许多数据库管理系统(RDBMS)的基本概念,但它们在处理某些结构上的差异可能会让人感到困惑&…...

刷题 排序算法
912. 排序数组 注意这道题目所有 O(n^2) 复杂度的算法都会超过时间限制,只有 O(nlogn) 的可以通过 快速排序空间复杂度为 O(logn)是由于递归的栈的调用归并排序空间复杂度为 O(n) 是由于需要一个临时数组 (当然也需要栈的调用,但是 O(logn) < O(n) 的…...

【python3】tornado高性能编程
使用多进程充分利用cpu使用异步编程 asyncio import asyncio import time from abc import ABC from concurrent.futures import ProcessPoolExecutor from tornado import web, ioloop, genasync def async_task(name):print(f"start: {name}")st int(time.time()…...

构建高效购物推荐系统:SpringBoot实战
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...

docker tar包安装 docker-26.1.4.tgz
一、docker安装 1.先将docker安装包(docker-26.1.4.tgz)拷贝到DM系统中。 下载地址 Index of linux/static/stable/x86_64/ 1.先将docker安装包(docker-26.1.4.tgz)拷贝到DM系统中。 2.解压docker安装包 tar zxf docker-26.1.…...

Github 2024-10-12 Rust开源项目日报 Top10
根据Github Trendings的统计,今日(2024-10-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10JavaScript项目1Svelte项目1TypeScript项目1Rust: 构建可靠高效软件的开源项目 创建周期:5064 天开发语言:Rust协议类型:OtherSta…...

Spring Cloud 微服务架构及其应用:设计、实现与优化
引言 随着互联网技术的不断发展,传统的单体应用架构逐渐暴露出了一些问题,如扩展性差、维护复杂、部署不灵活等。为了解决这些问题,微服务架构应运而生。微服务是一种将应用程序分解为一组小的、自治的服务的架构模式,服务之间通过轻量级的通信协议(如HTTP)进行交互。Sp…...

Rider + xmake DX12 开发环境
Rider xmake DX12 开发环境 背景 如题,想要接近 UE 的开发流程 正文 大的流程就是 xmake 生成 vs 的 sln,用 Rider 进行开发 intellisense,断点调试 加了个脚本手动刷新 sln xmake project -k vsxmake -m "debug;release" -…...

控制台java原生工具打包jar文件
1、进入java源代码所在路径,或者包起始文件的所在路径 2、编译为class文件 我没配全局变量,这里使用jdk的完整路径来调用 3、jar命令进行打包 -cfe后面: svnHook.jar 指定jar包文件名 Request 包名入口类名,如果有包含包的话,应…...

MySQL主从同步
MySQL主从同步 作用 减少单台服务器的压力,防止单点故障 部署 主库 编辑/etc/mysql/mysql.conf.d/mysqld.cnf log_binmysql-bin server-id1 #服务器的id,再主从数据库里不能重复重启MySQL服务器 systemctl restart mysql连接mysql,并创建用于主从…...

ansible 学习之变量
参考文档: http://www.ansible.com.cn/docs/playbooks_variables.html#variables 合法的变量 ansible变量是有数字,字母,下划线组成并且变量始终应该以字母开头。 “foo_port”是个合法的变量名.”foo5”也是. “foo-port”, “foo port”, …...

【知识科普】Markdown语法内容看这一篇就够了
文章目录 1. 标题2. 段落3. 字体4. 分隔线5. 删除线6. 列表7. 区块引用8. 代码11. HTML元素12. 特殊字符13. 数学公式14. 其他高级技巧 Markdown是一种轻量级标记语言,其排版语法简洁,让人们能更多地关注内容本身而非排版。以下是对Markdown语法的详细解…...

什么是智能合约?
什么是智能合约? 智能合约,就是一段写在区块链上的代码,一旦某个事件触发合约中的条款,代码即自动执行。也就是说,满足条件就执行,不需要人为操控、不需要第三方信任。区块链的安全性和不可篡改性…...

Oracle低代码平台apex介绍
Oracle APEX(Application Express)是一个强大的低代码开发平台,它允许开发者快速构建企业级Web应用程序。该平台基于Oracle数据库,并充分利用了数据库的功能来提供安全、可扩展且易于维护的应用程序。 什么是Oracle APEX…...

【读书笔记·VLSI电路设计方法解密】问题12:制造MOSFET晶体管的主要工艺步骤是什么
VLSI芯片是在半导体材料上制造的,这种材料的导电性介于绝缘体和导体之间。通过一种称为掺杂的工艺引入杂质,可以改变半导体的电气特性。能够在半导体材料的细小且定义明确的区域内控制导电性,促使了半导体器件的发展。结合更简单的无源元件(电阻、电容和电感),这些器件被…...

内存分析工具的使用——AddressSanitizer
一、c/c中的内存问题 memory corruption,内存崩溃或者说内存损坏。在c/c程序中,有相当一部分的Bug是由内存引起的,也就是刚刚提到的内存崩溃。说得再通俗一些,往往和内存的非法访问有关。内存问题,轻则导致程序失能&a…...

linux使用nmcli 管理wifi的命令
在 Linux 系统中,nmcli 是 NetworkManager 的命令行工具,常用于管理网络连接,包括 WiFi。下面是一些常见的使用 nmcli 管理 WiFi 的命令。 1. 显示所有可用的 WiFi 网络 nmcli dev wifi list这个命令会列出当前可以扫描到的 WiFi 网络及其信…...
deepin20.9安装部署 |deepin20.9镜像下载 |基本命令 |手动分区 |开启远程ssh服务
下载deepin20.9 .iso 阿里云 https://mirrors.aliyun.com/deepin-cd/20.9/deepin-desktop-community-20.9-amd64.iso 注意安装过程略 小白参考 : Centos 7.9 安装 图解版 小白必看 最新_centos7.9-CSDN博客文章浏览阅读2.4k次,点赞34次,…...

使用PL/SQL Deverloper过程遇见的问题
目录 背景: ORA-01031权限问题: PL/SQL Deverloper显示Oravle中存在的所有表: PL/SQL Deverloper优点: 背景: PL/SQL Developer是由Allround Automations公司开发的一款集成开发环境(IDE),它专门面向Oracle数据库存储的程序单元的开发。随着越来越多…...

pikachu靶场总结(三)
五、RCE 1.RCE(remote command/code execute)概述 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。 远程系统命令执行 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的…...

onvif相关的http api有哪些功能点
ONVIF 提供了一系列 HTTP API,用于访问和控制支持 ONVIF 的设备。这些 API 基于 SOAP 协议,通过 HTTP 协议传输。主要的 API 分为几个关键的服务类别,每个类别都有特定的操作。以下是 ONVIF 相关的 HTTP API 概述: 1. 设备管理服…...

AI大模型是如何改变我们的日常生活的?
随着AI大模型的不断发展和优化,它已经在各个领域展现出了巨大的潜力和广泛的应用。无论是在科技创新、医疗健康、金融服务、教育培训还是日常生活中,AI大模型都有着重要的作用。它不仅可以帮助人们提高工作效率、提供个性化的服务,还能够改善…...

kubernetes部署Nexus(Helm3)
参考文献: https://help.sonatype.com/en/single-data-center-on-premises-deployment-example-using-kubernetes.htmlhttps://github.com/sonatype/helm3-chartshttps://support.sonatype.com/hc/en-us/articles/7706583820691-How-to-install-Nexus-Pro-instance…...

PDF无法导出中文
font/SIMSUN.TTC with Identity-H is not recognized. 查看BaseFont源码发现".ttc," 改为"SIMSUN.TTC,a"提示数字转换异常 改为"SIMSUN.TTC,11"提示数字索引必须介于0和1之间 改为0或1结果正常 BaseFont baseFont BaseFont.createFont("/U…...