使用会话协议

Windows 套接字交换机使用其会话协议通过 SAN 连接传输数据。 如果开关传输少量数据,则会在控制消息中传输该数据。 每个控制消息都由标头和应用程序数据的可选有效负载组成。 如果交换机传输大量数据,它将使用 RDMA 操作传输该数据。

本部分介绍如何设置和执行数据传输。

注意 根据加载交换机的应用程序的行为,交换机会优化其会话协议,以减少传输应用程序数据所涉及的开销。

本部分还提供交换机的会话协议如何执行数据传输的示例。 但是,这些示例不包括这些操作的明确说明。

设置数据传输

交换机为每个连接的套接字分配一个控制消息缓冲区池。 然后,该交换机调用 SAN 服务提供程序的 WSPRegisterMemory 函数,以将这些消息缓冲区注册到物理内存区域。 调用 SAN 服务提供商的 WSPSend 函数时,交换机使用缓冲池的一部分将流控制信息发送到远程对等方。 在调用 SAN 服务提供商的 WSPRecv 函数时,该交换机使用池的另一部分来发布消息缓冲区,以便从远程对等方接收流控制信息。 开关收到控制消息后,会立即使用这些消息。 使用控制消息后,交换机调用 SAN 服务提供程序的 WSPRecv 函数,并传递接收缓冲区以再次发布它们,以便它们可以从远程对等方接收其他控制消息。

传输应用程序数据

数据传输的大小会影响交换机处理数据传输操作的方式。

如果应用程序请求发送少量数据,交换机将传输该数据,如 在 SAN 上发送紧急数据中所述。

如果应用程序请求发送大量数据,开关会将数据的初始部分复制到用于发送的控制消息缓冲区。 此控件消息的标头包含指定应用程序数据量的信息。 然后,该交换机调用 SAN 服务提供程序的 WSPSend 函数,将此控制消息发送到 SAN 套接字的远程对等方。

交换机如何完成应用程序数据传输取决于服务提供程序是否支持 WSPRdmaRead 函数。

将数据传输到支持 WSPRdmaRead 函数的提供程序

下图概述了如果远程对等方上的 SAN 服务提供程序支持 WSPRdmaRead 函数,交换机如何完成应用程序数据传输。 以下顺序更详细地介绍了如何传输应用程序数据。

远程对等方支持 wsprdmaread。

在远程对等方支持 WSPRdmaRead 时传输数据

  • 本地交换机必须调用 SAN 服务提供商的 WSPRegisterRdmaMemory 函数来注册 RDMA 内存以便进行读取访问。 在这种情况下,消息缓冲区的控件标头还会标识保存应用程序剩余数据的 RDMA 内存的描述符。
  • 然后,远程对等方上的交换机调用 WSPRdmaRead ,以将应用程序数据从 RDMA 内存传输到接收远程对等方上的交换机以前注册到 WSPRegisterMemory 调用的缓冲区。 SAN 服务提供程序在后台传输缓冲的数据。 这样做允许一次不发布多个发送的应用程序在 SAN 服务提供商发送缓冲数据时发布另一个发送请求。
  • 然后,远程对等方上的交换机调用 WSPSend 向本地交换机发送控制消息,以指示传输已完成。
  • 本地交换机调用 WSPDeregisterRdmaMemory 函数以释放 RDMA 内存。
  • 本地交换机完成应用程序的发送请求。 如果开关无法为应用程序的数据缓冲区注册内存,或者如果临时内存无法完全分配,则会使用 WSAENOBUFS 错误代码完成应用程序的发送请求。

将数据传输到不支持 WSPRdmaRead 函数的提供程序

下图概述了如果远程对等方的 SAN 服务提供程序不支持 WSPRdmaRead 函数,交换机如何完成应用程序数据传输。 以下顺序更详细地介绍了如何传输应用程序数据。

远程对等方不支持 wsprdmaread。

在远程对等方不支持 WSPRdmaRead 时传输数据

  • 远程对等方上的交换机调用 WSPRegisterRdmaMemory 来注册 RDMA 内存以便进行写入访问。
  • 然后,远程对等方上的交换机调用 WSPSend ,向本地交换机发送一条控制消息,指示本地交换机可以写入的 RDMA 内存的位置。
  • 本地交换机调用 WSPRdmaWrite 函数,将应用程序数据传输到 RDMA 内存。 SAN 服务提供程序在后台传输缓冲的数据。 这样做允许一次不发布多个发送的应用程序在 SAN 服务提供商发送缓冲数据时发布另一个发送请求。
  • 本地交换机调用 WSPGetOverlappedResult 函数以获取传输结果。 有关详细信息,请参阅 完成数据传输请求
  • 本地交换机调用 WSPSend 以向远程对等方发送控制消息,以指示传输已完成。
  • 远程对等节点的交换机调用 WSPDeregisterRdmaMemory 以释放 RDMA 内存。
  • 本地交换机完成应用程序的发送请求。 如果开关无法为应用程序的数据缓冲区注册内存,或者如果无法分配临时内存,则会使用 WSAENOBUFS 错误代码完成应用程序的发送请求。

在 SAN 上传输数据