转载 http://weibo.com/p/1001603856604226258308
计算机学习微信公众号(jsj_xx)
(一)
0 概述
以太网的数据传输是共享总线型的,使用CSMA/CD(Carrier Sense Multiple Access with Collision Detection):带冲突检测的载波监听多路访问技术。通俗地说,在以太网里,所有的节点共享传输介质,各个节点的传输流程是:先听后发,冲突则停发,随机延迟后重发。如果以太网里某一时刻同时存在两个数据帧,则两个会互相破坏,导致传输失败。这引出冲突域概念。
冲突域(collision domain)是指这样一个计算机组,同一时刻在该组内只能有一个主机发送(单播)报文。或者说,一次只能有一个主机在发送数据,该组内的其它主机只能等待其发送完毕后才能发送。广播域(broadcast domain)是发送(广播)报文时,能收到该报文的计算机组。(注意:这里的单播/广播是二层概念上)
很明显,广播域肯定是大于(或等于)冲突域的。或者说,广播域是多个冲突域的合集。我们分享自己的理解:
-
传统以太网的冲突域和广播域是一样的,是整个以太网。
-
中继器的冲突域和广播域是一样的,是整网。
-
集线器(可以看作多端口的中继器)的冲突域和广播域是一样的,是集线器的所有端口(下的计算机组)。
-
网桥的每个端口(一般是两个)是一个冲突域,所有端口属于同一个广播域。
-
二层交换机(可以看作多端口的网桥)的一个vlan是一个广播域,vlan的一个端口就是一个冲突域。(不涉及级联场景)
-
路由器的每个端口(或者三层交换机启动三层功能的端口)是一个广播域。如果端口连接是一个以太网局域网,则每个端口是一个冲突域。
从工作的层次来讲,中继器和集线器工作在物理层,网桥和二层交换机工作在链路层,三层交换机和路由器工作在网络层。(注意:物理层是指OSI模型里的,链路层和网络层是指TCP/IP四层模型里的。我们平时说的二层其实是TCP/IP模型里的一层!换句话讲,TCP/IP四层模型的链路层下面其实相当于补充了一个OSI模型的物理层。)
从转发实现来讲,网桥需要一个mac表,二层交换机需要一个二层vlan表,三层交换机的三层功能需要辅助修改二层vlan表,而路由器的三层路由表的处理和二层vlan表的处理是独立的。
我们后面会将中继器、集线器、网桥、二层交换机、三层交换机、路由器逐个分析,并比较各个之间的区别。
1 中继器
中继器由于工作在OSI模型的物理层(第一层),所以可以成为物理层设备或者一层设备。它其实仅仅是扩大了以太网的(物理上的距离)网络范围,它从一个端口收包后(做信号放大处理)发送到其它所有端口(一般只有两个端口)。它解决了两个问题:距离远时,信号有衰减,故它可以放大;屏蔽了各种以太网电缆线的差别。
从效果看,使用中继器两个端口连接的两个网络,就是(同)一个扩大范围了的以太网。所以,冲突域和广播域跟传统以太网一样,还是整网。
2 集线器
集线器其实就是多端口的中继器,也是从一个端口收包后(做信号放大处理)发送到其它所有端口。
可见,中继器和集线器都是物理层设备,是看不到二层相关信息的,仅作伸展以太网的网络距离的作用而已。
3 网桥
网桥的背板是端口隔离的,就是说每个端口都是独立通道,不再像中继器/集线器那样是共享性质的背板了。终于可以使用独立的端口做点智能功能了。
网桥使用二层mac表去维护mac和端口的对应关系,这可以通过初期的二层广播(未知单播走广播流程)报文学习到。这样,网桥可以知道每个端口和其下所有节点的mac的对应关系。
这样,当网桥的一个端口收到报文帧时,它可以提取并观察src_mac、dst_mac、rcv_port的关系:如果src_mac和dst_mac都属于rcv_port下的,则不会把该帧转发到另一个端口,起到冲突域隔离作用。反之,则转发到另一个端口,到达另一个(子)网络。
这个mac表,对于上行起判断是否是同一端口(即同一网络)的作用,对于下行起找出端口的作用(由于网桥就两个端口,所以简化了),和原始交换机是一个转发流程。
可见,从网桥开始,上了一层台阶了,不再像中继器/集线器那样因为识别不了mac故仅能作所有(其它)端口转发的简单处理了。但是,仍然不能隔离广播域(这和没有配置vlan的原始交换机是一样的)。我们下次接着讲二三层交换机、路由器。。。
0 回顾
我们先回顾一下《一》中的内容。中继器和集线器的冲突域就是整网,其根本原因是以太网的距离局限性:CSMA/CD技术要求随时监测冲突,如果距离太远信号延迟就是个问题。而网桥不同于中继器和集线器的所有端口共享总线方式,而采用基于端口独立的总线方式(网桥的背板通道不再是共享的,每个端口的收发是一个单独的通道),这样就将冲突域压缩到一个端口范围,达到隔离目的。同时,网桥能够识别二层信息:mac,就能基于mac学习做些智能处理,也让它升了一个级别,属于二层设备了(中继器和集线器只是一层设备)。
冲突域的另一个表述方式是带宽:如果所有端口都属于一个冲突域,那带宽就是所有端口共享的;如果每个端口是一个独立的冲突域,那各个端口之间的带宽是互相不受影响的,这个改进还是很有效果的。或者可以这么说,二层设备对于一层设备的改进,就是带宽方式的进一步解放?
另外,传统的半双工(不能同时收发)现在基本都变成全双工(能同时收发)了,这相当于带宽增倍。值得一提的是,万兆(10G网卡)仅仅支持全双工,不支持半双工了。我们(计算机学习微信公众号:jsj_xx)的理解是:没了半双工,也就没了冲突域存在的空间了。
1 传统的二层交换机
传统二层交换机,就是不涉及vlan的,或者说整机就是一个vlan。那么,此时的二层交换机和网桥是一样了(区别仅仅是端口增加了):属于链路层设备,可以根据mac信息做些智能处理(基于mac表做mac学习和转发)。
具体转发流程,和网桥基本一样:
(1)交换机的某个接收端口(和《一》中的一样,我们称为rcv_port)收到包时,它先提取源mac地址(和《一》中的一样,我们称为src_mac),这样它学习到了mac和port的对应关系;
(2)读取目的mac地址(和《一》中一样,我们称为dst_mac),查mac表得出接口(这个出接口也是按(1)中的学习方式得到的);
(3)将包复制到此出接口。
可见,如果查到出接口,就在两个端口之间传输数据,既避免了向所有端口广播带来的垃圾包,也避免了对其它端口的带宽影响。
注意:如果(2)中在mac表中查不到出接口,则把包广播到所有其它端口上,当目的主机回应时,就可以学到此mac与端口的对应关系,下次就不需要广播了。这种场景很常见,比如ARP解析时,也同时从侧面映衬出免费ARP的好处。
我们再谈谈带宽方式。
在集线器共享带宽方式下,同一时刻本网络上只能进行一个端口(接收端口)和其它所有端口(其它口都是出端口)的传输,如果监测到冲突还得重传。相比之下,交换机在同一时刻本网络上可进行多个端口对之间的数据传输,每个端口都是独立的,该端口下的设备享有全部的带宽。举例:交换机有n个端口,每个端口的带宽是m,则交换背板总线带宽需要达到n*m(这个是可以保证的)。
这种基于端口的带宽方式之所以解放成功的原因可以归结为:属于二层设备,能有效提取并利用二层mac信息建立数据传输的端口对!
2 基于vlan的二层交换机
由上文可知,中继器和集线器,甚至是网桥、传统二层交换机等二层设备都不能隔离广播域。设想同一个广播域下的100台设备,每台设备都发1个包,则会有9800个垃圾包,可见广播域太大带来的广播风暴之可怕!但广播报文还是有很多应用的,比如:ARP、DHCP、RIP等路由协议;未知单播和组播也会广播。为了减少广播风暴,是很有必要隔离广播域的,另外,隔离也可以防止监听(想想局域网网卡混杂模式下的sniffer)。
vlan技术就是为隔离广播域而生的,它可以将一个大的共享局域网的用户分成许多独立的小的广播域。
我们以最基本的、最常用的,基于端口划分vlan的方式讲解。
这种方式是根据交换机的端口划分,将交换机上的端口划分为若干个组,每个组就是一个虚拟网,相当于一个独立的传统二层交换机。可见,这种划分方式的优点是划分成员很简单,缺点是成员切换vlan等改变时较麻烦,需要换线。
我们之前所述都是基于端口划分vlan的方式,还有基于mac以及ip等很多的划分vlan方式,各有各的应用场景,我们就不赘述了。
3 vlan里的access端口和trunk端口
基于vlan的交换机的端口类型分aceess和trunk两种。access连接主机,很容易理解。我们看看trunk类型端口的含义。
如果一台交换机配了两个vlan:vlan1和vlan2,由于网络范围很大而交换机的口数有限的原因,肯定需要其它交换机也需要配vlan1和vlan2,然后级联这些交换机。
那如何让不同交换机的同一个vlan能互通(或者说,让不同交换机的同一个vlan在同一个广播域里)呢?
可以想到,很简单的配置就可以了:两台交换机的同一个vlan里额外多增加一个端口,然后互联这两个额外的端口。
问题来了,如果是很多vlan都要互通,那额外端口都需要很多了,那就很浪费了!trunk类型端口的意义就体现于此:让多个vlan在两台交换机级联时复用一条线。
这样,需要对包做额外处理,以便该包到了级联的另一台交换机时,也能知道是哪个vlan的,从而继续保持该vlan的性质。其实很简单,额外处理就是在包的头部增加该vlan号(同时重新计算填充CRC)(当然,另一台交换机使用完会剥掉该vlan号)。
可见,trunk端口就是一个通过软件实现来解决交换机部署问题的方法。但也看到了trunk端口其实是变相地扩大了广播域(在本交换机的vlan里的端口以及通过trunk端口到达的另一台交换机),这和vlan技术的初衷(隔离切分广播域)是违背的,但确实解决了实际网络的大范围部署问题。
4 vlan之间的互通
一台交换机内部的vlan之间要互通就困难了。看上去比较对立:都在同一台交换机上竟然不能很容易地互通?vlan不是隔离广播域么,为何还要互通?
我们只谈解决方法。两个vlan是两个广播域,路由器就是用来连接两个广播域的,也就是说通过vlan间路由的方法(具体是由路由器中转或者使用三层交换机实现)。
我们先看路由器方式。需要交换机的trunk端口直连路由器的一个端口(此口配置了多个vlanif),每个vlanif口用于指定每个vlan内部的网关(如果主机发送的报文目的地不是同一个vlan里的,会发送到网关)。
每个广播域都需要指定一个网关,vlan1的主机A访问vlan2的主机B时,A需要封装网关mac做目的mac发送到网关(走二层流程),然后该网关(终结二层,开始三层)查路由表找到出口,并封装主机B的mac作为目的mac发送给B(走二层流程)。
可见,流程跟路由器连接两个局域网的场景是一样的,区别是路由器的同一个端口(上文trunk端口的作用)上配置了多个vlanif(三层网关ip的作用)而已。
好了,下次接着讲三层交换机解决vlan间互通问题。。。
(三)
0 回顾二层交换机的trunk机制
我们继续谈二层交换机的vlan间通信。我们上次讲了两种解决方法中的一种:使用路由器。交换机和路由器之间用trunk端口连接,路由器在该端口上使用vlanif子接口处理每个vlan,这样在路由器上完成两个广播域(两个vlan)之间的切换。
我们举例来说明这种借助于trunk的实现,看看实际拓扑是如何部署以达到很好的扩展性。如图1,假设路由器有4个端口,交换机A和交换机B各有6个端口,交换机的两个6号口配置为trunk连接方式,路由器的2号口和交换机A的5号口配置为trunk连接方式。
(图1)
这样,主机A和主机B分别处于vlan1和vlan2里,通过trunk1将两个交换机级联,通过路由器的trunk连接最终实现vlan1和vlan2之间的互通。
我们分析下,这样部署能获得哪些好的扩展性:
1) 如果主机A需要切换到vlan2里,只需修改交换机A上对应主机A的相应端口(如图2,是A的1口)配置。
2) 如果交换机B上需要新增vlan3,则只需修改交换机B的相应端口(如图2,是B的4口)配置。同时,路由器需要针对trunk2连接新增对vlan3的vlanif。
3) 如果交换机A的vlan2里需要新增成员,比如主机C,只需修改交换机A上的相应端口(如图2,是A的4口)配置。
(图2)
可见,基本满足了日后的网络维护,具有很好的扩展性。成功的原因就是引入了trunk连接机制!
试想不使用trunk连接机制,会怎样?我们(计算机学习微信公众号:jsj_xx)觉得:
1)保证交换机A和交换机B上的各自vlan对对方也可见,需要每个交换机上为每个vlan都预留1个端口。(想想现实网络拓朴中需要很多交换机的级联,而配置的vlan又很多,既浪费端口也增加了连线复杂度)
2)保证路由器对各个交换机的各个vlan都可见,需要在路由器上与所有交换机的的每个vlan都有一个连线。也就是说,需要每个交换机为每个vlan(在上面的基础上)还得预留1个端口。当然,路由器也得同样预留。
可以看到,端口预留的数目已经爆炸式增长了,连线复杂度大大增加。即使端口多的交换机能满足,端口少的路由器肯定满足不了了!(如果涉及实际组网中的级联场景就更可怕了)
这里只分析了解决vlan间互通的第一种方法,那第二种方法:使用三层交换机呢?我们后面讲到三层交换机再分析。
1 二层交换机的转发流程
现在对二层交换机有足够理解了,可以给出我们(计算机学习微信公众号:jsj_xx)理解的转发流程了:
交换机从接收端口(我们称之为rcv_port)收到包后,根据接收端口所在的vlan(我们称之为vlan_id)去查vlan表。具体是根据dst_mac+vlan_id查vlan表得到出接口。如果该dst_mac之前已经经历了mac学习了,则此时肯定能找到出接口,否则还是走广播流程(从而学习到dst_mac)。不管是单播还是广播(二层意义的单播/广播概念)流程(其实就是看之前学没学到dst_mac),如果出接口(可能多个)里含有trunk端口(该端口上可能配置多个vlan号)的话,就需要对包做特殊处理了:根据接vlan_id去封装802.1Q(2个字节的TPID(值规定为:0x8100)+2个字节的TCI(TCI的16bit:3bit的优先级+1bit的CFI+12bit的vlan号))并修改CRC。
转发流程中还有几点需要注意的地方:
1)mac学习是从src_mac(源mac肯定是单播的)学习到的,而使用时是用dst_mac查vlan表的。另外,学习到的mac还有覆盖和老化问题,我们就不讨论了。
2)从接收端口收到的包,可能带vlan号(trunk端口),也可能不带(access端口)。(我们上面提到了,出端口也如此:可能是trunk端口,也可能是access端口)
最后,我们重申,上面仅阐述了基于端口划分vlan这一种最基本、最常用的方式,还有基于ip/mac等很多扩展的划分方式,我们就不涉及了。另外 ,还有混合端口(hybrid):兼具trunk和access两种端口功能,我们也没有涉及。
2 三层交换机基础
三层交换机看起来是就有交换机功能,又有路由器功能。真的是这样么?
我们看下三层交换机的处理流程。当一个流的第一个包经过时(想想,第一个包是哪个?请查考ARP机制),肯定需要经过三层路由,此时路由模块会产生一个mac与ip的对应关系(类似于arp表),并存储到二层流程可以查询到的位置,当该流后续数据包再来时,在二层查该表直接(快速)转发,不再需要上送到三层路由模块了!这就是所谓的“一次路由,多次交换”:同一个流而言,只有第一次是需要路由处理的,其余时候都是走二层交换的。
可见,三层交换机用于LAN-LAN之间的互通是可以的,路由的量不是很大(路由是软件实现,很耗时间的),绝大部分都在进行二层交换(硬件实现,速度很快)。我们对三层交换机的理解是:
三层交换机的vlan间互通的支持是通过路由模块(软件实现)关联两个广播域实现的,而这种关联是会告知二层处理模块(一般是ASIC硬件实现)的。从抽象意义上讲,三层交换机的vlan间互通也是通过mac学习实现的,只不过这种学习是在三层路由模块的帮助下(帮助屏蔽不同的广播域)而已。
这样,我们就清楚了三层交换机的应用场景了:用于一个局域网中(同构网络)的各个VLAN间互通,因为它的路由功能仅仅是辅助二层转发的。
好了,基本搞明白三层交换机了,我们下次接着讲。。。
(四)
0 回顾三层交换机
我们先回顾一下之前讲的交换机的内容。
vlan技术使得一台交换机可以将一个大的局域网划分为多个小的虚拟局域网,每个小的局域网都是独立的(从隔离广播域角度而言)。这既方便了管理,也保证了安全性。最重要的是,通过这种隔离(或者说压缩)广播域的方法也大大降低了广播风暴的危害(具体请参照本系列之前的文章所讲内容),但同时也引出了vlan间通信的新问题,此新问题直接导致三层交换机的诞生。
那么,为何vlan间通信为何不提倡采用路由器做中转的方法呢?我们先了解下路由器。
1 路由器原理
首先声明,除路由器的转发功能外,本文不会涉及其它功能,包括:访问控制(ACL)、网络地址转换(NAT)、带宽管理(QOS)等。另外,也不会涉及具体的路由协议。
我们先看看路由器(在网络模型中)工作的层次。(下图摘自《tcp/ip详解(卷1)》)
如上图可见:
1)(二层)交换机(或者网桥)是工作在链路层的,而路由器是工作在网络层的。
2)路由器和交换机是中间节点,为两端的host提供转发服务。
3)路由器和交换机仅仅实现了网络模型的部分层次(底两层和底三层),只有两端的host主机上才完全实现了所有层次(这也从侧面体现了网络模型层次设计的意义)。
4)体现(实现)host到host端到端通信的层次是传输层及应用层(可见路由器和交换机是看不到这两层的)。
可见,路由器的功能就是提供路径转发功能,至于和二三层交换机的区别我们后面会讲)。路由器的主要功能是对经过的数据进行转发(期间肯定会缓存并做某些队列性质的排队处理),我们简单地描述其工作具体过程如下:
1)路由器接收数据包后,根据接收端口的类型(POS/ATM/ETH)去使用相应的链路层协议对数据包做检查,包括:crc校验、包(帧)的完整性等,最后剥去二层头(链路层协议头)。
2)根据包的ip头的目的ip字段在路由表里查找下一跳ip;同时,ip头的ttl字段做减1处理,并重新计算包的ip checksum。
3)根据路由表中所查到的下一跳ip(和出口),将该ip包(可能做分片处理)依据出口的端口类型(POS/ATM/ETH)封装新的二层头(链路层协议头),最后在该出端口(出端口可能和入端口是同一个,此场景发生于:该包的源ip和目的ip是同一个网段,也就不需要跨广播域了)上(可能做QOS处理)输出。
需要表明的是,在上述过程中使用的的路由表是整个流程的关键部件。
我们简单地看下路由表在使用时的要点:
1)最长匹配规则
如果路由表里只有2个表项:目的ip为1.0.0.0/16和1.0.0.0/24的表项,那么对于目的ip为1.0.0.1的包,应该选择第二个表项。
2)负载均衡
如果到某一个目的地有多条路由表项(即多条路径),路由器是支持做负载均衡的(也可以不做,此时选择一条最优路径)。
3)默认路由
如果前面的路由表项都命中不了,就走配置的默认路由了(没有默认路由则认为无路可走,走丢包流程),跟我们平时说的“网关”概念一致的。
路由表的使用很简单,但是路由表的生成和维护就很复杂了。
路由表必须定期更新以体现网络环境的变化,在各个路由器内部运行的各种路由协议就是做这个更新维护工作的,每个路由器通过该表可以构建(感知)整个网络拓扑。如果有到某个节点的多条路径,路由表应该能够选择最优(最优可以基于某个特定因素,比如跳数、带宽、优先级等)的路径。由于网络环境时刻都在变化,路由表(量级也很大)应该随时得到更新。路由表的维护是一个很庞大、很复杂的话题,涉及具体的路由协议(RIP/OSPF/BGP等),本文就不涉及了(我们以后讲到unix/linux的路由表实现时,再深入探讨)。
好了,路由器就介绍到这里,我们下次看看路由器和二三层交换机的区别。。。
(五)
0 回顾路由器
我们先回顾一下之前讲的路由器。
路由器的主要功能是路由处理,就是一种作为中间节点的转发能力,可以用于WAN-WAN、LAN-WAN、LAN-LAN之间的连通,这种互通是能够屏蔽异构网络的差别的。那路由器和二三层交换机之间到底有什么差别呢?为什么路由器不能用三层交换机替代呢?我们来看看。
1 路由器和三层交换机的比较
从vlan间互通的场景看起来,三层交换机与路由器之间的差别好像不大,但其实还是有很多根本区别的:
1)功能机构不同
很显然,路由器只有路由功能,没有交换功能。而三层交换机,除了路由功能(虽然很弱,跟路由器比的话)还有交换功能(貌似三层交换机更强?强不强得看比什么!)。其实,三层交换机相当于二层交换机基础上追加部分三层(路由)功能,而路由器其实也有类似处理:当今路由器开始追加了四层(网络管理)功能。
2)子网划分方式不同
三层交换机可以灵活分配子网段,比如把任意几个端口组合成一个子网(vlan的意义所在);而路由器则只能是每个端口固定一个子网。如本系列之前文章所述,其实子网划分方式伴随着子网间带宽问题:如果一个端口的带宽最大为m,则路由器的子网间带宽就是m(因为一个端口就是一个子网),而对于以vlan方式将n个这样端口组合成一个vlan的交换机而言,其子网间带宽则可以达到(n*m)。
3)实现不同
路由器的路由处理模块需要基于软件完成(因为处理很复杂,需要路由协议动态维护路由表),而三层交换机可以全部基于硬件(因为处理很简单很直接,只需要处理二层头,很容易ASIC)进行(跨子网)数据的交换。回忆一下,本系列之前文章所讲的三层交换机的工作原理(所谓“一次路由、多次交换”):同一个数据流仅在第一次时才需要路由处理(软件处理:产生辅助二层交换使用的表项,由二层模块使用),之后就直接走二层交换了。另外,路由器还有基于软件的更多复杂处理:NAT、L3VPN等功能,也在三层交换机上难于实现。
4)量级(性能)不同
对于三层交换机而言,路由的表项很少且稳定,而对于路由器则巨多且不稳定(这个差别其实就是各自应用场景的需求)。考虑到这一点,再想想把三层交换机放到WAN-WAN连接上会怎样?二层表中(由路由模块辅助填写的)的表项会被频繁改写(cpu会维持很高的使用率),根本达不到稳定状态,转发性能大打折扣。。。
5)应用场景不同
三层交换机用于局域网(具有频繁通信、各个子网都是同种物理介质类型的特点),主要对大量数据做快速交换处理。路由器则是用于不同类型网络之间的连接,比如LAN-LAN、LAN-WAN、WAN-WAN之间(LAN可以是任意链路层协议,比如以太或者令牌等),主要解决路径互通问题。
综上,路由器的特点是很强的路由功能,管理大量的路由表项,能很好的找到最优路径,但是数据转发(实际是三层转发)速度没有三层交换机(实际是三层辅助下的二层转发,只支持很少的路由表项)快。这样,我们就明白了为何路由器不能被三层交换机替代了。。。
我们再顺便看看路由器和二层交换机的比较(其实没有可比性)。
2 路由器和二层交换机的比较
1)回路处理
二层交换机之间需要屏蔽回路(使用stp算法),因为会导致广播风暴,所以某些端口其实是堵塞的。但是路由器没有这个问题,有多条链路更好,可以做负载均衡或者挑选最佳路径。
2)广播域的变化
交换机没有缩小广播域,整机还是一个广播域。而路由器是一个端口一个广播域,像trunk那种延伸广播域的做法在路由器上根本行不通。
3)处理包的内容不同
路由器处理三层头(ip地址),交换机处理二层头(mac地址)。
尾言
本系列要收尾了。其实本系列五篇文章,我们仅仅阐述了这些设备的最基本的功能,特别是路由器,其实现是非常复杂的(比如其上的mpls转发、各种路由协议、以及管理功能等)。我们以后会换个题目再讲(比如mpls)。。。(全文终)