接收段合并的示例

本部分通过使用在单个延迟过程调用(DPC)中按顺序接收和处理的段示例来说明合并算法。

此页面使用 X 和 X'标记连续段。 所有其他段和单个合并单元(SCU)字段均如 合并 TCP/IP 段规则中所述。

示例 1:数据段

段说明

处理属于同一 TCP 连接的 10 个连续段。 以下所有条件均适用于每个条件:

  • X’.SEQ == X.NXT

  • X’SEQ > X.SEQ

  • X’.ACK == X.ACK

没有一个段会产生异常。

结果

单个 SCU 由 10 个段组成。 这在单个NET_BUFFER_LIST中显示为单个NET_BUFFER

示例 2:数据段,紧接着异常,然后是数据段

段说明

处理属于同一 TCP 连接的 5 个连续段。 以下所有条件均适用于每个条件:

  • X’.SEQ == X.NXT

  • X’SEQ > X.SEQ

  • X’.ACK == X.ACK

这些代码段都不会引发异常。 第 6 段是具有 TCP SACK 选项的重复 ACK 段,并根据 合并 TCP/IP 段规则中的规则编号 3 生成异常。

注意 在这种情况下,用于处理 TCP 选项的异常规则优先,从而替代合并规则。

处理同一 TCP 连接的两个连续段。 以下所有条件均适用于每个条件:

  • X’.SEQ == X.NXT

  • X’SEQ > X.SEQ

  • X’.ACK == X.ACK

这些代码段都不会产生异常。

结果

单个 SCU 由前 5 个段组成。 第 6 段不构成 SCU。

第 7 段和第 8 段组成 SCU。

指示一个 NET_BUFFER_LIST 链,其中包含三个 NET_BUFFER_LIST 结构,每个结构都具有一个单独的 NET_BUFFER。 维护已接收段的排序。

示例 3:数据段,后跟多个窗口更新

分段描述

处理属于同一 TCP 连接的 5 个连续段。 以下所有条件均适用于每个条件:

  • X’.SEQ == X.NXT

  • X’SEQ > X.SEQ

  • X’.ACK == X.ACK

这些段都不会产生异常。 第 6 段是使用 SEG 进行窗口更新的纯 ACK。WND = 65535,如以程图所示。

显示使用 TCP 时间戳选项合并段的规则的流程图。

第 7 段是一个纯 ACK,其中窗更新为 SEG.WND = 131070,如同一流程图中所示。

结果

单个 SCU 由 7 个段组成。 这在单个NET_BUFFER_LIST中显示为单个NET_BUFFER

SCU。WND = 131070,并基于此值更新校验和。

示例 4:与数据段混合的 Piggybacked ACK

段说明

处理属于同一 TCP 连接的 3 个连续段。 以下所有条件均适用于每个条件:

  • X’.SEQ == X.NXT

  • X’SEQ > X.SEQ

  • X’.ACK == X.ACK

这些段都不会产生异常。 处理同一 TCP 连接的两个连续段。 以下所有条件均适用于每个条件:

  • X’.SEQ == X.NXT

  • X’SEQ > X.SEQ

  • X’.ACK > X.ACK

这些段都不会产生异常。

结果

单个 SCU 由 5 个段组成。 这在单个NET_BUFFER_LIST中显示为单个NET_BUFFER。 SCU.ACK 设置为最后一个 SEG.ACK。