当前位置: 首页 > news >正文

【Linux】数据链路层:以太网协议

约束不等于压迫,冷静和理性不等于冷淡和麻木。

在这里插入图片描述

文章目录

  • 一、以太网帧 和 局域网转发数据包
    • 1.局域网转发的原理(基于以太网协议)
    • 2.以太网MTU与MAC地址
  • 二、局域网中的数据碰撞
    • 1.如何解决局域网中的数据碰撞?(碰撞检测和碰撞避免算法)
    • 2.如何重新看待局域网?(系统视角)
    • 3.局域网很大,如何降低数据的碰撞概率(交换机划分碰撞域+硬件转发)
  • 三、ARP协议
    • 1.ARP将已知的ip地址转换为未知的MAC地址的过程
    • 2.ARP缓存
    • 3.中间人的ARP欺骗


一、以太网帧 和 局域网转发数据包

1.局域网转发的原理(基于以太网协议)

1.
(1)IP提供了将数据包跨网络发送的能力,这种能力实际上是通过子网划分+目的ip+查询节点的路由表来实现的,但实际上数据包要先能够在局域网内部进行转发到目的主机,只有有了这个能力之后,数据包才能跨过一个个的局域网,最终将数据包发送到目的主机。
所以跨网络传输的本质就是跨无数个局域网内数据包转发的结果,离理解整个数据包在网络中转发的过程,我们只差理解局域网数据包转发这临门一脚了。
(2)而现在最常见的局域网通信技术就是以太网,无线LAN,令牌环网(这三种技术在数据链路层使用的都是MAC地址),早在1970年代IBM公司就发明了局域网通信技术令牌环网,但后来在1980年代,局域网通信技术进入了以太网大潮,原来提供令牌网设备的厂商多数也退出了市场,在目前的局域网种令牌环网早已江河日下,明日黄花了,等到后面进入移动设备时代时,在1990年,国外的一位博士带领自己的团队发明了无线LAN技术,也就是wifi这项技术,实现了与有线网一样快速和稳定的传输,并在1996年在美国申请了无线网技术专利。
今天学习的正是以太网技术。

在这里插入图片描述

2.
(1)下面是MAC帧的格式,MAC帧主要有两类,一类是有效载荷为正常的从上层传输下来的IP报文,另一类是数据链路层自己的有效载荷,包含ARP请求/应答 或 RARP请求/应答,这类报文在讲ARP协议时会重点谈论,ARP协议和以太网技术是当前有线局域网通信中最重要的两个部分。第二类的报文末尾有PAD字段,该字段为填充字段,用于填充报文长度,因为MAC帧层规定有效载荷最小下限不能低于46字节,所以需要填充18字节的长度,但在接收方填充字段会被直接忽略掉,PAD并不会对通信产生实际影响,我们可以直接忽略掉他。
(2)MAC帧包括6字节的目的MAC地址和源MAC地址,以及两个字节的类型字段,0800是普通MAC帧,0806和8035分别代表封装ARP和RARP请求应答的MAC帧,以及4字节的CRC校验和,这个CRC校验和在传输层,网络层,数据链路层我们都见到过,算是老朋友了。MAC帧的构成还是非常简单的,最重要的字段就是类型和源MAC地址和目的MAC地址。
(3)谈论协议我们一直离不开的两个问题,如何将报头和有效载荷做分离呢?如何进行分用呢?
MAC协议采取的是定长报头的方式来将报头和有效载荷作分离,读取时可以先正向读取14字节的报头数据,然后再反向读取4字节的剩余报头数据,这样就可以将报头和有效载荷做分离了,分用时,我们依靠的是类型字段来进行分用,如果0800就向上交付给IP协议,如果是0806就向上交付给ARP协议,如果是0835就向上交付给RARP协议

在这里插入图片描述
以下是数据链路层,网络层,传输层向上分用的过程,分用可以体现在他们各自协议的报头字段里面,比如以太网协议的16位类型字段,0800,0806,0835,IP协议的8位类型字段,ICMP是1,TCP是6,UDP是17,TCP协议或UDP协议的16位目的端口号。
在这里插入图片描述

3.
(1)当m1构建了一个MAC帧发送到局域网中时,局域网中的每台主机都会收到该数据帧,但m2~m7主机在收到数据帧,并将数据帧的报头读取之后,发现目的MAC地址并不是他们自己的MAC地址,所以这些主机在收到数据帧后,都会在自己的数据链路层将报文丢弃,但只有m8主机不会丢弃,他一看报头中的目的MAC地址是他自己,此时m8就会将报头和有效载荷做分离,然后向上进行分用,直到最后传递到m8的应用层。反过来m8如果想给m1主机回复报文,原理也是一样的,他也会封装一个目的MAC地址为m1的数据帧,然后将该数据帧发送到局域网中,局域网中只有m1收到数据帧不会进行丢弃,其他主机在自己的数据链路层就会将该数据帧丢弃。这就是以太网技术在局域网中通信的原理。(栗子:老师叫张三回答问题,全班同学都听到了,但其他同学都没有站起来回答问题,只有张三同学站起来回答了问题)
(2)在局域网中,网卡有一种模式叫做混杂模式,我们的网卡默认是不会开启这种模式的,这种模式的特点就是不放弃任何数据帧,直接向上交付给网络层,这也是许多局域网抓包工具的原理

在这里插入图片描述

2.以太网MTU与MAC地址

1.
MAC地址是机器的物理地址,6字节的MAC地址在全球范围内具有唯一性,因为48个比特位构成的MAC地址的个数是17w亿个地址,具2020年底统计,全球的入网设备大概有300亿台,所以MAC地址不像ipv4地址那样紧缺,MAC地址绝对是足够的!
数据包在进行网络中路由转发时,ip地址描述的是源主机和最终目的主机,而MAC地址描述的是,下一跳这个区间的起点和终点。

2.
在局域网中,如果数据特别长,则会增大数据碰撞的概率,就像战场上的士兵如果体格越大,则目标越大,被子弹击中的概率也就越大,而发送数据帧时,数据也要有一定的价值,总不能数据太短了吧,一句话分成三句话说?所以数据传输时,太大也不好,太小也不好,以太网协议规定了数据帧有效载荷的大小区间,最大不能超过上限MTU1500字节,最小不能低于下限46字节

在这里插入图片描述
3.
(1)不仅仅发送主机可能会对报文做分片,路径上的路由器也可能对报文做分片,例如下图中发送主机为了第一条数据传输的吞吐量,使用FDDI技术提高了MTU的值,将MTU的值设置为4532字节,但当路由器转给目标主机时,路由器的以太网协议规定了MTU是1500字节,所以此时路由器会在自己的网络层对IP报文做分片。
除了这样的情况外,还有可能出现主机在MTU为1500的情况下,已经在IP层对报文做出了分片,但有可能路径上的路由器的MTU为500,此时路由器可能还会继续对已经分片的报文继续做出分片。(2)如果我们不想让路由路径中的节点对报文继续做分片,则我们可以将IP报头中的3位标志字段设置为禁止分片,如果路上遇到某个节点的MTU过小,想对报文做分片时候,但报文却禁止被分片,此时路由器就会丢弃该报文,当发送端长时间没有收到应答报文段时,发送端会进行超时重传报文,此时报文就会重新规划路由的路径,寻找到一条最大吞吐量的路径出来。
(3)如果你不想找最大吞吐量的路径,而是想找出最快速度传输的路径,则我们可以降低数据量的大小,IP层在路由选择路径时,是可以找到最快传输速率的路径的。

在这里插入图片描述

4.
其实下面这些话题我们都讲过,无非就是MSS和SMSS之间的关系,以及滑动窗口发送的数据段的多少,为了防止IP层分片,TCP头部选项字段中包含了通信双方互相协商MSS大小的选项kind=2,以及IP分片时,对于数据丢包的影响。其实这些我们在之前的IP层和TCP层都讲过了,这里简单提一下,如果有遗忘的,可以移步我之前写的文章。

【Linux】传输层协议:UDP和TCP

【Linux】网络层协议:IP
在这里插入图片描述

二、局域网中的数据碰撞

1.如何解决局域网中的数据碰撞?(碰撞检测和碰撞避免算法)

1.
(1)局域网中,一定是多台主机同时在发送数据的,而只要所有主机都在发送着数据,就会形成数据之间的干扰,在计算里面我们称为数据碰撞。(老师叫张三回答问题,结果全班同学都在叽叽喳喳的说,张三听不清老师在说什么,其他同学互相之间说话也会互相干扰)
(2)所以数据链路层规定,任何时刻,只能有一个主机在发送消息,如果有多个主机在同时发,这些数据发送碰撞后,这样的数据就变成了无效数据。
(3)如何判断主机发送的数据发生了碰撞呢?m1发送的数据,m1自己也会收到,如果m1接收到的数据和自己发送的数据不一致的话,则接收的数据帧在进行CRC校验时,一定会出错,此时就说明m1发送的数据帧发生了碰撞。所以局域网还有另一种称呼,叫做碰撞域。

在这里插入图片描述

2.
如何保证一个碰撞域中,任意时刻只能有一个主机在发送数据呢?
其实不同的局域网通信技术,有着不同的解决方案。
(1)令牌环网采取的方式是向局域网中流放一份令牌环数据,只有持有该令牌环数据的主机才能发送消息,发完消息之后,再将令牌环数据丢到局域网中,这样就可以保证任意时刻,都只会有一个主机在发数据,不会产生多个主机同时发数据而造成碰撞的问题。
(2)当A主机和B主机在发送数据时,发生了碰撞,此时会触发以太网协议的策略,策略也很简单,就是暂时不让A主机和B主机发送数据,让他们各自都等一等再发,等待的时间随机,视情况而定,在A和B等待的时候,局域网中的其他主机就可以发送数据帧了,当A和B等待结束之后,重新向局域网中发送数据,碰撞的概率就会非常低了。
(3)当数据发生碰撞后,以太网执行的策略,我们称之为碰撞检测和碰撞避免算法,其实这个策略很简单,说白了就是等一等再发,但你不要高估了局域网中各个主机发送数据的量,也不要低估了光电信号(二进制数据)在局域网中传播的速度,局域网并没有那么的大,容纳的主机数并不是非常多,所以对于飞快的光电信号来讲,发生碰撞的概率本身就低,所以等一等再发这样听起来很不靠谱的策略,在实际中却是很有效的。
其实早在1980年的时候,当时以太网技术推出时,很多人都不看好以太网的技术标准,不仅我们觉得碰撞检测和避免的算法也太随意了一些,当时的人们也这么觉得,并且当时有相关的专业机构也得出过结论,从理论上来讲,令牌环网碰撞避免的效率和可靠性应该更高一些,但当实际中真正采纳以太网时,才知道以太网是很香的,随后以太网就大面积快速的推广,而令牌环网却慢慢的变得无人问津。

3.
既然局域网中多主机在发送数据时,可能产生数据碰撞,那是不就意味着,如果我搞一台主机,不断的向局域网中发送垃圾数据,同时这台主机不执行碰撞检测和避免的算法,那这个局域网中的其他主机是不就一直不能发送数据呢?也就意味着这台主机黑掉了这个局域网?
确实是这样子的,网上是有这样的工具的,但我不知道这个工具是啥,如果你有的话,可以尝试在自己家里面的局域网中搞一下,看是否能够黑掉你家的局域网。

2.如何重新看待局域网?(系统视角)

我们上面说,任何时刻在局域网中只能有一个主机在向局域网中发送数据,那我们不就可以把局域网看作临界资源吗?而像碰撞检测和避免算法能够保护临界资源,保证只能有一个主机在访问临界资源,那这不就相当于互斥锁或条件变量吗?而所谓的令牌环数据,不也就相当于互斥锁吗?谁拿着锁谁才能访问临界资源!
所以系统和网络是不分家的,可能在代码层面上两者是划分开的,但在设计理念,和某些策略的设计思想上,两者一定是有重叠的!

3.局域网很大,如何降低数据的碰撞概率(交换机划分碰撞域+硬件转发)

1.
局域网一定不能很大,因为大了之后,主机数就会变多,发生碰撞的概率就会变高。
手机的wifi其实就是无线式的以太网,在学校中比如操场举办活动,大家都去参加,此时大家都连接的是校园wifi,这个时候,大家就会同处于一个局域网中,进行网络数据传输时,发生碰撞的概率就会变得很高,而一旦发生碰撞,就会执行碰撞检测和避免算法,手机或其他入网设备都会等一等,而直观上体现出来的就是我们感觉网速很慢,感觉网太卡了。
就算手机用的是流量,其实也会很卡,因为你所处的环境周围可能只有一个基站,比如你在上大课的时候,有很多同学用的都是联通流量卡,你们坐在一间大教室里面,那你们访问互联网时,你和其他同学的数据其实都会被转发到附近的联通基站,而基站的功率一定是有上限的,你和你的同学都在向基站发送数据,此时数据可能在无线信道上发生数据碰撞,所以你的手机上网就会很卡,除此之外还有可能是因为基站负载已经比较高了,无法及时处理数据请求,此时就会导致网络延迟增加,直观上也是我们的手机感觉会很卡。

下面是我家附近的一个基站的图片,不知道是哪个运营商的,哪天过去看一眼。
在这里插入图片描述
2.
那如果局域网就是很大,比如学校里面,我还想提高网络传输效率,降低数据碰撞的概率,有什么其他办法吗?有的,引入交换机即可
(1)交换机会通过划分碰撞域的方式来降低数据碰撞的概率,任意时刻,每个碰撞域只有一个设备可以发送数据,减少碰撞域中的设备,以此来降低发送数据时碰撞的概率。
(2)交换机具有硬件转发的能力,可以将数据直接转发到目的设备,而无需将数据广播到整个局域网当中,这种点对点的方式可以减少数据包在网络中的传播范围,降低碰撞概率
比如,当左侧的主机在互相通信时,交换机不会将左侧的消息转发到右侧的碰撞域,如果左侧主机在通信时,数据发生了碰撞,同样交换机也不会将碰撞数据转发到右侧碰撞域,避免碰撞数据的进一步传播。右侧的情况与左侧相同,而当左侧要和右侧主机通信时候,此时交换机可以将数据直接转发到右侧的目的设备。

在这里插入图片描述

三、ARP协议

1.ARP将已知的ip地址转换为未知的MAC地址的过程

1.
之前我们谈论以太网通信时,说过在局域网内我们应该将数据包路由到下一跳位置,以这样的方式来跨多个网络进行数据包的传输,但想要将数据包发送到下一跳位置,一定是数据帧在网线上进行传输,而想要以数据帧的方式进行传输,则网络层一定要向下交付,然后封装帧报头,帧报头中有源MAC地址和目的MAC地址字段,源MAC地址好解决,但发送方怎么知道下一跳节点的目的MAC地址呢?没人告诉过数据链路层目的MAC地址是多少啊?当时我们是站在上帝视角,说数据包发送到下一跳主机,但实际通信时,一定是要封装MAC报头的啊,目的MAC地址都不知道,怎么封装MAC报头呢?其实这里面就缺了一个关键角色,ARP协议,虽然我们不知道目的MAC地址是多少,但我们知道下一跳的ip地址是多少啊!而ARP协议做的就是将ip地址转换为MAC地址的工作,知道MAC地址后,就可以将IP报文,向下交付,在MAC层封装好MAC帧报头,然后再通过以太网接口Iface,将数据帧发送到目标主机。
我们可以将ARP协议理解为在数据链路层中,MAC层的上面,如果发送方不知道下一跳节点的MAC地址,则可以先通过ARP协议获取到下一跳节点的MAC地址,然后再交付给MAC层,封装MAC帧报头,最后发送到局域网中。

2.
下面就是封装ARP请求/应答的MAC帧格式,硬件类型指的是链路层的网络类型,1为以太网,协议类型表示要转换的地址类型,该值为0x800,表示ip地址,硬件地址长度的值为6,表示以太网MAC地址的长度大小,协议地址长度的值为4,表示ip地址的长度。这四个字段值都是固定写法,没什么价值。
op字段为1表示ARP请求,op字段为2表示ARP应答报文,后四个字段,只有目的以太网地址是不知道该填什么的,在未得到目的MAC地址值时,一般将该字段设置为全F,最核心的字段就是这5个字段了。

在这里插入图片描述
无论你的局域网技术是什么,都需要有将ip地址转换为MAC地址的能力,因为无线LAN,以太网,令牌环等技术使用的都是MAC地址。
因为ARP协议是在MAC帧上层的,所以以太网帧格式,除了封装IP报文外,还可以封装ARP请求或应答。

在这里插入图片描述

3.
(1)其实ARP请求的原理和以太网技术很相似,m1主机在ARP层就填充好了ARP报头中的各个字段,最主要的一个字段就是目的ip(其实是下一跳节点的ip地址,并不是最终目标主机的ip地址),填充这个字段其实并不难,查一下节点的路由表就可以确定出下一跳节点的ip地址,填充好之后,向下交付到MAC层,MAC层封装好MAC报头后,会将MAC帧发送到局域网中。
(2)由于MAC报头里的目的MAC地址是全F,所有局域网中的所有主机都会收到该数据帧,并将报头和有效载荷做分离,然后再看ARP报文的op字段,发现是1,则说明是ARP请求,然后所有的主机都会对比自己的ip地址和ARP请求中的ip地址是否相等,如果相等,则发现这个ARP请求是发送给我这台主机的,接下来这台主机就会读取剩余的ARP报头内容,这样就完成了ARP请求的过程(3)然后接收主机会构建ARP应答发送回源主机,此时构建ARP应答就简单了,因为读取ARP请求时,接收主机就已经知道了发送端的MAC地址和ip地址了,所以构建ARP应答只需要将自己的ip地址和MAC地址填充到ARP应答报文中,并把op字段填充为2表示ARP应答报文,再把其他固定的字段填充一下,最后再封装一层MAC帧报头,然后发送到局域网中。
当所有的主机都收到该报文时,非目标主机在MAC层就会丢弃该报文,因为读取MAC报头后,就发现目的MAC地址与自己的MAC地址是不相符的,只有m1主机收到该报文后,才会拆分报头和有效载荷,将ARP应答向上交付给ARP层,m1读取完ARP应答的内容后,就知道下一跳节点的MAC地址了,此时就可以堂堂正正的封装IP报文,将类型为0800的数据帧发送到局域网中了。

在这里插入图片描述
4.
(1)还有一种情况是,我们只知道对方的MAC地址,不知道其ip地址,这种情况出现的概率非常低,一般可能出现在网络管理员进行局域网管理时,如果他发现某个路由器发不出去数据帧了,他现在只知道路由器的MAC地址,他想查查自己当时给路由器配的ip地址是不是发生变化了,那么此时就需要另一台主机通过RARP协议,向路由器发起RARP请求,以此来获得路由器的ip地址。
(2)RARP的格式与ARP相同,原理其实也是类似的,也是通过广播的方式来让目的主机收到RARP请求,目的主机然后将自己的ip地址封装成RARP应答报文发送回源主机,原理和ARP类似,这里不再过多赘述。

在这里插入图片描述

2.ARP缓存

(1)当发送端主机会先在IP层通过目的ip+路由表的方式,确定出下一跳节点的ip地址,然后向局域网中发送数据帧,但如果该主机不知道下一跳节点的MAC地址时,则可以进行ARP请求,将已知的下一跳节点的ip地址转换为未知的MAC地址,然后发送端主机就可以封装MAC帧,进行数据传输了。
(2)一个局域网并不是很大,所以路由器完全可以给他所管理的局域网中的所有主机都发送ARP请求,先提前获取到所有主机的MAC地址,然后构建一张ARP缓存表,将每台主机的ip地址和MAC地址的映射关系作为一个条目,保存到ARP缓存表中。这样下次如果有数据包到达路由器,路由器在自己的IP层确定好数据包的下一跳位置后,则可以查询ARP缓存表,通过下一条节点的ip地址映射得到MAC地址,无须再次进行ARP请求,得到MAC地址后,则路由器就可以向下将IP报文封装成MAC帧,发送到局域网中,下一跳节点会收到这个MAC帧,进行数据包的后续处理。
(3)由于ARP的需求非常大,为了不让每个节点在发送数据帧前,都频繁的进行ARP请求,除了路由器的ARP缓存表外,只要你先前和局域网中的一些主机通信过,那么下次再向其发送数据包时,无须进行ARP请求,主机自身会将他的MAC地址缓存下来,以便未来可能使用。
(4)需要注意的是,这种缓存是分钟级别的,过段时间会被丢弃掉,因为局域网中的ip地址是变化的,DHCP会动态分配入网设备的ip地址,ip地址变化,则原来的ip与MAC的映射关系就会变化,所以ARP缓存是分钟级别的,当ip地址变化时,对应的映射关系条目也会自动被丢弃掉。

下图中右侧部分的arp缓存分别是我的云服务器和windows机器的结果
在这里插入图片描述

3.中间人的ARP欺骗

1.
其实成为中间人很简单,只要不停的强迫通信双方更新arp缓存即可,让他们把arp缓存更新为中间人的MAC地址,然后中间人将他们发送的数据包转发给对方,这样就完成了ARP欺骗,从而让中间人获得双方通信的数据。
不过我们也有相应的解决方案,那就是HTTPS协议,对数据包中的内容进行加密,下面有我之前写的文章链接,详情可移步。

【Linux】应用层协议:HTTP和HTTPS

在这里插入图片描述

2.
如果我们想要自己玩,其实可以不用成为中间人,如果你想打掉某台主机的话,只需要抓到这台主机向路由器发送的ARP请求包即可(可以提前踩点,拿到路由器的ip地址,对抓到的包进行过滤,找出目的ip为踩点时的路由器ip的请求包),然后构建一个ARP应答,将里面的目的MAC地址胡乱写一个值,返回给这台主机,此时这台主机就不能联网了,因为他发送的数据帧找不到路由器了,数据帧里面的目的MAC地址是错误的。

相关文章:

【Linux】数据链路层:以太网协议

约束不等于压迫,冷静和理性不等于冷淡和麻木。 文章目录 一、以太网帧 和 局域网转发数据包1.局域网转发的原理(基于以太网协议)2.以太网MTU与MAC地址 二、局域网中的数据碰撞1.如何解决局域网中的数据碰撞?(碰撞检测和…...

docker搭建私有镜像harbor

docker安装搭建私有仓库 Harbor harbor用于存储和分布docker镜像企业级registry服务器的harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。 安装harhor 启动harbor 6....

汽车便携轮胎充气泵方案

便携式充气泵是一种小巧便捷的充气工具,可广泛应用于汽车、自行车、摩托车、游泳圈、球类等充气产品的充气过程中。该产品以其小巧轻便、充气效率高、操作简单等特点备受消费者的青睐。 充气泵工作过程 当电动机启动时,通过电磁离合器将气泵内的活塞带动…...

一、Kafka概述

目录 1.3 Kafka的基础架构 1.3 Kafka的基础架构 Producer:消息生产者,就是向 Kafka broker 发消息的客户端Consumer:消息消费者,向 Kafka broker 取消息的客户端。Consumer Group(CG):消费者组&…...

【数据结构OJ题】合并两个有序链表

原题链接:https://leetcode.cn/problems/merge-two-sorted-lists/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 可以先创建一个空链表,然后依次从两个有序链表中选取最小的进行尾插操作。(有点类似双…...

C++ LibCurl 库的使用方法

LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP、FTP、SMTP、POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等…...

自然语言处理从入门到应用——LangChain:索引(Indexes)-[向量存储器(Vectorstores)]

分类目录:《自然语言处理从入门到应用》总目录 Vectorstores是构建索引的最重要组件之一。本文展示了与VectorStores相关的基本功能。在使用VectorStores时,创建要放入其中的向量是一个关键部分,通常通过嵌入来创建。 from langchain.embedd…...

【C++练习】普通方法+利用this 设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义一下成员函数

题目 设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义成员函数: void set_ len(int l); //设置长度 设置宽度void set_ wid(int w); 获取长度: int get len(); 获取宽度: int get _wid); 显示周长和面积: v…...

电子电路学习笔记之SA1117BH-1.2TR——LDO低压差线性稳压器

关于LDO调节器(Low Dropout Regulator)是一种电压稳压器件,常用于电子设备中,用于将高电压转换为稳定的低电压。它能够在输入电压和输出电压之间产生较小的差异电压,因此被称为"低压差稳压器"。 LDO调节器通…...

【LeetCode-面试经典150题-day7】

392.判断子序列 题意: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是&quo…...

00-音视频-概述

有很多场合会使用的音视频,比如安防、视频闸机、影音播放器、视频通话,短视频等等。 从摄像头采集到用户观看,这中间涉及到了很多技术。 用户一般观看的高清视频1080P30帧。若按24位RGB对视频进行存储,一个60分钟视频所占空间 …...

SOFARPC(笔记)

文章目录 一、快速开始1.1 SOFARPC1.2 基于SOFABoot 二、注册中心三、通讯协议2.1 Bolt基本发布调用方式超时控制协议泛化调用序列化协议自定义线程池 2.2 RESTful基本使用 2.3 其他协议四、架构 附录 官方样例下载地址-sofa-boot-guides 可查看 SOFARPC 方式快速入门 一、快…...

无线上网连接及配置

目录 1. 无线上网连接及配置 1.1 无线路由器连接方式 ​编辑 1.2 无线路由器的基本配置 1.配置用户计算机上的IP地址 2.访问无线路由Web管理界面 1.3 WAN 口设置 1.动态 IP 2.静态 IP 1. 无线上网连接及配置 一小型公司共有20名员工。由于公司业务需要访问Internet&…...

Webpack减少打包数量和体积(Umi 3.*中)

在UMI 3.*中配置: export default defineConfig({chunks: [vendors, umi],chainWebpack: function (config: any, { webpack }: any) {config.plugin(chunkPlugin).use(webpack.optimize.LimitChunkCountPlugin, [{maxChunks: 5, // 必须大于或等于 1,此…...

python Crypto 包安装

经测试使用 pip install pycrypto安装会出现,如下所示错误: pip install pycrypto -i https://pypi.douban.com/simple/ Looking in indexes: https://pypi.douban.com/simple/ Collecting pycrypto Using cached https://pypi.doubanio.com/packages/…...

时序预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现SO-CNN-LSTM蛇群…...

前端开发,怎么解决浏览器兼容性问题? - 易智编译EaseEditing

解决浏览器兼容性问题是前端开发中常见的挑战之一。不同的浏览器可能对网页元素的渲染和功能支持有所不同,因此需要采取一些策略来确保您的网页在不同浏览器上都能正常运行和呈现。以下是一些解决浏览器兼容性问题的方法和策略: 使用CSS Reset&#xff…...

树莓派3B安装64位操作系统

树莓派3B安装Ubuntu MATE_树莓派3b 安装ubuntu_雨田大大的博客-CSDN博客https://blog.csdn.net/lsjackson13/article/details/92423694?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-92423694-blog-80716098.235%5Ev38%5Ep…...

Mysql系列 - 第2天:详解mysql数据类型(重点)

这是mysql系列第2篇文章。 环境:mysql5.7.25,cmd命令中进行演示。 主要内容 介绍mysql中常用的数据类型 mysql类型和java类型对应关系 数据类型选择的一些建议 MySQL的数据类型 主要包括以下五大类 整数类型:bit、bool、tinyint、smal…...

Linux常用的运维命令

1.查看进程按内存从大到小排序 ps -e -o "%C:%p:%z:%a"|sort -k5 -nr2.查看磁盘和分区信息 # 查看挂接的分区状态mount | column -t# 查看所有分区 fdisk -l# 查看所有交换分区 swapon -s3.查看网络信息 ifconfig # 查看所有网络接口的属性iptables -L…...

【从零学习python 】50.面向对象编程中的多态应用

文章目录 多态场景代码实现多态总结 进阶案例 多态 面向对象的三大特性: 封装:这是定义类的准则,根据对象的特点,将行为和属性抽象出来,封装到一个类中。继承:这是设计类的技巧。父类与子类,主…...

实现Token刷新机制

问题场景: 开发的项目中,如果正在项目中编辑信息,编辑信息的时间的过程中token失效可能导致信息丢失怎么办? 一、解决方法 实现Token刷新机制:客户端定时刷新token,当用户的token即将过期时,可以向服务器…...

FlaUi输入账号密码

FlaUI是一个用于自动化Windows桌面应用程序的开源UI自动化库,通常用于自动化Windows应用程序的测试和操作。如果你想使用FlaUI来输入账号和密码,你需要编写一些C#或其他支持.NET的编程代码来实现这一目标。以下是一个使用FlaUI来输入账号和密码的简单示例…...

ModStartBlog v8.0.0 博客归档页面,部分组件升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装会…...

使用 PyTorch 进行高效图像分割:第 4 部分

一、说明 在这个由 4 部分组成的系列中,我们将使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。本部分将重点介绍如何实现基于视觉转换器的图像分割模型。 图 1:使用视觉转换器模型架构运行图像分割的结果。 从上到下,输入图像、地面…...

西班牙卡瓦起泡酒的风味搭配

卡瓦是一种对食物友好的西班牙起泡酒,它的制作方法和香槟一样,可以和类似的食物搭配。卡瓦食物搭配包括各种食物,从海鲜和鱼到火腿,以及不同类型的小吃,也可以将卡瓦酒与甜点、水果和奶酪搭配。 卡瓦酒是世界上最著名的…...

Java项目-苍穹外卖-Day05

文章目录 1. 新增套餐1.1 需求分析和设计1.2 代码实现1.2.1 DishController1.2.2 DishService1.2.3 DishServiceImpl1.2.4 DishMapper1.2.5 DishMapper.xml1.2.6 SetmealController1.2.7 SetmealService1.2.8 SetmealServiceImpl1.2.9 SetmealMapper1.2.10 SetmealMapper.xml1.…...

取模运算符在数组下标的应用

什么是取模运算符%&#xff1f; 定义&#xff1a; a mod b&#xff0c;设a、b属于正整数且b>0&#xff0c;如果q、r属于正整数满足aq*br&#xff0c;且0≤r<b&#xff0c;则定义&#xff1a; a mod b r 注意&#xff1a;取模运算符两侧的除数和被除数都是整数&#xff…...

Firefox(火狐),使用技巧汇总,问题处理

本文目的 说明火狐如何安装在C盘之外的盘&#xff0c;即定制安装路径。如何将同步功能切换到本地服务上。默认是国际服务器。安装在C盘之后如何解决&#xff0c;之前安装的扩展无法自动同步的问题。顺带讲解一下&#xff0c;火狐的一些比较好用的扩展。 安装路径定制 火狐目前…...

耐腐蚀高速数控针阀和多功能PID控制器在流量比率控制中的应用

摘要&#xff1a;在目前的流体比值混合控制系统中&#xff0c;普遍采用的是多通道闭环PID控制系统对各路流量进行准确控制后再进行混合&#xff0c;这种控制方式普遍存在的问题是对流量调节阀的响应速度、耐腐蚀性和线性度有很高要求。为此本文提出的第一个解决方案是采用NCNV系…...

C语言:选择+编程(每日一练Day6)

目录 ​编辑选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;至少是其他数字两倍的最大数 思路一&#xff1a; 思路二&#xff1a; 题二&#xff1a;两个数组的交集…...

微信小程序教学系列(8)

微信小程序教学系列 第八章&#xff1a;小程序国际化开发 欢迎来到第八章&#xff01;这一次我们要谈论的是小程序国际化开发。你可能会问&#xff0c;什么是国际化&#xff1f;简单来说&#xff0c;国际化就是让小程序能够适应不同的语言和地区&#xff0c;让用户们感受到更…...

情人节定制:HTML5 Canvas全屏七夕爱心表白特效

❤️ 前言 “这个世界乱糟糟的而你干干净净可以悬在我心上做太阳和月亮。”&#xff0c;七夕节表白日&#xff0c;你要错过吗&#xff1f;如果你言辞不善&#xff0c;羞于开口的话&#xff0c;可以使用 html5 canvas 制作浪漫的七夕爱心表白动画特效&#xff0c;全屏的爱心和…...

操作系统-笔记-第五章-输入输出管理

目录 五、第五章——输入输出管理 1、IO设备的概念和分类 &#xff08;1&#xff09;IO设备分类——使用特性 &#xff08;2&#xff09;IO设备分类——传输速率 &#xff08;3&#xff09;IO设备分类——信息交换&#xff08;块、字符&#xff09; 2、IO控制器 &#x…...

感觉自己效率不高吗?学习实现目标的六个关键步骤,让你做任何事都事半功倍!

概述 是否感觉自己效率不高?做任何事情都提不起来精神?开发的时候要完成的功能很多,却不知该如何下手去做?那么你通过这篇文章可以学习到六个完成工作和学习目标的关键步骤,只要简单重复这六个步骤,就可以很轻松的达到你想做到的任何目标。是不是感觉很神奇,我也是亲测…...

【高级IO】- 五种 IO 模型 | 多路转接 - select

目录 IO的基本概念 什么是高效的IO&#xff1f; 五种IO模型 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 异步IO 同步通信VS异步通信&#xff08;synchronous communication / asynchronous communication&#xff09; 同步通信VS同步与互斥 阻塞VS非阻塞 其他高级IO …...

在Linux搭建GitLab私有仓库配置实现远程访问私有仓库Gitlab ——【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留…...

ChatGPT应用于高职教育的四大潜在风险

目前&#xff0c;ChatGPT还是一种仍未成熟的技术&#xff0c;当其介入高职教育生态后&#xff0c;高职院校师生在享受ChatGPT带来的便利的同时&#xff0c;也应该明白ChatGPT引发的风险也会随之进入高职教育领域&#xff0c;如存在知识信息、伦理意识与学生主体方面的风险与挑战…...

uni-app在组件中内嵌webView,实现自定义webView的大小,并处理页面中有webview时其他元素点击事件失效的问题

uni-app在组件中内嵌webView&#xff0c;实现自定义webView的大小&#xff0c;并处理页面中有webview时其他元素点击事件失效的问题 uni-app在组件中内嵌webView&#xff0c;实现自定义webView的大小 setWebviewTop() {// #ifdef APP-PLUSvar currentWebview this.$scope.$g…...

档案开发:增加查询和打卡按钮

档案开发&#xff1a;增加查询和打卡按钮 和单据开发的不同点 没有单据类型不是右击–>特性–>单据主表/单据子表&#xff0c;而是右击–>特性–>选择想要的接口访问器类型是NCVO不需要映射不是项目右键–>新建–>其他–>主子表单据结点&#xff0c;而是…...

redis基础细心讲解,一篇了解常用的缓存技术!

今日内容 redis 1. 概念 2. 下载安装 3. 命令操作1. 数据结构 4. 持久化操作 5. 使用Java客户端操作redis 6. 在ssm项目中使用缓冲进行CRUD操作Redis 1. 概念 redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQL ​ NoSQL(NoSQL = Not Only SQL),意即“不仅仅…...

Three.js之几何体、高光材质、渲染器设置、gui

参考资料 阵列立方体和相机适配体验Threejs常见几何体简介…gui.js库(可视化改变三维场景) 知识点 注&#xff1a;基于Three.jsv0.155.0 长方体&#xff1a;oxGeometry球体&#xff1a;SphereGeometry圆柱&#xff1a;CylinderGeometry矩形平面&#xff1a;PlaneGeometry圆…...

UE4如何连接dmx---摇头矩阵灯具的创建

UE4如何连接dmx---摇头矩阵灯具的创建 开始创建库&#xff01; 然后我们开始创建多少个灯珠&#xff08;注意了&#xff1a;这是矩阵灯&#xff0c;是看灯珠的&#xff09; 那么这里我们创建6X6灯珠 下面设置灯珠的属性&#xff0c;灯珠有什么属性呢&#xff0c;只有颜色属性&…...

网络聊天室

一、项目要求 利用UDP协议&#xff0c;实现一套聊天室软件。服务器端记录客户端的地址&#xff0c;客户端发送消息后&#xff0c;服务器群发给各个客户端软件。 问题思考 客户端会不会知道其它客户端地址&#xff1f; UDP客户端不会直接互连&#xff0c;所以不会获知其它客…...

ChatGPT只是玩具:生成式人工智能在不同行业的应用

源自&#xff1a;IT经理网 生成式人工智能的十一个行业用例 打开生成式 AI的正确姿势 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及版权等问题&…...

RestFul的风格是什么

RestFul的风格是什么&#xff1f; 当我们谈论RESTful风格时&#xff0c;它指的是一种设计和构建网络应用程序的原则和约定。以下是RESTful风格的一些主要特点&#xff1a; 资源&#xff1a;将应用程序的功能封装为资源&#xff0c;每个资源都有一个唯一的标识符&#xff08;U…...

【自制C/C++小项目JuLongEditor】使用Windows控制台API来制作一个简单的文本编辑器

2023年8月22日&#xff0c;周二下午 昨天花了一个下午和晚上来制作的&#xff0c; 实现了一些基本的功能&#xff0c; 但由于代码只有130行&#xff0c;所以存在很多不足之处 GitHub&#xff1a;GitHub - JuLongZhiLu/JuLongEditor: C/C小项目&#xff0c;使用Windows控制台…...

中国芯,寻找新赛道迫在眉睫

北京华兴万邦管理咨询有限公司 商瑞 陈皓 近期国内半导体行业的热点可以用两个“有点多”来描述&#xff0c;一个是中国芯群体中上市公司股价闪崩的有点多&#xff0c;另一个是行业和企业的活动有点多。前者说明了许多国内芯片设计企业&#xff08;fabless商业模式&#xff09;…...

C++ 好用的格式化库--fmt

背景 fmt 库是一个开源的 C 格式化库&#xff0c;它提供了一种简洁、安全和高效的方式来进行字符串格式化。该库的设计目标是提供与 Python 的字符串格式化语法类似的功能&#xff0c;同时保持 C 的类型安全性和性能。 下载与安装 官网下载 fmt 官网地址&#xff1a;https:…...

微信小程序教学系列(3)

微信小程序教学系列 第三章&#xff1a;小程序高级开发技巧 1. 小程序API的使用 小程序API简介 小程序API是小程序提供的一系列接口&#xff0c;用于实现各种功能和操作。通过调用小程序API&#xff0c;可以实现页面跳转、数据存储、网络请求等功能。 使用小程序API的步骤…...