云原生虛擬網絡 tun/tap & veth-pair( 三 )

通過上面的抓包,并結合ping相關概念 , 我們大致可以了解到:

  1. ping進程構造ICMP echo請求包,并通過socket發給協議棧;
  2. 協議棧根據目的IP地址和系統路由表,知道去 10.1.1.3 的數據包應該要由 10.1.1.2 口出去;
  3. 由于是第一次訪問 10.1.1.3 , 剛開始沒有它的 mac 地址,所以協議棧會先發送 ARP 出去,詢問 10.1.1.3 的 mac 地址;
  4. 協議棧將 ARP 包交給 vethDemo0,讓它發出去;
  5. 由于 vethDemo0 的另一端連的是 vethDemo1,所以ARP請求包就轉發給了 vethDemo1;
  6. vethDemo1 收到 ARP 包后 , 轉交給另一端的協議棧,做出 ARP 應答,回應告訴 mac 地址 ;
  7. 當拿到10.1.1.3 的 mac 地址之后,再發出 ping 請求會構造一個ICMP request 發送給目的地,然后ping命令回顯成功;
總結本篇文章只是講了兩種常見的虛擬網絡設備 。起因是在看 flannel 的時候,書里面都會講到 flannel0 是一個 tun 設備,但是什么是 tun 設備卻不明白,所以導致 flannel 也看的不明白 。
經過研究,發現 tun/tap 設備是一個虛擬網絡設備,負責數據轉發,但是它需要通過文件作為傳輸通道,這樣不可避免的引申出 tun/tap 設備為什么要轉發兩次,這也是為什么 flannel 設備 UDP 模式下性能不好的原因,導致了后面這種模式被廢棄掉 。
因為 tun/tap 設備作為虛擬網絡設備性能不好,容器對容器的直接通信并不會把 tun/tap 作為首選方案,一般是基于稍后介紹的 veth 來實現的 。veth 作為一個二層設備,可以讓兩個隔離的網絡名稱空間之間可以互相通信 , 不需要反復多次經過網絡協議棧, veth pair 是一端連著協議棧,另一端彼此相連的,數據之間的傳輸變得十分簡單,這也讓 veth 比起 tap/tun 具有更好的性能 。
Referencehttps://zhuanlan.zhihu.com/p/293659939
https://segmentfault.com/a/1190000009249039
https://segmentfault.com/a/1190000009251098
https://www.junmajinlong.com/virtual/network/all_about_tun_tap/
【云原生虛擬網絡 tun/tap & veth-pair】https://www.junmajinlong.com/virtual/network/data_flow_about_openvpn/
https://www.zhaohuabing.com/post/2020-02-24-linux-taptun/
https://zhuanlan.zhihu.com/p/462501573
http://icyfenix.cn/immutable-infrastructure/network/linux-vnet.html
https://opengers.github.io/openstack/openstack-base-virtual-network-devices-tuntap-veth/
https://tomwei7.com/2021/10/09/qemu-network-config/
https://time.geekbang.org/column/article/65287
https://blog.csdn.net/qq_41586875/article/details/119943074
https://man7.org/linux/man-pages/man4/veth.4.html
云原生虛擬網絡 tun/tap & veth-pair

文章插圖

推薦閱讀