二层交换机转发原理
1
目录
当报文中的源mac在mac地址表中不存在时,会生成新的mac地址表项。
1 定义
1.1 LAN
LAN(Local Area Network):局域网,同一个局域网内的终端可以通信。
1.2 VLAN
1.2.1 VLAN定义
VLAN(Virtual LAN):即虚拟局域网,这项技术可以根据功能、应用或者管理的需要将局域网内部的设备逻辑地划分到一个个网段中,从而形成一个个虚拟的工作组,并且不需要考虑设备的实际物理位置。 IEEE 颁布了 IEEE802.1Q 协议以规定标准化VLAN 的实现方案,交换机的 VLAN 功能即按照 802.1Q 的标准实现。VLAN 技术的特点在于可以根据需要动态的将一个大的局域网划分成许多不同的广播域。
每个广播域即一个VLAN,VLAN和物理上的局域网有相同的属性,不同之处只在于VLAN是逻辑的而不是物理的划分,所以VLAN的划分不必根据实际的物理位置,而每个VLAN内部的广播、组播和单播流量都是与其它VLAN隔绝的。
1.2.2 802.1Q tag
802.1q定义了tag(标签),通过比较报文标签中VID与本端口中的VID信息来决定是否丢弃报文,来实现虚拟VLAN的功能。
标签协议识别符(Tag Protocol Identifier, TPID):交换芯片通过该字段来判断是否为T带有Tag,如果为TAG报文,会将后续的2个字节解析成Priority和VID。通常情况下,这个字段为0X8100,表明通过0X8100来识别VID,另外常用的有0X9100/0X9200/0X8200等。
交换芯片通常支持多个TPID的使用,能够同时将多种TPID值的报文识别成Tag报文。
优先权代码点(Priority Code Point, PCP): 以一组3比特的域当作IEEE 802.1p优先权的参考,优先级通常应用于交换机QoS,当发生拥塞时,根据PCP来调度报文,除了PCP以外,IP报文中的DSCP和MPLS报文中的EXP都可以用来做优先级使用。
CFI:为0表示MAC地址以标准格式进行封装,为1表示MAC地址以非标准格式进行封装。
VID:长度为12bit,范围为0~4095。由于0和4095位保留值,所以VID的范围为1~4094。
2 二层转发流程
如图所示,报文从E1端口进入以后,要经过以下步骤:
1 PVID处理
如果从端口收到的报文是untag报文,需要给报文加上一层Vlan Tag,其中的Vid就是端口PVID的值。
为什么需要PVID呢?因为交换芯片内部处理的报文都是要带Vlan的,交换芯片的Mac地址学习、Vlan过滤都需要根据报文中的VID来完成。
PVID的作用是端口给Untag报文打上的VLan ID。
如果从端口收到的报文是tag报文,则无需PVID处理。
查看BCM的PVID信息如:
BCM.0> pvlan
Port ge0 default VLAN is 1
Port ge1 default VLAN is 1
Port ge2 default VLAN is 1
Port ge3 default VLAN is 100
Port ge4 default VLAN is 100
Port ge5 default VLAN is 100
Port ge6 default VLAN is 1
Port ge7 default VLAN is 1
Port ge8 default VLAN is 1000
Port ge9 default VLAN is 1
Port ge10 default VLAN is 555
Port ge11 default VLAN is 1
Port ge12 default VLAN is 1
Port ge13 default VLAN is 666
Port ge14 default VLAN is 1
Port ge15 default VLAN is 3000
Port ge16 default VLAN is 1
2 入口Vlan过滤
Vlan过滤功能由Vlan表来完成,Vlan表的内容描述某个Vlan包含了哪些端口以及报文从该端口发出时,是否剥掉tag。
例如,从端口E1收到的报文Vlan为1000(或者说untag报文打上了PVID 1000),但VLan表中的VLan 100中没有E1端口,就会把该报文丢弃(过滤),如果VLan表中的VLan 100中有E1端口,则会进入后续的流程。
查看BCM 的vlan信息:
BCM.0> vlan show
vlan 198 ports ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400000), untagged none (0x0000000000000000000000000000000000000000000000000000000000000000) MCAST_FLOOD_UNKNOWN
vlan 199 ports ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400000), untagged none (0x0000000000000000000000000000000000000000000000000000000000000000) MCAST_FLOOD_UNKNOWN
vlan 200 ports ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400000), untagged none (0x0000000000000000000000000000000000000000000000000000000000000000) MCAST_FLOOD_UNKNOWN
vlan 300 ports ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400000), untagged ge21 (0x0000000000000000000000000000000000000000000000000000000000400000) MCAST_FLOOD_UNKNOWN
vlan 400 ports ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400000), untagged none (0x0000000000000000000000000000000000000000000000000000000000000000) MCAST_FLOOD_UNKNOWN
vlan 555 ports ge10,ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400800), untagged ge10 (0x0000000000000000000000000000000000000000000000000000000000000800) MCAST_FLOOD_UNKNOWN
vlan 666 ports ge13,ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000404000), untagged ge13 (0x0000000000000000000000000000000000000000000000000000000000004000) MCAST_FLOOD_UNKNOWN
vlan 777 ports ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400000), untagged none (0x0000000000000000000000000000000000000000000000000000000000000000) MCAST_FLOOD_UNKNOWN
vlan 1000 ports ge8,ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400200), untagged ge8 (0x0000000000000000000000000000000000000000000000000000000000000200) MCAST_FLOOD_UNKNOWN
vlan 2000 ports ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000400000), untagged none (0x0000000000000000000000000000000000000000000000000000000000000000) MCAST_FLOOD_UNKNOWN
vlan 3000 ports ge15,ge21,hg (0x00000000000000000000000000000000000000000000000000c4000000410000), untagged ge15 (0x0000000000000000000000000000000000000000000000000000000000010000) MCAST_FLOOD_UNKNOWN
vlan 4095 ports hg (0x00000000000000000000000000000000000000000000000000c4000000000000), untagged none (0x0000000000000000000000000000000000000000000000000000000000000000) MCAST_FLOOD_UNKNOWN
3 mac地址学习
mac地址学习是根据报文的源mac、源端口生成mac表项。
mac地址表项描述了mac地址在哪个接口,mac地址表的作用是用于转发。
BCM下的mac地址表
BCM.0> l2 show
mac=00:01:02:03:33:22 vlan=666 GPORT=0xe modid=2 port=14/ge13 Hit
mac=00:03:0e:23:55:75 vlan=666 GPORT=0xe modid=2 port=14/ge13 Hit
mac=00:03:0f:00:11:11 vlan=1000 GPORT=0x0 modid=255 port=0 Static Hit
mac=00:03:0f:00:11:11 vlan=666 GPORT=0x0 modid=255 port=0 Static
mac=00:03:0f:b1:10:12 vlan=666 GPORT=0xe modid=2 port=14/ge13 Hit
mac=24:69:68:7b:be:2a vlan=1000 GPORT=0x9 modid=2 port=9/ge8 Hit
当报文中的源mac在mac地址表中不存在时,会生成新的mac地址表项。
4 mac地址查找/洪泛/广播报文
当报文中的目的mac为广播mac(即FF:FF:FF:FF:FF:FF)时,会向Vlan内的所有端口发送报文。
当报文中的目的mac为单播mac时,会在mac地址表中查找该mac,如果能够找到,会把报文转发到对应的端口,如果不能找到,会向Vlan内的所有端口发送报文,这个过程称为洪泛。
洪泛是指单播报文查找失败以后往各端口转发。
5 出口vlan过滤
这个过程是可选的,与入口VLan检查失败类似,出口检查失败以后,报文被丢弃。
dump EGR_VLAN 100
EGR_VLAN.epipe0[100]: <VP_GROUP_BITMAP=0x0000000000000000,VALID=1,UT_PORT_BITMAP_W1=0,UT_PORT_BITMAP_W0=0x60,UT_PORT_BITMAP=0x0000000000000060,UT_BITMAP_W1=0,UT_BITMAP_W0=0x60,UT_BITMAP=0x0000000000000060,STG=1,RESERVED_0=0,REMARK_DOT1P=0,REMARK_CFI=0,PORT_BITMAP_W1=0xc40000,PORT_BITMAP_W0=0x68,PORT_BITMAP=0x00c4000000000068,OUTER_TPID_INDEX=0,FLEX_CTR_POOL_NUMBER=0,FLEX_CTR_OFFSET_MODE=0,FLEX_CTR_BASE_COUNTER_IDX=0,EVEN_PARITY=0,DOT1P_MAPPING_PTR=0>
6 出口vlan处理
报文从端口出去时,是否携带Vlan Tag实在出口Vlan完成的。
BCM.0> dump EGR_VLAN 1
EGR_VLAN.epipe0[1]: <VP_GROUP_BITMAP=0x0000000000000000,VALID=1,UT_PORT_BITMAP_W1=0,UT_PORT_BITMAP_W0=0x1feb5de,UT_PORT_BITMAP=0x0000000001feb5de,UT_BITMAP_W1=0,UT_BITMAP_W0=0x1feb5de,UT_BITMAP=0x0000000001feb5de,STG=1,RESERVED_0=0,REMARK_DOT1P=0,REMARK_CFI=0,PORT_BITMAP_W1=0xc40000,PORT_BITMAP_W0=0x1feb5fe,PORT_BITMAP=0x00c4000001feb5fe,OUTER_TPID_INDEX=0,FLEX_CTR_POOL_NUMBER=0,FLEX_CTR_OFFSET_MODE=0,FLEX_CTR_BASE_COUNTER_IDX=0,EVEN_PARITY=0,DOT1P_MAPPING_PTR=0>
UT表示Untag Port Bitmap.,表明报文出去时为untagged.
2.1 端口入方向对报文的处理
根据芯片TPID信息,识别报文中Vid,通常芯片支持多个TPID,报文携带的Vlan ID是多少是根据TPID字段的得到的。
2.2 Vlan Table的内容
mac=00:03:0f:ab:ba:b2 vlan=3000 GPORT=0x10 modid=2 port=16/ge15 Hit
芯片支持的mac地址信息比命令行看到的信息要多,一般包含:
mac 地址、vlan id、端口号(由modid/port两部分组成)、是否为静态、是否源命中.
2.3 PVID
端口上配置的VID,给Untag报文加上的Tag。只有收到的报文不带Tag时,PVID才会发生作用。
2.4 Mac地址表的学习
根据报文中Mac地址源地址、端口号、vlan生成表项,后续其它端口收到的报文,目的地址与mac表中的内容相同时,往该端口转发。
2.5 Mac地址表的洪泛
当收到的报文的目的mac在mac地址表中查找失败时,会向所有端口发出。
2.6 单播/广播/组播mac
三类mac地址:单播mac、广播mac、组播mac。
2.7 Mac地址表的老化
mac地址表有老化机制,当一个长时间没有收到以mac地址表为源mac的报文的报文时,mac地址表项会删除。
2.8 Mac地址表的迁移
在mac地址存续期间,从其它端口收到同样的一个源mac相同的报文,这会导致原来的mac地址表被删除。所谓迁移,指的是端口改变了。
2.9 Mac地址表的冲突
Mac地址表通常采用Hash算法
2.5.1 Mac地址表的源查找