码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • linux内核发包工具pktgen


    pktgen使用说明

    内核路径 net/core/pktgen.c
    作者对于pktgen的介绍: 原作者编写的pdf介绍

    pktgen.c 原理介绍

    pktgen运用了proc 文件系统特征来实现用户和内核的交互,用户通过向proc中传输数据,内核接收到数据后进行解析按照预定义的操作执行,添加端口,填充报文,通过内核发包接口dev_queue_xmit/netdev_start_xmit 发送给网卡,省去了从用户态发包的大部分流程( 发包流程介绍,引用 )。

    代码分析:加载pktgen.ko内核模块,module_init(pg_init); 会发现多了跟cpu core数相等的kpktgend_%d 内核线程,

    static struct pernet_operations pg_net_ops = {
    	.init = pg_net_init,
    	.exit = pg_net_exit,
    	.id   = &pg_net_id,
    	.size = sizeof(struct pktgen_net),
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后配置时候主要涉及三个文件节点的操作 ,对相应节点文件做读写操作的时候触发对应的proc ops

    kpktgend_%d

    安装了内核模块以后,在/proc/net/pktgen/目录下面会创建对应的文件,对应的操作定义为

    static const struct proc_ops pktgen_thread_proc_ops = {
    	.proc_open	= pktgen_thread_open,
    	.proc_read	= seq_read,
    	.proc_lseek	= seq_lseek,
    	.proc_write	= pktgen_thread_write,
    	.proc_release	= single_release,
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    pktgen_thread_write 在多add device的操作的时候会在/proc/net/pktgen/ 下添加对应的网卡名称命名的文件例如:/proc/net/pktgen/eth0

    网口节点

    static const struct proc_ops pktgen_if_proc_ops = {
    	.proc_open	= pktgen_if_open,
    	.proc_read	= seq_read,
    	.proc_lseek	= seq_lseek,
    	.proc_write	= pktgen_if_write,
    	.proc_release	= single_release,
    };
    通过pktgen_if_write 来实现对报文内容和发包逻辑的配置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    pgctrl

    static const struct proc_ops pktgen_proc_ops = {
    	.proc_open	= pgctrl_open,
    	.proc_read	= seq_read,
    	.proc_lseek	= seq_lseek,
    	.proc_write	= pgctrl_write,
    	.proc_release	= single_release,
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    通过对pgctrl的控制来实现线程发包的开始,停止,重启。

    使用场景

    1. 没有测试仪器的情况下对网卡,路由器,交换机等网络设备的带宽进行测试,根据包长不同会有不同表现,1500 包长达到10G测试下来没问题
    2. 特殊场景,绕过协议栈等上层的处理进行发包的需求
  • 相关阅读:
    快手自研Spark向量化引擎正式发布,性能提升200%
    [技术调研]数据不平衡解决方法调研
    在windows下安装配置skywalking
    5、Mybatis的查询功能(必定有返回值)
    服务端(后端)主动通知前端的实现:WebSocket(springboot中使用WebSocket案例)
    golang 指针变量赋值
    深度学习之 12 循环神经网络RNN2
    vue+mongodb+nodejs实现表单增删改查
    [附源码]java毕业设计医疗预约系统
    Google Earth Engine 教程——NDVI差异分析以及图像采集迭代分析
  • 原文地址:https://blog.csdn.net/wuheshi/article/details/126466838
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号