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