【发布时间】: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