跳至主要内容

【转】生成树协议-STP

STP/生成树(Spanning Tree Protocol)

冗余带来网络环路
产生的3大问题:
 1:Multiple Frame Copies/多帧复制
 2:MAC Database Instability /MAC地址数据库的不稳定
       /端口漂移
 3:Broadcast Storms/广播风暴
 
 
解决方案:STP
STP是链路管理协议
 将特定的端口置于阻塞状态,来实现既没有环路,也可以冗余的网络.
 
STP核心:
 Provides a loop-free redundant network topoloty,by placing certain ports in the blocking state.

STP信息是通过BPDU来传输的
    桥接协议数据单元BPDU(Bridge Protocol Data Unit)
作用:
 在交换网络中由根桥RB(Root Bridge)发送,用于STP的计算和收敛;发送周期为2秒;

两种类型:
 配置DPDU 是所有端口上的根网桥以周期性间隔而发出的
 TCN(Topology Change Notification) BPDU 当交换机检测到拓扑变更时所产生的
(TC发送时间持续35秒,即delay time+BPDU老化时间).

BPDU完成的任务:
 选举根桥
 确定冗余路径的位置
 阻塞特定端口防止环路
 通告网络的拓扑变更
 监控生成树的状态

 
协议ID(0)  表示协议 802.1d
版本号(0)  STP的版本,802.1D的版本是0
BPDU类型 BPDU类型(配置BPDU=0,TCN BPDU=80)
信息寿命 从根桥发出BPDU之后的秒数,每经过一个网桥都递减1,本质上是到达网桥的跳计数
标记域  包括 拓扑变化(TC)位,置位了就指明该BPDU是一个拓扑变化通告  或  拓扑变化确认(TCA)位
 

交换机对BPDU的处理:
    如果交换机从一个接口接收到优先级高的BPDU,会把该BPDU保存下来并且该接口不再往外发送BPDU;
    在收敛时只有根桥产生BPDU,其余交换机只能从RP接收BPDU后才从DP发送出去;这样非根桥可能从DP或者NDP接受到BPDU;
    如果交换机从DP接收到优先级低的BDPU会丢弃,并给源MAC发送自己较新的BPDU;如果从NDP收到优先级低的BPDU会只丢弃了事。
 
端口的不同状态:
    堵塞(Block,默认20s):只监听流入的BPDU
    监听(Listen,默认15s):监听和发送BPDU(根桥、根端口、指定端口等的选举在该阶段完成,如果接口没有成为DP则重新回到Block):
    学习(Learning,默认15s):监听和发送BPDU,并且会在该接口上学习流入帧的MAC地址
    转发: 监听和发送BPDU,会在该接口上学习流入帧的MAC地址,接收和转发数据帧
    禁用: 不参与STP,并且不能转发任何数据.
STP定时器: 
 Hello time(2s)  用于确定根交换机多长时间向其他的交换机广播一次配置BPDU.
 Forward delay(15s) 监控每个端口在学习和监听状态上停留的时间
 Max Age(20s)  控制端口保存配置BPDU信息的最大时间
作用:让网络有足够的时间来获得有关拓扑的正确信息,并确定是否存在冗余链路.
STP的默认最大寿命计时器为7,表示最大的网络直径可达7台设备.
所以BPDU的Forward delay为20秒
bpdu广播2s一次,允许有3个包丢失即6s,当假设最大为7跳的时候,则一共要用20s,所以BPDU的有效时间为20s
命令:
(config)#spanning-tree vlan 2 hello-time 2 //范围1-10s
    spanning-tree vlan 2 forwad-time 4 //范围4-30s
    spanning-tree vlan 2 max-age 6
 
STP执行的4步判决顺序
 
确定根交换机    lowest root BID 
计算到根交换机的最小路径开销 lowest path cost to root bridge
确定最小的发送者BID   lowest sender BID
确定最小的端口ID   lowest port ID 
 

LAB1:根桥的选举
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
引用原则1:
Lowest BID那个交换机,就是root Bridge.
BID:(Bridge ID)
由本交换机的网管MAC地址,和交换机的优先级组成,一共8个字节的16进制.
Step1:察看交换机的网管IP 所对应那个MAC地址
SW1#show version
Base ethernet MAC address: 00:07:EC:A8:4B:80
Step2:
察看STP的相关信息:(察看本机BID)
SW3#show spanning-tree 
交换机的STP的优先级,默认都是0x8000(32768)
Boot ID /Bridge ID
如果Root ID=本交换机的Bridge ID,说明本交换机就是根桥.
Step3:人为控制,根桥的选举(控制根桥/后备根桥的选举)
SW3(config)#spanning-tree vlan 1 priority 0 (0x0000)
SW1(config)#spanning-tree vlan 1 priority 4096 (0x1000)

SW-A(config)#spanning-tree vlan 1 root priority
      (24576=0x6000)
SW-B(config)#spanning-tree vlan 1 root secondary
      (28672=0x7000)
 

LAB2:非根桥交换机的根端口选择:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
引用原则2:
Lowest path cost to root bridge
Spanning-Tree Path Cost
根端口:
在非根桥交换机上,到达根桥所需的路径开销,最小的那个端口. 
链路带宽与cost
cost是如何叠加的?

每个非根桥,都只有一个根端口.
SW1#show interface status
SW1(config)#int fa 0/12
   speed 10
SW1#show spanning-tree interface fastethernet 0/12 detail
 port path cost 100
根桥上,没有根端口,"所有与交换机相连的端口"都是"指定端口"

(config-if)#spanning-tree vlan 1 cost ?  //修改端口开销
 
designated port
LAB3:每条segment上的,的选择:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
引用原则3:
Lowest sender BID
Step1:判断SW1的SW3之间的segment上,哪个是D-PORT? (8)  
Step2:
SW1(config)#spanning-tree vlan 1 priority 36864
       (0x9000)

LANB4:sender BID相同的情况下,designated port的选择:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果sender BID相同,则引用原则4:
Lowest (对方的) port ID
Step1:
SW2(根桥)# 察看端口的Port-ID
show spanning-tree interface fastEthernet 0/12 detail
     port identifier 128.12
SW2(config-if)#spanning-tree port-priority 32 (16进)
 
LAB5:观察 blocked端口
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
查看所有segment:
观察除了指定端口,和根端口以外的端口,都是被堵塞的.
show spanning-tree vlan 1 detail //显示各个端口上所接收的BPDU数目
 

STP的的特性:(CISCO私有)
1:PortFast 加快终端主机连接入stp网络的收敛.
只适用于,在交换机与主机(电脑)相连的端口, 不应该在交换机与交换机,路由器,hub互连的网络设备的端口使用.
interface FastEthernet0/1 (交换机上,在连接主机的端口)
 switchport mode access (接入链路)
 spanning-tree portfast
spanning-tree portfast default //全局模式下使用,全局启用portfast.

2.uplink-fast:
在所有接入层/分布层(非核心层)交换机上,配置uplink-fast,用于加速因为直链故障/直链检测错误,所引起的STP网络变化的收敛速度.
block - forward
1~5s
sw1(config)#spanning-tree uplink-fast //启用uplink-fast
show spanning-tree uplinkfast //查看uplinkfast信息
 
将网桥优先级增加49152,并且将交换机上所有接口的生成树端口开销增加3000
3.BackBone-Fast:
当遇到非直链检测错误时,加速其收敛速度:
大约为30s
indirect Link Failure
所有的交换机上,配置BackBone-Fast
sw1/2/3(config)#spanning-tree backbonefast //启用backbonefast
show spanning-tree backbonefast //查看backbonefast信息

4.portfast bpduguard (在已经是portfast端口上配置)
交换机端口的"portfast bpduguard"是指:
 在交换机的端口一旦收到BPDU包时,立刻关闭端口(进入err-disable状态),避免了更大范围的广播风暴.
如果要打开必须先shutdown,再NO SH
设置自动重新启用老化时间:
(config)#errdisable recovery cause bpduguard //默认300秒
     errdisable recovery interval ?  //修改等待间隔
 

在连接主机的端口上:
Sw1(config-if)#spanning-tree bpduguard enable
bpduguard Don't accept BPDUs on this interface

5:portfast bpdufilter (在portfast端口配置)
防止交换机在启用"portfast"的接口上发送BPDU,并且将接收到的所有BPDU都丢弃.
在特定的portfast端口上配置:
sw1(config-if)#spanning-tree bpdufilter enable 
 (bpdufilter: Don't send or receive BPDUs on this interface)
sw3(config)#spanning-tree portfast bpdufilter default  //全局的portfast端口上,都生效
注意:BPDU过滤可能导致环路,不推荐配置.配置过滤之后防护将不起作用.
6:root guard (推荐在所有的接入端口上配置)
将接口强制成为指定端口,从而防止周围的交换机成为根交换机.
(config-if)#spanning-tree guard root 
show spanning-tree inconsistentports //显示"不一致根"
 
debug spanning-tree events
logging buffered

评论

此博客中的热门博文

【转】VxWorks中的地址映射

在运用嵌入式系统VxWorks和MPC860进行通信系统设计开发时,会遇到一个映射地址不能访问的问题。 缺省情况下,VxWorks系统已经进行了如下地址的映射:   memory地址、bcsr(Board Control and Status)地址、PC_BASE_ADRS(PCMCIA)地址、Internal Memory地址、rom(Flach memory)地址等,但是当你的硬件开发中要加上别的外设时,如(falsh、dsp、FPGA等),对这些外设的访问也是通过地址形式进行读写,如果你没有加相应的地址映射,那么是无法访问这些外设的。   和VxWorks缺省地址映射类似,你也可以进行相应的地址映射。   如下是地址映射原理及实现:   1、 地址映射结构 在Tornado\target\h\vmLib.h文件中 typedef struct phys_mem_desc { void *virtualAddr; void *physicalAddr; UINT len; UINT initialStateMask; /* mask parameter to vmStateSet */ UINT initialState; /* state parameter to vmStateSet */ } PHYS_MEM_DESC; virtualAddr:你要映射的虚拟地址 physicalAddr:硬件设计时定义的实际物理地址 len;要进行映射的地址长度 initialStateMask:可以初始化的地址状态: 有如下状态: #define VM_STATE_MASK_VALID 0x03 #define VM_STATE_MASK_WRITABLE 0x0c #define VM_STATE_MASK_CACHEABLE 0x30 #define VM_STATE_MASK_MEM_COHERENCY 0x40 #define VM_STATE_MASK_GUARDED 0x80 不同的CPU芯片类型还有其特殊状态 initialState:实际初始化的地址状态: 有如下状态: #define VM_STATE_VALID 0x01 #define VM_STATE_VALID_NOT 0x00 #define VM_STATE_WRITA

【转】多迷人Gtkmm啊

前边已经说过用glade设计界面然后动态装载,接下来再来看看怎么改变程序的皮肤(主题)     首先从 http://art.gnome.org/themes/gtk2 下载喜欢的主题,从压缩包里提取gtk-2.0文件夹让它和我们下边代码生成的可执行文件放在同一个目录下,这里我下载的的 http://art.gnome.org/download/themes/gtk2/1317/GTK2-CillopMidnite.tar.gz     然后用glade设计界面,命名为main.glade,一会让它和我们下边代码生成的可执行程序放在同一个目录下边     然后开始写代码如下: //main.cc #include <gtkmm.h> #include <libglademm/xml.h> int main(int argc, char *argv[]) {     Gtk::Main kit(argc,argv);         Gtk::Window *pWnd;        gtk_rc_parse("E:\\theme-viewer\\themes\\gtk-2.0\\gtkrc");       Glib::RefPtr<Gnome::Glade::Xml> refXml;     try     {         refXml = Gnome::Glade::Xml::create("main.glade");     }     catch(const Gnome::Glade::XmlError& ex)     {         Gtk::MessageDialog dialog("Load glade file failed!", false,       \                                   Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK);         dialog.run();               return 1;     }         refXml->get_widget("main", pWnd);     if(pW

【转】https客户端的实现(libcurl)

一、              概念 1.         为什么要使用libcurl 1)        作为http的客户端,可以直接用socket连接服务器,然后对到的数据进行http解析,但要分析协议头,实现代理…这样太麻烦了。 2)        libcurl是一个开源的客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,支持Windows,Unix,Linux等平台,简单易用,且库文件占用空间不到200K 2.         get和post方式 客户端在http连接时向服务提交数据的方式分为get和post两种 1)        Get方式将所要传输的数据附在网址后面,然后一起送达服务器,它的优点是效率比较高;缺点是安全性差、数据不超过1024个字符、必须是7位的ASCII编码;查询时经常用此方法。 2)        Post通过Http post处理发送数据,它的优点是安全性较强、支持数据量大、支持字符多;缺点是效率相对低;编辑修改时多使用此方法。 3.         cookie与session 1)        cookie cookie是发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个Web站点会话之间持久地保持数据。cookie在客户端。 2)        session session是访问者从到达某个特定主页到离开为止的那段时间。每一访问者都会单独获得一个session,实现站点多个用户之间在所有页面中共享信息。session在服务器上。 3)        libcurl中使用cookie 保存cookie, 使之后的链接与此链接使用相同的cookie a)         在关闭链接的时候把cookie写入指定的文件 curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookie.txt"); b)        取用现在有的cookie,而不重新得到cookie curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); b)        ht