网络原理 - 7(TCP - 4)
目录
6. 拥塞控制
7. 延时应答
8. 捎带应答
9. 面向字节流
10. 异常情况
总结:
6. 拥塞控制
虽然 TCP 有了滑动窗口这个大杀器,就能够高效可靠的发送大量的数据,但是如果在刚开始阶段就发送大量的数据,仍然可能引起大量的问题。
我们前面提到了流量控制,是站在接收方的角度来制约发送方的速率。
但也可能出现下面的情况:
如果当前接收方处理的速度非常快,但是在发送到到达接收方的中间的通信路径出现问题,某个地方发生“堵车”了,即当前的网络状态比较拥堵了,此时发送方再怎么发送,都是无济于事的~~
针对于上面的情况,我们解决的核心思路:把中间路径经过的所有设备,视为是一个整体,然后通过“实验”的方式,找到一个比较合适的传输速率。(毕竟有句话讲的好嘛,实践才是检验真理的唯一标准)。
如果按照某个窗口大小发送数据之后,出现丢包情况了,就视为是中间路径存在拥堵,就减小窗口大小,如果没出现丢包情况,就视为中间路径不存在拥堵,就增大窗口大小。
上述方案,一方面就把整个问题给简化了,另一方面,也能够很好的适应当前网络环境的复杂性,中间这些节点,啥时候出现拥堵,啥时候不用读,就都是“随机” 的,此时按照上述策略,就可以让发送速率,来进行动态变化。
总的原则是,流量控制和拥塞控制,谁产生的窗口大小,谁更小,就谁说了算~~~
那我们上述方案中,是具体怎么把这个窗口大小给试出来的呢???
1. 慢启动:刚开始传输的数据,速率都是比较小的,采用的窗口大小也就比较小,也就采用的拥塞窗口的大小,(这里的实际的窗口大小,应该是拥塞窗口和流量控制的较小值,但一般拥塞窗口的初始值肯定是小于流量控制的)。此时,网络的拥堵情况未知,如果一上来就搞得窗口很大,可能就会让本来就不富裕的网络带宽,更加雪上加霜了。
2:指数增长,如果上述传输的数据,没有出现丢包的情况,说明网络还是很畅通的,就要增大窗口大小了。此时,增大的方式是按照指数来增长的(* 2)当下的窗口持久
(由于使用慢启动,开始的时候,窗口大小非常非常小,也有可能网络上就是很通畅,通过指数增长的方式可以让上述的窗口大小快速变大,这样就可以保证传输的效率了~~~)
3. 线性增长:指数增长并不会一直持续保持的,可能会增长太快,一下子就导致网络拥堵,这里就引入了一个“阈值”,当拥塞窗口达到阈值之后,此时,指数增长也就成为了线性增长。
(线性增长能够使得当下的窗口,持久的保持在一个比较高的速率,并且也不容易一下就造成丢包情况)
4.动态调整:线性增长也是一直在增长,积累一段时间之后,传输的速度可能太快,此时还是会引起丢包情况。一旦出现丢包,就把拥塞窗口重置成比较小的值了,然后又会重新回到最初的慢启动过程(又要重新的指数增长,并且这里也会根据刚才丢包时候的窗口大小,重新设置指数增长到线性增长的阈值)
情况如下:
这里存在两种版本,TCP Tahoe 版本和 TCP Reno 版本,虚线部分是经典的版本,就是当线性增长知道出现丢包情况的时候,此时拥塞窗口的大小,就会回到非常小的值,重新指数增长,重新线性增长。而在新版本中,后续就没有指数增长了,拥塞窗口的大小会回到丢包时候的 1 / 2,然后进行线性增长。
(之所以有这两个版本的更迭,主要是因为,网络环境发生了大的变化,TCP 诞生于 1981 年,当年,网络的带宽,网络的通信质量的稳定性,与现在的网络,都是无法相提并论的~~~当年的时候,网络会经常的出现大规模的网络波动,一旦出现拥塞,网络带宽就非常捉襟见肘了,按照比较小的速率发送,是一种更加稳健的做法~~~)
7. 延时应答
延时应答机制,也是基于滑动窗口,进一步的提升效率的机制,结合滑动窗口以及流量控制,再通过延时应答 ack 的方式,把反馈的窗口大小,搞大一点~~
如果接收数据的主机立刻返回 ack 应答,这时候返回的窗口大小可能就比较小:
假设接收端的接收缓冲区为 1M,一次收到了 500K 的数据,如果立刻应答,返回的窗口就是 500K,但实际上可能处理端的速度非常快,10ms 之内就把 500K 的数据从缓冲区给消费掉了。在这种情况下,接收端处理还远远没有到达自己的极限,即使窗口再放大一些, 也能处理的过来,如果接收端稍微等待一会,再进行应答,比如等待 200ms 再应答,那么这个时候返回的窗口大小就是 1M 了~~~
窗口越大,网络的吞吐量就越大,传输效率就越高,我们期望的是,在保证网络不拥塞的情况下,尽量的提高传输效率~~~
我们前面讲,通过滑动窗口来传输数据,如果 ack 丢了,其实并不会有太大的影响。延时应答具体怎么延时,也不是单纯的按照时间,而是可以按照“ack 丢了”的方式来进行处理~~~
正常每个数据都有 ack,此时就可以每隔几个数据,再返回一个 ack 了(每隔几个数据,就能起到延时应答的效果)另外也能够减少 ack 传输的数量,也能起到节省开销的效果。
这里也不仅仅是数据的数量,也是和时间有关的~~~这个情况,如果延时时间达到一定程度了,即使个数没够,也会返回 ack了,一般情况下,数量限制是每个 N(一般取 2)个包就应答一次,超过最大延时时间(一般取 200ms)就应答一次~(这里的数值都是可以进行调整的,重点的理解这个策略~~)
8. 捎带应答
这个捎带应答机制,又是基于延时应答,引入的机制,能够提升传输效率~
修改窗口大小,的确是提升效率的有效途径。捎带应答,就是走另一条路,尽可能把能合并的数据报进行合并,从而起到提高效率的结果。
我们发现,很多情况下,客户端服务器在应用层也是“一发一收”的,意味着客户端给服务器说了“How are you”,服务器也会给客户端回复一个“Fine,thank you ~”,那么这个时候,ack,就可以搭乘顺风车,和服务器回应的“Fine,thank you”一起回复给客户端了(这里也是因为有延时应答的存在~~)
如下图所示:
客户端在给服务器发送 request 之后,因为一问一答的机制,服务器会返回一个 ack(这个 ack 是 TCP 机制控制的,由内核进行自动返回的~),然后服务器在收到请求 request 之后,就要执行对应的业务逻辑,根据请求计算响应,然后再返回对应的 response。
因为有了延时应答机制,ack 的应答时间就会推迟一些~
就会有如上的情况出现~ 在 ack 延时的这段时间里,响应数据刚好准备好了,此时就可以把 ack 和应答的响应数据合并成一个 TCP 数据报了。
而且,本身 ack 也不携带载荷,只是把报头中的 ack 标志位设置为 1,并且设置确认序号以及窗口大小,这几个属性,本身一个正常的 response 报文也用不到,也不会冲突,就可以讲 ack 和 response 一起传输过去~
注意:这里和三次握手是有本质的区别的~
三次握手,是相当于一个打招呼的过程,是一个没有意义的数据报,没有载荷,而后续的传输过程都是有载荷的~~
而且,很多时候,客户端和服务器之间都是长连接,要进行若干次请求的。在捎带应答的加持之下,后续的每次传输请求响应,都可能触发捎带应答,都可能把接下来要传输的业务数据和上次的 ack 合二为一。(注意:这里是有可能触发捎带应答,也不是一定能触发,具体是否能触发,就取决于我们程序员代码是如何写的了~~~取决于我们的下一个数据来的快不快,如果下一个数据来的很快,在延时应答的延时时间之内,就可以触发合并,如果下一个数据来的慢,就无法触发了~)
因为延时应答 + 捎带应答,就有可能使得后续的四次挥手,合并为三次~~
9. 面向字节流
我们创建一个 TCP 的 socket,同时在内核中创建一个发送缓冲区和一个接收缓冲区;
- 调用 write 的时候,数据会先写入发送缓冲区中
- 如果发送的字节数太长,就会被拆分成多个 TCP 的数据报发送
- 如果发送的字节数太短,就会现在缓冲区里面等待,等到缓冲区的长度差不多了,或者其他合适的实际再发送出去~
- 接收数据的时候,数据也是从网卡驱动程序到达内核的接收缓冲区
- 然后应用程序可以调用 read 从接收缓冲区拿到数据
- 另一方面,TCP 的一个连接,既有发送缓冲区,也有接收缓冲区,那么对于这一个连接,既可以读数据,也可以写数据,这个概念就是我们前面提到的 全双工。
由于缓冲区的存在,TCP 的程序的读和写都不需要意义匹配,即:
写 100 个字节的数据时候,可以调用 1 次 write 写 100 个字节,也可以调用 100 次 write 每次写 1 个字节~~~
读 100 个字节数据的时候,也完全不需要考虑写的时候,是怎么写的,既可以一次 read 100 个字节,也可以一次 read 一个字节,重复 100 次~~
这就会导致一个“粘包问题”!!此处的包,指的是 TCP 载荷中的应用数据包~~
在 TCP 的协议报头中,没有如同 UDP 一样的“报文长度”这样的字段,但是有一个序号这样的字段
站在传输层的角度,TCP 是一个一个报文过来的, 按照序号排列好放在缓冲区中
站在应用层的角度,看到的只是一串连续的字节数据
那么当应用程序看到了这么一连串的字节数据,就不知道要从那个部分开始,到那个部分结束,算是一个完成的应用层数据包了。
举个栗子:
此处假定,这三个 TCP 数据报都是携带的完整的应用层数据包(因为也可能一个 TCP 数据包可以携带多个或者半个应用层数据包)
当发送方发送数据给接受方之后,接收方的接收缓冲区和传输层角度,这几个数据都是按照序号拍好的顺序:
但是站在应用层的角度,应用程序调用 read 读取数据,由于此处是字节流,读取过程非常灵活,一次可以读出一个 a,也可以一次读出 aa,也可以一次读出 aaa,也可以一次读出 aaab........ 多个应用层数据包之间混淆不清了,这种情况就称为“粘包问题”。应用程序要读出数据之后,将里面的数据转成应用层数据包,然后这个数据才能正确的被使用,但由于“粘包”的存在,究竟是那种读法,读出来的才是完整的应用层数据包呢???
粘包问题,并不是 TCP 所独有的问题,只要是面向字节流传输,都会有这样的问题,解决这个问题的关键,就是要明确“包之间的边界”。
1. 通过特殊符号,作为分隔符。只要一见到分隔符,应用程序视为一个包结束了~我们前面在写回显服务器的时候,就是使用了分隔符作为边界(空白符 + Scanner)
这里并非必须使用空白符,使用任意字符作为分隔符都是可以的,不过前提是要去报当前这个分隔符不会在正式的数据中存在~~~
2. 指定出包的长度,比如在包开始的位置,加上一个特殊的空间来表示整个数据的长度。
上述的问题,都应该是我们在设计应用层协议的时候,把相关的问题考虑进去,提前设计好~~
对应的,UDP 其实就没有这个问题。UDP 传输的基本单位是 UDP 数据报,在 UDP 这一层,就已经分开了,只要约定好,每个 UDP 数据报都只承载一个应用层数据包,就不需要额外的手段来进行区分了~~~
UDP 的接收缓冲区并不是一个队列的结构,而是类似一个链表
UDP 的接收缓冲区类似于一个链表,每个链表的结点都是一个 UDP 数据报,通过代码来读取的时候,一次取一个,也就是一个应用层数据包了~~
补充:粘包问题,是 TCP 面向字节流引起的,但 TCP 本身是不会有机制负责解决,需要我们程序员知道 TCP 存在粘包问题,通过代码,写应用层逻辑的时候,自己去解决~~~ 我们前面提到过的各种常用的应用层协议的格式,xml,json,protobuffer,都能够很好的处理粘包问题~~~
10. 异常情况
异常情况,是一种比丢包更严重的情况,甚至说就是网络直接出现了故障的情况,此时该如何处理呢???
1. 其中有一方,出现了进程崩溃。
进程无论是正常结束,还是异常崩溃,都会触发到回收文件资源,关闭文件这样的效果(都是系统自动完成的),就会触发四次挥手。TCP 连接的生命周期,可以比进程更长一些,即虽然进程已经退出了,但是 TCP 连接还在,仍然可以继续进行四次握手。
(即,虽然说是异常崩溃,但是实际上和正常的四次挥手结束,没啥区别,进程不在了,但是可以通过系统中仍然存在的连接信息,完成后续的回收过程的)
2. 其中有一方出现了 关机(按照正常流程进行关机)
当有主机,触发关机操作,就会先强制终止所有的进程(强杀进程),终止进程自然就会触发 4 次挥手。点了关机之后,此时,四次挥手不一定能挥完,系统马上就关闭了。
如果挥的快,能够顺利的挥完,本端和对端都能正确的删除掉保存的连接信息。(四次挥手的核心任务)
如果挥的不快,至少也能把第一个 fin 发送给对方,至少能告诉对方,我这边要结束了。对端在收到 fin 之后,对端也就要进入释放连接的过程了,返回 ack,并且也返回 fin,对端如果这时候已经关闭,这里发的 fin 就不会有 ack 了,fin 没有收到 ack 之后,势必会进入重传(超时重传的流程~~~)当重传几次之后,发现还是不行,还是没有 ack,这个时候,也就会单方面的释放连接信息了~~~
正常来说的四次挥手,是确认双方都删除干净,但是,如果四次挥手没那么顺利,没挥完手,对端就挂了,没 ack,挥不下去了,重试几次,也就会直接单方面的删除连接信息~~~
3. 其中一方出现断电(直接拔电源,此时也是关机,不过是更突然性的关机)
如果直接断电,机器瞬间关机,此时,肯定是来不及发送 fin 的,这里分两种情况:
a)断电的是接收方,发送方就会突然发现,没有 ack 了,就要重传,重传几次之后,发现还是不行,TCP 就会尝试“复位”连接(相当于清除 TCP 中的各种临时数据,重新开始)这里复位操作,也需要用到一个 TCP 的“复位报文段”,即六个关键字之一的 -- RST,通过这个报文,直接复位,既往不咎,过往就翻篇了~~此时的 RST 也不会有 ack,发送方就想,重置了还不行??? ==》 直接单方面放弃连接~~~
b)断电的是发送方呢???接收方本来就是在阻塞等待发送方的消息,结果迟迟没有等来消息,怎么办呢???
这个情况下,接收方就需要区分了,到底是发送方挂了,还是好着呢,但是暂时没法数据。这个时候,接收方在等待一段时间之后,没有收到对方的消息,就会触发“心跳包”来询问一下对方的情况。(心跳包,也是一种不带应用层数据的特殊数据报 ==》 1. 周期性的 2. 如果没有心跳,就会认为对端挂了~~)
如果对端没心跳了,此时本段也就会尝试复位并且进行单方面的释放连接了~~
4. 网线断开
这种情况就是 3 情况的 a b 情况结合了~~~
总结:
前面的内容,就是对 TCP 协议中,一些比较重要的,需要我们了解的一些机制的介绍~~~TCP 协议也有其他重要协议,这里只是挑了几个比较核心的进行介绍~
相关文章:
网络原理 - 7(TCP - 4)
目录 6. 拥塞控制 7. 延时应答 8. 捎带应答 9. 面向字节流 10. 异常情况 总结: 6. 拥塞控制 虽然 TCP 有了滑动窗口这个大杀器,就能够高效可靠的发送大量的数据,但是如果在刚开始阶段就发送大量的数据,仍然可能引起大量的…...
探秘 FFmpeg 版本发展时间简史
前言 FFmpeg 是一套开源的计算机程序,主要用于记录、转换数字音频、视频,并能将其转化为流。它提供了录制、转换以及流化音视频的完整解决方案,在多媒体处理领域应用广泛。很多小伙伴们想系统的学习FFmpeg,还是有必要了解下FFmpeg的版本发展历史,感受它每次的版本迭代是如…...
5.3.1 MvvmLight以及CommunityToolkit.Mvvm介绍
MvvmLight、CommunityToolkit.Mvvm是开源包,他们为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。 本文介绍如下: 一、使用(旧)的MvvmLight库 其特点如下,要继承的基类是ViewModelBase;且使用…...
PCB常见封装类型
1. 电阻、电容、电感封装 2. 二极管、三极管封 3. 排阻类器件(8脚、16脚)封装 4. SO类器件(间距有1.27、2.54mm等)封装 5. QFP类器件封装(四方扁平封装) 结构:引脚分布在封装的四个侧面&#…...
一键多环境构建——用 Hvigor 玩转 HarmonyOS Next
引言 在 HarmonyOS Next 的应用开发中,常常需要针对不同环境(测试、预发、线上)或不同签名(调试、正式)输出多个 APP/HAP 包。虽然 HarmonyOS 提供了多目标构建(Multi-Target Build)能力&#…...
SQLPandas刷题(LeetCode3451.查找无效的IP地址)
描述:LeetCode3451.查找无效的IP地址 表:logs ---------------------- | Column Name | Type | ---------------------- | log_id | int | | ip | varchar | | status_code | int | ---------------------- log_id 是这张表的唯…...
【leetcode100】组合总和Ⅳ
1、题目描述 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1: 输入:nums [1,2,3], target 4 输出࿱…...
2020-06-23 暑期学习日更计划(机器学习入门之路(资源汇总)+概率论)
机器学习入门 前言 说实话,机器学习想学好真心不易,很多时候都感觉自己学得云里雾里。以前一段时间自己为了完成毕业设计,在机器学习的理论部分并没有深究,仅仅通过TensorFlow框架力求快速实现模型。现在来看,很多时候…...
Linux操作系统--基础I/O(上)
目录 1.回顾C文件接口 stdin、stdout、stderr 2.系统文件I/O 3.接口介绍 4.open函数返回值 5.文件描述符fd 5.1 0&1&2 1.回顾C文件接口 hello.c写文件 #include<stdio.h> #include<string.h>int main() {FILE *fp fopen("myfile","…...
Spring boot 中的IOC容器对Bean的管理
Spring Boot 中 IOC 容器对 Bean 的管理,涵盖从容器启动到 Bean 的生命周期管理的全流程。 步骤 1:理解 Spring Boot 的容器启动 Spring Boot 的 IOC 容器基于 ApplicationContext,在应用启动时自动初始化。 入口类:通过 SpringB…...
ARINC818协议一些说明综述
关键术语 航空总线技术 光纤通道层次架构 光纤通道拓扑结构 FC-AV协议,架构,容器系统 ARINC818协议,容器 ADVB帧映射,帧格式 机载视频处理系统对视频数据进行实时处理和记录。 分辨率:1080p,4k,8k视频技术 FC-AV技术是…...
Turso:一个基于 libSQL的分布式数据库
Turso 是一个完全托管的数据库平台,支持在一个组织中创建高达数十万个数据库,并且可以复制到任何地点,包括你自己的服务器,以实现微秒级的访问延迟。你可以通过Turso CLI(命令行界面)管理群组、数据库和API…...
2025.5.4机器学习笔记:PINN文献阅读
2025.5.4周报 文献阅读题目信息摘要创新点网络架构实验结论不足以及展望 文献阅读 题目信息 题目: Physics-Informed Neural Network Approach for Solving the One-Dimensional Unsteady Shallow-Water Equations in Riverine Systems期刊: Journal o…...
一行命令打开iOS模拟器
要在 Mac 命令行打开 iPhone 15 Pro 模拟器,需满足已安装 Xcode 这一前提条件,以下是具体操作步骤: 步骤一:列出所有可用模拟器设备 打开终端(Terminal),输入并执行以下命令,用于列…...
java面向对象编程【基础篇】之基础语法
目录 🚀前言🌟构造器💯案例 🤔this关键字💯使用this调用本类中的属性💯使用this调用构造器💯this表示当前对象 🦜封装💯合理隐藏💯合理暴露 🐧实体…...
跑MPS产生委外采购申请(成品)
问题:跑MPS产生委外采购申请(成品),更改BOM和跑MRP,但物料需求清单中无新增物料复合膜的需求。截图如下: 解决方法:更改委外采购申请的批准日期为BOM的生效日和重新展开bom。 重新展开后&#x…...
[flutter]切换国内源(window)
如题,切换到国内源避免总是连不上google导致卡住的问题。 临时切换到国内: cmd set PUB_HOSTED_URLhttps://pub.flutter-io.cn set FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cnpower shell $env:PUB_HOSTED_URL "https://pub.flut…...
学习海康VisionMaster之顶点检测
一:进一步学习了 今天学习下VisionMaster中的顶点检测:可检测图像指定区域内的顶点,并输出顶点坐标等信息。该模块常用于检测目标物体的顶点 二:开始学习 1:什么是顶点检测? 一个不是很规则的物体需要检测…...
Vue2中常用的核心函数(选项和生命周期钩子)的完整示例及总结
以下是Vue2中常用的核心函数(选项和生命周期钩子)的完整示例及总结: 1. 实例选项函数 data 初始化组件数据 new Vue({el: #app,data() {return {message: Hello Vue!};} });methods 定义组件方法 new Vue({el: #app,data() {return { c…...
数据集-目标检测系列- F35 战斗机 检测数据集 F35 plane >> DataBall
数据集-目标检测系列- F35 战斗机 检测数据集 F35 plane >> DataBall DataBall 助力快速掌握数据集的信息和使用方式。 贵在坚持! * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s…...
2025年3月AGI技术月评|技术突破重构数字世界底层逻辑
〔更多精彩AI内容,尽在 「魔方AI空间」 ,引领AIGC科技时代〕 本文作者:猫先生 ——当「无限照片」遇上「可控试穿」,我们正在见证怎样的智能革命? 被低估的进化:开源力量改写游戏规则 当巨头们在AGI赛道…...
【k8s】k8s是怎么实现自动扩缩的
Kubernetes 提供了多种自动扩缩容机制,主要包括 Pod 水平自动扩缩(HPA)、垂直 Pod 自动扩缩(VPA) 和 集群自动扩缩(Cluster Autoscaler)。以下是它们的实现原理和配置方法: 1. Pod …...
协作开发攻略:Git全面使用指南 — 引言
协作开发攻略:Git全面使用指南 — 引言 Git 是一种分布式版本控制系统,用于跟踪文件和目录的变更。它能帮助开发者有效管理代码版本,支持多人协作开发,方便代码合并与冲突解决,广泛应用于软件开发领域。 文中内容仅限技…...
【AI提示词】私人教练
提示说明 以专业且细致的方式帮助客户实现健康与健身目标,提升整体生活质量。 提示词 # Role: 私人教练## Profile - language: 中文 - description: 以专业且细致的方式帮助客户实现健康与健身目标,提升整体生活质量 - background: 具备丰富的健身经…...
【星海出品】Calico研究汇总
Calico项目由Tigera公司发起并主导开发 源码 https://github.com/projectcalico/calico?tabreadme-ov-file#-join-the-calico-community 简介 Tigera是一家专注于云原生安全的公司,于2016年成立,其核心产品包括开源的Calico项目以及商业版的Calico Ent…...
观成科技:摩诃草组织Spyder下载器流量特征分析
一、概述 自2023年以来,摩诃草组织频繁使用Spyder下载器下载远控木马,例如Remcos。观成安全研究团队对近几年的Spyder样本进行了深入研究,发现不同版本的样本在数据加密、流量模式等方面存在差异。基于此,我们对多个版本样本的通…...
中心极限定理(CLT)习题集 · 题目篇
中心极限定理(CLT)习题集 题目篇 共 18 题,覆盖经典 CLT、Lyapunov/Lindeberg 条件、Berry–Esseen 评估、 以及工程/数据科学应用与编程仿真。推荐先独立完成,再看《答案与解析篇》。 之前已经出过相关的知识点文章,…...
ITL和TTL线程间值的传递
InheritableThreadLocal InheritableThreadLocal 继承自 ThreadLocal,增加了父线程到子线程的值传递功能。当一个新线程被创建时,InheritableThreadLocal 会将父线程中 ThreadLocal 变量的值拷贝到子线程(浅拷贝),子线…...
Android学习总结之Room篇
一、Room 框架基础 1. 实体类(Entity) 实体类用于描述数据库表的结构。通过使用 Entity 注解,可以将一个 Java 类映射到数据库中的一张表。例如,以下是一个简单的 User 实体类: import androidx.room.Entity; impor…...
java IO流
一:概述 (1)IO (2)流 二:分类 (1)流向 (2)数据单位 (3)IO流角色 三:API (1)InputStream ÿ…...
STM32 串口USART
目录 常见的通信方式 串行通信和并行通信 全双工,半双工和单工通信 同步通信和异步通信 通信速率 常见的通信协议 串口基础知识 电平特性 串口传输协议 STM32F103的USART资源 端口引脚 数据寄存器单元 发送接收控制单元 实现串口发送 printf…...
数字IC后端项目典型问题之后端实战项目问题记录(2025.04.24)
今天给大家分享下近两天小编帮助学员解决的几个经典后端项目问题。希望能够对大家的学习和工作有所帮助。 Q1:在做a7top顶层物理验证Calibre LVS检查时提示NOT COMPARED,请问是什么原因? 我们在用calibre检查LVS后,其结果基本上就是以下三种…...
关于边缘计算盒子的外部接口保护
边缘计算盒子是一种基于边缘计算和人工智能技术的智能设备,它内置了灵活可配的多样化AI算法库,所以也被称为AI算法盒子或智能边缘分析一体机,可以将数据处理和分析的能力推至离数据源最近的边缘位置,提供高效的数据处理和实时响应…...
OCP考试需要注意什么?
一、OCP考试需要准备的资料 身份证件:携带有效的身份证件(如身份证、护照等),以便在考试当天进行身份验证。确保身份证件在考试当天仍然有效,并且与报名时使用的证件一致。 准考证:打印并携带准考证&…...
git Http改用户下载
用原先别人账号,无权下更新 http方式设置自己账号 例如 git fetch --all 提示没有权限从 http://192.168.1.2/gitlab/项目路径.git下载 git remote set-url origin http://your-username192.168.1.2/gitlab/项目路径.git your-username修改成自己的git账号 需要输入一个Tok…...
postgres 导出导入(基于数据库,模式,表)
在 PostgreSQL 中,导出和导入数据库、模式(schema)或表的数据可以使用多种工具和方法。以下是常用的命令和步骤,分别介绍如何导出和导入整个数据库、特定的模式以及单个表的数据。 一、导出数据 1. 使用 pg_dump 导出整个数据库…...
把dll模块注入到游戏进程的方法_挂起进程注入
一. 概述 挂起进程注入是指在创建进程的时候把运行状态设置为挂起,然后创建一个远程线程,来注入。挂起进程注入作为远线程注入的一个补充,可以在进程创建的时候就注入,从而注入时间较早,不宜被拦截。易知挂起进程注入的局限性也就是如果进程已经启动,那么这种注入方式就…...
TypeScript 开发实战:如何安全替换字符串中的关键字
在 TypeScript 开发中,我们经常需要处理字符串替换的场景。最近我在开发一个表达式解析功能时,遇到了一个有趣的挑战:如何将用户输入的简化数学表达式(如"sin")替换为标准形式(如"Math.sin&…...
ES6 模块化 与 CommonJS 的核心概念解析
以下是关于 ES6 模块化 与 CommonJS 的核心概念解析、知识点总结及使用场景说明: 1. ES6 模块化与 CommonJS 是什么? ES6 模块化(ECMAScript Modules, ESM) 定义:ES6 标准引入的模块系统,使用 import 和 …...
【踩坑记录】stm32 jlink程序烧录不进去
最近通过Jlink给STM32烧写程序时一直报错,但是换一个其他工程就可以烧录,对比了一下jink配置,发现是速率选太高了“SW Device”,将烧录速率调整到10MHz以下就可以了...
CS144 Lab 6 实战记录:构建 IP 路由器
1 实验背景与目标 在 CS144 的 Lab 6 中,我们需要在之前实现的 NetworkInterface(Lab 5)基础上构建一个完整的 IP 路由器。路由器的主要任务是根据路由表将接收到的 IP 数据报转发到正确的网络接口,并发送给正确的下一跳…...
AI与智能能源管理:如何通过AI优化能源分配和消耗?
引言:能源管理面临的新挑战 在“双碳”目标持续推进的背景下,能源管理已经不再是简单的节电节水问题,而是关乎可持续发展和企业长期竞争力的核心议题。无论是工业园区、写字楼,还是家庭用户,能源的使用正在变得越来越复…...
【蓝桥杯】产值调整
产值调整 题目描述 偏远的小镇上,三兄弟共同经营着一家小型矿业公司“兄弟矿业”。公司旗下有三座矿山:金矿、银矿和铜矿,它们的初始产值分别用非负整数 A A A、 B B B 和 C C C 表示。这些矿山的产出是小镇经济的核心,支撑着…...
使用Next.js构建单页面React应用
最近遇到一个问题 突然要一个单页面的项目 用惯了Next.js 而 create-react-app 又不推荐且不灵活 最终找发现Nextjs也支持单页面应用 以下是使用Next.js构建单页面React应用过程 1 正常创建项目 (我选择的是Pages Router 而非 AppRoute) 2 修改配置文件 next.config.ts impor…...
Python字符串三剑客:len()、split()、join()深度解析
目录 一、len():字符串的"测谎仪" 二、split():字符串的"解剖刀" 参数解析: 实战场景: 三、join():字符串的"缝合怪" 性能优势: 实战案例: 高级技巧&…...
大模型是如何生成内容的?
大模型(如 GPT、Claude、LLaMA 等)生成内容的过程,其实就是一个 逐词预测上下文推理 的过程。我们可以把它想象成一个“超级自完成引擎”:每一步都在问自己—— “在目前上下文下,最合理的下一个词是什么?”…...
Python元组全面解析:从基础到高级应用指南
一、元组基础概念与核心特性 1.1 元组的本质定义 元组(Tuple)是Python中重要的不可变序列类型,由多个元素组成的有序集合。其核心特性表现在: 元素按插入顺序存储,支持索引访问所有元素存储在连续内存空间ÿ…...
Docker部署DeepSeek常见问题及解决方案
在使用Docker部署DeepSeek的过程中,许多开发者可能会遇到一些常见问题。本文整理了几个高频问题及其解决方案,帮助大家更顺利地完成部署。 镜像拉取失败 问题现象 执行 docker pull 命令时,提示超时或镜像不存在。 可能原因 1. 网络环境不稳定,导致连接Docker Hub失败…...
身份证实名认证接口数字时代的信任基石-node.js实名认证集成
在互联网深度渗透生活的当下,从线上购物、社交娱乐到金融理财、政务办理,每一次指尖的触碰都在虚拟世界中留下痕迹。身份证实名认证作为连接现实身份与网络身份的桥梁,正以其不可替代的作用,重塑着数字时代的信任体系。它不仅是保…...
多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究)
多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究) 目录 多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究)效果一览基本介绍程序设计参考资料 效果一览…...