【问题标题】:FreeBSD: Questions about NIC ring buffers, mbufs, and bpf buffersFreeBSD:关于 NIC 环形缓冲区、mbufs 和 bpf 缓冲区的问题
【发布时间】:2011-09-23 16:20:23
【问题描述】:

我一直在阅读许多关于数据包捕获/处理和主机堆栈的技术文档,试图理解这一切,有几个方面我很困扰,希望有人能提供帮助。

假设您正在运行 tcpdump: 从 NIC 的环形缓冲区(物理 NIC 内存对吗?)复制数据包后 它会立即存储到mbuf中吗?然后 BPF 从 mbuf 中获取数据包的副本,然后将其存储在 BPF 缓冲区中,所以内存中同时存在两个副本?我试图了解确切的过程。

或者更像是:数据包从 NIC 伪同时复制到 mbuf(用于主机堆栈处理)和 BPF?

一旦数据包通过 ip/tcp 输入函数以 mbuf 作为位置(指向 mbuf)通过主机堆栈处理,即数据包存储在 mbufs 中,如果数据包不是针对系统寻址的,例如通过监控接收通过集线器或 SPAN/Monitor 端口的流量,数据包将被丢弃,并且永远不会进入主机堆栈。

我似乎遇到了显示内核“盒子”中的 NIC 环形缓冲区(RX/TX)/将其与用户空间分开的图表,这让我再次猜测环形缓冲区是否实际分配的系统内存不同于NIC 上的物理内存。

假设环形缓冲区是指 NIC 的物理内存,设备驱动程序确定 NIC 环形缓冲区的大小是否正确,抛开物理限制?例如我可以通过修改驱动来缩小缓冲区吗?

谢谢!

【问题讨论】:

    标签: buffer freebsd libpcap nic circular-buffer


    【解决方案1】:

    ETHER_BPF_MTAP 宏调用 bpf_mtap(),它排除了 mbuf 格式的数据包,bpf 将数据从这个 mbuf 复制到内部缓冲区。

    但是mbufs可以使用外部存储,所以可以有也可以没有从网卡环形缓冲区复制到mbuf。 Mbufs 实际上可以包含数据包数据或仅用作参考接收缓冲区的标头。

    此外,当前的 NIC 仅将其小 (128/96/... Kb) 板载内存用于 FIFO,并立即将所有数据传输到主内存中的环形缓冲区。所以你真的可以在设备驱动程序中调整缓冲区大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2016-01-31
      • 2019-07-05
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多