Compartilhar via


Usando o Protocolo de Sessão

A opção Windows Sockets usa seu protocolo de sessão para transferir dados por uma conexão SAN. Se a opção transferir uma pequena quantidade de dados, ela transferirá esses dados dentro de uma mensagem de controle. Cada mensagem de controle consiste em um cabeçalho e uma carga opcional de dados do aplicativo. Se o comutador transferir uma grande quantidade de dados, ele transferirá esses dados usando operações RDMA.

Esta seção descreve como configurar e executar uma transferência de dados.

Nota Dependendo do comportamento dos aplicativos que carregam a opção, a opção otimiza seu protocolo de sessão para reduzir a sobrecarga envolvida na transferência de dados do aplicativo.

Esta seção também fornece exemplos de como o protocolo de sessão do comutador executa transferências de dados. No entanto, esses exemplos não incluem descrições definitivas dessas operações.

Configurando uma transferência de dados

A opção aloca um pool de buffers de mensagens de controle para cada soquete conectado. Em seguida, a opção faz chamadas para a função WSPRegisterMemory do provedor de serviços SAN para registrar esses buffers de mensagens em regiões de memória física. A opção usa parte do pool de buffers para enviar informações de controle de fluxo para um par remoto ao chamar a função WSPSend de um provedor de serviços SAN. A opção usa a outra parte do pool para postar buffers de mensagens para receber informações de controle de fluxo de um par remoto ao chamar a função WSPRecv de um provedor de serviços SAN. Depois que a opção recebe mensagens de controle, elas são consumidas imediatamente. Depois de consumir mensagens de controle, a opção chama a função WSPRecv do provedor de serviços SAN e passa buffers de recebimento para postá-las novamente para que possam receber mensagens de controle adicionais de um par remoto.

Transferindo dados do aplicativo

O tamanho da transferência de dados afeta como a opção manipulará a operação de transferência de dados.

Se um aplicativo solicitar o envio de uma pequena quantidade de dados, a opção transferirá esses dados conforme descrito em Enviar dados urgentes em uma SAN.

Se um aplicativo solicitar o envio de uma grande quantidade de dados, a opção copiará a parte inicial dos dados para um buffer de mensagem de controle usado para envio. O cabeçalho dessa mensagem de controle contém informações que especificam a quantidade de dados do aplicativo. Em seguida, a opção chama a função WSPSend do provedor de serviços SAN para enviar essa mensagem de controle para o par remoto do soquete SAN.

A forma como a opção conclui a transferência de dados do aplicativo depende se o provedor de serviços dá suporte à função WSPRdmaRead .

Transferência de dados para um provedor que dá suporte à função WSPRdmaRead

A figura a seguir mostra uma visão geral de como a opção conclui a transferência de dados do aplicativo se o provedor de serviços SAN no par remoto dá suporte a uma função WSPRdmaRead. A sequência a seguir descreve a transferência de dados do aplicativo com mais detalhes.

o par remoto dá suporte a wsprdmaread.

Para transferir dados quando o par remoto dá suporte a WSPRdmaRead

  • A opção local deve chamar a função WSPRegisterRdmaMemory do provedor de serviços SAN para registrar memória RDMA para acesso de leitura. Nesse caso, o cabeçalho de controle do buffer de mensagens também identifica o descritor para a memória RDMA que contém os dados restantes do aplicativo.
  • A opção no par remoto chama WSPRdmaRead para transferir dados do aplicativo da memória RDMA para os buffers de recebimento que a opção no par remoto registrou anteriormente com chamadas WSPRegisterMemory . O provedor de serviços SAN transmite os dados armazenados em buffer em segundo plano. Isso permite que aplicativos que não postam mais de um envio por vez postem outra solicitação de envio enquanto o provedor de serviços SAN envia dados armazenados em buffer.
  • A opção no par remoto chama WSPSend para enviar uma mensagem de controle para a opção local para indicar que a transferência foi concluída.
  • A opção local chama a função WSPDeregisterRdmaMemory para liberar memória RDMA.
  • A opção local conclui a solicitação de envio do aplicativo. Se a opção não puder registrar memória para os buffers de dados do aplicativo ou se a memória temporária não puder ser totalmente alocada, ela concluirá a solicitação de envio de um aplicativo com o código de erro WSAENOBUFS .

Transferência de dados para um provedor que não dá suporte à função WSPRdmaRead

A figura a seguir mostra uma visão geral de como a opção conclui a transferência de dados do aplicativo se o provedor de serviços SAN no par remoto não dá suporte a uma função WSPRdmaRead . A sequência a seguir descreve a transferência de dados do aplicativo com mais detalhes.

O par remoto não dá suporte a wsprdmaread.

Para transferir dados quando o par remoto não dá suporte a WSPRdmaRead

  • A opção no par remoto chama WSPRegisterRdmaMemory para registrar memória RDMA para acesso de gravação.
  • A opção no par remoto chama WSPSend para enviar uma mensagem de controle para o comutador local que indica o local da memória RDMA para a qual o comutador local pode gravar.
  • A opção local chama a função WSPRdmaWrite para transferir dados do aplicativo para a memória RDMA. O provedor de serviços SAN transmite os dados armazenados em buffer em segundo plano. Isso permite que aplicativos que não postam mais de um envio por vez postem outra solicitação de envio enquanto o provedor de serviços SAN envia dados armazenados em buffer.
  • A opção local chama a função WSPGetOverlappedResult para obter os resultados da transferência. Para obter mais informações, consulte Concluindo solicitações de transferência de dados.
  • A opção local chama WSPSend para enviar uma mensagem de controle para o par remoto para indicar que a transferência foi concluída.
  • A opção no par remoto chama WSPDeregisterRdmaMemory para liberar memória RDMA.
  • A opção local conclui a solicitação de envio do aplicativo. Se a opção não puder registrar memória para os buffers de dados do aplicativo ou se a memória temporária não puder ser alocada, ela concluirá a solicitação de envio de um aplicativo com o código de erro WSAENOBUFS .

Transferindo dados em uma SAN