5

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

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

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

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

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

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

谢谢!

4

1 回答 1

2

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

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

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

于 2011-09-26T10:30:15.753 回答