다음을 통해 공유


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

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

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

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

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

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

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

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

RSC 키워드는 표준화된 INF 키워드에서 지정된 것으로, RSC를 통해 레지스트리 키 설정으로 RSC 오프로드를 활성화하거나 비활성화할 수 있습니다.

키워드 값은 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. NetAdapterOffloadLayer3FlagIPv4NoOptionsNetAdapterOffloadLayer3FlagIPv6NoExtensionsLayer3Flags 필드에 유효한 유일한 값입니다. 이러한 플래그는 각각 IPv4 및 IPv6 지원을 나타냅니다.

  2. NetAdapterOffloadLayer4FlagTcpNoOptionsNetAdapterOffloadLayer4FlagUdpLayer4Flags 필드에 사용할 수 있는 유일한 값입니다. 이러한 플래그는 각각 TCP 및 UDP 지원을 나타냅니다.

  3. NetAdapterOffloadLayer4FlagTcpNoOptions 플래그가 설정된 경우 레이어 3 플래그를 설정해야 합니다.

  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 키워드에 지정된 URO 키워드를 사용하여 레지스트리 키 설정으로 URO를 사용하거나 사용하지 않도록 설정할 수 있습니다.

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

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