网桥的概念
网桥就是将桥一端的网络数据转发到桥的另一端的设备,这个转发是双向的。网桥和交换机是同一种设备。
网桥工作在数据链路层上。
网桥所连接的网络需要在同一网段内。
网桥在Linux中的实现
Linux中的网桥是一种虚拟设备。通常我们将一个或几个真实的设备(网卡)绑定到网桥设备上,网桥设备将绑定在它上面的设备视为端口port,
从而统一管理所有从设备。可以为网桥配置一个IP地址,而它的MAC地址则是它管理的所有从设备中最小的那个MAC地址。
绑定在网桥上的从设备不再需要IP地址及MAC,且他们被设置为可以接受任何数据包(设置网卡为混杂模式),然后统一交给网桥设备来决定数据包的去向:接受、转发、丢弃。
网桥对于Linux内核而言就是一个普通的网卡设备,当内核要发送数据时会调用网桥向内核注册的网卡驱动程序。然后在网桥内部决策由哪个从设备完成数据包的实际发送。
图2 Linux中网桥设备上的数据传输
网桥设备的初始化
网桥设备的创建
Linux中可以使用brctl命令来管理网桥设备,当创建一个新的网桥设备时的主要函数调用关系如下(net/bridge/br_if.c):
br_add_bridge ==> new_bridge_dev ==> br_dev_setup
在br_dev_setup函数中注册一个net_device_ops,这就是网桥设备对上层的接口。
static const struct net_device_ops br_netdev_ops = {
.ndo_open = br_dev_open,
.ndo_stop = br_dev_stop,
.ndo_start_xmit = br_dev_xmit,
.ndo_get_stats64 = br_