DPDK源码分析之网络基础知识

本文探讨了字节对齐的重要性在CPU通信协议和硬件驱动中的应用,介绍了内存池的优势以及内存管理的伙伴系统原理。此外,详细描述了Linux网络包接收过程,涉及DPDK调优策略,TCP建链的异常状态处理,以及TIME_WAIT状态的作用。还解释了线程地址空间共享的机制和B+树的数据结构特点。
摘要由CSDN通过智能技术生成

字节对齐 __attribute__ ((aligned (1)));

  • 在设计不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.
  • 如果跨越了4字节边界存储,那么cpu要读取两次,这样效率就低了

内存池设计原理

好处:

  • 比malloc/free进行内存申请/释放的方式快
  • 不会产生或很少产生堆碎片
  • 可避免内存泄漏

伙伴系统:

包在系统协议栈的流图,操作系统做了那些事情

  • 开始收包之前,Linux要做许多的准备工作,创建ksoftirqd线程,协议栈注册,linux要实现许多协议,比如arp,icmp,ip,udp,tcp,每一个协议都会将自己的处理函数注册一下;网卡驱动初始化,每个驱动都有一个初始化函数,内核会让驱动也初始化一下。在这个初始化过程中,把自己的DMA准备好,把NAPI的poll函数地址告诉内核;启动网卡,分配RX,TX队列,注册中断对应的处理函数
  • 网卡通过DMA将packet写入内核的rx_ring环形队列缓冲区,并触发硬中断(如果没有DMA,CPU就会负责赋值网卡数据到内存中,这个过程非常耗时)
  • CPU在收到中断之后,调用网卡ISR也就是所谓的中断handler,分配sk_buf并入input_pkt_queue(如果队列已满则丢弃),发出一个软中断NET_RX_SOFTIRQ,软中断被调度
  • ksoftirqd线程开始调用驱动的poll函数收包,然后将sk_buf从input_pkt_queue传入process_queue,根据协议类型调用网络层协议的handler,ip_rcv执行包头检查,ip_router_input()进行路由,决定本机/转发/丢弃,tcp_v4_rcv执行包头检查,tcp_v4_lookup查询对应的socket和connection,如果正常,tcp_prequeue将skb放进socket接收队列,socket随即唤醒所在的进程
  • 唤醒的进程调用socket recv系统调用,如果是TCP则调用tcp_recvmsg从sk_buffer拷贝数据

Dpdk调优有哪些

  • 控制层和数据层分离。将数据包处理、内存管理、处理器调度等任务转移到用户空间去完成,而内核仅仅负责部分控制指令的处理。这样就不存在上述所说的系统中断、上下文切换、系统调用、系统调度等等问题。
  • 使用多核编程技术代替多线程技术,并设置 CPU 的亲和性,将线程和 CPU 核进行一比一绑定,减少彼此之间调度切换。
  • 针对 NUMA (Non Uniform Memory Access Architecture)系统,尽量使 CPU 核使用所在 NUMA 节点的内存,避免跨内存访问。
  • 使用大页内存代替普通的内存,减少 cache-miss。
  • 采用无锁技术解决资源竞争问题。

Tcp建链的异常状态维护

  • 第一次握手消息丢失,触发超时重传机制,包括重传次数和重传周期
  • 第二次握手消息丢失:(SYN+ACK),客户端和服务端都会重传
  • 第三次握手消息丢失:(ACK),服务会重传SYN+ACK报文段,直到收到ACK响应或者达到最大重传次数

  • 第一次挥手消息丢失:(FIN),客户端会开启重传流程,达到最大次数后客户端将停止重传,直接进入 CLOSE 状态。
  • 第二次挥手消息丢失:(ACK),客户端会重传FIN报文,直到收到ACK报文,或达到FIN的最大重传次数。
  • 第三次挥手消息丢失:(FIN),TCP状态将从 CLOSE_WAIT 状态转入 LAST_ACK 状态,如果在超时时间内未收到客户端的第四次挥手 ACK报文,则重传FIN报文
  • 第四次挥手消息丢失:(ACK),ACK报文不会重传,服务端在超时未收到ACK后会重传FIN,直至成功收到ACK会达到最大重传次数

TIME_WAIT存在的两个理由

  • 可靠地实现TCP全双工连接的终止;
  • 允许老的重复分节(数据报)在网络中消逝。

B+树

在B +树中, 记录(数据)只能存储在叶节点上, 而内部节点只能存储键值。

B +树的叶节点以单链接列表的形式链接在一起, 以使搜索查询更高效创建

为啥线程的地址空间能一样

线程使用的底层函数和进程一样,都是clone。从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三级页表是相同的。进程可以蜕变成线程。线程可看做寄存器和栈的集合。

三级映射:进程PCB --> 页目录(可看成数组,首地址位于PCB中) --> 页表 --> 物理页面 --> 内存单元

两个线程具有各自独立的PCB,但共享同一个页目录,也就共享同一个页表和物理页面。

Reference

(7条消息) 图解 Linux 网络包接收过程_Peter的专栏-CSDN博客

(7条消息) linux内存管理笔记(二十二)----伙伴系统原理_奇小葩-CSDN博客_伙伴系统原理

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于顾而言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值