网桥是什么
我们这儿所说的网桥(Bridge),是最基本的二层交换机(不支持VLAN功能的交换机),其基本功能是转发网络中的二层报文。其工作总体流程如下:
- 从某个端口收到的二层报文,解析二层报文的源MAC和目的MAC
- 根据源MAC学习形成MAC表
- 根据目的MAC,原封不动的将该报文转发到适当的出端口,从而保证最终目的设备能收到这个报文。这个转发过程有两个关键:
a. 原封不动的: 所谓原封不动,就是交换机不会修改报文内容,包括报文的源MAC,目的MAC(这一点与路由器形成区别,路由器工作在三层,在转发过程中每一跳都会修改源MAC和目的MAC)
b. 适当的:交换机要确保报文最终能安全可靠的到达目的地,为了达到这个目的,这儿的适当的目的端口有可能不是一个。 比如:为了保证报文能最终达到这个目标,交换机在不知道目的设备在哪个端口的时候,会将一个报文复制多份,并从多个端口发送出去(除报文源端口以外的所有端口--这种行为成为泛洪-flood)。
网桥要解决哪些问题
网桥转发报文的流程如下:
收到一个报文后,根据报文的目的MAC,选择适当的端口进行转发。对于不同的报文,起转发流程略有差异:
a. 已知单播 - 单播:对于单播报文,如果知道目的地址在哪个端口(MAC表中能找到该目的MAC),就从该端口转发出去
b. 未知单播 - 泛洪:对于单播报文,如果暂时还不知道目的地址是哪个端口,则从所有非源端口泛洪出去
c. 组播广播 - 泛洪:对于广播和组播,也需要泛洪。
*注:网桥这样工作方式,总的来说,就是为了尽量达到一个目的:以尽可能小的代价保证报文能最终到达它的目的地 *
为了网桥上面转发行为能正常实施,网桥还需要考虑下面的问题:
- 维护MAC表:需要维护一张
MAC地址-接口 映射表
,并保证这张表的正确性。 - 报文转发环路的问题:防止报文环路的一个基本思路就是通过STP等控制面协议,将网络中的环剪断(破环)。也就是说,这个网络中虽然物理上有一些环路,但可以故意让某些链路停止工作,从而将物理上的有环网络(离散数学中的图),转变为逻辑上的无环网络(离散数学中的树)。
工作原理细节
MAC学习:维护MAC表
mac表实际上就是一个mac地址到出接口的映射表
S1的mac表
mac表 | 出接口 |
---|---|
macA | eth0 |
macB | eth1 |
macC | eth2 |
macD | eth2 |
S2的mac表
mac表 | 出接口 |
---|---|
macA | eth0 |
macB | eth0 |
macC | eth1 |
macD | eth2 |
- **监听学习: **当交换机从某个端口收到一个数据包,它先读取包头中的源MAC地址,这样它就知道源MAC地址的机器是连在哪个端口上的;
比如S1从eth2收到C发送的报文,这样S1网桥就会在mac表中增加一个条目
[macC --> eth2] 表示macC与eth2连着,以后收到目的地是macC的报文,就应该往eth2发送。
但如果S1刚刚启动,还不知道macC连着哪个端口怎么办? 网桥的解决方法是将报文转发给所有网口(接收报文的那个网口除外)。虽然效率不高,但至少能保证报文最终能到达目的地
- 监听更新: 然而,网络拓扑不可能是永不改变的。假设我们将主机B和主机C换个位置,当主机C发出报文时(不管发给谁),交换机S1的eth1口收到报文,于是交换机 S1会更新其学习到的地址,将原来的“主机C是通过eth2网口接入的”改为“主机C是通过eth1网口接入的”。
如果B和C换了一个位置,则S1会更新macC的出接口
[macC --> eth1]
- **定时老化: ** 网络拓扑变化还有一种可能性,就是直接将机器C拔掉了,这种情况下怎么保证mac表的正确性呢。很简单,如果一定时间内该端口没有收到C的任何报文,则假设该主机以及离线,将改主机对应的mac表象老化删除。 (加入该主机还在,只是这段时间没有发送报文怎么办? 想想,其实没有关系,大不了再次泛洪,重新学习,就和刚启动时一样)
转发环路
转发环路的问题,通常需要通过STP等信令协议进行破环。通过STP对某些链路进行剪枝操作,故意让某些链路停止工作,从而将物理上的有环网络(离散数学中的图),转变为逻辑上的无环网络(离散数学中的树)。
具体参见后面STP工作原理