zoukankan      html  css  js  c++  java
  • 网络设备虚拟化

    网络设备的虚拟化

    http://blog.csdn.net/sld880311/article/details/77854651
    

    这篇文章中有一个简单的例子来说明如何来操作tun设备,亲试有效

    在进行网络实验时,经常使用的是 tcpdump -I tun0 是检测所有tun0的数据包

    TUN和TAP一个最大的区别是:

    TUN是一个点对点设备

    TAP是一个以太网设备

    ping -c 4 192.168.209.139 -I tun0

    上面的程序中读到了发送的四条信息,但是我理解read的话是tap0接收信息才对呀,也就是别人发给tap0,这里难道是因为用户态发给了tap0?什么叫发送给网卡的信息?

    Read 84 bytes from tun/tap device
    Read 84 bytes from tun/tap device
    Read 84 bytes from tun/tap device
    Read 84 bytes from tun/tap device
    

    什么叫发送给网卡的信息?

    网卡接受数据,网卡发送数据

    对于ping操作的一些认识:ping -c 4 192.168.209.139 -I tun0,这里的-I选项,并不是说从这个interface出去,而是说从这个IP地址

    什么叫做 tun/tap 设备的0?

    这里还要一个更绝的使用方法:

    这个更绝的方法,读和写都有了,那么读相当于从网卡中接受数据,写相当于朝网卡中写入数据,那么这样就清楚了,上面的操作中,ping -I tun0是说,把这个ping的IP包发送出去,而write,是说朝个地址中写入数据,这样用户态就直接可以操作了嘛;这是个三层设备;在这里截获的都是ip数据报,那么这里如果是个tap设备的话,截获的就是伊特网数据包了吧,这个待会做下试验。

    int main(int argc, char *argv[])
    {
            int tun, ret;
            char tun_name[IFNAMSIZ];
            unsigned char buf[4096];
    
            tun_name[0] = '';
            tun = tun_create(tun_name, IFF_TUN | IFF_NO_PI);
            if (tun < 0) {
                    perror("tun_create");
                    return 1;
            }
            printf("TUN name is %s
    ", tun_name);
    
            while (1) {
                    unsigned char ip[4];
    
                    ret = read(tun, buf, sizeof(buf));
                    if (ret < 0)
                            break;
                    memcpy(ip, &buf[12], 4);
                    memcpy(&buf[12], &buf[16], 4);
                    memcpy(&buf[16], ip, 4);
                    buf[20] = 0;
                    *((unsigned short*)&buf[22]) += 8;
                    printf("read %d bytes
    ", ret);
                    ret = write(tun, buf, ret);
                    printf("write %d bytes
    ", ret);
            }
    
            return 0;
    }
      
    

     在试验因为tap是二层设备,但是tun是三层设备。所以抓到的东西要多?

    所以到这里也就明白了, tap/tun就是这样的设备咯,那么qumu里是怎样做网络虚拟化的呢?

    https://github.com/honpey/codebox/tree/master/net/tuntap
    
  • 相关阅读:
    Linux日志文件/var/log详解
    QT 的信号与槽机制介绍
    利用线程通信,写2个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序应该使12A34B56C···5152Z
    mysql快速安装
    zabbix安装源
    mysql手动安装
    没有可用软件包 zabbixservermysql
    【转载】web 部署专题(一):Gunicorn运行与配置方法
    supervisor快速配置
    linux监控脚本状态失败后拉起
  • 原文地址:https://www.cnblogs.com/honpey/p/8439334.html
Copyright © 2011-2022 走看看