来源:http://blog.51cto.com/redant/314151
多层交换是指交换机使用硬件来交换和路由数据包,通过硬件来支持4-7层的交换。交换机执行硬件交换,第3层引擎(路由处理器)须将有关路由选择、交换、访问列表和QoS的信息下载到硬件中,以对数据包进行处理。
MLS使用ASIC(Application-Specific Integration Circuit,应用专用集成电路)执行2层的重写操作。2层重写包括重写源与目标MAC地址以及写入重新计算后的CRC(Cyclic Redundancy Check,循环冗余校验)。传统的MLS是基于NetFlow的交换。3层交换引擎(路由处理器)和2层交换ASIC芯片协同工作,建立3层条目。
3层条目包括3种形式:
1.源IP地址(S)
2.源和目标IP地址(S/D)
3.包含4层协议信息的完整流信息(FFI)
例:
工作站A向B发送数据包,首先将包发送给默认网关即RSM(route switch modual),MLS-SE交换机根据数据包所包含的目标IP为B的IP而目标MAC为MLS-RP模块的MAC地址这一特性识别出该包为一个MLS候选包。交换机由此创建流候选条目,接收包,重写2层MAC地址和CRC,转发数据包。交换机将RSM转发的数据包视为enabler数据包。在看到候选数据包和enabler包后,交换机耕硬件中创建一个MLS条目,以便后续包的的转发。
基于CEF的MLS
CEF的MLS是基于控制平面信息和数据平面信息进行多层交换。
控制平面是指第3层引擎(路由处理器),数据平面指交换机用来进行硬件交换的硬件组伯(ASIC,Catalyst6500的Supervisor Engine和PFC模块)。
CEF是基于拓扑的转发模型,预先将路由信息加入Forwarding Information Base中,动态更新邻接表中的第2层重写信息,因此可以快速查找路由选择信息(IP邻接关系,下一跳IP地址,MAC地址)。
CEF的两个组件:
FIB:基于目标IP前缀的交换决策,类似于路由器的路由表,FIB表为路由表中转发信息的镜像。
邻接关系表:如果在两个节点间,数据链路层只有一跳,则称为彼子相邻。用来存储第2层编址信息,维护所有FIB条目的第2层址。3层的交换引擎和硬件交换组件都维护一个邻接关系表。
控制平面(3层信息)用软件建立FIB表和邻接关系表,然后将这些信息下载到数据平面。
Catalyst6500系列交换机中,MSFC子卡负责控制平面的操作,Supervisor Engine和PFC模块负责数据平面的操作。
交换机上第3层交换方式包括集中式和分布式交换:
集中式交换是在一个专用的ASIC上做出转发决策,此ASIC芯片为3层交换中所有接口的枢纽。此时由Supervisor Engine或第3层引擎做出路由选择、ACL、QoS和转发决策。使用集中式交换时,交换机性能取决于中央交换引擎和交换矩阵/总线体系结构。
分布式交换是使用3层交换机的接口或线路模块独立地做出转发决策。中央交换引擎将负责第3层转发、路由选择表和重写表与本地表(位于分布式交换的模块上)进行同步。分布式交换机将CEF FIB和邻接表的副本放在线路模块或接口中,由此各线路卡独立的做出转发决策,数据帧通过交换矩阵直接在端口间传输,而不借助中央交换引擎。(*使用分布式交换,系统性能为所有转发引擎之和)
Catalyst6500交换机使用集成交换矩阵(中央分布式交换引擎)和DFC线路模块的Supervisor Engine720(分布式交换线路模块)。
地址解析协议抑制:可以使得第3层引擎避免过多的ARP处理或基于ARP的DoS攻击。
过程:
1.收到数据包
2.使用glean邻接关系表,查看表中有没有相关目标IP的2层重写信息
3.如果有交换信息,则直接交换数据包。如果没有,则发送ARP请求获取重写信息
4.转发前几个数据包给3层引擎,载入抑制邻接关系表
5.在ARP响应前丢弃所有后续数据包。
6.接到ARP请求回复,清除抑制邻居关系表。添加邻接关系条目。
7.如果2秒内没有ARP回复,清除抑制邻接关系表,允许更多的数据包转发给3层引擎来重新发起ARPP请求。
交换表的体系结构:多层交换机使用高速内存表来建立路由选择表(CEF FIB和邻接关系表),桥接表,QoS表和ACL。
多层交换用专门的内存体系结构:CAM(Content addressable Memory)和TCAM(Ternary Content Addressable Memory)。CAM提供两种结果0和1,TCAM提供三种结果0、1和无关紧要。CAM表可以构建准确查找的表(MAC地址表),TCAM用于构建最长匹配表(根据IP前缀的IP路由选择表)。
CAM表用于存储2层交换表,交换机以2进制方式精确查找CAM表,如果没有就采用默认的Flood行为。步骤:1.将用于查找的关键字传递给哈希算法,哈希算法在CAM中查找匹配的关键字。2.哈希算法返回一个与关键字匹配的指针。3.交换机根据指针找到结果,从而避免了顺序搜索整个表。
CAM表包括:目标VLAN、目标MAC地址和目标端口等信息。交换机在CAM表中不仅查找精确匹配的条目,还查找与掩码值相匹配的IP地址条目。
TCAM表是一种为快速查找而设计的表,用于最长匹配。通过使用TCAM,就用ACL不会影响交换机的性能。TCAM中每个条目由:value(模式值)+Mask(掩码值)+result(结果)组成。这种条目被称VMR条目。
Value(模式值)指的是要匹配的模式,如:IP地址、协议端口、DSCP值
Mask(掩码值 )用于决定前缀
Result(结果值)指的是与模式和掩码匹配时的结果(TCAM中存储IP路由选择表,则结果为返回一个指向硬件邻接关系表中的一个条目的指针,该条目包含下一跳MAC重写信息)或根据ACL匹配时所采取的permit或deny措施(TCAM中存储ACL)。
TCAM定义了三种匹配方式:
1.精确匹配区域:存储第3层条目的区域,如IP邻接关系条目(包含IP地址下一跳信息“MAC地址”),第2层交换表和UDP扩散表。
2.最长匹配区域:包含多个3层地址条目组,按掩码长度降序排列。相同组内所有条目具有相同的掩码值和关键字长度。条目组可以通过从邻接组中借用地址条目的方法,动态的改变条目组的大小。重新启动系统后,重新配置的协议区域大小才会生效。
3.首次匹配区域:找到匹配后立即停止查找的区域,如ACL条目。
常见的TCAM协议区域:
精确匹配区域:in-adjacency(IP邻接关系)32 bit,12-switching(第2层交换)64 bit,udp-flooding(UDP扩散)64 bit。
最长匹配区域:ip-prefix(IP前缀)32 bit,ip-mcast(IP多播)64 bit
首次匹配区域:access-list(访问列表)128 bit
基于CEF的MLS的交换机默认情况下启用CEF,启用基于CEF的MLS和基于目标的负载均衡。
查看第3层引擎的CEF表:show ip cef [detail]
查看第3层引擎的邻接表:show adjacency
CEF将用ARP获得的MAC地址来填充邻接关系表,邻接关系表包含邻接节点的MAC地址重写信息和目标接口。CEF表中所有IP路由选择条目都对应于一个下一跳地址。当交换机收到目标IP非自身,目标MAC为交换机自身时,将在CEF表中查找目标IP所对应的转发MAC地址,然后从接口中传出。
单条CEF条目可能指向多个邻接关系条目。FIB表将维护该子网的前缀。子网前缀指向一个glean邻接关系条目。
如果接口配置了NAT或收到的数据包中包含IP报头选项,则需要对数据包进行特殊处理。邻接关系处理的特殊情况有:
1.Punt(转出)邻接关系条目:需要3层引擎进行处理或硬件交换不支持的特性
2.drop邻接关系条目:用于丢弃入站数据包
3.Null邻接关系条目:用于丢弃前往Null0接口的数据包,Null0接口用于过滤开自特定源的IP数据包
不能被硬件交换方式所支持的常见帧类型:
1.包含IP报头选项的数据包
2.源自/去往隧道接口的数据包
3.使用的以太网封装类型(非APRA)的数据包
4.需要分段的数据包
- (转载)Log4Net 在多层项目中的使用小记
(原创)Log4Net 在多层项目中的使用小记 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各 ...
- Qt中使用CEF(Windows下)
最近项目中要在Qt中使用CEF(Chromium Embedded Framework),在这里总结下其中的几个要点. 下载合适的CEF版本 关于CEF的简介我们这里就不做介绍了,下载CEF可以有2种 ...
- 无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护
golang/goroutine 和 swoole/coroutine 协程性能测试对比 - Go语言中文网 - Golang中文社区 https://studygolang.com/articles ...
- 使用CEF(四)— 在QT中集成CEF(1):基本集成
QT作为C++下著名的跨平台软件开发框架,实现了一套代码可以在所有的操作系统.平台和屏幕类型上部署.我们前几篇文章讲解了如何构建一款基于CEF的简单的样例,但这些样例的GUI都是使用的原生的或者是控件 ...
- Log4Net 在多层项目中的使用小记
原文地址:http://www.cnblogs.com/zdh8675/p/3645556.html 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用 ...
- UIGestureRecognizer在多层视图中的触发问题
在一个superview中,添加了一个subview.tap一下superview,将subview隐藏起来. 在视图superview添加一个UITapGestureRecognizer对象,在UI ...
- (原创)Log4Net 在多层项目中的使用小记
这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各有各的说法,我结合我自己这个项目的需要,首先,项 ...
- go语言怎么从(json后的)多层map中取值
// 一个PHP中的多层关联数组,即Go中的多层map,如何从json字符串中解析,然后取到map中的某个具体的值. // 数据结构如下: cityInfo := "{ "stat ...
- webdriver如何定位多层iframe中元素
在 web 应用中经常会出现 iframe 嵌套的应用,假设页面上有 A.B 两个 iframe,其中 B 在 A 内,那么定位 B 中的内容则需要先到 A,然后再到 B. iframe 中实际上是嵌 ...
随机推荐
- 初试kotlin:用Kotlin开发桌面/CommandLine 工具
既然kotlin是google和jetbrain联合搞的,开发环境不用说了肯定是Intellij Idea了. 先创建一个kotlin项目. 先来一个HelloWorld package com.xi ...
- 1_01 vue的双向绑定
听说vue1是双向绑定,不过现在Vue2不能直接双向绑定,需要设置绑定. 一.常见的是input表单的v-model const component = { template: ` <div&g ...
- 《Java程序设计》 第四周学习总结
学号 20175313 <Java程序设计>第四周学习总结 教材学习内容总结 第五章主要内容 了解子类的继承性 子类和父类在同一包中的继承性(除private外其余都继承) 子类和父类不在 ...
- 利用django-crontab设定定时任务
Django中想要设定定时任务的方法有很多,如celery.apscheduler.crontab等等,本文用crontab来实现. 想用apscheduler实现请看本人另一篇博客:使用APSche ...
- Python静态方法(staticmethod)和类方法(classmthod)
Python静态方法(staticmethod)和类方法(classmthod)翻了翻之前的笔记,也刚好看到一篇不错的blog,关于静态方法和类方法的,方便以后查阅,就写在这里了,废话不多说,直接上代 ...
- 【JVM】-NO.110.JVM.1 -【JDK11 HashMap详解】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- python数据结构-如何快速找到多个字典中的公共键
如何快速找到多个字典中的公共键 问题举例 统计每轮都进球的球员: 第1轮{‘tom’:1, 'meixi':2} 第2轮{‘coco’:3, 'meixi':4, 'marton':2} 第3轮{'c ...
- android studio 中如何合并冲突(转)
合并分支,解决冲突 执行Git merge ,如果有冲突,就会出现如下格式: <<<<<<< HEAD 这个位置的内容就是当前所在分支的内容 ======= ...
- bzoj1911 [Apio2010]特别行动队commando
题目链接 斜率优化 #include<cstdio> #include<cstdlib> #include<string> #include<cstring& ...
- numpy 数组对象
numpy 数组对象NumPy中的ndarray是一个多维数组对象,该对象由两部分组成:实际的数据,描述这些数据的元数据# eg_v1 import numpy as np a = np.arange ...