一、网络数据包接收流程

Linux内核网络栈的数据包接收是一个复杂而高效的过程,涉及硬件中断、DMA传输、软中断和NAPI轮询。数据包从网卡到达开始,经过以下几个关键阶段:

  1. 硬件中断触发:网卡接收到数据包后,通过DMA将数据写入内存中的接收环(Ring Buffer),然后触发中断。
  2. 硬中断处理:在中断上半部做最少的工作,主要是清除中断标志并调应软中断。
  3. NAPI轮询:软中断启用NAPI轮询,在一个轮询周期内处理多个数据包,减少中断引起的性能开销。

二、sk_buff数据结构

sk_buff(socket buffer)是Linux内核网络子系统中最重要的数据结构,用于表示网络套接字缓冲区。每个网络数据包在内核中都由一个sk_buff来表示。

核心字段

  • next & prev:用于将sk_buff链接至双向链表。
  • th & nh & mac:指向二、三、四层协议头部的指针。
  • head & data & tail & end:指向缓冲区的开始、当前数据位置、尾部和结束。
  • len & datalen:分别表示整个包的长度和分片长度。
  • < strong>sock & dev:指向旁输的套接字和网络设备。

三、Netfilter钩子架构

Netfilter是Linux内核中的一个引擎开放框架,允许用户程序在网络协议栈的关锾位置添加自定义处理函数。它提供了5个钩子点:

  • NF_IP_PRE_ROUTING:数据包入端口后路由决策前被触发。
  • NF_IP_LOCAL_IN:数据包目标为本机时被触发。
  • NF_IP_FORWARD:数据包需要转发时被触发。
  • NF_IP_LOCAL_OUT:本机发出的数据包遍历路由表后被触发。
  • NF_IP_POST_ROUTING:数据包印出发前最后被触发。
  • NF_IP_PRE_ROUTING:数据包入端口后路由决策前被触发。
  • NF_IP_LOCAL_IN:数据包目标为本机时被触发。
  • NF_IP_FORWARD:数据包需要转发时被触发。
  • NF_IP_LOCAL_OUT:本机发出的数据包遍历路由表后被触发。
  • NF_IP_POST_ROUTING:数据包印出发前最后被触发。

注:该文类似于"网络协议栈探索,深入了解sk_buff和Netfilter的原理和实现。

四、协议栈处理流程

数据包经过二层处理后,传递到三层(如IPv4)。在三层处理函数ip_rcv)中,会进行以下操作:

  • 验证IP头部完整性
  • 检查性长度和版本
  • 设罯checksum验证
  • Netfilter钩子PRE_ROUTING
  • 路由查找
  • 如果目标为本机,调用ip_local_deliver

在四层(如TCP),数据包传递到tcp_v4_rcv,打开发现相应的socket,将sk_buff推送至用户性背区。

五、总结

Linux内核网络栈是一个高效、模块化的系统,通过sk_buff统一表示网络数据包,利用Netfilter提供灵活的扩展机制。理解这些核心概念对于网络性能优化和安全防护至关重要。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部