다음을 통해 공유


RSC(수신 세그먼트 병합) 오프로드

데이터를 수신할 때 TCP/IP 스택의 대부분의 계층은 각 세그먼트의 헤더 정보를 개별적으로 확인해야 합니다. 이렇게 하면 많은 양의 데이터를 수신할 때 많은 양의 오버헤드가 발생합니다.

수신 세그먼트 병합(RSC) 은 수신된 세그먼트 시퀀스를 병합하고 단일 병합 세그먼트에서 TCP/IP 스택을 표시하여 이러한 오버헤드를 줄입니다. TCP/IP 스택의 상층 계층은 전체 시퀀스에 대해 하나의 헤더만 확인해야 합니다.

하드웨어에서 RSC를 지원하는 NIC(네트워크 인터페이스 카드)는 수신 경로 성능을 크게 향상시킬 수 있습니다. 또한 프로토콜 계층이 소프트웨어에서 RSC를 수행할 수 없으므로 호스트 CPU 사용률을 줄일 수 있습니다.

RSC에 대한 자세한 내용은 수신 세그먼트 병합 개요를 참조 하세요.

NetAdapterCX는 버전 2.5부터 URO(UDP RSC)도 지원합니다. 자세한 내용은 UDP RSC 오프로드(URO)를 참조하세요.

RSC 오프로드를 제어하기 위한 INF 키워드(keyword)

NetAdapterCx는 레지스트리 키워드(keyword) 검사 활성 오프로드 기능을 사용하도록 설정할 때 이를 적용합니다. 드라이버는 추가 작업을 수행할 필요가 없습니다.

RSC용 표준화된 INF 키워드에 지정된 RSC 키워드(keyword) 레지스트리 키 설정으로 RSC 오프로드를 사용하거나 사용하지 않도록 설정하는 데 사용할 수 있습니다.

키워드(keyword) 값은 REG_SZ 형식이어야 합니다.

RSC 오프로드 구성

클라이언트 드라이버는 먼저 순 어댑터 초기화 중에 하드웨어의 RSC 기능을 보급합니다. 이 문제는 Net 어댑터를 시작하기 전에 EvtDevicePrepareHardware 콜백 내에서 발생할 수 있습니다.

RSC 기능을 구성하려면 클라이언트 드라이버:

  1. NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 구조를 할당합니다.

  2. NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 호출하여 구조를 초기화합니다.

  3. NetAdapterOffloadSetRscCapabilities를 호출하여 NetAdapterCx에 구조를 등록합니다.

NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 호출하는 동안 클라이언트 드라이버는 EVT_NET_ADAPTER_OFFLOAD_SET_RSC 콜백에 대한 포인터를 제공합니다. 활성 오프로드 기능이 변경되면 시스템은 나중에 이 콜백을 호출합니다.

하드웨어 RSC 기능을 나타내는 규칙

  1. 클라이언트 드라이버는 NIC에서 하드웨어 지원이 없는 트래픽 유형에 대해 소프트웨어 RSC를 수행해서는 안 됩니다.

다음 규칙은 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 구조에 적용됩니다.

  1. NetAdapterOffloadLayer3FlagIPv4NoOptionsNetAdapterOffloadLayer3FlagIPv6NoExtensions Layer3Flags 필드에 유효한 유일한 값 입니다 . 이러한 플래그는 각각 IPv4 및 IPv6 지원을 나타냅니다.

  2. NetAdapterOffloadLayer4FlagTcpNoOptionsNetAdapterOffloadLayer4FlagUdp Layer4Flags 필드에 유효한 유일한 값 입니다 . 이러한 플래그는 각각 TCP 및 UDP 지원을 나타냅니다.

  3. 플래그가 설정된 경우 계층 3 플래그를 NetAdapterOffloadLayer4FlagTcpNoOptions 설정해야 합니다.

  4. TcpTimestampOption 필드는 선택 사항입니다. 클라이언트 드라이버는 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 호출한 후 NetAdapterOffloadSetRscCapabilities를 호출하기 전에 이 필드를 설정하여 NIC가 TCP 타임스탬프 옵션을 지원하는지 여부를 나타냅니다.

다음 예제에서는 클라이언트 드라이버가 RSC 하드웨어 오프로드 기능을 설정하는 방법을 보여 줍니다.

VOID
MyAdapterSetRscOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's RSC offload capabilities
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES rscOffloadCapabilities;
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT(
        &rscOffloadCapabilities,
        NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions,
        NetAdapterOffloadLayer4FlagTcpNoOptions,
        MyEvtAdapterOffloadSetRsc);
    rscOffloadCapabilities.TcpTimestampOption = FALSE;

    // Set the current RSC offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRscCapabilities(NetAdapter, &rscOffloadCapabilities);
}

RSC 하드웨어 오프로드 업데이트

TCP/IP 스택 또는 지나치게 많은 프로토콜 드라이버가 net 어댑터의 활성 RSC 기능 변경을 요청하는 경우 NetAdapterCx는 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 등록된 클라이언트 드라이버의 EVT_NET_ADAPTER_OFFLOAD_SET_RSC 콜백을 호출합니다. 이 콜백에서 시스템은 클라이언트 드라이버가 오프로드 기능을 업데이트하기 위해 쿼리할 수 있는 NETOFFLOAD 개체에서 업데이트된 기능을 제공합니다.

클라이언트 드라이버는 다음 함수를 호출하여 사용하도록 설정된 RSC 오프로드를 결정할 수 있습니다.

다음 예제에서는 클라이언트 드라이버가 RSC 오프로드 기능을 업데이트하는 방법을 보여 줍니다.

VOID
MyEvtAdapterOffloadSetRsc(
    NETADAPTER NetAdapter,
    NETOFFLOAD Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = NetvAdapterGetContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->IsRscIPv4Enabled = NetOffloadIsTcpRscIPv4Enabled(Offload);
    adapterContext->IsRscIPv6Enabled = NetOffloadIsTcpRscIPv6Enabled(Offload);
    adapterContext->IsRscTcpTimestampOptionEnabled = NetOffloadIsRscTcpTimestampOptionEnabled(Offload);
}

UDP RSC 오프로드(URO)

URO를 사용하면 수신된 UDP 세그먼트를 병합할 수 있습니다. NIC는 규칙 집합과 일치하는 동일한 흐름의 UDP 데이터그램을 논리적으로 연속된 버퍼로 결합할 수 있습니다. 이러한 결합된 데이터그램은 Windows 네트워킹 스택에 단일 큰 패킷으로 표시됩니다. URO 규칙에 대한 자세한 내용은 UDP 패킷을 병합하기 위한 규칙을 참조 하세요 .

URO를 제어하기 위해 INF 키워드(keyword) 지정된 URO 키워드(keyword) 레지스트리 키 설정으로 URO를 사용하거나 사용하지 않도록 설정하는 데 사용할 수 있습니다.

NetAdapterCx 클라이언트 드라이버는 기존 RSC 구조와 URO용 RSC API를 사용할 수 있습니다. URO를 구성하려면 클라이언트 드라이버가 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 구조NetAdapterOffloadLayer4FlagUdp의 Layer4Flags 필드를 .로 설정해야 합니다.

URO 동작은 한 가지 예외를 제외하고 RSC를 미러. EVT_NET_ADAPTER_OFFLOAD_SET_RSC 콜백이 URO를 사용하지 않도록 설정하면 드라이버는 기존 병합 세그먼트를 나타내고 모든 미해결 URO 표시가 완료될 때까지 기다려야 합니다. 이 방법을 사용하면 콜백이 반환되면 활성 상태인 URO 표시가 없습니다.