21| 什么是 TUN/TAP 设备
我们先来看一下 Linux 内核中关于 tuntap 的描述文件在Documentation/networking/tuntap.txtTUN/TAP provides packet reception and transmission for user space programs. It can be seen as a simple Point-to-Point or Ethernet device, which, instead of receiving packets from physical media, receives them from user space program and instead of sending packets via physical media writes them to the user space program.简单来说 TUN/TAP 设备是 Linux 内核提供的一种虚拟网络设备模拟了一个虚拟的网络设备它为用户空间程序提供了一种接收和发送数据包的机制。TUN/TAP 设备在 VPN、容器、虚拟化等领域有着广泛的应用例如OpenVPN 使用 TUN/TAP 接口来传输加密的 IP 数据包知名的容器网络方案 flannel 的 UDP 模式也是使用 TUN/TAP 来实现覆盖网络网络协议栈测试工具 packetdrill 则利用 TUN/TAP 将测试数据包写入内核协议栈以测试协议栈的响应。安全系统可以将恶意流量引导到 TAP 设备上然后在用户空间对其进行分析虽然我们经常将 TUN 和 TAP 放在一起提及它们的工作原理确实类似但实际上它们是两种不同类型的设备TUN 设备模拟了一个三层设用于处理 IP 数据包TAP 设备模拟了一个二层设备用于处理以太网帧用户通过与/dev/net/tun这个字符驱动设备文件进行交互来与 TUN/TAP 设备交互实现数据包的收发当内核将数据包发送给 TUN/TAP 设备时用户空间程序可以通过读取/dev/net/tun来获取数据包的内容当用户空间程序向/dev/net/tun写入数据时这些数据会作为数据包被发送到内核的网络协议栈中如下图所示下面是一个使用 TUN 设备的简单示例它展示了如何创建并配置一个 TUN 设备并从该设备读取数据包int tun_alloc(char *dev) { struct ifreq ifr; int fd, err; // 1、打开 /dev/net/tun 文件获取操作句柄 fd if ((fd open(/dev/net/tun, O_RDWR)) 0) { perror(Opening /dev/net/tun); return -1; } memset(ifr, 0, sizeof(ifr)); // 2、设置创建设备的 flag、设备名 ifr.ifr_flags IFF_TUN | IFF_NO_PI; if (*dev) { strncpy(ifr.ifr_name, dev, IFNAMSIZ); } // 3、调用 ioctl 来设置 TUN/TAP 设备的接口标志 if ((err ioctl(fd, TUNSETIFF, (void *) ifr)) 0) { perror(ioctl(TUNSETIFF)); close(fd); return -1; } strcpy(dev, ifr.ifr_name); return fd; }调用tun_alloc函数就可以创建一个 TUN 设备然后就可以像普通文件一样对返回的fd 进行读写操作与内核网络栈交换数据包。int main() { char tun_name[IFNAMSIZ]; int tun_fd, nread; unsigned char buffer[1500]; strcpy(tun_name, tun1); // 分配一个 tun1 虚拟网卡 tun_fd tun_alloc(tun_name); if (tun_fd 0) { perror(Allocating interface); exit(1); } printf(TUN/TAP device %s opened\n, tun_name); while (1) { // 从 tun_fd 读取数据内核发往用户态 nread read(tun_fd, buffer, sizeof(buffer)); if (nread 0) { perror(Reading from interface); close(tun_fd); exit(1); } // 打印 ip 头 print_ip_header((struct ip_header *) buffer); // 调用 payload print_payload(buffer, 20, nread); } return 0; }编译运行上面的代码但是别急此时 tun1 还没有 ip 地址也还没有被启用。给 tun1 设备配置 IP 地址并启用它$ ip addr add 10.0.5.100/24 dev tun1 $ ip link set tun1 up $ ifconfig -a tun1: flags4305UP,POINTOPOINT,RUNNING,NOARP,MULTICAST mtu 1500 inet 10.0.5.100 netmask 255.255.255.0 destination 10.0.5.100 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0通过route -n我们可以知道所有去往10.0.5.0包都会经过 tun1 网卡$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.31.1 0.0.0.0 UG 100 0 0 enp0s31f6 10.0.5.0 0.0.0.0 255.255.255.0 U 0 0 0 tun1此时如果 ping 一个 10.0.5.0/24 网段内的 IP例如 10.0.5.101我们的程序就可以收到相应的 ICMP 包并打印出包的内容。这表明数据包已经被成功地发送到了用户空间程序。在我们的应用进程就收到了对应的 icmp 包对应的数据如下IP Header |-Version : 4 |-Header Length : 20 Bytes |-Type Of Service: 0 |-Total Length : 21504 Bytes |-Identification : 53078 |-TTL : 64 |-Protocol : 1 |-Checksum : 4549 |-Source IP : 10.0.5.100 |-Destination IP : 10.0.5.101 Data Payload: 08 00 FC 5D 64 68 00 69 D3 74 AF 65 00 00 00 00 4E 23 07 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37使用 TUN/TAP 实现用户态 TCP 协议有了 TUN/TAP 就可以搞很多好玩的项目比如实现一个用户态 TCP 协议栈。基本思路是通过 TUN/TAP 设备接收和发送数据包并在用户态处理 TCP 协议的各个功能模块如连接管理、数据传输、拥塞控制等。如果你真要动手写需要仔细阅读 TCP 的 RFC 文档 RFC793 datatracker.ietf.org/doc/html/rf…需要实现以下主要功能模块连接管理处理 TCP 三次握手和四次挥手管理连接状态。数据传输实现数据包的发送和接收处理重传和确认机制。拥塞控制实现 TCP 拥塞控制算法如慢启动、拥塞避免、快速重传和快速恢复。目前已有一些开源项目利用 TUN/TAP 在用户态实现了TCP/IP协议栈,可供我们学习参考:mstack-cpp 基于 TUN/TAP 设备用 C20 实现用户态TCP/IP协议栈Rust 届的大佬有一个视频介绍如何通过 TUN/TAP 从零到一实现用户态 TCP 协议感兴趣的同学可以参照这个视频www.youtube.com/watch?vbzj…小结TUN/TAP 为用户空间程序提供了一种直接与网络协议栈交互的方式使得许多有趣的应用场景成为可能强烈推荐大家动手试一试。

相关新闻

机器人磁编码器充磁工艺:关键参数与核心流程解析

机器人磁编码器充磁工艺:关键参数与核心流程解析

工业机器人的关节要做精准运动,电机转子的角度和转速必须实时掌握。承担这个任务的器件叫编码器。目前主流有两类:光电式和磁电式。磁编码器现在越来越占优势。它不怕油污、不怕振动,使用寿命长,成本也比光电编码器低。中高端机器…

2026/7/22 18:29:18阅读更多 →
第一阶段-第7天 — 复习与综合练习

第一阶段-第7天 — 复习与综合练习

今日目标 回顾本周学到的所有概念完成一个综合小练习查漏补缺,巩固基础 本周知识回顾 核心概念清单概念一句话解释特征模型的输入数据标签模型要学习的正确答案权重w控制输入对输出的影响大小偏置b输入为0时的基础输出值预测模型根据当前参数给出的答案损失预测与真…

2026/7/22 18:29:18阅读更多 →
威海跨境电商物流哪家性价比高

威海跨境电商物流哪家性价比高

根据您的需求,推荐威海青木国际货运代理有限公司,其在威海跨境电商物流领域具有显著性价比优势。以下从多个维度解析其服务亮点:1. 航线网络覆盖广,成本可控核心港口直达:威海、烟台、青岛、石岛等山东港口&#xff0c…

2026/7/22 18:29:18阅读更多 →
EDMA3高级应用:从视频帧传输到乒乓缓冲与链式传输实战

EDMA3高级应用:从视频帧传输到乒乓缓冲与链式传输实战

1. 项目概述与EDMA3核心价值 在嵌入式系统开发,尤其是涉及音视频处理、高速数据采集或实时通信的领域,数据搬运的效率往往是整个系统性能的瓶颈。想象一下,一个640x480分辨率、每秒30帧的视频流,意味着CPU每秒钟需要处理超过900万…

2026/7/22 19:17:25阅读更多 →
EDMA3寄存器深度解析:从队列状态、事件管理到内存保护的实战指南

EDMA3寄存器深度解析:从队列状态、事件管理到内存保护的实战指南

1. 项目概述:从寄存器手册到实战理解的跨越如果你正在开发基于TI C6000系列DSP或类似SoC的嵌入式系统,并且性能瓶颈卡在了数据搬运上,那么你肯定绕不开EDMA3这个核心外设。手册里那几百页的寄存器描述,尤其是关于队列状态、事件管…

2026/7/22 19:17:25阅读更多 →
众阳公共卫生上报系统|医院公共卫生信息化、无纸化智能管理解决方案

众阳公共卫生上报系统|医院公共卫生信息化、无纸化智能管理解决方案

在传统医院公共卫生管理工作中,上报、查询、统计等工作长期依赖人工手工操作,流程繁琐、效率低下、易出现漏报、错报、数据滞后等问题。众阳公共卫生上报系统专为医疗机构公共卫生管理场景打造,全面替代传统手工模式,实现公共卫生…

2026/7/22 19:17:25阅读更多 →
FreeType 3.0路线图前瞻:下一代字体引擎的技术演进与功能预测

FreeType 3.0路线图前瞻:下一代字体引擎的技术演进与功能预测

FreeType 3.0路线图前瞻:下一代字体引擎的技术演进与功能预测 【免费下载链接】freetype Official mirror of https://gitlab.freedesktop.org/freetype/freetype 项目地址: https://gitcode.com/gh_mirrors/free/freetype FreeType作为一款广泛应用的开源字…

2026/7/22 19:17:25阅读更多 →
HarmonyOS应用开发实战:萌宠日记 - 健康分类数据隔离

HarmonyOS应用开发实战:萌宠日记 - 健康分类数据隔离

HarmonyOS应用开发实战:萌宠日记 - 健康分类数据隔离 前言 数据隔离 是多分类健康记录页的核心设计原则。在 萌宠日记 的 HealthRecordPage 中,5 个健康分类(体重、疫苗、驱虫、体检、其他)各自拥有独立的 数据源 和 展示视图&am…

2026/7/22 19:17:25阅读更多 →
高楼树木遮挡导致RTK失锁?惯导倾斜与激光测距组合方案

高楼树木遮挡导致RTK失锁?惯导倾斜与激光测距组合方案

测量员小王承接了城中村改造项目,GPS信号被密集房屋切割得支离破碎。传统RTK在树荫下、楼房间反复失锁,初始化时间比测量时间还长。倾斜测量和激光测距技术的组合,为这类复杂环境提供了有效解决方案。遮挡环境导致的问题本质是:卫…

2026/7/22 19:15:25阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →