指示合并段
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结构中设置 TcpChecksumValueInvalid 和 IpChecksumValueInvalid 标志。 此外,在这种情况下,NIC 或微型端口驱动程序可以选择将段中的 TCP 和 IPv4 标头校验和值归零。
在指示合并段之前,NIC 和微型端口驱动程序必须始终在NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO结构中设置 IpChecksumSucceededed 和 TcpChecksumSucceeded 标志。
有关合并规则的详细信息,请参阅 合并 TCP/IP 段的规则。
有关异常的详细信息,请参阅 终止合并的异常条件。
合并应尽最大努力执行。 在某些情况下,硬件可能无法合并,例如,由于缺少资源。 此处所述的要求主要是指定何时不合并以及如何合并。
在高级别,NIC 和微型端口驱动程序必须处理通过网络接收 TCP 段,如下所示:
检查传入段是否存在异常,如下所示:
如果没有遇到异常,检查段是否可以与根据规则为同一 TCP 连接接收的最后一个段合并。
如果段触发了异常,或者无法将其与以前收到的段合并,则单独指示该段。
在协议驱动程序启用 RSC 之前,NIC 和微型端口驱动程序不得指示合并段,如 查询和更改 RSC 状态中所述。
对于给定的 TCP 连接,从微型端口适配器到主机 TCP/IP 堆栈的数据指示可能包含一个或多个合并段,由一个或多个无法合并的单个段分隔。
无论是否合并,NIC 和微型端口驱动程序都不得延迟 TCP 段的指示。 具体而言,NIC 和微型端口驱动程序不得延迟一个延迟过程调用 (DPC) 的段指示,以便尝试合并段。
NIC 和微型端口驱动程序可以使用计时器来确定合并的结束时间。 但是,延迟敏感型工作负载的处理必须与 DPC 边界要求一样有效。