一.虚拟网卡介绍

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

二.物理网卡收发包流程

1.收包:外界向该物理网卡发送数据包时,外界发送到网卡的数据包最终会传输到内核空间的网络协议栈中
2.发包:本机要从物理网卡发送数据包时,数据将从内核的网络协议栈传输到网卡,网卡负责将数据发送出去
注:现在的网卡具备DMA能力,所以网卡和网络协议栈之间的数据传输由网卡负责,而非由内核亲自占用CPU来执行读和写
一般来说,数据的起点和终点是用户程序,所以多数时候的数据需要在用户空间和内核空间(网络协议栈)再传输一次:

物理网卡需要通过网卡驱动在内核中注册后才能工作,它在内核网络协议栈和外界网络之间传递数据,用户可以为物理网卡配置网卡接口属性,比如IP地址,这些属性都配置在内核的网络协议栈中。

三.虚拟网卡收发包流程

内核也可以直接创建虚拟的网卡,只要为虚拟网卡提供网卡驱动程序,使其在内核中可以注册成为网卡设备,它就可以工作。

从Linux内核3.x版本开始,物理网卡和虚拟网卡是平等的设备,它们都会在注册时创建net_device数据结构来保存(物理或虚拟)设备信息。

相比于物理网卡负责内核网络协议栈和外界网络之间的数据传输,虚拟网卡的两端则是内核网络协议栈和用户空间,它负责在内核网络协议栈和用户空间的程序之间传递数据。

1.收数据包:


数据如何从内核空间到用户空间呢?这里用到一个字符设备。
在 Linux 中,用户空间和内核空间的数据传输有多种方式,字符设备就是其中的一种。tap/tun 通过驱动程序和一个与之关联的字符设备,来实现用户空间和内核空间的通信接口。
在 Linux 内核 2.6.x 之后的版本中,tap/tun 对应的字符设备文件分别为:

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

设备文件即充当了用户空间和内核空间通信的接口。当应用程序打开设备文件时,驱动程序就会创建并注册相应的虚拟设备接口,一般以 tunX 或 tapX 命名。当应用程序关闭文件时,驱动也会自动删除 tunX 和 tapX 设备,还会删除已经建立起来的路由等信息。
tap/tun 设备文件就像一个管道,一端连接着用户空间,一端连接着内核空间。当用户程序向文件 /dev/net/tun 或 /dev/tap0 写数据时,内核就可以从对应的 tunX 或 tapX 接口读到数据,反之,内核可以通过相反的方式向用户程序发送数据。

2.发包流程


Tap/Tun如何和网络协议栈传输数据

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

如上图所示,假设APP A要访问 192.168.1.200的服务器,数据包经过协议栈如下几个步骤:
1.APP A发送数据包到内核协议栈
2.经过内核协议栈的路由判决,判断下一个出接口为TunX
3.TunX接收到数据后,将数据包发送到字符设备/dev/net/tun
4.APP B从字符设备读取出数据包,已知要访问192.168.1.200的服务器是要发10.10.1.200目的地址
5.APP B将读取出的数据包作为原始数据,发送到内核协议栈
6.内核协议栈接收到APP B的数据(原数据包),进行数据封装,包一层新IP头,源IP为10.10.1.200,目的IP为10.10.1.200
7.数据包从Eth0物理接口出去
8.数据包发到对端服务器,进行上述1~7的逆过程

SDWAN-虚拟网卡(最全详解)相关推荐

  1. android底部滑动出现虚拟按键,Android适配底部虚拟按键的方法详解

    Android适配底部虚拟按键的方法详解 发布时间:2020-10-09 05:26:12 来源:脚本之家 阅读:171 作者:yuanzhihui123 最近项目进行适配的时候发现部分(如华为手机) ...

  2. Linux-shell-完全详解

    Linux-shell-完全详解(1) 一. Shell简介:什么是Shell,Shell命令的两种执行方式1 二. 几种常见的Shell1 三. Shell脚本语言与编译型语言的差异2 四.什么时候 ...

  3. WEB前端之网页设计③----最新最全详解/如何在网页上创建表格

    WEB前端之网页设计③--最新最全详解/如何在网页上创建表格 一.表格效果图1: <table border="0px" cellspacing="1px" ...

  4. 前端:深拷贝的多种方法(超全详解)

    别划走 !走过路过不要错过:错过这个村,我在下一个村等你!坚持每天进步一点点:一天两天可能没发现有效果:但一年365天后你将会感谢今天的自己!!! 今天博主带大家了解一下前端常用的深拷贝方法:(超全详 ...

  5. suse linux双网卡绑定,suse linux双网卡绑定设置详解

    <suse linux双网卡绑定设置详解>由会员分享,可在线阅读,更多相关<suse linux双网卡绑定设置详解(2页珍藏版)>请在人人文库网上搜索. 1.suse linu ...

  6. 解决网络时断时续:Nvidia-NFORCE-nvnet.ko网卡驱动安装详解

    解决网络时断时续:Nvidia-NFORCE-nvnet.ko网卡驱动安装详解 作者: spyer 高级会员(IPLogged) 日期: 2006-10-23 13:57:11 前天在ASUS-A8N ...

  7. 【学习笔记】薛定谔的喵咪Cat—球盒问题(全详解)

    [学习笔记]薛定谔的喵咪Cat-球盒问题(全详解) 传送门:薛定谔的喵咪 \(Luogu-U77460\)(自自上传的题目,数据略水,尤其是 \(opt=9\) ,以后找时间补上) [题目描述] 当一 ...

  8. 人工智能里程碑ChatGPT之最全详解图解

    人工智能里程碑ChatGPT之最全详解图解 1. ChatGPT的前世今生 1.1 ChatGPT演化路线 1.2技术推进路线 2.ChatGPT主要功能及应用领域 2.1 主要功能 2.2 应用领域 ...

  9. MySQL语句最全详解

    文章目录 MySQL语句最全详解 一.常见sql语句用法与演示 前置条件 连接命令 1.常用数据库类型 2.数据约束(数据表中) 3.数据库的备份和还原 二.操作数据库(操作数据库之前要通过命令行工具 ...

  10. Linux网卡配置文件-参数详解

    Linux网卡配置文件-参数详解 DEVICE=eth0 #指出网卡名称比如这个是eth0 NM_CONTROLLED=yes #network mamager的参数,实时生效,不需要重启,表示是否受 ...

最新文章

  1. JavaScript —— 如何判断一个非数字输入
  2. iis 程序池设置及详解-20180720
  3. Android--DPAD键的事件处理
  4. 十三、java_GUI
  5. pl/sql里的exists和in的差别
  6. 提高抗打击能力_如果提高心理抗打击能力?
  7. CentOS 配置软raid
  8. IOS之Masonry约束的使用
  9. ElasticSearch入门 附.Net Core例子
  10. ensp1.3.00.100用哪个virtualbox_virtualBox使用 Ubuntu18.0.4
  11. java aop xml配置_spring AOP使用 xml配置
  12. HttpWebRequest以及HttpWebResponse
  13. 《Java编程思想》读书笔记-对象导论
  14. (百万数据量级别)java下的mysql数据库插入越插越慢的问题解决
  15. iPhoneXS、XS Max与iPhoneXR 适配
  16. 台式计算机连接wifi适配器遇到问题,台式机连接wifi不稳定怎么办_台式电脑接wifi会不稳定解决方法-win7之家...
  17. Redundant Paths
  18. 使用深度学习进行生存分析
  19. Win7、Win10封装系统制作系统镜像,操作流程#gho
  20. HRBU_20211112训练

热门文章

  1. 装饰者模式 增加功能;动态代理减少功能 只要完成自己部分功能 (繁杂部分交给他人处理)...
  2. element-ui的el-menu路由模式下选中无颜色
  3. MTK Camera自定义Vendor Tag
  4. vue加载vue-amap 报错解决办法
  5. 结合实际案例谈谈项目管理经验
  6. Convex Clustering(凸聚类)
  7. Convex optimization 1 --- convex set
  8. 用计算机怎么刷试听量,QQ音乐怎么刷播放次数,快速增加播放量
  9. java中直线距离的计算_java计算两点间的距离方法总结
  10. 大学英语精读第三版(第五册)复习笔记——文章内容摘要