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地址的网桥端口,若未找到,将数据包发送给连接在网桥上的所有网络接口。
若找到,将数据包发送给此端口