gpt4 book ai didi

buffer - FreeBSD:有关 NIC 环形缓冲区、mbuf 和 bpf 缓冲区的问题

转载 作者:行者123 更新时间:2023-12-02 05:43:22 24 4
gpt4 key购买 nike

我已经阅读了许多有关数据包捕获/处理和主机堆栈的技术文档,试图理解这一切,有一些地方我遇到了麻烦,希望有人可以提供帮助。

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

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

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

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

假设环形缓冲区指的是 NIC 的物理内存,那么设备驱动程序确定 NIC 环形缓冲区的大小(将物理限制放在一边)是否正确?例如可以通过修改驱动来缩小缓冲区吗?

谢谢!

最佳答案

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

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

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

关于buffer - FreeBSD:有关 NIC 环形缓冲区、mbuf 和 bpf 缓冲区的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com