当前位置: 首页 > 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系…...

wordpress screen/成都网站建设方案优化

编译的过程 宏定义符号的预处理&#xff0c;即宏替换&#xff0c;还有#include的内容给copy进来&#xff0c;#if等条件编译不满足项的也去掉。编译&#xff1a;xx.c -> xx.s(词法分析&#xff0c;语法分析&#xff0c;得到的汇编程序) -> xx.o目标代码&#xff08;这个本…...

易语言如何做网站/上海短视频推广

许多人宁愿死&#xff0c;也不愿思考&#xff0c;事实上他们也确实至死都没有思考。——伯特兰罗素 思考是所有工作当中最困难的,想必这就是思考的人如此少的原因。——亨利 福特 我在想&#xff0c;什么叫做思考&#xff1f;看了很多网友的回答&#xff1a;“思的上面是一块田…...

如何做网站漂浮广告/今日热点新闻视频

关 于 叶 问《叶问》是知数堂新设计的互动栏目&#xff0c;不定期给大家提供技术知识小贴士&#xff0c;形式不限&#xff0c;或提问、或讨论均可&#xff0c;并在当天发布答案&#xff0c;让大家轻轻松松利用碎片时间就可以学到最实用的知识点。2020年01月02日&#xff0c;周四…...

在深圳做网站平台需要什么备案/杭州全网推广

字典的常用方法 方便举例&#xff0c;先创建2个字典 list_test{"bob":19,"aoa":18,"coc":17} list_b{qqq:000}参数返回值含义.items()dict_items([(‘bob’, 19), (‘aoa’, 18), (‘coc’, 17)])返回所有键值.keys()dict_keys([‘bob’, ‘ao…...

网站永久镜像怎么做/廊坊seo培训

最近DNN很受欢迎,博克圆有不少bloger对这个很有研究,并翻译了不少资料,ME也想看 看究竟,不过在看DNN之前,我决定先看看ASP.NET STARTER KIT的Portal Starter Kit,建立个简单的概念也许会对学习DNN有帮助了 我个人觉得Portal Starter Kit没有细看的必要,大概了解下面四点就可以…...

扬州有做义工的地方或网站嘛/百度一下生活更好

文章目录String容器一、string构造函数二、字符串拼接append三、字符串查找和替换find&#xff0c;rfind&#xff0c;replace四、字符串存取at五、字符串插入删除insert&#xff0c;erase六、子字符串substrString容器 string其实是一个类&#xff0c;封装了一个char*指针&…...