3 --> linux bridge 原理解析

本文详细介绍了Linux Bridge作为二层网络设备的基本概念,其工作原理,包括数据缓存、学习、过滤和转发机制。重点讲解了MAC地址处理、IP设置以及数据流方向。实例演示了桥接设备如何连接、通信和IP配置的限制。
摘要由CSDN通过智能技术生成

基本概念

Bridge(桥)是 Linux 上用来做 TCP/IP 二层协议交换的设备,与现实世界中的交换机功能相似。Bridge 设备实例可以和 Linux 上其他网络设备实例连接,既 attach 一个从设备,类似于在现实世界中的交换机和一个用户终端之间连接一根网线。当有数据到达时,Bridge 会根据报文中的 MAC 信息进行广播、转发、丢弃处理。

Bridge 的功能主要在内核里实现。当一个从设备被 attach 到 Bridge 上时,相当于现实世界里交换机的端口被插入了一根连有终端的网线。这时在内核程序里,netdev_rx_handler_register()被调用,一个用于接收数据的回调函数被注册。以后每当这个从设备收到数据时都会调用这个函数、可以把数据转发到 Bridge 上。当 Bridge 接收到此数据时,br_handle_frame()被调用,进行一个和现实世界中的交换机类似的处理过程:判断包的类别(广播/单点),查找内部 MAC 端口映射表,定位目标端口号,将数据转发到目标端口或丢弃,自动更新内部 MAC 端口映射表以自我学习。

Bridge 和现实世界中的二层交换机有一个区别,数据被直接发到 Bridge 上,而不是从一个端口接收。这种情况可以看做 Bridge 自己有一个 MAC 可以主动发送报文,或者说 Bridge 自带了一个隐藏端口和寄主 Linux 系统自动连接,Linux 上的程序可以直接从这个端口向 Bridge 上的其他端口发数据。所以当一个 Bridge 拥有一个网络设备时,如 bridge0 加入了 eth0 时,实际上 bridge0 拥有两个有效 MAC 地址,一个是 bridge0 的,一个是 eth0 的,他们之间可以通讯。
由此带来一个有意思的事情是,Bridge 可以设置 IP 地址。通常来说 IP 地址是三层协议的内容,不应该出现在二层设备 Bridge 上。但是 Linux 里 Bridge 是通用网络设备抽象的一种,只要是网络设备就能够设定 IP 地址。
当 bridge0 拥有 IP 后,Linux 便可以通过路由表或者 IP 表规则在三层定位 bridge0,此时相当于 Linux 拥有了另外一个隐藏的虚拟网卡和 Bridge 的隐藏端口相连,这个网卡就是名为 bridge0 的通用网络设备,IP 可以看成是这个网卡的。当有符合此 IP 的数据到达 bridge0 时,内核协议栈认为收到了一包目标为本机的数据,此时应用程序可以通过 Socket 接收到它。

Bridge 的实现当前有一个限制:当一个设备被 attach 到 Bridge 上时,那个设备的 IP 会变的无效,Linux 不再使用那个 IP 在三层接收数据。
举例:如果 eth0 本来的 IP 是 192.168.1.2,此时如果收到一个目标地址是 192.168.1.2 的数据,Linux 的应用程序能通过 Socket 操作接收到它。而当 eth0 被 attach 到一个 bridge0 时,尽管 eth0 的 IP 还在,但应用程序是无法接收到上述数据的。应用程序需要通过bridge0 的ip地址来接收数据。

另外需要注意的是数据流的方向。对于一个被 attach 到 Bridge 上的设备来说,只有它收到数据时,此包数据才会被转发到 Bridge 上,进而完成查表广播等后续操作。当请求是发送类型时,数据是不会被转发到 Bridge 上的,它会寻找下一个发送出口。用户在配置网络时经常忽略这一点从而造成网络故障。

2. 网桥的工作原理

  • 缓存:网桥首先会对收到的数据帧进行缓存并处理;

  • 学习:当帧经过网桥,网桥首先在网桥表中查找帧的源MAC地址,如果该地址不在网桥表中,则将有该MAC地址及其所对应的网桥端口信息加入(逆向学习法);

  • 过滤:判断入帧的目标节点是否位于发送这个帧的网段中(同一端口中) ,如果是,网桥就不把帧转发到网桥的其他端口;

  • 转发1:如果帧的目标节点位于另一个网络,网桥就将帧发往正确的网段 (向另一端口转发) ;

  • 转发2:如果在表中找到目标地址,则直接转发给该目的MAC地址对应的端口;

  • 转发3:如果在表中找不到目标地址,则按扩散的办法将该数据发送给与该网桥连接的除发送该数据的网段外的所有网段。

每个桥维护了一个基于MAC地址的过滤数据库,网桥根据这个数据库,把收到的帧往相应的局域网(端口)进行转发。
在过滤数据库中,列出了每个可能的目的地(目的MAC地址),以及它属于哪一条输出线路(一个端口号,即表示转发给哪个LAN),每个表项还有一个超时设置。可以及时学习改变了的地址;
以混杂方式工作(接收连接到该网桥的局域网上传送的所有帧)。

3. 网桥的工作过程

假设桥在端口x上接收到一个MAC帧,有如下规则

  1. 查询网桥表中包的源MAC;如果没有,将该MAC地址及其所对应的网桥端口信息加入;如果有,继续下一步;

  2. 查询过滤数据库,确定该目的MAC地址是否在除[端口x]外的其它端口中;如果目的MAC地址在端口x内,不进行转发;

  3. 在转发时,如果目的MAC地址在过滤数据库中的某个端口y中,确定端口y是否处在阻塞或转发状态(生成树协议)。【在以后的生成树算法中我们可以看到,一个端口可能有时候是阻塞的,以防止它接收或发送帧】如果端口y是非阻塞的,把该帧通过端口y转发到它所连接的LAN中。

  4. 在转发时,如果目的MAC地址没有找到,把该帧往除了它所到来的端口外的所有端口发送,即进行转发(扩散)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值