图解 STP
网络环路
现在我们的生活已经离不开网络,如果我家断网,我会抱怨这什么破网络,影响到我刷抖音、打游戏;如果公司断网,那老板估计会骂娘,因为会影响到公司正常运转,直接造成经济损失。网络通信中,通常是以一条链路能够正常工作为前提,如果链路断开或节点故障,那么互联的设备就无法正常通信了,这类网络问题叫做单点故障。没有备份的链路或节点,出现故障会直接断网。
如果要提供 7×24 小时不间断的服务,那就需要在网络中提前部署冗余。避免出现单点故障,合理的做法是在网络中的关键设备和关键链路添加冗余。在冗余的网络环境中,任意一条链路发生故障断开,都不会影响网络,直接使用其它链路继续转发数据,解决单点故障的隐患。
但同时也带来了另外的网络问题。这种组网会构成二层环路,会引发广播风暴、重复帧、MAC 地址漂移等问题,严重时会占满链路带宽,或打爆设备 CPU ,导致设备无法正常工作,最终造成网络瘫痪。当然,在实际的网络中,不少二层环路是由于人为的错误操作导致的,比如接错了网线。
举个例子:
大刘的主机想要与小美的主机进行通信,现在只知道小美主机的 IP 地址,不知道 MAC 地址。有 IP 地址,就可以通过 ARP 协议来获取小美主机的 MAC 地址。我们来看看有冗余的网络中数据交换的过程:
大刘主机向交换机 A 发送 ARP 广播帧,来解析小美主机的 MAC 地址;
交换机 A 收到广播帧后,查看自己的 MAC 地址表,没找到相应的表项,就向所有端口(除接收端口之外)泛洪这个广播帧。也就是向 G0/1 和 G0/2 两个端口泛洪广播帧;
交换机 B 和交换机 C 收到广播帧后,没有对应 MAC 地址表项,也将广播帧所有端口(除接收端口之外)泛洪出去;
小美主机终于收到了大刘发送的 ARP 广播帧,发现是查询自己的 MAC 地址后,小美主机将会通过单播帧返回自己的 MAC 地址;
这个过程看似正常,大刘主机发送的 ARP 广播帧顺利到达小美主机,小美主机也进行了响应,但是网络中广播帧的传输还没有结束。在第 3 步中,交换机 C 也把 ARP 广播帧泛洪到交换机 B 。这时交换机 B 就收到了两个相同的 ARP 广播帧,分别来自交换机 A 和交换机 C ,收到的广播帧都会泛洪出去。那么,小美主机也会收到两个相同的 ARP 广播帧,也就是重复帧。出现这种现象说明网络中存在不合理的冗余链路;
接下来我们看下交换机 C ,交换机 C 收到从交换机 A 发过来的广播帧,同时交换机 C 的 MAC 地址表添加一条表项,记录大刘主机 MAC 地址和端口 G0/0 的映射关系。交换机 C 又从交换机 B 收到相同的广播帧,大刘主机 MAC 地址的映射端口从 G0/0 变成 G0/1 。从不同的端口收到相同的数据帧,导致 MAC 地址表项发生变化的现象,就叫做 MAC 地址漂移,这种现象说明网络中可能存在环路。这样一来,交换机 C 就无法确定大刘主机到底位于自己的哪个端口;
主机收到广播帧,会进行解封装,查看上层的 IP 地址是否是发送给自己的,再进行下一步处理。交换机(只指二层交换机)收到广播帧,会直接进行泛洪。大刘主机发出的广播帧,经过交换机 A 后,从交换机 A 的 G0/1 口泛洪的广播帧,交换机 B 收到后再从 G0/2 口进行泛洪,交换机 C 收到广播帧后,又从 G0/0 口泛洪出去,结果广播帧回到了交换机 A ,交换机 A 再从 G0/1 进行泛洪,最终这个广播帧会一直逆时针、永无止境的进行泛洪;同理,交换机 A 从 G0/2 口进行泛洪的广播帧,也会按顺时针、无休止的在三台交换机上进行泛洪。这种广播帧不停泛洪的现象,叫做广播风暴。广播风暴不仅会大量消耗网络设备的带宽和 CPU 使用率,也会影响到主机。主机收到一个广播帧后,会解封装上送网络层去处理,大量的广播帧泛洪,很可能导致主机瘫痪。
通过这个简单的演示,我们看到了冗余链路带来的风险。重复帧、MAC 地址漂移和广播风暴,都是由一个广播帧引起的,可是网络中不可避免出现广播帧,也不能因为二层环路问题而忽略冗余链路增加网络可靠性的好处。
那么如何在保证网络冗余的情况下,消除二层环路呢?实际上交换机的二层环路是一个典型问题,解决方案也有不少。其中的一个解决方案就是 STP(生成树协议),能够阻断冗余链路来消除可能存在的环路,并且在网络故障时激活被阻断的冗余备份链路,恢复网络的连通性,保障业务的不间断服务。
当网络中部署了 STP 后,交换机之间会交互相关协议报文,并计算出一个无环路的网络拓扑。当网络存在环路时,STP 会将网络中的一个或多个接口进行阻塞,将环路网络结构修剪成无环路的树状网络结构。被阻塞的接口不再转发数据,这样二层环路问题便迎刃而解。STP 会持续监控网络拓扑状况,当网络拓扑发生变化时,STP 能够及时感知,并动态调整被阻塞接口,而无需人工干预。
STP 基本概念
STP 是用在局域网中消除数据链路层物理环路的协议,标准名称是 802.1D 。STP 带来的好处有:
消除环路:STP 可以通过阻塞冗余端口,确保网络无环且连通;
链路备份:当使用的链路因故障断开时,可以检测到这种情况,并自动开启阻塞状态的冗余端口,网络迅速恢复正常。
在了解 STP 的原理之前,我们先来看看几个专业术语:
1、桥 ID( Bridge ID ,BID )
在公司内我们使用资产编号标记不同的设备,在 STP 里我们使用不同的桥 ID 标识不同的交换机。每一台运行 STP 的交换机都有一个唯一的桥 ID 。桥 ID 一共 8 字节,包含 2 字节的桥优先级和 6 字节的桥 MAC 地址。桥优先级的值可以人为设定,默认值是 32768 。桥 MAC 地址通常是交换机默认 VLAN1 的 MAC 地址。
2、根桥( Root Bridge ,RB )
STP 要在整个二层网络中计算出一棵无环的 “ 树 ” ,树形成了,网络中的无环拓扑也就形成了。其中最重要的就是树根,树根明确了,“ 树枝 ” 才能沿着网络拓扑进行延伸。STP 的根桥就是这棵树的树根。当 STP 启动后,第一件事就是在网络中选举出根桥。在一个二层网络中,根桥只有一个,其余设备都是非根桥。当网络的拓扑发生变化时,根桥也可能会发生变化。
网络中桥 ID 最小的交换机将成为根桥。在比较桥 ID 大小时,首先比较的是桥优先级,桥优先级的值最小的交换机选为根桥;如果桥优先级相同,那么会比较 MAC 地址,MAC 地址最小的交换机选为根桥。
3、根路径开销( Root Path Cost ,RPC )
STP 交换机每一个端口都对应一个开销值,这个值表示数据通过端口发送时的开销,这个值与端口带宽有关,带宽越高,开销值越小。对于端口开销值的定义有不同的标准,通常设备默认使用 IEEE 802.1t 中定义的开销值,同时还支持其它标准,以便兼容不同厂家的设备。
非根桥到达根桥可能有多条路径,每条路径都有一个总开销值,也就是根路径开销( RPC ),这个值是通过这条路径所有出端口的开销值累加而来的。STP 不会计算入端口的开销,只在数据通过端口发出时,才计算这个端口的开销。对于根桥来说,根路径开销是 0 。
4、端口 ID( Port ID ,PID )
运行 STP 的交换机使用端口 ID 标识每个端口,端口 ID 主要用于选举指定端口。端口 ID 长度为 16 比特,其中前 4 比特是端口优先级,后 12 比特是端口编号。在进行比较时,先比较端口优先级,优先级小的端口优先;在优先级相同时,再比较端口编号,编号小的端口优先。通常情况下,端口编号无法改变,可通过设置端口优先级来影响生成树的选路。
5、BPDU
STP 协议使用 BPDU 报文进行交互,BPDU 包含与 STP 协议相关的所有信息,并且使用这些信息来完成生成树的计算。BPDU 是组播帧,地址为 0180-c200-0000 ,并由 STP 交换机产生、发送、接收、处理,终端主机不参与。BPDU 分为两种类型:
配置 BPDU( Configuration BPDU ):在 STP 的初始化过程中,每台交换机都会产生并发送配置 BPDU 。在 STP 树形成后的稳定期,只有根桥才会周期性地发送配置 BPDU ;相应的,非根桥会从自己的根端口收到配置 BPDU ,并更新自己的配置 BPDU ,再从指定端口发送出去。这个过程看起来像根桥发出的配置 BPDU 逐跳的经过了其它交换机。
配置 BPDU 的参数详情如下:
拓扑变化通知 BPDU( Topology Change Notification BPDU ):简称 TCN BPDU ,是非根桥通过根端口向根桥发送的。当非根桥检测到拓扑变化后,就会生成一个描述拓扑变化的 TCN BPDU ,并从自己的根端口发送出去。
STP 树的生成
STP 的基本原理是在一个有二层环路的网络中,交换机通过运行 STP ,自动生成一个没有环路的网络拓扑。这个无环网络拓扑也叫做 STP 树( STP Tree ),树节点为某些交换机,树枝为某些链路。当网络拓扑发生变化时,STP 树也会自动地发生相应的改变。
STP 树的生成过程是:首先选举根桥,然后确定根端口和指定端口,最后阻塞备用端口。既然是选举,我们就看下参选者和选举范围。
STP 是通过比较 BPDU 中的信息进行选举的,最终的结果是:
在整个 STP 网络中,唯一的一个根桥被选举出来;
对于所有的非根桥,选举出根端口和指定端口,负责转发数据;落选的端口就是备用端口,处于阻塞状态,不能转发数据。
1、选举根桥
根桥是 STP 树的根节点。要生成一棵 STP 树,首先要确定一个根桥。根桥是整个二层网络的逻辑中心,但不一定是物理中心。
在 STP 交换机刚连接到网络时,每台交换机都以自己为根桥,从所有启动的端口发送 BPDU ,宣告自己是根桥。收到 BPDU 的交换机会比较 BPDU 中的根桥 ID 与自己的根桥 ID ,选择根桥 ID 值小的配置成自己 BPDU 中的根桥 ID 。交换机不停地交互 BPDU ,同时对根桥 ID 进行比较,直至选出一台根桥 ID 最小的交换机作为根桥。根桥会在固定的时间间隔发送 BPDU ,其它设备对 BPDU 进行转发,从而保证网络拓扑的稳定。
根桥交换机往往会承担这个网络中最大流量的转发工作,我们希望性能最高的交换机当选根桥交换机。但是 STP 在选举时,并不会把交换机的性能列入考量。为了让网络流量更合理的转发,可以通过配置桥优先级的值来影响根桥的选举。
同时,根桥是可以抢占的,在 STP 完成网络收敛后,如果网络中接入一台新的交换机,且新增交换机的优先级比根桥交换机更优,那么新增交换机会成为网络中新的根桥。同时,STP 将会重新收敛、重新计算网络拓扑,这个过程会引发网络震荡,对流量的正常转发造成影响。
2、选举根端口( Root Port ,RP )
根桥选举出来后,其它没有成为根桥的交换机称为非根桥。STP 会为每个非根桥选举一个根接口,也就是在交换机的所有端口中,选择距离根桥最近的一个端口,这就是根端口。
在 STP 树形成后的稳定期,根桥依然会周期性的向网络中发送 BPDU ,而非根桥的根端口会收到 BPDU ,并向指定端口发送出去。
那是如何选择根端口的呢?根桥周期性的发送 BPDU ,非根桥的所有端口都能收到 BPDU ,对比端口收到的 BPDU 中的参数值。
选择根路径开销( RPC )最小的端口;
如果 RPC 相同,那就选对端桥 ID( BID )最小的端口;
如果对端桥 ID 相同,那就选对端端口 ID( PID )最小的端口。
准确的说,选举根端口的目的是选举出 STP 网络中每台交换机上与根交换机通信效率最高的端口。
3、选举指定端口( Designated Port ,DP )
根端口确保了交换机到根桥的路径是唯一的,也是最优的。网络中的每条链路与根桥之间的路径也要是唯一且最优的。当一条链路中有两条或两条以上的路径到达根桥,就必须确定出一个唯一的指定端口,防止出现二层环路。指定端口不但是这条链路内所有端口中到达根桥的最优接口,还会向链路内发送 BPDU 。
虽然选举指定端口的范围和根端口不同,但是选举的原则是一致的。指定端口的选举同样会按照以下过程进行:
选择根路径开销( RPC )最小的端口;
如果 RPC 相同,那就选对端桥 ID 最小的端口;
如果对端桥 ID 相同,那就选对端端口 ID 最小的端口。
如果有人不小心将同一台交换机上的两个端口用网线连接起来,网络中就会产生环路。选举指定端口就是为了预防这种错误连接导致环路的情况。当出现这种连接时,STP 会以端口 ID 较小的端口作为指定端口,从而打破环路。
为什么根桥交换机的所有端口都是指定端口呢?
因为根桥交换机端口的根路径开销都是 0 ,根据选择选举原则,成为这条链路的指定端口。
4、阻塞备用端口( Alternate Port ,AP )
在确定了根端口和指定端口后,交换机上剩下的非根端口和非指定端口都叫做备用端口。备用端口是打破环路的关键,STP 会对这些备用端口进行逻辑阻塞。逻辑阻塞,是指端口不会接收或发送任何数据,但是会监听 BPDU 。当网络的一些端口出现故障时,STP 会让备用端口开始转发数据,用来恢复网络的正常通信。
三种端口的异同如下:
一旦备用端口被逻辑阻塞后,STP 树的生成过程就完成了。
STP 端口状态机
STP 不但定义了 3 种端口角色:根端口、指定端口、备用端口,还讲定义了 5 种端口状态:禁用状态、阻塞状态、侦听状态、学习状态、转发状态。
STP 交换机的端口启动时,首先会从禁用状态自动进入到阻塞状态。在阻塞状态,端口只能接收和分析 BPDU ,不能发送 BPDU 。如果端口选为根端口或指定端口,则会进入侦听状态,这时端口可以接收并发送 BPDU ,这种状态会持续一个 Forward Delay 的时间,默认是 15 秒。15 秒后端口会进入到学习状态,并持续一个 Forward Delay 的时间。学习状态的端口可以接收和发送 BPDU ,同时开始进行 MAC 地址学习,为数据转发做好准备。最后,端口由学习状态进入到转发状态,就开始进行数据转发。在整个状态的迁移过程中,端口一旦关闭或发生链路故障,就会进入到禁用状态;如果端口不再是根端口或指定端口,那么端口状态会立刻退回到阻塞状态。
在 STP 的生成过程中,为什么要有两个 Forward Delay 时间?
在侦听状态有一个 Forward Delay 的时间,是因为 BPDU 泛洪到全网需要一定的时间,STP 完成全网拓扑的计算同样需要时间,所以停留 15 秒让 STP 有充分的时间计算全网拓扑,避免网络中出现临时的环路。在学习状态又有一个 Forward Delay 的时间,是由于交换机的接口上未学习到任何 MAC 地址,需要时间学习 MAC 地址,避免网络中出现不必要的数据帧泛洪现象。停留 15 秒,为进入转发状态做好准备。
STP 时间参数
STP 定义了 3 个重要的时间参数。
Hello Time( Hello 时间 ):STP 交换机发送配置 BPDU 的时间间隔,默认是 2 秒。如果要修改时间参数,那么必须在根桥上修改才有效。
Forward Delay(转发延迟):接口从侦听状态进入学习状态,或从学习状态进入转发状态的延迟时间,默认值是 15 秒。避免在 STP 树的生成过程中可能出现的临时环路,或短暂的数据帧泛洪现象,分别在侦听和学习的端口状态各停留一个转发延迟时间。对于 STP 而言,一个阻塞端口选举为根接口或指定接口后,进入转发状态至少需要经历 30 秒的时间。
Max Age(最大生存时间):BPDU 的最大生存时间,也称为 BPDU 的老化时间,Max Age 的值由根桥指定,默认值是 20 秒。如果端口在 20 秒内收到 BPDU ,最大生存时间会重新计时;如果端口一直没收到 BPDU ,那么 BPDU 将会老化,设备会重新在端口上选择最优 BPDU ,也就是重新进行根接口的选举。
由于时间参数的设计,一个 STP 接口从阻塞状态进入到转发状态,可能需要 30 ~ 50 秒的时间,这段时间内,网络无法正常使用。
举例说明
图片
交换机 A 、B 、C 一起启动,各交换机的每个互联端口立即从禁用状态进入到阻塞状态。在阻塞状态的端口只能接收而不能发送 BPDU ,所以任何端口都收不到 BPDU 。在等待 Max Age 后,每台交换机都会认为自己是根桥,所有端口的角色都成为指定端口,并且端口的状态迁移为侦听状态。
交换机的端口进入到侦听状态后,开始发送自己产生的配置 BPDU ,同时也收到其它交换机发送的配置 BPDU 。
因为各个交换机发送 BPDU 的时间有一定的随机性,所以有可能交换机 B 和交换机 C 先选举根桥为交换机 B ,再收到交换机 A 的配置 BPDU ,最后选举出根桥为交换机 A 。因此,无论交换机开始的状态如何,也不管中间过程有多大差异,最终的结果总是确定且唯一的:桥 ID 最小的交换机会成为根桥。
端口在侦听状态持续 Forward Delay 的时间后,开始进入学习状态。由于交换机 C 的 G0/2 端口已经成为备用端口,所以状态也会变成阻塞状态。
各个端口(交换机 C 的 G0/2 端口除外)陆续进入学习状态后,会持续 Forward Delay 的时间。在这段时间里,交换机开始学习 MAC 地址和端口的映射关系,同时希望 STP 树在这个时间内能够完全收敛。
之后各个端口(交换机 C 的 G0/2 端口除外)相继进入转发状态,开始进行数据帧的转发。
STP 的改进和代替技术
在实际应用中,STP 有很多不足之处,RSTP/MSTP 对 STP 进行了哪些改良?有哪些其它技术用来代替生成树技术?在这里插入图片描述
相关文章:

图解 STP
网络环路 现在我们的生活已经离不开网络,如果我家断网,我会抱怨这什么破网络,影响到我刷抖音、打游戏;如果公司断网,那老板估计会骂娘,因为会影响到公司正常运转,直接造成经济损失。网络通信中&…...

Kubernetes技术--k8s核心技术Controller控制器
1.Controller概述 Controller是在集群上管理和运行容器的对象。是一个实际存在的对象。 2.pod和Controller之间的关系 pod通过controller实现应用的运维,包括伸缩、滚动升级等操作。 这里pod和controller通过label标签来建立关系。如下所示: 3.Deployment控制器应用场景 -1:…...

Kubernetes技术--k8s核心技术 Secret
1.概述 Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret可以以 Volume 或者环境变量的方式使用。 作用 加密数据存储在/etc中,使得pod容器以挂载volume方式进行访问。在进行的数据存储中是以base64加密的方式…...

day27 String类 正则表达式
String类的getBytes方法 String s "腻害"; byte[] bytes s.getBytes(StandardCharsets.UTF_8); String类的new String方法 String ss "ss我的"; byte[] gbks ss.getBytes("gbk"); String gbk new String(gbks, "gbk"); String类的…...

Java设计模式:四、行为型模式-10:访问者模式
一、定义:访问者模式 访问者模式:核心在于同一个事物不同视角下的访问信息不同。 在一个稳定的数据结构下,例如用户信息、雇员信息等,增加易变的业务访问逻辑。为了增强扩展性,将两部分的业务解耦的一种设计模式。 二…...

【juc】读写锁ReentrantReadWriteLock
目录 一、说明二、读读不互斥2.1 代码示例2.2 截图示例 三、读写互斥3.1 代码示例3.2 截图示例 四、写写互斥4.1 代码示例4.2 截图示例 五、注意事项5.2.1 代码示例5.2.2 截图示例 一、说明 1.当读操作远远高于写操作时,使用读写锁让读读可以并发,来提高…...
Linux开机启动Tomcat
需求背景 Linux重启后要手动执行"startup.sh"启动Tomcat,比较麻烦,想要Linux开机启动Tomcat。 开机启动 #---------------------------------------------------------- sudo tee /usr/bin/tomcat.sh <<-EOF #! /bin/bash nohup /opt/to…...
javaweb、spring、springmvc和springboot有什么区别,都是做什么用的?
JavaWeb是一种基于Java技术的Web开发模式,用于构建动态的、可交互的Web应用程序。它是一种使用Java语言开发Web应用的技术堆栈,包括Java Servlet、JavaServer Pages(JSP)、JavaServer Faces(JSF)等。JavaWe…...

已解决module ‘pip‘ has no attribute ‘pep425tags‘报错问题(如何正确查看pip版本、支持、32位、64位方法汇总)
本文摘要:本文已解决module ‘pip‘ has no attribute ‘pep425tags‘的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。并且最后说明了如何正确查看pip版本、支持、32位、64位方法汇总 😎 作者介绍&…...

Matlab(画图初阶)
目录 1.plot()函数 2. hold(添加新绘图是否保留旧绘图) 3. Plot Style 3.1 线型 3.2 标记 3.3 颜色 编辑 4. legend() 5.X 、Y and Title? 6. Text()和annotation() 7.line(创建基本线条) 7.1 基本语法 7.2 指定线条属性 7.3 更改线条属性 8.图像属性 8.1 …...

汽车自适应巡航系统控制策略研究
目 录 第一章 绪论 .............................................................................................................................. 1 1.1 研究背景及意义 ..........................................................................................…...

C语言面试题值反转字符串
知识捡漏本 1.C语言优先级 :左高于高于 右 2.定义宏函数product,调用product后,里面的i和i都是加两次1,i就是两个加2后的i相乘,i是开始的i和1后的i相乘。 3.用i (j4,k 8,m 16);这种定义方法,最终i和最后一…...

【大数据】Apache Iceberg 概述和源代码的构建
Apache Iceberg 概述和源代码的构建 1.数据湖的解决方案 - Iceberg1.1 Iceberg 是什么1.2 Iceberg 的 Table Format 介绍1.3 Iceberg 的核心思想1.4 Iceberg 的元数据管理1.5 Iceberg 的重要特性1.5.1 丰富的计算引擎1.5.2 灵活的文件组织形式1.5.3 优化数据入湖流程1.5.4 增量…...

对分库分表进行批量操作
对ShardingJDBC基础了解:https://blog.csdn.net/m0_63297646/article/details/131894472 对批量操作案例:https://blog.csdn.net/m0_63297646/article/details/131843517 分为db0和db1两个库,每个库都有三张订单表,分表键根据年份…...

大数据组件-Flume集群环境的启动与验证
🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…...

【包过滤防火墙——iptables静态防火墙】的简单使用
文章目录 规则链的分类--五链处理的动作iptables常用参数和作用 防火墙就是堵和通的作用 iptables :包过滤防火墙,是内核防火墙netfilter的管理工具 核心:四表五链 规则链的分类–五链 在进行路由选择前处理的数据包:PREROUTIN…...
关于MySQL数据库版本不同导致表进行比较的时候报错illegal mix of collations...的问题
问题发生的原委 之前在项目开发的时候,我本地也建立了数据库用作开发库,我本地的数据库版本是5.7的,但是测试和生产库都是8.0的版本,我们定义的数据库字符集是utf8mb4,排序规则是utf8mb4_general_ci,前段时…...

进程、操作系统
文章目录 一、冯诺依曼体系(Von Neumann Architecture)1. 概述2. CPU 二、操作系统(Operating System)三、进程(process)/任务(task) 一、冯诺依曼体系(Von Neumann Architecture) 1. 概述 分类 CPU 中央处…...

hadoop学习:mapreduce入门案例四:partitioner 和 combiner
先简单介绍一下partitioner 和 combiner Partitioner类 用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值使用key的哈希值对Reduce任务数求模决定每条记录应该送到哪个Reducer处理自定义Partitioner 继承抽象类Partitioner,重写getPartiti…...

HTTP与SOCKS5的区别对比
在互联网世界中,服务器是一种重要的工具,可以帮助我们提高网络安全性等。今天,我们将重点关注两种常见的技术:HTTP和SOCKS5。让我们深入了解它们的工作原理、用途和优缺点,并通过Python代码示例学习如何使用它们。 HT…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...