TCP专题
一、TCP连接建立
1、TCP的四元组
TCP属于面向连接——在发送数据之前,需要先建立一条点到点的连接。
TCP的四元组:源IP地址、目标IP地址、源端口、目标端口。可以唯一的区分和标识一条TCP的连接。
2、TCP报文结构
序列号:TCP是基于”字节流“的协议,这个序列号就是字节流的编号。
确认序列号:接收方期望收到发送方发送的下一个字节的序列号。
首部长度:标识TCP报文头部的长度,因为存在选项字段,所以是可变长头部,最短是20个字节。
URG:紧急标记位。若置1,则启用紧急指针字段。
ACK:确认标记位。若置1,则启用确认序列号字段。
PSH:推送标记位。若置1,表示该报文不放入缓存空间,直接推送至进程。
RST:重置标记位。若置1,表示强制断开TCP连接,不用四次挥手。
SYN:同步标记位。若置1,表示请求建立连接,通常在三次握手的前两次用到。
FIN:终止标记位。若置1,表示正常断开TCP连接,需要四次挥手。
窗口大小:用于控制流量传输。
校验和:用于确认数据传输的完整性,还会构造伪首部(IP层部分信息)进行校验。
紧急指针:标识需要紧急处理的数据的长度。
选项:用于扩展TCP协议功能,允许在标准头部之外传递额外的控制信息或参数。
3、TCP三次握手
这里的客户端一般指的是先请求建立连接的一方。
第一次握手:客户端发送SYN报文,携带seq序列号。
第二次握手:服务器回复SYN-ACK报文,携带seq序列号和ack确认序列号。
第三次握手:客户端回复ACK报文,携带ack确认序列号。
建立连接过程:
- 客户端发送SYN报文,其中序列号都是随机生成的,可以防止序列号预测攻击以及避免旧报文的干扰;
- 服务器收到SYN报文,会为其分配缓存空间,并发送ACK-SYN报文,其中序列号是随机生成的,确认序列号为上一个接收的序列号+1,表示确认收到以及期望收到的下一个序列号;
- 客户端收到ACK-SYN报文时,此时客户端单方面建立连接,因此下次携带的ACK报文时可以携带数据。
4、TCP的建立状态
分析上面的三次握手流程图,同样地,这里的客户端一般指的是先请求断开连接的一方。
客户端:
- 关闭状态:在发送SYN请求建立连接之后,进入到下一个状态;
- SYN_SENT:等待服务器返回的SYN-ACK报文,收到后进入下一个状态;
- 建立完成状态:此时客户端指向服务器的会话已经建立,所以客户端发送给服务器的最后一个ACK报文是允许携带数据的。
服务器:
- 关闭状态:当服务器的应用程序创建一个监听的套接字,将进入到下一个状态;
- 侦听状态:当接收到客户端发送的SYN报文之后,为TCP连接分配缓存空间,同时发送SYN-ACK报文,进入到下一个状态;
- SYN_RCVD:等待客户端返回的ACK报文,收到后进入下一个状态;
- 建立完成状态:TCP双向会话均建立完成。
注意:在第一次握手时,若服务器没有开启listen侦听,在收到SYN报文时,会回复RST报文拒绝建立连接。
5、SYN泛洪攻击
SYN泛洪攻击属于Dos攻击。攻击者伪造大量源 IP 地址,向目标服务器发送大量 SYN 包。服务器回应 SYN-ACK 包后,因源 IP 虚假无法收到 ACK 包,致使连接资源被半开放连接大量占用,从而无法给正常用户提供服务。
防御SYN泛洪攻击:
- 防火墙代理:防火墙代理服务,并设置每目标IP代理阈值和每目标IP丢弃阈值。一开始,客户端正常访问服务器,达到代理阈值后,防火墙开始代理服务;达到丢弃阈值后,防火墙直接把数据包丢弃。
- SYN Cookie:收到SYN报文后,不再分配缓存空间,将四元组(源目IP和端口)再加上一个随机数经过hash算法生成一个摘要值,即SYN Cookie,使用SYN Cookie作为序列号回复客户端,同时保存摘要值+1的数值,判断客户端返回的Ack报文是否准确。
6、疑点解答
(1)为什么一定是三次握手?
三次握手相较于四次握手节省资源资源。
三次握手相较于二次握手,能够解决新旧连接造成资源混乱的问题。
二、TCP连接断开
1、TCP的四次挥手
这里的客户端一般指的是先请求断开连接的一方。
第一次挥手:客户端发送FIN报文。
第二次挥手:服务器回复ACK报文。
第三次挥手:服务器发送FIN报文。
第四次挥手:客户端回复ACK报文。
断开连接过程:
- 客户端发起FIN报文时,是可以携带最后一段数据的;
- 服务器回复ACK报文时,断开的是客户端指向服务器的单方面会话,此时,客户端不能给服务器发送数据,而服务器可以继续发送剩下的数据;
- 等待服务器将数据全部发送完后,再继续发送FIN报文,该报文也可以携带最后一段数据;
- 客户端回复ACK报文后,双方连接彻底断开。
2、TCP的断开状态
分析上面的四次挥手流程图,同样地,这里的客户端一般指的是先请求断开连接的一方。
客户端:
- 建立完成状态:发送完所有字节流后,携带最后一组字节流的数据段,同时FIN置1,进入下一个状态;
- FIN_WAIT_1:等待服务器回复ACK,收到ACK报文应答后,进入下一个状态;
- FIN_WAIT_2:等待服务器发起FIN,收到FIN报文后,回复ACK确认报文,进入下一个状态;
- TIME_WAIT:等待2MSL时间后进入下一个状态;
- 关闭状态: 断开TCP的连接,释放所有TCP连接占用的资源。
服务器:
- 建立完成状态:收到客户端发送的FIN断开请求后,服务器将回复一个ACK确认报文,进入到下一个状态。
- CLOSED_WAIT:等待服务器自身数据的发送,当自身所有数据传递完毕后,发送FIN断开请求,进入下一个状态。
- LAST_ACK:等待客户端进行最后的ACK应答,当收到客户端发送的ACK确认报文之后,进入到下一个状态。
- 关闭状态:断开TCP连接,释放所有TCP连接占用的资源。
3、疑点解答
(1)为什么要有TIME_WAIT
保证TCP会话可以正常关闭。
(2)为什么TIME_WAIT状态的时间是2MSL
MSL——报文最大存活时间
1.保证最后一个ACK报文丢失的情况下,能够等到对方重传,一来一回正好两个MSL时间,可以保证TCP会话正常断开。
2.设置2MSL,足以让两个方向上的报文都丢弃,再出现新的连接时,不至于被历史报文造成数据错乱。
3.太长会占用资源。
(3)为什么需要四次挥手
在服务器收到FIN报文时,可能还存在未发送完的数据,因此只回复了ACK报文,等待剩余的数据发送完毕则发送FIN报文断开连接。
四次挥手过程是理论上的形式,实际情况中,存在三次挥手,即服务器正好发完了数据,将直接回复ACK-FIN报文。
三、TCP可靠性传输
1、排序机制
首先引入两个概念:
- 分片:网络层的IP协议执行,当数据包超过 MTU 时,会将其拆分成多个分片传输。
- MTU:最大传输单元,默认为1500。
分段:TCP是一款基于字节流的协议,可对数据进行分段,以及可以确保数据适合下层(IP层)的 MTU 限制。
MSS:最大段长度。TCP在建立三次握手时,前两个SYN报文中携带该参数,并且双方的该参数允许不同,若不同,则将按照数值最小的执行。MSS最大值为1460(1500 - 20 - 20)
而排序机制则是基于序列号来完成的 ,序列号seq代表字节流中第一个字节的编号。如下图所示,第一个seq=0,数据长度为1000,则字节流范围为0-999,所以下一次发送的序列号seq=1000。
2、确认机制
确认机制则是基于确认序列号来完成的,确认序列号ack是期望收到的下一个seq序列号。如下图所示,在收到对方第一个seq=0,且数据长度为1000,则回复ack=1000,期望对方发送的下一个seq序列号,同时也确认自己收到了完整的数据包。
3、超时重传
超时重传机制指的是本端在一定时间内,没有接收到对端反馈的确认报文而出发的重传机制。
RTO:超时重传时间。
RTT:往返时间。指的是本端将数据发出后,到他接收到对端反馈的确认报文之后的这一段时间。
RTO值在计算时,需要略大于RTT,因为RTT是一个可变化的值,所以RTO也是一共动态变化的值。
超时间隔加倍机制:
每次发送重传报文之后,会将RTO设为上一次RTO的两倍时间。
4、快速重传
接收方收到一个数据段中的序列号大于自己期望的序列号,称为失序报文。
通过冗余ACK(Duplicate ACK),将缺失的报文段连续发送三遍,这时发送方收到后触发快速重传机制,将seq=200的报文重新发送。
5、SACK
选择确认机制(SACK):在快速重传机制中,接受方在回复冗余ACK时,里面将携带自身已经接收到的数据信息,避免重复发送造成资源浪费。
抓包:
6、三次握手的可靠性保障
第一次握手丢失: 客户端将按照定义RTO值(默认1s)进行重传,并将RTO值设为双倍,若达到最大重传次数时,还未收到回复包,则断开连接进入CLOSE状态。
第二次握手丢失:客户端和服务器都会触发超时重传机制。
第三次握手丢失:服务器触发超时重传机制。
7、四次挥手的可靠性保障
第一次挥手丢失:客户端等待RTO时间进行重传,并将RTO值设为双倍,若达到最大重传次数时,还未收到回复包,则断开连接进入CLOSE状态。
第二次挥手丢失:客户端触发超时重传机制。服务器只会等待对方再次发送FIN报文才会重新发送ACK报文。
第三次挥手丢失:服务器触发超时重传机制。客户端也只会等待对方再次发送FIN报文才会重新发送ACK报文。
第四次挥手丢失:服务器触发超时重传机制,客户端收到后重新发送ACK报文,并重置2MSL时间。
四、TCP流量控制
1、滑动窗口
窗口:TCP报文(来自对端)里的窗口大小是指无需等待确认应答ack,而可以连续发送的数据包的最大值。
接收窗口(rwnd):表示的是接收方此时缓存空间可用的大小,且缓存空间中存放的数据是可变化的,所以rwnd也随之变化,这个机制就叫做滑动窗口,且最开始时,rwnd=RcvBuffer。
2、窗口关闭
窗口关闭指的是接收方发送一个窗口值为0的数据报文段,表示接收方自身的缓存空间已经占满,无法再进行数据接收,发送方收到后将不再发送数据。
但由于ACK报文丢失不会触发重传机制,则会导致发送方因未收到窗口更新而长期阻塞。
为了避免上述问题,在窗口关闭时,客户端会周期性发送窗口探测报文(携带1字节数据)。
3、小窗口的处理
小窗口是指接收方通告的可用窗口(rwnd
)非常小(如几个字节甚至 1 字节),导致发送方每次只能发送少量数据。因此接收方和发送方分别制订了一套应对规则。
接收方:会设定一个通告窗口的最小值,一般为MSS和1/2缓存空间中的较小值,若通告的窗口值小于最小值,则将通告一个窗口值为0的数据报文段来关闭窗口,直到窗口大小突破最小值。
发送方:一般采用延时处理,只有满足下面条件之一才能发送数据,否则将囤积数据。
- 窗口大小(rwnd&cwnd) >= MSS 且数据大小 >= MSS;
- 收到之前发送数据的ACK回报;
五、TCP拥塞控制
1、拥塞判断
拥塞控制:TCP会观察网络的拥堵情况,如果网络拥堵严重,则降低发送量,以缓解网络拥塞的情况。
拥塞判断:
以下行为都为连接中的丢包行为,视为拥塞的表现。
- 数据包确认超时(超时重传)
- 收到接收方发送的3个冗余ack(快速重传)
2、拥塞控制算法
拥塞窗口(cwnd):表示是发送方根据当前网络拥塞程度动态调整的窗口。
发送方发出未收到确认的字节数必须小于或等于rwnd和cwnd的最小值。其中rwnd是接收方设立并通告,cwnd是发送方设立并通告。
TCP的拥塞控制算法(自计时的协议):慢启动、拥塞避免、快速回复。
3、慢启动
慢启动:最开始cwnd=1MSS,每收到一个新的ACK确认报文(重传的确认报文不计算在内),cwnd就会增加一个MSS的大小。
慢启动门限(ssthresh):
- cwnd < ssthresh 时,使用 慢启动算法。
- cwnd = ssthresh 时,使用 慢启动算法/拥塞避免算法。
- cwnd > ssthresh 时,使用 拥塞避免算法。
4、拥塞避免
拥塞避免:在一个RTT(往返时间)内,cwnd只增长一共MSS。
5、快速恢复
数据包确认超时处理:首先将ssthresh值设置为当前cwnd值的一半,之后将cwnd设置为1个MSS,按照新的ssthresh值,执行慢启动算法,达到门限值后,重新进入到拥塞避免算法中。
收到接收方发送的3个冗余ACK处理:首先将ssthresh值设定为当前cwnd值的一半,之后直接基于ssthresh值执行拥塞避免算法。
相关文章:
TCP专题
一、TCP连接建立 1、TCP的四元组 TCP属于面向连接——在发送数据之前,需要先建立一条点到点的连接。 TCP的四元组:源IP地址、目标IP地址、源端口、目标端口。可以唯一的区分和标识一条TCP的连接。 2、TCP报文结构 序列号:TCP是基于”字节…...
力扣热题100刷题day63|49.字母异位词分组
一、哈希表相关理论 代码随想录刷题day15|(哈希表篇)242.有效的字母异位词、383.赎金信-CSDN博客 二、思路 首先,创建一个map集合,遍历字符串数组,对数组中每一个字符串(单词)比如"abc&…...
BERT - 今日头条新闻分类任务实战
1. 自定义模型组件 MultiHeadAttention 类 实现了多头自注意力机制。 通过将输入分割成多个“头”,从不同角度学习输入数据的特征。 注意力分数计算后应用了缩放点积注意力,并支持掩码操作。 class MultiHeadAttention(nn.Module):def __init__(se…...
leetcode-419.棋盘上的战舰
leetcode-419.棋盘上的战舰 文章目录 leetcode-419.棋盘上的战舰一.题目描述二.第一次代码提交三.第二次代码提交 一.题目描述 二.第一次代码提交 class Solution { public:int countBattleships(vector<vector<char>>& board) {int m board.size(); //列数i…...
Python爬虫第11节-解析库Beautiful Soup的使用上篇
目录 前言 一、Beautiful Soup 简介 1.1 Beautiful Soup概述 1.2 准备工作 1.3 解析器 二、基本使用 三、节点选择器的使用 3.1 选择元素 3.2 提取信息 3.2.1 获取名称 3.2.2 获取属性 3.2.3 获取内容 3.3 嵌套选择 3.4 关联选择 3.4.1 子节点和子孙节点 3.4.2…...
host模式容器compose建立记录
需要一个host模式的容器,用来跑gpu程序。同时最好使用ssh来直接远程连接。 以前是直接建立容器然后手动安装ssh的。但是最近突然又不行了,不知道为什么。我知道原因是容器的systmctl不能使用。但是为什么以前能用呢? 一、安装结构 总之换成…...
LeetCode算法题(Go语言实现)_39
题目 给定一个二叉树的根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 一、代码实现 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func rightSideView(root *TreeNode) []int {i…...
算法训练之动态规划(五)——简单多状态问题
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
深度学习-156-RAG技术之在ubuntu中的安装部署RAGFlow和简单应用
文章目录 1 ubuntu中安装RAGFlow1.1 RAGFlow简介1.2 安装部署1.2.1 硬件要求1.2.2 修改max_map_count1.2.3 下载仓库代码1.2.4 自动拉取镜像1.2.5 查看端口占用(如果提示的话)1.2.6 启动与关闭RAGFlow2 访问应用2.1 添加模型2.2 创建知识库2.2.1 输入名称点击确定2.2.2 填写相关…...
自学Matlab-Simscape(初级)- 2.1 Simscape Multibody 模块之关节(运动副)
Matlab-Simscape自学系列文章目录 1.了解Simscape Multibody Link模块 2.掌握Simscape Multibody 模块 3.掌握Simscape Electrical模块 4.掌握Simscape Driveline 模块 5.了解Simscape Fluids模块 6.了解Simscape Battery模块 7.掌握Simscape Mechanical Interfaces 模块 8.掌…...
再次重拾jmeter之踩坑
1.添加“csv数据文件设置”,运行时提示 java.lang.IllegalArgumentException: Filename must not be null or empty检查多次后才发现因为我运行的是整个线程组,所以对应http请求下不能包括空的csv文件 2. 填写ip时不能加/,要在路径里加&…...
第六周作业
好的,这是移除外层代码块,并保留内部 Markdown 格式的作业内容: SQL 注入作业 1、联合注入实现“库名-表名-字段名-数据”的注入过程 (1)前端注入 尝试使用 database() 这个函数进行库名爆破 1 union select 1,data…...
学科发展视域下教师数字素养提升的多维路径研究
学科发展视域下教师数字素养提升的多维路径研究 —— 基于技术融合与教学创新的双重逻辑 一、引言:数字时代的学科教育转型 1.1 研究背景与意义 在当今时代,人工智能与教育数字化战略正以迅猛之势重塑着教育的格局,成为推动学科教学范式深…...
QEMU学习之路(6)— RISC-V 启动Linux
QEMU学习之路(6)— RISC-V 启动Linux 一、前言 参考:QEMU 启动方式分析(1):QEMU 及 RISC-V 启动流程简介 QEMU 启动方式分析(2): QEMU virt 平台下通过 OpenSBI U-Boot 引导 RISC…...
人工智能图像识别Spark Core3
Spark Core3 Spark-Core编程(三) 1.key-value类型: 23) sortByKey 函数签名 def sortByKey(ascending: Boolean true, numPartitions: Int self.partitions.length): RDD[(K, V)] 函数说明 在一个(K,V)的 RDD 上调用,K 必…...
STM32 模块化开发指南 · 第 5 篇 STM32 项目中断处理机制最佳实践:ISR、回调与事件通知
本文是《STM32 模块化开发实战指南》第 5 篇,聚焦于 STM32 裸机开发中最核心也最容易被忽视的部分——中断服务机制。我们将介绍如何正确、高效地设计中断处理函数(ISR),实现数据与事件从中断上下文传递到主逻辑的通道,并构建一个清晰、可维护、非阻塞的事件通知机制。 一…...
Vue报错解决方案
1.ResizeObserver loop completed with undelivered notifications. 解决方案: 在App.vue文件中添加以下代码: <script > const callLimit (callback, delay) > {let timer null;return function () {let context this;let args arguments;…...
vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值
项目场景: <el-table-column label"税率" prop"TaxRate" width"180" align"center" show-overflow-tooltip><template slot-scope"{row, $index}"><el-form-item :prop"InquiryItemList. …...
STM32 模块化开发指南 · 第 4 篇 用状态机管理 BLE 应用逻辑:分层解耦的实践方式
本文是《STM32 模块化开发实战指南》第 4 篇,聚焦于 BLE 模块中的状态管理问题。我们将介绍如何通过有限状态机(Finite State Machine, FSM)架构,实现 BLE 广播、扫描、连接等行为的解耦与可控,并配合事件队列驱动完成主从共存、低功耗友好、状态清晰的 BLE 应用。 一、为…...
计算机网络-传输层基础概念
传输层基础概念 1. 传输层基础概念1.1 传输层的定义与作用1.2 传输层在网络模型中的位置OSI七层模型中的传输层TCP/IP四层模型中的传输层传输层的数据单元传输层的地址机制 1.3 传输层与其他层的关系与网络层的关系与应用层的关系数据流转过程 1.4 传输层的主要功能1.4.1 复用与…...
使用Mybatis时在XML中SQL高亮显示的方法
如图所示,上方的SQL代码很像是一个字符串,那么如何把上方的SQL改成和下方一样的SQL,使得IDEA可以识别SQL方言呢? 1.选中SQL中的一部分代码,此时左侧会出现一个黄色的灯泡图案,点击2.选择这个注入语言或者引用...
Dify+DeepSeek能做出什么来?快速构建可扩展的 AI 应用
将 Dify(开源 LLM 应用开发平台)与 DeepSeek(深度求索公司的高性能大模型,如 DeepSeek-R1 或 DeepSeek-Lite)结合使用,可以充分发挥两者的优势,快速构建高效、灵活且可扩展的 AI 应用。以下是具…...
Python 类型转换详解
文章目录 Python 类型转换详解基本类型转换函数1. 转换为整数 (int())2. 转换为浮点数 (float())3. 转换为字符串 (str())4. 转换为布尔值 (bool()) 容器类型转换1. 转换为列表 (list())2. 转换为元组 (tuple())3. 转换为集合 (set())4. 转换为字典 (dict()) 特殊类型转换1. AS…...
针对deepseek的核心论文写作提示词模板(适用于SCI论文、CCF会议论文、北大核心论文、南大核心论文)
以下是一个适用于撰写核心论文的提示词模板,涵盖论文结构、关键内容和注意事项,帮助你高效组织思路和内容: 核心论文写作提示词模板(5000字) 1. 标题(Title) 提示词:简洁、明确、关键词、研究领域、创新点示例: “基于XX方法的XX问题研究”“XX现象对XX的影响:以XX为…...
Linux基础命令解释
目录 一、文件和目录操作命令 1. ls 2. cd 3. pwd 4. mkdir 5. rm 6. cp 7. mv 二、查看和编辑文件命令 1. cat 2. less 三、系统信息相关命令 四、网络相关命令 五、用户和权限管理命令 Linux是由Linus Torvalds于1991年开发的开源类Unix操作系统内核࿰…...
vue2基于video.js,v8.21.0自己设计一个视频播放器
刚开始在网上下了点视频教程想着用些电脑自带的播放器。后来级数太多了,操作不方便。就开始自己捣鼓了。 痛点是是视频教程本身带来的,不方便反复的找重点。过去了不好快退等。 就基于video.js,设计了各种功能,鼠标移到上方显示 播放、暂停…...
Spring Boot 中集成 Disruptor_高性能事件处理框架
1. 引言 1.1 什么是 Disruptor Disruptor 是一个高性能的事件处理框架,广泛应用于金融交易系统、日志记录、消息队列等领域。它通过无锁机制和环形缓冲区(Ring Buffer)实现高效的事件处理,具有极低的延迟和高吞吐量的特点。 1.2 为什么使用 Disruptor 高性能:通过无锁机…...
如何关闭MacOS中鼠标滚轮滚动加速
一、背景 想要关闭滚轮的 “滚动加速”,即希望滚动了多少就对应滚动页面固定行数,现在macOS是加速滚动的,即滚动相同的角度会根据你滚动滚轮的速度不同最终页面滚动的幅度不同。这点很烦,常导致很难定位。 macOS本身的设置是没有…...
QT Sqlite数据库-教程001 创建数据库和表-下
【1】创建带名称的数据库 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord> QString path QDir::currentPath(); QApplication::addLibraryPath(pathQString("/release/plugins")); QPluginLoader loader…...
玄机靶场-webshell查杀WP
0x01.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx} 方法一 先去网站根目录找/var/www/html在文件中寻找 flag 方法二 直接使用工具 D 盾。 0x02黑客使用的什么工具的shell 把代码直接复制网上搜索即可。 https://github.com/BeichenDream/Godzilla 0x03 黑客隐…...
游戏引擎学习第217天
运行游戏并在 FreeVariableGroup 中遇到我们的断言 其实在美国,某些特定的小糖果(例如小糖蛋)只在圣诞节和复活节期间出售,导致有些人像我一样在这段时间吃得过多,进而增加体重。虽然这种情况每年都会发生,…...
13、nRF52xx蓝牙学习(GPIOTE组件方式的任务配置)
下面再来探讨下驱动库如何实现任务的配置,驱动库的实现步骤应该和寄存器方式对应,关 键点就是如何调用驱动库的函数。 本例里同样的对比寄存器方式编写两路的 GPOITE 任务输出,一路配置为输出翻转,一路设 置为输出低电平。和 …...
基础数学:线性代数与优化理论
本篇文章简单带您复习线性代数与优化理论(主要是我发表的文章中涉及过的或相关联的) 微积分和概率与统计由此进:基础数学:微积分和概率与统计-CSDN博客 二、线性代数 1.矩阵运算 (1) 基础操作与几何意义 矩阵乘法࿱…...
IBM Rational Software Architect安装感受及使用初体验
1 安装感受 最近准备用UML 2.0绘制模型图。在读UML创始人之一Grady Booch写的书《Object-Oriented Analysis and Design with Applications》(第3版)1时,发现书中用的UML工具之一为IBM Rational Software Architect(RSAÿ…...
在WPS中通过JavaScript宏(JSA)调用DeepSeek官网API优化文档教程
在WPS中通过JavaScript宏(JSA)调用DeepSeek官网API优化文档教程 一、获取DeepSeek API密钥 访问DeepSeek官网,在开发者中心创建应用并生成API Key。注意选择deepseek - chat或deepseek - v3模型,推荐后者支持长文本生成。具体步…...
2025-Gateway架构
文章目录 1. **Spring Cloud Gateway**🧠 **简介**:✅ **主要特性**:⚙️ **使用场景**: 2. **Kong Gateway**🧠 **简介**:✅ **主要特性**:⚙️ **使用场景**: 3. **Zuul (Netflix)…...
Android HWComposer代码分析
厂家应该根据自己的硬件去写HWC的代码,一般位于hardware/厂家名称/hwcomposer目录中。 1 HAL_MODULE_INFO_SYM 在 Android 中,HAL_MODULE_INFO_SYM 结构体用于描述硬件抽象层(HAL)模块的信息,它会在系统启动过程中被…...
Java微服务分布式事务:CAP定理、BASE理论与事务模式全解析
在当今复杂的分布式系统中,数据一致性始终是架构师面临的核心挑战。本文将深入探讨分布式领域的三大基石理论(CAP/BASE),并详解微服务场景下的五种主流事务解决方案,通过真实代码示例揭示技术实现本质。 一、分布式系统…...
多坐标系变换全解析:从相机到WGS-84的空间坐标系详解
多坐标系变换全解析:从相机到WGS-84的空间坐标系详解 一、常见坐标系简介二、各坐标系的功能和使用场景1. WGS-84 大地坐标系(经纬高)2. 地心直角坐标系(ECEF)3. 本地 ENU / NED 坐标系4. 平台坐标系(Body)5. 相机坐标系三、坐标变换流程图四、如何选用合适的坐标系?五…...
【微服务治理】Opentelemetry、 Jaeger、Prometheus、grafana 关系?各自作用?最佳实践?
OpenTelemetry、Jaeger、Prometheus 和 Grafana 是云原生可观测性领域的核心工具组,各自解决不同维度的问题,又能协作形成完整的监控体系。以下是它们的详细关系和功能说明: 1. OpenTelemetry 定位:统一的遥测数据标准࿰…...
谷歌25年春季新课:15小时速成机器学习
谷歌说15小时就能入门机器学习,虽然听上去有点离谱,但看了一下课程设置其实是很合理而且全面的,而且谷歌的质量还是很有保障,很适合零基础的小白以及想要进阶的学习者。🚀 基础知识部分包括 线性回归:用于…...
【笔试强训day16】
目录 第一题:字符串替换 描述 输入: 返回值: 第二题:神奇数 输入描述: 输出描述: 输入 输出 第三题:DNA序列 描述 输入描述: 输出描述: 输入: 输出: 输入…...
[每周一更]-(第139期):从FRP认识内网穿透及反向代理
文章目录 **一、FRP的核心功能与实战应用****1. 远程访问场景****2. Web服务暴露**Web服务访问实际案例:**3. 物联网与设备管理****4. 高级功能** **二、FRP性能优化与安全加固****三、同类工具对比与选型建议****四、总结与选型建议****特殊场景解决方案****1. 跨国…...
vue2使用ezuikit-js播放萤石视频
需求:需要在大屏上播放萤石视频,用到官方的ezuikit-js插件实现,并实现视频播放切换功能。有个问题至今没有解决,就是萤石视频的宽高是固定的,不会根据大屏缩放进行自适应。我这边做了简单的刷新自适应。 1.下载ezuikit…...
Nacos服务发现和配置管理
目录 一、Nacos概述 1. Nacos 简介 2. Nacos 特性 2.1 服务发现与健康监测 2.2 动态配置管理 2.3 动态DNS服务 2.4 其他关键特性 二、 服务注册和发现 2.1 核心概念 2.2 Nacos注册中心 2.3 Nacos单机模式 2.4 案例——服务注册与发现 2.4.1 父工程 2.4.2 order-p…...
DeepSeek实战:如何用AI工具提升销售转化率?
销售行业正在经历一场前所未有的变革,AI技术的快速发展让传统销售模式面临巨大挑战。如今,像DeepSeek这样的智能工具已经能高效完成客户触达、需求分析、快速回复等基础销售工作,甚至比人类更快、更精准。许多公司已经发现,AI销售…...
无锡无人机培训学校哪家好?
无锡无人机培训学校哪家好?近年来,无人机技术在各个领域的应用越来越广泛,从农业、物流到影视制作,无人机已经成为了许多行业不可或缺的工具。这种趋势促使越来越多的人希望通过系统的培训获得无人机驾驶技能。然而,在…...
从数据格式转换的角度 flink cdc 如何写入paimon?
从数据格式转换的角度 flink cdc 如何同步数据,写入paimon? 从一个测试用例着手 org/apache/flink/cdc/connectors/paimon/sink/v2/PaimonSinkITCase.java public void testSinkWithDataChange(String metastore, boolean enableDeleteVector)throws …...
Flink的 RecordWriter 数据通道 详解
本文从基础原理到代码层面逐步解释 Flink 的RecordWriter 数据通道,尽量让初学者也能理解。 1. 什么是 RecordWriter? 通俗理解 RecordWriter 是 Flink 中负责将数据从一个任务(Task)发送到下游任务的组件。想象一下,…...
从keys到SCAN:Redis批量删除的进化之路
标签:Redis、批量删除、前缀匹配、性能优化 一、痛点分析:为什么需要批量删除指定前缀的键? 在 Redis 使用过程中,我们经常会遇到这样的场景: 需要对某一类数据进行清理,例如用户会话、缓存数据等,而这些数据通常以某种前缀命名(如 user:session:*、cache:data:*)。如…...