Разгрузка сегментов объединения сегментов (RSC)
При получении данных большинство слоев в стеке TCP/IP должны искать сведения о заголовках каждого сегмента отдельно. Это создает большую нагрузку при получении больших объемов данных.
Объединение сегментов (RSC) уменьшает эту нагрузку, объединяя последовательность полученных сегментов и указывая на них стек TCP/IP в одном объединяемом сегменте. Верхние слои в стеке TCP/IP должны рассматривать только один заголовок для всей последовательности.
Сетевой интерфейс карта (сетевой адаптер), поддерживающий RSC в оборудовании, может значительно повысить производительность пути получения. Кроме того, он может снизить загрузку ЦП узла, так как он освобождает уровень протокола от выполнения RSC в программном обеспечении.
Дополнительные сведения о RSC см. в разделе "Обзор объединения сегментов получения".
NetAdapterCX также поддерживает UDP RSC (URO) начиная с версии 2.5. Дополнительные сведения см. в разделе UDP RSC Offload (URO).
INF-ключевое слово для управления разгрузкой RSC
NetAdapterCx проверка реестр ключевое слово и учитывает их при включении активных возможностей разгрузки. Драйверу не нужно предпринимать никаких дальнейших действий.
Ключевое слово RSC, указанные в стандартных ключевых словах INF для RSC, можно использовать для включения и отключения разгрузки RSC с параметром раздела реестра.
Значения ключевое слово должны иметь тип REG_SZ.
Настройка разгрузки RSC
Клиентские драйверы сначала объявляют возможности RSC оборудования во время инициализации сетевого адаптера. Это может произойти в рамках обратного вызова EvtDevicePrepareHardware перед запуском сетевого адаптера.
Чтобы настроить возможности RSC, драйвер клиента:
Выделяет структуру NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES .
Вызывает NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT для инициализации структуры.
Вызывает NetAdapterOffloadSetRscCapabilities для регистрации структуры в NetAdapterCx.
Во время вызова NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT драйвер клиента предоставляет указатель на обратный вызов EVT_NET_ADAPTER_OFFLOAD_SET_RSC. Система вызывает этот обратный вызов позже, если активные возможности разгрузки изменяются.
Правила для указания возможностей RSC оборудования
- Клиентские драйверы не должны выполнять программное обеспечение RSC для любого типа трафика, который не поддерживает оборудование в сетевом адаптере.
Следующие правила применяются к структуре NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES:
NetAdapterOffloadLayer3FlagIPv4NoOptions
иNetAdapterOffloadLayer3FlagIPv6NoExtensions
являются единственными допустимыми значениями поля Layer3Flags . Эти флаги указывают на поддержку IPv4 и IPv6 соответственно.NetAdapterOffloadLayer4FlagTcpNoOptions
иNetAdapterOffloadLayer4FlagUdp
являются единственными допустимыми значениями поля Layer4Flags . Эти флаги указывают на поддержку TCP и UDP соответственно.Флаги уровня 3 должны быть заданы, если
NetAdapterOffloadLayer4FlagTcpNoOptions
флаг задан.Поле TcpTimestampOption является необязательным. Клиентские драйверы задают это поле после вызова NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT и перед вызовом NetAdapterOffloadSetRscCapabilities , чтобы указать, поддерживает ли сетевой адаптер параметр метки времени 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 или драйвер протокола чрезмерного использования запрашивает изменение активных возможностей RSC сетевого адаптера, NetAdapterCx вызывает EVT_NET_ADAPTER_OFFLOAD_SET_RSC обратного вызова драйвера клиента, зарегистрированного в NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES. В этом обратном вызове система предоставляет обновленные возможности в объекте NETOFFLOAD, который драйвер клиента может запрашивать для обновления своих возможностей разгрузки.
Клиентские драйверы могут вызывать следующие функции, чтобы определить, какие разгрузки RSC включены:
- NetOffloadIsTcpRscIPv4Enabled
- NetOffloadIsTcpRscIPv6Enabled
- NetOffloadIsRscTcpTimestampOptionEnabled
В следующем примере показано, как драйвер клиента может обновить свои возможности разгрузки 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 Offload (URO)
URI обеспечивает объединение полученных сегментов UDP. Сетевые адаптеры могут объединять диаграммы данных UDP из одного потока, который соответствует набору правил в логически смежный буфер. Затем эти объединенные диаграммы данных указываются в сетевом стеке Windows в виде одного большого пакета. Сведения о правилах URI см. в разделе "Правила объединения пакетов UDP".
URO ключевое слово, указанный в INF ключевое слово для управления URI, можно использовать для включения и отключения URI с параметром раздела реестра.
Клиентские драйверы NetAdapterCx могут использовать существующие структуры RSC и API RSC для URI. Чтобы настроить URI, клиентские драйверы должны задать для поля Layer4Flags в структуре NetAdapterOffloadLayer4FlagUdp
NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES значение.
Поведение URI зеркало RSC с одним исключением. Когда обратный вызов EVT_NET_ADAPTER_OFFLOAD_SET_RSC отключает URI, драйвер должен указать существующие объединенные сегменты и дождаться завершения всех невыполненных признаков URI. Этот подход гарантирует, что после возврата обратного вызова нет признаков URI.