次の方法で共有


セッション プロトコルの使用

Windows ソケット スイッチは、セッション プロトコルを使用して SAN 接続経由でデータを転送します。 スイッチは、少量のデータを転送する場合、制御メッセージ内でそのデータを転送します。 各制御メッセージは、ヘッダーとアプリケーション データのオプションのペイロードで構成されます。 スイッチが大量のデータを転送する場合は、RDMA 操作を使用してそのデータを転送します。

このセクションでは、データ転送を設定して実行する方法について説明します。

スイッチを読み込むアプリケーションの動作に応じて、スイッチはセッション プロトコルを最適化して、アプリケーション データの転送に伴うオーバーヘッドを軽減します。

このセクションでは、スイッチのセッション プロトコルがデータ転送を実行する方法の例も示します。 しかし、これらの例には、この操作の明確な説明は含まれていません。

データ転送の設定

スイッチは、接続されたソケットごとに制御メッセージ バッファーのプールを割り当てます。 その後、スイッチは SAN サービス プロバイダーの WSPRegisterMemory 関数を呼び出して、それらのメッセージ バッファーを物理メモリの領域に登録します。 スイッチは、SAN サービス プロバイダーの WSPSend 関数を呼び出すときに、バッファー プールの一部を使用してフロー制御情報をリモート ピアに送信します。 スイッチは、SAN サービス プロバイダーのWSPRecv関数を呼び出す際に、プールの残りの部分を使用してメッセージ バッファを送信し、リモート ピアからのフロー制御情報を受信します。 スイッチは制御メッセージを受信すると、直ちにそれらを処理します。 制御メッセージを処理した後、スイッチは SAN サービス プロバイダーの WSPRecv 関数を呼び出し、受信バッファーを渡して再び送信し、リモート ピアから追加の制御メッセージを受信できるようにします。

アプリケーションデータの転送

データ転送のサイズは、スイッチによるデータ転送操作の処理方法に影響します。

アプリケーションが少量のデータの送信を要求した場合、スイッチは SAN 上での緊急データの送信で説明されているようにそのデータを転送します。

アプリケーションが大量のデータの送信を要求した場合、スイッチはデータの最初の部分を、送信に使用される制御メッセージ バッファーにコピーします。 この制御メッセージのヘッダーには、アプリケーション データの量を指定する情報が含まれています。 その後、スイッチは SAN サービス プロバイダーの WSPSend 関数を呼び出して、この制御メッセージを SAN ソケットのリモート ピアに送信します。

スイッチがアプリケーション データの転送を完了する方法は、サービス プロバイダーが WSPRdmaRead 関数をサポートしているかどうかによって異なります。

WSPRdmaRead 関数をサポートするプロバイダーへのデータ転送

次の図は、リモート ピアの SAN サービス プロバイダーが WSPRdmaRead 関数をサポートしている場合に、スイッチがアプリケーション データの転送を完了する方法の概要を示しています。 次のシーケンスでは、アプリケーション データの転送について詳しく説明します。

remote peer supports wsprdmaread.

リモート ピアが WSPRdmaRead をサポートしている場合にデータを転送するには

  • ローカル スイッチは、SAN サービス プロバイダーの WSPRegisterRdmaMemory 関数を呼び出し、読み取りアクセス用に RDMA メモリを登録する必要があります。 この場合、メッセージ バッファの制御ヘッダーは、アプリケーションの残りのデータを保持する RDMA メモリの記述子も識別します。
  • 次に、リモート ピアのスイッチは WSPRdmaRead を呼び出して、アプリケーション データを RDMA メモリから、リモート ピアのスイッチが以前に WSPRegisterMemory 呼び出しで登録した受信バッファーに転送します。 SAN サービス プロバイダーは、バックグラウンドでバッファーされたデータを送信します。 これにより、一度に複数の送信を行わないアプリケーションでも、SAN サービス プロバイダーがバッファーされたデータを送信している間に、別の送信要求を行うことができます。
  • その後、リモート ピアのスイッチが WSPSend を呼び出して、転送が完了したことを示す制御メッセージをローカル スイッチに送信します。
  • ローカル スイッチは、WSPDeregisterRdmaMemory 関数を呼び出して RDMA メモリを解放します。
  • ローカル スイッチは、アプリケーションの送信要求を完了します。 アプリケーションのデータ バッファーのメモリを登録できない場合、または一時メモリを完全に割り当てることができない場合、スイッチは WSAENOBUFS エラー コードを使用してアプリケーションの送信要求を完了します。

WSPRdmaRead 関数をサポートしていないプロバイダーへのデータ転送

次の図は、リモート ピアの SAN サービス プロバイダーが WSPRdmaRead 関数をサポートしていない場合に、スイッチがアプリケーション データの転送を完了する方法の概要を示しています。 次のシーケンスでは、アプリケーション データの転送について詳しく説明します。

remote peer does not support wsprdmaread.

リモート ピアが WSPRdmaRead をサポートしていない場合にデータを転送するには

  • リモート ピアのスイッチは、WSPRegisterRdmaMemory を呼び出して、書き込みアクセス用に RDMA メモリを登録します。
  • その後、リモート ピアのスイッチが WSPSend を呼び出して、ローカル スイッチが書き込み可能な RDMA メモリの場所を示す制御メッセージをローカル スイッチに送信します。
  • ローカル スイッチは WSPRdmaWrite 関数を呼び出して、アプリケーション データを RDMA メモリに転送します。 SAN サービス プロバイダーは、バックグラウンドでバッファーされたデータを送信します。 これにより、一度に複数の送信を行わないアプリケーションでも、SAN サービス プロバイダーがバッファーされたデータを送信している間に、別の送信要求を行うことができます。
  • ローカル スイッチは、WSPGetOverlappedResult 関数を呼び出して転送の結果を取得します。 詳細については、データ転送要求の完了をご覧ください。
  • ローカル スイッチは WSPSend を呼び出してリモート ピアに制御メッセージを送信し、転送が完了したことを示します。
  • リモート ピアのスイッチは、WSPDeregisterRdmaMemory を呼び出して RDMA メモリを解放します。
  • ローカル スイッチは、アプリケーションの送信要求を完了します。 アプリケーションのデータ バッファーのメモリを登録できない場合、または一時メモリを割り当てることができない場合、スイッチは WSAENOBUFS エラー コードでアプリケーションの送信要求を完了します。

SAN でのデータの転送