0.概括
首先通信原理十分简单,先概括一下
首先创建一个内存池,内存池中是一块一块内存,大小由我们指定。作为我们传递消息的单位。
1 | struct rte_mempool *message_pool = rte_mempool_create(_MSG_POOL, pool_size, |
(绕蒙圈了已经)可直接跳到后面看结论.目前已经不影响项目进展,中间部分当作素材,留着以后看看能不能整理出来吧。
这里主要是想搞清楚具体的,从网卡拿到数据包的流程是什么样的。正常来说,数据包进入网卡队列,由网卡驱动将数据包拷贝到内核缓冲区,然后进行封装,封装成sk_buffer然后就上交内核协议栈了。那么在我们的程序中,我们想要直接拿到网卡队列中的原始数据包。
想要达到这样的目的很简单,因为dpdk已经为我们提供了这样的接口:
1 | static inline uint16_t |
其中,第一个参数代表我们想要从哪个网卡端口获取数据包,第二个参数代表我们想要从哪个队列获取数据包,第三个参数是存放数据包数组指针,这个结构体用于存放原始数据包,第四个参数用于限制依次读取数据包的大小。
参考文章:
Ubuntu22.04使用apt安装MySQL8指南 – 气势磅礴 (ipangbo.cn)
文章代码来源:高并发Web服务器
环境:
vmware 16 pro
ubuntu 22.04
跟着简叔学的,可以B站搜索 简说linux
用户空间文件系统(Filesystem in Userspace),是Linux 中用于挂载某些网络空间,如SSH,到本地文件系统的模块,在SourceForge上可以找到相关内容。fuse文件系统依赖底层libfuse库来实现。
内核驱动在编写的时候调用内核的一些函数和头文件,编译的时候需要编译到内核空间里边去运行,通过insmod的方式加载到内核空间里边去运行。而用户空间驱动是运行在用户空间的,就像开发普通的应用程序,更加灵活但是有一些底层的功能支持并不完整。比如中断,锁等机制。之所以有用户空间驱动是因为内核驱动的功能比较固定而用户的需求又比较多变。
跟着简叔学的,可以B站搜索 简说linux
本地环回接口(或地址),亦称回送地址(loopback address)。真实的网卡设备工作在数据链路层,负责不同网卡设备之间的信号传输和转化。如果ifconfig查看,ens代表着真实的网卡设备,lo代表loopback网卡设备。该网卡设备并不是真实存在的,它存在的意义是什么呢。
lo网卡设将发送队列和接收队列接在了一起,因此上层应用给lo发送了什么,它就给你返回什么。通过这种特殊结构可测试协议栈是否正常工作,当使用命令,数据从应用层转到协议栈最后到lo设备,如果说协议栈功能是ok的,那么数据包从lo发出去后就应该收到正确的回应。