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