TCP协议
报文格式
- 源/目的端口号:数据从哪个进程来,到哪个进程去
- 32位序号:TCP传输过程中,在发送端出的字节流中,传输报文中的数据部分的每一个字节都有它的编号
- 32位确认号:标识了报文接收端期望接收的字节序列
- 4位首部长度:表示TCP头部有多少个32位bit(4个字节),所以TCP头部最大长度是 15 * 4 = 60 个字节
- 6位标志位:
- URG:紧急指针是否有效
- ACK:确认号是否有效
- PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
- RST:对方要求重新建立连接,我们把携带RST表示的称为复位报文段
- SYN:请求建立连接,我们把携带SYN表示的称为同步报文段
- FIN:通知对方本端要关闭,我们把鞋带FIN表示的称为结束报文段
- 16位窗口大小:用来进行流量控制
- 16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。校验内容包括TCP首部和TCP数据部分
- 16位紧急指针:表示哪部分数据是紧急数据
- 40字节头部选项:不是必须的,长度必须是32位bit(四个字节)的整数倍
TCP原理
连接管理机制(安全机制)
正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接
为什么 TIME_WAIT 的时间是 2MSL?
MSL是TCP报文的最大生存时间,因此 TIME_WAIT 持续等待存在 2MSL的话就能保证在两个传输方向上的尚未被接受或迟到的报文都已经消失(否则服务器立刻重启,可能会收到来自上一个进程的迟到数据,但是这种数据很可能是错误的),同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失,那么服务器会重发一个FIN。这是虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发 LAST_ACK)。
服务器上出现大量的 CLOSE_WAIT 状态的原因
一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态,原因是服务器没有正确的关闭 socket,导致四次挥手没有正确完成。这是一个bug,只需要加上对应的 close 即可解决问题。
确认应答机制(安全机制)
TCP为每个字节的数据都进行了编号,即序列号。每个ACK都带有对应的确认序列号,通知发送端已经接收到的数据,以及下一个希望接收到的数据。
超时重传机制(安全机制)
发送端在向接收端传输数据的过程中,可能因为网络等原因,数据无法到达接收端,或者确认应答无法到达发送端,如果发送端在一个特定的时间间隔内没有收到接收端发来的确认应答,就会触发超时重传机制,重新发送这部分数据。
如果是因为确认应答丢失导致发送端未接收到发送端发来的确认应答,那么发送端仍然会超时重传。因此接收端会收到很多重复的数据,那么TCP协议就需要利用序列号来达到去重的效果。
超时的时间如何确定?
理想状态下,找到一个能保证确认应答一定能返回的最小时间作为超时时间,但是这个时间的长短受网络环境的影响是会发生变化的。如果超时时间设的太长,会影响整体的重传效率;反之,又有可能会频繁发送重复的包。
为了保证无论在任何的环境下都能比较高性能的通信,因此会动态计算这个时间。在Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是它的整数倍。如果重发一次之后,仍得不到应答,等待 2*500ms 后在进行重传。如果仍得不到应答,等待 4*500ms 进行重传,以此类推,以指数形式递增。累计到一定的重传次数,TCP会认为网络或者对端主机出现异常,强制关闭连接。
滑动窗口(效率机制)
在刚才的确认应答机制中,对于每个要发送的数据段,都要先收到上一个发送的数据段对应的ACK确认应答,这样做有一个很明显的缺点,就是性能较差,尤其是数据往返的时间较长的时候。既然这样,那么我们一次发送多条数据,就可以大大提高性能(将多个数据段的等待时间叠加在了一起)。
窗口大小指的是无需等待确认应答而可以继续发送数据的最大值,上图的窗口大小就是4000个字节(四个数据段)。发送前四个段的时候无需等待任何ACK,收到第一个ACK后,滑动窗口向后移动,继续发送第五个数据段,以此类推。操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有确认应答过的数据才能从缓冲区删除。
那么如果出现了丢包,如何进行重传?这里分两种情况讨论。
情况一:数据包已经抵达,ACK丢了。
部分ACK丢了并不要紧,因为可以通过后续的ACK进行确认;如果全部的ACK都丢失了,发送方会重新发送那些未被确认的数据段,接收方会继续确认已经接收到的数据,整个过程依赖超时重传和快速重传机制来确保数据的可靠传输。
情况二:数据包丢了。
“快速重传机制”(又叫“高速重发控制”)
当某一段报文段丢失以后,发送端会一直收到 1001 这样的ACK,如果发送端连续收到了三次同样一个 "1001" 这样的应答,就会将对应的数据 1001-2000 重新发送,这时候接收端收到了 1001 之后,再次返回的ACK就是 7001 了(因为 2001-7000 之前就已经收到并存放在接收缓冲区中了)。
流量控制(安全机制)
接收端处理数据的速度是有限的,如果发送端发的太快,会导致接收端的缓冲区被打满,这个时候如果发送端继续发送数据,就会造成丢包,进而引起丢包重传等一系列连锁反应。因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制(Flow Control)。
流量控制
接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK通知发送端。窗口大小字段越大,说明网络的吞吐量越高,接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知发送端,发送端接收到这个窗口后,就会减慢自己的发送速度。如果接收端缓冲区满了,就会将窗口置为0,这是发送方不再发送数据,但是需要定期发送一个窗口探测数据段,是接收端把窗口大小告诉发送端。
16位的窗口字段最大表示为 65535,那么TCP窗口最大就是 65535 字节吗?
答:TCP首部40字节选项中包含了一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位。
拥塞控制(安全机制)
虽然TCP有了滑动窗口,能够高效可靠的发送大量的数据,但是如果再刚开始阶段就发送大量数据,仍然可能引发问题。因此TCP引入了慢启动机制,先发送少量的数据,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据。
拥塞窗口
发送开始时,定义拥塞窗口大小为1,每次收到一个ACK,拥塞窗口*2。每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小作比较,取较小值作为实际发送的窗口。为了防止拥塞窗口一直以指数级别的速度增长,我们又引入了一个叫做慢启动的阈值 ssthresh。当拥塞窗口超过这个阈值时,不再按照指数方式增长,而是按照线性方式增长。
当TCP开始启动时,慢启动阈值等于窗口最大值。每次超时重发时,慢启动阈值会变成当前拥塞窗口的一半,同时拥塞窗口置回1。当TCP开始后,网络吞吐量会逐渐上升;随着网络发生拥堵(大量丢包),吞吐量就会立即下降。
拥塞控制归根结底是TCP协议想尽可能快的把数据传输给对方,但又要避免给网络造成太大的压力的这种方案。
延迟应答(效率机制)
假设接收端缓冲区为1M。一次收到了500K的数据,如果立刻应答,返回的窗口就是500K。但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了。在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来。如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M。如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。
延迟应答的条件
- 数量限制:每隔N个包就应答一次
- 时间限制:超过最大延迟时间就应答一次
- 具体时间数量因操作系统的不同也有差异。一般N取2,超时时间取200ms
捎带应答(效率机制)
虽然有了延迟应答,但是客户端和服务器在应用层还是”一发一收”,捎带应答就是接收端在给发送端发送数据的时候,捎带着向发送端发去确认应答,应答的内容是接收端已经收到发送端发送的数据,这样就提高了数据的传输效率。
其他特性:面向字节流、缓冲区、大小限制
创建一个TCP的socket,同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区:
调用write时,数据会先写入发送缓冲区中。如果发送的字节数太长,会被拆分成多个TCP的数据包发出;如果发送的字节数太短,就会先在缓冲区里等待,等到缓冲区长度差不多了,或者其他合适的时机发送出去。接收数据的时候,数据也是从网卡驱动程序到达内核的接收缓冲区,然后应用程序可以调用read从接收缓冲区拿数据。另一方面,TCP的一个连接,既有发送缓冲区,也有接收缓冲区,那么对于这一个连接,既可以读数据,也可以写数据。这个概念叫做 全双工。
由于缓冲区的存在,TCP程序的读和写不需要匹配,例如:
写100个字节数据时,可以调用一次write写100个字节,也可以调用100次write,每次写一个字节;读100个字节数据时,也完全不需要考虑写的时候是怎么写的,既可以一次read 100个字节,也可以一次read一个字节,重复100次。
粘包问题
首先要明确,粘包问题中的 "包" ,是指的应用层的数据包。在TCP的协议头中,没有如同UDP一样的 "报文长度" 这样的字段,但是有一个序号这样的字段。站在传输层的角度,TCP是一个一个报文过来的。按照序号排好序放在缓冲区中。站在应用层的角度,看到的只是一串连续的字节数据。那么应用程序看到了这么一连串的字节数据,就不知道从哪个部分开始到哪个部分,是一个完整的应用层数据包。
如何避免“粘包问题”?
- 对于定长的包,保证每次都按固定大小读取即可;例如上面的Request结构,是固定大小的,那么就从缓冲区从头开始按sizeof(Request)依次读取即可;
- 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置;
- 对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议,是程序猿自己来定的,只要保证分隔符不和正文冲突即可);
总结:明确两个包之间的边界。
对于UDP协议,是否也存在“粘包问题”?
对于UDP,如果还没有上层交付数据,UDP的报文长度仍然在。同时,UDP是一个一个把数据交付给应用层,就有很明确的数据边界。站在应用层的站在应用层的角度,使用UDP的时候,要么收到完整的UDP报文,要么不收,不会出现"半个"的情况。
TCP异常情况
进程终止:进程终止会释放文件描述符,仍然可以发送FIN。和正常关闭没有什么区别。
机器重启:和进程终止的情况相同。
机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset。即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在。如果对方不在,也会把连接释放。
相关文章:
TCP协议
报文格式 源/目的端口号:数据从哪个进程来,到哪个进程去32位序号:TCP传输过程中,在发送端出的字节流中,传输报文中的数据部分的每一个字节都有它的编号32位确认号:标识了报文接收端期望接收的字节序列4位首…...
Vue3 源码解析(十):watch 的实现原理
本篇文章笔者会讲解 Vue3 中侦听器相关的 api:watchEffect 和 watch 。在 Vue3 之前 watch 是 option 写法中一个很常用的选项,使用它可以非常方便的监听一个数据源的变化,而在 Vue3 中随着 Composition API 的写法推行也将 watch 独立成了一…...
2023年9月GESPC++一级真题解析
一、单选题(每题2分,共30分) 题号 123456789101112131415 答案 CDBCDBACACBBDDA 1. 我们通常说的 “ 内存 ” 属于计算机中的()。 A. 输出设备 B. 输 ⼊ 设备 C. 存储设备 D. 打印设备 【答案】 C 【考纲知识点】…...
vscode 远程连接ssh 密钥方式
目录 1. powershell 生成key: 2. 在服务器上安装公钥 linux测试成功: 3).为了确保连接成功,输入如下指令以保证以下文件权限正确: 3 开启 ssh 密钥登录 vscode 远程连接配置 python连接测试ok 查看日志: 1. po…...
字符函数和字符串函数
字符分类函数 C语言中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件:ctype.h 这些函数的用法非常类似。 int islower ( int c )islower是能够判断参数部分是否是小写字母的。 通过返…...
如何利用ChatGPT加速开发与学习:以BPMN编辑器为例
在现代开发中,开发者经常会遇到各种需要编写和学习新技术的任务。ChatGPT作为一种强大的自然语言处理工具,不仅可以辅助编写代码,还可以帮助学习新的编程概念和解决开发中的难题。本文将以开发一个BPMN(业务流程建模与标注&#x…...
深度学习2
四、tensor常见操作 1、元素值 1.1、获取元素值 tensor.item() 返回tensor的元素;只能在一个元素值使用,多个报错,当存在多个元素值时需要使用索引进行获取到一个元素值时在使用 item。 1.2、元素值运算 tensor对元素值的运算:…...
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
一.背景 公司是非煤采矿业,核心业务是采选,大型设备多,安全风险因素多。当下政府重视安全,头部技术企业的安全解决方案先进但价格不低,作为民营企业对安全投入的成本很敏感。利用我本身所学,准备搭建公司的…...
单片机学习笔记 9. 8×8LED点阵屏
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...
c++ 力扣题(1)JZ64
JZ64求123...n_牛客题霸_牛客网 因此不能使用等差求和(禁掉位运算为了禁掉等差求和,右移一位就是等差除二)、循环、递归来解决 我们运用到在 统计构造次数所学到的内容: 1.可以利用静态全局变量的思想来做 2.构造n次对象&…...
logback动态获取nacos配置
文章目录 前言一、整体思路二、使用bootstrap.yml三、增加环境变量四、pom文件五、logback-spring.xml更改总结 前言 主要是logback动态获取nacos的配置信息,结尾完整代码 项目springcloudnacosplumelog,使用的时候、特别是部署的时候,需要改环境&#…...
基于零相差前馈补偿的 PID 控制
零相差前馈补偿是一种结合前馈补偿与反馈控制的策略,旨在提高控制系统对参考信号的跟踪精度。通过设计合理的前馈补偿器,使得系统对参考输入实现零相位差的跟踪,同时利用 PID 控制器保证系统的稳定性和动态性能。 1. 原理概述 目标ÿ…...
任务通知的本质(任务通知车辆运行) 软件定时器的本质(增加游戏音效)
任务通知的本质 没有任务通知 所谓"任务通知",你可以反过来读"通知任务"。 我们使用队列、信号量、事件组等等方法时,并不知道对方是谁。使用任务通知时,可 以明确指定:通知哪个任务。 使用队列、信号量、…...
如何在 MySQL 中进行数据导入和导出?
在 MySQL 中进行数据的导入和导出是一项常见的任务,用于数据备份、恢复、迁移以及数据分析等多种用途。MySQL 提供了多种方法来进行数据的导入和导出,每种方法都有其适用的场景和特点。以下是几种常用的 MySQL 数据导入和导出方法,包括命令行…...
python语言基础-5 进阶语法-5.3 流式编程
声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。 5.3 流式编程(参考链接:https://www.zhihu.com/question/59062…...
centos 服务器 docker 使用代理
宿主机使用代理 在宿主机的全局配置文件中添加代理信息 vim /etc/profile export http_proxyhttp://127.0.0.1:7897 export https_proxyhttp://127.0.0.1:7897 export no_proxy"localhost,127.0.0.1,::1,172.171.0.0" docker 命令使用代理 例如我想在使用使用 do…...
[个人专属博客] - docker安装
🎉🎉🎉🎉🎉🎉 欢迎访问的个人博客:http://swzbk.site/,加好友,一起赚🧧🧧🧧 🎉🎉🎉🎉&…...
推荐一个QDirStat基于 Qt 的目录统计工具
QDirStat 是一款基于 Qt 的目录统计工具,旨在帮助用户分析磁盘空间使用情况并进行清理。QDirStat的一些主要特点和功能: 跨平台兼容性:QDirStat 支持 Linux、BSD、Unix-like 系统以及 macOS,确保了广泛的用户基础。 直观的数据展…...
yolo自动化项目实例解析(九) 导航
比如我们经常使用的导航,说白了就是寻找两点之间最近的路径,也就是所谓的寻路,我们需要想办法让程序知道他要去哪里,路径包含(起点、轨迹、终点) 一、录制轨迹 从平面角度来看,我们可以把区域视…...
MySQL 报错:1137 - Can‘t reopen table
MySQL 报错:1137 - Can’t reopen table 1. 问题 对临时表查询: select a.ts_code,a.tsnum,b.tsnum from (select t.ts_code ,count(*) tsnum from tmp_table t group by t.ts_code having count(*) > 20 and count(*)< 50 ) a ,(select t.ts_…...
Bokeh实现大规模数据可视化的最佳实践
目录 引言 一、Bokeh简介 二、安装Bokeh 三、数据准备 四、性能优化 五、创建图表 六、添加交互功能 七、应用案例 八、高级技巧 九、总结 引言 在数据科学领域,数据可视化是一个至关重要的环节。通过可视化,我们可以直观地理解数据的特征和趋势,为数据分析和决策…...
HTMLCSS:比赛记分卡
效果演示 这段 HTML 和 CSS 代码创建了一个卡片式的体育比赛信息展示组件,用于显示篮球比赛的两个队伍名称、比赛时间、比分以及一些装饰性的视觉元素。 HTML <div class"card"><div data-status"inprogress" class"teams"…...
什么是 Faiss?
好的,我来详细解释 Faiss,它的用途、使用场景,以及如何安装和使用。 什么是 Faiss? Faiss 是由 Facebook AI Research 开发的一个开源库,专门用于高效的相似性搜索和聚类。它非常擅长在高维向量空间中进行快速搜索&a…...
【prism】遇到一个坑,分享!
背景 我通用prism的方式写了一个弹窗,弹窗绑定一个 Loaded 事件,但是Loaded事件一直不触发!!! 具体过程 我的loaded事件也是通过命令的方式绑定的: <i:Interaction.Triggers><i:EventTrigger EventName="Loaded...
vue制作代码比较工具
前两天朋友问我 有没有vue可以做一个json代码在线比较工具 我也是在网上搜了一下找到的 废话不说 直接上代码 采用 v3 pnpm i v-code-diff <div><CodeDiff:old-string"oldStr":new-string"newStr"output-format"side-by-side"/>…...
GPT系列文章
GPT系列文章 GPT1 GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结:GPT 是一种半监督学习,采用两阶段任务模型,通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-t…...
Qt实现可拖拽的矩形
之前项目上需要用Qt来绘制可拖拽改变形状的矩形。看了Qt Graphics相关的内容,虽然对Qt怎么添加图元的有了些了解,但是具体如何实现拖拽效果,一时也没有什么好的想法。还好网上有人分享的例子,很受启发。后来又回顾了一下这部分的代…...
python爬虫初体验(五)—— 边学边玩小游戏
1. 打开浏览器 利用webbrowser 模块的 open()函数可以启动一个新浏览器,打开指定的 URL。 import webbrowser webbrowser.open(http://inventwithpython.com/) 2. 猜数字游戏 # -*- coding: utf-8 -*- # This is a guess the number game. import randomsecretN…...
学习日志015--python单链表
创建 class Node:def __init__(self,data):# 数据域self.data data# 链接域self.next Noneclass LinkList:def __init__(self,):# 初始化头节点self.head None# 记录链表的长度self.size 0 增加 #头插def insert_head(self,value):# 创建新节点node Node(value)q self…...
51WORLD与南京水利研究院联合研发,国产数字孪生超融合一体机
近日,太湖流域水治理国际会议在江苏省无锡市举行。大会由水利部国际合作与科技司、河湖管理司、中国水利学会、水利部太湖流域管理局、无锡市人民政府、中国交通建设集团有限公司指导,南京水利科学研究院主办,以“践行新发展理念、推进流域水…...
自动泊车变自动撞车?小米SU7遭遇批量事故
科技新知 原创作者丨依蔓 编辑丨蕨影 小米系统bug,70多辆小米SU7同一天自动泊车撞墙、撞柱! 近日,多名车主反映小米汽车SU7标准版“自动泊车”功能出现故障,造成不同程度的撞击、剐蹭损伤。 小米客服此前回应涉事车主࿰…...
异常和中断
在计算机系统中,异常和中断是两种常见的用于处理异步事件的机制。以下是常见的异常和中断及其特点的详细解释: 异常(内中断) 异常,也称为内中断,是由CPU内部事件引起的中断。异常通常与程序执行的当前指令…...
代理IP在后端开发中的应用与后端工程师的角色
目录 引言 代理IP的基本概念和工作原理 代理IP在后端开发中的应用 网络爬虫与数据采集 负载均衡与性能优化 安全防护与隐私保护 后端工程师在使用代理IP时面临的挑战 结论 引言 在数字化时代,网络技术的飞速发展极大地推动了各行各业的发展。其中ÿ…...
设计模式之 观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象(Subject)。当主题对象的状态发生变化时,所有依赖于它的观察者都会得到…...
SQLSever显示物理和逻辑 IO活动量的相关信息及显示分析、编译和执行各语句所需的毫秒数。
SQLSever SET STATISTICS IO显示物理和逻辑 IO活动量的相关信息及SET STATISTICS TIME显示分析、编译和执行各语句所需的毫秒数。 1、 SET STATISTICS IO (Transact-SQL) 物理 IO 与访问磁盘上的数据页相关,逻辑 IO 与访问内存中的数据页(数据缓存&…...
CSS3 动画:前端开发的动态美
CSS3 动画:前端开发的动态美 CSS3 动画是现代网页设计中不可或缺的一部分,它为静态的网页元素添加了动态效果,提升了用户体验。本文将深入探讨CSS3动画的基础知识、高级技巧,并展示如何在实际项目中应用这些动画。 CSS3 动画基础 CSS3动画主要通过@keyframes和动画属性(…...
JavaWeb之综合案例
前言 这一节讲一个案例 1. 环境搭建 然后就是把这些数据全部用到sql语句中执行 2.查询所有-后台&前台 我们先写后台代码 2.1 后台 2.2 Dao BrandMapper: 注意因为数据库里面的名称是下划线分割的,我们类里面是驼峰的,所以要映射 …...
基于Spring Boot+Unipp的博物馆预约小程序(协同过滤算法、二维码识别)【原创】
🎈系统亮点:协同过滤算法、二维码识别; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17 前端: 技术:框…...
使用 Maven 构建一个简单的 Java 项目
Apache Maven 是一个强大的构建自动化工具,主要用于 Java 项目。它简化了构建和管理任何基于 Java 的项目的流程。 本指南将涵盖 Maven 的安装、设置一个简单的 Java 项目以及使用 Maven 运行该项目。 1. 安装 安装 Java 在安装 Maven 之前,需要确保…...
【51单片机】LCD1602液晶显示屏
学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 LCD1602存储结构时序结构 编码 —— 显示字符、数字 LCD1602 LCD1602(Liquid Crystal Display)液晶显示屏是…...
UDP协议
UDP(UserDatagramProtocol)是一个简单的传输层协议,特点:无连接、不可靠、面向数据包、全双工。 报文结构 1.源端口: 源端口号,需要对方回信时选用,不需要时全部置0. 2.目的端口:目…...
阅读 ADiffusion-Based Framework for Multi-Class Anomaly Detection
A Diffusion-Based Framework for Multi-Class Anomaly Detection 我觉得引言部分写的不错,将问题清楚的讲出来了,值得借鉴!! 摘要 基于重建的方法在异常检测方面取得了显著成果。最近流行的扩散模型的卓越图像重建能力引发了研…...
网络云计算】2024第47周-每日【2024/11/21】周考-实操题-RAID6实操解析1
文章目录 1、RAID6配置指南(大致步骤)2、注意事项3、截图和视频 网络云计算】2024第47周-每日【2024/11/21】周考-实操题-RAID6实操 RAID6是一种在存储系统中实现数据冗余和容错的技术,其最多可以容忍两块磁盘同时损坏而不造成数据丢失。RAID…...
ts- declare关键词及vue3报错“Window typeof globalThis”上不存在属性“nextLoading”、`
报错“Window & typeof globalThis”上不存在属性“nextLoading”、 代码环境:vue3、ts 阮一峰讲解 declarets 用法告诉编译器某个类型是存在的 下面的例子是脚本使用浏览器全局对象document。 declare var document; document.title "Hello";上面…...
【STM32】在 STM32 USB 设备库添加新的设备类
说实话,我非常想吐槽 STM32 的 USB device library,总感觉很混乱。 USB Device library architecture 根据架构图: Adding a custom class 如果你想添加新的设备类,必须修改的文件有 usbd_desc.cusbd_conf.cusb_device.c 需要…...
【单点知识】基于PyTorch讲解自动编码器(Autoencoder)
文章目录 0. 前言1. 自动编码器的基本概念1.1 定义1.2 目标1.3 结构 2. PyTorch实现自动编码器2.1 导入必要的库2.2 定义自动编码器模型2.3 加载数据2.4 训练自动编码器 3. 自动编码器的意义4. 自动编码器的应用4.1 图像处理4.2自然语言处理:4.3推荐系统:…...
html+js实现图片的放大缩小等比缩放翻转,自动播放切换,顺逆时针旋转
效果图: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片预览</title><sty…...
【蓝桥杯C/C++】翻转游戏:多种实现与解法解析
博客主页: [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 💯题目💯问题分析解法一:减法法解法二:位运算解法解法三:逻辑非解法解法四:条件运算符解法解法五:数组映射法不同解法的比较…...
介绍一下toupper(ch);函数(c基础)
hi , I am 36 适合对象c语言初学者 toupper(ch1); tolower(ch2); 是返回ch的大写或小写的字符但并不改变ch 若传递数字仍返回该数字 格式 #include<ctype.h> char res toupper(ch); 链接扫雷游戏代码分享(c基础)-CSDN博客 hi , I am 36. thanks for your look…...
如何使用Python代码实现给GPU预加热
如何使用Python代码实现给GPU预加热 一、引言二、使用深度学习框架进行预加热2.1 TensorFlow预加热2.2 PyTorch预加热三、使用CUDA进行预加热四、预加热的效果评估与优化五、结论与展望在高性能计算和深度学习领域,GPU(图形处理器)已经成为不可或缺的加速工具。然而,在实际…...