精华内容
下载资源
问答
  • CAM表

    千次阅读 2017-05-15 23:52:44
    CAM表”:就是指二层交换机上运行的Cisco IOS在内存中维护的一张表,CAM表是交换机在二层转发数据要查找的表,表中有MAC地址,对应的端口号,端口所属的VLAN。 交换机的每一个二层端口都有MAC地址自动学习的功能...

    “CAM表”:就是指二层交换机上运行的Cisco IOS在内存中维护的一张表,CAM表是交换机在二层转发数据要查找的表,表中有MAC地址,对应的端口号,端口所属的VLAN

    交换机的每一个二层端口都有MAC地址自动学习的功能,当交换机收到PC发来的一个帧,就会查看帧中的源MAC地址,并查找CAM表,如果有就什么也不做,开始转发数据。如果没有就存入CAM表,以便当其他人向这个MAC地址上发送数据时,可以决定向哪个端口转发数据。

    需要注意的是,数据帧的转发是依据目的MAC地址查询CAM表,而CAM表的学习则是以源MAC地址为依据


    有一种类型的DOS攻击是这样的:黑客会进入园区网内部(不管是直接进入还是选取内网的一台PC作为跳板)使用黑客软件全速向一台二层的交换机发送帧,这个黑客软件有一个功能就是每发一个帧就会改变一次原始MAC地址。我们知道二层交换机的端口都默认开启了MAC地址自动学习的功能,并且无法关闭。交换机会在它的内存中维护一张CAM表,CAM表中有MAC地址,对应的端口号(也就是进入的端口,代表PC连接在这个端口上)端口所属的VLAN。CAM表就是二层交换机转发数据帧要查找的表。然而交换机的内存不是无穷大的,如果每发个帧就改变一次MAC地址那么很快交换机的CAM表就变得非常的大。当交换机的内存再也没有空间来容纳CAM表的增长时CAM表就停止增长,而这时候用户A接入交换机发送数据帧的时候,交换机没有办法学习到用户A的mac地址,假如用户B也接入了交换机,B向A发送数据,由于交换机不知道A的MAC地址,这个时候交换机会做一件事情,就是把这个数据帧以广播的形式转发给所有的端口,当然也包括黑客的PC,只要黑客在它的PC上开一个抓包软件,不管是密码还是私密信息,统统都可以看到。

    展开全文
  • FPGA实现CAM表

    2020-07-20 11:15:48
    一、CAM表概述 FPGA中有BRAM,即block ram,一种存储器。可以给数据和地址写入数据,并且给地址读出对应的数据。 相反地,给数据和地址写入数据之后,如果给数据来读出对应的地址,这样的存储结构就是CAM表CAM表既...

    一、CAM表概述

    FPGA中有BRAM,即block ram,一种存储器。可以给数据和地址写入数据,并且给地址读出对应的数据。
    相反地,给数据和地址写入数据之后,如果给数据来读出对应的地址,这样的存储结构就是CAM表,CAM表既可以用硬件电路做出也可以用FPGA来实现。

    二、BLOCK图

    在这里插入图片描述
    CAM表使用了2个RAM(单双口都可以)以及一个crc-32模块来实现,其中crc-32是为了压缩数据,将压缩后的数据当做两个RAM的地址,然后将data和addr写入data_ram,将冲突数写入conflict_ram。
    PS:
    1.用crc-32的原因:如果一个地址对应一个数据的话,有人肯定会想直接把数据当做地址来写入ram中,想法是对的,但是在fpga上面很难实现,因为fpga芯片中的bram资源有限,光是36bit位宽的数据,如果有2^16个这样的数据,使用bram搭建存储器来存储的话,就得用掉64个36kb的bram,实际上位宽可能更大,然而fpga中的bram不多,并且大量调用会引入布局布线的时序违规。
    2.为啥不用hash算法:hash算法比较复杂并且生成的hash值位宽较大,这个crc-32更快,用异或逻辑实现的,还可以在线工具直接生成。
    3.冲突的概念:因为crc_32是对数据压缩了,64-32,如果0-2^64输入进去,输出肯定会有两两重复的32bit的数,因为你不可能用32个位宽表达出所有的64位宽的数。这就是冲突。
    这里我们只取了32bit中的低12bit,也就导致了冲突级数更大了,所以用一个conflict_ram来存取冲突级数(即出现过多少次相同的hash值)。

    三、时序描述

    cam表的功能时序应该分为3部分:初始化–写入–寻找。
    初始化:两个ram全地址写0,因为可能会在写入之后需要重新配置,所以需要初始化模式;
    写入:写入地址和数据,就是配置阶段;
    寻找:给数据,找对应的地址,告诉我找没找到。

    四、部分代码

    主要是定义了一些接口,还有主要的状态机,后面的代码就是一些中间寄存器的控制以及crc和xpm_sdpram的例化了,数量太多就不粘贴了。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    五、仿真效果

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    总共在0-10000地址中输入10000个随机数,然后还在tb里面写了个比对,通过写入文件的方式来查看查找的时候由于冲突多余4个被丢了哪些数。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • CAM表含义及各层交换机介绍

    千次阅读 2016-03-15 10:30:39
    转自:http://skyeagle.blog.51cto.com/417071/93338所谓CAM表是用于二层交换的地址表,通常称为CAM表,该表是MAC地址与出接口的对应关系,对于二层交换机和三层交换机都会维护这张表。三层交换机基本特点在概述部分...

    转自:http://skyeagle.blog.51cto.com/417071/93338

    所谓CAM表是用于二层交换的地址表,通常称为CAM表,该表是MAC地址与出接口的对应关系,对于二层交换机和三层交换机都会维护这张表。

    三层交换机基本特点

    在概述部分中,我们给出了三层交换机的基本特点综述,主要有下列特点:
    1. 二层交换和三层互通
    2. 实现三层精确匹配查询
    3. 专门针对局域网,特别是以太网进行了优化
    4. 引入了一些在二层交换机和三层路由器上都不存在的特性
    5. 实现了初步的BAS功能
    一般来说,只要能做到第一点,就可以称为三层交换机了,但目前大多数流行的三层交换机都不局限于第一点,而是实现了上述的大部分功能。因此,为了更好的理解三层交换机,接下来我们对上述特点进行详细讲述。

    2.1 二层交换和三层互通

    三层交换机首先是一个交换机,即完成二层交换功能。在以太网上,跟普通的二层交换机一样,三层交换机也维护一张用于二层交换的地址表(通常称为CAM表),该表是MAC地址与出接口的对应关系。这样每当接收到一个以太网数据帧,三层交换机判断如果该数据帧不是发送给自己的(这个概念很重要,至于三层交换机怎么判断,在下面的讲述中会详细说明),则根据数据帧的目的MAC地址查询CAM表,如果能命中(所谓命中,就是在CAM表中找到与该MAC地址对应的转发项),则根据查询的结果,通常是一个出接口列表,来进行转发。如果不能命中,则向所有端口广播该数据帧。
    交换机的这张CAM表可以通过多种方式获得,比如静态配置,动态学习,针对多播还可以通过各种多播协议,比如IGMP窥探,GMRP协议等方式获得(注意,多播转发表不能通过学习获得,而且多播转发项跟普通转发项不同的是,跟其对应的出口可能不止一个,而是一个出口集合,如果想详细了解多播的一些基础概念,请参考前面的专题资料)。但对于单播,最重要的一种建立方式是学习。
    当交换机接收到一个数据帧,提取出该数据帧的目的MAC地址,并依此为根据进行CAM表查询,如果能查找到结果,则根据结果进行数据帧的转发,如果不能命中,则(向除接收端口外的)所有端口进行复制。在进行数据转发的同时,交换机还进行一个学习的过程,交换机把数据帧的源MAC地址提取出来,查询CAM表,看CAM表中是否有针对该MAC地址的转发项,如果没有,则把该MAC地址和接收到该MAC地址的端口绑定起来,插入CAM表项,这样当接收到一个发送到该MAC地址的数据帧时,就不需要向所有端口广播,而仅仅向这一个端口发送即可。需要注意的是,数据帧的转发是依据目的MAC地址查询CAM表,而CAM表的学习则是以源MAC地址为依据。
    交换机动态学习的CAM表项并不是一成不变的,而是启动一个定时器,当该定时器递减到零时,该CAM表项被删除,每使用一次该CAM表项进行转发,则恢复定时器初始值。
    上述情况是没有VLAN的工作过程,现在的交换机一般都实现了VLAN(即虚拟局域网,详细内容请参考以太网的有关教程),这样在交换机进行转发的CAM表就进行了变化,由原来的两项对应关系(MAC地址跟接口)变成了三项对应关系(MAC地址,VLAN ID,出口),这样当接收到一个数据帧的时候,交换机根据数据帧的目的MAC地址和VLAN ID两项来查询CAM表,找到接口后把该数据帧转发出去。
    但如果交换机根据MAC地址和VLAN ID查询CAM表失败,即没有跟该MAC和VLAN ID的对应关系,则交换机把该数据帧向该VLAN包含的(除接收端口以外的)所有端口上复制。如果只根据CAM表来确定一个VLAN包含哪些端口,则必须遍历整个CAM表,这样如果CAM表的规模非常大(一般情况下是4K以上),则效率特别低,所以一般的交换机上在实现VLAN时,还创建另外一张表,即VLAN配置表,该表包含了VLAN ID和所有端口的对应关系,即只要根据VLAN ID查询该表,就可以找到该VLAN包含的所有端口,这样在进行VLAN内广播的时候,就非常容易。
    另外一个问题出现了,就是数据帧的VLAN ID是怎样获得的。交换机一般根据下列原则来给一个数据帧附加上VLAN ID:
    1、如果接收到数据帧的端口是一个非TAG端口,且数据帧是一个普通数据帧,则附加上该端口的默认VLAN ID;
    根据农基文的理解:当一个非TAG端口收到了一个数据帧,且含有VLAN ID时,做判断,如果VLAN ID=端口PVID,则可以接收;否则,丢弃。
    2、如果接收到数据帧的端口是一个TAG端口,而数据帧是一个普通数据帧,则附加上该端口的默认VLAN ID;
    3、如果接收到数据帧的端口是一个TAG端口,数据帧自己携带了VLAN ID(通过802.1Q协议),则该数据帧的VLAN ID就是携带的VLAN ID。
    需要注意的是,实现VLAN的交换机在查询CAM表进行转发之前,首先给该数据帧附加上VLAN ID。
    以上功能都是二层功能,作为一台三层交换机,上述功能是必须实现的,但三层交换机的最根本特点还是VLAN间的互通。
    在三层交换机上,VLAN之间的互通是通过实现一个虚拟VLAN接口来实现的,即针对每个VLAN,交换机内部维护了一个与该VLAN对应的接口,该接口对外是不可见的,是一个虚拟的接口,但该接口有所有物理接口所具有的特性,比如有MAC地址,可配置最大传输单元和传输的以太网帧类型等。在上述的说明中,我们提到了当交换机接收到一个数据帧时,判断是不是发给自己的,判断的依据便是查看该MAC地址是不是针对接收数据帧所在VLAN的接口MAC地址,如果是,则进行三层处理,若不是,则进行二层处理,按照上述流程进行转发。
    既然实现了三层转发,交换机必须维护一个三层转发表,该表可以是基于最长匹配查询的FIB表,也可以是基于目的网络层地址精确匹配的三层转发表,这跟实现的厂家设备有关。这样当交换机接收到一个数据帧,该数据帧的目的MAC地址跟该数据帧所在VLAN对应的VLAN接口的MAC地址相同,则进行三层转发。转发的过程是查询三层转发表,查找的结果是一个(或多个,当数据帧是多播的时候)出口和相应的二层封装数据,交换机于是把该数据帧所携带的三层数据帧(比如,是IP或IPX数据报)进行修改,比如修改校验和,在IP协议中还进行TTL字段递减,然后重新计算CHECKSUM,完成这些后,就把该三层数据包进行二层封装(根据三层转发表查找的结果),从相应的接口发送出去。
    这个三层转发表的形成跟二层转发表(CAM表)的形成有很大的不同,它是通过查询路由表并经过其它协议(比如ARP协议)形成的。在后面介绍典型产品实例的时候,我们以例子来讲述三层转发表的形成。
    & 本部分有下列要点:
    1、三层交换机有二层交换机所有功能,比如基于MAC地址的过滤(也就是基于MAC地址的单播转发),生成树协议等;
    2、三层交换机通过为每个VLAN分配一个VLAN接口完成VLAN之间的互通,VLAN接口有自己的MAC地址和IP地址,凡目的MAC地址是VLAN接口的数据帧,交换机都进行三层转发或自己接收—取决于目的IP地址是否是交换机的接口地址。

    2.2 三层精确匹配查询

    在路由器上,每当接收到一个数据报,路由器便进行路由表的查询来找出该数据报的下一跳,然后通过相应的接口发送出去。路由器查询路由表采用的是最长匹配算法,在以前的路由器中,最长匹配算法采用软件实现,而且实现起来非常复杂,导致了效率特别低。
    我们可以设想,能否改变这种最长匹配的查找思想,而采用精确匹配的查找技术实现呢?可以引入一个高速缓冲区,用来存放精确查询所需要的信息(一般是三层IP地址跟出口的对应fib表,还关联有一些二层封装信息Arp表,比如链路层头等),当接收到一个需要进行三层转发的数据帧的时候,路由器先查询高速缓冲区(采用精确匹配算法,即直接根据目的IP地址进行索引),如果命中,则根据查询出的信息进行数据的转发,如果不能命中,则查询路由表(采用最长匹配算法),根据查询的结果进行转发,同时更新相应的精确查询缓冲区,这样当到达同一个目的地的数据报来的时候,就可以直接查询精确匹配缓冲区进行转发了。
    跟CAM表一样,精确匹配查询项也有一个定时机制,超过了一定的时间限制就从缓冲区中删除掉,跟CAM表不同的是,三层精确匹配查询项跟路由表同步,每当路由表变化,必定修改精确转发缓冲区,来保证跟路由表的同步。
    如果数据链路层是以太网,网络层是IP,则这个三层高速转发缓冲区是通过ARP协议建立的,我们说明它的工作过程。
    开始的时候,三层交换机只有一张用于路由的路由表(该路由表是通过路由协议建立的),而精确匹配的三层转发表为空,这样当三层交换机接收到一个需要进行三层交换的数据帧时,它首先查询三层精确匹配缓冲区,因为三层转发表为空,查询失败,于是,三层交换机通过最长匹配算法查询路由表(根据数据报的目的IP地址),查询的结果是一个出口(一般是一个VLAN接口)和一个下一跳。于是,有两中可能的情况:
    1、数据报的目的地址跟VLAN接口不在同一个网段;
    2、数据报的目的地址跟VLAN接口在同一个网段。
    在第一种情况下,三层交换机通过ARP解析来解析下一跳IP地址,获得下一跳的MAC地址后,三层交换机把接收的数据帧进行二层封装,然后发送给下一跳。在第二种情况下,三层交换机直接解析数据报的目的IP地址,获得目的IP地址对应的主机MAC地址后,直接把该数据帧发送给目的主机。不论哪种情况,交换机进行ARP解析的时候,都会获得一个IP地址跟出口的对应关系,同时还通过ARP协议获得了下一跳的MAC地址,于是,三层交换机会把这些数据组合成一个三层精确匹配项,并插入到三层精确匹配缓冲区里面。这样当到达同一目的地的数据报到来后,三层交换机使用精确匹配算法直接查询高速缓冲区,根据查询的结果进行转发。
    需要说明的是,实现三层精确匹配并不是三层交换机必须具备的特性。在一些低端交换机的场合下,最长匹配查询采用软件实现,效率特别低,因而引入三层精确匹配算法,这是合理而且必须的,但对一些高端场合,就不适应了,在一些高端交换机上,最长匹配算法都是基于硬件实现的,而且采用了效率很高的树查找算法,其效率跟精确匹配算法相差无几,而且只采用最长匹配算法还减少了精确匹配缓冲区和路由表的同步问题,因而在一些基于硬件实现的三层交换机上,精确匹配不是必须的。在后面介绍典型实例分析的时候,我们会介绍仅仅采用最长匹配算法实现高端三层的交换机。
    & 本部分有下列要点:
    1、三层交换机为了提高效率,采用了精确匹配查找算法,在一些高端三层交换机上,该特性不是必须的,因为采用最长匹配查找算法的效率并不一定比采用精确匹配查找算法效率差。

    2.3 针对局域网进行优化

    传统的路由器提供丰富的接口种类,比如E1/T1,ISDN,Frame-Relay,X.25,POS,ATM,SMDS等,每种接口对应不同的封装类型,而且每种接口所对应的最大传输单元和最大接收单元都不相同,这样存在数据报分片的概率相当大,概括起来,这些特性使得路由器的转发效率特别低。
    而三层交换机是由二层交换机发展起来的,而且其发展过程中一直遵循为局域网服务的指导思想,没有过多的引入其它接口类型,而只提供跟局域网有关的接口,比如以太网接口,ATM局域网仿真接口等,这样接口类型单纯,大部分情况下三层交换机只提供以太网接口,这样在多种类型接口路由器上所碰到的问题就彻底消除了,比如,最大传输单元问题,由于各个接口都是以太网接口,一般不存在冲突的问题,分片的概率就大大降低了。
    接口类型单纯的另外一个好处就是在进行数据转发的时候,内部经过的路径比较单纯。现在的通信处理器一般都是集中在一块ASIC芯片上的,而且不同的接口类型有不同的ASIC芯片进行处理。这样如果接口类型比较单一,所需要的ASIC芯片就相对单一,交互起来必定流畅,使用ASIC芯片本身带的功能就可以完成多个接口之间的数据交换,但如果接口类型不统一,则必须有一个转换机构来完成这些芯片之间的数据交换,效率上大大影响。
    目前成熟的以太网接口速率最高可以达到1G(虽然10G的以太网已经商用,但还不是很普遍),如果需要更高的速率,只能采用链路聚合的方式把几个GE端口聚合成一个物理端口,虽然逻辑上是可行的,但实现起来可能会遇到这样那样的问题,比如聚合的链路不能跨越同一块处理板,芯片本身的问题等,于是有些交换机抛弃了这种纯粹以太网接口的解决方案,而引入了其它的接口类型作为上行接口,比如STM-16的POS接口(2.5G POS接口)等。这些接口用于上行连接核心层设备。
    & 本部分有下列要点:
    1、三层交换机专门针对局域网进行了优化,采用的接口类型比较单纯,一般只提供以太网接口,但有些交换机为了提高上行链路的效率,也提高了高速的POS接口。
    二层、三层、四层交换机的区别
     二层交换技术是发展比较成熟,二层交换机属数据链路层设备,可以识别数据包中的MAC地址信息,根据MAC地址进行转发,并将这些MAC地址与对应的端口记录在自己内部的一个地址表中。具体的工作流程如下:
    (1) 当交换机从某个端口收到一个数据包,它先读取包头中的源MAC地址,这样它就知道源MAC地址的机器是连在哪个端口上的;
    (2) 再去读取包头中的目的MAC地址,并在地址表中查找相应的端口;
    (3) 如表中有与这目的MAC地址对应的端口,把数据包直接复制到这端口上;
    (4) 如表中找不到相应的端口则把数据包广播到所有端口上,当目的机器对源机器回应时,交换机又可以学习一目的MAC地址与哪个端口对应,在下次传送数据时就不再需要对所有端口进行广播了。
      不断的循环这个过程,对于全网的MAC地址信息都可以学习到,二层交换机就是这样建立和维护它自己的地址表。
      从二层交换机的工作原理可以推知以下三点:
    (1) 由于交换机对多数端口的数据进行同时交换,这就要求具有很宽的交换总线带宽,如果二层交换机有N个端口,每个端口的带宽是M,交换机总线带宽超过N×M,那么这交换机就可以实现线速交换;
    (2) 学习端口连接的机器的MAC地址,写入地址表,地址表的大小(一般两种表示方式:一为BEFFER RAM,一为MAC表项数值),地址表大小影响交换机的接入容量;
    (3) 还有一个就是二层交换机一般都含有专门用于处理数据包转发的ASIC (Application specific Integrated Circuit)芯片,因此转发速度可以做到非常快。由于各个厂家采用ASIC不同,直接影响产品性能。
      以上三点也是评判二三层交换机性能优劣的主要技术参数,这一点请大家在考虑设备选型时注意比较。
      (二)路由技术
      路由器工作在OSI模型的第三层—网络层*作,其工作模式与二层交换相似,但路由器工作在第三层,这个区别决定了路由和交换在传递包时使用不同的控制信息,实现功能的方式就不同。工作原理是在路由器的内部也有一个表,这个表所标示的是如果要去某一个地方,下一步应该向那里走,如果能从路由表中找到数据包下一步往那里走,把链路层信息加上转发出去;如果不能知道下一步走向那里,则将此包丢弃,然后返回一个信息交给源地址。
      路由技术实质上来说不过两种功能:决定最优路由和转发数据包。路由表中写入各种信息,由路由算法计算出到达目的地址的最佳路径,然后由相对简单直接的转发机制发送数据包。接受数据的下一台路由器依照相同的工作方式继续转发,依次类推,直到数据包到达目的路由器。
      而路由表的维护,也有两种不同的方式。一种是路由信息的更新,将部分或者全部的路由信息公布出去,路由器通过互相学习路由信息,就掌握了全网的拓扑结构,这一类的路由协议称为距离矢量路由协议;另一种是路由器将自己的链路状态信息进行广播,通过互相学习掌握全网的路由信息,进而计算出最佳的转发路径,这类路由协议称为链路状态路由协议。
      由于路由器需要做大量的路径计算工作,一般处理器的工作能力直接决定其性能的优劣。当然这一判断还是对中低端路由器而言,因为高端路由器往往采用分布式处理系统体系设计。
      (三)三层交换技术
      近年来的对三层技术的宣传,耳朵都能起茧子,到处都在喊三层技术,有人说这是个非常新的技术,也有人说,三层交换嘛,不就是路由器和二层交换机的堆叠,也没有什么新的玩意,事实果真如此吗?下面先来通过一个简单的网络来看看三层交换机的工作过程。

      组网比较简单
      使用IP的设备A————————三层交换机————————使用IP的设备B
      比如A要给B发送数据,已知目的IP,那么A就用子网掩码取得网络地址,判断目的IP是否与自己在同一网段。
      如果在同一网段,但不知道转发数据所需的MAC地址,A就发送一个ARP请求,B返回其MAC地址,A用此MAC封装数据包并发送给交换机,交换机起用二层交换模块,查找MAC地址表,将数据包转发到相应的端口。
      如果目的IP地址显示不是同一网段的,那么A要实现和B的通讯,在流缓存条目中没有对应MAC地址条目,就将第一个正常数据包发送向一个缺省网关,这个缺省网关一般在*作系统中已经设好,对应第三层路由模块,所以可见对于不是同一子网的数据,最先在MAC表中放的是缺省网关的MAC地址;然后就由三层模块接收到此数据包,查询路由表以确定到达B的路由,将构造一个新的帧头,其中以缺省网关的MAC地址为源MAC地址,以主机B的MAC地址为目的MAC地址。通过一定的识别触发机制,确立主机A与B的MAC地址及转发端口的对应关
    系,并记录进流缓存条目表,以后的A到B的数据,就直接交由二层交换模块完成。这就通常所说的一次路由多次转发。
      以上就是三层交换机工作过程的简单概括,可以看出三层交换的特点:
      由硬件结合实现数据的高速转发。
      这就不是简单的二层交换机和路由器的叠加,三层路由模块直接叠加在二层交换的高速背板总线上,突破了传统路由器的接口速率限制,速率可达几十Gbit/s。算上背板带宽,这些是三层交换机性能的两个重要参数。
      简洁的路由软件使路由过程简化。
      大部分的数据转发,除了必要的路由选择交由路由软件处理,都是又二层模块高速转发,路由软件大多都是经过处理的高效优化软件,并不是简单照搬路由器中的软件。
      结论
      二层交换机用于小型的局域网络。这个就不用多言了,在小型局域网中,广播包影响不大,二层交换机的快速交换功能、多个接入端口和低谦价格为小型网络用户提供了很完善的解决方案。
      路由器的优点在于接口类型丰富,支持的三层功能强大,路由能力强大,适合用于大型的网络间的路由,它的优势在于选择最佳路由,负荷分担,链路备份及和其他网络进行路由信息的交换等等路由器所具有功能。
      三层交换机的最重要的功能是加快大型局域网络内部的数据的快速转发,加入路由功能也是为这个目的服务的。如果把大型网络按照部门,地域等等因素划分成一个个小局域网,这将导致大量的网际互访,单纯的使用二层交换机不能实现网际互访;如单纯的使用路由器,由于接口数量有限和路由转发速度慢,将限制网络的速度和网络规模,采用具有路由功能的快速转发的三层交换机就成为首选。
      一般来说,在内网数据流量大,要求快速转发响应的网络中,如全部由三层交换机来做这个工作,会造成三层交换机负担过重,响应速度受影响,将网间的路由交由路由器去完成,充分发挥不同设备的优点,不失为一种好的组网策略,当然,前提是客户的腰包很鼓,不然就退而求其次,让三层交换机也兼为网际互连。
      第四层交换的一个简单定义是:它是一种功能,它决定传输不仅仅依据MAC地址(第二层网桥)或源/目标IP地址(第三层路由),而且依据TCP/UDP(第四层) 应用端口号。第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。
      在第四层交换中为每个供搜寻使用的服务器组设立虚IP地址(VIP),每组服务器支持某种应用。在域名服务器(DNS)中存储的每个应用服务器地址是VIP,而不是真实的服务器地址。
      当某用户申请应用时,一个带有目标服务器组的VIP连接请求(例如一个TCP SYN包)发给服务器交换机。服务器交换机在组中选取最好的服务器,将终端地址中的VIP用实际服务器的IP取代,并将连接请求传给服务器。这样,同一区间所有的包由服务器交换机进行映射,在用户和同一服务器间进行传输。
      第四层交换的原理
      OSI模型的第四层是传输层。传输层负责端对端通信,即在网络源和目标系统之间协调通信。在IP协议栈中这是TCP(一种传输协议)和UDP(用户数据包协议)所在的协议层。
      在第四层中,TCP和UDP标题包含端口号(portnumber),它们可以唯一区分每个数据包包含哪些应用协议(例如HTTP、FTP等)。端点系统利用这种信息来区分包中的数据,尤其是端口号使一个接收端计算机系统能够确定它所收到的IP包类型,并把它交给合适的高层软件。端口号和设备IP地址的组合通常称作“插口(socket)”。 1和255之间的端口号被保留,他们称为“熟知”端口,也就是说,在所有主机TCP/IP协议栈实现中,这些端口号是相同的。除了“熟知”端口外,标准UNIX服务分配在256到1024端口范围,定制的应用一般在1024以上分配端口号. 分配端口号的最近清单可以在RFc1700”Assigned Numbers”上找到。TCP/UDP端口号提供的附加信息可以为网络交换机所利用,这是第4层交换的基础。
     
       “熟知”端口号举例:
        应用协议     端口号
        FTP        20(数据)
                 21(控制)
        TELNET     23
        SMTP      25
        HTTP       80
        NNTP      119
        NNMP      16
                 162(SNMP traps)
                 
      TCP/UDP端口号提供的附加信息可以为网络交换机所利用,这是第四层交换的基础。
      具有第四层功能的交换机能够起到与服务器相连接的“虚拟IP”(VIP)前端的作用。
      每台服务器和支持单一或通用应用的服务器组都配置一个VIP地址。这个VIP地址被发送出去并在域名系统上注册。
      在发出一个服务请求时,第四层交换机通过判定TCP开始,来识别一次会话的开始。然后它利用复杂的算法来确定处理这个请求的最佳服务器。一旦做出这种决定,交换机就将会话与一个具体的IP地址联系在一起,并用该服务器真正的IP地址来代替服务器上的VIP地址。
      每台第四层交换机都保存一个与被选择的服务器相配的源IP地址以及源TCP 端口相关联的连接表。然后第四层交换机向这台服务器转发连接请求。所有后续包在客户机与服务器之间重新影射和转发,直到交换机发现
    会话为止。
     
      在使用第四层交换的情况下,接入可以与真正的服务器连接在一起来满足用户制定的规则,诸如使每台服务器上有相等数量的接入或根据不同服务器的容量来分配传输流。
      如何选用合适的第四层交换
      
      a.速度
      为了在企业网中行之有效,第四层交换必须提供与第三层线速路由器可比拟的性能。也就是说,第四层交换必须在所有端口以全介质速度*作,即使在多个千兆以太网连接上亦如此。千兆以太网速度等于以每秒488000 个数据包的最大速度路由(假定最坏的情形,即所有包为以及网定义的最小尺寸,长64字节)。
      b.服务器容量平衡算法
      依据所希望的容量平衡间隔尺寸,第四层交换机将应用分配给服务器的算法有很多种,有简单的检测环路最近的连接、检测环路时延或检测服务器本身的闭环反馈。在所有的预测中,闭环反馈提供反映服务器现有业务量的最精确的检测。
      c.表容量
      应注意的是,进行第四层交换的交换机需要有区分和存贮大量发送表项的能力。交换机在一个企业网的核心时尤其如此。许多第二/ 三层交换机倾向发送表的大小与网络设备的数量成正比。对第四层交换机,这个数量必须乘以网络中使用的不同应用协议和会话的数量。因而发送表的大小随端点设备和应用类型数量的增长而迅速增长。第四层交换机设计者在设计其产品时需要考虑表的这种增长。大的表容量对制造支持线速发送第四层流量的高性能交换机至关重要.
      d.冗余
      第四层交换机内部有支持冗余拓扑结构的功能。在具有双链路的网卡容错连接时,就可能建立从一个服务器到网卡,链路和服务器交换器的完全冗余系统。

    展开全文
  • 网桥之cam表的操作...

    网桥之cam表的操作
    http://blog.sina.com.cn/s/blog_52355d840100arv8.html
    http://blog.sina.com.cn/s/blog_52355d840100arv9.html
    http://blog.csdn.net/linyt/article/details/5191512
    http://blog.chinaunix.net/space.php?uid=24836818&do=blog&id=2562048
    http://blog.chinaunix.net/space.php?uid=20543183&do=blog&frmd=29887&view=me


    网桥之所以是网桥,主要靠这两个函数:
    br_fdb_insert //学习,插入
    br_fdb_get //查表

    /*
    * Forwarding database
    * Linux ethernet bridge
    *
    * Authors:
    * Lennert Buytenhek <buytenh@gnu.org>
    *
    * $Id: br_fdb.c,v 1.6 2002/01/17 00:57:07 davem Exp $
    *
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version
    * 2 of the License, or (at your option) any later version.
    */

    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/spinlock.h>
    #include <linux/times.h>
    #include <linux/netdevice.h>
    #include <linux/etherdevice.h>
    #include <linux/jhash.h>
    #include <linux/random.h>
    #include <asm/atomic.h>
    #include <asm/unaligned.h>
    #include "br_private.h"

    //__read_mostly具体是一个宏,#define __read_mostly __attribute__((__section__(".data.read_mostly")))
    //http://hi.baidu.com/xucha00/blog/item/e4b5c1245c75613bd5074246.html

    static struct kmem_cache *br_fdb_cache __read_mostly;

    static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
    const unsigned char *addr);

    static u32 fdb_salt __read_mostly;

    //初始化,创建后备高速缓存
    int __init br_fdb_init(void)
    {
    //使用kmem_cache_create函数进行创建
    br_fdb_cache = kmem_cache_create("bridge_fdb_cache",
    sizeof(struct net_bridge_fdb_entry),
    0,
    SLAB_HWCACHE_ALIGN, NULL);
    if (!br_fdb_cache)
    return -ENOMEM;
    //随机数,调用了一个高强度的随机数发生器
    get_random_bytes(&fdb_salt, sizeof(fdb_salt));
    return 0;
    }

    //销毁,释放后备高速缓存
    void br_fdb_fini(void)
    {
    //使用kmem_cache_destroy进行销毁
    kmem_cache_destroy(br_fdb_cache);
    }


    /* if topology_changing then use forward_delay (default 15 sec)
    * otherwise keep longer (default 5 minutes)
    */
    //返回老化延迟时间
    static inline unsigned long hold_time(const struct net_bridge *br)
    {
    return br->topology_change ? br->forward_delay : br->ageing_time;
    }

    //MAC 地址表项老化,返回1;否则返回0
    static inline int has_expired(const struct net_bridge *br,
    const struct net_bridge_fdb_entry *fdb)
    {
    return !fdb->is_static
    && time_before_eq(fdb->ageing_timer + hold_time(br), jiffies);
    }

    //算出mac的hash值,返回 MAC 地址的 Hash 值,用于随意对应的链表头
    static inline int br_mac_hash(const unsigned char *mac)
    {
    /* use 1 byte of OUI cnd 3 bytes of NIC */
    u32 key = get_unaligned((u32 *)(mac + 2));
    return jhash_1word(key, fdb_salt) & (BR_HASH_SIZE - 1);
    }

    //删除某个对应值
    static inline void fdb_delete(struct net_bridge_fdb_entry *f)
    {
    hlist_del_rcu(&f->hlist);
    br_fdb_put(f);
    }

    /* 桥端口的 MAC 地址改变时,此函数被触发,br_notify.c: br_device_event()。
    * 此函数插入新的 MAC 地址表项,删除或修改原 MAC 地址对应的表项。
    * 此函数遍历整个 MAC 地址表,寻找桥端口对应的本地 MAC 地址表项。
    * 如果存在该表项,当桥上还有其它端口具有原 MAC 地址,则更新表项,使此
    * 表项属于其它端口(表项的 dst)。如果没有其它端口具有原 MAC
    * 地址,则调用 fdb_delete() 删除该表项。
    * br_fdb_put() 通过钩子调用相应的函数删除设备的硬件表项。
    * 之后调用 fdb_insert() 插入新的本地静态 MAC 地址表项。
    ********************************************************************
    * fdb_insert() 首先在 MAC 地址表中查找新 MAC 地址对应的表项。
    * 如果存在对应的本地表项,什么也不做,函数返回。
    * 如果存在非本地表项,则调用 fdb_delete() 删除该表项,并打印
    * 错误信息(网络上可能有设备的 MAC 地址与新设定的
    * 桥端口 MAC 地址相同,MAC地址表中存在非本地表项,
    * 表示这可能是从收到的数据包中学习到的)。

    br_fdb_put() 通过钩子删除设备的硬件表项。
    * 之后调用 fdb_create() 创建并插入新的 MAC 地址表项,注意新表项
    * 被设为本地静态表项。
    * 同样,fdb_create() 此时通过钩子调用相应的函数创建设备的硬件表项。
    ********************************************************************
    * /
    //修改相关的mac地址
    void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
    {
    struct net_bridge *br = p->br;
    int i;

    spin_lock_bh(&br->hash_lock);

    /* Search all chains since old address/hash is unknown
    */
    for (i = 0; i < BR_HASH_SIZE; i++) {
    struct hlist_node *h;
    hlist_for_each(h, &br->hash[i]) {
    struct net_bridge_fdb_entry *f;

    f = hlist_entry(h, struct net_bridge_fdb_entry, hlist);
    if (f->dst == p && f->is_local) {
    /* maybe another port has same hw addr? */
    struct net_bridge_port *op;
    list_for_each_entry(op, &br->port_list, list) {
    if (op != p &&
    !compare_ether_addr(op->dev->dev_addr,
    f->addr.addr)) {
    f->dst = op;
    goto insert;
    }
    }

    /* delete old one */
    fdb_delete(f);
    goto insert;
    }
    }
    }
    insert:
    /* insert new address, may fail if invalid address or dup. */
    fdb_insert(br, p, newaddr);

    spin_unlock_bh(&br->hash_lock);
    }


    /* 此函数清理 MAC 地址表中的过时表项,重置有效表项。
    * 此函数由内核定时器驱动,创建桥时将创建此定时器,net_bridge.gc_timer。
    * 此函数被 EXPORT_SYMBOL(br_fdb_cleanup)。
    * 此函数遍历整个 MAC 地址表,检查每个表项是否过期(静态表项永不过期)。
    * 对于没有过期的表项,此函数不做任何处理。
    * 对于过期表项,此函数通过钩子调用相应函数检查设备中的硬件表项是否有效。
    * 如果有效,则重置该表项的老化时间(ageing_timer)。
    * 如果无效,则调用 fdb_delete() 删除该表项。
    * fdb_delete() 又调用 br_fdb_put() 做进一步处理。
    * br_fdb_put() 通过钩子调用相应的函数删除设备的硬件表项。
    * 并且检查该表项的引用计数,决定是否释放该表项。
    * /
    void br_fdb_cleanup(unsigned long _data)
    {
    struct net_bridge *br = (struct net_bridge *)_data;
    unsigned long delay = hold_time(br);
    unsigned long next_timer = jiffies + br->forward_delay;
    int i;

    spin_lock_bh(&br->hash_lock);
    for (i = 0; i < BR_HASH_SIZE; i++) {
    struct net_bridge_fdb_entry *f;
    struct hlist_node *h, *n;

    hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) {
    unsigned long this_timer;
    if (f->is_static)
    continue;
    this_timer = f->ageing_timer + delay;
    if (time_before_eq(this_timer, jiffies))
    fdb_delete(f);
    else if (this_timer < next_timer)
    next_timer = this_timer;
    }
    }
    spin_unlock_bh(&br->hash_lock);

    /* Add HZ/4 to ensure we round the jiffies upwards to be after the next
    * timer, otherwise we might round down and will have no-op run.
    */
    mod_timer(&br->gc_timer, round_jiffies(next_timer + HZ/4));
    }

    /* Completely flush all dynamic entries in forwarding database.*/
    void br_fdb_flush(struct net_bridge *br)
    {
    int i;

    spin_lock_bh(&br->hash_lock);
    for (i = 0; i < BR_HASH_SIZE; i++) {
    struct net_bridge_fdb_entry *f;
    struct hlist_node *h, *n;
    hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) {
    if (!f->is_static)
    fdb_delete(f);
    }
    }
    spin_unlock_bh(&br->hash_lock);
    }

    /* Flush all entries refering to a specific port.
    * if do_all is set also flush static entries
    */
    void br_fdb_delete_by_port(struct net_bridge *br,
    const struct net_bridge_port *p,
    int do_all)
    {
    int i;

    spin_lock_bh(&br->hash_lock);
    for (i = 0; i < BR_HASH_SIZE; i++) {
    struct hlist_node *h, *g;

    hlist_for_each_safe(h, g, &br->hash[i]) {
    struct net_bridge_fdb_entry *f
    = hlist_entry(h, struct net_bridge_fdb_entry, hlist);
    if (f->dst != p)
    continue;

    if (f->is_static && !do_all)
    continue;
    /*
    * if multiple ports all have the same device address
    * then when one port is deleted, assign
    * the local entry to other port
    */
    if (f->is_local) {
    struct net_bridge_port *op;
    list_for_each_entry(op, &br->port_list, list) {
    if (op != p &&
    !compare_ether_addr(op->dev->dev_addr,
    f->addr.addr)) {
    f->dst = op;
    goto skip_delete;
    }
    }
    }

    fdb_delete(f);
    skip_delete: ;
    }
    }
    spin_unlock_bh(&br->hash_lock);
    }

    /* No locking or refcounting, assumes caller has no preempt (rcu_read_lock) */
    struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
    const unsigned char *addr)
    {
    struct hlist_node *h;
    struct net_bridge_fdb_entry *fdb;
    //遍历net_bridge->hash
    hlist_for_each_entry_rcu(fdb, h, &br->hash[br_mac_hash(addr)], hlist) {
    //如果MAC地址和fdb中的地址相同并且fdb没有超时,
    //就说明找到了相应的fdb
    if (!compare_ether_addr(fdb->addr.addr, addr)) {
    if (unlikely(has_expired(br, fdb)))
    break;
    return fdb;
    }
    }

    return NULL;
    }

    /* Interface used by ATM hook that keeps a ref count */
    struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br,
    unsigned char *addr)
    {
    struct net_bridge_fdb_entry *fdb;

    rcu_read_lock();
    fdb = __br_fdb_get(br, addr);
    if (fdb && !atomic_inc_not_zero(&fdb->use_count))
    fdb = NULL;
    rcu_read_unlock();
    return fdb;
    }

    //释放 MAC 地址表项,br.c: br_deinit() 中调用。
    static void fdb_rcu_free(struct rcu_head *head)
    {
    struct net_bridge_fdb_entry *ent
    = container_of(head, struct net_bridge_fdb_entry, rcu);
    kmem_cache_free(br_fdb_cache, ent);
    }

    /* Set entry up for deletion with RCU */
    void br_fdb_put(struct net_bridge_fdb_entry *ent)
    {
    if (atomic_dec_and_test(&ent->use_count))
    call_rcu(&ent->rcu, fdb_rcu_free);
    }

    /*
    * Fill buffer with forwarding table records in
    * the API format.
    */
    int br_fdb_fillbuf(struct net_bridge *br, void *buf,
    unsigned long maxnum, unsigned long skip)
    {
    struct __fdb_entry *fe = buf;
    int i, num = 0;
    struct hlist_node *h;
    struct net_bridge_fdb_entry *f;

    memset(buf, 0, maxnum*sizeof(struct __fdb_entry));

    rcu_read_lock();
    for (i = 0; i < BR_HASH_SIZE; i++) {
    hlist_for_each_entry_rcu(f, h, &br->hash[i], hlist) {
    if (num >= maxnum)
    goto out;

    if (has_expired(br, f))
    continue;

    if (skip) {
    --skip;
    continue;
    }

    /* convert from internal format to API */
    memcpy(fe->mac_addr, f->addr.addr, ETH_ALEN);
    fe->port_no = f->dst->port_no;
    fe->is_local = f->is_local;
    if (!f->is_static)
    fe->ageing_timer_value = jiffies_to_clock_t(jiffies - f->ageing_timer);
    ++fe;
    ++num;
    }
    }

    out:
    rcu_read_unlock();

    return num;
    }

    static inline struct net_bridge_fdb_entry *fdb_find(struct hlist_head *head,
    const unsigned char *addr)
    {
    struct hlist_node *h;
    struct net_bridge_fdb_entry *fdb;

    hlist_for_each_entry_rcu(fdb, h, head, hlist) {
    if (!compare_ether_addr(fdb->addr.addr, addr))
    return fdb;
    }
    return NULL;
    }

    static struct net_bridge_fdb_entry *fdb_create(struct hlist_head *head,
    struct net_bridge_port *source,
    const unsigned char *addr,
    int is_local)
    {
    struct net_bridge_fdb_entry *fdb;

    fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC);
    if (fdb) {
    memcpy(fdb->addr.addr, addr, ETH_ALEN);
    atomic_set(&fdb->use_count, 1);
    hlist_add_head_rcu(&fdb->hlist, head);

    fdb->dst = source;
    fdb->is_local = is_local;
    fdb->is_static = is_local;
    fdb->ageing_timer = jiffies;
    }
    return fdb;
    }

    static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
    const unsigned char *addr)
    {
    struct hlist_head *head = &br->hash[br_mac_hash(addr)];
    struct net_bridge_fdb_entry *fdb;

    //检查地址的有效性,这个地址不能是广播地址,也不能是
    //为0的地址
    if (!is_valid_ether_addr(addr))
    return -EINVAL;
    //从链表头开始查找需要插入的fdb已经存在
    fdb = fdb_find(head, addr);
    if (fdb) {
    /* it is okay to have multiple ports with same
    * address, just use the first one.
    */
    //如果需要插入的是本机的MAC地址,则不需要更新
    if (fdb->is_local)
    return 0;

    printk(KERN_WARNING "%s adding interface with same address "
    "as a received packet\n",
    source->dev->name);
    //删除已经存在的表项,后面会创建新的表项用以替代
    fdb_delete(fdb);
    }
    //创建新的fdb
    if (!fdb_create(head, source, addr, 1))
    return -ENOMEM;

    return 0;
    }

    //实现插入CAM表的功能
    int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
    const unsigned char *addr)
    {
    int ret;

    spin_lock_bh(&br->hash_lock); //该宏在得到自旋锁的同时失效本地软中断。http://www.ibm.com/developerworks/cn/linux/l-synch/part1/index.html
    ret = fdb_insert(br, source, addr);
    spin_unlock_bh(&br->hash_lock);
    return ret;
    }

    /**
    此函数首先调用 fdb_find() 在 MAC 地址表中查找对应的表项。
    如已存在该表项,如果该表项为本地 MAC 地址表项,则打印警告信息,
    "%s: received packet with own address as source address\n"
    如前所述,桥不可能通过学习得到本地 MAC 地址(收到源 MAC 地址等于设
    备自己的 MAC 地址的包是一个错误)。否则,刷新该表项,设置该表项中
    的端口为本次接收到数据包的端口,重置老化时间(ageing_timer)。
    对于我们的设备,此时通过钩子调用相应的函数刷新设备的硬件表项。
    如不存在该表项,则调用 fdb_create() 创建并插入新的 MAC 地址表项,注意
    新表项被设为非本地非静态表项。
    同样,fdb_create() 此时通过钩子调用相应的函数创建设备的硬件表项。
    *
    */

    void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
    const unsigned char *addr)
    {
    // br_mac_hash函数是hash表中的hash函数,具体算法过程可参阅该函数代码。
    // br->hash就是数据库的hash表,每个hash值对应一个链表。数据库的每项为
    // net_bridge_fdb_entry结构。
    struct hlist_head *head = &br->hash[br_mac_hash(addr)];
    struct net_bridge_fdb_entry *fdb;

    /* some users want to always flood. */
    if (hold_time(br) == 0)
    return;

    /* ignore packets unless we are using this port */
    if (!(source->state == BR_STATE_LEARNING ||
    source->state == BR_STATE_FORWARDING))
    return;

    fdb = fdb_find(head, addr);
    if (likely(fdb)) {
    /* attempt to update an entry for a local interface */
    if (unlikely(fdb->is_local)) {
    if (net_ratelimit())
    printk(KERN_WARNING "%s: received packet with "
    " own address as source address\n",
    source->dev->name);
    } else {
    /* fastpath: update of existing entry */
    fdb->dst = source;
    fdb->ageing_timer = jiffies;
    }
    } else {
    spin_lock(&br->hash_lock);
    if (!fdb_find(head, addr))
    fdb_create(head, source, addr, 0);
    /* else we lose race and someone else inserts
    * it first, don't bother updating
    */
    spin_unlock(&br->hash_lock);
    }
    }



    转载于:https://www.cnblogs.com/moonflow/archive/2012/01/12/2320668.html

    展开全文
  • 本文描述如何收集Catalyst交换机的动态内容寻址存储器(CAM)使用简单网络管理协议(SNMP),条目。在使用本文档中的信息前,请保证您满足以下前提条件:知道如何从Catalyst交换机获得VLAN通过SNMP。SNMP一般用途获得...
  • ,也只是对这个交换机的下面的机器有影响,我们怎么突破范围那,上面说了广播可以,但是又是最不可行的方法,怎么办?,放心,聪明人总会有办法的,在这个时候傀儡机器的作用显现出来了,用专业术语说下,从 B ...
  • CAM对象样式

    2016-03-24 08:21:00
    CAM对象样式                 121 160 UF_machining_task_type UF_mach_order_task_subtype   112  ...
  • cam350里面对比ipc360网络,检查开短路。包括包含盲埋孔的情况。
  • CAM350进行IPC网对比[1].docx
  • PCB生产时,需要用CAM进行最后的检查,比对
  • PADS-Layout-CAM(导出Gerber)层设置简明整理,使用了excel表格对每一个设置项进行选择,清晰明了
  • 1.1MAC/CAM攻击的原理和危害 交换机主动学习客户端的MAC地址,并建立和维护端口和MAC地址的对应表以此建立交换路径,这个表就是通常我们...MAC/CAM攻击是指利用工具产生欺骗MAC,快速填满CAM表,交换机CAM表被填...
  • MAC/CAM***防范

    2010-07-16 22:54:54
    1.1MAC/CAM***的原理和危害交换机主动学习客户端的 MAC 地址,并建立和维护端口和 MAC 地址的对应以此建立交换路径,这个就是通常我们所说的 CAM CAM 的大小是固定的,不同的交换机的 CAM 大小不同。 ...
  • 三角帆蚌钙调蛋白(CaM)基因的cDNA序列克隆与表达分析,李文娟,李倩,钙调蛋白(CaM)是贝类生物矿化进程中重要的调控蛋白之一。本研究通过RACE技术,以我国重要的淡水珍珠贝-三角帆蚌为研究客体,克隆�
  • 龙须菜MIPS与CaM间的相互作用验证及其在热激下的表达模式分析,张璇,臧晓南,以龙须菜高温胁迫表达的cDNA和基因组DNA为模板,采用5'RACE和Genome Walking的方法,扩增得到龙须菜蛋白-肌醇-1-磷酸合成酶(myo-...
  • 因此对投板的gerbera进行检查时很有必要的一、导出IPC网在绘制完成的PCB图纸中,导出IPC-D-356A网:(以PADS为例)工具->基本脚本->基本脚本打开基本脚本的窗口,寻找IPC-D-356A_Netlist_Extractor的脚本,...
  • 交换机主动学习客户端的 MAC 地址,并建立和维护端口和 MAC 地址的对应以此建立交换路径,这个就是通常我们所说的 CAM CAM 的大小是固定的,不同的交换机的 CAM 大小不同。 MAC/CAM ***是指利用工具...
  • CV:基于Keras利用训练好的hdf5模型进行目标检测实现输出模型中的脸部表情或性别的gradcam(可视化) 目录 设计思路 核心代码 设计思路 核心代码 #CV:基于keras利用训练好的hdf5模型进行目标...
  • 一般普通的接入层交换机来说,交换机中就存在一张CAM表,存储MAC地址的。(默认5分钟) 再稍微好一点的交换机有ACL访问控制列表,这个表存储在一个叫TCAM(三重内容可寻址存储器)中。 如果ACL很多,或需要很多第...
  • 摘 要本文主要研究基于UG的三维CAD设计和CAM自动编程的过程。首先利用UG软件的CAD模块对要加工的零件进行实体建模,然后以零件的三维实体模型为依据,得到它的实体造型,并讨论了零件三维实体建模的方法、建模过程与...
  • 因此对投板的gerbera进行检查时很有必要的一、导出IPC网在绘制完成的PCB图纸中,导出IPC-D-356A网:(以PADS为例)工具->基本脚本->基本脚本打开基本脚本的窗口,寻找IPC-D-356A_Netlist_Extractor的脚本,...
  • CAM内容寻址存储器

    2020-06-24 16:05:46
        CAM是一种特殊的存储器。所谓CAM,即内容寻址存储器。...CAM的应用也比较广泛,比如在路由器中的地址交换,CPU的Cache控制器(Tag阵列)等。   CAM工作原理:   ...
  • CAM350常用快捷键字母键的应用Q:查看D码和刀具,并设为当前W:无选择命令时是框选放大窗口,有选择命令时为框选R:刷新T:透明显示Y:打开层列表U:撤消I:无选择命令时没作用,有选择命令时前面+W为反选O:有角度命令时为:0\...
  • CAM350检查开短路

    2018-11-16 11:58:40
    可以利用CAM350导入PCB的光绘文件,再通过IPC网比对,检查开短路
  • 2020以太网数据帧、MACYuLong XiaoZhan玉 龙 ...二层交换机设备维护CAM表,而CAM表中存放的是MAC地址。今天给大家介绍一下以太网数据帧格式和MAC地址格式。以太网数据帧以太网II帧格式Ethernet_II 帧类型值大于等于...
  • 2、CAM表:CAM芯片,非常快,做二元运算(要么匹配,要么不匹配) MAC地址表的组成 动态表项 由接口通过报文中的源MAC地址学习获得,表项可老化,默认老化时间300秒 在系统复位,接口板热插拔或接口板复位后,动态...
  • 方便查看gerber时区分是那一层,并且把执行一下Place->Drill Table,把钻孔数据放到PCB里,这样导出的gerber里面有这个表格, 下面开始生成gerber 1. 在PCB下,点击File选择Fabrication Outputs中的Gerber Files,...
  • Cam350工艺检查

    千次阅读 2018-12-28 10:38:32
    1. Cam350导入光绘 以allegro为例,即与光绘输出设置一致   2. 开短路检查(发板前多一道保障,有时候PCB设计软件也不一定查出来) (1)设置电气走线层的层属性(开短路检查只需设置电气层即可...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 533
精华内容 213
关键字:

cam表