前文我们了解了vlan优化,vlan聚合技术super vlan相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16208997.html;今天我们来聊一聊RSTP相关话题;
我们知道二层网络中一旦产生环路,将导致整个网络瘫痪不可用,为了防止二层环路,stp技术由此诞生;stp主要作用就是通过阻断冗余链路来消除网络中可能存在的环路,同时当活动链路发生故障时,激活冗余链路及时恢复网络连通性,从而实现网络的可靠性;
RSTP技术背景
STP协议虽然能够解决环路问题,但是由于网络拓扑收敛较慢,影响了用户通信质量,而且如果网络中的拓扑结构频繁变化,网络也会随之频繁失去连通性,从而导致用户通信频繁中断;
由于STP的不足,IEEE与2001年发布了802.1w标准定义了RSTP;RSTP在STP基础上进行了诸多改进优化,使得协议更加清晰、规范,同时也实现了二层网络拓扑的快速收敛;
STP存在的问题
1、设备运行STP初始化场景

提示:上图清楚描述了STP从启动到收敛完成,用户至少需要等待30秒,网络才能正常使用;
2、直连故障--交换机有BP端口,RP端口down场景

提示:如上图所示,swc与swa的直连链路down掉,其BP端口切换成RP端口并进入转发状态至少需要等待30秒;当交换机C感知到自己的根端口down掉以后,对应就会从其他端口选举RP;从上图可以看到swc就两个端口,所以bp端口被选举成RP,中间会经历listening到learning,learning到forwarding状态转换,所以当二层网络中,交换机有bp端口,RPdown掉以后,至少需要等待30s,对应bp才会被切换到RP;
3、非直连故障--交换机无BP端口,RP端口down场景

提示:如上图所示,非直连故障,由于swb上的rpdown掉以后,swb的dp会认为自己是是根(因为它收不到真正的根发送的bpdu),然后向外发送bpdu,此时swc的bp端口收到swb发送的bpdu以后,发现没有自己缓存里bpdu好,所以它不做任何处理;但是由于swb的rp down掉以后,对应swc的bp端口也无法正常收到swa发送的bpdu,于是swc的bp端口会等待20秒时间(缓存老化时间);swc的bp端口等待缓存超时以后,此时swc的bp端口会切换成dp,然后状态又要从listening到learning,learning到forwarding状态转换,所以非直连故障,stp至少需要等待50秒网络才会收敛完成;
4、交换机连接用户终端场景

提示:如上所示,如果stp网络中有新的端口被激活,对应stp又会重新计算初始化,这个过程会让网络至少30秒不可用(stp初始化时,所有端口都会从阻塞,中间会通过计算,端口从listening到forwarding会等待30秒);很显然连接中断的端口也会导致stp重新计算,从而导致网络的震荡;事实上连接终端的端口是不应该参与到stp计算的(产生环路的可能性极低,没有必要参与stp计算);
5、STP的拓扑变更机制

提示:stp中如果有拓扑变化,为了使得全网交换机的mac地址表能够更快的更新,stp采用tcn消息和tc来通知所有交换机将mac地址表的老化时间从300秒调整到15秒;如上图所示,当swc感知拓扑变化后,它会向根的方向发送tcn消息,收到该消息的上游交换机会恢复tca确认消息,最后tcn消息到达根桥以后,再由根桥发送tc消息,通知设备删除桥mac地址表项;机制复杂,效率低下;
6、STP的其他不足之处-端口角色

提示:STP的端口角色就只有三个,RP、DP和BP,其中BP切换成RP或DP都会重新选举且需等待计时器超时后才能进入转发数据;
7、STP的其他不足之处-端口状态

提示:STP有5种端口状态,其中disabled、blocking、listening这三种状态不转发用户流量,不学习mac地址;对于用户来讲,这三种状态都是一个效果,但在stp中必须经历这三个状态,使得网络收敛时间变得更长;
通过上述的阐述,我们可以看到stp有许多的不足,总之就是一个字慢,不稳定很容导致网络震荡;
RSTP(Rapid spanning Tree Protocol,快速生成树协议),它是从STP发展而来,实现的基本思想和STP一致,都是通过阻断冗余链路来消除网络中可能存在的环路,同时当活动链路发生故障时,激活冗余链路及时恢复网络连通性,从而实现网络的可靠性;RSTP具备STP的所有功能,可以兼容STP;RSTP不同于STP,最大的特点就是比STP快;RSTP通过减少了端口状态、增加端口角色、BPDU格式及发送方式不同,当交换网络拓扑结构发生变化时,RSTP可以更快地恢复网络的连通性;
RSTP的端口角色

提示:RSTP将端口角色增加到4个,分别是RP(根端口,所在交换机上离根交换机最近的端口,处于转发状态)、DP(指定端口,转发所连接到网段发往根交换机方向的数据,从根交换机方向发往所连接的网段的数据,处于转发状态)、AP(预备端口,根端口的备份,不处于转发状态)和BP(备份端口,指定端口的备份,不处于转发状态);
RSTP的端口状态

提示:RSTP将端口状态从stp的5个状态减少到3个状态;在stp中disabled、blocking、listening这三种状态归并为一个discarding状态;
RST BPDU格式


提示:相对于STP BPDU格式,在RST BPDU中 protocol Version ID变成了2,BPDU Type变为了2,使用了Flags字段的全部8位(STP只使用了,最高位和最低位);在RST BPDU的Flags字段中,除TC以及TCA标志位(蓝色小框),还包含P/A标志位(黄色小框)、端口状态标志位(紫色小框)以及端口角色标志位(红色小框);
P/A机制--针对STP初始化场景改进


提示:在交换机开机的时候,每个交换机的端口都会认为自己是根,所以都会发送P置位的BPDU(端口状态标志位为discarding,端口角色标志位DP);当对端收到对应BPDU后,会根据BPDU携带的优先级等信息来判断谁是根,如果对方发送到BPDU优先级由于自己,对应接收到BPDU的端口会恢复一个A置位(端口状态标志位为forwarding,端口角色为RP)的BPDU;当对端收到A置位的BPDU报文后,对应端口立即进入forwarding状态,进行数据转发;通过上述的来回确认和同步变量机制,就无需依靠计时器来保障无环;从而大大节省了初始化时长(通常这个会在几秒中之类完成,相对于STP的30秒快了很多);
RSTP选举原理和STP本质上是相同的,都是先选举根桥,然后在举非根交换机上选举根端口->选举指定端口->选举预备端口和备份端口(有关选举规则的说明请参考https://www.cnblogs.com/qiuhom-1874/p/15131999.html);但是RSTP在选举的过程中加入了“发起请求-回复同意”(P/A机制)这种确认机制,由于每个步骤有确认就不需要依赖计时器保证网络拓扑无环才转发,只需要考虑BPDU发送报文并计算无环拓扑的时间(一般为秒级);
根端口快速切换机制--针对STP直连故障场景

提示:SWC与SWA的直连链路down掉以后,其AP端口切换成RP端口,并进入转发状态完成收敛;这个是内部机制,在RSTP中,AP端口就是为RP端口的备份,当交换机感知自己的RP端口down掉以后,对应AP端口会立即变为新的RP并进入Forwarding状态;
次优BPDU处理机制--针对STP非直连故障场景

提示:次优BPDU处理机制本质上还是P/A处理机制;如上图所示,当交换机swb 的RP down掉以后,swb收不到BPDU,所以它会认为自己是根,然后发送P置位的BPDU,当swc的AP端口收到swb发送的P置位的BPDU后,这个时候swc不是不处理(stp中swc并不会直接处理,而是等待20秒超时),而是发送本地最优BPDU给对方,告诉对方不是根,自己从AP端口角色变为DP;随后swb收到swc的最优BPDU后,他会将端口的角色从DP更改为RP,然后发送A置位的BPDU给swc,当swc收到swb发送的A置位BPDU后,立即进入到转发状态;
边缘端口的引入--针对STP中接入终端端口参与STP计算场景

提示:在RSTP中,交换机连接终端的链路可以立即进入转发状态,无需像STP中那样,必须参与STP计算;当然这个需要我们在交换机上配置那些端口为边缘端口(在端口模式下使用命令:stp edged-port enable开启对应端口为边缘端口);在对应端口下开启边缘端口后,对应端口就不会参与到stp计算中,当终端插拔网线都不会对STP网络造成震荡;当然边缘端口如果收到BPDU的话,对应也会参与到stp的计算(这是一种不正常的现象,这意味着要么有人在攻击,要么是我们把线接到交换机上了,默认终端是不会发送BPDU);
RSTP拓扑改变处理机制--针对STP中拓扑变更处理机制优化

提示:在RSTP中,当拓扑发生改变,不再使用TCN,而是直接发送TC;触发拓扑变更的条件,只有非边缘端口转变为Forwarding状态时,才认为拓扑发生了变更;拓扑发生变更处理机制是,在两倍Hello时间内(4秒)内向所有其他指定端口和根端口发送TC置位BPDU报文;清除除接收到TC报文的端口之外的所有指定端口和根端口学习的mac地址;如下所示

提示:当发生拓扑变更时,对应交换机的端口发送TC;同时清空自己除发送tc端口和边缘端口学习到的所有mac地址表项;如上图,swb会清空E1端口学习到的所有mac地址表项;由新的根端口E2发送TC;

提示:当swc收到swb发送的TC报文后,对应swb会清除除了收到TC报文之外的其他所有非边缘端口学习到的mac地址表项;

提示:同样SWA收到swb发送的TC以后,对应swa也会清除除了收到tc报文之外的其他所有非边缘端口学习到的mac地址表项;
判断拓扑变化唯一标准

提示:判断拓扑唯一变化标准是一个非边缘端口迁移到Forwarding状态;对于边缘端口up或down都不会触发拓扑变更;
配置RSTP
1、stp mode rstp :该命令在全局模式执行,表示更改STP模式为RSTP;

2、display stp :显示RSTP配置信息和参数

3、stp edged-port enable :配置模各端口为边缘端口

提示:该命令需要在某个接口模式下执行,表示把对应端口设置为边缘端口;默认情况下所有端口都是非边缘端口;
4、stp edged-port default :配置所有端口为边缘端口

提示:该命令需要在全局模式下执行,表示把所有端口都配置为边缘接口;
5、stp edged-port disable :禁用边缘端口

提示:该命令需要在某个接口模式下执行,表示配置该接口为非边缘接口;如果在全局模式下配置了所有端口为边缘端口,又在某个端口禁用了边缘端口,生效优先级是接口模式下优先级高于全局模式;
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳