指示合并段

SCU) (单个合并单元是一系列 TCP 段,这些段根据合并 TCP/IP 段规则中定义的规则合并为单个 TCP 段。 本部分介绍如何指示生成的合并段。

SCU 必须:

  • 通过调用 NdisMIndicateReceiveNetBufferLists 进行指示。

  • 看起来像通过线路接收的正常 TCP 段。

  • 不超过 RFC 791 第 3.1 节中定义的最大法定 IP 数据报长度。

    注意 由于无法合并具有 IPv6 扩展标头的段 (请参阅 终止合并) 的异常条件 ,因此 IPv6 数据报的 SCU 大小也受最大法定数据报长度的限制。

在指示合并段之前,NIC 或微型端口驱动程序应重新计算 TCP 和 IPv4 校验和(如果适用)。 如果 NIC 或微型端口驱动程序验证 TCP 和 IPv4 校验和,但没有重新计算合并段的校验和,则必须在NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO结构中设置 TcpChecksumValueInvalidIpChecksumValueInvalid 标志。 此外,在这种情况下,NIC 或微型端口驱动程序可以选择将段中的 TCP 和 IPv4 标头校验和值归零。

在指示合并段之前,NIC 和微型端口驱动程序必须始终在NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO结构中设置 IpChecksumSucceedededTcpChecksumSucceeded 标志。

有关合并规则的详细信息,请参阅 合并 TCP/IP 段的规则

有关异常的详细信息,请参阅 终止合并的异常条件

合并应尽最大努力执行。 在某些情况下,硬件可能无法合并,例如,由于缺少资源。 此处所述的要求主要是指定何时不合并以及如何合并。

在高级别,NIC 和微型端口驱动程序必须处理通过网络接收 TCP 段,如下所示:

  • 检查传入段是否存在异常,如下所示:

    1. 如果没有遇到异常,检查段是否可以与根据规则为同一 TCP 连接接收的最后一个段合并。

    2. 如果段触发了异常,或者无法将其与以前收到的段合并,则单独指示该段。

  • 在协议驱动程序启用 RSC 之前,NIC 和微型端口驱动程序不得指示合并段,如 查询和更改 RSC 状态中所述。

  • 对于给定的 TCP 连接,从微型端口适配器到主机 TCP/IP 堆栈的数据指示可能包含一个或多个合并段,由一个或多个无法合并的单个段分隔。

  • 无论是否合并,NIC 和微型端口驱动程序都不得延迟 TCP 段的指示。 具体而言,NIC 和微型端口驱动程序不得延迟一个延迟过程调用 (DPC) 的段指示,以便尝试合并段。

  • NIC 和微型端口驱动程序可以使用计时器来确定合并的结束时间。 但是,延迟敏感型工作负载的处理必须与 DPC 边界要求一样有效。