Linux:深入理解数据链路层
实际上一台主机中,报文并没有通过网络层直接发送出去,而是交给了自己的下一层协议——数据链路层!!
一、理解数据链路层
网络层交付给链路层之前,会先做决策再行动(会先查一下路由表,看看目标网络是不是在当前子网中,如果不在就发送给下一跳的路由器,封装路由器的mac帧报头 在的话就发给自己子网内的机器 封装该机器的mac帧报头)
所以IP层解决的是跨网络问题,但是数据链路层解决的是同一个子网内跨主机的问题!!!
二、以太网
2.1 认识以太网
"以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
数据链路层解决的是直接相连的主机(包括电脑、路由器、手机等)之间进行数据交付的问题!!!
例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
2.2 以太网帧格式
类型是0800,就是正常ip报文,类型是0806则是ARP请求(用IP去广播询问mac地址),类型是0835则是RARP请求(就是用mac地址去问ip地址)
问题1:mac帧是如何解包和封装的??
——>通过定长报文(长度由MTU决定)
问题2:如何做到分用?
——>局域网通信过程中,其实所有的主机都能收到报文(吃瓜群众很多,意思就是大家都能收到只不过和自己对比之后发现不是自己的就会丢弃),但是当他解开mac帧报头后发现目的mac帧地址是自己的地址,才会把报文向上交付,否则就丢弃
2.3 局域网通信原理
当我信息从上层交付到网络层的时候,此时我会在网络层查一下当前的路由表(决策),看看目标网络是否在当前的子网里,如果在的话就直接封装到该主机的mac帧地址报头发到自己的局域网中,如果不在的话,就会找到默认下一跳的路由器然后封装到该路由的的mac帧地址报头,前往下一个网络寻找。
每当到达一个子网的入口路由器时,都会先解开mac报头向上交付给网络层,然后再搜索网络层的路由表判断当前报文是否在该网络,然后根据决策继续封装新的mac报头。
然后当到达某个网络的入口路由器确认该报文要发给该网络的主机的时候,就会封装目标主机的mac帧然后直接发到局域网中,只有目标主机可以收到报文,其他主机收到报文后会丢弃。
2.4 理解mac地址和ip地址
mac地址:
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
我们会发现在局域网通信的这个过程中,源IP和目标IP一致不变,但是源mac地址和目的mac地址一直在变!
源IP和目的IP相当于是 :你从哪里来,要到哪里去?——>东土大唐-西天
源mac地址和目的mac地址相当于是:你上一站从哪来,下一站要到哪去?——>车迟国-火焰山
IP地址描述的是路途总体的起点和终点; MAC地址描述的是路途上的每一个区间的起点和终点;
2.5 认识MTU和MSS
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
2.5.1 MTU对IP协议的影响(分片)
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.
将较大的IP包分成多个小包, 并给每个小包打上标签;
每个小包IP协议头的 16位标识(id) 都是相同的;
每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最 后一个小包, 是的话置为1, 否则置为0);
到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;(而是由TCP负责)
问题1:为什么切片不在数据链路层、不在TCP层做,而是在IP层做??
——>因为如果是在最底层的数据链路层做分片,我们还需要去面对不同的物理网络的驱动程序做更改(不属于OS的范畴了,而是硬件厂商的范畴)
而如果是在上层的传输层或者应用层做分片,我们还要具体关心是哪种协议,每种协议还得自己实现关于切片的模块,一方面增加了路由器的复杂度,另一方面处理效率也低,路由器在处理IP层以上的高层协议一般采用纯粹的软件来完成,那样效率会更低。
而IP层是软件设计里常用的适配层,我们只需要读取IP头信息,至于里面传输的是TCP/UDP/ICMP/OSPF/GRE/ESP协议我们并不关心,也不需要关心!!所以由IP层做分片是成本最低的选择!!当然最后组装也要有由IP层来组装
问题2:IP层是如何组装的呢???
前置问题a:你怎么知道这个IP被分片了呢??
——>片偏移!=0 || 更多分片==1 (反之没有分片就是片偏移==0 &&更多分片==0)
前置问题b:你怎么确保所有的片都聚到一起了那??
——>
丢了第一个的情况:只需查看这些分片中是否有13位片偏移为0的分片,如果存在,则第一片分片没有丢失;如果不存在,则第一片分片丢失
丢中间的情况:只需对这些分片按片偏移量进行排序,在遍历这些分片时,检查 该分片的片偏移量 * 8 + 该分片的有效载荷大小 == 下一片的片偏移量 * 8,如果等于,表示中间没有分片丢失;如果不等于,表示中间有分片丢失。
丢最后一个的情况:只需查看这些分片中是否存在MF 为 0的分片即可,如果存在,则最后一片分片没有丢失;如果不存在,则最后一片分片丢失。
——> 所以16位标识+更多分片+片偏移 可以确保我们的报文安稳收到!!
问题3:建不建议分片呢??
——> ip中其中一个分片丢失了,那么整个报文都会被丢弃重发!!分片会增加丢包的概率
数据测试:假设有3000字节,每一个分片都要20报头,但是一个分片长度最多1500
2.5.2 MTU对UDP协议的影响
一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在 网络层被分片, 整个数据被丢失的概率就大大增加了.
2.5.3 MTU对于TCP协议的影响
TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size); TCP在建立连接的过程中, 通信双方会进行MSS协商.
最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.(三次握手时协商,因为一旦分片,那么双方由于硬件差异MTU可能会不一样,所以需要统一一下MSS由TCP来控制)
然后双方得知对方的MSS值之后, 选择较小的作为最终MSS. MSS的值就是在TCP首部的40字节变长选项中(kind=2);
2.5.4 MSS和MTU的关系
查看硬件地址和MTU
使用ifconfig命令, 即可查看ip地址, mac地址, 和MTU;
2.6 数据碰撞
因为局域网中一台主机往局域网中发消息的时候,所有主机都会收到,如果此时有多台主机都在发消息,那么就会出现数据碰撞的问题!!
所以为了避免数据蹦装,我们就得想办法保证任何一个时刻只有一个主机在发送消息,所以我们需要有碰撞避免算法,来将所有主机发送消息的时间给错开(有些主机需要等一等)
可是如果一个局域网主机太多了,那么碰撞的可能性还是会很大,因此如果一些不法分子通过其中一台主机疯狂局域网塞垃圾数据,那么也很容易造成局域网瘫痪!!
除了碰撞避免算法,其实在还有交换机(划分碰撞域)的存在。
其实我们的硬件有MTU的限制而产生分片,除了本身硬件的原因,还有一个原因就是避免数据帧一次发送过大,才能让报文更方便进入局域网中,在时间维度上让报文尽可能岔开发送(所以一般是46-1500)
可是链路层对ip层说:哥们,你一次数据别发太大,我扛不住
ip说:这不关我的事,我就是个跑腿的,发多少又不是我说了算的,可靠性是tcp保证的!
链路层:我不管,反正我最大就1500, 你去跟tcp商量一下,想想办法
ip对tcp说:因为我还有自己的报头,所以你最大就给我1480吧,别超过了
tcp说:好吧,可是我自己也有报头,那我除了20个报头,我剩下最多可以有1460的有效载荷,而这个有效载荷就是MMS!!
这就是为什么滑动窗口要一块块发送而不是整体发送,这是因为有MSS在约束他!!但是因为不同主机硬件有差异,MTU有差异,所以我们的TCP在三次握手的时候必须通过选型和对方协商一下,以最小的为准,这样避免在通信的时候不会出现太多的分片和组装,也避免了对方因数据包太大而无法接收的情况!!
三、ARP协议
虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;
3.1 为什么要有ARP协议
所谓的数据,要发送到目标网络,本质上是通过无数个连续的子网实现的!!
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃(需要重新封装mac帧),因此在通讯钱必须获取目的主机的mac地址
因此ARP协议就是用来建立主机IP地址和MAC地址的映射关系的!!
3.2 APR的报头
ARP协议是属于mac帧的上层协议,但是归属到数据链路层!
ARP报头:
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
硬件类型指链路层网络类型,1为以太网;(一般固定)
协议类型指要转换的地址类型,0x0800为IP地址;(一般固定)
硬件地址长度对于以太网地址为6字节;(一般固定)
协议地址长度对于和IP地址为4字节;(一般固定)
op字段为1表示ARP请求,op字段为2表示ARP应答。(重要,决定这个报文是请求还是应答)
3.3 模拟一次ARP过程
1、填写ARP请求
前4个基本固定,而请求的op为1,后面四个地址我们唯独不知道目的mac地址,我们填FF:FF:FF:FF:FF:FF
2、给ARP请求封装mac帧报头
请求的mac帧类型是0806 而我们不知道以太网的目标地址,可以填FF:FF:FF:FF:FF:FF表示广播给该子网内的全部主机
3、该ARP请求被丢到了网络中,然后各个主机收到后先开始解析mac报头
4、假设我们的非目标主机解开mac报头后发现该报头的目标mac地址是 FF:FF:FF:FF:FF:FF,说明这个是广播报文所以必须受理。他会接着将该arp请求交给arp软件层
5、因为我们收到的arp报文可能是响应,也可能是请求,因此我们首先要先看op,看看是请求还是响应,然后我们发现是请求
6、于是我们确认是请求后,然后看一下目的IP是不是我自己,发现不是我自己,于是我就把报文丢弃!同理其他的非目标主机也会在此时丢弃该报文
注意:因为是广播 所有非目标主机都受理了,所以报文在ARP软件层被丢弃的!!
7、唯独目标主机在收到该请求后,重复上述步骤发现里面存的目标IP地址正好是自己的地址,于是他要给开始给对方回复ARP响应
8、此时我们通过之前的arp请求可以知道源主机的mac地址和ip地址,于是给对方定向发送了arp请求
9、因为此时是定向,不是广播,所以所有的非目标主机在收到之后直接在mac帧层丢弃了! 然后我们将选项该为2.意思是响应
10、当该子网的入口路由器收到该报文之后,交给了ARP软件层,通过op确认目标主机发来的响应之后, 然后会读取发送端的mac地址,确认这就是我们想要找的主机的mac地址,然后建立了在自己的arp表里面建立了映射
11、此时我们再将之前的报文向下交付给mac帧层的时候,就可以通过映射找到该目标ip的mac帧地址,重新给他封装mac帧表头,将报文发送给目标主机。
总结:
1、因为主机可能会收到arp的应答,也可会收到arp的请求,因此无论是收到任何的arp报文,都是先看OP,这决定是该报文是请求还是应答!!
2、如果是请求,意味着需要查看一下自己的目的以太网的ip看看是不是和自己的ip一样,确认之后再根据发送端的ip和mac地址发送响应回去。
3、如果是应答,意味着就可以建立该报文的发送端的ip和mac地址的映射关系,而之前发送过来的报文就可以在向下交付的时候通过查这个映射知道自己目标主机的mac地址从而封装mac帧报头
4、请求以广播形式所有主机都得受理,只不过非目标主机会在arp软件层丢弃,而响应是定向发送,所以非目标主机是在mac帧层被丢弃!
3.4 APR周边知识总结
1、主机的mac地址的ip地址会被主机缓存起来,临时缓存起来
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如 果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
问题1:为什么要有缓存表呢??
——>
(1) 减少网络通信量:
当主机需要发送数据到另一个IP地址时,它会首先检查ARP缓存表中是否已经存在该IP地址对应的MAC地址。如果存在,则直接使用该MAC地址发送数据,无需发送ARP请求进行广播查询,从而减少了网络通信量,提高了通信效率。
(2) 加快网络通信速度:
缓存表减少了查找MAC地址所需的时间,因为查询缓存通常比广播ARP请求并等待响应要快得多。这有助于加快数据包在网络中的传输速度。
问题2:为什么表项要有过期时间而不是一直有效呢??
——>
(1)确保数据的有效性:
网络设备的MAC地址可能会因为多种原因发生变化,如设备重启、故障恢复或更换网络接口卡等。如果ARP缓存表中的表项一直有效,那么即使MAC地址已经发生变化,发送方仍然可能使用旧的MAC地址发送数据,导致数据无法正确到达目的地。设置过期时间可以确保缓存中的MAC地址保持最新。
(2) 防止缓存污染和攻击
在某些情况下,恶意用户可能会尝试通过发送伪造的ARP响应来污染其他主机的ARP缓存表,从而导致数据包被发送到错误的目的地。设置过期时间可以限制这种攻击的影响范围,因为即使缓存被污染,表项也会在一段时间后失效。
(3)节省系统资源
随着时间的推移,ARP缓存表中可能会积累大量的表项。如果表项一直有效,那么这些表项将占用 大量的系统资源(如内存)。设置过期时间可以允许系统定期清理不再需要的表项,从而释放系统资源供其他应用使用。
2、 我们可以通过自己的IP和子网掩码,获取网络号,然后拼接IP地址,ping(一个网络工具,通过发送ICMP回声请求信息到目标主机并等待回应)所有的主机从而得到所有主机的IP和mac
3、如果我收到了多次同样的arp应答,我会以最新的为主
4、A主机到B主机,不仅仅是在目标网络,其实中间过程每经过一次路由器(下一跳),就是从该子网的入口路由器到出口路由器,在没有缓存的情况下一般都需要用arp去询问路由器的mac地址!
3.5 ARP欺骗
一开始,我们双方互相给对方发送过arp请求,所以双方都建立了对方主机的ip和mac映射
可
3.5.1 单向欺骗(有感觉,会被强制断网)
中间主机通过定向向源主机发送虚假的arp响应,然后修改了源主机的arp映射表,从而定向地让你的目标主机断网!!
3.5.2 双向欺骗(没有感觉,但数据会被窥探)
中间主机都给双方发送arp响应,这样双方再给对方发消息的时候都会推送给中间人,此时中间的信息会被窥探,但你并不能察觉!
文心一言搜索:arp的欺骗工具欺骗 可以跟室友商量,想办法让室友断网
相关文章:
Linux:深入理解数据链路层
实际上一台主机中,报文并没有通过网络层直接发送出去,而是交给了自己的下一层协议——数据链路层!! 一、理解数据链路层 网络层交付给链路层之前,会先做决策再行动(会先查一下路由表,看看目标网…...
健康养生:从生活点滴启航
养生并非遥不可及的高深学问,只需把握生活中的细微之处,就能为健康保驾护航。 清晨睁眼,先在床上做简单的搓脸动作,从下巴到额头轻柔按摩,促进面部血液循环,唤醒肌肤活力。随后空腹喝一杯温水,可…...
【向量数据库】用披萨点餐解释向量数据库:一个美味的技术类比
文章目录 前言场景设定:披萨特征向量化顾客到来:生成查询向量相似度计算实战1. 欧氏距离计算(值越小越相似)2. 余弦相似度计算(值越大越相似) 关键发现:度量选择影响结果现实启示结语 前言 想象…...
CloudCompare 中 ccDrawableObject
CloudCompare 中 ccDrawableObject 类的主要内容与使用 1. ccDrawableObject 概述 在 CloudCompare 中,ccDrawableObject 是一个基类,主要用于管理 3D 可绘制对象 的显示属性,如颜色、可见性、LOD(层次细节)、光照等…...
【Linux】进程控制
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是进程控制 二、进程创建 三、进程终止(进程退出) 退出码 main函数返回 _exit() exit() 测试 四、进…...
设计模式-基础概念学习总结(继承、多态、虚方法、方法重写)
概念使用例子的方式介绍(继承,多态,虚方法,方法重写),实现代码python 1. 继承(Inheritance) 概念:子类继承父类的属性和方法,可以直接复用父类的代码&#…...
分析rand()和srand()函数的功能
rand()和srand()函数原型: int rand(void) 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。 void srand(unsigned int seed)用来给rand() 设置随机数发生器,随机数发生器输出不同的数值,rand() 就会生成不同的随机数 1)、在“D:\Keil_v5\AR…...
架构师如何构建个人IP:职业规划与业务战略的双重提升
在数字化时代,软件架构师的角色已从单纯的技术专家转变为兼具技术领导力和业务影响力的复合型人才。如何构建个人IP,提升行业影响力,成为架构师职业发展的关键课题。本文从个人认知、业务战略、架构决策、产品思维四个维度,探讨架…...
CSS知识总结
一、CSS核心概念解析 1.1 选择器体系(重点) 基础选择器: /* ID选择器 */ #header { background: #333; }/* 类选择器 */ .btn-primary { color: white; }/* 属性选择器 */ input[type"text"] { border: 1px solid #ccc; } 组合…...
CRS 16 slot 设备硬件架构
目录 1. 核心组件 1.1 线路卡与物理接口模块 1.2 交换结构与容量 1.3 控制与管理 1.4 风扇与散热 1.5 电源与告警 2. 插槽编号与机箱布局 2.1 前侧(PLIM 面) 2.2 后侧(MSC 面) 2.3 插槽配对 1. 核心组件 1.1 线路卡与物…...
人工智能浪潮中Python的核心作用与重要地位
在人工智能(Artificial Intelligence,AI)蓬勃发展的时代,Python已然成为推动这一技术进步的关键编程语言。从复杂的机器学习算法实现,到前沿的深度学习模型构建,再到智能系统的部署,Python无处不…...
【了解】数字孪生网络(Digital Twin Network,DTN)
目录 一、为什么?二、是什么?三、什么架构?四、如何应用?参考 一、为什么? 一方面,网络负载不断增加,,网络规模持续扩大带来的网络复杂性,使得网络的运行和维护变得越来越复杂。另一…...
[C语言]第一章-初识
目录 一.引言 二.MinGW 下载与安装 1.什么是 MinGW 2.下载 MinGW 3.安装 MinGW 4.配置 MinGW 环境变量 三.VS Code 下载与安装 1.什么是 VS Code 2.下载 VS Code 3.安装 VS Code 4.汉化 5.安装扩展插件 C/C 截图 四.编写并运行 Hello World 程序 代码解释 运行…...
如何用git将项目上传到github
步骤 1.创建仓库 2.记下仓库的url 3.在本地初始化仓库 路径要在项目下 cd /path/to/your/vue-project git init 4.创建touch .gitignore文件 在项目根目录下创建 .gitignore 文件,用于指定 Git 忽略哪些文件或文件夹 5.添加和提交项目文件 将文件提交到版本控…...
C++入门(上)--《Hello C++ World!》(1)(C/C++)
文章目录 前言命名空间域命名空间的用法 C的输入和输出缺省参数函数重载auto关键字(C11)范围for 前言 C不是C# C兼容大部分C的东西,但不是完全(98%的样子,除非遇到了不兼容的,那就记一下,不然就认为自己在C里面写的那些可以写到C里…...
架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案
文章目录 引言一、升级读服务架构,为什么需要自动化测试?二、自动化回归测试系统:整体架构概览三、日志收集1. 拦截方式2. 存储与优化策略3. 架构进化 四、数据回放技术实现关键能力 五、差异对比对比方式灵活配置 六、三种回放模式详解1. 离…...
代码随想录第33天:动态规划6(完全背包基础)
一、完全平方数(Leetcode 279) 本题与“零钱兑换”基本一致。 1.确定dp数组以及下标的含义 dp[j]:和为j的完全平方数的最少数量为dp[j] 2.确定递推公式 dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] 1 便可以凑成dp[j]。 …...
Android控件View、ImageView、WebView用法
一 控件清单 View、ImageView、WebView 二 控件UI代码 <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app=&qu…...
关于浏览器页面自动化操作
Selenium 是一个用于自动化浏览器操作的强大框架,广泛应用于Web应用程序的测试自动化。它主要由以下几个核心组件组成: Selenium WebDriver: WebDriver 是 Selenium 的核心组件,它提供了一组API,允许开发者编写程序来…...
P5739 计算阶乘详解
此题目,对于会递归的很简单很简单,但作者是野人不会,只能是边刷边学,且题解比较有意思,所有我这次的重心不是题目,而是题解里面创作者展示的不一样的东西,先看题目 题目要求不用for循环…...
把Android设备变成“国标摄像头”:GB28181移动终端实战接入指南
把Android设备变成“国标摄像头”:GB28181移动终端实战接入指南 ——执法记录仪、巡检终端、布控球,如何通过大牛直播SDK直接挂到GB28181平台? 在过去,GB28181 通常用于固定摄像头、NVR等“设备端”。但在政务、安防、应急等行业…...
机器学习项目流程极简入门:从数据到部署的完整指南
前言 本文将通过一个简单案例(根据水果外观特征判断是否为橘子),逐步拆解机器学习项目的完整流程,帮助读者掌握从数据收集到模型部署的全流程方法论。 通常,一个完整的机器学习项目可以分为以下几个步骤: …...
PrivKV: Key-Value Data Collection with Local Differential Privacy论文阅读
文献阅读课需要制作ppt但是感觉选的这篇论文都是公式,决定做点动画直观展示一下。还没有完成会继续更新这个笔记 manim动画代码 需要下载ffmpeg下载latex https://docs.manim.org.cn/getting_started/installation.html ffmpeg下载教程 texlive官网 但是其实不需要…...
RViz(机器人可视化工具)的配置文件(moveitcpp)
1. Panels(面板设置) 面板是RViz界面中的各个功能区域,用于显示和操作不同的数据。 Displays(显示面板) Class: rviz_common/Displays 指定面板的类型,这里是显示面板。 Help Height: 78 帮助区域的高度…...
kotlin 01flow-StateFlow 完整教程
一 Android StateFlow 完整教程:从入门到实战 StateFlow 是 Kotlin 协程库中用于状态管理的响应式流,特别适合在 Android 应用开发中管理 UI 状态。本教程将带全面了解 StateFlow 的使用方法。 1. StateFlow 基础概念 1.1 什么是 StateFlow? StateF…...
OpenGl实战笔记(1)基于qt5.15.2+mingw64+opengl绘制三角形
一、实现效果 二、实现原理 (1)各函数作用与原理 initialize() 作用: 初始化 OpenGL 函数(initializeOpenGLFunctions()) 设置背景清除颜色为 rgba(0.2, 0.3, 0.4, 1.0)。 原理: initializeOpenGLFunctio…...
S100平台调试RS485/RS232
提供一个C语言的测试程序Demo #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>...
蓝桥杯 19. 植树
植树 题目描述 小明和朋友们一起去郊外植树,他们带了一些在实验室中精心研究出的小树苗。 一共有 n 个人,每个人挑选了一个适合植树的位置,一共 n 个位置。每人准备在自己的位置种下一棵树苗。 但他们遇到一个问题:有的树苗比…...
Spring Boot 中 @Bean 注解详解:从入门到实践
在 Spring Boot 开发中,Bean注解是一个非常重要且常用的注解,它能够帮助开发者轻松地将 Java 对象纳入 Spring 容器的管理之下,实现对象的依赖注入和生命周期管理。对于新手来说,理解并掌握Bean注解,是深入学习 Spring…...
git项目迁移,包括所有的提交记录和分支 gitlab迁移到gitblit
之前git都是全新项目上传,没有迁移过,因为迁移的话要考虑已有项目上的分支都要迁移过去,提交记录能迁移就好;分支如果按照全新项目上传的方式需要新git手动创建好老git已有分支,在手动一个一个克隆老项目分支代码依次提…...
前端面试每日三题 - Day 25
这是我为准备前端/全栈开发工程师面试整理的第25天每日三题练习,涵盖了: CSS中如何实现一个保持宽高比的自适应正方形元素Angular的变更检测(Change Detection)机制项目实战 - 设计一个微前端架构的前端应用。 ✅ 题目1ÿ…...
基于windows安装MySQL8.0.40
基于windows安装MySQL8.0.40 基于windows 安装 MySQL8.0.40,解压文件到D:\mysql-8.0.40-winx64 在D:\mysql-8.0.40-winx64目录下创建my.ini文件,并更新一下内容 [client] #客户端设置,即客户端默认的连接参数 # 设置mysql客户端连接服务…...
基于机器学习算法预测二手车市场数据清洗与分析平台(源码+定制+讲解) 基于Python的数据挖掘与可视化 二手车数据处理与分析系统开发 (机器学习算法预测)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
【神经网络与深度学习】普通自编码器和变分自编码器的区别
引言 自编码器(Autoencoder,AE)和变分自编码器(Variational Autoencoder,VAE)是深度学习中广泛应用的两类神经网络结构,主要用于数据的压缩、重构和生成。然而,二者在模型设计、训练…...
【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
【Linux我做主】进度条小程序深度解析
Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行(CR/LF)的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…...
Vue项目安全实践指南:从输入验证到状态管理的全方位防护
一、项目背景 在Vue2项目开发过程中,我们遇到了一些需要优化的安全实践问题。本文将分享我们在项目中的一些安全优化经验,希望能帮助到其他开发者。 主要优化点: 输入输出安全处理请求安全防护数据存储安全路由访问控制文件上传处理表单数…...
Pinocchio导入URDF关节为continuous的问题及详细解释
视频讲解: Pinocchio导入URDF关节为continuous的问题及详细解释 仓库地址:GitHub - LitchiCheng/mujoco-learning 问题背景:打算测试将之前的panda的urdf换成so-arm100的urdf,发现pinocchio的代码不能用,很奇怪&#…...
《Python星球日记》第30天:Flask数据库集成
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、数据库…...
GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)
GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab) 目录 GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)效果一览基本描述程序设计参考资料 效果一览 基本描述 本研究提出的GA…...
轻松养生:让健康融入生活
养生不是负担,而是可以轻松融入日常的生活方式。掌握以下要点,就能开启健康之旅。 清晨醒来,先喝一杯常温水,唤醒沉睡的肠胃。早餐选择富含膳食纤维的燕麦片搭配新鲜水果,补充能量又促进消化。午餐和晚餐做到荤素搭配&…...
工业主义与民主的兴衰:历史逻辑与未来危机
一、工业主义催生大众民主的机制 经济基础变革 非技术工人崛起:工业革命后,机器生产替代传统手工业,非熟练工人(包括妇女、儿童)收入提升,财富分配趋于平等,形成新兴中产阶级。 政府财政能力增…...
从代码学习深度学习 - 目标检测前置知识(二) PyTorch版
文章目录 前言一、多尺度目标检测1.1 多尺度锚框1.2 绘图工具函数 (`utils_for_huitu.py`)1.3 可视化多尺度锚框1.4 多尺度检测(理论)二、自定义目标检测数据集2.1 读取数据2.2 创建 Dataset 类2.3 创建 DataLoader2.4 验证数据加载2.5 可视化数据集样本总结前言 大家好!欢…...
什么是“系统调用”
一、什么是“系统调用”?用生活中的比喻理解 可以把“系统调用”比作你(用户)向“管理员”请求帮助完成某件事情的过程。 举个例子: 你想借书,去图书馆(操作系统)找管理员(内核&a…...
代码异味(Code Smell)识别与重构指南
1、引言:什么是“代码异味”? 在软件开发中,“代码异味(Code Smell)”是指那些虽然不会导致程序编译失败或运行错误,但暗示着潜在设计缺陷或可维护性问题的代码结构。它们是代码演进过程中的“信号灯”,提示我们某段代码可能需要优化。 1.1 ✅ 为什么关注代码异味? 预…...
005-nlohmann/json 基础方法-C++开源库108杰
《二、基础方法》:节点访问、值获取、显式 vs 隐式、异常处理、迭代器、类型检测、异常处理……一节课搞定C处理JSON数据85%的需求…… JSON 字段的简单类型包括:number、boolean、string 和 null(即空值);复杂类型则有…...
java学习之数据结构:四、树(代码补充)
这部分主要是用代码实现有序二叉树、树遍历、删除节点 目录 1.构建有序二叉树 1.1原理 1.2插入实现 2.广度优先遍历--队列实现 3.深度优先遍历--递归实现 3.1先序遍历 3.2中序遍历 3.3后序遍历 4.删除 4.1删除叶子节点 4.2删除有一棵子树的节点 4.3删除有两棵子树的节…...
Java面试场景分析:从音视频到安全与风控的技术探讨
Java面试场景分析:从音视频到安全与风控的技术探讨 在一个阳光明媚的早晨,互联网大厂的面试室里,面试官李老师坐在桌前,严肃认真;而程序员小张则显得有些紧张,甚至有些搞笑。 第一轮提问: 李老…...
《OmniMeetProTrack 全维会议链智能追录系统 软件设计文档》
撰稿人:wjz 一、引言 1.1 目的 本软件设计文档详细描述了 OmniMeetProTrack 全维会议链智能追录系统的架构、组件、模块设计及实现细节,旨在为开发人员、利益相关者和维护人员提供系统的全面设计蓝图。本文档基于需求定义文档,确保系统实现…...
C 语言逻辑运算符:组合判断,构建更复杂的条件
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 在 C 语言编程中,我们已经学习了如何使用比较运算符(如 ==, <, >)来判断两个值之间的关系,从而得到“真”或“假”的结果。但很多时候,我们需要根据多个条件的组合…...