架构跨越Linux之桥——桥表

1. 桥表是什么

在Linux网络桥接中,桥表(Bridge Table)是一个重要的数据结构。它用于存储桥接设备(Bridge Device)的转发决策信息,帮助桥接设备确定目标MAC地址的转发方向。桥表可以看作是一个以MAC地址为索引的数据库,记录着网桥设备上所有连接的计算机的MAC地址和对应的端口信息。

2. 桥表的数据结构

2.1 桥表的作用

桥表的作用是存储和维护MAC地址和接口之间的映射关系。当桥接设备接收到一个数据包时,首先会检查目标MAC地址是否在桥表中,如果在,那么桥接设备会将数据包转发到目标MAC地址对应的接口上;如果不在,那么桥接设备会将数据包转发到所有其他接口,同时学习目标MAC地址和来源接口的映射关系,并将其添加到桥表中。

2.2 桥表的结构

桥表通常由一个哈希表实现,用来加快查找速度。哈希表的每个槽(Slot)维护了一个桶(Bucket)链表,桶中存储了桥接设备的MAC地址和对应的接口信息。当桥接设备接收到一个数据包时,会根据目标MAC地址的哈希值在哈希表中查找对应的槽,然后在槽对应的桶链表中查找目标MAC地址和接口的映射关系。

在Linux内核中,桥表的数据结构定义在文件"include/uapi/linux/if_bridge.h"中:

struct net_bridge_fdb_entry {

struct hlist_node fh_node;

struct net_bridge_port *dst;

u8 addr[ETH_ALEN];

u16 vlan_id;

u16 is_static;

unsigned long updated;

};

struct net_bridge {

...

struct hlist_head *hash;

struct net_bridge_fdb_entry **hash_buckets;

...

};

3. 桥表的使用

3.1 桥表的添加

在Linux系统中,可以使用`ip`命令将MAC地址和接口的映射关系添加到桥表中:

ip link set dev bridge_name address MAC_address

其中,`bridge_name`为桥接设备的名称,`MAC_address`为MAC地址。

3.2 桥表的查询

可以使用`bridge fdb show`命令查询桥表中的MAC地址和接口的映射关系:

bridge fdb show dev bridge_name

其中,`bridge_name`为桥接设备的名称。

3.3 桥表的删除

可以使用`bridge fdb del`命令从桥表中删除MAC地址和接口的映射关系:

bridge fdb del dev bridge_name mac MAC_address

其中,`bridge_name`为桥接设备的名称,`MAC_address`为MAC地址。

4. 桥表的应用场景

桥表在Linux网络桥接中有着广泛的应用场景。下面介绍几个常见的应用场景:

4.1 局域网网桥

当多个局域网之间需要进行互通时,可以使用桥接设备和桥表来实现。桥接设备可以将多个局域网连接在一起,而桥表则用于转发数据包。

4.2 虚拟机网络

在虚拟化技术中,桥接设备可以连接宿主机和虚拟机,实现虚拟机与宿主机以及其他虚拟机之间的通信。桥表记录了虚拟机的MAC地址和对应的接口信息,用于数据包的转发。

4.3 安全策略

通过在桥表中添加和删除MAC地址和接口的映射关系,可以限制特定MAC地址的数据包转发。这在网络安全中起到了一定的作用。

5. 总结

桥表作为Linux网络桥接中的重要数据结构,承担着存储和维护MAC地址和接口映射关系的功能。它通过哈希表和桶链表的结构,快速准确地定位和查找目标MAC地址的转发方向。桥表在网络桥接、虚拟机网络和安全策略等场景中发挥着重要的作用。

操作系统标签