多路复用 ID 管理

RDBSS 定义一个多路复用 ID (MID) (一个 16 位值),网络客户端 (微型重定向器) 和服务器都可以使用该 ID 来区分任何连接上的并发活动请求。 网络重定向程序可以将 MID 与其使用的任何任意上下文或内部数据结构相关联。 它完全由网络重定向或是否分配和使用 MID 的选项。

RDBSS 定义的 MID 是设计为满足多个条件的MID_ATLAS数据结构的一部分。 与MID_ATLAS数据结构关联的是一系列用于将 MID 映射到关联上下文的一个或多个MID_MAP数据结构。

MID_ATLAS数据结构、MID_MAP结构和 MID 应很好地缩放,以处理各种远程服务器的不同功能。 例如,Windows 上的典型 LAN 管理器服务器允许在任何连接上发出 50 个未完成的请求。 某些类型的服务器可能只支持一个未完成的请求,而网关服务器可能希望此数目非常高, () 数千个未完成连接。

需要妥善处理的两个主要操作是:

  • 将 MID 映射到与其关联的上下文。 将调用此例程来处理通过客户端和服务器的任何连接接收的每个数据包, (假设服务器使用 MID) 。

  • 生成用于将请求发送到服务器的新 MID。 此例程将在客户端上用于强制实施最大连接限制,以及使用唯一 ID 标记每个并发请求。

MID 必须能够有效地管理多个 MID 的唯一标记和标识, (通常从 65,536 个值的组合) 50 个。 在某些情况下,可能需要创建一个小型MID_ATLAS结构来保存MID_MAP结构使用的内核内存,并根据需要扩展MID_ATLAS结构的大小,以便有效地处理更大的使用情况。 为了确保适当的时空权衡,查找被组织为三级层次结构。 用于表示 MID 的 16 位拆分为三位字段。 最右侧字段 (最小有效) 的长度取决于初始图集中允许的最大 MID 数。 此最大值是首次创建MID_ATLAS数据结构时传递给 RxCreateMidAtlas 例程的参数。 此最大值确定创建的MID_ATLAS数据结构的初始大小,以及可以容纳多少个MID_MAP数据结构。 剩余长度在接下来的两个字段之间平均拆分,这些字段确定可能从属MID_ATLAS结构的最大大小,可以定义这些结构以扩展现有MID_ATLAS并将其扩展到MID_MAP数据结构的三级层次结构。 因此,每个MID_ATLAS数据结构可以包含最大数量的MID_MAP结构或指向一个从属MID_ATLAS和MID_MAP结构的指针。

例如,如果在创建时最多分配 50 个 MID,则第一个字段的长度为 6 (64 ( 2 ** 6 ) 大于 50 ) 。 剩余长度拆分为两个字段,每个字段 5 位,分别用于第二和第三个分层级别,以便可以扩展现有的MID_ATLAS数据结构,以适应更多MID_MAP条目。

RDBSS 提供以下例程,用于创建和操作MID_ATLAS数据结构、关联的MID_MAP数据结构和多路复用 ID。

例程所返回的值 说明

RxAssociateContextWithMid

此例程将提供的不透明上下文与MID_ATLAS结构的可用 MID 相关联。

RxCreateMidAtlas

此例程分配MID_ATLAS数据结构的新实例并对其进行初始化。

RxDestroyMidAtlas

此例程会销毁MID_ATLAS数据结构的现有实例,并释放分配给它的内存。 作为一个副作用,它会在MID_ATLAS结构中的每个有效上下文上调用在上下文析构函数中传递的 。

RxMapMidToContext

此例程将 MID 映射到MID_ATLAS结构中的关联上下文。

RxMapAndDissociateMidFromContext

此例程将 MID 映射到MID_ATLAS结构中的关联上下文,然后将 MID 与上下文取消关联。

RxReassociateMid

此例程将 MID 与备用上下文重新关联。