本文首發於個人公衆號 CloudDeveloper(ID: cloud_dev),專一於乾貨分享,號內有大量書籍和視頻資源,後臺回覆 「1024」便可領取,歡迎你們關注,二維碼文末能夠掃。
前面幾篇文章介紹了 tap/tun、veth-pair,今天這篇來看看 Bridge。linux
同 tap/tun、veth-pair 同樣,Bridge 也是一種虛擬網絡設備,因此具有虛擬網絡設備的全部特性,好比能夠配置 IP、MAC 等。編程
除此以外,Bridge 仍是一個交換機,具備交換機全部的功能。ubuntu
對於普通的網絡設備,就像一個管道,只有兩端,數據從一端進,從另外一端出。而 Bridge 有多個端口,數據能夠從多個端口進,從多個端口出。centos
Bridge 的這個特性讓它能夠接入其餘的網絡設備,好比物理設備、虛擬設備、VLAN 設備等。Bridge 一般充當主設備,其餘設備爲從設備,這樣的效果就等同於物理交換機的端口鏈接了一根網線。好比下面這幅圖經過 Bridge 鏈接兩個 VM 的 tap 虛擬網卡和物理網卡 eth0。網絡
以這個圖來簡單說明下,藉助 Bridge 來完成同主機兩臺 VM 的之間的通訊流程。工具
首先準備一個 centos 或 ubuntu 虛擬機,而後建立一個 bridge:性能
ip link add br0 type bridge ip link set br0 up
而後經過 virt-manager
建立兩個 kvm 虛擬機:kvm1 和 kvm2(前提得支持嵌套虛擬化),將它們的 vNIC 掛到 br0 上,以下圖:雲計算
kvm 虛機會使用 tap 設備做爲它的虛擬網卡,咱們驗證下:spa
# 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 設備。.net
建立的 fd=26 爲讀寫 /dev/net/tun
的文件描述符。
使用 lsof -p 3549
驗證下:
# 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 設備一般就是結合 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,這個工具後面再詳說。
個人公衆號 CloudDeveloper(ID: cloud_dev),號內有大量書籍和視頻資源,後臺回覆 「1024」便可領取,分享的內容包括但不限於雲計算虛擬化、容器、OpenStack、K8S、霧計算、網絡、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++編程技術等內容,歡迎你們關注。