linux下的网桥介绍

网桥用来连接不同的网段。使不同的网段能够相互通信,看起来很像三层的路由。它能够有多个port,从而能够将数据帧从一个port复制到另一个port。 

这里要注意一点,linux下的网桥只能用于以太网。 
来看下示意图: 


 

其中一个是bridge,一个是route。 

网桥的主要工作是从输入帧学习主机的位置,建立一个地址的表(也就是表明这个主机(mac地址)属于那个网络),然后基于这个表来复制输入帧到正确的位置。 

这里虽然bridge只是起一个引导的作用,可是在下面两个情况下,网桥也有可能处理输入帧: 

1 将输入帧up到上层协议栈。 

比如说这个网桥刚好还是一个router。 

2 将帧传递给协议处理handler. 

这里主要是在STP(spanning tree protocol)中会用到 


接下来来看网桥如何工作: 


 

lan1和lan2中的任意主机发送帧,都会被这两个lan中的所有主机(包括)接收到,当网桥接收到后,将此帧拷贝到它的port上,这里也就是拷贝到另一个lan上。 

这里可以看到这里有个问题,那就是假设host a发送一个帧到host b,而此时,这两个lan中的所有host都会接受到这个帧,这引起了极大地资源浪费。 

可是网桥还是很聪明的,它有地址学习的功能: 

当a第一次传递给b帧之后,网桥将会学习到a是在lan 1上,然后再当b传递数据给a时,网桥就不会传递多余数据给lan 2的主机了。 


当网桥收到的地址是链路层广播(FF:FF:FF:FF:FF:FF)时,他就会将这个帧拷贝到其他所有的port.因此多播将不会被学习。 

现在还有个问题,那就是局域网的主机是很容易变动的,举个例子,还是上面的情况,可是我把host a搬到lan 2上去了,而此时网桥还认为a在lan 1上,这个时侯数据传递就会出错了。 

这里解决方法就是使用定时器来定时更新这个表,当地址第一次被学习到时,定时器开始运行,然后当这个地址(mac地址)被重新学习到时,重启这个定时器。这样,我们通过设置定时器,就可以定时更新学习表了。这里的定时器如果设的太短的话,会有个问题,那就是很容易使网桥不知道如何到达另外一个lan(原因是超时后会删掉这条记录,而此时又回到第一次发包的情况了)。网桥就会赋值帧到所有的port. 

看下面的示意图: 


 


网桥回路的产生. 

先看下面的网络图: 


 

这里有两个网桥,此时就有可能会产生回路。当主机a发送一个帧之后,网桥 1 和 2 ,我们假设同时收到这个帧(此时学习到a处于 lan 1),并同时发到lan2,此时他们还会给对方发送一个帧,而这个帧刚好是刚才帧的赋值,这个时侯就会使这两个网桥认为a 处于lan 2上。这个时侯更新查找表,然后把包又发给lan 1.这时就形成了回路。 

我们用图来表示上面的网桥和lan的关系: 


 

可以看到如果我们要打破这个回路只需要关闭掉网桥1 或网桥2 的一个端口就行了。 

打破回路的算法基本所有算法书都有实现,在网络中寻找最佳无环路拓扑结构的算法是Spanning Tree Protocol,也就是如何在多个网桥和lan中实现无回路的网络。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章