我一直在阅读许多关于数据包捕获/处理和主机堆栈的技术文档,试图理解这一切,有一些地方我很困扰,希望有人能提供帮助。
假设您正在运行 tcpdump:从 NIC 的环形缓冲区(物理 NIC 内存对吗?)复制数据包后,它会立即存储到 mbuf 中吗?然后 BPF从mbuf 获取数据包的副本,然后将其存储在 BPF 缓冲区中,所以内存中同时存在两个副本?我试图了解确切的过程。
或者更像是:数据包从 NIC 伪同时复制到 mbuf(用于主机堆栈处理)和 BPF?
一旦数据包通过 ip/tcp 输入函数以 mbuf 作为位置(指向 mbuf)通过主机堆栈处理,即数据包存储在 mbufs 中,如果数据包不是针对系统寻址的,例如通过集线器监控流量接收或 SPAN/Monitor 端口,数据包将被丢弃,并且永远不会进入主机堆栈。
我似乎遇到了显示内核“盒子”中的 NIC 环形缓冲区(RX/TX)/将其与用户空间分开的图表,这让我再次猜测环形缓冲区是否实际上分配了不同于物理内存的系统内存网卡。
假设环形缓冲区是指 NIC 的物理内存,设备驱动程序确定 NIC 环形缓冲区的大小是否正确,抛开物理限制?例如,我可以通过修改驱动程序来缩小缓冲区吗?
谢谢!