BCM帧流程精要.docx
《BCM帧流程精要.docx》由会员分享,可在线阅读,更多相关《BCM帧流程精要.docx(27页珍藏版)》请在冰豆网上搜索。
![BCM帧流程精要.docx](https://file1.bdocx.com/fileroot1/2023-1/27/c7791ad6-08d9-404a-97f9-33225ede670b/c7791ad6-08d9-404a-97f9-33225ede670b1.gif)
BCM帧流程精要
BCM交换芯片帧流程精要
前提2
1、帧流程概述2
2、Ingress处理模块3
2.1Ingress处理模块的功能3
2.2数据包检查、拆分(Parse)5
2.3VLAN处理(VLANDetermination/Lookup)5
2.3.1单Tag模式处理(普通的LAN内部使用这种Tag)5
2.3.2HTLS和DoubleTag处理(仅在特殊的端口如uplink时才使用到这种)6
2.4地址学习(Learning)9
2.5L2查表转发(Switching)10
2.5.1广播(Broadcast)10
2.5.2单播处理(Unicast)11
2.5.3L2多播(L2MC)13
2.6L3路由交换(Routing)14
2.6.1L3单播处理14
2.6.2L3多播处理15
2.6.3DEF_IP处理16
2.7快速包过滤处理(FFP)17
2.8相关其他18
3、MMU处理模块18
3.1MMU的调度机制18
3.1.1严格优先级方式(StrictPriority)18
3.1.2轮询方式(Round-Robin)19
3.1.3权重式轮询(WeightedRound-Robin)19
3.1.4权重公平排队策略(WeightedFairQueuing)19
3.1.5联合排队策略(CombinationQueuing)20
3.2影响MMU决策的几个关键设置20
4、Egress处理模块20
附录:
21
F1、基于IPV4的TCP/IP协议中的包封装21
前提
要说明帧流程,首先要知道以太网的帧格式,现在流行的以太网帧属于EthernetII帧,全文的说明将以这种帧结构为基础。
以太网帧的数据结构如下:
图1以太网帧
图2带有Qtag信息的帧
图3封装在以太网帧中的IP报文
在最通用的基本帧讲述过程中将引用图1的帧结构,具有VLAN和COS功能的帧处理将引用图2的结构,具有进行三层(L3)处理功能的部分将引用图3的结构,它们可以根据IP首部进行转发。
1、帧流程概述
二层以太网交换(L2Switch)的基本实现原理是基于MAC地址的交换,基于MAC地址的交换实现步骤简述如下:
1、交换机从某个端口收到一个数据包,它先读取包头中的源MAC地址,这样它就知道具有该源MAC地址的机器是连接在哪个端口上的,这样一组对应信息将被存放在地址表(L2Table)中;
2、随后将读取包头中的目的MAC地址,并在地址表中查找与该MAC地址对应的端口;
3、如果在地址表中查到有与这个目的MAC地址对应的端口号,则将数据包直接复制到这个端口上;
4、如果在地址表中找不到相应的MAC地址以及对应的端口号,则将数据包广播到所有端口上;当目的机器收到这个数据包以后,如果对源主机进行回应时,交换机又可以按照1中所描述的方式,又学习到这个MAC地址与端口的对应关系,在下次传送数据时就不再需要对所有端口进行广播了。
5、依此类推,对于与该交换机有直接或间接联系的所有MAC地址信息都可以实时的学习到,二层交换机就是这样建立和维护它自己的地址表的。
上面的这个过程是最简单清晰的理论型理想化诠释,为了实现这个过程,大部分的交换芯片采取下面这种结构方式来做,并且提供了更多的灵活性:
图4Ingress+MMU+EgressSwitchModel
上图示意性的表示了以太网帧在进入交换芯片以后,一个基本的物理处理流程是从“Ingress”单元到“MMU”单元再到“Egress”单元,该过程描述了以太网交换芯片对帧从进入到送出的处理流程。
下文将从“Ingress”、“MMU”、“Egress”3个阶段对帧的详细处理流程做说明。
2、Ingress处理模块
2.1Ingress处理模块的功能
交换芯片的每个端口都有一个Ingress逻辑,它负责将端口接收的帧做如何交换或转发处理决策,并将经过其处理的已经包含有转发信息的帧送到MMU做缓存排队和调度安排。
Ingress逻辑能够线速处理帧转发,它是帧流程中的核心处理模块。
图5Ingress处理环节框图
抽象一些来讲,图5就是Ingress的处理过程了;细节一些来看,图6可以更清晰的表现这个流程:
图6Ingress的处理流程示意图
概括起来,Ingress包含下面一些主要处理功能:
1、数据包检查、拆分;
2、VLAN处理;
3、地址学习;
4、L2交换;
5、L3路由交换;
6、快速过滤处理(FFP);
7、其他附加功能,如CPU包处理、Mirror、Trunk功能等;
下面的描述针对图6的执行流程展开。
2.2数据包检查、拆分(Parse)
帧进入交换芯片后,会检查这个帧的格式、长度、字节对齐、并检查该帧是否存在CRC错误(通过整个帧的数据和FCS验证)、更新端口的统计寄存器、特殊控制帧(比如PAUSE帧)处理等。
我们读到的CRC,Dribble等就是在这里得到的。
Ingress逻辑对帧做这些检查将以核实该帧是否有必要继续处理,对认为可以接受的帧将被传送到下一步处理。
上面说的这些检查是通过对帧做拆分后才能识别的,拆分的目的是为了获取帧中的关键信息,这些信息就是图1/图2中所示的几个关键信息域的值,这些关键信息域包括:
目的MAC地址;
源MAC地址;
长度/类型域;
Qtag信息(COS和VLAN);
IP信息等;
这些信息在后面将会被作为交换、决策信息使用。
以StrataXGS系列交换器件为例,它还会提取出IP信息中的IP地址甚至UDP或TCP的端口号等信息,作为三层路由交换的决策依据。
根据长度/类型域(Type/Len)的值可以判断帧是哪种类型的帧,如ARP,UDP,TCP,ICMP,IGMP帧,控制帧等类型。
2.3VLAN处理(VLANDetermination/Lookup)
芯片内部(以BCM56XX为例)处理的所有的包都是带有Tag信息的,所以对于进入芯片的每一个数据包,都会赋予一个VLANID和相关的CoS优先级信息。
如果进入的包本身不带Tag信息或是仅仅带有CoS优先级信息,那么芯片将会根据这个帧的入口(portnumber)信息到端口协议信息表(PRTABLE_ENTRY寄存器)中去搜索与此端口对应的VLANID;如果没有发现匹配的VLANID,将赋予一个默认的VLANID给该帧,默认的VLANID是通过PRTABLE_DEFAULT寄存器。
而对于进入交换机并且已经拥有VLANTag和PriorityTag的报文,那么它自己携带的VLANID将会直接被使用。
优先级信息(CoS或者Priority)也是通过PRTABLE_ENTRY/PRTABLE_DEFAULT赋予的;已经拥有VLANTag和PriorityTag的报文,这些Tag将直接被使用。
2.3.1单Tag模式处理(普通的LAN内部使用这种Tag)
下面的示意图简明的描述了这个过程的执行步骤,该过程适用于单Tag包(非DoubleTagged包)模式,简称为Non-DTMode(Non-DoubleTaggedMode),大多数时候,Tag模式是Non-DTMode。
图7单Tag包的Tag处理流程图(相关说些参考附录名词解释)
图7中蓝色方框内是后续处理,它表现了根据VLAN转发的一种决策示意:
对于VID可以从VLANTable中查找到的包会按找到的结果转发到合适的端口并学习相关信息;对于无法从VLANTable中找到的,按照默认处理转发,比如丢弃、送CPU或是发往其他默认的端口去。
2.3.2HTLS和DoubleTag处理(仅在特殊的端口如uplink时才使用到这种)
这个部分涉及到MPLS等东西和比较麻烦的广域网络拓扑结构,这里仅作了解,供有兴趣者参考共学。
HTLS(HierarchicalTransparentLANServices)是分级透明局域网服务的简称,还有一个叫法是HierarchicalVPLS(VirtualPrivateLANServices),就是分级虚拟专用局域网服务。
而DoubleTaggedMode是指双重标识模式,该模式下的帧在交换机处理时具有两个Tag标志,看起来如下图所示,它是一种耗费更小资源的划分SPVLAN的方法,DoubleTagMode可以通过设置VLAN_CONTROL寄存器打开或关闭。
图8DoubleTag的帧
交换机端口支持并使能DoubleTag模式时,会用到DoubleTag。
与HTLS模式相关的一个时尚名词是MPLS(Multi-ProtocolLabelSwitching)。
经过HTLS模式封装后送往端口的帧(MartiniPacket)格式如下:
图9HTLS模式下将Ethernet帧做内部封装
DoubleTag的需求来源于ISP(InternetServiceProvider,因特网服务提供商),它们是基于分级透明局域网服务(HTLS)的一种应用模式。
采用DoubleTag时,使用SPVLAN(ServiceProviderVLAN)和CVLAN(CustomersVLAN)两个名字分别标识这两种类型的VLANTag。
SPVLAN在边缘交换机(通常以太网交换机位于桌面接入附近,属于广域网络的边缘设备,所以成为边缘交换机)与ServiceProvider的核心链路中使用,本地交换设备之间通常仅使用CVLANTag就可以了。
与一般DoubleTagMode不同之处是HTLS模式采用了增加独立头部的方式,如图9所示。
HTLS模式下输入的帧分为下面3类(这里是按Tag有无和是否VLANAWARE分类的):
(1)无标签帧(Untagged)。
对这种帧,Ingress会从PORT_VPLS_BITMAP_TABLE读取默认的VLANID赋给该帧,TPID从VLAN_CONTROL的TPID字段获取。
(2)有Tag但不关心本地VLAN的帧(TaggedVLAN_UNAWARE)。
Ingress从PORT_VPLS_BITMAP_TABLE获取VLANID和VPLS,从VLAN_CONTROL的TPID字段获取TPID,从PRTABLE_DEFAULT寄存器获取优先级(priority)信息。
这种模式下,连接到同一个VPLS线路的网络端口处于同一个VLAN中。
(3)有Tag也关心本地VLAN的帧(TaggedVLAN_AWARE)。
处理方式为按照CVLAN的信息进行本地转发,相当于区分了两级VLAN。
DoubleTag模式下进入交换机的帧可以是下面三种当中的任意一种(注意这里是按照Tag有无分类的):
A、无标签帧(Untagged);
B、带有一个标签的帧(OneTag――SPVLAN或者CVLAN);
C、带有两个标签的帧(SPVLAN和CVLAN);
在DoubleTag模式,对于A类帧:
SPVLAN域的相关信息将被添加,添加的优先级赋值(priorityvalue)来自PRTABLE_DEFAULT寄存器,类型域(TPID)的值来自VLAN_CONTROL寄存器。
B类帧:
如果进来的帧没有携带SPVLANTag信息,Ingress将插入一个默认的SPVLANTag。
为了构成一个完整的SPVLANTag,VLANID来自查找PRTABLE_ENTRY所得到的匹配项;如果没有匹配的,同样以按照PRTABLE_DEFAULT进行处理。
C类帧不用做额外处理。
BCM56XX对HTLS/DoubleTag帧在Ingress的处理流程如下:
图10HTLS/DoubleTag帧处理
上图中的蓝色框和图7一致,表现的是根据VLAN转发的一种决策方式;绿色的框表示携带一个或两个Tag的处理示意图,他的基本处理方法是对没有SPVLAN的帧添加一个SPVLANTag;红色框内表示帧本身不携带Tag信息,它会被增加一个SPVLANTag。
一个关于QoS的想法:
没有携带CoS信息的报文,CoS信息的来历如何,交换机怎么判断两个包具有不同的CoS并给他们赋予不同的优先级值呢?
一种可能的方式是:
以传输IP报文为例,交换芯片会通过读取IP报文中的“8位服务类型”域的值(参看后面的附录图之“IPV4报文头部”)来决定本报文的优先级,该值是IP层描述QoS的关键字域。
这也正是前面拆包的时候读取的IP信息之一(当然还有目的IP/源IP等信息),那么L2物理传输上的这个CoS信息应该就是来源于上层通信协议栈的QoS字段。
2.4地址学习(Learning)
在VLAN和优先级的Tag插入以后,交换芯片(以BCM56XX为例)将检查源MAC地址并进行一些必要的学习处理,这就是地址学习了。
交换机接下来会以{VLAN_ID,MAC_SA(源MAC地址)}为关键字去搜索L2_ENTRY表。
BCM56XX芯片对地址的学习基于MAC_SA+VLAN_ID。
当DoubleTagged模式使能的时候,则地址学习是基于MAC_SA+SPVLAN_ID(请注意SPVLANID在DoubleTagged模式是“主流”查表依据)。
首先会判断该帧是否是一个合法帧,然后做处理:
如果以此为关键字的地址没有找到,那么这个数据包的MAC_SA+(SP)VLAN_ID信息就会被学习,这种学习是基于硬件的学习;如果找到了此地址,还会检查其信息是否与本搜索关键字一致,如果不一致信息也将被更新(分两种情况:
如果是非静态地址入口,那么就做直接更新,或叫做Relearning;另一种是此入口地址是静态地址配置,那么这个帧将被标记为Drop并且会Copy一份送给CPU处理)。
硬件学习(HardwareLearning)可以通过PORTTable的CML(CPUManagedLearning)bit进行配置。
地址学习的过程示意图如下:
图11地址学习处理流程
地址学习和查表转发存在一种提高执行效率的流行方式,就是所谓的Hash方式,有兴趣的可以学习《5690-AN400-RDS.pdf》。
2.5L2查表转发(Switching)
硬件学习完成后,将会检查目的地址是否属于桥协议数据单元(即BPDU控制帧=Bridge Protocol Data Unit:
BPDU帧的生成树协议定义的一种帧,它被用于根据一定的算法决定选择冗余链路中的某一条作为通道)或是否在特殊地址范围(即01:
80:
C2:
00:
00:
10~01:
80:
C2:
00:
00:
2x)内,对于这样的特殊帧,将会被送到CPU处理或是被广播(flood)到本VLAN的所有端口上去。
需要注意的是,目的地址是01:
80:
C2:
00:
00:
0x的包会被丢弃,只有处于转发状态(ForwardingState)的端口(这些端口是通过生成树协议SPT选定承认后的活动端口)接收到的帧才会被进一步处理。
然后他们会被进一步的处理以便决定包类型:
广播(Broadcast)、2层多播(L2Multicast)、3层多播(L3Multicast=IPMC)、单播(Unicast)或者三层单播(L3Unicast),针对这些不同类型的数据包,交换机将决定下一步分别进行不同的处理。
上面描述的过程使用下面的图表示起来更加清晰:
图12L2转发处理流程
下面按照几个支路的不同处理方式进行描述:
2.5.1广播(Broadcast)
对于广播报文(目的地址DA=0xff:
ff:
ff:
ff:
ff:
ff),将基于本VLAN所包含的端口进行转发,这就是VLAN对广播域的划分作用所在。
对于Broadcom的很多芯片,都具有广播风暴控制功能,用以限制广播速率(BroadcastRate)。
对于BCM56XX芯片,广播风暴控制功能可以通过BCAST_RATE_CONTRO寄存器的ENABLE位进行控制。
图13L2层对广播的处理
2.5.2单播处理(Unicast)
对于单播帧,首先会以{VLAN_ID,MAC_DA}为关键字搜索L2_ENTRY表。
如果查找到匹配的端口,会返回该端口所在的模块号(moduleid)和该端口的端口号(port#),以便正确转发。
如果没有查找到(没有找到的包被称为DLF=DestinationLookupFailures),这种包将会被送到该VLAN所包含的所有端口进行广播(Flood),注意这个广播和目的地址为0xff:
ff:
ff:
ff:
ff:
ff的广播(Broadcast)不是同一类,这里只是表示对这个帧进行洪泛(flood)转发。
但与Broadcast相同的是,并不是所有的Flood情况都可以被允许的,同样可以进行速率控制(Ratelimiting),只是所使用的寄存器不同,BCM56XX使用DLFBC_RATE_CONTROL寄存器进行控制。
图14单播帧的分类处理
其中L2层的处理(DoL2)如下:
图15DLF帧处理
对L2层的“正宗”单播包处理如下(注意Trunk的处理分支):
图16L2层单播帧处理
2.5.3L2多播(L2MC)
对于L2多播帧,这种帧的特征是DA[40]=1就是第40bit=1,同样会进行以{VLAN_ID,DA}为关键字的L2_ENTRY表搜索。
L2_ENTRY表中的匹配字将返回一个指针作为L2MC表的索引。
L2MC表包含多播组的成员端口信息,然后数据包会基于端口过滤模式(PortFilteringMode=PFM)进行发送,实际上端口过滤模式就是通过L2_ENTRY表和L2MC表的搜索结果共同决定的。
Multicast速率也可以通过寄存器限制,在BCM56XX芯片中该寄存器为MCAST_RATE_CONTROL,这个寄存器同时对L2和L3层的多播速率控制有效。
图17L2层多播帧处理
2.6L3路由交换(Routing)
2.6.1L3单播处理
如果在图13的L2层处理的时候发现是L3层单播帧(通过L3bit设置),那么它不会根据L2层对L2_ENTRY的查表结果进行转发,而会处理L3的相关信息,如果在查到的L2_ENTRY匹配结果中发现L3bit被设置,接下来该包会做下面这些检查(IP报文请参考附图之IPV4报文结构图):
1、是IP包
2、没有IP选项
3、IPV4报文
4、IP校验和OK(ChecksumOK)
5、生存时间OK(TTLOK)
6、目的IP地址是D类IP地址(DIPisClassD)
如果这些条件满足,那么源IP地址将作为关键字去搜索3层表项(L3Table)。
一旦发现匹配项,将更新查表命中位(HitBit),不过更新的前提条件是满足此设置:
ARL_CONTROL.L3SH_EN=1。
同样地L3表也通过目的IP地址进行搜索,如果返回匹配项,那么下一跳(NextHop)的MAC地址和Egress端口以及L3接口号(L3Intrefacenumber=L3INTF)等信息就可以由此获取,这些出口信息将被用于包的输出转发。
如果目的使用IP查表没有找到匹配项,则该IP按照“DEF_IP”处理(见下文)。
总结起来,L3单播的转发处理流程如下:
图18L3层单播帧处理
2.6.2L3多播处理
L3多播报文的特点是:
CONFIG.IPMC_ENABLE=1&!
Martini_pkt&(Pkt.DA[47:
24]=first24bitsis0x01005eandPkt.DA[23]=MostSignificantbitof4thByteis0),下面这些检查将进行:
1、是IP包
2、没有IP选项
3、IPV4报文
4、IP校验和OK(ChecksumOK)
5、目的IP地址是D类IP地址(DIPisClassD)
L3与L2的多播有点类似,不同的是它通过SIP+DIP和0+DIP进行转发搜索,搜索表项为L3_IPMC,这里不多说。
详情请看BCM56XX之PG文档。
图19L3层多播帧处理
2.6.3DEF_IP处理
当遇到DEF_IP(本地L3IP路由表无法查找到全匹配的情况)这种情况时,L3层交换机的所谓路由特性就显得更有意义了,这就是所谓的最长前缀匹配(LongestPrefixMatch=LPM)方式转发了,这正是L3路由交换之特性所在了。
因为DEF_IP涉及一些算法,我这里不详解,将DEF_IP的处理贴个图出来吧,有兴趣的同志可以研究(更多详细信息请参考BCM56XX之相关文档)。
图20DEF_IP处理
2.7快速包过滤处理(FFP)
FFP是FastFilterProcessor的简称。
在每一个FE和GE端口都有一个FFP(注意10Gbps的Higig端口没有FFP),过滤处理是在Ingress逻辑中完成的。
FFP可以对数据包分类并按照设置的规则进行处理,并可以决定包的输出转发行为。
FFP可以线速处理进入的通信流量,并可以把数据帧根据设置进行分类成不同的CoS,这有助于提供完好的服务质量以及方便MMU的策略处理。
FFP的四种关键操作是Masking、RuleMatching、Metering、PacketAccounting。
它可以根据特殊的设定对不同的帧进行不同的处理,FFP根据两个关键设置IMASK和IRULE对包进行规则处理,这样FFP的过滤处理就可以根据我们的意愿来选择和分类报文。
根据不同的IMASK和IRULE设置,FFP对报文的处理具有极大的灵活性。
本文阐释帧流程,不细致讨论主要依靠软件设置提供灵活性的FFP的具体处理行为。
2.8相关其他
因为FFP的灵活性,可以设置一些规则做到额外的功能特性。
比如选择性的接收或不接收某些帧,选择将帧送往CPU或直接处理,对特殊的帧做防护:
比如所谓的ARP攻击防护,所谓的DOS攻击防护等,这就是交换机的一种额外功能了。
前面的文档中可以看到有一些帧是被送往CPU处理的,而有些采取策略性丢弃。
Trunk功能也是一项重要的额外功能。
它是指将一组端口“绑定”或“聚合”到一起,表面上看起来是作为一个端口在使用。
它可以增加带宽,提供冗余性能等。
可以看到“L2层单播帧处理”中对Trunk的考虑。
Mirror功能是一个额外的功能,它可以作为对端口监视用,通常情况下不使用这个功能(某些出于要监视另一个端口帧时的调试可以使用此功能),但是在帧的处理流程中会有这么一个规则的考虑,图6中的最后一步就是针对Mirror的,它相当于提供一个捷径,会将某Ingress收到的东西不经过任何处理而Copy一份到某一个Egress上去。
3、MMU处理模块
MMU负责对帧进行缓存排队(buffering)处理和调度处理(scheduling),它从Ingress逻辑中接收帧,并调度、暂存这些帧,随后传送到Egress逻辑。
所有的帧存储和对帧缓存的维护管理都是通过MMU完成的,MMU表现为调度的核心所在。
图21MMU
3.1MMU的调度机制
一旦数据包被映射到CoS队列,他们的转发就是依靠MMU调度进行的,MMU调度机制有5种(以BCM56XX为例)可能的配置方式:
1)严格优先级方式(SP=StrictPriority)
2)轮询方式(RR=Round-Robin)
3)权重轮询式(WRR=WeightedRound-Robin)
4)权重公平队列式(WFQ