DPDK
a. dpdk环境搭建
1. 多队列网卡
2. hugepage 大页/巨页
网卡–> 网卡驱动–> tcp/ip协议栈–>系统调用/posix api/send/recv —>APP
网卡 桥接:与主机网卡的ip在同一个网段内,通过路由器进行桥接通讯
NAT:为主机的子网内的ip,主机相当于一个路由器,通过主机进行与其他设备通讯
仅主机:仅可以与主机进行通讯
uio
pci
使用场景:数据备份 DPDK+RDMA
网关防火墙
ARP协议
arp是地址解析协议,位于网络层;其基本功能是降网络层的逻辑地址(IP地址)转化为数据链路层的物理地址(MAC地址),保证网络设备间的正常通讯。
工作流程
- 查询过程
- 当一台主机需要向同一局域网内的另一台主机发送数据时,他首先检测自己的ARP缓存表中是否有目标主机的IP地址与MAC地址的映射关系
- 若没有映射关系,主机将构造一个ARP请求报文,其中包含自己的IP地址和MAC地址以及目标主机的IP地址。将以广播的形式发送到局域网中的所有主机
- 局域网中每台主机都会接收该请求,但是只有目标主句会去响应该请求,他会发送一个ARP响应报文,包括其MAC地址以及原来请求中的IP地址
- 响应与缓存
- 发起请求的主机接收到响应后,会将目标地址与MAC地址的映射关系存储到自己的ARP缓存中,后续接收通讯可以直接使用ARP缓存中的数据
- 缓存项通常一定的生存是时间(TTL),过期后从缓存中清楚,下次通信时需要重新查询
ARP安全问题:
ARP欺骗:由于ARP的协议信任机制,恶意节点可以伪造ARP响应报文,谎报自己的MAC地址为其他设备的MAC地址,导致数据流向错误的设备,这个一种常见的网络安全威胁,这种攻击可以用于中间人攻击和拒接服务攻击;
NDP(邻居发现协议):在ipv6环境中。NDP已经取代了ARP功能,负责地址解析、邻居可达性检测、重复地址检测等任务;
-
初始化EAL环境抽象层
rte_eal_init(argc, argv)
-
创建一个用于存储
struct rte_mbuf
结构体实例的内存池struct rte_mempool *rte_pktmbuf_pool_create(const char *name, unsigned int n, unsigned int socket_id, unsigned int cache_size, unsigned int priv_size, unsigned int rte_socket_id); rte_pktmbuf_pool_create("mbuf_pool", 2048, 0, 0, 2048, rte_socket_id());
name
: 内存池的名称,用于识别和调试。n
: 内存池中struct rte_mbuf
实例的总数。socket_id
: 指定内存池应该从哪个CPU socket的内存中分配内存。在NUMA架构中,这有助于优化内存访问性能。cache_size
: 内存池中缓存的大小,每个CPU缓存的struct rte_mbuf
实例的数量。合理的缓存大小可以减少CPU之间的缓存争用,提高性能。priv_size
: 每个struct rte_mbuf
实例私有数据区域的大小,表示mbuf中数据缓冲区的大小- rte_socket_i: 当前执行该函数的CPU所在的NUMA节点ID。这样可以确保内存池被创建在调用该函数的CPU最近的NUMA节点上,从而优化内存访问效率。
-
查询当前DPDK中可用的以太网设备
uint16_t rte_eth_dev_count_avail(void); rte_eth_dev_count_avail();
返回值:该函数返回一个无符号16位整数,表示系统中可供DPDK使用的以太网设备的数量
-
获取指定以太网设备的详细信息
int rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)</