接收數據時,TCP/IP 堆疊中的大部分層都必須分別查看每個區段的標頭資訊。 當收到大量數據時,這會建立大量的額外負荷。
接收區段聯合處理(RSC) 通過將一系列接收的區段合併為一個單一的聯合區段,並通過 TCP/IP 堆疊進行傳送,以減少此額外負荷。 TCP/IP 堆疊中的上層只需要查看整個序列的一個標頭。
支援硬體中 RSC 的網路適配器 (NIC) 可大幅改善接收路徑效能。 它還可以減少主機 CPU 的使用率,因為它使通訊協定層免於在軟體中執行 RSC。
如需了解有關接收段合併 (RSC) 的更多詳細資訊,請參閱概觀 。
NetAdapterCX 也支援從 2.5 版開始的 UDP RSC (URO)。 如需詳細資訊,請參閱 UDP RSC 卸載(URO)。
用於控制 RSC 卸除的 INF 關鍵詞
NetAdapterCx 會檢查登錄關鍵詞,並在啟用主動卸載功能時遵循它們。 驅動程式不需要採取任何進一步的動作。
RSC 標準化 INF 關鍵詞中指定的 RSC 關鍵詞 可透過登錄機碼設定來啟用/停用 RSC 加速功能。
關鍵字值的類型必須是 REG_SZ。
設定 RSC 卸載處理
用戶端驅動程式會在網路適配器初始化期間先公告其硬體的 RSC 功能。 這可能會發生在其 EvtDevicePrepareHardware 回呼中,再啟動網路適配器。
若要設定 RSC 功能,用戶端驅動程式:
呼叫 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 來初始化 結構。
呼叫 NetAdapterOffloadSetRscCapabilities 將結構註冊到 NetAdapterCx。
在呼叫 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 期間,客戶端驅動程式會提供一個指向 EVT_NET_ADAPTER_OFFLOAD_SET_RSC 回呼函數的指標。 當前的卸載能力變更時,系統稍後會叫用此回呼。
指出硬體 RSC 功能的規則
- 用戶端驅動程序必須 NOT 在 NIC 中沒有硬體支援的任何類型的流量上執行 軟體 RSC。
下列規則適用於 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 結構:
NetAdapterOffloadLayer3FlagIPv4NoOptions和NetAdapterOffloadLayer3FlagIPv6NoExtensions是唯一有效的 Layer3Flags 字段值。 這些旗標分別表示 IPv4 和 IPv6 支援。NetAdapterOffloadLayer4FlagTcpNoOptions和NetAdapterOffloadLayer4FlagUdp是唯一有效的 Layer4Flags 字段值。 這些旗標分別表示 TCP 和 UDP 支援。如果設定
NetAdapterOffloadLayer4FlagTcpNoOptions旗標,則必須設定第 3 層旗標。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 adapter 的活動 RSC 功能,NetAdapterCx 會叫用已在 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES中註冊的用戶端驅動程式 EVT_NET_ADAPTER_OFFLOAD_SET_RSC 回呼。 在此回呼中,系統會在 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 卸載(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 指示被激活。