网络通信模型
网络数据包流向是从应用程序(用户空间)-> 协议栈(内核空间)-> 网卡
网络数据的打包过程都在内核中进行,Linux Kernel 2.4之后就提供了一套围绕着IP协议的过滤器,叫Netfilter。我们可以在过滤器中添加钩子函数对网络数据进行处理。
网络通信模型.png
虚拟化设备与通信
对Linux网络进行虚拟化需要三个东西:网络命名空间(network namespace)、虚拟网卡(veth)、虚拟网桥(bridge)。
Linux有一个默认的网络命名空间(root),不同的网络命名空间重复IP不会冲突,也看不到其他空间的网络设备。
虚拟网卡则是一对虚拟设备(veth pair),放在不同空间两头,作为通信使用。从网络数据的流动来说,经过了协议栈就是进入网卡(物理/虚拟),其本身是无感知的。
网桥则是虚拟的二层设备,连接veth与bridge,然后bridge就根据mac做转发。这样不同容器的网络请求经过自己这端的veth 到达root的veth, 通过网桥可以和其他容器或者真实网卡(发到外部网络) 通信。
思考:
不同网络空间通过网桥相连后,网络空间的IP会冲突吗?它们发送网络请求时,IP、MAC都填什么?
参考资料:
Linux 网络虚拟化