接收區段聯合 (RSC) 卸除
接收數據時,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 功能的規則
- 用戶端驅動程式不得在 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 會叫用用戶端驅動程式的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 卸除 (URO)
URO 可聯合接收的UDP區段。 NIC 可以從符合一組規則的相同流程,將 UDP 數據報合併成邏輯連續緩衝區。 然後,這些合併的數據報會以單一大型封包的形式向 Windows 網路堆疊表示。 如需 URO 規則的詳細資訊,請參閱 聯合 UDP 封包 的規則。
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 指示作用中。