今天早上,有位朋友问了我这样一个问题:
IRB 集成路由与桥接,在一个路由器内的一个桥接组内的接口可看成是一个交换机的几个接口。而同时这些接口又可以是三层的路由接口。
------- E0 R1 E1--------
EO E1 同属于bridge 1,当R1接受到一个数据包时,会查看其MAC地址,如果MAC地址不是它自己,则桥接此帧到同一桥接组内,
如果MAC地址是它自己,则把MAC头去掉。交给BVI1接口处理。
当EO接受到一个802.1q的帧时,是不是也一样处理呢?
猜测对吗?
 
======================很黄很暴力的分割线==========================
 
我想,这个问题引申出很多网络的基本知识,正好借这个机会可以梳理一下。
这个问题本身想问的,其实是路由器在开启桥接功能后,如何处理数据的方式。
 
首先我们要澄清几个原理。
 
首先来看一个局域网交换的简单例子。
对于PC1来说,它具备一下几个要素:IP地址、掩码、网关。
我们假设IP为1.0.0.1,掩码为/24,网关为1.0.0.254(也就是route的地址)。
假设PC2为1.0.0.2,其他要素相同。
 
现在PC1要发一个前往1.0.0.2的包,PC1经过掩码计算后发现该目标应该和自己处在同一个网内,假设PC1没有任何该网段的MAC缓存。那么它发出一个广播ARP查询,询问谁是1.0.0.2,PC2回应查询并告知PC2的MAC地址,那么PC1将使用这个MAC地址作为目标MAC,并以此发送接下来所有给PC2的数据包。同时将该MAC缓存(也就是学习到了PC2的地址),并且以后在MAC缓存过期的时间内将不在发ARP广播进行查询。
 
如果PC1要发一个前往2.0.0.1(或者任意不是这个网段的IP)的数据,那么PC1经过掩码计算后发现不在一个网段内,它将不做广播动作,而是直接询问自己设置的网关,也就是1.0.0.254的MAC地址,获得该地址后,将前往2.0.0.1的数据包统统用这个MAC作为目标MAC,将这些不知道目标在哪里的数据扔给网关,也就是路由器处理去。
这个例子很简单,想必大家都了解了。
 
===================很傻很天真的分割线======================
 
好,接下来我们讨论路由器开启桥接的情况。
 
首先我们不谈是普通桥接还是IRB,因为这两种方式区别是处理VLAN的方式不同,这个我们后面再讨论。
 
我们现在面对的是路由器开启桥接以后,如何处理二层和三层的转发的问题。这也是这位朋友的第一个描述。
 
我们先来看图。图中分为上中下三种状态。
 
 
最上的小图讲述的是,一个路由器有三个外联线路,分别为1、2、3个接口。我们在1和2接口上做桥接(暂且不管是哪种桥接类型)。
中间的小图讲述的是,做完桥接以后,1、2口之间产生了联系,可以进行二层转发,也就形成了一个类似二层交换机之类的东西。
最下的小图讲述的是,桥接组产生了一个Bridge Visual Interface1(BVI1),这个东西可以理解为类似一个VLAN里的VLAN IP,也可以理解为我们前面讲过的局域网里的三层网关地址。
 
上中下三个图联系起来看,我们就可以看出,启动了桥接组的路由器,将在桥接组上产生一个逻辑交换机,路由器将同时维护三层MAC表和这个交换机内的MAC地址表。
 
这样,就回到我们前面讲述过的问题了。也就是比方说1口进来的数据,路由器将如何处理,在某种角度看,和路由器本身没有太大的关系,而是和1口那边终端PC想干什么有关系。1口的PC想找的是网段内的主机(比如2口),那么路由器将进行二层转发,从2口送出去;而1口的PC如果要发往一个网段外的主机(比如3口),那么数据将通过BVI1(也就是该PC的网关)进入三层的世界,路由器进行路由,至3口出去。
 
同样的,如果路由器有好多接口,并且开放了诺干个不同的桥接组,也可以照样看成是路由器上产生了诺干台二层交换机罢了。至于这些交换机之间的联系,是通过BVI实现的。
因此这位朋友的理解是基本正确的,只是有一点描述上的失误,那就是路由器在遇到桥接组里的目的数据时,路由器是由于知晓这些桥接组的所有MAC,是根据准确的MAC转发的,路由器可不会干"不知道是什么才扔给桥接二层转发"这样的事情,任何网络实现都会很谨慎的处理这种类似"比特桶"的问题,因为这样会引起不可预知的后果,换个角度思考这个的话,可以问这样这个问题:假设路由器用这样不负责任的方式处理数据的话,那么当一个路由器上有很多桥接组的时候,非自身MAC的数据都将扔给这些桥接组处理?这将引起多大的无用负载和线路消耗啊。
 
=======================很好很强大的