桥接模型

KVM 客户机网络连接有两种方式:

用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。

虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。

Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。


在Linux中的虚拟机的网卡都包含前半段和后半段,前半段在虚拟机上,后半段在宿主机上。上图eth0为虚拟机上的网卡,对应的后半段为vnet0,vnet0为tap设备。在虚拟机上所有发往eth0的数据就直接发往vnet0了,也可以将vnet0看作一块网卡。

在宿主机中创建一个桥设备,把宿主机的eth0放在桥上,这样虚拟机上的eth0将报文发给vnet0,再直接发给宿主机上的eth0,将源地址改为宿主机上的eth0的地址

当响应报文到达物理机上的eth0时如何判断此响应报文是发给虚拟机的还是物理机自己的?

物理机会先创建一个虚拟网卡,在物理机上打开混杂模式(无论mac地址是不是自己的都将接收响应报文),如果mac地址是自己的则转发给虚拟网卡,如果不是自己的则转发给vnet0,这就是桥接模型,因为物理机的网卡具有桥的功能所以叫做桥接模型。

这就是为什么我们在使用qemu进行系统级模拟iot设备时,虚拟机需要使用tap0网卡与宿主机进行交互

Qemu全虚拟化网桥模式下的VM的收发包的流程


如图中所示,红色箭头表示数据报文的入方向,步骤:

  1. 网络数据从 Host 上的物理网卡接收,到达网桥;
  2. 由于 eth0 与 tap1 均加入网桥中,根据二层转发原则,br0 将数据从tap1 口转发出去,即数据由 Tap设备接收;
  3. Tap 设备通知对应的 fd 数据可读; fd 的读动作通过 tap
  4. 设备的字符设备驱动将数据拷贝到用户空间,完成数据报文的前端接收。