다음을 통해 공유


RSS 해시 함수

개요

NIC 또는 해당 미니포트 드라이버는 RSS 해시 함수를 사용하여 RSS 해시 값을 계산합니다.

오버리싱 드라이버는 해시 유형, 함수 및 테이블을 설정하여 CPU에 연결을 할당합니다. 자세한 내용은 RSS 구성 참조하세요.

해시 함수는 다음 중 하나일 수 있습니다.

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

메모

현재 NdisHashFunctionToeplitz 미니포트 드라이버에서 사용할 수 있는 유일한 해시 함수입니다. 다른 해시 함수는 NDIS용으로 예약되어 있습니다. 

미니포트 드라이버는 드라이버가 수신된 데이터를 나타내기 전에 각 NET_BUFFER_LIST 구조에서 사용하는 해시 함수와 값을 식별해야 합니다. 자세한 내용은 RSS 수신 데이터를 나타내는 을 참조하세요.

예제

다음의 4개의 의사코드 예제에서는 NdisHashFunctionToeplitz 해시 값을 계산하는 방법을 보여 줍니다. 이러한 예제는 NdisHashFunctionToeplitz사용할 수 있는 네 가지 가능한 해시 형식을 나타냅니다. 해시 형식에 대한 자세한 내용은 RSS 해시 형식참조하세요.

예제를 간소화하려면 입력 바이트 스트림을 처리하는 일반화된 알고리즘이 필요합니다. 바이트 스트림에 대한 특정 형식은 네 가지 예제의 뒷부분에서 정의됩니다.

오버리싱 드라이버는 해시 계산에 사용할 미니포트 드라이버에 비밀 키(K)를 제공합니다. 키는 40바이트(320비트) 길이입니다. 키에 대한 자세한 내용은 RSS 구성참조하세요.

n 바이트를 포함하는 입력 배열이 지정된 바이트 스트림은 다음과 같이 정의됩니다.

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

가장 왼쪽 바이트는 input[0]이고, 가장 중요한 입력 비트[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)