例如,如果我ethtool -g eth0
在我的系统上运行,我会得到以下输出:
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
4096 是分配给一帧的缓冲区大小(以字节为单位),是否存在多个这样的缓冲区,还是缓冲区的数量?
答案1
Tx/Rx 缓冲区是网络适配器分配的内存空间,用于处理流量突发。当流量超出网络适配器的物理容量时,就会进行缓冲。增加缓冲区大小将有助于避免适配器过载时出现数据包丢失。
答案2
我发现这篇文章有助于说明环形缓冲区(又称驱动程序队列)的功能,这可能有助于理解其目的/功能。文章标题为:Linux 网络栈中的排队。
这部分是我们感兴趣的部分:
驱动队列(又名环形缓冲区)
IP 堆栈和网络接口控制器 (NIC) 之间是驱动程序队列。此队列通常实现为先进先出 (FIFO) 环形缓冲区(http://en.wikipedia.org/wiki/Circular_buffer) — 只需将其视为固定大小的缓冲区。驱动程序队列不包含数据包数据。相反,它由指向称为套接字内核缓冲区(SKB, http://vger.kernel.org/%7Edavem/skb.html),它保存着数据包数据,并在整个内核中使用。
这张图展示了环形缓冲区的架构:
根据这篇文章,环形缓冲区的大小控制着SKB(套接字内核缓冲区)描述符。您可以在提供的链接上阅读有关 SKB 的更多信息,它们显示了构成 SKB 的 C 数据结构。
查看该文档,环形缓冲区似乎不仅仅是与帧缓冲区相关的,而是指向与数据包相关的更复杂的内核数据结构的指针。