网络原理之 TCP 协议
目录
1. TCP 协议格式
2. TCP 原理
(1) 确认应答
(2) 超时重传
(3) 连接管理
a) 三次握手
b) 四次挥手
(4) 滑动窗口
(5) 流量控制
(6) 拥塞控制
(7) 延时应答
(8) 捎带应答
3. TCP 特性
4. 异常情况的处理
1) 进程崩溃
2) 主机关机 (正常流程)
3) 主机掉电 (非正常)
4) 网线断开
5. TCP 和 UDP 之间的对比
6. 基于 TCP 的应用层协议
前文:TCP 的使用
1. TCP 协议格式
想要知道 TCP 的原理,我们首先就得了解 TCP 协议报文的格式。
TCP 数据报分为两部分,报头 + 载荷(应用层数据报),选项(可以有,也可以没有)也是报头中的一部分。
大家都知道,TCP 的特点是:有连接,可靠传输、面向字节流,全双工。
其中可靠传输,是 TCP 最最最核心的特性(初心)。
可靠传输,不是说发送方能够 100% 的传输给接收方(再厉害的技术,抵不过挖掘机一铲子)
而是退而求其次:
1) 发送方将数据发出去之后,数据到没到接收端,发送方能心里有数,知道接收方是否收到数据
2) 如果发现接收端没收到数据,能采取一系列的措施进行补救。
那么 TCP 是如何保证可靠传输的呢?这就涉及到一个非常关键的机制,确认应答。
2. TCP 原理
(1) 确认应答
发送方,把数据发给接收端之后,接收端会返回一个应答报文(acknowledge, ack)。
发送方,如果收到这个应答报文了,就说明发送方把数据成功传给对方了。
而在网络传输过程中,因为每个数据包传输是走的路径不同,所以就可能会出现数据包的 "先发后至" 的情况。
举个例子:
为了处理这种情况,TCP 就需要完成两个工作:
1. 确保应答报文和发出去的数据,能够对得上号,不出现歧义。
2. 确保在出现先发后至的现象时,能够让应用程序这边仍然按照正确的顺序来理解数据。
而引入序号和确认序号,给每条数据进行编号,针对性应答,或者按照序号,对数据进行重新排序,就能解决上述问题。
TCP 是按照字节的方式来编序号的,如图:
TCP 的初心就是实现可靠传输,达成可靠传输的核心机制就是确认应答,通过确认应答,发送方就能够知道数据是否到达了接收方。如果数据到达了,那么接收方返回的 ack 里面的确认序号就是下一次发送方发送的数据的第一个字节。如果数据没到达,那么接收方就不会返回 ack。(不考虑滑动窗口的情况下)
那么如何区分一个数据报是普通的数据,还是 ack 应答数据呢?
可以通过 TCP 报文协议中的,六位标志位的 ACK 来确认,数据报是否是应答报文。
如果 ACK = 1,则说明是应答报文,其中的 "确认序号字段" 就能够生效。
如果 ACK = 0,那么数据报中的 "确认序号字段" 不会生效。
确认应答,是 TCP 最核心的机制,支持了 TCP 的可靠传输。
但是仅仅只有确认应答还不够,还需要其他的机制来辅助,超时重传就是这样的一个辅助机制。
(2) 超时重传
确认应答,描述的是一个比较理想的情况,
如果网络传输中,出现丢包了,那么发送方就没有办法收到 ack 了,那该怎么办呢?
通过超时重传,就可以解决上述问题。超时重传,是针对确认应答机制的补充。
超时重传,就是等待一定的超时时间,发送方还没有收到 ACK,发送方会主动把刚刚的数据重新传输一遍给接收端。
可以先来思考一下,为什么会出现丢包。
因为丢包是一个随机的事件,所以在 TCP 传输过程中,丢包就存在两种情况:
第一种是发送方发的数据报丢了,第二种是接收方发送的应答报文丢了。
如图:
所以当引入可靠性的时候,是会付出代价的,最明显的两方面:
1. 传输效率 因为有超时重传,所以传输数据效率不高。(这也是 UDP 不会被 TCP 完全取代的意义)
2. 复杂程度
这里其实还有一个问题:
(3) 连接管理
连接管理就是建立连接和断开连接。
其实 TCP 建立连接的过程也叫做三次握手,断开连接的过程叫做四次挥手。
那这个握手到底是什么意思呢?
其实握手就是打个招呼,就是给对方传输一个简短的,没有业务数据的数据报,通过这个数据报来唤起对方的注意,从而触发后续的操作。四次挥手的 "挥手" 和三次握手的 "握手" 是同一个意思。
举个例子:比如说你走路遇到熟人的时候,对方主动跟你说 "你好" "hello" 之类的,打招呼的内容通常没有什么实际的意义,就只是起到唤起对方的注意力的效果。
前面也提到过,TCP 是有连接的,需要主机双方各自保存对端的信息。
a) 三次握手
那 TCP 的三次握手具体流程是怎样的呢?
TCP 的三次握手,TCP 在建立连接的时候,需要通信双方一共打三次招呼,才能完成建立连接。
TCP 的初心,是为了实现可靠传输,确认应答是核心,超时重传等机制是辅助。
但进行确认应答和超时重传有个大前提,那就是当前的网络环境是基本可用的,通畅的,
如果当前网络已经存在重大故障了,那么可靠传输是无从谈起的。
三次握手的核心作用一:
投石问路,确认当前网络是否是畅通的。
如果连 syn 和 ack 这样没携带业务数据的数据报都不能够正常传输的话,那么之后要传输的携带了业务的数据报也不可能正常传输。
三次握手的核心作用二:
让发送方和接收方都能确定自己的发送能力和接收能力均正常。
三次握手的核心作用三:
让通信双方,在握手过程中,针对一些重要的参数,进行协商。
TCP 通信过程中,序号是从几开始,就是双方协商出来的(一般不是从 1 开始),
每次连接建立的时候,都会协商出一个比较大的,和上次不太一样的值。
这样做是放了防止上一次遗留的数据,影响到本次数据的传输。
有的时候,网络如果不太好,那么客户端和服务器就会断开,再重新建立连接,重连的时候,就有可能在新的连接建立好的时候,旧的数据姗姗来迟,这种迟到的数据报,是应该被丢弃的,而根据本次连接的正常数据报的序号,对比收到的数据报的序号,如果发现差别非常大的话,就说明收到的数据报是旧连接迟到的数据报,那就可以直接丢弃掉。
三次握手可以的话,那四次握手行不行?两次握手行不行?
四次握手是可以的,但是没必要,将中间的两次合并成一次能够提升效率。
两次握手是不可以的,因为少了最后一次的握手,服务器就无法确定自己的发送能力是否正常和客户端的接收能力是否正常。
b) 四次挥手
断开连接的过程就是四次挥手,和三次握手类似。
TIME_WAIT 的意义就是当主动连接断开方发送完最后一次 ACK 时,先进入 TIME_WAIT 状态,等待 2MSL 的时间,如果在这个时间内,ACK 丢包了,对端重传了 FIN,那么 主动断开连接方就能马上返回 ACK,这样对端重传的 FIN 才有意义。
MSL:是一个可配置的参数,这个参数数值是拍脑门拍出来的。
(4) 滑动窗口
前面的确认应答 ,超时重传,连接管理都是用来保证 TCP 的可靠性的。
滑动窗口是用来提高效率的,其实是一种亡羊补牢。
TCP 因为引入了可靠传输,所以传输的效率不太高(多出了一些等待 ACK 的时间,单位时间内能传输的数据就减少了)
而滑动窗口,就是用来减小可靠传输对性能的影响的。
但是再怎么提高 TCP 的效率,也是不可能超过没有引入可靠传输的 UDP 的效率的。
那么具体滑动窗口是怎么做的才能提高效率呢?
其实 TCP 慢就慢在要等对端的 ACK,那就可以在保证可靠传输的前提下,将等待时间缩小就好了。
那就可以进行批量传输数据,这样做效率就上来了。
效率是提高了,但是 TCP 的核心是可靠传输,在提高效率的前提是数据能可靠传输。
上述滑动窗口中,确认应答是可以正常工作的。
但如果在滑动窗口的过程中,出现丢包了,那该怎么办呢?
这里的重传,相比于前面的超时重传,有些不同。
还是得分两种情况讨论:
如果 ACK 全丢了呢?那此时的网络肯定出现严重故障了,平时丢包率达到 10% 都算是比较严重的了,现在直接丢包率 100% ,就别想着 "可靠传输" 了。
如果通信双方,传输数据的量比较小,也不频繁,就仍然是普通的确认应答和超时重传。
如果通信双方,传输数据的量比较大,也更频繁,就会进入到滑动窗口的模式,按照快速重传的方式处理。
(5) 流量控制
通过滑动窗口的方式传输数据,效率是会提升的。
窗口越大,传输效率就会越大。(一份等待时间,等待的 ack 更多了,总的等待时间就更少了)
那么滑动窗口的窗口大小是设置的越大就越好吗?
显然不是的,提高效率的前提是保证可靠传输,如果因为传输的速度太快,接收方处理不过来,就会导致接收方出现丢包的情况,发送方还得重传。
而流量控制,就是站在接收方的角度,反向制约发送方的传输速度。
发送方发送的速率,不应该超过接收方的处理能力。
那么如何知道接收方的处理能力是多少呢?
如图,可以通过 接收方的接收缓冲区的剩余空间大小,来衡量处理能力的大小。
接收方每次收到数据之后,都会把接收缓冲区剩余空间大小通过 ack 返回给发送方,
发送方就会按照这个数值来调整下一轮的发送速度。
如图:
(6) 拥塞控制
流量控制,考虑的是接收方的处理能力,
但是不仅仅要考虑到接收方的处理能力,还要考虑网络通信过程中经过的节点(路由器/交换机)的处理能力,也就是说,还需要考虑整个通信的路径,如果中间某个节点的传输速度达到了瓶颈,那么此时,也会对整体的传输产生影响。
拥塞控制,就是 考虑/衡量 通信过程中,中间节点的情况。
如图:
但是关键的问题,在于怎么衡量中间节点。
之前接收方的处理能力,是很好衡量的。
由于中间节点,结构更复杂,更难以直接的进行量化。
因此可以使用 "实验" 的方式,来找到合适的值。
可以让发送方先按照比较低的速度开始发送数据(小窗口),如果数据传输过程非常顺利,也没有丢包,那就再尝试使用更大的窗口,更高的速度进行发送(一点一点变化),随着窗口不断增大,达到一定程度,可能中间节点就会出现问题了,此时这个节点就可能会出现丢包。发送方发现丢包了,就把窗口大小再调整小,此时如果发现还是继续丢包,那就继续缩小。如果不丢包了,就继续尝试变大。
在这个过程中,发送方不停的调整自己的窗口大小,逐渐达成一个 "动态平衡".
这种做法,就相当于把 "中间节点" 视为一个整体,通过 "实验" 的方式,来找到中间节点的瓶颈在哪里。
上述过程如图:
流量控制和拥塞控制都是在限制发送方的发送窗口大小,
最终实际发送的窗口大小,是取 流量控制 和 拥塞控制 中的较小值。
(7) 延时应答
A 把数据传给 B,B 就会马上返回 ack 给 A (正常)。
也有的时候,A 传输给 B,此时 B 等一会再返回 ack 给 A (延时应答)。
本质上也是为了提升传输效率。
发送方的窗口大小,就是传输效率的关键。
流量控制这里,就是根据接收方的接收缓冲区的剩余空间,来控制发送方的发送速率的,
如果有办法,能让流量控制得到的窗口更大点,发送速率就更快点(大点的前提是,能让接收方处理的过来)
通过延时返回 ack,给接收方更多的时间读取接收缓冲区的数据,此时接收方读了这个数据之后,缓冲区的剩余空间,就变大了,返回的窗口大小,也就更大了。
比如,初始情况下,缓冲区的剩余空间是 10kb,如果立即返回 ack,就返回了 10kb 这么大的大小窗口。如果延时个 200ms 再返回,那么在这 200ms 的过程中,接收方的应用程序,又读了 2kb,此时,返回的 ack 就是返回 12kb 的窗口了。
延时应答,才促成了前面的四次挥手,能够三次挥完。
(8) 捎带应答
在延时应答的基础上,进一步提高效率。
3. TCP 特性
TCP 的特性是:有连接,可靠传输,面向字节流,全双工
面向字节流的特性是:
传输数据的时候可以非常灵活,可以一次传输一个字节,也可以一次传输多个字节。
但是这里存在一个问题:粘包问题(不是 tcp 独有的,而是面向字节流的机制都有类似的情况)
这里的包指的是应用层数据包,如果同时有多个应用层数据包被传输过去,此时就容易出现粘包问题。
如图:
那么该如何解决粘包问题呢?
核心思路:通过定义好应用层协议,明确应用层数据报之间的边界。
1. 引入分隔符
2. 引入长度
比如使用 \n 作为分隔符:
引入长度:
4. 异常情况的处理
如果在使用 tcp 的过程中,出现意外,会如何处理?
1) 进程崩溃
进程崩溃,本质上就是进程没了,进程终止了,那么文件描述符表就释放了,也就相当于调用 socket.close() ,此时就会触发 FIN,对方收到之后,自然也就会返回 ACK 和 FIN,这边再进行 ACK,这里就是一个正常的四次挥手断开连接的流程。
TCP 的连接,可以独立于进程存在。(进程没了,TCP 连接不一定没)
2) 主机关机 (正常流程)
在进行关机的时候,就是会先触发强制终止进程的操作(相当于 1)
此时就会触发 FIN,对方收到之后,自然会返回 ACK 和 FIN。
此时,不仅仅是进程没了,整个系统也关闭了。如果在系统关闭之前,对端返回的 ACK 和 FIN 到了,此时系统还是可以返回 ACK,进行正常的四次挥手的。如果系统已经关闭了,ACK 和 FIN 迟到了,就无法进行后续 ACK 的响应。站在对端的角度,以为是自己的 FIN 丢包了,就会重传 FIN,连续重传好几次都没有响应,最后对端就会放弃连接(把持有的对端信息删除)。
3) 主机掉电 (非正常)
主机掉电,是一瞬间的事情,还来不及杀进程,也来不及发送 FIN,主机直接就停机了。
1. 如果对端是在发送数据(接收方掉电),发送的数据就会一直等待 ack,触发超时重传,重传好几次还是没有响应,就会触发 TCP 的连接重置功能,发起复位报文段(RST = 1),如果复位报文段发过去之后也没有效果,此时就会释放连接了。
2. 如果对端是在接收数据(发送方掉电),对端还在等待数据到达,等了半天没消息,此时其实也无法区分,是发送方没发消息,还是发送方挂了。
针对这种情况,TCP 提供了心跳包的机制,接收方也会周期性的给发送方发送一个特殊的,不携带业务数据的数据包,并且期望对方返回一个应答,如果对方没有应答,并且重复了多次之后,仍然没有,就视为对方挂了,此时就可以单方面释放连接了。
4) 网线断开
网线断开和刚刚的主机掉电非常类似。
如何识别某个机器是否挂了,一般都是通过心跳来检测的。
5. TCP 和 UDP 之间的对比
TCP 有连接,可靠传输,面向字节流,全双工。
UDP 无连接,不可靠,面向数据报,全双工。
TCP 的优势是可靠传输,TCP 适用于绝大部分场景。
UDP 的优势是更高效率,UDP 适合于对 "可靠性不敏感","性能敏感" 的场景,比如局域网内部(同一个机房)的主机之间的通信。
如果要传输比较大的数据包,TCP 优先。(UDP 有 64kb 的限制)
如果要进行 "广播传输" ,优先考虑 UDP。UDP 天然支持广播,TCP 不支持(得自己写代码实现)
6. 基于 TCP 的应用层协议
- HTTP
- HTTPS
- SSH
- Telnet
- FTP
- SMTP
- 还包括程序员自身写 TCP 程序时定义的应用层协议
相关文章:
网络原理之 TCP 协议
目录 1. TCP 协议格式 2. TCP 原理 (1) 确认应答 (2) 超时重传 (3) 连接管理 a) 三次握手 b) 四次挥手 (4) 滑动窗口 (5) 流量控制 (6) 拥塞控制 (7) 延时应答 (8) 捎带应答 3. TCP 特性 4. 异常情况的处理 1) 进程崩溃 2) 主机关机 (正常流程) 3) 主机掉电 (…...
pinn爱看论文展
1.zhiwang 基于物理信息神经网络的波动方程优化求解方法 吴丹澜1梁展弘2余懿3蔡博3郑邦宏4王梓超4张紫玲4 1.肇庆学院计算机科学与软件学院,大数据学院2.香港城市大学电气工程系3.云浮市新兴县公安局4.肇庆学院计算机科学与软件学院、大数据学院 2,zhiwang 就爱…...
Burp(5)web网页端抓包与app渗透测试
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&…...
Spring 基础
什么是 Spring 框架? Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发&#…...
go 集成nacos注册中心、配置中心
使用限制 Go>v1.15 Nacos>2.x 安装 使用go get安装SDK: go get -u github.com/nacos-group/nacos-sdk-go/v2 快速使用 初始化客户端配置ClientConfig constant.ClientConfig{TimeoutMs uint64 // 请求Nacos服务端的超时时间,默…...
一文掌握 OpenGL 几何着色器的使用
学习本文需要具备 OpenGL ES 编程基础,如果看起来比较费劲,可以先看入门文章 OpenGL ES 3.0 从入门到精通系统性学习教程 。 什么是几何着色器 几何着色器(Geometry Shader) OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心…...
《数据资产入表:企业资产评估的新契机》
《数据资产入表:企业资产评估的新契机》 在当今数字经济时代,数据作为关键生产要素,其重要性日益凸显。国家高度重视数据资产,陆续出台了一系列重磅政策。其中,“数据二十条” 即《中共中央 国务院关于构建数据基础制度…...
架构14-资源与调度
零、文章目录 架构14-资源与调度 1、资源模型 (1)概述 在 Kubernetes 中,资源模型是一个非常重要的概念,它涉及如何管理和分配集群中的资源,以确保 Pod 能够在最合适的节点上运行。资源模型不仅包括物理资源&#…...
uni-app H5端使用注意事项 【跨端开发系列】
🔗 uniapp 跨端开发系列文章:🎀🎀🎀 uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…...
springboot407美发管理系统(论文+源码)_kaic
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装美发管理系统软件来发挥其高效地信息处理的作用࿰…...
Apache-HertzBeat 开源监控默认口令登录
0x01 产品描述: HertzBeat(赫兹跳动) 是一个开源实时监控系统,无需Agent,性能集群,兼容Prometheus,自定义监控和状态页构建能力。HertzBeat 的强大自定义,多类型支持,高性能,易扩展,希望能帮助用户快速构建自有监控系统。0x02 漏洞描述: HertzBeat(赫兹跳动) 开源实时…...
发送请求时遇到了数据库完整性约束错误 1048 Column ‘platform‘ cannot be null
可以这样解决 在 Vue 2 中封装接口请求时,确保每次请求都包含 platform Header 参数的最佳实践是通过创建一个全局的 Axios 实例,并为这个实例设置默认的 Header。这样可以确保所有通过该实例发送的请求都会自动包含 platform 参数。此外,你…...
Go快速开发框架集成Vue3漂亮的动态流程图编辑和动态流程展示插件
温馨提示:我们分享的文章是给需要的人,不需要的人请绕过,文明浏览,误恶语伤人! 前言 为大家在开发流程相关业务时有个漂亮流程图展示,我们集成一个实用的流程图编辑器,让流程开发变得简单&…...
【SH】微信小程序调用EasyDL零门槛AI开发平台的图像分类研发笔记
文章目录 微信小程序字符串字符串模板字符串拼接 上传图片GET请求测试编写测试代码域名不合法问题 GET和POST请求测试 微信小程序字符串 字符串模板 这是ES6引入的特性,允许你通过反引号()创建模板字符串,并在其中嵌入变量或表达…...
NanoLog起步笔记-6-StaticLogInfo
nonolog起步笔记-6-StaticLogInfo StaticLogInfo文件名和行号文件名和行号的传入log参数 RuntimeLogger::registerInvocationSitelogid为什么只能被赋一次值 reserveAlloc加入消息头finishAlloc返回 StaticLogInfo 写C语言编译前端时,给我印象深刻的一部分是&#…...
【OpenCV】视频录制
初始化一个视频写入对象,目的是将图像帧序列保存为视频文件。使用了OpenCV库中的cv2.VideoWriter类来创建这个对象,并且设置了视频的编码格式、帧率以及分辨率。 导入库 import cv2 import datetime cv2 是 OpenCV 库的 Python 接口,提供了…...
同城到家预约上门服务解决方案:家政预约同城服务小程序
### 系统架构"同城到家预约上门服务解决方案:PHP家政预约同城服务小程序"采用B/S架构,后端使用PHP语言开发,前端则基于微信小程序平台。系统分为用户端、服务端和后台管理端,各端相互依赖又相互独立,支持多种…...
linux-14 关于shell(十三)type,内置命令和外部命令
我们说一个命令,叫做type,先来看看type的效果,比如说我指定type后面这个命令叫cd,如下图, 你看它说什么?cd is a shell builtin,我再 type ls,看它会说什么?如下图&#…...
使用php生成、识别二维码
1、生成二维码 要求: # 详见:https://packagist.org/packages/bacon/bacon-qr-code php: ^8.1iconv Library imagick Library # 或者:GD library 下载: # 详见:https://packagist.org/packages/bacon/bacon-qr-cod…...
pytorch多GPU训练教程
pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分,模型拆分(Model Parallelism)2.3 数据拆分,模型…...
日拱一卒(12)——leetcode学习记录:2的幂
一、题目 判断一个整数n是否是2的幂次,是返回True,否返回False 二、分析 1. 递归法:如果n是0,返回False,如果n是1,返回True,其他情况,将n//2递归 2. 数学法:还是从数…...
非文件形式的内存动态函数库调用接口
使用memfd的系统调用接口将动态库加载到proc虚拟文件系统,提供的fd为进程持有的句柄,通过dlopen的path指向此句柄,即可实现非文件系统加载动态链接库。 文章目录 一、memfd_create二、dl_open三、示例参考 一、memfd_create 接口名称int mem…...
TimeXplusplus——提高时间序列数据的可解释性,避免琐解和分布偏移问题的深度学习可解释性的框架
摘要 论文地址:https://arxiv.org/abs/2405.09308 源码地址:https://github.com/zichuan-liu/timexplusplus 信号传输技术的优化对于推动光通信的发展至关重要。本文将详细探讨线路编码技术的目标及其实现方式。线路编码旨在提高带宽和功率效率…...
第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题②
第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题② 模块A 基础设施设置与安全加固(200分)A-1 登录安全加固(Windows, Linux)A-2 Nginx安全策略(Linux)A-3日志监控(Windows)A-4中间件…...
嵌入式蓝桥杯学习9 usart串口
复制一下之前ADC的工程,打开cubemx cubemx配置 1.在Connectivity中点击USART1 Mode(模式):Asynchronous(异步模式) 2.将PA9设置为USART1_TX,PA10设置为USART1_RX。 3.配置Parameter Settings. Baud R…...
golang实现简单的redis服务4.0(持久化)
redis的持久化机制与实现原理RDB工作原理问题1:如果数量很大怎么办?问题2:子线程在持久化期间有新的数据写入会发生什么?如何保证数据一致性? AOF的原理如何解决aof文件越来越大的问题aof文件如何重写?aof如何恢复数据aof文件有问题(损坏了)恢复会发生什么?怎么办?aof有哪…...
安卓底层相机流的传输方式
这是安卓 相机流的定义 typedef enum {CAM_STREAMING_MODE_CONTINUOUS, /* continous streaming */CAM_STREAMING_MODE_BURST, /* burst streaming */CAM_STREAMING_MODE_BATCH, /* stream frames in batches */CAM_STREAMING_MODE_MAX} cam_streaming_mode_t; 在ca…...
【YashanDB知识库】使用c-调用yashandb odbc驱动执行SQL时报YAS-08008 not all variables bounded
本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7508307.html?templateId1718516 问题现象 某客户的应用(c# asp.net)在运行时报如下异常: 问题的风险及影响 客户的应用无法正常运行 问题影响的版本 所有的yashandb版本…...
SQL项目实战与综合应用——项目设计与需求分析
项目设计与需求分析是软件开发过程中的核心环节,尤其在涉及数据库的应用时,良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践,结合 C 与 SQL 的实际应用场景,涵盖项目需求收集、数据库设…...
JAVA基础学习笔记_反射+动态代理
文章目录 反射获取class对象的三种方式获取构造方法获取成员变量获取成员方法反射的作用 动态代理 反射 允许对成员变量\成员方法\构造方法的信息进行编程访问 把类内的信息扒的干干净净,获取解剖 获取从class字节码文件中获取 获取class对象的三种方式 public static void …...
Go 协程上下文切换的代价
在 Go 语言中,协程(Goroutine)是一种非常轻量级的并发执行单元,设计之初就是为了简化并发编程并提高性能。协程的上下文切换被认为是非常高效的,但是它的真正性能优势需要我们深入了解其背后的机制。 本文将深入探讨 …...
TikTok代理IP:如何帮助解决限流、封号问题?
在当今的社交媒体领域,TikTok仍然是“当红”平台。然而,许多用户在使用 TikTok 的过程中,常常会遇到限流和封号的问题,比如视频零播放,带来了极大的困扰。 这些限流和封号问题的出现,引发了用户对解决方法…...
vue中验证码的实现方式
在写登录页的时候有的系统会让你也进行一下验证码绘制,那么验证码如何实现的呢?我在写登录页的时候通过将登录框,验证码分开页面来写,最后将它们变成标签来导入到我的样式页面中,这样写不仅方便,更容易修改…...
从零开始学习18串锂电池BMS保护板
18串锂电池BMS保护板实物开源资料! BMS系统ADBMS1818/LTC6813凌力尔特主从一体机采集板:STM32F103LTC6813/ADBMS1818程序已调通: 1:18串电池电压(采集精度1.2mV/3mV) 2:8通道温度采集 3:一通道电流采集 4:RS485通信(楼…...
最左侧1问题的一种二分法解法
背景 最近看TI的C6000系列DSP文档时了解到Leftmost 1 or 0 counting功能, 网上搜索到这篇相关博客(最左侧1问题),发现里面的二分法代码自己看不懂,于是尝试用更容易看懂的方式重写一下。 思路 假设输入数据不超过3…...
HarmonyOS-中级(四)
文章目录 Native适配开发三方库的基本使用 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月09日11点12分 Native适配开发 Node-API HarmonyOS Node-API 是 HarmonyOS 提供的…...
rust中self、self、self区别
self的类型,在给出调用者和方法名的前提下,Rust可以准确地推导出方法是否是只读的(&self),是否需要修改数据(&mut self),是否会获取数据的所有权(self࿰…...
种子流和花粉流怎么理解它们之间的大小关系
种子流和花粉流是植物繁殖和遗传多样性研究中的两个重要概念,它们分别描述了种子和花粉在空间上的传播过程。理解它们之间的大小关系,即传播距离和对遗传结构的影响,对于生态学和保护生物学具有重要意义。 种子流(Seed Dispersal&…...
Mybatis-plus 源码解读
简述 本篇主要针对MybatisPlus源码进行解读。 案例 上一篇已经讲了Springboot如何集成MybatisPlus: springboot-mybatis-plus集成篇 源码解析 和Springboot集成Mybatis一样, 依赖了mybatis-plus-spring-boot3-starter,其中主要关注spri…...
web 期末作业简单设计网页——“我的家乡”网站简单设计
1、网页效果 首页 七彩云南页 旅游攻略页 用户页面 2、源代码 首页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><link rel"stylesheet" href"out.css&quo…...
Redis篇-3--原理篇2--Redis事务
1、概述 Redis 提供了简单的事务机制,Redis 事务的本质是一组命令的集合。当执行redis事务时,即一次性按照添加顺序依次执行这些命令,中间不会被打断或者干扰。 Redis 的事务机制并不像关系型数据库中的事务那样提供完整的ACID特性…...
GEE:CCDC 分类组件,对每个分段进行分类
作者:CSDN @ _养乐多_ 连续变化检测与分类(Continuous Change Detection and Classification, CCDC) 利用了时间序列拟合来对影像中的像素值随时间的变化趋势建模。每一段模型代表一个时间段内的地表覆盖类型和状态。 本文将解释如何在谷歌地球引擎(Google Earth Engine,…...
常见排序算法总结 (四) - 快速排序与随机选择
快速排序 算法思想 每一轮在数组相应的范围上随机找一个元素进行划分,将不大于它的所有元素都放到左边,将大于它的元素都放到右边。在左右两个子数组上不断地递归,直到整个数组上有序。 注意:实现时选择的时参考荷兰国旗问题优化…...
[创业之路-187]:《华为战略管理法-DSTE实战体系》-1-从UTStarcom的发展历程,如何辩证的看企业初期发展太顺利中的危机
目录 一、UTStarcom(UT斯达康)的发展历程 1、创立与初期发展 2、快速成长与上市 3、技术创新与业务拓展 4、战略调整与持续发展 二、从UTStarcom的发展历程,如何辩证的看企业初期发展太顺利中的危机 1、企业初期发展的顺利表现 2、顺…...
C缺陷与陷阱 — 3 深入理解表达式
目录 1 表达式的运算次序 1.1 自增或自减操作符 1.2 函数参数 1.3 函数指针 1.4 函数调用 1.5 嵌套赋值语句 2 函数调用不作为函数参数 3 赋值语句的谨慎使用 1 表达式的运算次序 除了少数操作符(函数调用操作符 ( )、&&、| |、? : 和 ,ÿ…...
Next.js 系统性教学:中间件与国际化功能深入剖析
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 一、Next.js 中间件 (Middleware) 功能解析 1.1 什么是中间件? 1.2 Next.js 中间件的工作机制 1.3 中间件的功能应用 身份验证与授权 请求重定向 修改请…...
openWebUI+ollamawindows+不用docker+webLite本地安装
openWebUI & ollama & windows & 不用docker & webLite 本地安装 总结一下安装教程 10核CPU16G内存 两个web框架都可以,先说简单的 ollama-webui-lite(https://github.com/ollama-webui/ollama-webui-lite) 轻量级,只使用nodejs 先装…...
动态规划——机器分配、01背包问题
一、机器分配 题目名称:机器分配 题目描述: 总公司拥有高效设备M台,准备分给下属的N个分公司。 各分公司若获得这些设备,可以为国家提供一定的盈利。 问:如何分配这M台设备才能使国家得到的盈利最大?求出最…...
leetcode——哈希表1
242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词 。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat", t "car" 输出: false 提示: 1 < s.le…...
STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?
主要问题: 1,使用STM32F103C8T6,模拟IIC,SCL和SDA口配置为推挽输出上拉,主要是SDA脚,每次都要输出输入模式重新配置,虽然也能通信,但不稳定,出错率大; 2&…...