云原生虚拟网络 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

文章插图

推荐阅读