接收段合并的示例
本部分使用按顺序接收并在单个延迟过程调用 (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,如以下流程图所示。
第 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。