Linux网桥工作原理

Linux网桥是一种使用软件实现的虚拟设备。它将多个网络接口连接起来,一个接口接收到的数据会复制到其他网络接口。

Docker在启动时,会创建一个名为docker0的虚拟网桥,默认使用172.17.0.1/16地址。并使用虚拟设备对veth-pair将容器与docker0网桥连接起来。Docker会创建一条iptables NAT规则将来自172.17.0.0/16网段的数据包通过物理网卡转发出去(如图中的enps03网卡)。

网桥工作在二层网络,能够根据MAC地址对数据包进行广播或者单播。当网桥在本地hash表中找到MAC地址对应的网桥端口,说明此数据包是单播数据包,否则就是广播数据包。


网络接口接收到数据包时,会判断这个网络接口是否绑定在某个网桥上,如果绑定了就开始处理数据。
首先从数据包中学习到的目标MAC地址插入到网桥的hash表中。
如果数据包是广播包(MAC地址首位是1),调用广播函数将数据包发送给连接在网桥上的所有网络接口。
否则在hash表中查找目标MAC地址的网桥端口,若未找到,将数据包发送给连接在网桥上的所有网络接口。
若找到,将数据包发送给此端口