(57)【要約】【課題】ホストＣＰＵの処理負荷を軽減させて、効率的にデータ受信を行う。【解決手段】本発明の実施形態としてのデータ転送装置は、通信処理部と、受信バッファと、コマンド発行制御部とを備える。前記通信処理部は、外部のホストＣＰＵからファイルデータの受信指示を受け、前記受信指示に従って前記ネットワークから前記ファイルデータを受信する。前記受信バッファは、前記通信処理部で受信されるファイルデータを内部に格納する。前記コマンド発行制御部は、前記外部のホストＣＰＵから、前記ファイルデータを前記ストレージ装置のどの位置に格納するかを示すマップ情報を取得し、前記受信バッファにおける前記ファイルデータの格納状況に応じて、前記受信バッファ内のデータを前記ストレージ装置に書き込むための書き込みコマンドを発行し、前記書き込みコマンドを前記ストレージ装置に送る。【選択図】図１
2015179328.tif 000002
【特許請求の範囲】
【請求項１】
ネットワークを介してファイルデータを受信し、受信したファイルデータを、ブロック単位でデータを管理するストレージ装置に書き込むためのデータ転送装置であって、
外部のホストＣＰＵからファイルデータの受信指示を受け、前記受信指示に従って前記ネットワークから前記ファイルデータを受信する通信処理部と、
前記通信処理部で受信されるファイルデータを格納する受信バッファと、
前記外部のホストＣＰＵから、前記ファイルデータを前記ストレージ装置のどの位置に格納するかを示すマップ情報を取得し、前記受信バッファにおける前記ファイルデータの格納状況に応じて、前記受信バッファ内のデータを前記ストレージ装置に書き込むための書き込みコマンドを発行し、前記書き込みコマンドを前記ストレージ装置に送るコマンド発行制御部と、
を備えたデータ転送装置。
【請求項２】
前記マップ情報は、前記ファイルデータの格納先として１つまたは複数のブロックの指定を含み、
前記コマンド発行制御部は、前記マップ情報に示されるブロックごとに、前記ブロックに格納するデータの全部が前記受信バッファに格納済みかを判断し、格納済みと判断されたブロックに対応するデータについて、前記ストレージ装置に書き込むための書き込みコマンドを発行する
請求項１に記載のデータ転送装置。
【請求項３】
前記通信処理部は、シーケンス番号が付与された複数のパケットを受信し、前記複数のパケットは、複数のデータを含む前記ファイルデータの各データを含み、
前記マップ情報は、前記ファイルデータの格納先として１つまたは複数のブロックの指定を含み、
前記コマンド発行制御部は、前記通信処理部で受信されたパケットのシーケンス番号に応じた前記受信バッファ内のアドレスに前記パケットに含まれるデータを格納し、前記マップ情報に示されるブロックと、前記受信バッファ内のアドレスまたは前記シーケンス番号との対応を管理することにより、前記ブロックに格納するデータの全部が前記受信バッファに格納済みかを判断する
請求項１または２に記載のデータ転送装置。
【請求項４】
前記コマンド発行制御部は、前記受信バッファにおいて前記ファイルデータの先頭から連続して受信済みのデータ範囲を特定し、特定した受信済みのデータ範囲を識別する情報を前記ネットワークに送信する
請求項３に記載のデータ転送装置。
【請求項５】
前記コマンド発行制御部は、前記特定した受信済みのデータ範囲を識別する情報として、前記特定した範囲に続く未受信のデータに対応するシーケンス番号のうちの最小シーケンス番号を表す情報を送信する
請求項４に記載のデータ転送装置。
【請求項６】
前記通信処理部は、ＴＣＰ／ＩＰに従って前記ネットワークと通信する
請求項１ないし５のいずれか一項に記載のデータ転送装置。
【請求項７】
前記コマンドの実行が完了するごとに前記ストレージ装置からコマンドの完了通知を受け、前記ファイルデータのすべての書き込みが完了した場合に、前記外部のホストＣＰＵに書き込み完了応答を通知する通知部
をさらに備えた１ないし６のいずれか一項に記載のデータ転送装置。
【請求項８】
前記コマンド発行制御部は、前記外部のホストＣＰＵから前記マップ情報を含むメタデータの書き込み要求を受けて、前記メタデータの書き込みコマンドを生成し、前記メタデータの書き込みコマンドを前記ストレージ装置に送る
請求項１ないし７のいずれか一項に記載のデータ転送装置。
【請求項９】
請求項１ないし８のいずれか一項に記載のデータ転送装置と、
前記外部のホストＣＰＵと
を備えたデータ受信システム。
【請求項１０】
前記外部のホストＣＰＵはメタデータ生成部を備え、
前記メタデータ生成部は、前記ストレージ装置の所定領域に格納された、それぞれファイルデータと各ファイルデータの格納位置との対応を示すマップ情報を含む他のメタデータ群に基づき、前記ストレージ装置において前記外部のＣＰＵから受信指示されたファイルデータを書き込み可能な空き領域を特定し、特定した空き領域の中から当該ファイルデータを書き込む位置を決定することにより、当該ファイルデータを前記ストレージ装置のどの位置に格納するかを示すマップ情報を生成し、当該マップ情報を含むメタデータを生成する
請求項９に記載のデータ受信システム。
【請求項１１】
ネットワークを介してファイルデータを受信し、受信したファイルデータを、ブロック単位でデータを管理するストレージ装置に書き込むためのデータ受信方法であって、
外部のホストＣＰＵからファイルデータの受信指示を受け、前記受信指示に従って前記ネットワークから前記ファイルデータを受信する通信処理ステップと、
前記通信処理ステップで受信されるファイルデータを受信バッファに格納する受信処理ステップと、
前記外部のホストＣＰＵから、前記ファイルデータを前記ストレージ装置のどの位置に格納するかを示すマップ情報を取得し、前記受信バッファにおける前記ファイルデータの格納状況に応じて、前記受信バッファ内のデータを前記ストレージ装置に書き込むための書き込みコマンドを発行し、前記書き込みコマンドを前記ストレージ装置に送るコマンド発行制御ステップと、
を備えたデータ受信方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、データ転送装置、データ受信システムおよびデータ受信方法に関する。
【背景技術】
【０００２】
高速ネットワークが普及し、サーバ装置および端末装置のそれぞれに搭載される通信装置や、ストレージ装置の性能が向上している。これに伴い、サーバ装置上のストレージ装置に格納されているファイルを、端末装置上のストレージ装置にダウンロードすることや、端末装置上のストレージ装置に格納されているファイルを、サーバ装置上のストレージ装置にアップロードするといったことは一般的になっている。
【０００３】
ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）やＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）は、ＤＡＳ（Ｄｉｒｅｃｔ  Ａｔｔａｃｈｅｄ  Ｓｔｏｒａｇｅ）と呼ばれ、サーバ用途向け機器で多く用いられる。また、ＳＤカードやｅＭＭＣといった、フラッシュメモリを利用したストレージ装置は、スマートフォンやノートＰＣ、タブレット端末等のモバイル機器で多く用いられる。サーバ用途向けストレージ装置は、ＨＤＤのＲＡＩＤのストライピング処理（並列化）や、昨今のＳＳＤ転送性能の向上により、現行製品でも単体で３Ｇｂｐｓ越えの書き込みレートを出すものがある。組み込み端末向けストレージ装置においても、ＵＨＳ−Ｉ規格のＳＤカードで、４８０Ｍｂｐｓ越えの書き込みレートを出すものもあり、数Ｇｂｐｓクラスの性能を有する規格の仕様策定も完了している。
【０００４】
これらのサーバ装置と端末装置の通信手段には、イーサネット（登録商標）や８０２．１１ａ／ｂ／ｇ／ｎ／ａｃなどが使われる。通信プロトコルには、インターネット等で広く使われているＴＣＰ／ＩＰやＵＤＰ／ＩＰ等が使われる。イーサネットは現在１Ｇｂｐｓが主流であり、データセンター等では１０Ｇｂｐｓが使われ始めている。また、次世代の４０Ｇｂｐｓ／１００Ｇｂｐｓイーサネットの仕様策定も完了している。８０２．１１においても、数１００Ｍｂｐｓ〜数Ｇｂｐｓの利用が今後着実に普及していくと思われる。
【０００５】
これらを顧みると、ネットワークを介したストレージ装置アクセスは、サーバ用途では数１００Ｇｂｐ〜数１０Ｇｂｐｓ、端末用途では数１０Ｇｂｐｓ〜数Ｇｂｐｓクラスの帯域になると予想される。
【０００６】
このようなネットワークとストレージ装置の性能向上に伴って、それを制御するホストＣＰＵの処理負荷も増大していく。従来はＴＣＰ／ＩＰオフロードエンジン（以下、ＴＯＥ）という技術により、その問題の解決が試みられてきた。ＴＯＥは、ホストＣＰＵに代行して、前述のＴＣＰ／ＩＰの処理を行う専用プロセッサまたは専用回路であり、ホストＣＰＵからＴＣＰ／ＩＰ処理負荷をオフロードするものである。このＴＯＥを用いることによって、従来のソフトウェアによる通信プロトコル処理よりも、高速にＴＣＰ／ＩＰ処理を行うことが可能となり、ネットワークの性能向上が可能になる。
【０００７】
ストレージ装置やＴＯＥは、それぞれホストＣＰＵによって制御され、データはメインメモリを介して入出力されることが想定される。よって、ネットワークから受信したデータをストレージ装置に書き込む場合、ＴＯＥとストレージ装置（ＳＳＤ、ＨＤＤ、ＳＤカード、ｅＭＭＣ等）の間のデータ転送は、必ずメインメモリを介して行われる。
【０００８】
また、ホストＣＰＵ上で動作する、これらの間をブリッジするアプリケーションソフトウェアにより、あるいは、ＯＳのカーネル空間とユーザ空間のデータの受け渡し処理等により、メインメモリ上で何回分か転送データのコピーが発生する場合もある。さらにファイルシステム処理も必要であり、通常のファイルシステムの実装ではブロックサイズで管理しているデータを、ストレージ装置から固定バイト長のセクタ単位で読み書きし、任意バイト長のファイルとして整形する必要がある。このため、ここでもデータのコピーが発生する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０１２−２４２９６１号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
上述したように、ストレージ装置とＴＯＥの間のデータ転送は、ホストＣＰＵのソフトウェア処理が介在することから、少なくとも一回はメインメモリへの読み書きが必要になる。また、ＯＳやアプリケーション、ファイルシステムの処理により、メインメモリ上で、場合によっては、複数回分のメモリコピーが発生することになる。これらのことから、メインメモリの負荷が大幅に増大してしまう。
【００１１】
このようなメモリ負荷に対しては、従来は十分な処理性能を持つホストＣＰＵと高速なメインメモリを用意して対応していたが、昨今のネットワークストレージ装置が数Ｇｂｐｓ〜１００Ｇｂｐｓに迫る転送レートの向上を鑑みると、少なからず問題となってきた。特に、メインメモリの性能特性を上げるためには、一般的にホストＣＰＵのグレードアップも伴い、コストや消費電力の問題が特に顕著になる。
【００１２】
本発明の一側面は、このようなホストＣＰＵの処理負荷を低減させて、効率的にデータ受信を行うことができるデータ転送装置、データ受信システムおよびデータ受信方法を提案するものである。
【課題を解決するための手段】
【００１３】
本発明の実施形態としてのデータ転送装置は、ネットワークを介してファイルデータを受信し、受信したファイルデータを、ブロック単位でデータを管理するストレージ装置に書き込むためのデータ転送装置であって、通信処理部と、受信バッファと、コマンド発行制御部とを備える。
【００１４】
前記通信処理部は、外部のホストＣＰＵからファイルデータの受信指示を受け、前記受信指示に従って前記ネットワークから前記ファイルデータを受信する。
【００１５】
前記受信バッファは、前記通信処理部で受信されるファイルデータを内部に格納する。
【００１６】
前記コマンド発行制御部は、前記外部のホストＣＰＵから、前記ファイルデータを前記ストレージ装置のどの位置に格納するかを示すマップ情報を取得し、前記受信バッファにおける前記ファイルデータの格納状況に応じて、前記受信バッファ内のデータを前記ストレージ装置に書き込むための書き込みコマンドを発行し、前記書き込みコマンドを前記ストレージ装置に送る。
【図面の簡単な説明】
【００１７】
【図１】第１の実施形態に係わるデータ転送装置を備えたデータ受信システムのブロック図。
【図２】エクステントマップを説明する図。
【図３】エクステントマップを説明する別の図。
【図４】第１の実施形態に係わる全体動作のフローチャート。
【図５】第１の実施形態に係るデータ受信処理のフローチャート。
【図６】第１の実施形態に係るデータ書き込み処理のフローチャート。
【図７】第２の実施形態に係わるデータ転送装置を備えたデータ受信システムのブロック図。
【図８】第２の実施形態に係わる受信処理および書き込み処理の動作を説明するための図。
【図９】第２の実施形態に係わる受信処理および書き込み処理の具体例を示す図。
【図１０】図９に続く処理を示す図。
【図１１】図１０に続く処理を示す図。
【発明を実施するための形態】
【００１８】
以下、図面を参照しながら、本発明の実施形態について説明する。
【００１９】
（第１の実施形態）
図１は、本発明の第１の実施形態に係わるデータ受信システムの概略構成を示すブロック図である。
【００２０】
図１のデータ受信システムは、データ転送装置１１と、ホストＣＰＵ（プロセッサ）１２と、ストレージ装置１３を備えている。データ転送装置１１が、ホストＣＰＵ１２から指示された情報に基づき、ネットワーク１４からファイルデータを受信し、受信したファイルデータをストレージ装置１３に書き込む。図における矢印付きの破線は制御の流れ、矢印付きの細い実線はホストＣＰＵとストレージ装置間での読み出しデータまたは書き込みデータの流れ、矢印付きの太い実線は、ネットワークから受信したファイルデータの流れを示す。
【００２１】
図１のデータ受信システムの具体的な製品形態としては、ＰＣ、サーバ装置、専用ＬＳＩ、またはＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）等の装置が想定される。ただし、本実施形態の製品形態は、これらに限定されるものではない。
【００２２】
ストレージ装置１３は、データを格納するための記憶装置である。ストレージ装置１３の具体的な実装として、例えばＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）やＨＤＤ（Ｈａｒｄ  Ｄｉｓｃ  Ｄｒｉｖｅ）、ＳＤカード、ｅＭＭＣ等が想定される。ただし、本実施形態は、これに限定されない。
【００２３】
ストレージ装置１３は、データをブロック単位で管理する。一例として、セクタと呼ばれる単位で管理する。ここでは、抽象化してブロックと呼ぶ。ユーザが扱うデータは、ブロック単位ではないため、ストレージ装置１３は、通常、ファイルシステムによりアクセスされる。ファイルシステムは、バイト単位のファイルデータを、ストレージ装置１３のブロック単位の記憶領域にマッピングする。各ブロックは、それぞれ各ブロックのアドレスによって識別される。ファイルシステムは、公知のものを利用すればよい。
【００２４】
典型的には、ファイルシステムでは、ストレージ装置上の所定領域にメタデータを記憶させる。メタデータには、ファイルデータとファイルデータが格納された位置とを互いに関連づけたマップ情報およびその他諸々の情報（ファイルの識別子、タイムスタンプなど）を含められている。ストレージ装置にファイルデータを書き込む際は、まず、所定領域に格納されているメタデータ群を読み出し（あるいは事前にメインメモリに読み出したメタデータ群を用いてもよい）、メタデータ群を解析し、解析結果とファイルデータのサイズから、ファイルデータを書き込む位置を特定する。書き込む位置を特定すると、ファイルデータに関するメタデータを生成し、ストレージ装置の所定領域に、生成したメタデータを書き込む。この時、メタデータには、ファイルデータが実際にどの位置（ブロック）に記憶されるのかを表すマップ情報を含める。また、そのマップ情報に従って、ファイルデータをストレージ装置に書き込む。本実施形態では、マップ情報として、エクステントマップを用いる例を示す。
【００２５】
図２にエクステントマップを説明する図を示す。ここでは、ストレージ装置の１ブロックが５１２バイトであるとする。ブロック２３５〜２３７に、所望のファイルデータのある部分のデータが格納された様子が示される。データはブロック２３５の先頭から書き込みが開始され、ブロック２３５、２３６のすべてと、ブロック２３７の４３４バイト目まで連続して書き込まれている。書き込まれるデータの長さは１４５８バイトである。この場合、エクステントマップは、“ブロック２３５〜２３７、長さ１４５８”などと表される。
【００２６】
ここでは、ブロックの先頭から書き込みを行う例を示したが、変形例として、図３に示すように、ブロックの途中から書き込みを開始する構成も可能である。例えばブロック２３５の先頭から１２４バイトをスキップして、１２５バイト目から、ブロック２３８の４６バイト目まで連続して書き込みが行われる。この場合、エクステントマップは、“ブロック２３５〜２３８、オフセット１２４バイト、長さ１４５８バイト”、などと表される。
【００２７】
ここで述べた例では、ストレージ装置においてデータが格納されている位置を、ブロックとデータ長（もしくはブロックとデータ長とオフセット）で示したが、始端バイト位置と終端バイト位置等で表しても良い。データが格納された位置が特定できれば表現形式は問わない。
【００２８】
また、ここで示した例では、一つのデータが、連続したブロック領域に格納される場合を示したが、エクステントマップは、複数のデータがそれぞれ離散して、各々連続したブロック領域に格納される形態でも良い。例えば、一つのエクステントマップによって、ブロック２３５、２３６と、ブロック２３７の先頭からの一部までに渡って格納されたデータ（１４５８バイト）と、ブロック３４６〜３４９とブロック３５０の先頭から一部までにわたって格納されたデータ（２０００バイト）の２つの離散した領域を表しても良い。
【００２９】
このように、エクステントマップは、データが格納されるブロックを特定する情報と、ブロックのうちの実際に有効データが格納されている位置ないしは範囲を特定する情報（有効データ位置情報）とを含む。これらの情報により、ストレージ装置のどこに所望のデータが格納されているかを特定できる。
【００３０】
なお、ファイルシステムとしては、以上のエクステントベースのファイルシステムのみならず、クラスタ（ブロック）ベースのファイルシステムも可能である。クラスタベースのファイルシステムの場合は、エクステントの代わりにクラスタのリスト（クラスタは離散的に配置されてよい）により、データが格納された領域を特定する。この場合も、これもエクステントの特殊な場合（一つのエクステントの長さをクラスタサイズに固定した物）とみなせば同様に考えることが可能である。以降はエクステントの用語を用いて説明するが、本実施形態は、これら両方を含むものとする。
【００３１】
ネットワーク１４は、有線通信ネットワーク、無線通信ネットワーク、またはこれらのハイブリッドネットワークである。一例として、イーサネット、無線ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）等があるが、これらに限定されず、あらゆるネットワークが可能である。
【００３２】
ホストＣＰＵ１２は、システム全体の制御を行う。ホストＣＰＵ１２は、ソフトウェアの実行により実現される主な処理部として、アプリ処理部２０１と、メタデータ生成部２０２と、エクステントマップ取得部２０３と、受信データ書き込み指示部２０４とを備える。以下では、各部の動作の概要を説明し、その後、各部の詳細を説明する。
【００３３】
アプリ処理部２０１は、データ受信アプリケーションを実行する。
【００３４】
メタデータ生成部２０２は、ネットワーク１４から受信するファイルデータについて、ストレージ装置１３における当該ファイルデータの書き込み位置を表すエクステントマップを含むメタデータを生成する。また、メタデータ生成部２０２は、生成したメタデータを、データ転送装置１１を介して、ストレージ装置１３に書き込むための処理を行う。
【００３５】
エクステントマップ取得部２０３は、メタデータ生成部で生成されたメタデータから、エクステントマップを抽出する。
【００３６】
受信データ書き込み指示部２０４は、エクステントマップと、受信しようとするファイルデータの情報に基づき、データ転送装置１１に、ネットワーク１４からのファイルデータの受信を指示し、また、ストレージ装置１３へ受信したファイルデータの書き込みを指示する。データ転送装置１１が、ＴＣＰ／ＩＰなど対向装置とコネクションを形成する通信プロトコルを使用する場合など、必要に応じて、セッション情報をデータ転送装置１１に渡すことで、受信するデータを特定可能にしてもよい。ファイルデータの情報やセッション情報は、一例として、アプリ処理部２０１から取得する。
【００３７】
ファイルデータの情報は、ファイル名（ファイル識別子）およびファイルサイズなどを含む。ファイル名はＵＲＩなどによって表記されてもよい。セッション情報は、ファイルデータの取得先のＩＰアドレス、ポート番号、セッション形成時のシーケンス番号などを含んでも良い（詳細は第２の実施形態で述べる）。
【００３８】
なお、ホストＣＰＵ１２は、その他の種々の処理を行うことが可能である。以下、より詳細に、ホストＣＰＵについて説明する。
【００３９】
アプリ処理部２０１は、ホストＣＰＵのアプリ処理部２０１で動作する何らかのアプリケーションソフトウェアの実行部である。アプリ処理部２０１は、アプリケーションの実行により、ネットワークからファイルデータを受信することを決定する。アプリ処理部２０１は、そのファイルデータを取得するために必要となる情報を、アプリケーションソフトウェアから取得する。
【００４０】
典型的な例としては、ネットワーク１４に接続された他の機器に保存されているファイルデータが取得対象として特定され、当該ファイルの情報をアプリケーションから取得する。ファイルの情報の具体例として、ファイル名およびファイルサイズなどがある。
【００４１】
アプリ処理部２０１は、ファイル情報を取得すると、メタデータ生成部２０２に当該ファイルデータの受信指示と共に、ファイル情報（ファイル識別子、ファイルサイズ等）を送る。なお、アプリ処理部２０１によって指定されたファイルの情報を、後段の処理部に渡す処理は、例えばｒｅｃｖｆｉｌｅ（）関数のようなシステムコールを用意し、この関数内の処理を前述の動作を実現するように構成する方法が考えられる。このような関数でアプリケーションとのＩ／Ｆをとることにより、様々なアプリケーションへの適用が容易になる。
【００４２】
メタデータ生成部２０２は、アプリ処理部２０１からファイル情報を受け取ると、ストレージ装置１３のデータ格納領域の使用状況を確認するため、ストレージ装置１３の所定領域に格納されているメタデータ群を取得する。メタデータの取得は、データ転送装置１１にメタデータの読み出し要求を送り、データ転送装置のコマンド発行部１０１が、当該読み出し要求に基づき、メタデータの読み出しコマンドを発行して、ストレージ装置１３に送る。ストレージ装置１３は当該メタデータの読み出しコマンドを実行して、所定領域内のメタデータを、メタデータ生成部２０２に出力する。あるいは、事前に同様の方法でメインメモリにメタデータ群を読み出しておき、メインメモリからメタデータを取得してもよい。
【００４３】
メタデータ生成部２０２は、取得したメタデータ群に基づき、ファイル情報に示されるファイルを格納するための位置（１つ以上のブロックのアドレスと、必要に応じてブロック内の有効データ位置）を特定し、特定した領域を表すマップ情報（エクステントマップ）やファイル識別子等を含むメタデータを生成する。メタデータ生成部２０２は、生成したメタデータをエクステントマップ取得部２０３に渡すとともに、生成したメタデータの書き込み要求を、データ転送装置１１のコマンド発行部１０１に送る。データ転送装置１１のコマンド発行部１０１は、メタデータの書き込み要求を受けて、メタデータの書き込みコマンドを発行し、ストレージ装置１３に送る。ストレージ装置１３は、メタデータの書き込みコマンドを実行して、書き込み要求されたメタデータを内部の所定領域に格納する。なお、メタデータにはファイル識別子も含まれることから、メタデータを読み出す際にはファイル識別子を指定した読み出しを可能にしてもよい。また、メタデータ群を読み出すことで、ストレージ装置に格納されているファイル群を識別してもよい。
【００４４】
エクステントマップ取得部２０３は、メタデータ生成部２０２から渡されたメタデータから、書き込み対象となるファイルのエクステントマップを抽出する。なおメタデータ生成部２０２からエクステントマップ取得部２０３へ、エクステントマップのみを渡すようにしてもよい。この場合、エクステントマップ取得部２０３でのエクステントマップの抽出動作は不要になるので、エクステントマップ取得部２０３を省略し、エクステントマップを後段の受信データ書き込み指示部２０４に直接出力してもよい。
【００４５】
また、エクステントマップは、メタデータ生成部２０２から取得するのではなく、メタデータ生成部２０２が生成したメタデータをあらかじめメモリにキャッシュしていたものを参照することで取得してもよい。
【００４６】
または、ストレージ装置１３への当該メタデータの書き込みが完了した後で、エクステントマップ取得部２０３が、データ転送装置１１のコマンド発行部１０１にメタデータの読み出しを要求してもよい。この場合、エクステントマップ取得部２０３は、ストレージ装置から読み出したメタデータを取得する。
【００４７】
エクステントマップ取得部２０３は、このようにして取得したエクステントマップを、受信データ書き込み指示部２０４に渡す。受信データ書き込み指示部２０４は、エクステントマップと、ファイルデータの受信を指示する情報とを、データ転送装置１１に出力する。これにより、データ転送装置１１に対して、ファイルデータの受信と、ストレージ装置へのファイルデータの書き込み指示を行う。
【００４８】
データ転送装置１１は、ホストＣＰＵ１２に代行して、ネットワーク１４からファイルデータを受信し、受信したファイルデータをストレージ装置１３に書き込む処理を行う。
【００４９】
ホストＣＰＵ１２とデータ転送装置１１は、任意の接続方式で接続される。例えば、本データ受信システムが、ＰＣやサーバ装置などの場合は、チップセットやＰＣＩ  Ｅｘｐｒｅｓｓ等で接続される。本システムがＳｏＣなどの場合は、これらが専用のバスなどで接続されても良い。一方、データ転送装置１１とストレージ装置１３は、例えばＡＴＡ、ＳＡＳ，ＳＣＳＩ、ＳＤメモリカード規格などで接続される。以上の接続例はあくまで一例であり、本実施形態はこれに限定されない。
【００５０】
データ転送装置１１は、ハードウェアとソフトウェアのどちらで構成しても良く、これらの両方で構成されてもよい。実装の形態は問わないが、処理効率の観点から、ハードウェアベースで構成することが望ましい。
【００５１】
データ転送装置１１は、コマンド発行制御部１１１（コマンド発行部１０１、受信処理部１０３）、通知振り分け部１０２、受信バッファ１０４、通信処理部１０５、を備える。データ転送装置１１の具体的な実装の形態としては、ＦＰＧＡや専用ＬＳＩが想定される。
【００５２】
通信処理部１０５は、使用する通信プロトコルの種類に応じて、任意の通信処理を行う。例えばＴＣＰ／ＩＰベースのプロトコル処理、イーサネット処理、無線処理などの通信処理（ＴＣＰ／ＩＰのヘッダ解析等）を行う。ホストＣＰＵ１２により指示されたファイルデータは、複数のデータに分割され、それぞれを含むフレームが、ネットワーク１４上の対向装置から送信される。通信処理部１０５は、ネットワーク１４から該当するセッションにてフレームを受信すると、受信したフレームから、指示されたデータを抽出する。ＴＣＰ／ＩＰであれば、受信したフレームからＴＣＰ／ＩＰパケットを抽出し、ＴＣＰ／ＩＰパケットからデータを抽出する。通信処理部１０５は、抽出したデータを受信バッファ１０４に出力し、出力したデータの情報を受信処理部１０３に通知する。通信処理部１０５は、前述したＴＣＰ／ＩＰオフロードエンジン（ＴＯＥ）などに相当する。ＴＣＰ／ＩＰのような対向装置とコネクションを張るようなプロトコルの場合、対向装置からのフレーム受信動作は、相手とコネクションを張った後のデータ転送の段階での動作である。
【００５３】
受信バッファ１０４は、通信処理部１０５から入力されたデータを内部に一時的に格納する。図では、受信バッファ１０４を示す枠内の領域を、ストレージ装置１３のブロックサイズごとに縦線で区切って表現している。受信バッファ１０４は、通信処理部１０５から入力されたデータを任意の方式で格納する。受信処理部１０３から指示されたアドレスに格納する形態や、入力順に格納する（ＦＩＦＯなど）形態などがあり得る。後者の入力順に格納する形態は、例えばファイルデータが先頭側のデータから順番に受信バッファ１０４に入力されることが確保される場合に有効である。受信バッファ１０４は、コマンドを実行するストレージ装置１３からデータの出力指示を受けた場合は、指示されたデータをストレージ装置１３に出力する。受信処理部１０３からの出力指示に従って、指定されたデータをストレージ装置１３に出力する構成も可能である。
【００５４】
コマンド発行制御部１１１は、外部のホストＣＰＵ１２から、ファイルデータをストレージ装置１３のどの位置に格納するかを示すマップ情報を取得し、受信バッファ１０４におけるファイルデータの格納状況に応じて、受信バッファ１０４内のデータをストレージ装置１３に書き込むための書き込みコマンドを発行する。コマンド発行制御部１１１は、発行した書き込みコマンドをストレージ装置１３に送る。コマンド発行制御部１１１は、コマンド発行部１０１および受信処理部１０３を備える。
【００５５】
受信処理部１０３は、通信処理部１０５でフレームからデータが抽出されるごとに、抽出したデータの情報に関する通知を受ける。受信処理部１０３は、エクステントマップと、通信処理部１０５からの通知に基づき、ファイルデータの受信状況を、バッファ情報として管理する。
【００５６】
受信バッファ１０４へファイルの先頭側から順にデータが格納される場合、受信処理部１０３は通信処理部１０５からの通知に基づき、エクステントマップに示されるブロックのどのブロックまでのデータが受信されたかを把握できる。この場合、受信処理部１０３は、例えば、ファイルデータの先頭側から１ブロック分のデータが格納されるごとに、当該データを格納するブロックをエクステントマップから特定し、コマンド発行部１０１に当該データを、特定したブロックへ書き込む要求を送る。複数ブロック分のデータをまとめて、書き込み要求を送っても良い。末尾のブロックではブロックサイズ分のデータが格納されない場合もあり、このときはパディングデータを付加して、ブロックサイズ分のデータとすればよい。コマンド発行部１０１は、受信処理部１０３からのデータの書き込み要求を受けて、指定されたデータを、ストレージ装置１３の指定された領域に書き込むためのコマンドを発行する。コマンド発行部１０１は、発行したコマンドをストレージ装置１３に出力する。
【００５７】
また、受信処理部１０３は、ファイルデータにおけるどの位置のデータが受信されたかを把握し、当該データをファイルデータ内の相対位置に応じたアドレスに格納するよう受信バッファ１０４に指示してもよい。このことは、例えばＴＣＰ／ＩＰの場合、ファイルデータを構成する各データと、シーケンス番号とを対応付け可能であることから可能である。この詳細は第２の実施形態で詳述する。この場合、受信バッファ１０４は、受信処理部１０４から指示されたアドレスにデータを格納する。受信処理部１０３は、受信バッファ１０４の書き込み状況に応じて、ストレージ装置１３に書き込むべきデータを特定し、当該特定したデータをストレージ装置１３に書き込むことをコマンド発行部１０１に要求する。コマンドを実行するストレージ装置１３からの読み出し要求に応じて、受信バッファ１０４はデータを出力する。なお、受信処理部１０３が、受信バッファ１０４にデータの出力を指示し、ストレージ装置１３がこのデータを内部に取り込んでも良い。受信処理部１０３は、例えば、エクステントマップに示されるブロックの１ブロックごとにブロックサイズ分のデータが受信バッファ１０４に格納されたら、当該データを、該当するブロックへ書き込む要求をコマンド発行部１０１に送る。コマンド発行部１０１は、当該書き込み要求を受けて、指定されたデータを、ストレージ装置１３の指定された領域に書き込むためのコマンドを発行する。コマンド発行部１０１は、発行したコマンドをストレージ装置１３に出力する。
【００５８】
コマンド発行部１０１は、受信処理部１０３またはホストＣＰＵ１２から、書き込み要求、または読み出し要求を受ける。例えば、コマンド発行部１０１は、受信処理部１０３から、受信データの書き込み要求を受信する。また、ホストＣＰＵ１２から、メタデータの書き込み要求または読み出し要求を受信する。コマンド発行部１０１は、要求された処理を実行するコマンドを発行し、発行したコマンドをストレージ装置１３に出力する。コマンドには、書き込み先の領域または読み出し先の領域を示す情報も含まれる。
【００５９】
ここで、コマンド発行部１０１が発行するコマンドは、ストレージ装置１３側のＩ／Ｆ仕様に従ったものになる。一度に指定できる書き込みブロック数に限りがあったり、離散的なブロックは同時に指定できなかったり等の制限ある場合がある。この場合、コマンド発行部１０１は、受信処理部１０３またはホストＣＰＵ１２からの１つの指示から、複数のコマンド群を生成する場合もある。
【００６０】
前述した図２を例に、受信処理部１０３およびコマンド発行部１０１の動作例を示す。図２に示す１４５８バイトのデータがネットワークから受信され、受信バッファ１０４に格納されていると仮定する。この場合、ブロックサイズよりも大きなデータが受信バッファ１０４に書き込まれているので、書き込みコマンドを発行する。この時、ストレージ装置１３の書き込み位置は、エクステントマップから特定する。ここでは、ブロック２３５の先頭からデータを書き込むようにエクステントマップが指定されているとする。ブロック２３５、ブロック２３６については、ブロックサイズ分のデータが受信バッファ１０４に書き込まれているので、ブロック２３５およびブロック２３６への書き込みコマンドを発行する。ブロック２３７は、ブロックサイズのデータが受信バッファ１０４に書き込まれていないが、受信ファイルデータの受信は完了しているとする。このため、後半７８バイト分のパディングデータを生成し、当該パディングデータを前半のデータの後ろに付加する。付加後のデータ（ブロックサイズ分のデータ）について、ブロック２３７への書き込みコマンドを発行する。
【００６１】
前述した図３の変形例の場合では、ブロック２３５に関しては、１２４バイトのオフセットが指定されている。このため、前半の１２４バイト分のパディングデータを作成し、３８８バイト分の受信データをパディングデータの後ろに追加する。そして、追加後のデータについて、ブロック２３５への書き込みコマンドを発行する。なお、ブロック２３５の先頭の１２４バイトが別のアプリケーションのデータであることを許容する場合には、当該アプリケーションのデータの後ろに、３８８バイト分の受信データを付加し、付加後のデータについて、書き込みコマンドを発行する。ブロック２３６、ブロック２３７は、全ブロック分のデータが、受信バッファに書き込まれているので、ブロック２３６、ブロック２３７への書き込みコマンドを発行する。ブロック２３８は、まだブロックサイズのデータが書き込まれていないが、受信ファイルデータの受信は完了しているとする。このため、後半４６６バイト分のパディングデータを作成して、前半のデータの後ろに付加する。付加後のデータ（ブロックサイズ分のデータ）について、ブロック２３７への書き込みコマンドを発行する。
【００６２】
本実施形態では、コマンド発行部１０１は、受信処理部１０３からの要求を契機に、受信データの書き込みのコマンドを発行しているが、コマンド発行部１０１自身が受信バッファ１０４を監視して、ブロックサイズ分のデータが受信バッファ１０４に書き込まれたことを検知して、コマンド発行を行っても良い。
【００６３】
通知振り分け部１０２は、コマンド発行部１０１が発行したコマンドの完了通知をストレージ装置１３から受けて、通知内容に応じて、書き込み完了通知または読み出し完了通知を、ホストＣＰＵ１２内のメタデータ生成部２０２、または受信データ書き込み指示部２０４に通知する。
【００６４】
具体的に、通知振り分け部１０２は、メタデータの書き込みまたは読み出しのコマンド完了通知を受けた場合は、メタデータ生成部２０２に、書き込みまたは読み出しの完了通知を返す。受信データの書き込みのコマンド完了通知を受けた場合は、受信データ書き込み指示部２０４に、書き込みの完了通知を返す。受信データ書き込み指示部２０４は、書き込み完了通知を受けた場合、アプリ処理部２０１に、ファイルデータの受信、および当該ファイルデータのストレージ装置への書き込みが完了したことを、通知してもよい。
【００６５】
ここで、ストレージ装置１３にはＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙ  ｏｆ  Ｉｎｅｘｐｅｎｓｉｖｅ  Ｄｉｓｋｓ）機能を搭載してもよい。あるいは、データ転送装置１１内のストレージ装置１３とのＩ／Ｆに、ＲＡＩＤ機能を備えても良い。いずれの場合も本実施形態の本質とは関係ないので説明では割愛する。
【００６６】
以下では、ストレージ装置１３とのＩ／Ｆ処理について、より詳しく説明する。まず、ストレージ装置１３が典型なＳＳＤやＨＤＤなどのＳＡＴＡ  Ｉ／Ｆを備え、さらにバスマスターとしての機能（ＤＭＡ機能）を備えるとする。この場合、デスクリプタと呼ばれる、コマンド等を記述したデータを、所定のメモリ上に用意しておき、ストレージ装置１３がそれを読み出すことで、コマンドがストレージ装置１３に受け渡される。前述のコマンド発行部１０１は、このような処理を行う。
【００６７】
デスクリプタは、通常リングバッファ型式で管理されており、通常、ホストＣＰＵ１２が使用するメインメモリ（主記憶装置、不図示）上に置かれる。本実施形態でも同じ形態をとっても良いが、データ転送装置１１内のメモリ、あるいは、データ転送装置１１に直接接続されるメモリを用いることが、メインメモリやホストＣＰＵ１２に負荷を与えないという点で望ましい。なお、メインメモリは、例えば、ホストＣＰＵ１２とデータ転送装置１１が接続されたバスと共通に接続されている。この場合、ストレージ装置１３は、データ転送装置１１および当該バスを介して、メインメモリにアクセスできる。
【００６８】
また、ストレージ装置１３への書き込みのために、受信バッファ１０４からブロック単位のデータをＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）で読み出すアドレスも、それぞれのデスクリプタ内にあらかじめ指定する。ストレージ装置１３にメタデータ生成部２０２が作成したメタデータをメモリから読み出して書き込む場合は、当該メタデータが格納されているメモリのアドレスを、デスクリプタ内に指定する。通常は、メインメモリにこれから書き込むメタデータが置かれているので、メインメモリのアドレスを指定する。
【００６９】
これにより、ストレージ装置１３がデスクリプタによって指定された読み出しアドレスから、ストレージ装置１３に書き込むデータ（受信データまたはメタデータ）を取得することができる。
【００７０】
また、ストレージ装置１３はコマンドを実行してデータ（受信データまたはメタデータ）を書き込んだ後に、コマンド完了通知（応答通知）を、データ転送装置に対して行う。具体的に、どこまでコマンドを処理したか、すなわち、リングバッファのデスクリプタ群のどのデスクリプタまで処理したかを、各デスクリプタの処理完了を示すＤＯＮＥビットをセットするなどして、データ転送装置の通知振り分け部１０２に通知する。
【００７１】
通知振り分け部１０２は、ストレージ装置１３から通知された通知内容が、受信データの書き込みのものであった場合は、書き込み完了通知を、ホストＣＰＵ１２の受信データ書き込み指示部２０４に送る。ホストＣＰＵ１２への通知は、例えば割り込みにより行われる。ホストＣＰＵ１２は、割り込み通知を受けると、ＤＯＮＥビットが書かれているデスクリプタを順次読出し、ＤＯＮＥビットが書かれているデスクリプタまで処理が完了したことを認識する。これは一度に複数のデスクリプタの処理が完了している場合もあり得る。ホストＣＰＵ１２は、ＤＯＮＥビットが書かれているデスクリプタを読み出した後は、当該デスクリプタ内のＤＯＮＥビットをリセットする。
【００７２】
この時、エクステントマップで指定されたすべての受信データの書き込みが終了していない場合（一部のデータのみ書き込みが終了している場合）は、通知振り分け部１０２は、ホストＣＰＵ１２には完了通知を出さなくてもよい。エクステントマップで指定された全ての受信データ書き込みが終了したタイミングに、一度だけホストＣＰＵ１２へ通知するようにしても良い。
【００７３】
通知振り分け部１０２は、処理完了と判断されたデスクリプタがメタデータの書き込みのものであった場合は、ホストＣＰＵ１１のメタデータ生成部２０２に書き込み完了通知を送る。ホストＣＰＵ１２への通知は、例えば割り込みにより行われる。メタデータ生成部２０２は、この通知を受けた場合に、ＤＯＮＥビットが書かれているデスクリプタを読み出し、ＤＯＮＥビットを確認することで、メタデータの書き込みが完了したと判断する。メタデータ生成部２０２は、メタデータの書き込みが完了したのを確認した後で、エクステントマップ取得部２０３に処理を移行してもよい。ホストＣＰＵ１２は、ＤＯＮＥビットが書かれているデスクリプタを読み出した後は、当該デスクリプタ内のＤＯＮＥビットをリセットする。
【００７４】
ストレージ装置１３が、内部エラー等、何らかの理由により、コマンド発行部１０１から渡されたコマンドの実行が完了できない場合がある。例えばタイムアウトの発生や、ストレージ装置１３に書き込むべきデータ（受信データまたはメタデータ）がメモリに格納されていない、その他、種々の理由があり得る。この場合、ストレージ装置１３は、データ転送装置１１にエラー通知を行う。このとき、ホストＣＰＵ１２にも、このエラーの情報を得られるように、データ転送装置１１の通知振り分け部１０２が、ホストＣＰＵ１２にエラー通知を中継して、ホストＣＰＵ１２も、エラー情報を知ることができるようにしてもよい。
【００７５】
図４に、本実施形態に係るデータ受信システムの動作例のフローチャートを示す。ここでは、ネットワーク１４上の対向装置とＴＣＰ／ＩＰによるセッションを形成して、ＴＣＰ／ＩＰパケット通信を行う場合を想定する。
【００７６】
（図４のステップＳ１０１）アプリ処理部２０１が、アプリケーションの実行によりファイルデータの受信指示を受ける。アプリ処理部２０１は、指示されたファイルデータの情報をアプリケーションから取得する。アプリ処理部２０１は、メタデータ生成部２０２へファイル情報を渡すとともに、ファイルデータの受信を指示する。
【００７７】
（図４のステップＳ１０２）メタデータ生成部２０２は、受信指示されたファイルのメタデータを生成する。メタデータは、ストレージ装置１３においてファイルデータを書き込むべき位置を特定するマップ情報（エクステントマップ）を含む。メタデータ生成部２０２は、生成したメタデータを、ストレージ装置１３に書き込むようデータ転送装置１１に要求する。
【００７８】
（図４のステップＳ１０３）エクステントマップ取得部２０３が、メタデータ生成部２０２が生成したメタデータから、エクステントマップを抽出する。
【００７９】
（図４のステップＳ１０４）受信データ書き込み指示部１０４が、ファイルデータの受信を行うセッションの情報を通信処理部１０５に通知し、またエクステントマップを受信処理部１０３に渡す。これにより受信処理の開始を、データ転送装置１１に指示する。
【００８０】
（図４のステップＳ１０５）データ転送装置１１が、ホストＣＰＵ１２から通知されたセッションで、ネットワーク１４上の対向装置と通信して、ファイルデータの受信を行う。データ転送装置１１は、ネットワーク１４から受信したファイルデータを受信バッファ１０４へ書き込む。データ転送装置１１は、ホストＣＰＵ１２から通知されたエクステントマップと、受信バッファ１０４の状況に応じて、受信バッファ１０４内のデータをストレージ装置１３のブロックに書き込むための書き込みコマンドを発行し、ストレージ装置１３へ出力する。
【００８１】
（図４のステップＳ１０６）通知振り分け部１０２は、ファイルデータのストレージ装置１３へ書き込みがすべて完了したときは、ホストＣＰＵ１２の受信データ書き込み指示部２０４へ、ファイルデータの書き込み完了通知を行う。
【００８２】
図５は、ステップＳ１０５においてデータ転送装置１１が行う処理のうち、ネットワーク１４から受信バッファ１０４へ受信データを書き込む処理の詳細なフローチャートを示す。
【００８３】
（図５のステップＳ２０１）通信処理部１０５は、ネットワーク１４からパケットを逐次受信する。パケットは、ファイルデータの一部を含む。通信処理部１０５は、受信したパケットについて、ホストＣＰＵ１２から指定されたセッションのパケットかを検査する（Ｓ２０２）。指定されたセッションかどうかは、例えばパケットのヘッダ情報（ＩＰアドレス、ポート番号等）で判断する。指定されたセッションのパケットでなければ、ホストＣＰＵ１２へ、受信したパケットを渡し（Ｓ２０８）、ステップＳ２０１に戻る。
【００８４】
（図５のステップＳ２０３）受信したパケットが、指定されたセッションのパケットであれば、バッファ情報を確認する。バッファ情報は、受信バッファ１０４内に保持されていてもよいし、受信処理部１０３または通信処理部１０５の内部バッファに保持されていてもよいし、メインメモリ（図示せず）に保持されていてもよい。バッファ情報は、ここでは、受信バッファ１０４内で受信データが書き込まれたアドレスを示す書き込み位置情報と、受信バッファ１０４内で受信データが読み出されたアドレスを示す読み出し位置情報とを含むとする。ここで、受信バッファ２０４内のアドレスと、パケットのシーケンス番号との対応が予めとれており、シーケンス番号から、当該パケット内のデータを格納すべきアドレスを特定可能にしてもよい。
【００８５】
（図５のステップＳ２０４）バッファ情報から、受信バッファ１０４内に、受信したパケット内のデータを書き込む空き領域があるかを判断し、空き領域がないときはパケットを廃棄して（Ｓ２０９）、ステップＳ２０１に戻る。この場合、対向装置にパケットの再送を促し、空き領域が発生した時点で、次のステップに進む。
【００８６】
（図５のステップＳ２０５）受信バッファ１０４内に空き領域があると判断したときは、受信バッファ１０４内のパケット内のデータを書き込む。そして、バッファ情報の書き込み位置情報を更新する（Ｓ２０６）。
【００８７】
（図５のＳ２０７）ホストＣＰＵ１２から受信を指示されたファイルデータのすべての受信が完了したかを判定する。すなわち、エクステントマップで指定されたサイズ分のデータの受信が完了したかを判断する。指定されたサイズ分のデータの受信がまだ完了していないときは、ステップＳ２０１に戻る。指定されたサイズ分のデータの受信が完了した場合は、本処理を終了する。
【００８８】
図６は、ステップＳ１０５においてデータ転送装置１１が行う処理のうち、受信バッファ１０４からストレージ装置１３へのデータを読み出して書き込む処理の詳細なフローチャートを示す。
【００８９】
（図６のステップＳ３０１）受信処理部１０３は、バッファ情報の書き込み位置情報が更新されたかを判断する。バッファ情報の書き込み位置情報が更新されると、ブロックサイズ以上の連続したデータで、まだ読み出されていないブロックのデータが受信バッファ１０４内に書き込まれているかを判断する（Ｓ３０２）。まだ読み出していない連続データが１ブロック分に達してないときは、ステップＳ３０１に戻る。
【００９０】
（図６のステップＳ３０３）まだ読み出していない連続データが１ブロック分もしくはその整数倍になったときは、バッファ情報とエクステントマップから、データを書き込むストレージのブロックのアドレスを算出する。当該アドレスは、単一もしくは複数のブロックを示す。ただし、ファイルが書き込まれる末尾のブロックでは、ブロックの途中までの書き込みとなる場合があり、その場合は、ブロックサイズ未満であっても、ステップＳ３０３を実行する。
【００９１】
（図６のステップＳ３０４）受信バッファ１０４内の１ブロック分またはその整数倍のデータをストレージに書き込むようにコマンドを発行する。すべてのブロック分のデータに対して、１つのコマンドを発行する場合、またはブロックサイズ分のデータごとにコマンドが分かれる場合があり得る。発行したコマンドはストレージ装置１３に出力される。なお、末尾ブロックの場合には、末尾のブロックに書き込まれる受信データのサイズとブロックサイズの差分のパディングデータを、当該受信データの後ろに付加して、出力してもよい。ストレージ装置１３はコマンドを実行して、受信バッファ１０４内の指定されたアドレスからデータを読み出し、読み出したデータを、コマンドで指示されるブロックに格納する。
【００９２】
（図６のステップＳ３０６）受信処理部１０３は、バッファ情報の読み出し位置情報を更新する。
【００９３】
（図６のステップＳ３０７）エクステントマップで指定されたサイズ分のデータがストレージ装置に書き込んだ場合は、本処理を終了し、まだ書き込みが完了していない場合は、ステップＳ３０１に戻る。
【００９４】
以上、第１の実施形態によれば、アプリケーションからファイルデータの受信要求を受けた場合に、ホストＣＰＵ１２とメインメモリ（不図示）にデータ転送処理の負荷を与えることなく、ネットワーク１４からファイルデータを受信して、ストレージ装置１３に書き込むことができる。
【００９５】
すなわち、公知な構成では、ホストＣＰＵは、アプリケーションのファイルデータの書き込み要求に基づき、デバイスドライバやファイルシステムソフトウェア等の制御ソフトウェアを実行することで、メタデータの生成、エクステントマップの取得を行い、それに従ってアプリケーションから渡されたデータを、ストレージ装置に書き込む。これに対して本実施形態は、メタデータの生成等の複雑な処理のみをホストＣＰＵ（ソフトウェア）で行い、それ以外の処理、つまり、ネットワーク１４から受信したファイルデータのストレージ装置への書き込み処理をデータ転送装置（例えば専用のハードウェア装置）で行う。よって、処理効率が向上し、データ転送の速度を向上させることができる。
【００９６】
また、ホストＣＰＵ１２、または、それに付随するチップセット、メモリ、マザーボードなどのグレードを下げることができるので、装置の低コスト化を図ることができる。または、データ転送の大部分の処理をホストＣＰＵ１２のソフトウェア処理ではなく、データ転送装置１１のハードウェア処理で実行することが可能となるので、装置の低消費電力化を図ることができる。
【００９７】
（第２の実施形態）
本実施形態は、ＴＣＰ／ＩＰのようなシーケンス番号によって、データの到着順を保証するプロトコルを考慮した処理を、第１の実施形態に追加するものである。以下、本実施形態について詳細に説明する。
【００９８】
図７は、本発明の第２の実施形態に係わるデータ転送装置を備えたデータ受信システムの概略構成を示すブロック図である。図１に示した要素と同一名称の要素には同一の符号を付して、拡張または変更された処理を除き、重複する説明を省略する。
【００９９】
図７において、図１のホストＣＰＵ１２に対してセッション情報管理部２０５が追加されている。セッション情報管理部２０５は、データ受信時に使用するＴＣＰ／ＩＰのセッション情報を管理する。
【０１００】
アプリ処理部２０１は、アプリケーションソフトウェアの処理によって、ファイル情報を取得する際に、ファイル受信時に使用するＴＣＰ／ＩＰのセッション情報（ＩＰアドレス、ポート番号、シーケンス番号等）もセッション情報管理部２０５から取得する。
【０１０１】
アプリ処理部２０１は、取得したセッション情報を、受信データ書き込み指示部２０４に通知する。典型的な例では、アプリ処理部２０１は、ファイル名やファイルサイズ等のファイル情報を、ネットワーク１４上の対向装置から取得し、その際に使用したセッションをそのまま流用する。その場合には、セッション情報にアクセスが可能となるように、そのセッションのセッション識別子を、受信データ書き込み指示部２０４に通知すればよい。
【０１０２】
受信データ書き込み指示部２０４は、エクステントマップ取得部２０３から通知されたエクステントマップと共に、アプリ処理部２０１から通知されたセッション情報をデータ転送装置１１に渡す。
【０１０３】
データ転送装置１１は、ホストＣＰＵ１１から通知されたエクステントマップとセッション情報を基に、データの到着順を考慮しながら、ファイルデータの受信処理を実施する。
【０１０４】
以下、図８を用いて、本実施形態に係るデータ転送装置の受信処理を詳しく説明する。図８は、受信処理部１０３で用いる情報（バッファ情報）を、受信処理部１０３を表すブロック内に記載したものである。なお、図８では、ホストＣＰＵ１２や、通知振り分け部１０２の表記は省略している。
【０１０５】
本実施形態では、受信バッファ１０４をリングバッファとして使用する。受信処理部１０３は、受信バッファ１０４の状態を、バッファ情報として管理する。受信処理部１０３が管理するバッファ情報は、図８に示すように、リングバッファの先頭を示した“先頭アドレス”（例えば、先頭アドレスは０）、ベース番号、有効領域位置情報、有効領域数を含む。
【０１０６】
ベース番号は、受信処理で使用するセッションにおいて、“先頭アドレス”に対応するシーケンス番号を示す。ベース番号は、対向装置からファイルデータが送信される最初のパケットのシーケンス番号に相当し、セッション形成時のパケットのシーケンス番号から特定可能である。上述の”先頭アドレス”およびベース番号は、受信データ書き込み指示部２０４から通知されたセッション情報に含まれている。セッション情報管理部２０５またはアプリ処理部２０１は、一例として、任意の値または所定の値を、”先頭アドレス”として指定する。”先頭アドレス”の指定を省略し、受信処理部１０３が、予め決めた値を”先頭アドレス”として決定しても良い。なお、本実施形態では、１シーケンス番号は１バイトに対応するとするが、本実施形態はこれに限定されるものではない。
【０１０７】
有効領域位置情報は、受信バッファ１０４でデータが連続して書き込まれている領域（有効領域）の範囲を特定する情報である。１つの有効領域位置情報は、データが書き込まれている開始アドレスに対応するシーケンス番号を表すｓｔｔと、終了アドレスに対応するシーケンス番号を表すｅｎｄの２つの情報を含む。
【０１０８】
ここでは、シーケンス番号を用いて有効領域位置情報を表す例を示したが、別の形態で表すことも可能である。例えば、受信バッファ１０４のアドレスを用いて、有効領域位置情報を表しても良い。つまり、ベース番号と”先頭アドレス”との対応から、受信バッファ１０４内のアドレスとシーケンス番号が一対一に対応付けされることから、アドレスとシーケンス番号のどちらを用いても有効領域位置情報を表現可能である。
【０１０９】
有効領域数は、受信バッファ１０４に存在する有効領域の数を示す。
【０１１０】
図９、図１０および図１１は、本実施形態の受信処理におけるバッファ情報および受信バッファ１０４の状態を時系列に示している。
【０１１１】
図９（１）は、受信開始時のバッファ情報と、受信バッファ１０４の状態を示す。図９の例では”先頭アドレス”に０、ベース番号に１０が設定されている。つまり、受信バッファ１０４のアドレス０には、対向装置から送られてくるＴＣＰ／ＩＰフレームのシーケンス番号１０のデータが書き込まれることになる。現時点で、受信バッファ１０４には、まだデータは書き込まれていないので、有効領域数は０が設定される。有効領域数０は、データがバッファに何ら書き込まれていない状態を示している。なお、図では、受信バッファ１０４を示す枠内の領域を、ブロックサイズごとに縦線で区切っている。
【０１１２】
図９（１）の状態で、シーケンス番号１０、長さ３００バイトのデータを含むフレームを受信すると、受信処理部１０３は、バッファ情報を確認する。有効領域数には０が設定されているので、受信バッファ１０４は空である。また、受信バッファ１０４のベース番号には１０が設定されているので、受信したフレーム内のデータは、受信バッファ１０４に書き込み可能であると判定する。したがって、シーケンス番号１０に該当するアドレス０から、アドレス３０９までデータを書き込む。このとき、有効領域数を１に設定する。また、有効領域０（現在有効に存在する有効領域を０、１、２、３・・・の連番によって識別する。ここでは最初の有効領域であるため０によって識別する）のｓｔｔ０を、有効領域０の開始アドレス（”先頭アドレス”に一致）に該当するシーケンス番号１０に設定し、ｅｎｄ０を有効領域０の終了アドレスに該当するシーケンス番号３０９に設定する（図９（２））。これにより、以降の受信処理で、シーケンス番号１０から３０９までのデータが、受信バッファ１０４に書き込まれていることを、データ転送装置１１は知ることができる。
【０１１３】
次に、図９（２）の状態で、シーケンス番号６００、長さ５００バイトのデータを含むフレームを受信する。受信処理部１０３はバッファ情報を確認し、有効領域数が１に設定されているので、有効領域０にデータが書き込まれていることを知る。有効領域０には、シーケンス番号１０から３０９のデータが受信されている。今回受信したフレームが、有効領域０に格納されているデータのシーケンス番号に連続していないため、受信バッファ１０４に、シーケンス番号６００から１０９９に該当するアドレス５９０から１０８９の領域を、新たに有効領域１として設定して、ここに受信データを書き込む。この時、有効領域数を２、有効領域１のｓｔｔ１を、有効領域１の開始アドレスに該当するシーケンス番号６００、ｅｎｄ１を有効領域１の終了アドレスに該当するシーケンス番号１０９９に設定する（図９（３））。
【０１１４】
次に、図９（３）の状態で、シーケンス番号３１０、長さ２５０バイトのデータを含むフレームを受信する。受信処理部１０３はバッファ情報を確認し、有効領域数が２に設定されているため、有効領域０と有効領域１にデータが書き込まれていることを知る。有効領域０のｅｎｄ０を確認すると、今回受信したフレームは、有効領域０に格納されているデータのシーケンス番号に連続している。そこで、有効領域０を拡張する形で、受信バッファ１０４に、シーケンス番号３１０から５５９に該当するアドレス３００から５４９に受信データを書き込む。この時、有効領域０を拡張したので、有効領域０のｅｎｄ０のみをシーケンス番号５５９に変更する（図１０（４））。
【０１１５】
ここで、ストレージ装置の１ブロックに相当するデータが受信バッファ１０４に存在するため、受信処理部１０３は、コマンド発行部１０１にバッファ情報を通知する。コマンド発行部１０１は、バッファ情報とエクステントマップから、受信バッファ１０４の読み出しアドレスと、ストレージ装置１３の書き込みアドレスを算出し、コマンドを発行する。受信バッファ１０４の読み出しアドレスは、バッファ情報内の”先頭アドレス”から１ブロック分である。ストレージ装置の書き込みアドレスは、受信データ書き込み指示部２０４から通知されたエクステントマップから特定する。発行されたコマンドをストレージ装置１３が実行することにより、受信バッファ１０４からデータが読み出され、ストレージ装置１３に書き込まれる。
【０１１６】
ストレージ装置１３への書き込みが完了すると、受信処理部１０３のバッファ情報は、ストレージ装置１３への書き込みが完了したデータ分の情報を除外する形で更新される。具体的には、図１０（５）のように、ベース番号を、ストレージ装置１３に書き込みが完了していない最小のシーケンス番号５２２に更新し、“先頭アドレス”を、ベース番号に該当する、受信バッファ１０４のアドレス５１２に更新する。また、有効領域０の最初の５１２バイト分がストレージ装置１３に書き込まれたので、有効領域０のｓｔｔ０を、ベース番号５２２に更新する。このように、バッファ情報を更新することで、ストレージ装置１３に書き込み完了したデータ領域を受信バッファ１０４から解放することができる。すなわち、当該データ領域は、以降は、空き領域として使用できる。
【０１１７】
次に、図１０（５）の状態で、シーケンス番号５６０、長さ４０バイトのデータを含むフレームを受信する。受信処理部１０３はバッファ情報を確認する。有効領域が２に設定されているため、有効領域０と有効領域１にデータが書き込まれていることを知る。今回受信したフレームは、有効領域０の終了アドレス５５９から、有効領域１の開始アドレス６００までの間に、書き込み可能であると判定される。そこで、有効領域０と有効領域１を結合する形で、シーケンス番号５６０から５９９に該当するアドレス５５０から５８９に、受信データを書き込む。このとき、有効領域１は有効領域０に統合され、有効領域数は１に更新する。また、有効領域０のｅｎｄ０を、有効領域１のｅｎｄ１に設定されていた１０９９に更新する（図１１（６））。
【０１１８】
ここで、再度、受信バッファ１０４にストレージ装置の１ブロックに相当するデータが存在することとなったため、コマンド発行部１０１が、データ書き込みコマンドをストレージ装置に発行し、書き込み完了したデータ分の情報を除外した形で、バッファ情報を更新する（図１１（７））。
【０１１９】
以降の処理も、上記と同様にバッファ情報を更新しながら受信処理を実施することで、指定されたエクステントマップのサイズ分のデータを、ストレージ装置１３に書き込むことができる。
【０１２０】
なお、受信したフレームのシーケンス番号（フレームに記載の開始シーケンス番号から始まるデータサイズ分のシーケンス番号群）のデータが受信バッファ１０４に収まらない場合、つまり受信したフレーム内のデータすべてを書き込む空き領域が受信バッファ１０４に存在しない場合は、受信したフレームを破棄すればよい。また、有効領域数に上限を設定しておき、有効領域数が上限を超えた場合にも、受信したフレームを破棄して良い。
【０１２１】
通信処理部１０５は、受信バッファ１０４においてファイルデータの先頭から連続して受信済みのデータ範囲を特定し、特定した受信済みのデータ範囲を識別する情報を、ネットワーク１４を介して対向装置に送信してもよい。特定した受信済みのデータ範囲を識別する情報として、特定した範囲に続く未受信のデータに対応するシーケンス番号のうちの最小シーケンス番号を表す情報を送信してもよい。具体的に、通信処理部１０５は、受信処理部１０３がデータを受信バッファ１０４に書き込んだ際に、有効領域０のｅｎｄ０を用いてＡＣＫ番号（ファイルデータの先頭から途切れなく受信できているシーケンス番号＋１）を算出して、対向装置にＡＣＫ応答を返しても良い。また、通信処理部１０５は、存在する有効領域に基づき、既に受信済みのシーケンス番号を算出し、ＳＡＣＫ（Ｓｅｌｅｃｔｉｖｅ−ＡＣＫ）を、対向装置に通知しても良い。
【０１２２】
以上、第２の実施形態によれば、シーケンス番号によって到着順を保証するプロトコルを用いる場合でも、ホストＣＰＵ１２とメインメモリ（不図示）に、データ転送処理の負荷を与えることなく、ネットワーク１４から受信したデータを正しいデータ順に並び替えて、ストレージ装置１３上に書き込むことができる。よって、処理効率が向上し、データ転送の速度を向上させることができる。
【０１２３】
また、ホストＣＰＵ１２、または、それに付随するチップセット、メモリ、マザーボードなどのグレードを下げることができるので、装置の低コスト化を図ることができる。
【０１２４】
または、データ転送の大部分の処理をホストＣＰＵ１２のソフトウェア処理ではなくデータ転送装置１１のハードウェア処理で実行することが可能となるので、装置の低消費電力化を図ることができる。
【０１２５】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【符号の説明】
【０１２６】
１１：データ転送装置
１２：ホストＣＰＵ
１３：ストレージ装置
１４：ネットワーク
１１１：コマンド発行制御部
１０１：コマンド発行部
１０２：通知振り分け部
１０３：受信処理部
１０４：受信バッファ
１０５：通信処理部
２０１：アプリ処理部
２０２：メタデータ生成部
２０３：エクステントマップ取得部
２０４：受信データ書き込み指示部
２０５：セッション情報管理部
【図１】
2015179328.tif 000003
【図２】
2015179328.tif 000004
【図３】
2015179328.tif 000005
【図４】
2015179328.tif 000006
【図５】
2015179328.tif 000007
【図６】
2015179328.tif 000008
【図７】
2015179328.tif 000009
【図８】
2015179328.tif 000010
【図９】
2015179328.tif 000011
【図１０】
2015179328.tif 000012
【図１１】
2015179328.tif 000013