共用方式為


RSS 哈希函式

概觀

NIC 或其迷你埠驅動程式會使用 RSS 雜湊函式來計算 RSS 雜湊值。

上層驅動程式會設定雜湊類型、功能及資料表,將連線指派給 CPU。 如需詳細資訊,請參閱 RSS 組態

雜湊函數可以是下列其中一項:

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

備註

目前, NdisHashFunctionToeplitz 是迷你埠驅動程式唯一可用的雜湊函式。 其他雜湊函式會保留給 NDIS。 

迷你埠驅動程式應該先識別它在每個 NET_BUFFER_LIST 結構中使用的雜湊函式和值,再讓驅動程式指示收到的資料。 如需詳細資訊,請參閱 表示 RSS 接收資料的說明

範例

下列四個虛擬程式碼範例示範如何計算 NdisHashFunctionToeplitz 雜湊值。 這些範例代表 NdisHashFunctionToeplitz 可用的四種可能雜湊類型。 如需雜湊類型的詳細資訊,請參閱 RSS 雜湊類型

為了簡化範例,需要處理輸入位元組資料流程的通用演算法。 位元組資料流程的特定格式稍後會在四個範例中定義。

上覆驅動程式會提供秘密金鑰 (K) 給迷你埠驅動程式,以用於雜湊計算。 金鑰長度為 40 位元組 (320 位元)。 如需金鑰的詳細資訊,請參閱 RSS 設定

假設輸入陣列包含 n 個位元組,位元組資料流程的定義如下:

input[0] input[1] input[2] ... input[n-1]

最左邊的位元組是 input[0],input[0] 的最有效位是最左邊的位。 最右邊的位元組是 input[n-1],而 input[n-1] 的最低有效位元是最右邊的位元。

根據上述定義,用於處理一般輸入位元組資料流程的虛擬程式碼定義如下:

ComputeHash(input[], n)

result = 0
For each bit b in input[] from left to right
{
if (b == 1) result ^= (left-most 32 bits of K)
shift K left 1 bit position
}

return result

伪代码包含格式为@n-m的项目。 這些條目標識了TCP資料包中每個元素的位元組範圍。

使用TCP標頭的IPv4雜湊計算範例

將封包的 SourceAddress、DestinationAddress、SourcePort 和 DestinationPort 欄位串連成位元組陣列,保留它們在封包中出現的順序:

Input[12] = @12-15, @16-19, @20-21, @22-23
Result = ComputeHash(Input, 12)

僅限 IPv4 的雜湊計算範例

將封包的 SourceAddress 和 DestinationAddress 欄位串連成位元組陣列。

Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8) 

使用 TCP 標頭的 IPv6 雜湊計算範例

將封包的 SourceAddress、DestinationAddress、SourcePort 和 DestinationPort 欄位串連成位元組陣列,保留它們在封包中出現的順序。

Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)

僅限 IPv6 的雜湊計算範例

將封包的 SourceAddress 和 DestinationAddress 欄位串連成位元組陣列。

Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)