通过可扩展交换机数据路径传输的数据包流
本主题介绍数据包如何通过 Hyper-V 可扩展交换机数据路径传入或移出可扩展交换机端口。
注意 在可扩展交换机接口中,NDIS 筛选器驱动程序称为 可扩展交换机扩展 ,驱动程序堆栈称为 可扩展交换机驱动程序堆栈。 有关扩展的详细信息,请参阅 Hyper-V 可扩展交换机扩展。
注意 本页假定你熟悉 Hyper-V 可扩展交换机 和 混合转发概述中的信息。
从其端口到达可扩展交换机的所有数据包流量都遵循通过可扩展交换机驱动程序堆栈的相同路径。 例如,从外部网络适配器连接接收或从虚拟机 (VM 发送的数据包流量) 网络适配器连接通过同一数据路径移动。
下图显示了 NDIS 6.40 (Windows Server 2012 R2) 及更高版本的可扩展交换机数据路径。
下图显示了 NDIS 6.30 (Windows Server 2012) 的可扩展交换机数据路径。
有关可扩展交换机接口的组件的详细信息,请参阅 Hyper-V 可扩展交换机体系结构。
可扩展交换机数据路径包含以下部分,按数据包流经它们的顺序列出:
过度覆盖协议边缘
数据包从连接到交换机端口的网络适配器到达可扩展交换机。 这些数据包首先作为发送请求从可扩展交换机的协议边缘沿可扩展交换机入口数据路径发出。
可扩展交换机的协议边缘为入口数据路径准备数据包。 协议边缘为这些数据包分配一个上下文区域,其中包含带外 (OOB) 可扩展的交换机转发上下文。 它使用有关源端口和网络适配器连接的信息填充 OOB 数据,从中将数据包传送到可扩展交换机。
有关转发上下文的详细信息,请参阅 Hyper-V 可扩展交换机转发上下文。
在 NDIS 6.40 (Windows Server 2012 R2) 及更高版本中,如果数据包是来自外部网络适配器的 NVGRE 数据包,则可扩展交换机在数据包的带外 (OOB) 信息中设置 NativeForwardingRequired 标志。 有关详细信息,请参阅 混合转发。
如果数据包到达流量具有虚拟子网的端口,则可扩展交换机将设置数据包NDIS_NET_BUFFER_LIST_VIRTUAL_SUBNET_INFO结构的 VirtualSubnetId 成员。
注意 虚拟子网可以是 HNV 子网或第三方虚拟子网。
入口数据路径
扩展在调用其 FilterSendNetBufferLists 函数时从入口数据路径获取数据包。 该扩展通过调用 NdisFSendNetBufferLists 将数据包转发到入口数据路径上的基础扩展。 筛选和转发扩展还可以通过调用 NdisFSendNetBufferListsComplete 从入口数据路径中删除数据包。
捕获扩展获取入口数据路径上的数据包时,可以检查数据包数据。 但是,捕获扩展不能完成对入口数据路径上的数据包的发送请求。 这些扩展必须始终将数据包转发到可扩展交换机驱动程序堆栈中的基础扩展。
捕获扩展还可以在入口数据路径上生成数据包。 例如,扩展可能源自数据包,以便向远程监视应用程序报告流量状况。
有关通过扩展发起数据包的详细信息,请参阅 发起数据包流量。
筛选扩展在入口数据路径上获取数据包时,可以执行以下操作:
根据自定义可扩展交换机或端口策略删除数据包。
有关这些策略的详细信息,请参阅 Hyper-V 可扩展交换机策略。
注意 在入口数据路径上获取的数据包未在数据包的 OOB 数据中定义目标端口。 因此,筛选扩展必须仅基于数据包数据或数据包的源端口或网络适配器连接强制实施自定义策略。
克隆或修改从入口数据路径获取的数据包。
将新数据包注入入口数据路径。
在 NDIS 6.40 及更高版本中,在捕获和筛选扩展之后,但在入口数据路径上的转发扩展之前,可扩展交换机执行以下操作:
如果数据包是来自外部网络适配器的 NVGRE 数据包,则数据包标头中的地址是提供程序地址 (PA) 空间地址。 可扩展交换机通过在数据包的带外设置 NativeForwardingRequired 标志来指示这一点, (OOB) 信息。 有关详细信息,请参阅 混合转发。
可扩展交换机将内置入口策略应用于数据包。 这些策略可能包括入口访问控制列表 (ACL) 、DHCP 防护和路由器防护。
如果未在可扩展交换机驱动程序堆栈中启用转发扩展,则数据包的目标端口数组由可扩展交换机确定。
如果启用了转发扩展,则当它获取入口数据路径上的数据包时,它必须执行以下操作:
在 NDIS 6.40 及更高版本中,如果数据包是 NVGRE 数据包 (请参阅 混合转发) ,则转发扩展无法修改入口数据路径中数据包的 OOB 数据中的目标端口数组。 但是,它可以删除数据包。
如果数据包不是 NVGRE 数据包,则转发扩展必须将目标端口添加到数据包的 OOB 数据中的目标端口数组。
转发扩展必须基于标准或自定义可扩展交换机或端口策略删除数据包。 标准交换机或端口策略包括安全和虚拟 LAN (VLAN) 属性。 如果未在可扩展交换机驱动程序堆栈中启用转发扩展,则可扩展交换机将强制实施这些策略。
注意 当转发扩展筛选入口数据路径中的数据包时,它会根据源端口以及扩展分配给数据包的目标端口应用筛选规则。
此外,转发扩展可以执行以下操作:
克隆或修改从入口数据路径获取的数据包。
将新数据包注入入口数据路径。
基础微型端口边缘
当数据包到达可扩展交换机的基础微型端口边缘时,可扩展交换机会将其内置策略应用于数据包。 这些策略包括访问控制列表 (ACL) 和服务质量 (QoS) 属性。 如果由于这些策略而未丢弃数据包,则可扩展交换机会发出数据包的接收指示,并将数据包转发到出口数据路径。
注意如果在数据包要传递到的端口上启用了端口镜像,微型端口边缘会将目标端口添加到数据包的 OOB 数据中,以便镜像端口。 无论是否在可扩展交换机驱动程序堆栈中安装并启用转发扩展,微型端口边缘都会执行此操作。 微型端口边缘仅添加镜像端口(如果尚未在数据包的目标端口数组中指定)。
如果未启用转发扩展,可扩展交换机将确定数据包的目标端口,并将这些目标端口添加到数据包的 OOB 数据中,然后再将数据包转发到出口数据路径。
在 NDIS 6.40 及更高版本中,HNV 组件在入口后和出口之前执行任何所需的 NVGRE 封装或解封,以便转发扩展可以看到封装和解包形式的数据包。 例如,如果数据包从外部网络适配器到达,并且发往内部 VM,则转发扩展在入口中获取封装的数据包,并在出口时获取去封装的数据包。
注意 在封装的数据包中,数据包标头中的地址是 PA) 空间地址 (提供程序地址。 在解封数据包中,它是客户地址 (CA) 空间地址。
如果数据包是从外部网络适配器到达的 NVGRE 数据包,则可扩展交换机的 Hyper-V 网络虚拟化 (HNV) 组件对数据包执行 NVGRE 解封。 HNV 组件根据 HNV 策略确定数据包的目标,然后可扩展交换机将数据包转发到出口数据路径。
如果数据包从内部 VM 到达,则如果为数据包设置了 HNV 策略,则 HNV 组件将对数据包执行 NVGRE 封装。 HNV 组件根据 HNV 策略确定数据包的目标,然后可扩展交换机将数据包转发到出口数据路径。
否则,转发扩展会将数据包转发到出口数据路径。
在 NDIS 6.30 中,如果启用了转发扩展,则必须将数据包转发到出口数据路径。
出口数据路径
当调用其 FilterReceiveNetBufferLists 函数时,扩展将从出口数据路径获取数据包。 该扩展通过调用 NdisFIndicateReceiveNetBufferLists 将数据包转发到出口数据路径上的过度扩展。 筛选和转发扩展还可以通过调用 NdisFReturnNetBufferLists 从出口数据路径中删除数据包。
当转发扩展在出口数据路径上获取数据包时,它可以检查 OOB 数据中数据包的目标端口信息。
注意 该扩展通过调用 GetNetBufferListDestinations 从 OOB 数据获取此信息。
根据标准或自定义交换机或端口策略,扩展可以排除数据包传递到 OOB 数据中包含的一个或多个目标端口。
在 NDIS 6.40 (Windows Server 2012 R2) 及更高版本中,在转发扩展之后,但在出口数据路径上的筛选和捕获扩展之前,可扩展交换机会将内置出口策略应用于数据包。 这些策略可能包括中继模式、监视模式、出口 ACL 和服务质量 (QoS) 属性。
筛选扩展在出口数据路径上获取数据包时,可以在 OOB 数据中检查数据包的目标端口信息。 根据自定义交换机或端口策略,扩展可以排除数据包传递到 OOB 数据中包含的一个或多个目标端口。
如果筛选扩展需要修改数据包中的数据,则必须先克隆数据包,而不保留端口目标。 然后,扩展必须将修改后的数据包注入入口数据路径。 这允许基础扩展对修改后的数据包强制实施策略,转发扩展可以添加端口目标。
有关详细信息,请参阅 克隆或数据包流量。
捕获扩展获取出口数据路径上的数据包时,可以检查数据包数据。 但是,如果捕获扩展需要源自数据包以便向远程监视应用程序报告流量状况,则必须通过调用 NdisFSendNetBufferLists 来引发此数据包流量,以在入口数据路径上启动发送操作。
当数据包到达可扩展交换机的覆盖协议边缘时,可扩展交换机接口会将数据包转发到所有指定的目标端口。
转发数据包后,接口将反向通过同一路径完成数据包。 首先,接口调用扩展的 FilterReturnNetBufferLists 函数,以完成在出口数据路径上转发的数据包。 然后,接口调用扩展的 FilterSendNetBufferListsComplete 函数,以完成在入口数据路径上转发的数据包。
当在出口和入口数据路径上完成数据包时,扩展将执行可能需要的任何必要的数据包清理和后处理。