图解 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 进行了哪些改良?有哪些其它技术用来代替生成树技术?在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

63.C++ mutable关键字

mutable 是C中的一个关键字,它用于修饰类的成员变量。当一个成员变量被声明为 mutable 时,它将允许在常量成员函数中修改这个成员变量的值,即使这个成员函数被声明为 const。 常量成员函数是类的成员函数,它们承诺不会修改类的成…

k8s(kubernetes)介绍篇

一、Kubernetes 是什么 Kubernetes 是一个全新的基于容器技术的分布式架构解决方案,是 Google 开源的一个容器集群管理系统,Kubernetes 简称 K8S。 Kubernetes 是一个一站式的完备的分布式系统开发和支撑平台,更是一个开放平台,对…

PHP环境配置

1.服务器 简单理解:服务器也是一台计算机,只是比平时用到的计算机在性能上更强大,开发中通常都需要将开发好的项目部署到服务器进行访问,例如:我们可以访问百度、淘宝、京东等,都是因为有服务器的存在&…

无涯教程-Android - Frame Layout函数

Frame Layout 旨在遮挡屏幕上的某个区域以显示单个项目,通常,应使用FrameLayout来保存单个子视图,因为在子视图彼此不重叠的情况下,难以以可扩展到不同屏幕尺寸的方式组织子视图。 不过,您可以使用android:layout_grav…

博流RISC-V芯片JTAG debug配置与运行

文章目录 1、Windows下安装与配置2、Linux下安装与配置3、芯片默认 JTAG PIN 列表4、命令行运行JTAG5、Eclipse下使用JTAG 1、Windows下安装与配置 CKLink 驱动安装 Windows版驱动下载地址: https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1666331…

如何用VMware虚拟机连上Xshell

目录 前言废话1.1设置虚拟机设置1.2 设置虚拟网络编辑器方法一:方法二: 1.3 配置静态IP地址1.4 Xshell连接虚拟机2.1 解决可能出现的一些问题2.1.1 虚拟机Ping不通网络2.1.2 我可以Ping通百度了,但是宿主机和虚拟机互相Ping不通。2.1.3 更离谱…

ElasticSearch学习4--复杂查询

1、查询分类 查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query 根据单个字段…

IDEA 设置提示信息

IDEA 设置提示信息 File->Settings->Editor->Code Completion 取消勾选 Math case

Nginx百科之gzip压缩、黑白名单、防盗链、零拷贝、跨域、双机热备

引言 早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业…

xx音乐app逆向分析

目标 看一下评论的请求 抓包 这里使用httpcanary 请求包如下 POST /index.php?rcommentsv2/getCommentWithLike&codeca53b96fe5a1d9c22d71c8f522ef7c4f&childrenidcollection_3_1069003079_330_0&kugouid1959585341&ver10&clienttoken7123ecc548ec46d…

(c++)类和对象 上篇

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步…

PostGIS空间数据中基础常用函数介绍

目录 前言 一、基础数据 1、数据结构准备 2、基础数据构造 二、常用空间函数 1、st_srid 获取空间对象SRID 2、st_asgeojson geojson转换 3、st_aswkt wkt支持 4、st_area 面积计算 5、ST_Buffer 缓冲区 6、其它函数 总结 前言 近些年,面向GIS的应用如雨后…

pytorch如何使用Focal Loss

Focal loss 是 文章 Focal Loss for Dense Object Detection 中提出对简单样本的进行decay的一种损失函数。是对标准的Cross Entropy Loss 的一种改进。 FL对于简单样本(p比较大)回应较小的loss。 如论文中的图1, 在p0.6时, 标准的…

nginx反向代理 负载均衡

目录 1.反向代理介绍: 2.七层代理和四层代理: 2.1 七层代理: 2.2 四层代理: 3.反向代理web服务器: 3.1 代理服务器配置: 3.2 服务器配置 : 3.3 客户端访问: 3.4 代理不同端口&am…

使用nps实现内网穿透

1、介绍 ​ 当我们想把内网的一些资源暴露在公网上时,可以使用内网穿透功能。比如公司的内网服务器,部署了平时需要开发的项目,但是回到家中无法访问,就可以使用内网穿透,将公司内网的接口映射到一台公网的服务器上&a…

C++之std::search应用实例(一百八十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

typescript的~~和双感叹号符号使用

(标题不给用“!”) "~~"符号使用 1.对于number类型的值,~~是取整作用 const num: number 3.14; const roundedNum: number ~~num; // 3 2.对于boolean类型的值,~ ~ true还是true,false还是false “!!”…

6.(Python数模)游泳接力指派问题

Python解决游泳接力指派问题 该问题也属于一个线性规划问题 源代码 import pulp # 导入 pulp 库 import numpy as np# 主程序 def main():# 问题建模:"""决策变量:x(i,j) 0, 第 i 个人不游第 j 种姿势x(i,j) 1, 第 i 个人游第 …

javaee spring 静态代理

静态代理 package com.test.staticProxy;public interface IUsersService {public void insert(); }package com.test.staticProxy;//目标类 public class UsersService implements IUsersService {Overridepublic void insert() {System.out.println("添加用户");…

A. Increasing and Decreasing

题目:样例: 输入 3 1 4 3 1 3 3 100 200 4输出 1 3 4 -1 100 150 180 200 思路: 思维题,这里我们看一下规律,我们已知a(1),a(n) ,又因为 数列b 应该是递减的,而观察规律可知 &#x…