企业网络简化
小微企业不一定用得上三层,直接PC→接入层交换机,
交换网络扩容与交换环路
网络设备分为:
- 接入网络设备:Hub Switch
- 主要负责将PC、IP电话、打印机等终端设备接入网络中
- 一个网络由接入设备、线缆、终端这三样组成,这个网络的规模就受到接入设备的接口限制
- Switch有两种接口,级联接口和下联接口
- 级联接口用于连接交换机,带宽通常是下联接口的10倍
- 下联接口用于连接终端设备
- 非接入网络设备
单点故障
指设计网络时没有考虑高可用性,没有容错性
- 例如:两台交换机之间只通过级联接口连一根线,如果这根线挂了或者这根线两端的接口挂了,就会导致这两台交换机下联的主机之间无法通信
设计网络时需要考虑高可用性和冗余
MAC地址
交换机中有一个MAC地址表,里面存储MAC地址(Media Access Control 介质访问控制地址)
- MAC地址48bit,即6Byte,以12个16进制数字显示:思科XXXX.XXXX.XXXX,华为XX.XX.XX.XX.XX.XX
交换机之间的数据如何判断发给谁:
- 给数据加一个L2层报头(Ethernet2格式的),里面有三个字段
DMAC|SMAC|Type
,目的MAC地址,源MAC地址,类型,目的MAC地址就是描述这个数据由谁接收,交换机就把数据转发给谁,这个时候交换机就需要知道接收者在哪,实际就是基于接收者的MAC地址查找MAC地址表,获取接收者连接的交换机接口,然后发给接收者
MAC地址表的每一个表项都包含三要素:主机的MAC地址
、交换机连接该主机的接口
、该接口所属的VLAN
如果查完MAC地址表还不知到接收者连在哪个接口呢?
- 交换机也会将数据转发,即
数据泛洪(Flooding)
,通俗点理解就是数据全发,例如A主机和B主机都连接交换机,A要发数据给B,且查MAC地址表没查到B接在交换机的哪个接口,那么交换机就会把这个数据复制n份,然后除了A连接的接口外,其它接口全发一份该数据
如何获得MAC地址表项
静态配置
和动态学习
动态学习:
- 交换机只要收到一股流量,就认为这个流量的信源连接在流量接收的接口上
- 当A发数据给B,交换机收到A发来的数据后,就知道A连在哪个接口
- 交换机泛洪,给所有接口全发数据,B收到A的数据后,要给A一个回应报文,交换机收到主机B给A的回应报文,就知道主机B连在哪个接口
- 后续再有A和B发数据的情况就不需要泛洪了,已经知道A和B接在哪个接口了
泛洪与广播
并非一个概念,广播会引起交换机泛洪,但是泛洪其实是一种转发机制,而广播是一种流量的类型,这个流量的类型会引起泛洪的操作,但是泛洪和广播是两码事
主机在交换机上换了一个接口会不会丢包
不会,例如主机A原来接在交换机的0/1口,现在接在交换机的0/2口,当主机A的网线从交换机的0/1口拔掉时交换机是能感知到的,接口状态会由up切换为down,一旦接口down了,那么交换机通过动态学习
学到的地址表项会立即清空,当主机A连接到0/2口后,只要A发送了数据,交换机就会根据数据的新的接收接口来学习到主机A的相关表项
交换机接口什么时候会up?
满足以下三个条件接口才会up,一旦有哪个条件不满足接口就会down
- 接口本身没shutdown
- 接在接口上的网线要没问题
- 对端连接的主机没问题
交换机接口一直不down,学到的主机A的地址表项会一直保持吗?
不会,动态学习学习的表项会有老化计时器(Aging Timer)
,这个表项超过老化计时器的时间没更新就会被删除掉
- Aging Timer默认300s(思科华为都是)
交换环路Loops以及MAC地址表项漂移
假设有以下场景,交换机SW1连接PC1,交换机SW2连接PC2,SW1和SW2之间通过两个级联接口连接在一起
在两台交换机都不知道PC1和PC2接在哪个接口的情况下,如果PC1想发数据给PC2,数据先到达SW1左边的接口,SW1泛洪,将数据发送给右上和右下两个接口
例如SW2左上的接口先收到数据了,就会认为PC1接在左上的接口,SW2做一个流量转发,泛洪,将数据发送给左下和右边这两个接口
如果此时左下的接口收到了来自SW1的数据,SW2就会认为这个PC1还挺调皮,把网线拔下来接到SW2左下角的接口上了,这个时候SW2就会执行MAC地址表项迁移
,把PC1的表项从原本的左上这个接口迁移到了左下接口,这个叫做MAC地址表项漂移
- 此时SW2认为:
PC1接在在自己的左下接口
但是SW2已经泛洪,将数据从左下和右边的接口发出去了,当SW1右下的接口收到这个数据流,现在开始麻烦了,SW1会认为PC1把网线拔下来接到自己的右下角接口了,其实此时PC1就收不到回传的消息了
- 此时SW1认为:
PC1接在自己的右下角接口
- 此时SW2认为:
PC1接在在自己的左下接口
当PC2想将回传的数据发给PC1时,先经过SW2,SW2认为应该发给左下角接口,然后经过SW1,SW1认为应该发给右下角接口,此时环路生成
本质原因:
- MAC地址表不对了
广播风暴
当交换环路产生之后,交换机按照错误的路径信息来转发去往一个主机的数据。当去往这个主机的数据越多,那么越转发越多,最终结果就是整体的网络就坍塌了。
导致广播风暴的原因:
- 浅层:交换机间的冗余连接
- 深层:交换机有限的认知
- 交换机认为所有的主机都连在自己的一个端口上,拿上面的例子来说,实际PC2就没连在SW1上,那么默认认为PC2连在一个端口上就是不合理的
- 不应该觉得从一个接口收到流量那么信源就连在这个接口上
STP工作原理介绍
STP生成树协议(Spanning-Tree Protocol)就是用来防止交换环路的,避免广播风暴,专门用于带有冗余的二层交换环境
实际做了哪些事:
- 判断交换机间无环最优路径,阻塞所有其余路径,防止环路
- 实时监控链路状态,一旦链路状态变更,重启曾经阻塞的链路(这条的目的就是防止单点故障)
通俗理解就是:
- 在运行生成树协议后,两根网线只有一根可以转发数据,另一根处于待命状态,所以不会出现交换环路
那么运行生成树协议,会出现单点故障吗?
- 不会,因为是要判断最优路径的,如果有一跟网线挂了,在运行生成树协议时会直接选择另一跟网线
运行生成树协议的流程:
- 选举一个根网桥 (One Root Bridge)
- 每个非根网桥选举一个根端口 (One Root Port per Non-Root Bridge)
- 每个网段选举一个指定端口 (One Designated Port per Segment)
- 阻塞剩余的非指定端口 (Block Non-Designated Ports)
根网桥(根交换机)
运行生成树协议必须选择一个根网桥(根交换机),有且只有一台,作为生成树的根
这个根网桥可以理解为根交换机,因为这个生成树协议出现的时间比较早,那个时代二层设备还是以网桥为主,所以叫根网桥,交换机出现之后,网桥就淘汰了
STP的三步选举
第一步:选举根网桥
每台运行生成树协议的交换机都有一个名片,叫BID(网桥标识符),大小8Byte
2Byte优先级 | 6Byte MAC地址
,优先级默认32768- MAC地址全球唯一,所以不用担心选不出来根网桥
PK标准
:选Bridge ID最小的,哪个交换机最小就把哪个交换机作为根网桥
第二步:每个非根网桥选举一个根端口
根端口:就是每个非根桥去往根桥最优路径的出接口
- 对于每个非根桥这个根端口是唯一的,因为最优路径即根链路唯一
选举根端口的决策流程
SW2的两个级联接口平常都能持续的接收到根桥发送过来的数据,这个数据叫BPDU(bridge protocol data unit,网桥协议数据单元)。当选出了跟网桥之后,根网桥的接口它会周期性的2秒1次的主动的向对方发送一个叫做BPDU的这么一个报文,那这个报文里面包含了很多参数,接下来我们这个非根桥的这两个接口,都能收到根桥的BPDU,就会根据这两个接口接收到BPDU中的一些参数,来判断我的哪个接口该做根端口。
决策流程:
-
先判断根路径成本(Cost of Path),选成本最低的路径(抽象的理解就是选非根桥的接收接口,因为SW收到BPDU才会累加CoP)
-
比较转发者BID(Bridge ID),选择转发者BID更小的
-
比较端口标识符(Port ID),选择Port ID更小的
也就是说如果根路径成本相同,则判断Port ID端口标识符,选优先级字段最小的,如果优先级字段相同,则选接口编号最小的
- 例如SW2接收端口千兆,SW3接收端口千兆,则到SW3时,CoP的累加值为0+4+4=8
BPDU参数
Bytes | Field |
---|---|
2 | Protocol ID |
1 | Version |
1 | Message type |
1 | Flags |
8 | Root ID |
4 | Cost of path |
8 | Bridge ID |
2 | Port ID |
2 | Message age |
2 | Max age |
2 | Hellotime |
2 | Forward delay |
-
Root ID
(根网桥BID):根网桥在发送BPDU时将自己的Bridge ID写入该字段(没毛病,Bridge ID不就是交换机的名片吗,告诉其它交换机自己是根交换机)- 其它非根桥在转发BPDU时不能修改该字段,在转发的全程该字段存的都是根网桥的Bridge ID
-
Cost of Path
(根路径代价)简称CoP
:是一个累积值,它表示的是一台交换机到达根网桥(Root Bridge)的总路径开销- 接口带宽越大对应的成本值越小(Cost),例如:万兆是2,千兆是4,百兆19,十兆100
- 计算思路:非根桥收到BPDU时,在CoP这里加上自己收到BPDU端口的成本值(Cost)
- 例如:SW1----SW2----SW3,假设SW2接收端口带宽千兆,SW3接收端口百兆
- SW1发出BPDU,CoP为0
- SW2收到BPDU时,接收端口带宽千兆,成本值4,所以CoP=4
- SW2发出BPDU,CoP为4(只在接收到BPDU时才累加,和转发没关系)
- SW3收到BPDU时,接收端口带宽百兆,成本19,所以CoP=4+19=23
-
Bridge ID
(转发者BID):转发者的Bridge ID,标识这个BPDU是哪个非根桥转发过来的- SW1发出BPDU,此时该字段为SW1的BID
- SW2收到BPDU知道是SW1发来的,然后SW2转发BPDU,此时该字段为SW2的BID
- SW3收到BPDU知道是SW2发来的
-
Port ID
(端口标识符):2Byte,由1Byte优先级 | 1Byte接口编号
组成- 由于一台交换机有多个端口,所以选最优链路的时候也要比较哪个端口更优,比较思路也是选小,优先级字段数值越小优先级越高,默认优先级字段为128,如果优先级相同,就比接口编号,也是越小越优
BPDU组播
BPDU发的时候是以组播的形式发的,在不加限制的条件下也会成环,所以限制只有根网桥才能发BPDU,其它非根桥只能转发
- 通过根网桥的DP(指定端口)发送,非根桥的RP接收
DP
指定端口:允许发送或转发BPDU的端口RP
根端口:每个非根桥的唯一的一个根端口,连接的是最优路径NDP
非指定端口:所有非指定端口会被阻塞
第三步:阻塞冗余链路
在确定了根端口后,STP会在每个物理网段上选举一个指定端口(Designated Port)。指定端口是负责向该网段转发流量的主要端口,通常是与根网桥路径成本更优的交换机上的端口
- 既不是根端口也不是指定端口的端口将被置为阻塞(Blocking) 状态,从而打破环路
生成树的收敛
收敛是指网络在拓扑发生变化后,所有交换机重新达成一致、重新计算出一棵新的无环逻辑树结构,并最终使所有端口切换到稳定状态(转发或阻塞)的整个过程
- 就是根据你交换机间的链路的状态的变更,来做链路开启或者链路阻塞的这么一系列决策的过程