a. 网桥的工作原理初识
l 缓存:网桥首先会对收到的数据帧进行缓存并处理;
学习:当帧经过网桥,网桥首先在网桥表中查找帧的源MAC地址,如果该地址不在网桥表中,则将有该MAC地址及其所对应的网桥端口信息加入(逆向学习法);
l 过滤:判断入帧的目标节点是否位于发送这个帧的网段中(同一端口中) ,如果是,网桥就不把帧转发到网桥的其他端口;
l 转发:如果帧的目标节点位于另一个网络,网桥就将帧发往正确的网段 (向另一端口转发) ;
每个桥维护了一个基于MAC地址的过滤数据库,网桥根据这个数据库,把收到的帧往相应的局域网(端口)进行转发。
在过滤数据库中,列出了每个可能的目的地(目的MAC地址),以及它属于哪一条输出线路(一个端口号,即表示转发给哪个LAN),每个表项还有一个超时设置。
可以及时学习改变了的地址;
转发:如果在表中找到目标地址,则直接转发给该目的MAC地址对应的端口;
转发:如果在表中找不到目标地址,则按扩散的办法将该数据发送给与该网桥连接的除发送该数据的网段外的所有网段。
以混杂方式工作(接收连接到该网桥的局域网上传送的所有帧)。
b. 网桥的工作过程
l 假设桥在端口x上接收到一个MAC帧,有如下规则
1. 查询网桥表中包的源MAC;如果没有,将该MAC地址及其所对应的网桥端口信息加入;如果有,继续下一步;
2. 查询过滤数据库,确定该目的MAC地址是否在除[端口x]外的其它端口中;如果目的MAC地址在端口x内,不进行转发;
3. 在转发时,如果目的MAC地址在过滤数据库中的某个端口y中,确定端口y是否处在阻塞或转发状态(生成树协议)。【在以后的生成树算法中我们可以看到,一个端口可能有时候是阻塞的,以防止它接收或发送帧】如果端口y是非阻塞的,把该帧通过端口y转发到它所连接的LAN中。
4. 在转发时,如果目的MAC地址没有找到,把该帧往除了它所到来的端口外的所有端口发送,即进行转发(扩散)。
c. 网桥的场景解析
学习:站点A给B发送数据,网桥通过察看帧的源地址了解到A在端口1,过滤数据库中加入。
转发:网桥并不知道B在何处,因此把帧向所有其它端口(即端口2和3)进行扩散。(网桥连接的所有端口,除端口1)
转发:B收到A发过来的帧之后,可能会进行回应,即B发送数据给A,这个时候网桥察看源地址了解到B在端口2上,加入表项,同时帧的目的地址A在过滤数据库中存在,并且在端口1上,因此B发回给A的帧向端口1转发
过滤:现在站点C向A发送数据,由于A、C和网桥连接到同一个集线器上,网桥也会收到该帧,察看源地址C,记录C在端口1,加入表项,同时目的地址A在过滤数据库中并且所在的端口正是收到该帧的端口,因此不进行转发。
老化:过滤数据库表项的TTL每秒都增加,超过某个值则从数据库中清除,一般缺省的TTL设置为300秒。老化主要是考虑到网桥的内存有限、节点移动的情况。
Bridge 是什么#
同 tap/tun、veth-pair 一样,Bridge 也是一种虚拟网络设备,所以具备虚拟网络设备的所有特性,比如可以配置 IP、MAC 等。
除此之外,Bridge 还是一个交换机,具有交换机所有的功能。
对于普通的网络设备,就像一个管道,只有两端,数据从一端进,从另一端出。而 Bridge 有多个端口,数据可以从多个端口进,从多个端口出。
Bridge 的这个特性让它可以接入其他的网络设备,比如物理设备、虚拟设备、VLAN 设备等。Bridge 通常充当主设备,其他设备为从设备,这样的效果就等同于物理交换机的端口连接了一根网线。比如下面这幅图通过 Bridge 连接两个 VM 的 tap 虚拟网卡和物理网卡 eth0.
VM 同主机通信#
以这个图来简单说明下,借助 Bridge 来完成同主机两台 VM 的之间的通信流程。
首先准备一个 centos 或 ubuntu 虚拟机,然后创建一个 bridge:
Copy
ip link add br0 type bridge ip link set br0 up
然后通过 virt-manager 创建两个 kvm 虚拟机:kvm1 和 kvm2(前提得支持嵌套虚拟化),将它们的 vNIC 挂到 br0 上,如下图:
kvm 虚机会使用 tap 设备作为它的虚拟网卡,我们验证下:
Copy
# ps -ef | grep kvm1 libvirt+ 3549 1 87 ? 00:22:09 qemu-system-x86_64 -enable-kvm -name kvm1 …… -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 ……
可以看到,其中网络部分参数,-netdev tap,fd=26 表示的就是连接主机上的 tap 设备。
创建的 fd=26 为读写 /dev/net/tun 的文件描述符。
使用 lsof -p 3549 验证下:
Copy
# lsof -p 3549 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME …… qemu-system 3549 libvirt-qemu 26u CHR 10,200 0t107 135 /dev/net/tun ……
可以看到,PID 为 3549 的进程打开了文件 /dev/net/tun,分配的文件描述符 fd 为 26.
因此,我们可以得出以下结论:在 kvm 虚机启动时,会向内核注册 tap 虚拟网卡,同时打开设备文件 /dev/net/tun,拿到文件描述符 fd,然后将 fd 和 tap 关联,tap 就成了一端连接着用户空间的 qemu-kvm,一端连着主机上的 bridge 的端口,促使两者完成通信。
下面分别给两虚机配上 IP:10.1.1.2/24 和 10.1.1.3/24,ping 一下:
在 bridge 上抓个包看看:
可以看到,br0 上抓到 ping 的 ICMP echo 包和 ARP 包。
Bridge 常用使用场景#
Bridge 设备通常就是结合 tap/tun、veth-pair 设备用于虚拟机、容器网络里面。这两种网络,在数据传输流程上还有些许不同,我们简单来看下:
首先是虚拟机网络,虚拟机一般通过 tap/tun 设备将虚拟机网卡同宿主机里的 Bridge 连接起来,完成同主机和跨主机的通信。
虚拟机发出的数据包通过 tap 设备先到达 br0,然后经过 eth0 发送到物理网络中,数据包不需要经过主机的的协议栈,效率是比较高的。
其次是容器网络(容器网络有多种引申的形式,这里我们只说 Bridge 网络),容器网络和虚拟机网络类似,不过一般是使用 veth-pair 来连接容器和主机,因为在主机看来,容器就是一个个被隔离的 namespace,用 veth-pair 更有优势。
容器的 Bridge 网络通常配置成内网形式,要出外网需要走 NAT,所以它的数据传输不像虚拟机的桥接形式可以直接跨过协议栈,而是必须经过协议栈,通过 NAT 和 ip_forward 功能从物理网卡转发出去,因此,从性能上看,Bridge 网络虚拟机要优于容器。
总结#
Linux Bridge 是虚拟交换机,功能和物理交换机一样,用于连接虚拟机和容器。
虚拟机网络和容器网络的区别。
Bridge 是偏低级的工具,更高级的工具是 Open vSwitch,这个工具后面再详说。
评论(0)