RSS / 网卡多队列分流

Toeplitz 滑动窗口

网卡靠这个哈希决定一个包进哪条收包队列。它没有查表、没有乘法,只有移位和异或—— 下面逐位走一遍,看那个 32 位窗口怎么在 key 上滑过去。

输入五元组

默认值是微软 RSS 规范里的第一组测试向量,四元组结果应为 0x51ccc178。

Key 磁带 — 窗口就是矩阵的第 0 行

Toeplitz 矩阵每一行都是上一行左移一位,所以整个矩阵只用存这 40 字节。框住的 32 位就是当前行,每处理一个输入位它向右滑一格。

逐位执行

输入字节(高位在前)
window
result

为什么一条连接会被劈成两个队列

同一条 TCP 连接的两个方向,五元组是对调的。 网卡对每个方向独立算哈希——如果两个方向算出不同的值,它们就进不同的队列,被不同的核处理。 需要看双向流量的场景(NAT、状态防火墙、流量分析)会因此拿不到完整的一条流。

正向
反向

队列号 = reta[ hash & 0x7F ],reta 按轮转填充。

三条不变量