本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。

在云计算时代,虚拟机和容器已经成为标配。它们背后的网络管理都离不开一样东西,就是虚拟网络设备,或者叫虚拟网卡,tap/tun 就是在云计算时代非常重要的虚拟网络网卡。

tap/tun 是什么

tap/tun 是 Linux 内核 2.4.x 版本之后实现的虚拟网络设备,不同于物理网卡靠硬件网路板卡实现,tap/tun 虚拟网卡完全由软件来实现,功能和硬件实现完全没有差别,它们都属于网络设备,都可以配置 IP,都归 Linux 网络设备管理模块统一管理。

作为网络设备,tap/tun 也需要配套相应的驱动程序才能工作。tap/tun 驱动程序包括两个部分,一个是字符设备驱动,一个是网卡驱动。这两部分驱动程序分工不太一样,字符驱动负责数据包在内核空间和用户空间的传送,网卡驱动负责数据包在 TCP/IP 网络协议栈上的传输和处理。

用户空间与内核空间的数据传输

在 Linux 中,用户空间和内核空间的数据传输有多种方式,字符设备就是其中的一种。tap/tun 通过驱动程序和一个与之关联的字符设备,来实现用户空间和内核空间的通信接口。

在 Linux 内核 2.6.x 之后的版本中,tap/tun 对应的字符设备文件分别为:

  • tap:/dev/tap0
  • tun:/dev/net/tun

设备文件即充当了用户空间和内核空间通信的接口。当应用程序打开设备文件时,驱动程序就会创建并注册相应的虚拟设备接口,一般以 tunXtapX 命名。当应用程序关闭文件时,驱动也会自动删除 tunXtapX 设备,还会删除已经建立起来的路由等信息。

tap/tun 设备文件就像一个管道,一端连接着用户空间,一端连接着内核空间。当用户程序向文件 /dev/net/tun/dev/tap0 写数据时,内核就可以从对应的 tunXtapX 接口读到数据,反之,内核可以通过相反的方式向用户程序发送数据。

tap/tun 和网络协议栈的数据传输

tap/tun 通过实现相应的网卡驱动程序来和网络协议栈通信。一般的流程和物理网卡和协议栈的交互流程是一样的,不同的是物理网卡一端是连接物理网络,而 tap/tun 虚拟网卡一般连接到用户空间。

如下图的示意图,我们有两个应用程序 A、B,物理网卡 eth0 和虚拟网卡 tun0 分别配置 IP:10.1.1.11192.168.1.11,程序 A 希望构造数据包发往 192.168.1.0/24 网段的主机 192.168.1.1

基于上图,我们看看数据包的流程:

  1. 应用程序 A 构造数据包,目的 IP 是 192.168.1.1,通过 socket A 将这个数据包发给协议栈。
  2. 协议栈根据数据包的目的 IP 地址,匹配路由规则,发现要从 tun0 出去。
  3. tun0 发现自己的另一端被应用程序 B 打开了,于是将数据发给程序 B.
  4. 程序 B 收到数据后,做一些跟业务相关的操作,然后构造一个新的数据包,源 IP 是 eth0 的 IP,目的 IP 是 10.1.1.0/24 的网关 10.1.1.1,封装原来的数据的数据包,重新发给协议栈。
  5. 协议栈再根据本地路由,将这个数据包从 eth0 发出。

后续步骤,当 10.1.1.1 收到数据包后,会进行解封装,读取里面的原始数据包,继而转发给本地的主机 192.168.1.1。当接收回包时,也遵循同样的流程。

在这个流程中,应用程序 B 的作用其实是利用 tun0 对数据包做了一层隧道封装。其实 tun 设备的最大用途就是用于隧道通信的。

tap/tun 的区别

看到这里,你可能还不大明白 tap/tun 的区别。
tap 和 tun 虽然都是虚拟网络设备,但它们的工作层次还不太一样。

  • tap 是一个二层设备(或者以太网设备),只能处理二层的以太网帧;
  • tun 是一个点对点的三层设备(或网络层设备),只能处理三层的 IP 数据包。

tap/tun 的应用

从上面的数据流程中可以看到,tun 设备充当了一层隧道,所以,tap/tun 最常见的应用也就是用于隧道通信,比如 VPN,包括 tunnel 和应用层的 IPsec 等,其中比较有名的两个开源项目是 openvpn 和 VTun。

总结

tun/tap 虚拟网卡,对应于物理网卡,如 eth0。

tun/tap 驱动包括字符设备驱动和网卡驱动。

tun/tap 常用于隧道通信。


我的公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。

用 tap/tun 做虚拟机的网卡相关推荐

  1. linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上

    目录 linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上 一.tun/tap设备简介 二.在linux上使用tun/tap设备模拟一个虚拟网卡 三. 创建网桥连接到 ...

  2. 虚拟网络设备 tap/tun 原理解析

    在云计算时代,虚拟机和容器已经成为标配.它们背后的网络管理都离不开一样东西,就是虚拟网络设备,或者叫虚拟网卡,tap/tun 就是在云计算时代非常重要的虚拟网络网卡. tap/tun 是什么# tap ...

  3. TAP/TUN Vnet veth

    TAP 设备与 VETH 设备 TUN/TAP 设备是一种让用户态程序向内核协议栈注入数据的设备,一个工作在三层,一个工作在二层,使用较多的是 TAP 设备.VETH 设备出现较早,它的作用是反转通讯 ...

  4. TAP/TUN/VETH理解

    一 图例 二 图解 1 将vm的网卡和host OS的网卡连接在一起. 2 通过tun/tap adapter,会在host OS上生成虚拟网卡tap. 3 tun是点对点的网络设备,使得vm的网卡和 ...

  5. tap/tun设备 veth设备

    tap/tun设备 veth设备是openstack网络虚拟化中的重要的概念 首先来一张图,在openstack架构中 参考资料: https://zhuanlan.zhihu.com/p/74634 ...

  6. linux虚拟网络设备--eth, tap/tun, veth-pair(九)

    Linux 虚拟网络的背后都是由一个个的虚拟设备构成的.虚拟化技术没出现之前,计算机网络系统都只包含物理的网卡设备,通过网卡适配器,线缆介质,连接外部网络,构成庞大的 Internet. 然而,随着虚 ...

  7. 虚拟机从网卡路由问题

    虚拟机从网卡路由问题 近期有很多同事在使用虚拟机双网卡特性的时候,出现了一些问题.我趁此机会写一篇从网卡的短文,希望对大家有所帮助. 大家碰到的问题,可以归结为几类: 1.  已经添加了从网卡,为什么 ...

  8. hyperv中的ubuntu虚拟机双网卡设置

    hyperv中的ubuntu虚拟机双网卡设置 release author: ningan123 release time: 2022-07-26 场景 hyperv创建虚拟机的时候,默认用的是def ...

  9. 虚拟机服务器多线程设置,cpu核数线程做虚拟机

    cpu核数线程做虚拟机 内容精选 换一换 在服务器上运行多个虚拟机,每台虚拟机的业务不同,造成不同程度的资源占用,对于存储IO密集型的虚拟机,为了避免相邻的虚拟机的干扰,需要将不同虚拟机处理IO的存储 ...

最新文章

  1. Matlab大气湍流退化模型
  2. 《数据科学:R语言实现》——3.12 估计缺失数据
  3. TestNG并行测试
  4. 吴恩达《Machine Learning》精炼笔记 2:梯度下降与正规方程
  5. html跟鼠标移动,在HTML5相对鼠标移动
  6. gRPC-Web发布,REST又要被干掉了?
  7. 微信小程序正确的异步request请求,根据经纬度获取地理位置信息
  8. web项目jsp中无法引入js问题
  9. SpringBoot与日志slf4j使用原理
  10. 【BZOJ1497】【codevs1789】最大获利,网络流之最大权闭合子图
  11. python教程视频哪个好-Python入门视频哪个好?
  12. Ubuntu升级wine4.0
  13. java 类注释标准_Java 标准注释
  14. (一)RFB协议概述
  15. 【网络Ping不通如何解决?】
  16. axure 元件_Axure动态面板(上下左右滑动页面)
  17. oracle 加索引 %3e=,impdp create index parallel-数据泵并行创建索引
  18. 正态分布(用python画出相应的图)
  19. ecshop mysql 报错_修复ecshop数据库ecs_sessions.MYI报错
  20. oracle打开scott用户_Oracle解锁scott账户

热门文章

  1. 发明复制粘贴的那个人去世了
  2. 不写代码,用图形界面搞机器学习:MIT发布“全球最快AutoML”,刷新DARPA比赛成绩...
  3. CODING 缺陷管理功能正式开始公测
  4. 从地址字符串获取省市区信息
  5. Python 操作数据库(1)
  6. synchronized关键字实现原理
  7. 云栖TechDay精华文章合集
  8. 介绍linux下Source Insight强大代码编辑器sublime_text_3
  9. 每天一个linux命令(25):linux文件属性详解
  10. I2C总线学习(二)--数据传送格式