趣味学习:一篇文章读懂三层交换机【新任帮主】

  1. 为什么我们说三层交换机的三层转发性能要比路由器的效率要高的多?有的时候在很多书上面会提及到现在路由器的软件的做的也非常强大,几乎也能够达到限速转发的能力; 软件能够和硬件比吗,不太可能;交换机之所以转发速度快是因为交换机使用的专门的ASIC硬件转发卡,而路由器是software-based 的转发;
  2. 我们习惯说,在二层网络环境中相同vlan之间可以通信,不同vlan之间不可以通信,如果想通信必须借助三层设备,所以说三层交换机必须要做的事情是路由转发,但是具体的工作原理是什么样的呢 ,接着看吧!
  3. 首先我们看看,三层交换机在同一子网和不同子网环境中都分别会做些什么事情,有哪些不同呢?
    在二层环境中A---B之间通信,A发送一个数据包目的MAC地址是B,当发送到交换机,交换机基于目的MAC地址的转发,然后开始查看自己的MAC表项,找出对应的出口出去了整个过程中只有MAC地址的查找,没有对数据帧产生任何的改变,我在这只对二层帧转发做一个简短而又简单的描述,毕竟重点不在这

    在三层环境中 A---C之间通信,A发送一个数据包,目的MAC地址应该是网关MAC地址,也即是交换机的MAC地址SMAC好在这里插一个小插曲,之前有人问过我说一个交换机要不要三层转发是怎么判断的,我当时的回答是看这个数据包的mac地址是不是自己,如果是就执行三层转发,别人说回答是正确的;但是当我回来研究这个问题的时候,我发现当时我的回答是不严谨的,为什么 ? 想想,当一个交换机收到一个数据包的二层目的mac地址是自己,此时它要做什么?

    插个一个小插曲,前两天我在微信上看过这样的一个小短片,上面说的是在一所大学的教室里,有两个男生特别喜欢坐在他们身后的班花,就不停的看着那个女孩,突然,那个女孩站起来准备走了,在路过他们身边的时候塞给了坐在一边男生一个卷起来的小纸条;物理上,这个女生是将纸条递给了这个男生,想想这个男生接下来要做什么事情?是要打开纸条查看里面写了什么内容
    吧!三层交换机在接收到目的mac地址是自己的时候要做的事情也是向上层解封装,查看三层目的IP地址,然后呢?
    当时那个男生很高兴的拿着那个纸条,然后打开了,上面写着“请将纸条递给下一个人”,哈哈,,,三层交换机也是这样一看原来目的IP地址不是自己,这才执行路由层面的转发;所以说交换机在执行要不要三层转发,是在目的mac是自己的同时,IP地址是不是自己,如果是自己那还转发个啥来;
    交换机在判断出目的IP不是自己的时候是不是一定就去查看路由表呢 ?不是,这个就是交换机的关键所在了,交换机此时不会查看路由表,不会查看arp表,不会查看mac地址表;那交换机会查看什么表?
    交换机此时会查看自己集成在ASIC硬件转发卡中的硬件转发表,那这个硬件转发表都包含了什么内容呢?
    当第一个包过来的时候,发现硬件转发表并没有什么表项,所以此时必须将数据包交由路由进程处理,一旦交由cpu处理,必然会消耗cpu资源,此时会查看路由表,然后发现此IP地址个自己是直连的,此时就去查看arp找出此地址对应的mac地址,就可以转发出去了
    在决定转发出去过程中,交换机至少会做三件事情,一,修改IP包头的ttl值;二,修改原mac地址,改成自己出接口mac地址;三,建立交换机硬件转发表,包括目的IP地址,目的IP地址(下一跳)对应的mac地址,mac地址对应的vlan,以及对应的端口(这个每个厂家有自己的理解)
    这样当一下包过来的时候,交换机就会查看硬件转发表直接转发而不会在经过路由表的查询了,也即是交换机的一次路由,多次交换机原理
    每个厂家在这一块定义都不太一下,但是原理是一样的,cisco中使用的是cef表,并且在路由器的现在也集成了基于软件的cef,其中cef包含了三张表象,包括FIB表,邻接表(硬件转发表),netflow表项

原文地址:http://blog.51cto.com/2825930/2286082

时间: 2024-11-11 15:24:20

趣味学习:一篇文章读懂三层交换机【新任帮主】的相关文章

一篇文章读懂Java类加载器

Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上一搜一大片,我自己也看过很多文档,博客.资料虽然很多,但还是希望通过本文尽量写出一些自己的理解,自己的东西.如果只是重复别人写的内容那就失去写作的意义了. 类加载器结构 名称解释: 根类加载器,也叫引导类加载器.启动类加载器.由于它不属于Java类库,这里就不说它对应的类名了,很多人喜欢称Boots

一篇文章读懂volatile

前提 计算机在执行程序代码的时候,实际上执行的是一条条指令,而这些指令,肯定会涉及到数据的读取和写入操作. 在我们的程序中,所定义的变量等临时数据,计算机会放在内存中,也称为主存. 那么问题来了,CPU执行指令的速度是很快的,但是从内存中读取数据和写入数据的过程,相比CPU执行指令的速度来说是比较慢的.如果每个程序都是直接从内存中读取数据,那么由于CPU执行指令的速度和数据的读取写入操作的速度不一致,那么肯定会大大降低了执行的效率,所以在CPU里面引入了高速缓存. 当程序在运行过程中,会将运算需

【转】一篇文章读懂人力资源三支柱体系(COE?BP?SSC)

通过人力资源转型,提升效率和效能   作者:Sharon Li,翰威特大中华区咨询总监. 杰克韦尔奇曾说过“人力资源负责人在任何企业中都应该是第二号人物”,但在中国,99%的企业都做不到.原因很简单,人力资源部没创造这么大的价值——业务增长很快,但HR总在拖后腿.有些人说人力资源部是“秘书”,有人说人力资源是“警察”,在中国,真正认为人力资源部是“业务伙伴”的,真是凤毛麟角. 研究证明,人力资源部可以成为业务驱动力,关键是HR自身要转型. 1. 重新定位人力资源部门 人力资源部成为业务的驱动力,

一篇文章读懂什么是串口通信及其工作原理

介绍 串行通信是在数据处理设备和外围设备之间传输信息的最广泛使用的方法.一般而言,沟通意味着通过书面文件,口头语言,音频和视频课程在个人之间交换信息. 每台设备都可能是您的个人计算机或移动设备在串行协议上运行.该协议是安全可靠的通信形式,具有由源主机(发送方)和目的地主机(接收方)寻址的一组规则.为了获得更好的洞察力,我已经解释了串行通信的概念. 在嵌入式系统中,串行通信是以串行数字二进制形式使用不同方法交换数据的方式.用于数据交换的一些众所周知的接口是RS-232,RS-485,I2C,SPI

(好文推荐)一篇文章看懂JavaScript作用域链

闭包和作用域链是JavaScript中比较重要的概念,首先,看看几段简单的代码. 代码1: 1 var name = "stephenchan"; 2 var age = 23; 3 function myFunc() { 4 alert(name); 5 var name = "endlesscode"; 6 alert(name); 7 alert(age); 8 alert(weight); 9 } 10 myFunc(); 11 myFunc(); 上述代码

一篇文章看懂Android学习最佳路线

为什么中高级Android程序员不多呢?这是一个问题,我不好回答,但是我想写一篇文章来描述下Android的学习路线,期望可以帮助更多的Android程序员提升自己. 作者:来源:Android开发中文站|2015-11-12 10:40 收藏 分享 前言 看到一篇文章中提到"最近几年国内的初级Android程序员已经很多了,但是中高级的Android技术人才仍然稀缺",这的确不假,从我在百度所进行的一些面试来看,找一个适合的高级Android工程师的确不容易,一般需要进行大量的面试才

angularjs 一篇文章看懂自定义指令directive

 壹 ? 引 在angularjs开发中,指令的使用是无处无在的,我们习惯使用指令来拓展HTML:那么如何理解指令呢,你可以把它理解成在DOM元素上运行的函数,它可以帮助我们拓展DOM元素的功能.比如最常用ng-click可以让一个元素能监听click事件,这里你可能就有疑问了,同样都是监听为什么不直接使用click事件呢,angular提供的事件指令与传统指令有什么区别?我们来看一个例子: <body ng-controller="myCtrl as vm"> <d

一篇文章看懂spark 1.3+各版本特性

Spark 1.6.x的新特性Spark-1.6是Spark-2.0之前的最后一个版本.主要是三个大方面的改进:性能提升,新的 Dataset API 和数据科学功能的扩展.这是社区开发非常重要的一个里程碑.1. 性能提升根据 Apache Spark 官方 2015 年 Spark Survey,有 91% 的用户想要提升 Spark 的性能.Parquet 性能自动化内存管理流状态管理速度提升 10X 2. Dataset APISpark 团队引入了 DataFrames,新型Datase

Gradle学习系列之读懂Gradle语法

转载地址: http://www.cnblogs.com/CloudTeng/p/3418072.html Gradle是一种声明式的构建工具.在执行时,Gradle并不会一开始便顺序执行build.gradle文件中的内容,而是分为两个阶段,第一个阶段是配置阶段,然后才是实际的执行阶段.在配置阶段,Gradle将读取所有build.gradle文件的所有内容来配置Project和Task等,比如设置Project和Task的Property,处理Task之间的依赖关系等. 虽然很多时候我们只需