接收段合并的示例

本部分使用按顺序接收并在单个延迟过程调用 (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 连接的 2 个连续段。 以下所有条件均适用于每个条件:

  • X'.SEQ == X.NXT

  • X'SEQ > X.SEQ

  • X'.ACK == X.ACK

这些段都不会生成异常。

结果

前 5 个段形成单个 SCU。 第 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 段是一个纯 ACK,它是使用 SEG 进行窗口更新。WND = 65535,如以下流程图所示。

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

第 7 段是纯 ACK,它是使用 SEG 进行窗口更新。WND = 131070,如同一流程图所示。

结果

单个 SCU 由 7 个段组成。 这表示为单个 NET_BUFFER_LIST 中的单个 NET_BUFFER

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

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

段说明

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

  • X'.SEQ == X.NXT

  • X'SEQ > X.SEQ

  • X'.ACK == X.ACK

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

  • X'.SEQ == X.NXT

  • X'SEQ > X.SEQ

  • X'.ACK == X.ACK

这些段都不会生成异常。

结果

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