我一直在阅读有关数据包捕获/处理和主机堆栈的技术文档,试图理解所有内容。我遇到了一些问题,希望有人能帮忙。
假设您正在运行tcpdump: 当一个数据包从NIC的环形缓冲区(物理NIC内存,对吗?)复制后,它是否立即被存储到mbuf中?然后BPF从mbuf中获取数据包的副本,该副本随后存储在BPF缓冲区中,因此在同一时间内存在两个内存中的副本?我试图理解确切的过程。
还是更像:数据包从NIC同时被复制到mbuf(用于主机堆栈处理)和BPF伪同时?
一旦数据包通过ip/tcp输入函数进行主机堆栈处理,以mbuf作为位置(指向mbuf),即将数据包存储在mbuf中,如果数据包没有被系统寻址,例如通过监视流量通过hub或SPAN / Monitor端口接收,那么数据包将被丢弃并永远不会上升到主机堆栈。
我看到过一些图表,显示了内核“框/将NIC环形缓冲区(RX / TX)与用户空间分开”,这使我开始怀疑环形缓冲区是否实际上是分配给系统内存而不是NIC上的物理内存。
假设环形缓冲区指的是NIC的物理内存,那么设备驱动程序是否确定了NIC环形缓冲区的大小,不考虑物理限制?例如,我可以通过修改驱动程序来缩小缓冲区吗?
谢谢!
假设您正在运行tcpdump: 当一个数据包从NIC的环形缓冲区(物理NIC内存,对吗?)复制后,它是否立即被存储到mbuf中?然后BPF从mbuf中获取数据包的副本,该副本随后存储在BPF缓冲区中,因此在同一时间内存在两个内存中的副本?我试图理解确切的过程。
还是更像:数据包从NIC同时被复制到mbuf(用于主机堆栈处理)和BPF伪同时?
一旦数据包通过ip/tcp输入函数进行主机堆栈处理,以mbuf作为位置(指向mbuf),即将数据包存储在mbuf中,如果数据包没有被系统寻址,例如通过监视流量通过hub或SPAN / Monitor端口接收,那么数据包将被丢弃并永远不会上升到主机堆栈。
我看到过一些图表,显示了内核“框/将NIC环形缓冲区(RX / TX)与用户空间分开”,这使我开始怀疑环形缓冲区是否实际上是分配给系统内存而不是NIC上的物理内存。
假设环形缓冲区指的是NIC的物理内存,那么设备驱动程序是否确定了NIC环形缓冲区的大小,不考虑物理限制?例如,我可以通过修改驱动程序来缩小缓冲区吗?
谢谢!