交换机和路由器到底有什么区别???

news2024/11/28 6:42:37

我:度娘度娘,交换机和路由器的区别是什么呢?

度娘:一个工作在第二层数据链路层,一个工作在第三层网络层。

我:哈?那工作在不同层会有什么区别?为什么要工作在不同层?

度娘:一个用于组建局域网,一个用于连接互联网。

我:哦......好像有点懂,那还有什么不同?

度娘:交换机没有MAC地址,路由器有MAC地址。

我:哈???交换机不是工作第二层,为什么没有MAC地址???

度娘:交换机中是MAC表,而路由器中是路由表。

我:???

0 前言

关于交换机和路由器的区别,百度谷歌都看了很多,但一直感觉是一知半解,似懂非懂,所以今天决定将这块知识点从底层进行一个详细梳理,毕竟这也是面试的超高频问题。不过,阅读本文需要至少明白TCP/IP四(五)层模型,明白网络包的数据帧结构。

这篇文章通过交换机和路由器的本身结构,一点点揭露了两者本质上的区别,在写交换机时,还感觉得心应手,每一句话前后都有很强的关联性,但是在写路由器的过程中,发现一旦涉及到ip网络层,相关联的东西有点多,导致的结果就是需要的东西越写越多,不写使得文章不能够通俗易懂,写了又使得文章的知识密度极具增大,复杂性增高,可读性变差。所以思前想后,决定先在这篇文章中的路由器部分粗略介绍部分涉及计算机内部的知识,有不懂的任何问题都可以在评论区提出,然后会在另一篇文章中进行详细的扩展阐述。

1. 集线器和交换机

1.1 起源

最初人们的通话方式如下图,就是简单的一根线,连接两个传话筒。这样声音就能通过这跟线从一边传到另一边。我们这样设计的目的是:将声音尽可能原样的传送到目的地。

但是上述的传话方式只能在两者之间传输,为了能够让更多的人可以听到,后来的通信方式设计成类似这样:

多人传声筒

其实这形式已经非常接近以太网最初的模样了,只不过以太网中的信号是以数据包的形式存在,数据包的最外层裹着一层又一层不同的包头。大致如下图:

扯远了,不过先要知道,集线器和交换机最初设计的目的是:将载有信息的网络包尽可能原样的转发到目的地。真正以太网最初的原型如下图(a)。通过一个主干线将所有的计算机连接起来,每个计算器通过收发器来接收和发送消息到主干线上。它最主要的特点就在于,任何一台计算机发送信息到主干线后,所有的计算机都能够接收到(这一点很重要在后续会经常提到)。不过这个形态有个缺点是,一旦主干线出现问题,所有计算机的通信便被中断无法进行。所以后来演变为图(b)的形态。它将主干线换成了中继式集线器,将收发器网线替换成了双绞线,其中中继式集线器就是我们常说的集线器。不过,虽然网络的结构发生了变化,但集线器依然保留着原有的特性,即一台计算机发送的信息会被所有的计算机设备接收。而一直到图(c),交换式集线器(也就是我们常说的交换机)的出现,才改变了信号发送给所有设备这一性质,能够实现将信号发送到特定设备中。具体是怎么实现特定发送的呢?后续再说,我们先看集线器。

以太网基本结构

1.2 集线器

集线器的内部构造如图左侧所示(看的人多的话图片后续会重新绘制):

集线器网卡连接图(注意左侧集线器内部结构)

集线器

网卡

在集线器中,基本就分为三部分,RJ-45接口,PHY模块,中继电路。其中RJ-45接口就是我们日常常见的网卡的水晶头接口,RJ-45接口和PHY模块通过不同的接线方式配合,使得RJ-45接口有的用来和计算机相连,有的用来和另一个集线器相连。其中RJ-45的作用就是用来连接网线,而PHY模块的作用是将网线上传过来的不同格式的电信号转换为通用的格式发给中继电路,或者将要发送的电信号转换为可在网线上传输的格式。

要理解PHY模块的作用,首先要先了解每个网口,都可能接着网线( 废话),而每根网线的传输的格式都是有可能不同的。而PHY的作用,就是把这些格式转化为一个通用的格式。 举个例子。PHY就好比一个翻译器,有的人说英文,有的人说日文。但是PHY,会把它统一转为普通话,给内部电路处理。内部电路处理完之后,再经过PHY模块,转为英语,或日文从对应网口里输出 [1]。

另外,PHY模块还有一个作用是监控接收线路中有没有信号进来,如果有就需要等一段时间没有其他信号时再发送。

而后面中继电路的作用,就是将通过其中一个接口进来的信号输出到其它除该接口的所有接口中(或者叫端口)。但这种特性带来一个问题是,当同时有多个端口输入信号时,就会产生信号碰撞。解决办法后续再说,我们再来看交换机。

1.3 交换机

交换机的内部结构如下图所示:

据上图可以看出,交换机的内部基本由RJ-45、PHY、MAC模块、内存、交换电路、MAC地址表六部分构成。相比于集线器,其中RJ-45、PHY部分完全相同。中继电路换成了交换电路,同时也多出了内存模块、MAC模块、MAC地址表。

1.3.1 交换电路

我们一个个来说,先说交换电路,交换电路的设计结构如图所示:

它将每个端口都作为输入和输出端,并构成网格形式连接起来,每个输入输出端口线的交点处安置一个可以电子控制的交换开关,这样精确的控制信号的流向。合理控制交换开关,不仅可以使得1号端口的信号流向某一端口,还可以使得1号端口的信号流向所有端口,更牛逼的是还可以1到7,2到6,3到5等多个端口同时转发,最大效率利用端口。这样的设计,相比于之前集线器只能将信号发往所有端口的性质,可以说是实现了质的突破!

1.3.2 内存和MAC模块

再来说MAC模块(Media Access Control)。之前有说到PHY模块是处理电信号,而MAC模块的作用就是将经过PHY模块处理的通用格式的电信号转换为数字信号(从外向里看),或者将数字信号转换为通用格式的电信号(从里向外看)。将数字信号转换为电信号的方法是,在网络包的开头加上报头和起始帧分界符,在末尾加上检测错误的帧校验序列FCS,这里感兴趣可以自行查阅。

帧校验序列FCS一个32比特的数字,这个32比特的数字在数据包的末尾,一般在发送信息的时候会利用一个公式,对包中的从头到尾所有的内容计算得出FCS。之后在传输过程中只要网络包中只要有一位因为干扰等原因发生变化,FCS最后计算的值就会发生变化。在接收网络包时,通过对比发送和接收到的FCS是否相同,就可以判断数据传输是否出错。如果网络包出错就被交换机丢弃,没有问题就会存放到后面的内存中,这也正是内存模块的作用。(有关信息加密这里的有趣知识可以看看我的这篇文章:牛奶:信息加密的那些事)

这里需要强调的一点是:交换机的MAC模块不具有MAC地址(也叫硬件地址)。

之所以强调它,是因为网卡的结构的一部分和交换机极其类似,都有RJ-45、PHY、MAC模块、内存四部分。但是网卡有一个ROM只读存储模块,它里面保存有MAC地址,它用来代表一个网卡的唯一标识,这个MAC地址在网卡初始化之后需要分配给MAC模块。拥有MAC地址,网卡就可以作为以太网的接收方和发送方,它可以只接受转发给自己的,也就是MAC头部写的是自己MAC地址的网络包,而交换机因为没有MAC地址,所以它是无脑接收所有的网络包放到内存中,然后无脑转发。另外,网卡端口也可以配置IP地址,而交换机一般不配置。这个也是交换机和网卡的一个很重要的区别。

MAC地址是由48比特的16进制数表示,比如28:f9:d3:62:7d:31,它更像一个网络硬件设备的身份证号,而交换机没有这个身份证号。网卡的结构如图所示:

网卡解结构

1.3.2 MAC地址表

MAC地址表结构如下图所示:

它的主要构成就是MAC地址,交换机的端口号和控制信息。前面说到交换机有了能够信号在端口上一对一和一对多的硬件条件,但是一个数据包具体从某一端口进入后,需要往哪一个端口转发还不太清楚。而MAC地址表就是解决这一问题。如前所述,交换机的目的是尽可能的将网络包原样转发出去。所以它会先从缓冲区中拿起一个网络包,并从网络包中查看这个包的接收方MAC地址,也就是要转发给的下一个网络硬件设备的身份证号,从网络包中拿到号码后,它会从MAC地址表中核对看是否有相同的MAC地址,如果有,就从该行对应的端口将这个网络包转发出去,因为MAC地址表表明此时这个网络硬件设备就连接在交换机的这个端口上。如果没有,交换机就会将包转发到除了源端口之外的所有端口上。只有相应的接收者才能收到这个包,其他设备则会忽略这个包(这里仿佛又回到集线器时代,但偶尔回去一下是没关系的)。并且每一个给交换机发送过的硬件设备,它的MAC地址和进来的端口都会被保存到交换机的MAC地址表中,这样当下次有人想往这个硬件发送信号时,就可以迅速的找到并作为接收方。

当然,MAC地址表中的信息不可能永久存在,因为交换机的端口并不会永久的连接那几个设备,随时都有可能更换新的设备连接。所以这些记录一段时间(一般是几分钟)不使用后就会自动删除。交换机一般会自行更新和删除地址表中的记录,不需要手动维护。如果恰好在记录过时之后又收到新的网络包转发导致交换机报错,也没有什么太大问题,只要将交换机重启,MAC地址表就会被清空重新更新正确信息,交换机就又可以正常工作。

还有一个我觉得意义不大的特殊情况,就是交换机查询地址表时发现这个网络包的目标端口,和它本身的源端口是同一个端口,把集线器和交换机连接在一起时就会出现这种情况。这时为了避免报错交换机一般会直接丢弃这包。

1.3.3 信号碰撞

以太网最初的原型是“半双工”模式,即发送和接收不能同时进行。这就导致以太网规定,每次发送信号的时候,都要确保没有其他设备也在发送信号,如果检测到,就需要等待其他设备发送完毕才能通过MAC模块将数字信号转换电信号发送出去,否则就会发生信号碰撞。在发送过程中还要对接收信号进行监控,如果发送过程中检测到其他设备发送信号,就意味着出现了信号碰撞,这时需要发送阻塞信号以停止网络中所有的发送操作,等待一段时间后再尝试重新发送。在很久之前将集线器和交换机相连后,采用的就是半双工模式的工作方式。

但只要撇开集线器,比如将交换机和路由器相连时,交换机的端口就会自动切换为全双工的工作模式,即发送和接收利用连根独立的双绞线可以同时进行。全双工模式是交换机特有的工作模式,集线器不具备这样的特性,这也是从集线器到交换机升级后的第二个最重要的特质。在全双工的工作模式下,也就不存在信号碰撞问题,相对于半双工模式,传输速度更快,传输的数据量更大,性能也更高。

当然,并不代表交换机只保留全双工模式就好,因为可能还有很多设备不支持全双工只支持半双工。所以交换机同时保留两者。如何在全双工和半双工模式之间进行合理自动切换又成了新的问题。为了解决这个问题,后来给交换机添加自动切换的功能,称为自动协商。

1.4 交换机应用

集线器的英文名是repeater hub,交换机的英文名是switching hub。发现没,它们都叫hub,hub这个词字典上说是车轮的中心部分。自行车的车轮外面一圈是橡胶胎,辐条从车轮边缘一直汇聚到位于中心的轴,这个轴就是hub[2]。所以hub的作用其实就是把所有的网线汇聚到一起。汇聚到一起之后,就可以构成一个小型的局域网。在交换机的端口上可以连接PC机、及网络打印机、服务器等网络设备。当然这里仅指局域网交换机,从广义上来看,交换机还包括广域网交换机,主要应用于电信领域,提供通信基础平台。但基本离不开hub的本义。

我记得以前看《任正非传》时,华为创业过程中的一个很重要的产品就是数字程控交换机。我们曾经体验到的电话语音服务、缩位拨号、来电显示、叫醒业务、呼叫转移等,就是由程控交换机开创性实现的。

1.5 VLAN

VLAN产生的原因:二层交换机有一个很大的问题是,当一个数据帧根据MAC地址表从一个接口转发出去之后,和这个接口相连的该网段的所有主机设备都会收到这个数据帧。如果在MAC地址表中找不到匹配MAC地址时,又会产生无脑广播,这里便存在安全和带宽利用率增加的问题。为了能够在二层交换机上实现一对一或者一对一组的传输形式,于是出现了VLAN。

VLAN(Virtual Local Area Network)定义:即虚拟局域网,是将一个物理的LAN(局域网)在逻辑上划分成多个广播域(多个VLAN)的通信技术。

它实现了将连接在交换机上的主机用户划分为多个组,大家只能在组内通信,广播的时候也是只有相同的vlan组才能接收到。

带有vlan标签的帧格式如下:

vlan标签一般放在目标MAC地址和源MAC地址之后,里面有个VLAN ID,相当于一个传输身份证,用来区分所在组别。这个标签是数据帧进入交换机接口的时候,交换机根据交换机接口内部PVID(Port DefaultVLAN ID)进行添加的,注意交换机有很多的输入接口,每个接口的PVID可能是不同的。交换机转发出去时,也只能从VLAN相同的接口转发出去(交换机有很多的输出接口)。即对于支持VLAN技术的交换机,转发以太网帧时不再仅仅依据目的MAC地址,同时还要考虑该端口的VLAN配置情况。

交换机的接口类型有三种:Access类型端口、Trunk类型端口、Hybrid类型端口。Access类型用于交换机和其他非交换机设备连接,Trunk类型用于交换机和交换机之间进行连接,Hybrid类型综合了前两者的特点。

Access类型端口:

(1)如果收到的数据帧没带标签,就给它打上对应接口的PVID标签。出相同VLAN ID的交换机接口的时候把标签拆掉。

(2)数据帧带了标签,和接口的PVID相同,就通过这个接口,出相同VLAN ID的交换机接口的时候把标签拆掉。不相同就丢弃。

Access类型一般只允许一个VLAN帧通过,Trunk类型实现了可以让多个不同VLAN ID类型的数据帧通过。

Trunk类型端口:

(1)如果收到的数据帧没带标签,要先判断接口的PVID 是否为允许通过的VLAN(因为trunk接口可以设置多哪几个vlan允许通过)。

如果允许,就给它打上对应接口的PVID标签。出相同VLAN ID的交换机接口的时候把标签拆掉。出不同VLAN ID的端口时不处理,直接传过去。

如果不允许,直接丢弃。

(2)数据帧带了标签,要先判断标签是否为允许通过的VLAN

如果允许,并且和接口的PVID相同,就通过这个输入接口,出相同VLAN ID的交换机接口的时候把标签拆掉。出不同VLAN ID的端口时不处理,直接传过去。

如果不允许,直接丢弃。

Hybrid类型端口:

这种类型的收发和Trunk类型基本相同,不过是在发送的时候,它可以设置输出接口是带标签发送还是不带标签发送,从而实现Access和Trunk两种功能。

2. 路由器

有了交换机之后,就可以把很多人的电脑连接起来相互通信,但是全球那么多人,就需要无数台交换机,这样显然不太现实,为了解决这个问题。于是就有了路由器,通过在网络层进行工作,摆脱了在数据链路层和物理层的硬件限制,从而使得更多的网络设备能够进行通信。

在之前,计算机所发出的网络包,都是先经过集线器和交换机进行区域性汇总,然后再转发给路由器一步步连接到互联网的。所以路由器距离互联网更近。这首先是两者宏观的一个小区别,我们接下来详细看看路由器结构:

路由器大致分为两个模块:转发模块和端口模块。端口模块的灵活性非常大,可以安装类似于交换接口的以太网接口(水晶头接口),也可以安装ADSL端口(非对称数字用户线路,可以用来拨号上网)、FTTH端口(光纤到户网络)、无线局域网端口等。从计算机到互联网的过程中,其实需要许多不同种类的路由器之间的相互配合,不过我们这里只重点看下以太网路由器。它由以太网端口和路由表组成。

2.1 端口模块

以太网端口由RJ-45接口、PHY模块、MAC模块和内存模块构成。和交换机相比,没有了交换电路,MAC地址表换成了路由表,其他的好像都相同。但是!路由器是有MAC地址的!也就说它也有一个ROM只读存储模块,所以它更像网卡。

路由器的端口模块几乎可以看成一个网卡路由器端口模块和交换机的区别,也就是交换机和网卡的区别——网卡具有MAC地址并且可以配置IP地址。(路由器的转发模块,其实也同样类似于计算机协议栈中的IP模块,IP模块给数据包添加IP头部和MAC头部,根据路由表判断通过哪个网卡转发信息,同样路由器也负责添加MAC头部,但是不会改变网络包中的最终IP地址,另外根据路由表判断下一跳转发哪个路由器。计算机中通过route print命令可以来显示路由表)

路由器在接收数据时,首先信号到达网线接口部分,PHY模块将特定的电信号转换为通用格式的电信号,然后交给MAC模块;MAC模块将电信号转换为数字信号,并对包末尾FCS进行错误校验,没问题之后还需要检查MAC头部的接收方地址是否是自己的MAC地址,是的话就把包放进缓冲区,不是的话就丢弃。路由器完成接收操作后就会丢弃MAC头部,它的使命已经完成,因为在发送网络包的时候,路由器的MAC地址会称为新的发送方MAC地址。

在发送数据时,网卡不能像交换机一样单独工作,它需要配合网卡驱动程序。在打开计算机启动操作系统的时候,网卡驱动程序会对硬件进行包括错误检查、初始化设置、从ROM中读取MAC地址分配给MAC模块等初始化操作。之后等待IP模块的委托,网卡驱动从IP模块(针对路由器就是转发模块)获取包之后,会将其复制到网卡内的缓冲区,然后委托MAC模块发送包。之后的过程就和交换机相同了,MAC模块添加报头等信息再转交给PHY模块发送出去。

所以路由器同样在开启路由器时,就已经初始化好了MAC地址。它首先通过路由表确定转发端口后(后面会有具体介绍),在该端口会对网络包进行改造,添加自身的MAC地址作为源MAC地址,根据ARP协议和目标IP地址找到相邻的MAC地址写入目标MAC地址,最后MAC模块添加报头等信息再转交给PHY模块发送出去。

2.2 转发模块

路由器的端口模块是负责网络包的收发操作,而转发模块则是负责网络包的转发目的地。转发模块的核心是路由表。交换机收到网络包后会根据目标MAC地址查询MAC地址表找到对应端口后转发出去,而路由器收到网络包之后,会查看其中的目标IP地址,根据IP地址查看路由表确定转发端口。路由表的结构如下图:

路由表从左到右依次是:目标地址、子网掩码、网关、接口(即转发端口)、跃点数。

2.2.1 目标地址和子网掩码

目标地址一栏表示的是”残缺的接收方的IP地址“,因为它只包含表示子网的网络号部分的比特值,而表示主机号部分的比特值全部为0。(每个IP地址都被分为两个部分即网络地址和主机地址。这样做的目的是为了在路由器转发数据包时更方便的寻址,就像邮递员送信时先把同一个省的邮件放在一起,然后同省中同一个市的邮件在放在一起进行寄送一样。那最终的收信人可能是同一个市的但住址门牌号不同。路由器先看数据包的中目的IP的网络地址,把这个数据包送到某个网络时后再根据该数据包中目的IP的主机部分从该网络中找到目的主机。所以我们可以认为网络地址=网络号,主机地址=主机号)

怎么区分网络号呢?一般将真实的IP地址和其对应的子网掩码进行与运算,得到的就是这个IP地址网络号的部分,剩下的就是主机号的部分。交换机在匹配网络包时,是将网络包的MAC地址和MAC地址表进行完全匹配,而路由器在匹配网络包时,是读取出网络包中的IP地址,首先将它和路由表每一行的子网掩码进行与运算,如果得到的网络号和前面的目标地址匹配,才会选择这一行后面对应的端口作为转发的输出端口。

有时候目标地址也表示”多个残缺的接收方的IP地址“,不再表示一个。如下图所示,

我们现在有3个子网,分别为10.10.1.0/24、10.10.2.0/24、10.10.3.0/24(后面的24表示二进制的前24位是网络号),路由器B需要将包发往这3个子网。在这种情况下,路由器B的路由表中原本应该有对应这3个子网的3条记录,但在这个例子中,无论发往任何一个子网,都是通过路由器A来进行转发,因此我们可以在路由表中将这3个子网合并成10.10.0.0/16,这样也可以正确地进行转发,但我们减少了路由表中的记录数量,这就是路由聚合。经过路由聚合,多个子网会被合并成一个子网,子网掩码会发生变化,同时,目标地址列也会改成聚合后的地址。相对地,也可以将一个子网IP地址拆分成多条记录注册到路由表中。所以路由表中目标地址中的地址,和实际端口外连接的子网或者计算机的网络号可能并不完全相同。

如果发现路由表的多行目标地址都可以匹配,那么首先选择网络号比特数最长的那条记录。网络号比特数越长,说明主机号比特数越短,也就意味着该子网内可分配的主机数量越少,即子网中可能存在的主机数量越少,这一规则的目的是尽量缩小范围,所以根据这条记录判断的转发目标就会更加准确。

如果匹配多个网络号长度相同的记录,那么优先选择跃点数最小的记录。

之前说路由器的转发模块相当于计算机的ip模块,ip模块会给数据包添加好MAC头部,所以路由器的转发模块除了路由表。也负责在接收网络包的时候给网络包更换MAC头部。

这里有个疑问?

路由表的目标地址一栏的ip地址,到底是最终接收方ip地址的网络号,还是下一跳路由器的网络号?我一直以为是最终接收方的,但书里一句话让我蒙了,它说“arp协议根据路由表中下一跳路由器的ip地址找到下一跳路由器的mac地址”所有有点晕了?希望看的大佬可以解答下。 

“在创建MAC头部时,也是从IP的路由表中查找出下一个路由器的IP地址,并通过ARP查询出MAC地址,然后将MAC地址写入MAC头部中的,这表示IP对以太网的委托只是将包传输到下一个路由器就行了。”

答案:

这里的目标地址代表的就是最终目标的IP地址,而网关这一列才真正表示下一跳路由器的IP地址,而ARP协议应该是根据网关这一列的IP地址从而找到下一跳路由器的MAC地址。有时候网关为空,那说明路由表那一列的IP地址既是下一跳的路由地址,也是最终目标的子网地址。

2.2.2 网关、接口和跃点数

如果匹配不到目标地址怎么办?

不可能匹配不到。仔细观察会发现,最后一行的子网掩码是0,任何IP地址和该子网掩码进行与运算结果都是0.0.0.0,都会和最后一行匹配。这一行被称为默认路由,专门用于匹配不到的情况。此时网关中的IP地址就作为目标地址存在。这一行配置的网关地址被称为默认网关。在计算机的TCP/IP设置窗口中也有一个填写默认网关的框,和这里的默认网关是相同的作用。

如果网关是一个IP地址,则这个IP地址就是我们要转发到的目标地址;如果网关为空,则IP头部中的接收方IP地址就是要转发到的目标地址。在寻找目标IP地址时,路由表中网关的优先权大于目标地址。之所以会这样就是因为目标地址代表最终目标的IP地址,而网关这一列表示下一跳路由器的IP地址。

一旦匹配成功,数据包就会从匹配行后面的接口(也称为端口)转发出去。可以发现,这里和交换机一样,最终的目的都是确定一个输出端口。这里的跃点数表示路由器距离IP地址的远近程度,数字越小,距离越近。

2.2.2 路由表维护

交换机中,在对网络包进行转发的过程中,就能够完成对MAC地址表的更新维护;但路由器对路由表的更新维护和包转发操作是相互独立的,在转发包的时候是不需要对路由表进行维护。一般路由表的维护方法有两种:

(1)有人手动维护路由记录。

(2)根据RIP、OSPC、BGP等路由协议进行自动维护。

3. 总结

在了解交换机和路由器的构造和工作原理之后,接下来对交换机和路由器的区别进行一下汇总:

(1)交换机工作在数据链路层和物理层,路由器工作在网络层、数据链路层和物理层。之所以这样是因为它们面对不同规模的网络设备,所以需要不同的对网络包的转发方式。交换机多用来组建局域网,而路由器可以将组件好的局域网相连。也可以说路由器实现了不同网络之间的数据转发,交换机实现了特定网络内的数据交换。我更觉得,路由器是交换机的升级版,交换机能做的,路由器几乎都能做。

(2)因为工作在不同的层,所以尽管它们分别拥有MAC地址表和路由表两种不同的表,且转发方式不同,一个根据MAC地址转发,一个根据IP地址转发。

(3)因为转发方式不同,它们对各自的MAC地址表和路由表的维护方式也不同。

(4)尽管交换机的端口和路由器端口模块类似,但是交换机不具有MAC地址,只是单纯的接收所有正常的网络包并转发。而路由器会通过MAC地址对网络包进行过滤。

另外,路由器还有地址转换、防火墙等功能,不过这更和交换机扯不上关系了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023五一数学建模A题完整思路

已更新五一数学建模A题思路,文章末尾获取! A题完整思路: A题是一个动力学问题,需要我们将物理学概念运用到实际生活中,我们可以先看题目 问题1: 假设无人机以平行于水平面的方式飞行,在空中投…

Windows11安装sqlserver2012失败后解决方案

首先卸载 WinR打开运行输入services.msc查看所有服务/或者我的电脑管理找到服务列表/任务管理器进入服务列表,停止所有与Sql Server有关的服务,如下: 打开控制面板-卸载sqlserver所有相关软件; 删除SQL Server相关注册表&#…

【观察】中国软件行业进入“重构期”,看浪潮海岳如何“开新局”

众所周知,改开四十多来年,中国软件产业在经历了萌芽与低谷、摸索与转型后,逐步进入了快速发展期。特别是过去几年,在新的发展格局,信创替代的进程中,整个中国软件业更是加速进入了全新的“重构期”。 在此过…

Unity API详解——Quaternion类

Quaternion类又称四元数,由x、y、z和w这4个分量组成,属于struct类型。在Unity中,用Quaternion来存储和表示对象的旋转角度。Quaternion的变换比较复杂,对于GameObject一般的旋转及移动,可以用Transform中的相关方法实现…

CH32V307环境参数在线监测系统(一)

CH32V307环境参数在线监测系统是以CH32V307VCT6为核心,由ESP8266模块、DHT11温湿度传感器模块、TFT LCD显示屏组成。系统实物图如下所示: 系统功能主要有RTC实时时钟、WIFI网络授时、DHT11温度测量、温湿度数据实时上传到onenet平台、屏幕定时刷新等功能…

在Docker上安装和运行MySQL容器(纯步骤)

在Docker上安装和运行MySQL步骤 本文章只有操作步骤,没有原理解释,只是在学习当中提醒自己安装步骤。 第一步:从远程仓库拉取MySQL镜像 1.从远程仓库搜索mysql镜像 docker search mysql2.pull拉取镜像 这里我选择的是mysql的5.7版本 docker…

盘点 5 个 yyds 的 AI 绘画辅助工具

国外著名的 AI 作图工具 Midjourney、Stable Diiffusion 都可以根据你输入的指令生成一张图片。 如果你想输出高质量的图片,需要掌握一些 prompt 指令技巧。本文章便盘点了 5 个 GitHub 上的开源项目,引领你更好的上手 AI 作图。 本期推荐开源项目目录&…

软件杯龙源风电赛题培训!千万分钟数据和全流程基线等你来战

‍‍ “中国软件杯”大学生软件设计大赛是一项面向中国在校学生的公益性赛事,大赛由国家工业和信息化部、教育部、江苏省人民政府共同主办,是全国软件行业规格最高、最具影响力的国家级一类赛事。其中,作为重点赛题的龙源风电赛,上…

我们分析了9.12亿篇博客文章,得出了11条内容营销发现

我们分析了 9.12 亿篇博客文章,想要更好地了解目前的内容营销领域。 具体来说,我们研究了这些文章的内容格式、字数和标题等因素与社交媒体分享和反向链接的关联性。 在我们的数据合作伙伴BuzzSumo的帮助下,我们有了一些非常有趣的发现。 …

Dex-Net使用手册————GQCNN网络

1. Dex-Net Package GitHub - BerkeleyAutomation/dex-net 🎈dex-net Python 包用于打开、读取和编写 HDF5 数据库的 3D 对象模型、平行下颚抓取和掌握鲁棒性指标。 🎈HDF5数据库还可用于生成大量数据集,将点云和抓取的元组与二进制抓取鲁棒…

【Python】【进阶篇】12、搭建Django开发环境

目录 搭建Django开发环境1. 安装Python解释器2. 安装MySQL数据库3. 安装Python包管理器4. 安装 Pycharm IDE 搭建Django开发环境 上一章我们介绍了 Django 框架的重要组件,常言道“工欲善其事,必先利其器”,在正式创建 Django 项目之前&…

AI绘画——Lora模型Niji-Expressive V2 launch(灵动优雅,张力尽显)

目录 Niji-Expressive V2 launch!! 灵动优雅,张力尽显 Vivid and elegant, full of tension 模型演示(多图预警) Niji-Expressive V2 launch!! 灵动优雅,张力尽显 本次升级泛用性,能在更多模型和采样方式上适用 …

《一文带你读懂:云原生时代业务监控》

点击上方蓝字关注我们! 对业务来说,完备的应用健康性和数据指标的监控非常重要,通过采集准确的监控指标、配置合理的告警机制,我们能够提前或者尽早发现问题,并做出响应、解决问题,进而保证产品的稳定性&am…

vue性能优化之虚拟列表滚动

一、前言 前端的性能瓶颈那就是页面的卡顿,当然这种页面的卡顿包含了多种原因。 例如HTTP请求过多导致数据加载变慢,下载的静态文件非常大导致页面加载时间很长,js中一些算法响应的时间过长等。很多前端工程师都花费很多的精力在dom渲染上来…

Java 入门 - 语法基础

hello world public class Hello {public static void main(String[] args) {System.out.println("hello world");} } 复制代码 public: 是关键字;表示公开的class: 是关键字;用来定义类Hello: 是类名;大小写敏感;命名…

BFS算法专题

BFS算法专题 框架篇LeetCode 111. 二叉树的最小深度解题思路代码实现 LeetCode 752. 打开转盘锁解题思路代码实现 LeetCode 773. 滑动谜题解题思路代码实现 总结 不要纠结,干就完事了,熟练度很重要!!!多练习&#xff0…

Vivado约束添加方法:一文全面解析IO和时序约束

FPGA开发离不开IO约束和时序约束,IO约束用于确定输入/输出端口的物理端口和电气特性,与芯片和电路设计有关。而时序约束则用于设定FPGA设计中的时序特性,以确保系统能够在预期时钟频率下正常运行。本文将介绍vivado中常见的设置约束的方法。 …

mysql 如何避免索引失效

案例演示 建表及初始化数据 CREATE TABLE staffs (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(24) NOT NULL DEFAULT ,age INT NOT NULL DEFAULT 0,pos VARCHAR(20) NOT NULL DEFAULT ,#职位add_time TIMESTAMP NOT NULL DEFAULT CURREN…

二维码在设备点维一体化管理中的应用

随着科技发展,设备点维一体化管理体系应运而生,该管理体系的出现让设备维护保养变得更加高效精细化。 设备点维一体化管理体系以设备点检和维护保养为基础,通过日常、专业及精密点检,对点检测得的数据和设备给油脂保养情况进行统…

一个开源、免费在线数据建模、元数据管理平台,简单易用

一、开源项目简介 ERD Online 是一个开源、免费在线数据建模、元数据管理平台。提供简单易用的元数据设计、关系图设计、SQL查询等功能,辅以版本、导入、导出、数据源、SQL解析、审计、团队协作等功能、方便我们快速、安全的管理数据库中的元数据。 二、开源协议 …