这篇文章中,主要给大家分享下在linux的tcp/ip协议栈中tap/tun设备所处的地位以及这种技术的使用和实验讲解。本文只讨论以太网的物理网卡,并且以linux 3.x内核的一个UDP包的发送过程作为示例,由于本人对协议栈的代码不熟,借鉴了网络资源学习相关流程和知识,有些地方可能理解有误,欢迎指正。
tcp/ip协议栈分层和netdevice子系统
1. socket层
- 1.1 application通过各类的语言的套接字接口,再通过系统调用与内核进行交互,设置相关的套接字参数。
- 1.2 进行发送数据时,进入协议栈的UDP协议层。
2. UDP层
- 2.1 主要是根据目的ip查询路由表获取出接口、网卡信息,绑定socket和ip之间的关系。
- 2.2 构造skb包,设置UDP、IP头部的信息。
- 2.3 发往ip层。
3. IP层
- 3.1 设置ip头部的信息。
- 3.2做netfilter的hook函数,进行一些访问控制、nat之类的策略,然后重新查询路由的操作。
- 3.3做ip分片。
- 3.4做arp查询,构造skb的二层头部数据。
4. netdevice子系统
- 4.1处理对应设备的qdisc(loopbackp或者ip tunnels设备没有)。
- 4.2处理traffic control,进行一些过滤和优先级处理。
- 4.3在dev_hard_start_xmit中做一次数据包的旁路处理(tcpdump就是在这里通过原始套接字抓包)。
- 4.4通过ndo_start_xmit发送到具体的驱动(如果是tun、tap设备就是对应的tun驱动)。
5 Device Driver
- 5.1将skb放到对应的网卡队列中、发送数据。
- 5.2发送中断给cpu,做相关清理工作。
tun设备的基本使用
1. tun设备的数据走向
- 1.1User Application A通过套接字(socket A)发数据发给使用与eno16777736处于同一个网段ip的应用程序,数据走向为通过socket A发给协议栈,最后通过netdevice子系统中的eno16777736的设备驱动(以太网驱动)发送出去,这个是通过真实的物理网卡发送出去。
- 1.2User Application B通过套接字(socket B)发送数据给使用与nsfocus_tun0处于同一个网段ip的应用程序,数据走向为通过socket B发送给协议栈,最后通过netdevice子系统中的nsfocus_tun0的设备驱动(tun驱动)发送出去。由于tun设备没有对应真实的物理网卡,所以nsfocus_tun0对端收取数据的是User Application C。User Application C通过读写/dev/tun设备文件进行数据的收发。
2. tun设备实验
- 2.1我们将在基于amd设备上的Centos7进行实验。
- 2.2代码
- 2.3 现象如下:
3. tun设备的场景应用
tap设备的基本使用
1. tap设备的数据走向
- 1.1User Application A通过套接字(socket A)发数据发给使用与eth处于同一个网段ip的应用程序,数据走向为通过socket A发给协议栈,最后通过netdevice子系统中的eno16777736的设备驱动(以太网驱动)发送出去,这个是通过真实的物理网卡发送出去
- 1.2User Application B通过套接字(socket B)发送数据给使用与nsfocus_tap0处于同一个网段ip的应用程序,数据走向为通过socket B发送给协议栈,最后通过netdevice子系统中的nsfocus_tap0的设备驱动(tun驱动)发送出去。由于tun设备没有对应真实的物理网卡,所以nsfocus_tap0对端收取数据的是User Application C。User Application C通过读写/dev/tun设备文件进行数据的收发。
2. tun设备实验
- 2.1我们将在基于amd设备上的Centos7进行实验。
- 2.2代码如图
- 2.3 现象如下。
3. tun设备的场景应用
绿盟科技博客作者QQ群:695158981
绿盟科技博客作者微信群: