(57)【特許請求の範囲】
【請求項１】
コンピューター実行可能命令を格納するコンピューター読み取り可能記憶媒体であって、プロセッサーによって前記命令を実行すると、リモート・ダイレクト・メモリー・アクセス（ＲＤＭＡ）によるデーター動作を使用してデーターを交換する方法を実行し、前記プロセッサーがクライアント内に設けられ、前記方法が、
前記クライアントに対しサーバーとの接続を作るステップと、
前記サーバーとの接続をネゴシエートするステップであって、前記ネゴシエートが、前記接続において前記サーバーが受信する最大バイト数を決める、ステップと、
前記サーバーへの接続に関連するデーターを送るパケット数を決定するステップと、
前記データーの断片化を使用するか否か判断するステップと、
前記データーの断片化を使用しないとき、第１プロトコル・パケットを前記データーと共に前記サーバーに送るステップと、
前記データーの断片化を使用するとき、
送信バッファーにおける最初のバイトを、前記第１プロトコル・パケットにおけるデーターとして送るように初期化するステップと、
前記第１プロトコル・パケットにおいてDataLengthフィールドおよびRemainingDataLengthフィールドを設定するステップであって、RemainingDataLengthフィールドは前記サーバーが未だ受信していない断片化メッセージのバイト数に等しい、ステップと、
前記第１プロトコル・パケットを前記サーバーに送るステップと、
少なくとも１つの第２プロトコル・パケットに対して、
前記送信バッファー内にあるバイトを、前記少なくとも１つの第２プロトコル・パケットにおいてデーターとして送るように初期化し、
前記少なくとも１つの第２プロトコル・パケットにおける前記RemainingDataLengthフィールドを設定し、
前記少なくとも１つの第２プロトコル・パケットを前記サーバーに送る、
ことを含む命令を繰り返すステップと、
を含む、コンピューター読み取り可能記憶媒体。
【請求項２】
請求項１記載のコンピューター読み取り可能記憶媒体において、断片化を使用するか否か判断する前記ステップが、前記データーを送るためのパケットの数が１よりも大きいか否か判断するステップを含む、コンピューター読み取り可能記憶媒体。
【請求項３】
請求項２記載のコンピューター読み取り可能記憶媒体において、前記接続に関連するデーターを前記サーバーに送るためのパケット数を決定する前記ステップが、前記サーバーが前記接続において受信する最大バイト数が、送られるデーターのバイト数未満であるか否か判断するステップを含む、コンピューター読み取り可能記憶媒体。
【請求項４】
請求項１記載のコンピューター読み取り可能記憶媒体において、前記サーバーとの接続をネゴシエートするステップが、
受信をプリポストするステップと、
プロトコル・ネゴシエート要求を作るステップと、
前記プロトコル・ネゴシエート要求を前記サーバーに送るステップと、
ネゴシエート満了タイマーを設定するステップと、
前記ネゴシエート満了タイマーが満了する前に、前記プロトコル・ネゴシエート要求に対する応答が受信されたか否か判断するステップと、
前記ネゴシエート満了タイマーが満了する前に前記プロトコル・ネゴシエート要求に対する応答が受信されない場合、前記サーバーとの接続を落とすステップと、
前記ネゴシエート満了タイマーが満了する前に前記プロトコル・ネゴシエートに対する応答が受信された場合、プロトコル・ネゴシエート応答を受信するステップと、
前記プロトコル・ネゴシエート応答の有効性を判断するステップと、
前記プロトコル・ネゴシエート応答を処理するステップであって、前記プロトコル・ネゴシエート応答が、前記プロトコル・パケットを送るための少なくとも１つのクレジットを前記クライアントに供給する、ステップと、
を含む、コンピューター読み取り可能記憶媒体。
【請求項５】
請求項４記載のコンピューター読み取り可能記憶媒体であって、更に、
前記少なくとも１つの第２プロトコル・パケットを送るための十分なクレジットが存在する場合、前記少なくとも１つの第２プロトコル・パケットを送るステップと、
前記少なくとも１つの第２プロトコル・パケットを送るための十分なクレジットが存在しない場合、少なくとも１つの追加クレジットを前記サーバーに要求するステップと、
十分なクレジットが受信されたか否か判断するステップと、
十分なクレジットが受信されない場合、前記接続を終了するステップと、
十分なクレジットが受信された場合、前記少なくとも１つの第２プロトコル・パケットを送るステップと、
を含む、コンピューター読み取り可能記憶媒体。
【請求項６】
リモート・ダイレクト・メモリー・アクセス（ＲＤＭＡ）によってサーバー・メッセージ・ブロック（ＳＭＢ／ＳＭＢ２）を使用してデーターを、送信側と受信側との間で交換するように構成されたシステムであって、
ＲＤＭＡメッセージによってデーターを転送するように動作可能なＲＤＭＡネットワーク・インターフェース・カード（ＲＮＩＣ）と、
プロセッサーによって実行可能なコンピューター・プログラム命令を格納するように動作可能なメモリーと、
を含み、前記プロセッサーが、前記ＲＮＩＣおよび前記メモリーと通信して、カーネルを実行するように動作可能であり、前記カーネルが、
第１プロトコルを実施する第１クライアントを含み、この第１クライアントが、
２つ以上のＲＤＭＡメッセージにおいて断片化ＳＭＢデーターを伝達し、各ＲＤＭＡメッセージがRemainingDataLengthフィールドを含み、RemainingDataLengthフィールドは前記受信側が未だ受信していない断片化メッセージのバイト数に等しく、
クレジットを交換するために受信バッファーを作る、
ように動作可能であり、前記クレジットが、前記送信側が前記受信側に送ることができるＲＤＭＡメッセージ数を決定する、システム。
【請求項７】
請求項６記載のシステムであって、更に、前記第１クライアントと通信可能なＲＤＭＡインターフェースを含み、前記ＲＤＭＡインターフェースが、前記ＲＮＩＣを介してＲＤＭＡ接続を開くように動作可能である、システム。
【請求項８】
請求項７記載のシステムであって、更に、
第２プロトコルを実施する第２クライアントを含み、この第２クライアントが、
ＲＤＭＡダイレクト・データー転送を実行することをサーバーに命令するためにＳＭＢ２リード／ライト要求を作り、
前記ＳＭＢ２リード／ライト要求を前記第１クライアントに送るように動作可能であり、
前記第１クライアントが、更に、
前記ＳＭＢ２リード／ライト要求を第１プロトコル・データー転送パケットにカプセル化し、
前記第１プロトコル・データー転送パケットを前記サーバーに送るように動作可能である、システム。
【請求項９】
請求項８記載のシステムにおいて、前記ＳＭＢ２リード／ライト要求が、ＲＤＭＡチャネル記述子情報を特定するフィールドを含み、前記第１プロトコルがＳＭＢダイレクト・プロトコルである、システム。
【請求項１０】
請求項９記載のシステムにおいて、前記ＲＤＭＡチャネル記述子情報が、誘導情報を含み、前記サーバーが、前記誘導情報を決定し、前記誘導情報によって特定されたメモリー・アドレスに対して、エンコードされていないアプリケーション・データーのＲＤＭＡライトまたはＲＤＭＡリードを実行する、システム。
【請求項１１】
リモート・ダイレクト・メモリー・アクセス（ＲＤＭＡ）によってサーバー・メッセージ・ブロック（ＳＭＢ／ＳＭＢ２）を使用してデーターを、送信側と受信側との間で交換する接続を作るためのコンピューター実装方法であって、
第１ＳＭＢダイレクト・データー転送パケットを前記受信側が受信するステップであって、前記第１ＳＭＢダイレクト・データー転送パケットが、RemainingDataLengthフィールドおよびＳＭＢ２データーを含み、RemainingDataLengthフィールドは前記受信側が未だ受信していない断片化メッセージのバイト数に等しい、ステップと、
前記RemainingDataLengthフィールドが非ゼロであるか否か判断するステップと、
RemainingDataLengthフィールド前記がゼロであるとき、前記第１ＳＭＢダイレクト・データー転送パケットにおける前記ＳＭＢ２データーを処理するステップと、
前記RemainingDataLengthフィールドが非ゼロであるとき、再組み立てバッファーを前記接続に割り当てるステップと、
前記ＳＭＢ２データーを前記第１ＳＭＢダイレクト・データー転送パケットから前記再組み立てバッファーにコピーするステップと、
少なくとも１つの他のＳＭＢダイレクト・データー転送パケットを受信するステップと、
前記ＳＭＢ２データーを、前記少なくとも１つの他のＳＭＢダイレクト・データー転送パケットから前記再組み立てバッファーにコピーするステップと、
を含む、コンピューター実装方法。
【請求項１２】
請求項１１記載の方法において、前記ＳＭＢダイレクト・データー転送パケットが、CreditsRequested、CreditsGranted、DataOffset、およびDataLengthから成るグループからの１つ以上のフィールドを含む、方法。
【請求項１３】
請求項１２記載の方法において、前記CreditsGrantedフィールドが、前記ＳＭＢダイレクト・データー転送パケットの送信側にどれだけのクレジットが供給されたかを示す、方法。
【請求項１４】
請求項１１記載の方法において、クレジットが、前記送信側によって送ることができるＲＤＭＡメッセージの数に対する値である、方法。
【請求項１５】
請求項１１記載の方法であって、更に、
前記少なくとも１つの他のＳＭＢダイレクト・データー転送パケットが最後のパケットであるか否か判断するステップと、
前記少なくとも１つの他のＳＭＢダイレクト・データー転送パケットが最後のパケットである場合、前記再組み立てバッファーにおける前記ＳＭＢ２データーを処理するステップと、
前記少なくとも１つの他のＳＭＢダイレクト・データー転送パケットが最後のパケットではない場合、少なくとも１つの他のＳＭＢダイレクト・データー転送パケットを受信し、前記少なくとも１つの他のＳＭＢダイレクト・データー転送パケットからの前記ＳＭＢ２データーを、前記再組み立てバッファーにコピーするステップを繰り返すステップと、
を含む、方法。
【発明の詳細な説明】
【従来技術】
【０００１】
[0001]  サーバー・メッセージ・ブロック（ＳＭＢ)またはそのバージョン、例えば、ＳＭＢ２のようなファイル・アクセス・プロトコルは、ファイルへの共有アクセスおよびネットワークにおけるノード間の多種雑多な通信を主に設けるために使用されるアプリケーション−レイヤー・ネットワーク・プロトコルとして動作することができる。以前では、ＳＭＢまたはＳＭＢ２は、送信制御プロトコル（ＴＣＰ）移送(transport)および従前のネットワーク・インフラストラクチャ上で動作していた。ＳＭＢ２は、汎用リモート・ファイル・アクセスのためのプロトコルとして非常に成功したが、ＳＭＢ２は、高スループットおよび低レイテンシのファイル入力／出力が要求されるリモート・ファイル・アクセスには広く採用されなかった。
【発明の概要】
【発明が解決しようとする課題】
【０００２】
[0002]  リモート・ダイレクト・メモリー・アクセス（ＲＤＭＡ）は、一方のコンピューターのメモリーから他方のコンピューターのメモリーへのダイレクト・メモリー・アクセスであり、他方のコンピューターのオペレーティング・システムを必要としない。このダイレクト転送(direct transfer)は、ネットワークを介した高スループット、低レイテンシのデーター転送を可能にし、特に性能に厳しい配備において有用である。アプリケーションがＲＤＭＡリードまたはライト要求を実行するとき、アプリケーション・データーがダイレクト・ソース・メモリー・バッファーから宛先メモリー・バッファーに、ＲＤＭＡ−可能なネットワーク・アダプターを使用して配信され、この転送において中央処理ユニット（ＣＰＵ）（または単にプロセッサーと呼ぶ）やオペレーティング・システムを必要としない。これらのＲＤＭＡ転送は、レイテンシを低減し、高速メッセージ転送を可能にする。生憎、ＳＭＢ２はＲＭＤＡと共に動作していないので、ＲＤＭＡの恩恵は、ＳＭＢ２を使用するシステムによって利用されていない。
【０００３】
[0003]  この背景では具体的な問題に取り組んだが、本開示は、これら具体的な問題を解決することに限定されることは全く意図していない。
【課題を解決するための手段】
【０００４】
[0004]  一般に、実施形態は、ＲＤＭＡ移送に加えて(atop)、ＳＭＢ２動作（あるいは、例えば、ＳＭＢ動作またはファイル・アクセス・プロトコル動作の他のバージョン）のような、データー動作を実現するためのプロトコルおよび処理に関する。実施形態では、プロトコル定義は、ＲＤＭＡ接続のネゴシエーションのための新たなメッセージ、および、例えば、ネゴシエートした接続を使用してＳＭＢ２データーを転送する(transfer)ための新たなメッセージを指定する。一実施形態では、ＲＤＭＡ移送に加えてＳＭＢ２動作を実現するためのプロトコルは、ＳＭＢダイレクト・プロトコルである。しかしながら、他の実施形態は、本開示の主旨および範囲から逸脱することなく、他のＳＭＢプロトコル、ＳＭＢプロトコル・バージョン、または他のデーター動作プロトコルにも対応する(provide for)。一実施形態によれば、新たなＳＭＢダイレクト・メッセージは、新たなヘッダー情報を含むことができる。この新たなヘッダー情報は、以下の内１つ以上を含むことができるが、これらに限定されるのではない。CreditsRequested、CreditsGranted、Flags、Reserved、RemainingDataLength、DataOffset、およびDataLength。このヘッダー情報が使用されるのは、ＲＤＭＡ移送が、受信側によって固定サイズのみのメッセージを受信することをサポートするからであり、そしてＳＭＢ２メッセージのサイズが約１００バイトから１００万バイトを超える非常に大きなメッセージまで幅広く変化する可能性があるからである。ＳＭＢ２プロトコルは、ＲＤＭＡ能力の存在を認識するように変更され、一方ＳＭＢダイレクト・プロトコルは、新たなレイヤーをネットワーキング・スタックに追加して、複数の個々のＲＤＭＡメッセージを論理的に１つの要求または応答に繋ぎ合わせて、ＲＤＭＡメッセージに対する固定サイズの制約、およびＳＭＢ２メッセージングに固有の不確定なサイズ要件の双方に対処することを可能にする。ＳＭＢ２プロトコルに対する変更、およびＳＭＢダイレクト・プロトコルの追加によって、ピアのメモリー間におけるデーターの直接転送を可能にする。実施形態では、ＳＭＢ２サーバーは、ＲＤＭＡを使用してクライアントのメモリーから読み出し、またはクライアントのメモリーに書き込み、データーの直接配置を実行することができる。サーバーは、ＲＤＭＡライトをクライアントに対して実行してＳＭＢ２リードを完了し、ＲＤＭＡリードを実行してＳＭＢ２ライトを完了する。ＳＭＢダイレクト・プロトコルは、ピアのメモリー間におけるＳＭＢ/ＳＭＢ２の直接転送を可能にするが、ＳＭＢダイレクト・プロトコルは、一実施形態によれば、他のプロトコルにも適応させることができる。実施形態によれば、ＳＭＢダイレクト・プロトコルの双方向ピア−ツー−ピアという性質が、それ自体を複数のタイプのデーター転送動作に相応しいものにする。
【０００５】
[0005]  また、ＲＤＭＡ移送は、任意の時点において処理することができるメッセージの数を制限する。この場合も、値は受信側のみによって固定(fix)される。このＲＤＭＡの要件に合わせるために、実施形態は、ピアが「クレジット」を交換するまたは割り当てる機能を設ける(provide)。クレジットとは、各プロトコル・ヘッダーにおいて、各相互ピアによって要求されこれに付与される数値であり、送信側が受信側に送ることができるＲＤＭＡメッセージの数を指定する。クレジットは、動的であり、各ピアによって独立して管理される。ＳＭＢ２交換を実行するために利用可能な十分なクレジットを管理して作る規則は、本明細書において開示する実施形態におけるプロトコルによって定められる。
【０００６】
[0006]  実施形態では、独立した双方向クレジットの供給によって、各ピアが、明示的なネゴシエーションや受信側ピアによる事前の把握(knowledge)および同意がなくても、要求や応答を送ることを可能にすることができる。ＲＤＭＡに関連して順次送ることによって、ＲＤＭＡ処理においてエラーを生ずることなく、そしてこのような状態が起こったときに非効率的なネゴシエーションによる転送に頼ることなく、予期できなかった程の大きなメッセージの交換も可能にすることができる。
【０００７】
[0007]  実施形態によれば、プロトコル・バージョンおよび他のパラメータのネゴシエーションのために、追加のメッセージを使用することもできる。ネゴシエーション要求メッセージは、例えば、CreditRequested、Reserved、MinVersion、MaxVersion、OutboundSendSize、MaxInboundSendSize等に対するフィールドを含むことができる。一方、要求メッセージに応答して送られるネゴシエーション応答メッセージは、例えば、CreditRequested、CreditsGranted、Version、Reserved、Status、OutBoundSendSize、InboundSendSize等に対するフィールドを含むことができる。これらのパラメータは、能力のネゴシエーション、リソースの端末間最適化、およびプロトコルの今後の改良バージョンとの互換性をサポートする。
【０００８】
[0008]  この摘要は、詳細な説明の章において以下で更に説明する概念から選択したものを簡略化された形式で紹介するために、設けられている。この摘要は、特許請求する主題の必須の特徴を特定することを意図するのではなく、特許請求する主題の範囲を限定するために使用されることを全く意図していない。
【図面の簡単な説明】
【０００９】
[0011]  本開示の実施形態について、添付図面を参照することにより、更に分かりやすく説明することができる。図面において、同様の参照番号は同様の品目を指す。
【図１】図１は、本開示の実施形態にしたがって、ＳＭＢ２メッセージをＲＤＭＡによって（over)交換する環境またはシステムの論理表現例を示す。
【図２Ａ】図２Ａは、本開示の実施形態にしたがって、ＳＭＢ２メッセージをＲＤＭＡによって送るクライアント・システムの論理表現例を示す。
【図２Ｂ】図２Ｂは、本開示の実施形態にしたがって、ＳＭＢ２メッセージをＲＤＭＡによって受信するサーバー・システムの論理表現例を示す。
【図３Ａ】図３Ａは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２メッセージを使用してデーターを交換するときに送信または受信されるメッセージの論理表現を示す。
【図３Ｂ】図３Ｂは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２メッセージを使用してデーターを交換するときに送信または受信されるメッセージの論理表現を示す。
【図３Ｃ】図３Ｃは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２メッセージを使用してデーターを交換するときに送信または受信されるメッセージの論理表現を示す。
【図３Ｄ】図３Ｄは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２メッセージを使用してデーターを交換するときに送信または受信されるメッセージの論理表現を示す。
【図３Ｅ】図３Ｅは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２メッセージを使用してデーターを交換するときに送信または受信されるメッセージの論理表現を示す。
【図４Ａ】図４Ａは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２を使用して通信をネゴシエートするプロセスの動作特性を表す流れ図を示す。
【図４Ｂ】図４Ｂは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２を使用して通信をネゴシエートするプロセスの動作特性を表す流れ図を示す。
【図４Ｃ】図４Ｃは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２を使用して通信をネゴシエートするプロセスの動作特性を表す流れ図を示す。
【図５Ａ】図５Ａは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２を使用してデーターを交換するプロセスの動作特性を表す流れ図を示す。
【図５Ｂ】図５Ｂは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２を使用してデーターを交換するプロセスの動作特性を表す流れ図を示す。
【図５Ｃ】図５Ｃは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２を使用してデーターを交換するプロセスの動作特性を表す流れ図を示す。
【図５Ｄ】図５Ｄは、本開示の実施形態にしたがって、ＲＤＭＡによってＳＭＢ２を使用してデーターを交換するプロセスの動作特性を表す流れ図を示す。
【図６】図６は、本開示の実施形態にしたがって、ＲＤＭＡダイレクト・データー転送を使用してデーターを交換するプロセスの動作特性を表す流れ図を示す。
【図７】図７は、本開示の実施形態を実現することができる計算システム例を示す。
【発明を実施するための形態】
【００１０】
[0018]  これより、本開示は、添付図面を参照しながら、実施形態例について更に詳しく説明する。添付図面には、具体的な実施形態が示されている。しかしながら、他の形態も多くの異なる形式(form)で具体化することができ、具体的な実施形態を本開示に含ませることを、そのような形態を本明細書において説明する実施形態に限定するように解釈してはならない。逆に、図面に示される実施形態は、周到かつ完全(through and complete)であり、意図する範囲を当業者に余すところなく伝える開示を提供するために含まれている。任意のコンポーネントまたは動作を示すために、破線が使用されている場合がある。
【００１１】
[0019]  概して言えば、実施形態は、ＲＤＭＡ接続によってＳＭＢ２データーを交換するためのシステム、方法、およびプロトコルに関する。ＲＤＭＡは、データーを移送するときに利点が得られる。例えば、ＲＤＭＡは、一方のメモリーから他方のデバイスまたはシステムのメモリーへの転送を行う。これらの転送は、プロセッサーを必要とせず、したがって、データーを伝達するときに伴うオーバーヘッドを低減する。更に、移送管理においてプロセッサーを必要としないので、ＲＤＭＡは、より少ないクロック・サイクルで、データーを転送する。つまり、ＲＤＭＡは低レイテンシ、高帯域幅の接続を提供する。
【００１２】
[0020]  一般に、ＳＭＢ２のようなＳＭＢのバージョンは、アプリケーション−レイヤー・ネットワーク・プロトコルであり、ネットワークにおけるノード間においてファイルおよび種々雑多な通信に対して共有アクセスを提供するために使用される。ＳＭＢおよびＳＭＢ２は、つまり、ファイル・アクセス動作プロトコルの例である。ＳＭＢ２は、クライアント（１つまたは複数）とサーバー（１つまたは複数）との間におけるメッセージの交換におけるデーターの転送に対応する(allow for)。本明細書における一部の実施形態の説明では、ＳＭＢ２に言及する。しかしながら、他の実施形態では、本開示の主旨や範囲から逸脱することなく、ＳＭＢまたは他のファイル・アクセス動作プロトコルの任意のバージンを使用することができる。
【００１３】
[0021]  一般に、動作の違いのため、ＳＭＢ２（またはＳＭＢ）は現在ではＲＤＭＡによる動作を行わず、代わりに、ＴＣＰを使用してデーターを移送する(transport)。本実施形態は、ＲＤＭＡ可能なネットワーク・プロトコルによってＳＭＢ２メッセージを交換するためのシステムおよびプロトコルを作る。最初に、クライアントおよび／またはサーバーがＳＭＢ２のコンポーネントを使用して、互いの能力(capabilities or abilities)を発見する。クライアントおよび／またはサーバーを纏めてピアと呼ぶことができる。一実施形態では、クライアントがサーバーについての情報を求めることによって、要求が送られる。応答する側のサーバーは、当該サーバーが有するネットワーク・インターフェース・カード（ＮＩＣ）の数、ＮＩＣのインターネット・プロトコル（ＩＰ）アドレス）、ＮＩＣの速度、ＮＩＣがＲＤＭＡ可能であるか否か、および／または、恐らく、ＩＰアドレスについての情報と共に回答する。実施形態では、要求する側のクライアントは、この情報を使用して、どのようにサーバーとインターフェースするか決定することができる。
【００１４】
[0022]  サーバーがＲＤＭＡ可能である場合、ＲＤＭＡ可能クライアントは、次いで、本開示の実施形態にしたがって、ＲＤＭＡ接続をそのサーバーとネゴシエートすることができる。実施形態ではＲＤＭＡインターフェースと呼ばれる新たなインターフェースは、ＲＤＭＡ可能ネットワーク・アダプターと他のシステム・コンポーネント（ＳＭＢクライアントを含む）との間におけるインターフェースである。更に、ＳＭＢダイレクト・クライアント／サーバーと呼ばれる、新たなモジュールがスタックに追加される。最初に、ＳＭＢダイレクト・クライアントが、恐らくは能力要求に応答して、他のピアからメッセージを受信するためにメモリー・バッファーの少なくとも一部を予約することによって、受信をプリポスト(pre-post)する。ＳＭＢダイレクト・クライアントは、次に、ＳＭＢダイレクト・ネゴシエート要求パケットを送ることができる。ＳＭＢダイレクト・ネゴシエート要求は、ピア間にＳＭＢダイレクト接続を作るプロセスを開始する。実施形態によれば、ＳＭＢダイレクト・ネゴシエート要求は、どのようにＲＤＭＡ接続が機能するかを定める１つ以上のフィールドを含む。
【００１５】
[0023]  実施形態では、ＳＭＢダイレクト・ネゴシエート要求の一部は、「クレジット」の要求である。ＲＤＭＡが直接１つのメモリーから他のメモリーに転送すると、受信側ピアは、送信側ピアが移送データーを入れることができる空間を、メモリー・バッファー内に予約する。メモリー・バッファーは、ブロック単位で（例えば、１Ｋバイト・ブロック）割り当てられる。実施形態では、この割り当ては、ＳＭＢダイレクト接続が作られた後にブロック・サイズが変化しないように設定される。他の実施形態では、割り当てが設定されず、この場合ブロック・サイズが変化することができる。割り当てが設定される場合、メモリー・バッファーへの転送はいずれも、ブロック・サイズを超えることはできない。ブロック・サイズよりも大きいサイズを有するＳＭＢ2データーを転送するためには、送信側は２つ以上のパケットを送る。これらは、メモリー・バッファーの２つ以上の割り当てに格納される。メモリー割り当て(allocation)を予約するために、送信側ピアはクレジットを要求する。要求されるクレジット数は、ローカル・ポリシーによって決定され、必ずしもメッセージの組成による影響は受けない。各クレジットは、メモリー・バッファーのブロックを表し、したがって、要求元が他のピアに送ることができるメッセージを表す。
【００１６】
[0024]  本開示の実施形態では、サーバーは、応答、例えば、ＳＭＢダイレクト・ネゴシエート応答を要求元に送ることができる。このＳＭＢダイレクト・ネゴシエート応答は、ＲＤＭＡ接続を定める種々のフィールドも含む。この要求に応答して、ＳＭＢダイレクト・ネゴシエート応答は、ある数のクレジットをクライアントに提供する。更に、ＳＭＢダイレクト・ネゴシエート応答も、クライアントのメモリー・バッファー内に割り当てを予約するクレジットを要求することができる。実施形態では、ＳＭＢダイレクト・ネゴシエート要求およびＳＭＢダイレクト・ネゴシエート応答の交換によって、ＲＤＭＡ接続を作る。その後、この接続を介してＳＭＢ２データーを交換することができる。
【００１７】
[0025]  実施形態によれば、ＲＤＭＡ接続を介したＳＭＢ２データーの交換は、少なくとも１つのパケットの移送を含む。送られるＳＭＢ２データーがブロック・サイズよりも小さい場合、ＳＭＢダイレクト・データー転送パケットと呼ばれる１つのパケットだけを送ることができる。しかしながら、送ろうとするＳＭＢ２データーがブロック・サイズよりも大きい場合、一実施形態によれば、２つ以上のＳＭＢダイレクト・データー転送パケットを送ることができる。ＲＤＭＡは、シーケンスにしたがうパケット受信に対処する。つまり、通信において受信される第２のパケットは、第１の受信パケットの直後に置かれる。このＲＤＭＡの利点を利用するために、ＳＭＢダイレクト・データー転送パケットは、送られるＳＭＢ２データーの総量を知らせるフィールド、および現在のパケットの後にどのくらい送られるパケットが残っているかを知らせるフィールドを含む。このように、ＳＭＢダイレクト・ピアは、ＳＭＢ転送が完了するときを判断することができ、ＳＭＢ２データーを再び組み立てることができる。ＳＭＢダイレクト・プロトコルは、したがって、実施形態では、低レイテンシおよび低オーバーヘッドで、ＳＭＢ２の迅速な転送に備えつつ、ＳＭＢ２データーをＲＤＭＡによって転送することに付随する問題を克服する。
【００１８】
[0026]  本明細書において開示する実施形態にしたがって、ＲＤＭＡ接続を介してＳＭＢ２データーを交換する論理環境またはシステムの一例１００を図１に示す。接続ピア（クライアント１０２およびサーバー１０６とも呼ぶ）１０２および１０６は、ＲＤＭＡ接続を介して、ＲＤＭＡ  ＮＩＣ（ＲＮＩＣ）１０８ａおよび１０８ｂ間でＳＭＢ２データーをネットワーク１０４を介して移動させることができる。接続ピアとは、例えば、図７に関して説明するような、任意のコンピューター・システムであってよい。接続ピアは、図１においてクライアント／アプリケーション・サーバー１０２およびファイル・サーバー１０６として示されている。しかしながら、これらのピアは、一例として提示されるに過ぎない。実施形態では、任意のタイプのクライアント（１つまたは複数）またはサーバー（１つまたは複数）が、接続ピアとして機能することができる。つまり、ＲＤＭＡ接続は、例えば、複数のクライアント、複数のサーバー、サーバー・ファーム（１つまたは複数）、サーバー・クラスタ（１つまたは複数）、メッセージ・サーバー（１つまたは複数）の間、あるいはクライアント（１つまたは複数）とサーバー（１つまたは複数）との間にあってもよい。クライアント／アプリケーション・サーバー１０２およびファイル・サーバー１０６は、本明細書において開示する実施形態の教示を理解することのみを目的に、例として提示されるに過ぎない。
【００１９】
[0027]  ＳＭＢ２データーがネットワーク１０４を介して移動される間、ネットワーク１０４は、例えば、図７に関して説明するようであればよい。ネットワーク１０４は、個別の１つのネットワークとして示されているが、当業者によって通常理解される任意のタイプのネットワークであればよい。一実施形態によれば、ネットワークはグローバル・ネットワーク（例えば、インターネットまたはワールド・ワイド・ウェブ、即ち、省略して「ウェブ」）であってもよい。また、ローカル・エリア・ネットワーク、例えば、イントラネット、またはワイド・エリア・ネットワークであってもよい。実施形態によれば、ネットワーク１０４を介した通信が、１つ以上の標準的なパケット・ベースのフォーマット、例えば、Ｈ．３２３、ＩＰ、イーサネット（登録商標）、および／またはＡＴＭにしたがって行われる。
【００２０】
[0028]  更に、実施形態では、ＲＮＩＣ１０８（ａおよび／またはｂ）は、任意のネットワーク・インターフェース・カード、ネットワーク・アダプター、および／またはＲＤＭＡをサポートするネットワーク・インターフェース・コントローラーであってもよい。ＲＮＩＣを提供する様々な販売業者がある。例えば、iWARPまたはInfiniBandは、ＲＤＭＡをサポートするネットワーク・プロトコルである。ＲＮＩＣは、ＲＤＭＡをサポートすることができ、メモリー１１０ａからメモリー１１０ｂへ、およびその逆のデーターの直接転送を可能にする。これらのデーター転送は、プロセッサー１１２ａまたは１１２ｂの監視を必要とせず、含むこともない。つまり、本発明の実施形態によれば、ＲＤＭＡ転送は、高帯域幅、低レイテンシ、および低オーバーヘッドである。プロセッサー１１２およびメモリー１１０は、例えば、図７に関して説明した通りであってよい。
【００２１】
[0029]  図１は、ＲＤＭＡを介したＳＭＢ２データー交換の一般的な環境を示し、図２Ａは、本明細書において開示する実施形態にしたがって、ＲＤＭＡ接続を介してＳＭＢ２データーを送信または受信するピアの一例１０２を示す。この例では、ピア１０２は、クライアントおよび／またはアプリケーション・サーバーである。クライアント１０２の種々のコンポーネントには、本開示の実施形態によるハードウェアおよび／またはソフトウェアを含むことができる。しかしながら、例示の目的のために、以後、コンポーネントをソフトウェア・モジュールとして説明する。実施形態では、クライアント１０２は、カーネル２０２ａ、少なくとも１つのアプリケーション２２０、メモリー・バッファー２２２ａ、１つ以上のタイマー２２４ａ、および／または１つ以上の設定２２６ａの内１つ以上を含むが、これらに限定されるのではない。実施形態では、「カーネル」とは、オペレーティング・システムの中核であり、ここでメモリー、ファイル、および周辺デバイスが管理され、アプリケーションがトリガーおよび起動され、システム・リソースが割り当てられる。
【００２２】
[0030]  実施形態では、カーネル２０２ａは、ＷＩＮ３２（登録商標）ファイル・アプリケーション・プログラミング・インターフェース（ＡＰＩ）または同等物２０４、ＳＭＢ２モジュール（ＳＭＢ２クライアント２０８として示されている）、ＳＭＢダイレクト・モジュール（ＳＭＢダイレクト・クライアント２１４ａとしてしめされている）、およびＲＤＭＡインターフェース２１６ａの内１つ以上を含むことができるが、これらに限定されるのではない。ＳＭＢダイレクト・モジュールおよびＲＤＭＡインターフェース２１６ａは、本明細書において説明する方法およびプロセスを実行するために導入される。モジュール、コンポーネント、および／またはインターフェースについて次のように説明する。
【００２３】
[0031]  実施形態では、ＷＩＮ３２（登録商標）ファイルＡＰＩ２０４は、カーネル２０２ａと１つ以上のユーザー・アプリケーション２２０との間のアプリケーションとすることができる。一実施形態例では、ＷＩＮ３２（登録商標）ファイルＡＰＩ２０４は、MICROSOFT WINDOWS（登録商標）オペレーティング・システムにおいて利用可能な１組のＡＰＩである。殆ど全てのWINDOWS（登録商標）プログラムは、機能を実行するためにWINDOWS（登録商標）と相互作用する。ＷＩＮ３２（登録商標）ファイルＡＰＩ２０４の実施形態は、例えば、ファイル・システム、デバイス、および／またはエラー・ハンドリングというような、WINDOWS（登録商標）システムに利用可能なリソースへのアクセスを付与する。ＷＩＮ３２（登録商標）ファイルＡＰＩ２０４は、実施形態によれば、カーネルに追加される機能へのアクセスを不要することができる。実施形態では、ＷＩＮ３２（登録商標）ファイルＡＰＩ２０４は、加えて、基礎のファイル・アクセス機能を使用するリモート・ファイルに対する動作(action)をシステムが実行することを可能にする。一方、基礎のファイル・アクセス機能は種々のネットワーク処理機能(networking capabilities)を使用し、リモート・アクセスに対処する。
【００２４】
[0032]  実施形態では、ＳＭＢ２クライアント２０８は、アプリケーションと、ＳＭＢ２サーバー２１２ｂによって提供されるインターフェースとの間における通信を管理する。デバイスが動作する速度は、オペレーティング・システムと一致しない場合もあるので、オペレーティング・システムとデバイス・ドライバーとの間の通信は、主にＩ／Ｏ要求パケット（ＩＲＰ）を介して行われる。これらのパケットは、例えば、ネットワーク・パケットまたはWINDOWS（登録商標）メッセージ・パケットと同様である。これらのパケットは、オペレーティング・システム（１つまたは複数）から特定のドライバーに、そしてドライバー間で渡される。実施形態では、ＳＭＢ2クライアント２０８は、Ｉ／Ｏ要求をネットワーク・リソースにリディレクトし、ＳＭＢメッセージを作成して(compose)ネットワークを介した通信を行うことができる。ＳＭＢ２クライアント２０８は、ＳＭＢパケットまたはデーターをＲＭＤＡによって交換するために、ＳＭＢパケットをＳＭＢダイレクト・クライアント２１４ａに伝達する。同様に、 一実施形態によれば、ＳＭＢ２サーバー２１２ｂもＩＲＰを使用して、ＳＭＢ２クライアント２０８からのファイル要求をサーバーのストレージに送ることもできる。
【００２５】
[0033]  実施形態では、ＳＭＢダイレクト・モジュール２１４は、カーネル２０２におけるＳＭＢダイレクト・ネットワーク・プロバイダ・インターフェース（ＮＰＩ）から作られたインスタンスである。ＳＭＢダイレクト・モジュール２１４は、ＡＰＩ（ＳＭＢダイレクトＮＰＩと呼ぶ）を、ＳＭＢ２クライアントおよびＳＭＢ２サーバー・モジュールに露出する。ＳＭＢ２クライアント／サーバー・モジュールは、このＳＭＢダイレクトＮＰＩを使用して、ＳＭＢダイレクト接続を介してデーターを送るまたは受信するための要求を行う。実施形態によれば、ＳＭＢダイレクト・モジュール２１４は、ＳＭＢダイレクト・プロトコルを実現し、ＳＭＢ２クライアント／サーバー・モジュールと基礎のＲＤＭＡインターフェースとの間に位置する。ＳＭＢダイレクトＮＰＩは、ＳＭＢダイレクト・プロトコルをイネーブルする。ＳＭＢダイレクトＮＰＩは、動作の中でもとりわけ、ＳＭＢダイレクト接続を作成および破壊し、ＳＭＢダイレクト接続を介してデーターを送信および受信し、メモリーを登録／登録解除し、ＲＤＭＡリード／ライト動作をピアとの間でＳＭＢダイレクト接続を介して実行し、ＳＭＢダイレクト接続がピアによって切断されたときに通知を受信し、ＳＭＢダイレクト接続を介した送信のためにＳＭＢ２パケットを直列化／非直列化することができる。これらのタスクを遂行するために、ＳＭＢダイレクト・モジュール２１４が作成される。ＳＭＢダイレクト・モジュール２１４は、ＲＤＭＡプロトコルによって格納されたＳＭＢ２データーのメモリー・バッファー２２２からの送信および引き出しを管理することができる。つまり、ＳＭＢダイレクト・モジュール２１４は、単にＳＭＢ２データーからＲＤＭＡに、そしてＲＤＭＡからＳＭＢ２に逆に、データーを変換する。ＳＭＢダイレクト・モジュール２１４は、他の新たなモジュール、ＲＤＭＡインターフェース２１６と通信し、本開示の実施形態における動作を実行する。
【００２６】
[0034]  実施形態によれば、ＳＭＢダイレクト・モジュール２１４は、様々な機能を実行する。ＳＭＢDirectReceiveEventコールバック関数は、ＳＭＢ２クライアント２０８またはＳＭＢ２サーバー２１２Ｂに、ＳＭＢダイレクト・エンドポイントにおいてメッセージが受信されたことを通知する。ＳＭＢDirectDisconnectEventイベント・コールバック関数は、ＳＭＢ２クライアント２０８またはＳＭＢ２サーバー２１２ｂに、エンドポイントにおける接続が切断されたことを通知する。ＳＭＢDirectAcceptEventイベント・コールバック関数は、ＳＭＢ２サーバー２１２ｂに、リスニング・エンドポイント(listening endpoint)における着信接続(incoming connection)が受け入れられたことを通知する。ＳＭＢDirectListen関数は、所与のローカル・アドレスにおける着信接続を傍聴する(listen for)リスナー・エンドポイントを作る。ＳＭＢDirectCloseEndpoint関数は、エンドポイントを閉鎖し、あらゆる関連するリソースを解放する。ＳＭＢDirectConnect関数は、エンドポイントをリモートＳＭＢダイレクト移送アドレスに接続する。ＳＭＢDirectDisconnect関数は、エンドポイントをリモートＳＭＢダイレクト移送アドレスから切断する。ＳＭＢDirectSend関数は、データーのバッファーをリモートＳＭＢダイレクト・ピアに送る。ＳＭＢDirectSend関数は、データーのバッファーをリモートＳＭＢダイレクト・ピアに送る。ＳＭＢDirectRegisterMemory関数は、ＳＭＢ２クライアント２０８が、ＲＤＭＡリード／ライト動作に使用するためにメモリー・バッファーを登録することを可能にする。ＳＭＢDirectUnregisterMemory関数は、ＳＭＢDirectRegisterMemory関数によって以前に登録されたメモリー・バッファーの登録を解除する。ＳＭＢDirectＲdmaRead関数は、ＲＤＭＡに、エンドポイントが接続されているリモート・ピアのメモリーから直接データーを読み取らせる。ＳＭＢDirectＲdmaWrite関数は、ＲＤＭＡに、エンドポイントが接続されているリモート・ピアのメモリーにデーターを直接書き込ませる。これらの関数およびその動作について、図６と関連付けて説明する。
【００２７】
[0035]  一実施形態では、ＲＤＭＡインターフェース２１６は、ＲＮＩＣの販売業者特定ＲＤＭＡ機能とインターフェースするための新たなインターフェースである。ＲＤＭＡインターフェース２１６は、ＲＤＭＡデバイスの関数へのアクセスを与えることができる。ＲＤＭＡデバイスの機能は、ＳＭＢダイレクト・パケットを受信するためのポートを傍聴することを含み、ＳＭＢ２データーをＳＭＢダイレクト・モジュール２１４に供給することができる。一実施形態では、ＲＤＭＡデバイスは、ＲＤＭＡ接続を介した通信を管理するために、カーネル・モードＲＤＭＡモジュールを含むことができる。更に、ＲＤＭＡデバイスは、ＲＤＭＡメッセージを送るポートにアクセスしここで傍聴するためにＲＤＭＡアクセス・レイヤーおよび拡張も含むことができる。実施形態によれば、プロキシー・ドライバーは、ＲＮＩＣのハードウェア・ドライバーとインターフェースすることができる。
【００２８】
[0036]  実施形態では、ユーザー・アプリケーション２２０は、ユーザーまたは他のソフトウェアのためにプロセッサーによって実行される任意のソフトウェアであればよい。ユーザー・アプリケーション２２０の例には、ウェブ・ブラウザー、電子メール等が含まれる。これらのユーザー・アプリケーション２２０は、カーネル２０２ａとインターフェースして、特に、ファイル・サーバー１０６のようなリモート記憶位置からのデーターを送信および受信する。
【００２９】
[0037]  一実施形態では、メモリー・バッファー２２２は、図７に関して説明するように、任意のタイプのメモリーであればよい。メモリー・バッファー２２２は、メッセージ内において送られるＳＭＢダイレクト・メッセージおよび／またはＳＭＢ２データーを受信するために使用することができ、そしてこれらのメッセージを送信する前に、発信するＳＭＢダイレクト・メッセージを結集する(stage)ために使用することができる。つまり、実施形態によれば、メモリー・バッファー２２２は、以下で説明するようにブロックに区分することができる。
【００３０】
[0038]  タイマー２２４は、実施形態では、所定時間から０までカウント・ダウンすることができる１組のクロックである。つまり、タイマー２２４は、格納されているデーター、およびプロセッサーによって実行されるクロック関数を表す。タイマー２２４の満了が、ＲＤＭＡインターフェースにおいてまたはＳＭＢダイレクト・モジュール２１４によって１つ以上の関数をトリガーすることができる。他の実施形態では、タイマーが０から閾値までカウントすること、または他の何らかのタイプのカウント動作を実行することもできる。これらのタイマーの一部は、SendCreditGrantTimerを含むことができる。これは、SendCreditCountがゼロに達したときに開始され、タイマー・セクション２２４において動作するタイマーである。離れて接続されているピアは、このタイマーが満了するまでに、追加のSendCreditsを付与しなければならない。また、SendCreditGrantTimerは、ピアが追加のSendCreditsを付与するまでクライアント／サーバーがこのピアを待つ時間量を規制することもできる。クライアント／サーバーが、SendCreditsCountの値がゼロであるために、パケットをピアに送ることができないことを発見したとき、クライアント／サーバーは、実施形態によれば、所定の秒数後に満了するタイマーを設定する。SendCreditsが入手可能になる前にこのタイマーが満了した場合、クライアント／サーバーは接続を切断する。一実施形態では、アイドル接続タイマーが、ピアがパケットを送るまでクライアント／サーバーが待つ時間量を規制する。最後の所定数の秒の間にピアからパケットが受信されていない場合、クライアント／サーバーは、存続要求(keep alive request)をピアに送り、KeepAliveResponseタイマーを設定する。KeepAliveResponseタイマーの満了前に応答が受信されない場合、本開示の実施形態によれば、接続は切断される。
【００３１】
[0039]  本発明の実施形態によれば、ＳＭＢダイレクト接続を介した任意のＳＭＢダイレクト・データー転送のために、KEEPALIVE_REQUESTEDフラグをセットすることもできる。一実施形態では、KEEPALIVE_REQUESTEDフラグは、受信側がまだ接続されていて応答可能であることを送信側が分かるように、できるだけ早く送信側に応答することを受信側ピアに求める要求である。１つ以上のシステムが、メッセージ交換なしに、接続を時間切れにしようと試みることができる。このため、KEEPALIVE_REQUESTEDフラグが付いたメッセージは、接続を維持することができる。代替実施形態では、KEEPALIVE_REQUESTEDフラグがセットされたメッセージは、クレジットを要求または受信するために使用することができる。
【００３２】
[0040]  一実施形態では、設定２２６ストアは、ＲＤＭＡによるＳＭＢメッセージ交換に関連するデーターを格納し引き出す。設定２２６は、図７に関して説明するような任意のタイプのメモリーまたは記憶デバイスに格納することができる。一例として、これらの設定は、設定された後にクレジット補充タイマーが満了する秒数、ピアが他のピアから受信してもよいＳＭＢダイレクト・データー転送パケットの最大サイズ、またはピアが他のピアに付与する送出クレジット数に対する制限等を含むことができる。
【００３３】
[0041]  ＳＭＢ_DIRECT_ENDPOINT構造は、実施形態では、ＳＭＢダイレクト・エンドポイントを表す不透明な構造とすることができる。ＳＭＢダイレクト・エンドポイントは、例えば、ネットワーク・ソケットと機能が類似する。一実施形態によれば、ＳＭＢ２クライアント２０８またはＳＭＢ２サーバー２１２ｂは、この構造のメンバに直接アクセスできないが、ＳＭＢダイレクト・モジュール２１４を介してアクセスすることができる。ＳＭＢ_DIRECT_ENDPOINT構造は、様々な動作のためのデーターを含むことができる。MwReleaseListは、解放されてリモート接続ピアに戻すことができるメモリー・ウィンドウのリストである。これらのメモリー・ウィンドウは、完了しているＲＤＭＡリード／ライト動作に関連付けられる。ReceiveCreditCountは、リモート接続ピアに付与されることになっている受信クレジットの数である。エンドポイントのホストは、エンドポイントにおいて保留になっている少なくともこの数の受信を有することができる。SendCreditCountは、エンドポイントのホストが現在有する送出クレジットの数である。リモート接続ピアは、エンドポイントにおいて保留になっている少なくともこの数の受信を有することができる。PendingＲdmaReadCountは、このエンドポイントにおいて開始したが未だ完了していないＲＤＭＡリード動作の数である。PendingＲdmaReadLimit は、同時にエンドポイントにおいて保留にすることができるＲＤＭＡリード動作の最大数である。DeferredInitiatorOpQueueは、実施形態では、それらを発行するためのエンドポイント・リソースが現在入手可能でないために延期されているイニシエータ動作(initiator operation)の待ち行列である。NdkQpは、受信およびイニシエータ要求待ち行列を表す待ち行列対オブジェクト(queue pair object)である。NdkReceiveCqは、ＮＤＫ受信完了待ち行列である。受信要求完了はこの待ち行列に入れられる。NdkReceiveQueueCapacityは、エンドポイントにおいて同時に保留にすることができる受信要求の最大数である。NdkInitiatorCqは、ＮＤＫイニシエータ完了待ち行列である。送出(send)、結合(bind)、高速登録(fast register)、リード、ライト、および無効化(invalidate)要求完了は、例えば、この待ち行列に並べられる。実施形態では、NdkInitiatorQueueCapacityは、エンドポイントにおいて同時に保留にすることができる送出、結合、高速登録、リード、ライト、および無効化要求の数である。
【００３４】
[0042]  図２Ｂは、本明細書において開示する実施形態にしたがって、ＲＤＭＡ接続を介してＳＭＢ2データーを送信または受信するピアの一例１０６を示す。この例では、ピア１０６はファイル・サーバーである。ファイル・サーバー１０６の種々のコンポーネントは、ソフトウェアおよび／またはハードウェアを含むことができる。実施形態ではこれらのコンポーネントをソフトウェア・モジュールとして説明するが、他の実施形態は他のタイプのモジュールにも備えている。実施形態では、ファイル・サーバー１０６は、カーネル２０２ｂ、ＮＴＦＳ２３２、メモリー・バッファー２２２ｂ、１つ以上のタイマー２２４ｂ、および／または１つ以上の設定２２６ｂの内１つ以上を含むが、これらに限定されるのではない。これらの機能の一部は、図２Ａにおいて説明したものと同一または同様であってもよい。
【００３５】
[0043]  実施形態によれば、カーネル２０２ｂ（および／または図２Ａに関して説明したように）、入力／出力（Ｉ／Ｏ）マネージャー２０６ｂ、ＳＭＢ２サーバー２１２ｂ、ＳＭＢダイレクト・サーバー２１４ｂ、およびＲＤＭＡインターフェース２１６ｂの内１つ以上を含むが、これらに限定されるのではない。これらの機能の一部は、図２Ａにおいて説明したものと同一または同様であってもよい。
【００３６】
[0044]  実施形態では、ＳＭＢ２サーバー２１２ｂは、MICROSOFT（登録商標）サーバーに対してＳＭＢ2プロトコルのサーバー側を実現するドライバーである。他の実施形態は、他のタイプのサーバーにも備えている。ＳＭＢ2サーバー２１２ｂは、始動して、ＳＭＢを使用してデーターを交換し、データーを供給し、Ｉ／Ｏマネージャー２０６ｂからのデーターを受信することができる。実施形態では、ＳＭＢ２サーバー２１２ｂは、ネットワーク接続を介してＳＭＢ２データーを送信または受信することができる。ＳＭＢ２サーバー２１２ｂは、サーバー用ネットワークを介して通信するように機能する。つまり、実施形態によれば、ＳＭＢ２サーバー２１２ｂは、送信のためのＳＭＢ２データーを供給し、ネットワーク送信からＳＭＢ２データーを受信する。
【００３７】
[0045]  実施形態では、新技術ファイル・システム（ＮＴＦＳ）２３２は標準的なファイル・システムであってよい。ＮＴＦＳは、性能、信頼性、およびディスク空間利用度を高めるため、そしてセキュリティ・アクセス制御リスト（ＡＣＬ）およびファイル・システム・ジャーナリング(journaling)というような追加の拡張のために、メタデーターおよび高度データー構造の使用のサポートを含む。ＮＴＦＳは、１つ以上のクライアントに対してファイル・データーを編成し格納するように機能する。このデーター・ファイルは、ＲＤＭＡによるＳＭＢ２データー転送のように、クライアントとの通信を介して、クライアントに供給することができる。
【００３８】
[0046]  実施形態によれば、ＳＭＢダイレクト(SMB Direct)は、ＳＭＢ２データーを交換するために、ＲＤＭＡ接続を作る。このプロトコルは、ネゴシエーション・プロセスによってＲＤＭＡ接続を作る。ピア１０２および１０６がＲＤＭＡ接続をネゴシエートした後、ピア１０２または１０６のいずれかが、ＲＤＭＡ接続を介してＳＭＢ２データーを送ることができる。
【００３９】
[0047]  実施形態によれば、第１ＳＭＢダイレクト・ネゴシエート要求パケット３００が図３Ａに示されている。一方、実施形態では、関連するＳＭＢダイレクト・ネゴシエート応答パケット３３６が図３Ｂに示されている。更に、実施形態によれば、データーを転送するために使用されるＳＭＢダイレクト・データー転送パケット３３８が図３Ｃに示されている。各メッセージまたはパケットは、例えば、作る、送信する、格納する、および／または受信することができる。実施形態では、これらのパケットまたはメッセージは、各々、異なるデーターを格納する部分またはフィールドを含むことができる。
【００４０】
[0048]  図３Ａに移ると、本開示の実施形態によるＳＭＢダイレクト・ネゴシエート要求パケット３００が示されている。ＳＭＢダイレクト・ネゴシエート要求パケット３００は、例えば、以下のフィールドの内１つ以上を含むことができるが、これらに限定されるのではない。MinVersion３０２、MaxVersion３０４、Reserved３０６,CreditsRequested３０８、PreferredSendSize３１０、MaxzReceiveSize３１２、および／またはMaxSmb2MessageSize３１４。ＳＭＢダイレクト・ネゴシエート要求パケット３００は、楕円３１６によって表されるように、図３Ａに示したフィールドよりも多いフィールドまたは少ないフィールドを含むこともできる。
【００４１】
[0049]  一実施形態では、MinVersionフィールド３０２は、クライアント／要求元１０２がサポートする最も低いＳＭＢダイレクト・プロトコル・バージョンについての値を含むことができる。MaxVersionフィールド３０４は、クライアント／要求元１０２がサポートする最も高いＳＭＢダイレクト・プロトコル・バージョンを格納することができる。この値は、MinVersionフィールド３０２の値以上であればよい。実施形態では、クライアント／要求元は、MinVersionフィールド３０２における値とMaxVersionフィールド３０４における値との間の範囲における（含まれる）プロトコル・バージョンの全てをサポートする。Reservedフィールド３０６は、単に、未だ分からない今後の要求のために確保されているフィールドであり、一実施形態によれば、クライアントによって使用されない。
【００４２】
[0050]  実施形態によれば、CreditsRequestedフィールド３０８は、クライアント／要求元１０２がサーバー／受信側１０６に要求している送出クレジット数についての値を含む。実施形態では、CreditsRequestedフィールド３０８における値は、ＳＭＢ2データーを後続のメッセージにおいて確実に送ることができるように、ゼロ（０）よりも大きくなる。しかしながら、CreditsRequestedフィールド３０８における値は任意の数でもよく、実施形態によれば、平均的使用に基づいて設定することもできる。代替実施形態では、CreditsRequestedフィールド３０８における値は、少なくとも、送られるＳＭＢメッセージのサイズに基づくことができる。更に他の実施形態では、他のまたは追加の要素も、クレジットを要求するときに考慮することができる。また、実施形態では、大きなメッセージもＲＤＭＡを使用して転送することができる。
【００４３】
[0051]  PreferredSendSizeフィールド３１０は、クライアント／要求元１０２がサーバー／受信側１０６に送信することができることを望む最も大きなＳＭＢダイレクト・データー転送パケット３３８のサイズ（恐らくはバイト単位）を含むことができる。MaxReceiveSizeフィールド３１２は、クライアント／要求元１０２がサーバー／受信側１０６から受け入れる最も大きなＳＭＢダイレクト・データー・データー転送メッセージのサイズを含む（恐らくはバイト単位）。つまり、１つのＳＭＢ２データー転送はメモリー割り当てを超過しない。実施形態では、この値は閾値１２８以上である。閾値１２８は、少なくともデーター転送パケットおよび小ＳＭＢ２メッセージにおけるＳＭＢダイレクト・ヘッダーのサイズである。MaxSMB2MessageSizeフィールド３１４は、一実施形態によれば、クライアント／要求元がサーバー／受信側１０６から受け入れる最も大きなＳＭＢ２プロトコル・メッセージのサイズ（恐らくはバイト単位）を含むことができる。この値は、クライアント１０２によって予め決められ設定される。実施形態では、MaxSmb2MessageSizeフィールド３１４は、メモリー・バッファー２２２ａの総サイズよりも大きくてはならない。このようにして、ＳＭＢメッセージがメモリー・バッファー２２２ａから溢れなくすることができる。しかしながら、一実施形態によれば、MaxSmb2MessageSizeフィールド３１４は、ユーザーによって決定されるような、メモリー・バッファー２２２ａにおけるメモリー量未満であればよい。
【００４４】
[0052]  図３Ｂに移ると、実施形態によるＳＭＢダイレクト・ネゴシエート応答パケット３３６が示されている。ＳＭＢダイレクト・ネゴシエート応答パケット３３６は、ＲＤＭＡ接続に対するネゴシエーションを完了するためにピア１０６によって送ることができる。ＳＭＢダイレクト・ネゴシエート応答パケット３３６は、以下のフィールドの内１つ以上を含むことができるが、これらに限定されるのではない。例えば、MinVersion３０２ｂ、MaxVersion３０４、PreferredVersion３１８、Reserved３０６ｂ、CreditsRequested３０８ｂ、CreditsGranted３２０ａ、Status３２２、PreferredSendSize３１０ｂ、MaxReceiveSize3１２ｂ、および／またはMaxSMB2MessageSize3１４ｂである。ＳＭＢダイレクト・ネゴシエート応答パケット３３６は、楕円３２４によって表されるように、図３Ｂに示したフィールドよりも多いフィールドまたは少ないフィールドを含むこともできる。
【００４５】
[0053]  実施形態によれば、MinVersionフィールド３０２ｂは、サーバー／受信側１０６がサポートする最も低いＳＭＢダイレクト・プロトコルの値を含む。MaxVersionフィールド３０４ｂは、サーバー／受信側１０６がサポートする最も高いＳＭＢダイレクト・プロトコル・バージョンを格納する。この値は、MinVersionフィールド３０２ｂの値以上であればよい。実施形態では、サーバー／受信側１０６はMinVersionフィールド３０２ｂにおける値とMaxVersionフィールド３０４ｂにおける値との間の範囲にある（含まれる）プロトコル・バージョンの全てをサポートする。PreferredVersionフィールド３１８は、共通ＳＭＢダイレクト・プロトコル・バージョンの値を格納する。PreferredVersionフィールド３１８の値は、実施形態では、クライアントのＳＭＢダイレクト・ネゴシエート要求パケット３００のMinVersionフィールド３０２ａおよびMaxVersionフィールド３０２ｂによって指定される範囲の間である。他の実施形態では、PreferredVersionフィールド３１８の値は、サーバーのＳＭＢダイレクト・ネゴシエート応答パケット３３６のMinVersionフィールド３０２ｂおよびMaxVersionフィールド３０４ｂによって指定される範囲の間である。実施形態によれば、Reservedフィールド３０６ｂは、単に今後の未知の要求のために確保されるフィールドであり、サーバーによって使用されない。
【００４６】
[0054]  CreditsRequestedフィールド３０８ｂは、実施形態によれば、サーバー／受信側１０６がクライアント／要求元１０２に要求している送出クレジット数に対する値を含む。実施形態では、CreditsRequestedフィールド３０８ｂにおける値は、ＳＭＢ２データーを後続のメッセージにおいて確実に送ることができるように、ゼロ（０）よりも大きくなる。しかしながら、CreditsRequestedフィールド３０８ｂにおける値は、任意の数でもよく、平均的な使用に基づいて設定してもよい。代替実施形態では、CreditsRequestedフィールド３０８ｂにおける値は、送ろうとするＳＭＢメッセージのサイズに基づき、または他の係数(factor)に基づいてもよい。実施形態によれば、１つのクレジットが要求されるときに大きなメッセージが送られることがある。CreditsGranatedフィールド３２０ａは、サーバー／受信側１０６からクライアント／要求元１０２に付与されるクレジットの数を含む。実施形態では、CreditsGrantedフィールド３２０ａの値は、クライアント／要求元１０２に次のＳＭＢダイレクト・メッセージを送らせるために、ゼロ（０）よりも大きくなる。
【００４７】
[0055]  実施形態では、ステータス・フィールド３２２は少なくとも１つのフラグまたは値を含む。一実施形態では、ステータス・フィールド３２２は１つまたは２つの値、即ち、ステータス成功またはステータス非サポートを含む。成功フラグは、サーバー／受信側１０６がクライアント／要求元のＳＭＢダイレクト・ネゴシエート要求パケット３００を受け入れたことを示す。非サポート・フラグは、サーバー／受信側１０６がクライアント／要求元１０２のＳＭＢダイレクト・ネゴシエート要求パケット３００を拒否したことを示す。
【００４８】
[0056]  実施形態によれば、PreferredSendSize３１０ｂは、サーバー／受信側１０６がクライアント／要求元１０２に送信できることを望む最も大きなＳＭＢダイレクト・データー転送パケット３３８のサイズ（恐らくはバイト単位）を含むことができる。PreferredSendSize３１０ｂは、実施形態では、ＳＭＢダイレクト・ネゴシエート要求パケット３００におけるMaxReceiveSizeフィールド３１２ａ以下である。つまり、サーバー／受信側１０６によって送られるパケット・サイズは、クライアント／要求元１０２のメモリー・バッファー２２２ａの割り当てよりも大きくてはならない。
【００４９】
[0057]  実施形態では、MaxReceiveSizeフィールド３１２ｂは、サーバー／受信側１０６がクライアント／要求元１０２から受け入れる最も大きなＳＭＢダイレクト・データー転送メッセージのサイズ（恐らくはバイト単位）を含む。この値は、サーバー／受信側１０６が設定するメモリー・バッファー２２２ｂのブロックまたは所定の割り当てに等しくするとよい。つまり、実施形態では、ＳＭＢ２データー転送はこのメモリー割り当てを超過しない。実施形態では、この値は閾値１２８以上である。閾値１２８は、少なくともデーター転送パケットにおけるＳＭＢダイレクト・ヘッダーのサイズである。MaxSmb2MessageSizeフィールド３１４ｂは、サーバー／受信側１０６がクライアント／要求元１０２から受け入れる最も大きなＳＭＢ２プロトコル・メッセージのサイズ（恐らくはバイト単位）を含むことができる。この値は、サーバー／受信側１０６によって予め決められ設定される。実施形態では、MaxSmb2MessageSizeフィールド３１４ｂにおける値は、メモリー・バッファー２２２ｂの全サイズよりも大きくてはならない。このように、ＳＭＢメッセージはメモリー・バッファー２２２ｂから溢れることはない。しかしながら、MaxSmb2MessageSize３１４ｂの値は、一実施形態によれば、ユーザーによって決定されるような、メモリー・バッファー２２２ｂにおけるメモリー量未満であればよい。
【００５０】
[0058]  本明細書において開示する実施形態によるＳＭＢダイレクト・データー転送パケット３３８が、図３Ｃに示されている。ＳＭＢダイレクト・データー転送パケット３３８は、ネゴシエーションの間に作られたＲＤＭＡ接続を介してＳＭＢ２データーを転送するために送ることができる。クライアント／要求元１０２またはサーバー／受信側１０６のいずれも、ＳＭＢ２データーを送信または受信することができる。したがって、クライアント／要求元１０２およびサーバー／受信側１０６を、一般的に受信側および送信側と呼ぶ。ＳＭＢダイレクト・データー転送パケット３３８は、は、以下のフィールドの内１つ以上を含むことができるが、これらに限定されるのではない。例えば、CreditsRequested３０８ｃ、CreditsGranted３２０ｂ、Reserved３０６ｃ、RemainingDataLength３２６、DataOffset３２８、DataLength３３０、および／またはSMB2Data３２２である。ＳＭＢダイレクト・データー転送パケット３３８は、実施形態によれば、楕円３３４によって表されるように、図３Ｃに示したフィールドよりも多いフィールドまたは少ないフィールドを含むこともできる。
【００５１】
[0059]  実施形態では、CreditsRequestedフィールド３０８ｃは、送信側が受信側に要求している送出クレジットの数に対する値を含む。実施形態では、CreditsRequestedフィールド３０８ｃにおける値は、ＳＭＢ２データーを後続のメッセージにおいて確実に送ることができるように、ゼロ（０）よりも大きくなる。しかしながら、CreditsRequestedフィールド３０８ｃにおける値は、任意の数とすることもでき、予測される今後の使用に基づいて、即ち、ＳＭＢ２データーの転送を完了するための追加パケット数に基づいて設定することができる。CreditsGranatedフィールド３２０ｂは、送信側から受信側に付与されるクレジット数を含む。実施形態では、CreditsGrantedフィールド３２０ｂの値はゼロにすることができる。何故なら、ピアはクレジットを求めるピアの要求を引き受けることを強いられないからである。しかしながら、ピアは、クライアント／要求元１０２が次のＳＭＢダイレクト・メッセージを送ることができるようにするために、CreditsGrantedフィールド３２０ｂにおいてクレジットを供給することができる。Reservedフィールド３０６ｃは、本明細書において開示する実施形態によれば、単に今後の未知の要求のために確保されるフィールドであり、サーバーによって使用されない。
【００５２】
[0060]  実施形態では、RemainingDataLengthフィールド３２６は、受信側が未だ受信していない断片化ＳＭＢ２メッセージのバイト数を含むことができる。つまり、このフィールドにおけるゼロ以外の任意の値は、受信側に、他のＳＭＢダイレクト・データー転送パケット３３８が、他のデーターと共に送られることを示す。ＳＭＢダイレクト・データー転送パケット３３８が完全なＳＭＢ２メッセージを伝える場合、または断片化ＳＭＢ２データーを伝える２つ以上のＳＭＢダイレクト・データー転送パケット３３８の内最後のものを伝える場合、RemainingDataLengthフィールド３２６における値は、実施形態によれば、ゼロ（０）になる。ＲＤＭＡは、メッセージを順次送ることができる。したがって、メッセージを再度組み立てることが簡略化される。何故なら、一連のメッセージが、厳格な受信順序で、再度組み立てられるからである。つまり、実施形態は、例えば、ヘッダーにおけるメッセージ識別子、または他のもっと複雑な再組み立て技法の使用の必要性をなくする。
【００５３】
[0061]  一実施形態では、DataOffsetフィールド３２８は、ＳＭＢダイレクト・データー転送パケット３３８の先頭から、カプセル化されたＳＭＢ２プロトコル・メッセージの最初の８バイト整列バイトまでのオフセットに対する値をバイト単位で含む。実施形態では、DataLengthフィールド３３０の値がゼロである場合、DataOffsetフィールド３２８もゼロに設定される。DataLengthフィールドの値がゼロでない場合、DataOffsetフィールド３２８は何らかの値であり、２４バイト以上であるとよい。これは、一実施形態によれば、ヘッダーにおける他のフィールドのサイズである。DataLengthフィールド３３０は、ＳＭＢ2データー・フィールド３３２におけるカプセル化ＳＭＢ２プロトコル・メッセージのサイズを、バイト単位で含む。実施形態では、ＳＭＢダイレクト・データー転送パケット３３８がＳＭＢ２プロトコル・メッセージをカプセル化しない場合、DataLengthフィールド３３０の値はゼロに設定される。ＳＭＢ２データー・フィールドは、実施形態によれば、任意のＳＭＢ２プロトコル・メッセージを含む。
【００５４】
[0062]  本明細書において開示する実施形態によるＳＭＢ２リード・ライト要求３４０が、図３Ｄに示されている。ＳＭＢ２リード／ライト要求３４０は、ダイレクトＲＤＭＡリード／ライトを実行するために、ＳＭＢダイレクト・データー転送パケット３３８にカプセル化することができる。ダイレクトＲＤＭＡリード／ライトは、エンコードされていないアプリケーション・データーのみを送る。本開示の実施形態によれば、ＳＭＢ２リード／ライト要求３４０は、サーバー１０６がＲＤＭＡライトをクライアント１０２に対して実行しようとする場合には、ＳＭＢ２リード要求となることができ、サーバー１０６がクライアントからのＲＤＭＡリードを実行しようとする場合には、ＳＭＢ２リード要求となることができる。いずれの場合でも、ＳＭＢ２リード／ライト要求３４０におけるフィールドは同様である。尚、サーバー１０６は、クライアント１０２が要求したＲＤＭＡ転送を実行することは注記してしかるべきである。ＳＭＢ２リード／ライト要求３４０は、以下のフィールドの内１つ以上を含むことができるが、これらに限定されるのではない。例えば、Channel３４２、ChannelInfoOffset３４６、およびChannelinfolength３４８である。一実施形態では、これらのフィールドは、ＲＤＭＡデーター転送を完了するための誘導(steering)情報を含むことができる。Reservedフィールド３４４は、一実施形態によれば、今後の未知の要求のために確保されるフィールドであり、使用されない。ＳＭＢ２リード／ライト要求３４０は、楕円３５１によって表されるように、図３Ｄ示したフィールドよりも多いフィールドまたは少ないフィールドを含むこともできる。図示したフィールドは、例示の目的に限って提示されたのであり、限定することを意図するのではない。
【００５５】
[0063]  実施形態では、Channelフィールド３４２は、データーを発見しようとするチャネルに対する値を含む。ＲＤＭＡ接続は、様々なチャネルを含むことができる。チャネル情報は、実施形態によれば、転送を遂行するためにピアがＲＤＭＡデバイスに提供する情報を含むことができる。例えば、チャネル情報は、図３Ｅに示すように、１つ以上のトークン、オフセット、メモリー・セグメントの長さを、他のＲＤＭＡ特定情報と共に含むことができる。
【００５６】
[0064]  一実施形態では、ChannelInfoOffsetフィールド３４６およびChannelInfoLengthフィールド３４８は、データー・パケットにおけるオフセット、トークン、および長さ情報に対するポインタである。これらのポインタは、ＳＭＢ２リードまたはライト要求において、情報を突き止めることができる位置を与える。実施形態では、フラグ３５０は、ＲＤＭＡダイレクト・データー転送の挙動を制御するまたは変化させる任意の情報を含む。
【００５７】
[0065]  図３Ｅに移ると、本明細書において開示する実施形態によるＲＤＭＡチャネル記述子３５２が示されている。ＲＤＭＡチャネル記述子３５２は、ＳＭＢダイレクト要求内に、通例ではチャネル・フィールド３４２にカプセル化することができる。ＲＤＭＡチャネル記述子３５２は、以下のフィールドの内１つ以上を含むことができるが、これらに限定されるのではない。例えば、オフセット３５４、トークン３４６、および長さ３５８である。一実施形態では、これらのフィールドはＲＤＭＡデーター転送を完了するための誘導情報である。ＲＤＭＡチャネル記述子３５２は、楕円３６０によって表されるように、図３Ｅに示したフィールドよりも多いフィールドまたは少ないフィールドを含むこともできる。図示したフィールドは、例示の目的に限って提示されたに過ぎない。ダイレクト・データー転送を完了するために、チャネル・フィールド３４２における情報に基づいて、読み取られるデーターまたは書き込まれるデーターおよびデーターの長さと共に、ＲＤＭＡをメモリーに導く。ダイレクト・データー転送はアプリケーション・データーのみを送るので、この情報は適正な転送を確保するのに役立つ。
【００５８】
[0066]  一実施形態によれば、オフセット３５４は、バイトまたはビット単位の値であり、そこからデーターが開始する。オフセット３５４は、メモリー・ブロックの開始アドレスから測定することができる。開始アドレスは、トークン３５６内に設けられる情報を用いて突き止めることができる。長さ３５８は、ビットまたはバイト単位の値であり、データー・セグメントの長さである。この誘導情報は、例えば、ダイレクト・データー転送を案内する。
【００５９】
[0067]  図２Ａおよび図２Ｂに示した種々のソフトウェア機能モジュールの相互作用を、図４Ａから図４Ｃに示す動作ステップ４００において、本明細書において開示する実施形態にしたがって、ＲＤＭＡ接続をネゴシエートすることについて更に例示する。図４Ａは、本開示の実施形態による、クライアント１０２とサーバー１０６との間におけるパケット４０８および４２４の転送の図４００Ａを示す。図４Ｂは、本開示の実施形態にしたがって、クライアント１０２の観点から示し、一方図４Ｃはサーバー１０６の観点から示す。尚、プロセス４００は、クライアントがＲＤＭＡ接続を要求し、サーバー１０６が応答するときについて説明することは注記してしかるべきである。しかしながら、実施形態によれば、逆も成り立つことができ、その場合、サーバー１０６が要求し、クライアントが応答する。更に、本方法は、例えば、複数のクライアント間、および／または複数のサーバー間でも行うことができる。
【００６０】
[0068]  図４Ｂに移ると、一実施形態にしたがって、ＲＤＭＡによってＳＭＢ２を使用して接続をネゴシエートする動作ステップ例４００Ｂが示されている。プロセス４００Ｂは、START動作４０２Ｂにおいて開始し、プロセス４００Ｂは先に進んで、クライアントが受信をプリポストする（pre-post)（４０４）。実施形態では、ＲＤＭＡインターフェース２１６ａは自動的にＲＮＩＣ１０８ａ／１０８ｂを検出および利用して、これらが利用可能であり適正に構成されていることを確認する。次に、一実施形態では、ＳＭＢダイレクトＮＰＩがＳＭＢダイレクト・モジュール２１４によって露出される。ＳＭＢダイレクト・クライアント２１４ａは、ＲＤＭＡアダプターへのハンドルを開いて、ＳＭＢ２クライアント２０８に対するＲＤＭＡ接続を形成することができる。一実施形態では、ＳＭＢダイレクト・クライアント２１４ａは、次に、ＲＤＭＡインターフェース２１６ａを介して、ＲＤＭＡ接続を要求する。また、ＳＭＢダイレクト・クライアント２１４ａは、メモリー・バッファー２２２ａにおいて割り当てを作り、最初の送出クレジットに対して何を要求するか、そして受信クレジットに対して何が許可されるか決定することができる。メモリー・バッファー２２２ａにおける割り当ては、実施形態では、所定のサイズにすることができる。実施形態によれば、メモリー・バッファー２２２ａにおけるメモリーの総量も、決定することができる。
【００６１】
[0069]  図４Ｂに戻って、ＳＭＢダイレクト・クライアント２１４ａは、次に、ＲＤＭＡインターフェース２１６ａに送るために、ＳＭＢダイレクト・ネゴシエート要求パケット３００を組み立てる(construct)ことができる。例えば、ＳＭＢダイレクト・ネゴシエート要求パケット３００は、図３Ａにおいて説明した通りである。したがって、ＳＭＢダイレクト・クライアント２１４ａは、ＳＭＢダイレクト・ネゴシエート要求パケット３００におけるフィールドを設定する。つまり、ＳＭＢダイレクト・クライアント２１４ａは、クライアント１０２がサポートすることができるＳＭＢダイレクトの最低および最高バージョンを判定する。ＳＭＢダイレクト・クライアント２１４ａは、要求するクレジットの数を決定する。実施形態では、要求するクレジットの数は、送られることが分かっている今後のＳＭＢメッセージ、今後起こり得る予測ＳＭＢトラフィック、ＳＭＢの過去の使用に基づくことができ、または何らかの他の方法によることができる。送信サイズは、内部関数および速度の考慮によって決定される。最大受信サイズは、メモリー・バッファー割り当てのサイズに一定させる(peg)ことができる。最後に、最大ＳＭＢメッセージ・サイズが決定され設定される（一般に、最大ＳＭＢメッセージ・サイズは、ピアが大きなＳＭＢ２パケットを送ることができる十分な大きさであるが、全てのメモリーを使用する程の大きさではない）。この収集した情報は、本開示の実施形態によれば、ＳＭＢダイレクト・ネゴシエート要求パケット３００に入力される。
【００６２】
[0070]  次に、ＳＭＢダイレクト・クライアント２１４ａはＳＭＢダイレクト・ネゴシエート要求パケット３００を送る（４０８Ｂ）。一実施形態では、ＳＭＢダイレクト・クライアント２１４ａは、送出動作によってＳＭＢダイレクト・ネゴシエート要求パケット３００を送ることを、ＲＤＭＡインターフェース２１６ａに要求する。ＲＤＭＡインターフェース２１６ａは、ＲＤＭＡインターフェース２１６ｂと通信し、ＳＭＢダイレクト・ネゴシエート要求パケット３００をサーバー１０６に送る。ＳＭＢダイレクト・ネゴシエート要求パケット３００の送信と共に、ＳＭＢダイレクト・クライアント２１４ａは、ネゴシエーション要求満了タイマー３１０を起動する。ネゴシエーション要求満了タイマーは、所定の値を有することができ、その値からゼロまでカウント・ダウンする。ＳＭＢダイレクト・クライアント２１４ａは、次に、ＳＭＢダイレクト・ネゴシエート要求パケット３００に対する応答を待つ。ＳＭＢダイレクト・ネゴシエート要求パケット３００に対する応答を受信する前にネゴシエーション要求満了タイマーが満了したと判断した場合（４１１）、プロセス４００ＢはＮＯからＥＮＤ動作４３２Bに進み、接続が落とされる。
【００６３】
[0071]  図４Ｃに移り、開始動作４０２Ｃにおいて、実施形態では、サーバー１０６はＳＭＢダイレクト・ネゴシエート要求パケット３００を予想し、受信４１２をプリポストする。実施形態によれば、ＳＭＢ２サーバー２１２ｂは、アクティビティ(activity)を傍聴し、自動的に、ＲＤＭＡが入手可能でありＲＮＩＣ１０８ｂのポートに繋がれている(bound)ことを発見することができる。ＳＭＢ２サーバー２１２ｂは、リスナー・エンドポイントを開き、ＲＤＭＡがＲＮＩＣ１０８ｂにおいて入手可能であると判断する。次に、ＳＭＢ２サーバー２１２ｂはＳＭＢダイレクト・サーバー２１４ｂとの通信を開始する。ＳＭＢダイレクト・サーバー２１４ｂは、ＲＤＭＡ接続を開き、ＲＤＭＡアダプター・ハンドルを受信することができる。ＳＭＢダイレクト・サーバー２１４ｂは、次に、ＲＤＭＡインターフェース２１６ｂを介して、ＲＤＭＡ接続を要求する。次いで、ＳＭＢダイレクト・サーバー２１４ｂはＲＤＭＡ接続を受け入れることができ、これによってクライアント１０２に、接続要求が成功したことを知らせる。このＲＤＭＡインターフェース２１６ａからの成功の指示が、クライアントにネゴシエート要求を送らせる。
【００６４】
[0072]  また、ＳＭＢダイレクト・サーバー２１４ｂは、メモリー・バッファー２２２ｂにおいて割り当てを作り、最初の送出クレジットに対して何を要求するか、そして受信クレジットに対して何が許可されるか決定することができる。メモリー・バッファー２２２ｂにおける割り当ては、実施形態では、所定のサイズにすることができる。実施形態によれば、メモリー・バッファー２２２ｂにおけるメモリーの総量も、決定することができる。
【００６５】
[0073]  図４Ｃに戻り、ＳＭＢダイレクト・サーバー２１４ｂは、次に、ネゴシエーション要求満了タイマー４１４を起動することができる。サーバー１０６におけるネゴシエーション要求満了タイマーは、実施形態では、所定の値を有することができ、その値からゼロまでカウント・ダウンする。ＳＭＢダイレクト・サーバー２１４ｂは、次に、ＳＭＢダイレクト・ネゴシエート要求パケット３００を受信するのを待つ。待っている間、ＳＭＢダイレクト・サーバー２１４ｂはＲＤＭＡ接続を監視し、ＳＭＢダイレクト・ネゴシエート要求パケット３００を受信する前にネゴシエーション要求満了タイマーが満了したか否か判断する（４１６）。ネゴシエーション要求タイマーが満了した場合、プロセス４００ＣはＮＯからＥＮＤ動作４３２Ｃに進み、接続が落とされる。
【００６６】
[0074]  しかしながら、ネゴシエーション要求満了タイマーの満了前にＳＭＢダイレクト・ネゴシエート要求パケット３００がＲＮＩＣ１０８ｂおよびＲＤＭＡインターフェース２１６ｂに到達した場合、プロセス４００ＣはＹＥＳに進み、４０８ＣにおいてＲＤＭＡインターフェース２１６ｂによって、ＳＭＢダイレクト・ネゴシエート要求パケット３００を受信して有効性を確認し、このパケットをメモリー・バッファー２２２ｂに入れる。次に、ＳＭＢダイレクト・サーバー２１４ｂは、このデーターが知らされ、ＳＭＢダイレクト・ネゴシエート要求パケット３００が有効か否か判断する（４１８）。
【００６７】
[0075]  実施形態では、ＳＭＢダイレクト・ネゴシエート要求パケット３００の有効性を判断するために、ＳＭＢダイレクト・サーバー２１４ｂはＳＭＢダイレクト・ネゴシエート要求パケット３００からデーターを読み出し、以下のことを判定する。例えば、MaxVersionフィールド３０４の値がMinVersionフィールド３０２の値未満か否か、またはその範囲における値がサポートされるか否か、CreditsRequestedフィールド３０８の値がゼロか否か、MaxReceiveSizeフィールド３１２の値が所定の閾値（例えば、１２８バイト）未満か否か、あるいはMaxSmb2MessageSizeフィールド３１４の値が所定の閾値未満か否か判定する。以上の内いずれかが真である場合、ＳＭＢダイレクト・ネゴシエート要求パケット３００は有効でなく、プロセス４００ＣはＮＯからＥＮＤ動作４３２Ｃに進み、ＳＭＢダイレクト・サーバー２１４ｂは切断する。チェックの全てが真でない場合、プロセス４００ＣはＹＥＳに進んでＳＭＢダイレクト応答４２０を処理し、ＳＭＢダイレクト・ネゴシエート要求パケット３００がＳＭＢダイレクト・クライアント２１４ａに、ＳＭＢダイレクト・サーバー２１４ｂによって送られる。
【００６８】
[0076]  ＳＭＢダイレクト・ネゴシエート要求パケット３００を処理するとき、実施形態では、ＳＭＢダイレクト・サーバー２１４ｂはsettingProtocolVersionを、クライアント１０２およびサーバー１０６によって共有される最高プロトコル・バージョンに等しく設定する。また、ＳＭＢダイレクト・サーバー２１４ｂは付与するクレジット数も決定する。付与するクレジット数は、実施形態では、メモリー・バッファー２２２ｂにおいて利用可能な空間または他の要因に依存する。これらの決定を行った後、ＳＭＢダイレクト・サーバー２１４ｂはＳＭＢダイレクト・ネゴシエート応答パケット３３６を生成する（４２２）。一実施形態では、ＳＭＢダイレクト・サーバー２１４ｂはＳＭＢダイレクト・ネゴシエート応答パケット３３６におけるフィールドを設定する。例えば、PreferredVersionフィールドは、settingProtocolVersionにおける値に設定される。CreditsGranted３２０ａは、一実施形態によれば、ＳＭＢダイレクト・サーバー２１４ｂによって決定されたクレジット数に設定される。他のフィールドも、ＳＭＢダイレクト・ネゴシエート要求パケット３００と同様に満たされる。次いで、ＳＭＢダイレクト・ネゴシエート応答パケット３３６は、クライアントに送られる（４２４Ｃ）。実施形態では、ＳＭＢダイレクト・サーバー２１４ｂはＳＭＢダイレクト・ネゴシエート応答パケット３３６を送るために、ＲＤＭＡインターフェース２１６ｂに送る。
【００６９】
[0077]  図４Ｂに戻り、ＳＭＢダイレクト・クライアント２１４ａは、実施形態によれば、ネゴシエート満了タイマーの満了の前に応答が受信されたか否か判断する（４１１）。タイマーの満了前に応答が受信された場合、プロセス４００ＢはＹＥＳに進み、ＳＭＢダイレクト・ネゴシエート応答パケット３３６の有効性を判断する。ＳＭＢダイレクト・ネゴシエート応答パケット３３６の有効性を判断するために、ＳＭＢダイレクト・クライアント２１４ａは以下のことを判定する。例えば、本開示の実施形態によれば、ステータス・フィールド３２２がSTATUS_SUCCESSではないか否か、PreferredVersionフィールド３１８が、クライアントのＳＭＢダイレクト・ネゴシエート要求パケット３００のMinVersionフィールド３０２とMaxVersionフィールド３０４によって指定された範囲内の値を含むか否か、CreditsRequestedフィールド３０８ｂがゼロか否か、CreditsGrantedフィールド３２０ａがゼロか否か、PreferredSendSizeフィールド３１０ｂが、クライアントのＳＭＢダイレクト・ネゴシエート要求パケット３３０のMaxReceiveSizeフィールド３１２によって指定される値よりも大きいか否か、またはMaxReceiveSizeフィールド３１２ｂが所定の閾値（例えば、１２８バイト）未満か否かについて判定する。以上の内いずれかが真である場合、ＳＭＢダイレクト・ネゴシエート応答パケット３３６は有効ではなく、プロセス４００ＢはＮＯからＥＮＤ動作４３２Bに進み、ＳＭＢダイレクト・クライアント２１４ａは切断する。これらのチェックの全てが真でない場合、プロセス４００ＢはＹＥＳに進み、ＳＭＢダイレクト応答４３０を処理する。ここで、本明細書において開示する実施形態にしたがって、ＳＭＢダイレクト・ネゴシエート応答パケット３３６がＳＭＢダイレクト・クライアント２１４ａによって処理される。
【００７０】
[0078]  ＳＭＢダイレクト・ネゴシエート応答パケット３３６を処理するとき、ＳＭＢダイレクト・クライアント２１ａは以下のことを完了する。例えば、実施形態では、設定２２６における接続のPeerTargetSendCreditsCount設定を、CreditsRequestedフィールド３０８ｂに等しく設定する。ＳＭＢダイレクト接続プロパティにおける接続のSendCreditsCount設定を、CreditsGrantedフィールド３２０ａに等しく設定する。設定２２６における接続のMaxSendSize設定を、MaxReceiveSizeフィールド３１２ｂに設定する。設定２２６における接続のReceiveSize設定をPreferredSendSizeフィールド３１０ｂに設定する。設定２２６における接続のMaxOutboundFragmentedMessageSize設定を、MaxReceiveSizeフィールド３１２ｂに等しく設定する。そして、接続のアイドル接続タイマーを、所定の時間量（例えば、数時間、数分等）の後満了するように設定し、このタイマーを起動する。一旦以上のステップが実行されたなら、ＲＤＭＡ接続ネゴシエーションは完了し、クライアント１０２およびサーバー１０６は、ＳＭＢダイレクト・データー転送パケットを交換し始めることができる。次いで、プロセス４００ＢはＥＮＤ動作４３２Ｂにおいて終了する。
【００７１】
[0079]  図２Ａおよび図２Ｂにおいて示した種々のソフトウェア機能モジュールの相互作用を、図５Ａから図５Ｄに示す動作ステップ５００において、本明細書において開示する実施形態にしたがって、作られたＲＤＭＡ接続を介してＳＭＢ２データーを交換する場合について更に例示する。本開示の実施形態によれば、要求および応答通信において、ＳＭＢ２データーは、ＳＭＢ２データーをＳＭＢダイレクト・データー転送パケット３３８のデーター・ペイロードとしてカプセル化することによって、クライアント１０２とサーバー１０６との間で作られたＳＭＢダイレクト接続を介して送信される。要求および応答通信は、例えば、制御チャネル通信、ファイル・メタデーターの交換、または他のプロセスのために使用することができる。図５Ａは、本開示の実施形態による、クライアント（１つまたは複数）１０２とサーバー（１つまたは複数）１０６との間におけるパケット５１６／５１８、５３０、５３２、および５４６の図を示す。図５Ｂおよび図５Ｃは、クライアント１０２の観点から示し、一方図５Ｄはサーバー１０６の観点から示す。尚、プロセス５００は、クライアントがＳＭＢ３データーをサーバー１０６に、独立してまたはサーバーからの要求に応答して送るときについて説明することは注記してしかるべきである。しかしながら、逆も成り立つことができ、その場合サーバー１０６が要求に応答し、データーをクライアント１０２に返送する。つまり、ここに記載するプロセスは、実施形態では、サーバーが要求を送りクレジットを要求する場合にも該当する。更に、本方法は、例えば、複数のクライアント間または複数のサーバー間でも行うことができる。
【００７２】
[0080]  図５Ｂに移ると、本明細書において開示する実施形態にしたがって、ＳＭＢ２を使用してＲＤＭＡによってデーターを交換する動作ステップ例５００Ｂが示されている。開始動作５０２が開始され、プロセス５００Ｂは先に進んで、クライアント１０２がＲＤＭＡ接続５０４を作る。ＲＤＭＡ接続を作ることについては、本開示の実施形態にしたがって、図４Ａから図４Ｃに関して説明することができる。一実施形態では、ＳＭＢダイレクト・クライアント２１４ａが様々な接続プロパティを設定する。これには、MaxSendSIze設定を、MaxReceiveSizeフィールド３１２ｂに設定し、接続のReceiveSize設定をPreferredSendSizeフィールド３１０ｂに設定し、そして 設定２２６における接続のMaxOutboundFragmentedMessageSize設定を、MaxReceiveSizeフィールド３１２ｂに等しく設定することを含む。このように、クライアント１０２は、実施形態にしたがって、サーバー１０６に送ることができるパケットのサイズを決定した。
【００７３】
[0081]  図５Ｂに戻り、ＳＭＢダイレクト・クライアント２１４ａは、実施形態にしたがって、ＳＭＢ２メッセージをサーバー１０６に移送するために必要となるＳＭＢダイレクト・データー転送パケットの数を決定することができる。この決定を行うために、ＳＭＢダイレクト・クライアント２１４ａは、最初に、ネゴシエーションの間に設定されたMaxSendSize（Ｒで示す）を引き出すことができる。次に、ＳＭＢダイレクト・クライアント２１４ａは、送られるＳＭＢ２プロトコル・メッセージ（１つまたは複数）のサイズを決定することができる。実施形態では、この値を「Ｓ」として設定する。また、ＳＭＢダイレクト・クライアント２１４ａは、ＳＭＢダイレクト・データー転送パケット３３８のヘッダーおよびＳＭＢダイレクト・データー転送パケット３３８のペイロードが８バイト整列境界から始まるようにするためのパディング（例えば、DataOffset３２８等）によって消費されるバイト数（実施形態ではＰで示す）を決定する。実施形態では、ＳＭＢダイレクト・クライアント２１４ａは、次に、Ｓが（Ｒ−Ｐ）以下であるか否か判定を行い、そうである場合、実施形態によれば、Ｓを（Ｒ−Ｐ）で除算することによって、パケット数を決定することができる。
【００７４】
[0082]  次いで、プロセス５００Ｂは先に進んで、ＳＭＢダイレクト・クライアント２１４ａによって、断片化(fragmentation)が使用されるか否か判断する（５１０）。一実施形態では、断片化が使用されるのは、ＳＭＢ２プロトコル・メッセージが１つのＳＭＢダイレクト・データー転送パケット３３８に「収まらない」ときである。言い換えると、Ｓが（Ｒ−Ｐ）よりも大きいか？となる。断片化が使用されない場合、プロセス５００ＢはＮＯに進んで、１つのＳＭＢダイレクト・データー転送パケット５１８Ｂを送る。一方、断片化が使用される場合、プロセス５００ＢはＹＥＳに進み、送信バッファー・バイト５１２を初期化する。
【００７５】
[0083]  ステップ５１８に戻り、実施形態によれば、ＳＭＢ２プロトコル・メッセージを断片化せずに送信することもできる。パケットを送信するために使用されるメモリー・バッファー２２２ａの一部が初期化される。実施形態では、最初のＰバイトは、ＳＭＢダイレクト・データー転送パケット３３８についてのヘッダー情報を設定するため、そしてＳＭＢ２ペイロードが確実に８バイトに整列されるためにゼロのパディング・バイトを追加するために初期化される。つまり、実施形態によれば、バッファーにおいて、DataOffsetフィールド３２８がＰに設定され、DataLengthフィールドがＳに設定され、RemainingDataLengthフィールド３２６がゼロ（０）に設定される。クレジットについての情報、またはその要求が、CreditsRequestedフィールド３０８ｃまたはCreditsGrantedフィールド３２０ｂに格納される。つまり、クライアント１０２はＳＭＢダイレクト・データー転送パケット３３８においてより多くのクレジットを要求または付与することができる。実施形態では、ＳＭＢダイレクト・データー転送パケットの送信側は、CreditsRequestedフィールドを少なくとも１に設定しなければならない。次のＳバイトはメモリー・バッファー２２２ａにおいて初期化され、ＳＭＢ２プロトコル・メッセージがＳＭＢ２データー・フィールド３３２に格納される。ＳＭＢダイレクト・データー転送パケット３３８が組み立てられた後、ＳＭＢダイレクト・クライアント２１４ａは、ＲＤＭＡ接続を介してサーバー１０６に送るために、パケットをＲＤＭＡインターフェース２１６ａに送る（５１８Ｂ）。次いで、プロセス５００Ｂはページ・コネクタＢ４２２を通りＥＮＤ動作５４８Cに進み、プロセス５００Ｂは終了する。
【００７６】
[0084]  ステップ５１２に戻り、実施形態によれば、Ｓが（Ｒ−Ｐ）よりも大きい場合、ＳＭＢ２プロトコル・メッセージは２つ以上の部分に分割される。これらの部分は、次に、一連のＲＤＭＡ送信動作において順次送られる。送信動作の各々は、ＳＭＢ２プロトコル・メッセージの一部（断片と呼ぶ）を伝える。ＳＭＢ２プロトコル・メッセージを断片に分割するために、第１ペイロードのサイズをＸに設定する。これは（Ｒ−Ｐ）以下である。Ｘは、一実施形態によれば、少なくとも第１ＲＤＭＡ送信動作によって送られるＳＭＢ２プロトコル・メッセージのバイト数を表す。ステップ５１８Ｂと同様、パケットを送信するために使用されるメモリー・バッファー２２２ａの一部が初期化される。実施形態では、最初のＰバイトが、ＳＭＢダイレクト・データー転送パケット３３８についてのヘッダー情報およびパディング・バイトを設定するために初期化される。次に、DataOffsetフィールド３２８がＰに設定され、DataLengthフィールド３３０がＸに設定され、RemainingDataLengthフィールド３２６が（Ｓ−Ｘ）に設定される（５１４）。実施形態では、RemainingDataLengthフィールド３２６は、ＳＭＢ２プロトコル・メッセージの内送信されずに残っているバイト数を示す。実施形態では、ＳＭＢ２プロトコル・メッセージの最後の断片が送信されると、（Ｓ−Ｘ）はゼロ（０）になる。最後のパケットにおいて、RemainingDataLengthフィールド４２６がゼロに設定され、ＳＭＢダイレクト・データー転送パケット３３８がＳＭＢ２プロトコル・メッセージの最後の断片を伝えることを示す。クレジットについての情報、またはその要求が、CreditsRequestedフィールド３０８ｃまたはCreditsGrantedフィールド３２０ｂに格納される。つまり、実施形態では、クライアント１０２はＳＭＢダイレクト・データー転送パケット３３８においてより多くのクレジットを要求または付与することができる。次いで、メモリー・バッファー２２２ａの次のＸバイトが初期化される。次いで、本明細書において開示する実施形態によれば、ＳＭＢ２プロトコル・メッセージの断片をＳＭＢ２データー・フィールド３３２に格納することができる。
【００７７】
[0085]  ＳＭＢ２プロトコル・メッセージの最初の未送信ＸバイトでＳＭＢダイレクト・データー転送パケット３３８を組み立てた後、ＳＭＢダイレクト・データー転送パケット３３８がサーバーに送られる（５１６Ｂ）。実施形態では、ＳＭＢダイレクト・クライアント２１４ａは、ＲＤＭＡ接続を介してサーバー１０６に送るために、ＳＭＢダイレクト・データー転送パケット３３８をＲＤＭＡインターフェース２１６ａに送る（５１６Ｂ）。次いで、プロセス５００Ｂはページ・コネクタＡ５２０を介して任意ステップ５２６に進み、ＳＭＢダイレクト・クライアント２１４ａは、他の断片を含む他のＳＭＢダイレクト・データー転送パケット３３８を送らなければならないか否か判断する。つまり、実施形態では、ＳＭＢダイレクト・クライアント２１４ａは、最後のパケットを送った後、（Ｓ−Ｘ）が０であるか否か判定を行う。（Ｓ−Ｘ）が０以下である場合、最後の断片が最後のＳＭＢダイレクト・データー転送パケット３３８において送られたことを意味し、プロセス５００ＢはＮＯからＥＮＤ動作５４８Cに進み、プロセス５００Ｂは終了する。しかしながら、（Ｓ−Ｘ）が０よりも大きい場合、プロセス５００ＢはＹＥＳに進み、十分な送出クレジットが存在するか否か判断する（５２８）。実施形態では、ステップ５２６は任意であってもよい（図示のように）。何故なら、断片を移送するＳＭＢダイレクト・データー転送パケット３３８はメモリー・バッファー２２２ａに予め結集されて (pre-stage) おり、順次送ることができるからである。バッファー２２２ａが空である場合、プロセス５００Ｂは終了する。この場合、次のパケットを送らなければならないか判断する必要がなくなる。尚、実施形態によれば、ＳＭＢ２プロトコル・メッセージが断片化されるとき、断片を伝えるＲＤＭＡ送信動作は順次そして単調に送られ、断片化されたＳＭＢ２プロトコル・メッセージに関係ない他のＲＤＭＡ送信動作によって中断させらずに済むことは注記してしかるべきである。一実施形態によれば、受信側におけるＲＤＭＡ移送順序は、受信側ピアが元のメッセージを再現できるように、断片のシーケンス処理を保存する。
【００７８】
[0086]  ステップ５２８に戻って、ＳＭＢダイレクト・クライアント２１４ａは、次の断片を送るための十分な送出クレジットがあるか否か判断する（５２８）。本質的に、ＳＭＢダイレクト・クライアント２１４ａは、１つの送出クレジットが残っているか否か判断する。送出クレジットがある場合、プロセス５００ＢはＹＥＳから、ページ・コネクタＣ５２４を介してステップ５１２に進む。実施形態では、ＲＤＭＡ移送は、送信側がパケットを送ることができる前に、受信側によってプリポストされた受信バッファーを有する。この規則は、受信側が受信をプリポストする前に送信側がパケットを送ろうとしないことを確保するために、送信側と受信側との間で調整が必要となる。ＳＭＢダイレクトは、本開示の実施形態によれば、所望の調整を達成するために、送信Creditsのシステムを使用する。
【００７９】
[0087]  一実施形態では、サーバー１０６またはクライアント１０２から付与される送出クレジットは、サーバー１０６またはクライアントにおいてプリポストされた１つの受信を表す。ピアは、１つの送出クレジットで１回のＲＤＭＡ送信動作を実行する資格がある。また、クライアント１０２は、CreditsRequestedフィールド３０８ｃを設定することによってまたは別の送出クレジット要求（一実施形態によれば、断片化ＳＭＢ２データーを移送する１組のＳＭＢダイレクト・データー転送パケット３３８の間には送られない）の形態で、クライアントがその作業負荷を効率的サポートするために必要な送出クレジット数についての情報をサーバー１０６に提供する。送出クレジットは、ＳＭＢダイレクト・データー転送パケット３３８のCreditsGrantedフィールド３２０ｂにおいて付与される。つまり、ＳＭＢダイレクト・クライアント２１４ａは、CreditsRequestフィールド３０８ｃにおける値を更に大きな数に設定することによって（恐らくは全ての今後の断片化パケットをカバーする）、より多くの送出クレジットを要求することができる。次いで、ＳＭＢダイレクト・クライアント２１４ａは、サーバー１０６から送られるＳＭＢダイレクト・データー転送パケット３３８を待つことによって、送出クレジットを受信するのを待てばよい（５３０Ｃ）。一実施形態によれば、このパケット３３８はデーターを有さないが、ＳＭＢダイレクト・データー転送パケット３３８のCreditsGrantedフィールド３２０ｂに送出クレジットを含む。ＳＭＢダイレクト・クライアント２１４ａは、クエリー５４２Ｃにおいて、タイマー２２４ａにおいてSendCreditsGrantedTimerを設定することによって、クレジットが受信されたか否か判断することができる。クレジットが付与される前にSendCreditsGrantedTimerが満了した場合（５４７）、プロセス５００ＢはＹＥＳからページ・コネクタＣ５２４を介してステップ５２３に進む。一実施形態によれば、タイマーが設定されない場合および／またはタイマーが満了していない場合（５４７）、プロセス５００ＢはＮＯに進み、送信動作を行わないのではなく、即ち、終了せず、代わりに送出クレジットを受信するのを待ち続ける（５３０Ｃ）。
【００８０】
[0088]  図５Ｄおよびプロセス５００Ｄの開始動作５０２Ｄに移り、サーバー１０６において、ＳＭＢダイレクト・データー転送パケット３３８が受信される（５１６Ｄ）。一実施形態では、ＲＤＭＡインターフェース２１６ｂがＳＭＢダイレクト・データー転送パケット３３８を受信し、それをＳＭＢダイレクト・サーバー２１４ｂに送る。最初に、ＳＭＢダイレクト・サーバー２１４ｂはヘッダー情報を読み取る。ＳＭＢダイレクト・サーバー２１４ｂは、クエリー５３６に進み、RemainingDataLengthフィールド３２６がゼロ以外の何かであるか否か判断する。RemainingDataLengthフィールド３２６がゼロである場合、ＳＭＢダイレクト・データー転送パケット３３８は唯一のパケットとなり、プロセス５００ＤはＮＯに進み、ＳＭＢパケット・データー５５４を処理する。ここで、一実施形態では、ＳＭＢダイレクト・サーバー２１４ｂは、パケット・データーを処理し、ＳＭＢ２プロトコル・メッセージをＳＭＢ２サーバー２１２ｂに送る。RemainingDataLengthフィールド３２６がゼロ以外の何かである場合、プロセス５００ＤはＹＥＳに進み、再度組み立てバッファーを割り当てる（５３８）。
【００８１】
[0089]  ステップ５３８において、ＳＭＢダイレクト・サーバー２１４ｂは、一実施形態では、バッファー２２２ｂにおいてＳＭＢ２プロトコル・メッセージを再度組み立てるために、メモリー・バッファー２２２ｂの一部を割り当てる。つまり、ＳＭＢダイレクト・サーバー２１４ｂは、現在のＳＭＢダイレクト・データー転送パケット３３８および次に来るＳＭＢダイレクト・データー転送パケット３３８におけるデーターを受け入れるために、メモリー・バッファー２２２ｂにおいて十分なブロックを割り当てることができる。これは、DataLengthフィールド３３０の値およびRemainingDataLengthフィールド３２６の値に基づく。本開示の実施形態によれば、ＳＭＢダイレクト・サーバー２１４ｂは、次いで、ＳＭＢ２データーをＳＭＢ２データー・フィールド３３２から読み出し、このデーターを、割り当てられたバッファー５４０にコピーすることができる。
【００８２】
[0090]  次に、一実施形態では、ＳＭＢダイレクト・サーバー２１４ｂが次のＳＭＢダイレクト・データー転送パケット３３８を待ち、そして受信する（５４６Ｄ）ことに備える。一実施形態では、ＳＭＢ２データー・フィールド３３２におけるデーターは、メモリー・バッファー２２２ｂの次の部分にもコピーされる。代替実施形態では、ＳＭＢダイレクト・サーバー２１４ｂは、任意に、この次のＳＭＢダイレクト・データー転送パケット３３８が断片化データー５４２を含む最後のパケットであるか否か判断することができる。この判断を行うために、ＳＭＢダイレクト・サーバー２１４ｂは、RemainingDataLengthフィールド３２６がゼロであるか否かチェックする。RemainingDataLengthフィール３２６がゼロである場合、ＳＭＢダイレクト・サーバー２１４ｂは、これ以上のパケットが受信されないことを理解し、プロセス５００ＤはＹＥＳに進み、メモリー・バッファー２２２ｂからのＳＭＢ２プロトコル・メッセージ５４４を処理する。次いで、プロセス５００ＤはＥＮＤ動作において終了する（５４８Ｄ）。一方、RemainingDataLengthフィールド３２６がゼロ以外の何かである場合、一実施形態によれば、ＳＭＢダイレクト・サーバー２１４ｂは、他のパケット（１つまたは複数）が受信されることを理解し、プロセス５００ＤはＮＯに進み、次のＳＭＢダイレクト・データー転送パケット３３８を受信する（５４６Ｄ）。
【００８３】
[0091]  図２Ａおよび図２Ｂに示した種々のソフトウェア機能モジュールの相互作用について、図６に示す動作ステップ６００において、本明細書に開示する一実施形態にしたがってＲＤＭＡダイレクト・データー転送を実行することについて、更に例示する。図６は、本開示の実施形態による、クライアント１０２とサーバー１０６との間におけるデーター転送の図を示す。
【００８４】
[0092]  図６に示すように、プロセス６００は開始動作６０２において開始され、ＳＭＢ２クライアント２０８がＳＭＢ２リード／ライト要求３４０を作る（６０４）。アプリケーション２２０は、データーをサーバー１０６に転送すること、またはサーバー１０６から読み出すことを要求することができる。このデーター転送は、本開示の実施形態によれば、ＳＭＢ２サーバー１０６が一意に実際のＲＤＭＡ要求を実行するように、ＲＤＭＡダイレクト・データー転送を採用することを、ＳＭＢ２クライアント２０８によって指示することができる。この転送を始めるために、ＳＭＢ２クライアント２０８は、エンコードされていないアプリケーション・データーを供給または受信するために、ターゲット・メモリー・バッファーを登録し、次いでＳＭＢリード／ライト・コマンドを生成する。このコマンドはＲＤＭＡによって送られ、導かれる。このコマンドは、ＳＭＢ２リード／ライト要求３４０に含まれて、ＳＭＢダイレクト・クライアント２１４ａに送られてもよい。ＳＭＢダイレクト・クライアント２１４ａは、このＳＭＢ２リード／ライト要求３４０をＳＭＢダイレクト・データー転送パケットにカプセル化する（６０６）。実施形態では、ＳＭＢ２リード／ライト要求３４０は、ＳＭＢダイレクト・データー転送パケットのＳＭＢ２データー・フィールド３３２に格納される。ＳＭＢダイレクト・データー転送パケットは、次いで、ＲＤＭＡインターフェース２１６を介してサーバー１０６に送ることができる（６０８）。一実施形態では、サーバー１０６はＳＭＢダイレクト・データー転送パケットを受信し、ＳＭＢ２データー・フィールド３３２からＳＭＢ２リード／ライト要求３４０を読み出す。次いで、ＳＭＢダイレクト・サーバー２１４ｂは、ＳＭＢ２リード／ライト要求３４０からデーターを読み出すことができる。このデーターには、チャネル３４２、ChannelInfoOffset３４６、およびChannelInfoLength３４８が含まれる。この情報は、ＳＭＢダイレクト・サーバー２１４ｂを、ＲＤＭＡチャネル記述子３５２における誘導情報６１０に導くことができる。この誘導情報から、ＳＭＢダイレクト・サーバー２１４ｂは、エンコードされていないアプリケーション・データーをクライアント１０２のバッファーにおけるメモリー位置に送るまたはこのメモリー位置から引き出すことによって、ダイレクト・データー転送を開始することができる。次いで、プロセス６００はＥＮＤ動作６１４において終了する。
【００８５】
[0093]  図４Ａから図４Ｃ、図５Ａから図５Ｄ、および図６は、それぞれ、本明細書において開示する実施形態にしたがって、ＲＤＭＡによってファイル・アクセス・プロトコルを使用して通信をネゴシエートし直し、ＲＤＭＡによってファイル・アクセス・プロトコルを使用してデーターを交換するときの動作特性例を示す。実施形態では、図示する動作ステップを他のステップに組み合わせること、および／または並び替えることもできる。更に、例えば、もっと少ないステップまたはもっと多いステップを使用することもできる。
【００８６】
[0094]  総じて、クレジットは本実施形態の利点である。送出クレジットは、ピアにおいて着信データーを受信するためにプリポストされたバッファーを表す。したがって、送出クレジットは、ピアがデーターを送信するために使用することができるように、ピアに引き渡された限定受信側リソース（メモリー、メモリー領域等）を表す。ＲＤＭＡの性質のため、一旦ポストされた受信は、実施形態では、取り消すことができない。解放すべき受信に関連するリソースについて、このリソースは、次に来る送信(incoming send)にサービスするために使用される。これは、受信側のピアが低リソース(run low on resource)で動作し始め、未処理の受信専用に既に割り当てた(dedicate)リソースの一部を取り戻したい場合に、実施形態において問題を生ずる可能性がある。本明細書において開示する実施形態によれば受信を取り消すことができないので、これらのリソースを取り戻すには、ピアの協同に頼ることになる。
【００８７】
[0095]  ＳＭＢダイレクトにおけるこの問題に対する解決策は、一実施形態によれば、送出クレジット廃止と呼ばれる。ピアに送信されるＳＭＢダイレクト・データー転送パケットは、ピアに付与された追加の送出クレジット量を指定する、CreditsGrantedフィールドを有する。代替実施形態では、ＳＭＢダイレクト・データー転送パケット３３８においてCreditRevocationフラグ（図示せず）をセットすることによって、CreditsGrantedフィールド３２０ｂの意味が、ピアが保持できる送出クレジット数に変化する。例えば、CreditRevocationフラグがセットされ、CreditsGrantedフィールド３２０ｂの値が１０である場合、１０は受信側が保持できるクレジット数になる。受信側が現在１０個よりも多い送出クレジットを保持している場合、受信側が１０個以下の送出クレジットを有することになるように、取り消された送出クレジットを使い果たすために、受信側は一連のＲＤＭＡ送信動作を実行する。取り消された送出クレジットを使い果たすために実行される送信動作は、空のＳＭＢダイレクト・データー転送パケット３３８（データー・ペイロードがないパケット）を送ることを含むことができる。着信した空のＳＭＢダイレクト・データー転送パケット３３８を受信すると、一実施形態によれば、送出クレジットを取り消したピアは、これらのリソースを解放し、これらを、相応しいと思われるように再利用することができる。
【００８８】
[0096]  送出クレジットは、２つのピアがそれらの送信および受信動作を同期させることを可能にするが、実施形態では、これらのピアは送出クレジットのデッドロックを回避しようとする。ピアＹがピアＸからの１つの送出クレジットを有し、ピアＸがピアＹからの１つの送出クレジットを有するというシナリオを想像する。このシナリオでは、各ピアには任意の時点においてそのピアへの１つの送信を実行する資格がある。ＸおよびＹ双方が、プロセスにおいてそれらの１つの送出クレジットを使用して同時に送信動作を実行したが、双方のピアによって送信されたＳＭＢダイレクト・データー転送パケット３３８は追加の送出クレジットをピアに付与しないと想像する。結果的に生ずる状態を、送出クレジット・デッドロックと呼ぶ。ＸおよびＹ双方はそれらの最後の送出クレジットを使い終えている。追加のパケットをピアに送ることができるためには、各ピアは追加の送出クレジットを必要とする。しかしながら、送出クレジットはＳＭＢダイレクト・データー転送パケット３３８によって付与され、いずれのピアもこれ以上の送信動作を実行することが全くできない。その結果、いずれのピアも追加のパケットを全く送信することができず、これらが他の送出クレジットを取得できるメカニズムはない。したがって、デッドロックが発生したことになる。
【００８９】
[0097]  この問題に対する解決策は、本開示の実施形態によれば、単なる規則である。ＳＭＢダイレクト・ピアがその最後の送出クレジットを使用するとき、一実施形態によれば、送られているＳＭＢダイレクト・データー転送パケット３３８は少なくとも１つの追加の送出クレジットをピアに付与する。双方のピアがこの規則に従えば、デッドロックは発生しない。何故なら、各ピアは常に他方に対して追加の送出クレジットの付与で応答できるからである。
【００９０】
[0098]  最後に、図７は本明細書において開示した実施形態を実現することができる計算システム例７００を示す。例えば、クライアント／アプリケーション・サーバー１０２またはファイル・サーバー１０６のような、コンピューター・システム７００は、本明細書において示したようなメッセージ・データーを交換するために少なくとも１つのプロセッサー７０２を有し、本明細書において開示した実施形態にしたがって図示されている。システム７００は、メモリー７０４を有する。メモリー７０４は、例えば、システム・メモリー、揮発性メモリー、および不揮発性メモリーを含む。その最も基本的な構成では、計算システム７００は、破線７０６によって図７において示される。加えて、システム７００は追加のストレージ（リムーバブルおよび／または非リムーバブル）も含むことができる。追加のストレージは、磁気または光ディスクあるいはテープを含むが、これらに限定されるのではない。このような追加のストレージは、図７ではリムーバブル・ストレージ７０８および非リムーバブル・ストレージ７１０によって例示されている。
【００９１】
[0099]  本明細書において使用する場合、コンピューター読み取り可能媒体という用語は、コンピューター記憶媒体を含むことができる。コンピューター記憶媒体は、揮発性および不揮発性、リムーバブルおよび非リムーバブル媒体を含むことができ、コンピューター読み取り可能命令、データー構造、プログラム・モジュール、または他のデーターというような情報の格納のための任意の方法または技術で実現される。システム・メモリー７０４、リムーバブル・ストレージ７０８、および非リムーバブル・ストレージ７１０は、全てコンピューター記憶媒体の例（即ち、メモリー・ストレージ）である。コンピューター記憶媒体は、限定ではなく、ＲＡＭ、ＲＯＭ、電子的消去可能リード・オンリー・メモリー（ＥＥＰＲＯＭ）、フラッシュ・メモリーまたは他のメモリー技術、ＣＤ−ＲＯＭ、ディジタル・バーサタイル・ディスク（ＤＶＤ）または他の光ストレージ、磁気カセット、磁気テープ、磁気ディスク・ストレージまたは他の磁気記憶デバイス、あるいは情報を格納するために使用することができ計算システム７００によってアクセスすることができる任意の他の媒体を含むことができる。任意のこのようなコンピューター記憶媒体は、システム７００の一部であってもよい。図７における例示は、本開示の範囲を限定することを全く意図していない。
【００９２】
[00100]  また、本明細書において使用する場合、コンピューター読み取り可能媒体という用語は通信媒体も含むことができる。通信媒体は、搬送波のような変調データー信号または他の移送メカニズムにおけるコンピューター読み取り可能命令、データー構造、プログラム・モジュール、または他のデーターによって具体化することができ、任意の情報配信媒体を含む。「変調データー信号」という用語は、この信号内に情報をエンコードするようなやり方でその１つ以上の特性が設定または変更されている信号を記述することができる。一例として、そして限定ではなく、通信媒体は、有線ネットワークまたは直接有線接続のような有線媒体と、音響、無線周波（ＲＦ）、赤外線、および他のワイヤレス媒体のようなワイヤレス媒体とを含むことができる。
【００９３】
[00101]  また、システム７００はデバイスが互いに通信することを可能にする通信接続（１つまたは複数）７１６も内蔵することができる。加えて、システム７００は、キーボード、マウス、ペン、音声入力デバイス、タッチ入力デバイス等のような入力デバイス（１つまたは複数）も有することができる。ディスプレイ、スピーカー、プリンター等のような出力デバイス（１つまたは複数）７１２も含むことができる。これらのデバイスは全て当技術分野では周知であり、ここで延々と説明する必要はない。以上で述べたデバイスは例であり、他のものを使用することもできる。
【００９４】
[00102]  以上、本開示の実施形態について、先の図を参照して説明したが、これらの実施形態に対して、当業者には容易に想起され、添付した特許請求の範囲において定められる本開示の範囲および主旨に含まれる複数の変更を行うことができることは認められてしかるべきである。実際、本開示の目的のために実施形態について説明したが、本開示の範囲に該当する種々の変化および変更が行われてもよい。
【００９５】
[00103]  同様に、本開示では、構造的特徴、方法論的動作、およびこのような動作を含むコンピューター読み取り可能媒体に特定の文言を使用したが、添付した特許請求の範囲に定められる主題は、本明細書において説明した具体的な構造、動作、特徴、または媒体には必ずしも限定されないことは言うまでもない。例えば、ＡＰＩ、ルーチン等の名称というような、具体的な名称または命名規則を、実施形態の様相(aspect)を説明するときに使用したが、本開示の主旨および範囲内に含まれる多数の変更は、このような名称および／または命名規則に対しても行うことができる。以上で記載した具体的な構造、特徴、動作、名称、命名規則、および／または媒体は、特許請求の範囲を実現する形態例として開示されたのである。実施形態の様相は、複数のクライアント／アプリケーション・サーバー、複数のファイル・サーバー、複数のネットワーク、複数の接続ピア等を見込んでいる。また、他の実施形態では、１つのサーバーを有する１つのクライアント・コンピューターおよび１つのネットワークが使用された。当業者には、本開示の範囲および主旨に該当する他の実施形態または改良も認められよう。したがって、これらの具体的な構造、動作、または媒体は、本開示を実現する実施形態例として開示されたものとする。本開示は、添付する特許請求の範囲によって定められるものとする。
【図１】
0006047158.tif 000002
【図２Ａ】
0006047158.tif 000003
【図２Ｂ】
0006047158.tif 000004
【図３Ａ】
0006047158.tif 000005
【図３Ｂ】
0006047158.tif 000006
【図３Ｃ】
0006047158.tif 000007
【図３Ｄ】
0006047158.tif 000008
【図３Ｅ】
0006047158.tif 000009
【図４Ａ】
0006047158.tif 000010
【図４Ｂ】
0006047158.tif 000011
【図４Ｃ】
0006047158.tif 000012
【図５Ａ】
0006047158.tif 000013
【図５Ｂ】
0006047158.tif 000014
【図５Ｃ】
0006047158.tif 000015
【図５Ｄ】
0006047158.tif 000016
【図６】
0006047158.tif 000017
【図７】
0006047158.tif 000018