一、背景知识
在说网桥之前,先描述几个概念,有助于对网桥的功能及实现有更深的理解。
一个交换网络的逻辑图:
1. 冲突域
一个冲突域由所有能够看到同一个冲突或者被该冲突涉及到的设备组成。以太网使用C S M A / C D(Carrier Sense Multiple Access with Collision Detection,带有冲突监测的载波侦听多址访问)技术来保证同一时刻,只有一个节点能够在冲突域内传送数据。网桥或者交换机,构成了一个冲突域的边界。缺省情况下,网桥中的每个端口实际上就是一个冲突域的结束点。
2. 广播域
一个广播域由所有能够看到一个广播数据包的设备组成。一个路由器,构成一个广播域的边界。网桥能够延伸到的最大范围就是一个广播域。缺省的情况下,一个网桥或交换机的所有端口在同一个广播域中。VLAN技术可以把交换机或者网桥的不同端口分割成不同的广播域。一般情况下, 一个广播域代表一个逻辑网段。
3. 网桥中的CAM表
网桥和交换机一样,为了能够实现对数据包的转发,网桥保存着许多(MAC,端口)项。所有的这些项组成一个表,叫做CAM表。每个项有超时机制,如果一定时间内未接收到以这个MAC为源MAC地址的数据包,这个项就会被删除。
二、网桥工作机制
网桥工作在数据链路层,作用就是减少冲突域的,它根据MAC帧的目的地址对收到的帧进行转发和过滤。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的MAC地址。然后再确定将该帧转发到哪一个接口,或者是把它丢弃。
网桥设备依靠内部转发表来转发MAC帧,它可以把两个总线型网络连接起来在既能减缓冲突域的同时各个主机之间还可以通信(还是以广播的形式发送数据)。网桥比起集线器来算是有点智能的了,它的内部维护了一张转发表也叫转发数据库或路由目录。这个内部表可以是自动学习的也可以是手动生成,表内部标识着有那些主机连接在1号口上,有那些主机连接在2号口上。如下图:
这样一来当A主机发送信息给B主机时都是广播发送的,所以B主机会接收到信息。而网桥的1号接口也会接收到这个广播信息,然后就会查看内部表,会发现目标地址就存在于1号口,所以就不会转发到另一个总线网络中,就这样减少了冲突域。如果是A发送给C网桥发现C在2号口就会把信息广播过去。
虽然网桥的出现带来的一些好处,如减少缓冲突域、扩大了物理范围、提高了可靠性等等。但是网桥也是有一些缺点,如:一对接收的帧要先存储和查找转发表,然后才转发,而转发之前还必须执行CSMA/CD算法避免碰撞,这就增加了延迟。二用户数不可太多,不然就会因为传播过多的广播而产生网络堵塞,也就是所谓的广播风暴。
关于网桥,详情请看:数据链路层
三、Linux网桥相关命令
Linux内核在2.2就已经实现了网桥的功能(Linux内核分别在2.2和2.4内核中实现了网桥,但是2.2内核和2.4内核的实现有很大的区别,2.4中的实现几乎是全部重写了所有的实现代码)。但是要配置网桥需要安装bridge-utils工具。
1 |
$ yum install bridge-utils |
常用的操作命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 创建网桥br0; $ brctl addbr br0 # 查看网桥; $ brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no # 给网桥添加网卡,可以理解为给网桥添加接口; $ brctl addif br0 eth0 # 查看MAC地址; $ brctl showmacs br0 # 从网桥中删除网卡; $ brctl delif br0 eth0 # 开启或关闭网桥STP生成树协议; $ brctl stp br0 on $ brctl stp br0 off |
四、Linux网桥的使用
比如下面有这么一个场景:
有五台主机。其中一台主机装有Linux ,安装了网桥模块,而且有四块物理网卡,分别连接同一网段的其他主机。我们希望其成为一个网桥,为其他四台主机(IP分别为192.168.1.2 ,192.168.1.3,192.168.1.4,192.168.1.5) 之间转发数据包。同时,为了方便管理,希望网桥能够有一个IP(192.168.1.1),那样管理员就可以在192.168.1.0/24网段内的主机上telnet到网桥,对其进行配置,实现远程管理。
前一节中提到,网桥在同一个逻辑网段转发数据包。针对上面的拓扑,这个逻辑网段就是192.168.1.0/24网段。我们为这个逻辑网段一个名称,br_192。首先需要配置这样一个逻辑网段。
1 |
$ brctl addbr br_192 |
实际上,我们可以把逻辑网段192.168.1.0/24看作使一个VLAN ,而br_192则是这个VLAN的名称。
建立一个逻辑网段之后,我们还需要为这个网段分配特定的端口。在Linux中,一个端口实际上就是一个物理网卡。而每个物理网卡的名称则分别为eth0,eth1,eth2,eth3。我们需要把每个网卡一一和br_192这个网段联系起来,作为br_192中的一个端口。
1 2 3 4 |
$ brctl addif br_192 eth0 $ brctl addif br_192 eth1 $ brctl addif br_192 eth2 $ brctl addif br_192 eth3 |
网桥的每个物理网卡作为一个端口,运行于混杂模式,而且是在链路层工作,所以就不需要IP了。
1 2 3 4 |
$ ifconfig eth0 0.0.0.0 $ ifconfig eth1 0.0.0.0 $ ifconfig eth2 0.0.0.0 $ ifconfig eth3 0.0.0.0 |
然后给br_192的虚拟网卡配置IP:192.168.1.1,那样就能远程管理网桥。
1 |
$ ifconfig br_192 192.168.1.1 |
给br_192配置了IP之后,网桥就能够工作了。192.168.1.0/24网段内的主机都可以telnet到网桥上对其进行配置。以上配置的是一个逻辑网段,实际上Linux网桥也能配置成多个逻辑网段(相当于交换机中划分多个VLAN)。具体的方法可以参考bridge-util中的HOWTO。
<参考>
https://www.ibm.com/developerworks/cn/linux/kernel/l-netbr/index.html