tap.c代码
    
  1. #include<assert.h>
  2. #include<fcntl.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<sys/socket.h>
  6. #include<sys/ioctl.h>
  7. #include<linux/if.h>
  8. #include<linux/if_tun.h>
  9. #include<sys/types.h>
  10. #include<errno.h>
  11. #include<net/route.h>
  12. intTap=0;
  13. intTap1=0;
  14. int interface_up(char*interface_name)
  15. {
  16. int s;
  17. if((s = socket(PF_INET,SOCK_STREAM,0))<0)
  18. {
  19. printf("Error create socket :%m/n", errno);
  20. return-1;
  21. }
  22. struct ifreq ifr;
  23. strcpy(ifr.ifr_name,interface_name);
  24. short flag;
  25. flag = IFF_UP;
  26. if(ioctl(s, SIOCGIFFLAGS,&ifr)<0)
  27. {
  28. printf("Error up %s :%m/n",interface_name, errno);
  29. return-1;
  30. }
  31. ifr.ifr_ifru.ifru_flags |= flag;
  32. if(ioctl(s, SIOCSIFFLAGS,&ifr)<0)
  33. {
  34. printf("Error up %s :%m/n",interface_name, errno);
  35. return-1;
  36. }
  37. return0;
  38. }
  39. int tun_create(char*dev,int flags)
  40. {
  41. struct ifreq ifr;
  42. int fd, err;
  43. assert(dev != NULL);
  44. if((fd = open("/dev/net/tun", O_RDWR))<0){
  45. return fd;
  46. }
  47. memset(&ifr,0,sizeof(ifr));
  48. ifr.ifr_flags |= flags;
  49. if(*dev !='\0'){
  50. strncpy(ifr.ifr_name, dev, IFNAMSIZ);
  51. }
  52. if((err=ioctl(fd,TUNSETIFF,(void*)&ifr))<0){
  53. close(fd);
  54. return err;
  55. }
  56. strcpy(dev,ifr.ifr_name);
  57. return fd;
  58. }
  59. int main(int argc,char*argv[])
  60. {
  61. char tun_name[IFNAMSIZ]="tap0";
  62. char tun_name1[IFNAMSIZ]="tap1";
  63. Tap=tun_create(tun_name, IFF_TAP | IFF_NO_PI);
  64. if(Tap<0){
  65. perror("tun_create");
  66. return1;
  67. }
  68. printf("TAP name is %s\n", tun_name);
  69. printf("Tap=%d\n",Tap);
  70. //interface_up(tun_name);
  71. system("ifconfig tap0 10.66.31.185 netmask 255.255.0.0 up");
  72. while(1);
  73. }
 

程序要一直运行,否则程序退出后创建的TAP设备会被释放


在前面讲到了TAP口的基本原理。
那么我们直接用TAP口转发报文和TAP口绑定的虚拟网卡上用socket上发报文有什么区别呢?
    
 我上图,我们可以看到, Virtual NIC 就是我们的虚拟网卡,那么如果从TAP口进行报文发送的时候,
我们说了,TAP的使用者就相当于远程机器的网卡,也就是说报文会从虚拟网卡进入到协议栈,然后走内核
的转发流程进行转发(如果是本机就再去LocalIn点),否则就通过forward 到postRoute节点再次进入到TAP口,被
TAP接收后到应用层进行再次转发出去。

但是如果是通过Virtual NIC的socket发送消息就不同了,会先进入到内核,然后进入到转发面(LocalOut->forward),如果是本机发给本机的,报文就会进入到LocalIn节点,再被socket接收。
    如果是非本机的,就会通过postRoute发出去,再进入到TAP口被应用层转发面走转发流程。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

附件列表

TAP/TUN(二)的更多相关文章

  1. TAP/TUN摘要

    TUN适用于IP帧.Tap适用于以太网帧.TAP摸拟一个以太网设备(以arp广播MAC识别),它操作第二层数据包如以太网数据帧.TUN模拟了网络层ip设备(以点对点的方式,使用ip标识),操作第三层数 ...

  2. 一文总结 Linux 虚拟网络设备 eth, tap/tun, veth-pair

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Linux 虚 ...

  3. 利用 Linux tap/tun 虚拟设备写一个 ICMP echo 程序

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 前面两篇文章已 ...

  4. Linux 网络工具详解之 ip tuntap 和 tunctl 创建 tap/tun 设备

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 在前面一篇文章 ...

  5. [原创] 详解云计算网络底层技术——虚拟网络设备 tap/tun 原理解析

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 在云计算时代, ...

  6. 【转】Linux 网络工具详解之 ip tuntap 和 tunctl 创建 tap/tun 设备

    原文:https://www.cnblogs.com/bakari/p/10449664.html -------------------------------------------------- ...

  7. TAP/TUN浅析(一)

    参考链接:https://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/ TAP 设备与 VETH 设备     TUN/T ...

  8. TAP/TUN浅析

    转:http://www.cnblogs.com/yml435/p/5917628.html 参考链接:https://www.ibm.com/developerworks/cn/linux/1310 ...

  9. [转]Linux-虚拟网络设备-tun/tap

    转: 原文:https://blog.csdn.net/sld880311/article/details/77854651 ------------------------------------- ...

随机推荐

  1. 关于eclipse的一些配置

    在linux中打开的一刹那,第一感觉就是这货怎么这么丑,用的时候还发现,这货怎么这么慢. 可以通过使用GTK2来让它的图标显示得合理一些,可以调整内存的限制来减少fullGC的次数. 配置文件的路径: ...

  2. express框架路由配置及congtroller自动加载

    express框架在node官方推荐的一个框架,关于如何入门的文章,已经很多了,我就不在累赘了,本文的核心是如何修改文件使得更接近一个MVC的框架 express原生是通过require的方式实现了模 ...

  3. phpcms V9 内容模型管理

    [1]理解模型 模型,系统知识的抽象表示.既然抽象了,那就得脑补一下.大家都是面向对象设计的专业人员,类就很抽象的,对比类的定义想象一下模型的概念. 举个例子,一般新闻类的信息,都具有标题.内容.作者 ...

  4. Spring之ClassPathResource加载资源文件

    先看Demo: 1 @Test 2 public void testClassPathResource() throws IOException { 3 Resource res = new Clas ...

  5. [OSG]OpenSceneGraph FAQ 以及OSG资源

    1.地球背面的一个点,计算它在屏幕上的坐标,能得到吗? 不是被挡住了吗? 答:计算一个空间点的屏幕坐标,使用osgAPEx::GetScreenPosition函数.当空间点处于相机视空间内(不管它是 ...

  6. 我的Android第四章

    本章需掌握 1.连接真机的过程. 2.dx指令的作用 3.adb是什么? 4.adb有什么用(有什么好处)? 5.adb的一些常用命令 1.连接真机的过程. 需要:一部Android机.usb连接线, ...

  7. CSS ::before 和 ::after 伪元素另类用法

    原文地址:http://justcoding.iteye.com/blog/2032627 CSS 有两个说不上常用的伪类 :before 和 :after,偶尔会被人用来添加些自定义格式什么的,但是 ...

  8. javascript 值类型与引用类型

    写的比较简单哈,只是用来记忆下 (1)值类型:undefined.null.Boolean.Number和String (2)引用类型:对象.数组.函数

  9. 【Spring】非Spring IOC容器下获取Spring IOC上下文的环境

    前言 在Spring Web项目中,有些特殊的时候需要在非Spring IOC容器下获取Spring IOC容器的上下文环境,比如获取某个bean. 版本说明 声明POM文件,指定需引入的JAR. & ...

  10. 初识CEF

    介绍 CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开 ...