(57)【特許請求の範囲】
【請求項１】
処理部が、メモリ内の単一のファイルをＮ個（Ｎは整数で、２以上）のデータ群に分割し、Ｎ個のデータ群とオフセット位置を示すＮ個の転送ジョブを作成する工程と、
前記処理部が、ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ）の同時接続数のＭ個のストリームのコネクションを形成するＭ個の転送スレッドにＮ個の転送ジョブを割り当て、前記各転送スレッドを前記処理部の複数のコアにスケジューリングし、前記ストリーム毎に暗号化を伴うデータ転送を実行し、前記Ｍ個のストリームのコネクションにより、前記Ｎ個の転送ジョブで指定された前記Ｎ個のデータ群とオフセット位置の内、前記Ｍ個の転送スレッドに割り当てられた前記Ｍ個のデータ群とオフセット位置を並列に転送する工程とを有し、
前記Ｍ個のストリームのコネクションは、それぞれ、当該コネクションを形成する転送スレッドに割り当てられた転送ジョブで指定されたデータ群とオフセット位置を転送することを特徴とするファイル転送方法。
【請求項２】
請求項１のファイル転送方法において、
前記作成されたＮ個の転送ジョブの内、Ｍ個の転送ジョブをスレッドプールに設けられた前記ＴＣＰの同時接続数Ｍの転送スレッドに割り当てる工程と、
前記スレッドプール内の前記Ｍ個の転送スレッドにより、前記Ｍ個のデータ群とオフセット位置を、前記ＴＣＰのＭ個のコネクションにより、並列に転送した結果、前記スレッドプール内の１つの転送スレッドの実行が完了すると、次の転送ジョブを前記転送スレッドに割り当て、前記転送スレッドを実行する工程とを更に有することを
特徴とするファイル転送方法。
【請求項３】
メモリ内の単一のファイルをＮ個（Ｎは整数で、２以上）のデータ群に分割し、Ｎ個のデータ群とオフセット位置を示すＮ個の転送ジョブを作成する工程と、
ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ）の同時接続数のＭ個のストリームのコネクションを形成するＭ個の転送スレッドにＮ個の転送ジョブを割り当て、前記各転送スレッドをコンピュータの複数のコアにスケジューリングし、前記ストリーム毎に暗号化を伴うデータ転送を実行し、前記Ｍ個のストリームのコネクションにより、前記Ｎ個の転送ジョブで指定された前記Ｎ個のデータ群とオフセット位置の内、前記Ｍ個の転送スレッドに割り当てられた前記Ｍ個のデータ群とオフセット位置を並列に転送する工程であって、前記Ｍ個のストリームのコネクションが、それぞれ、当該コネクションを形成する転送スレッドに割り当てられた転送ジョブで指定されたデータ群とオフセット位置を転送する工程とを、
前記コンピュータに実行させるプログラム。
【請求項４】
請求項３のプログラムにおいて、
前記作成されたＮ個の転送ジョブの内、Ｍ個の転送ジョブをスレッドプールに設けられた前記ＴＣＰの同時接続数Ｍの転送スレッドに割り当てる工程と、
前記スレッドプール内の前記Ｍ個の転送スレッドにより、前記Ｍ個のデータ群とオフセット位置を、前記ＴＣＰのＭ個のコネクションにより、並列に転送した結果、前記スレッドプール内の１つの転送スレッドの実行が完了すると、次の転送ジョブを前記転送スレッドに割り当て、前記転送スレッドを実行する工程とを
更にコンピュータに実行させるプログラム。
【請求項５】
処理部が、メモリ内の単一のファイルをＮ個（Ｎは整数で、２以上）のデータ群に分割し、Ｎ個のデータ群とオフセット位置を示すＮ個の転送ジョブを作成する工程と、
前記処理部が、ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ）の同時接続数のＭ個のストリームのコネクションを形成するＭ個の転送スレッドにＮ個の転送ジョブを割り当て、前記Ｍ個のストリームのコネクションにより、前記Ｎ個の転送ジョブで指定された前記Ｎ個のデータ群とオフセット位置の内、前記Ｍ個の転送スレッドに割り当てられた前記Ｍ個のデータ群とオフセット位置を並列に転送する工程とを有し、
前記Ｍ個のストリームのコネクションは、それぞれ、当該コネクションを形成する転送スレッドに割り当てられた転送ジョブで指定されたデータ群とオフセット位置を転送することを特徴とするファイル転送方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワークを介してファイルデータ（バルクデータ）を転送する技術に関する。
【背景技術】
【０００２】
比較的大きなデータ量のデータが、互いにネットワークで接続された異なるデータ通信装置間で転送されている。このデータは、バルクデータ又はファイルデータと呼ばれている。通常、データはファイル単位に処理される。このため、ファイルの転送は、単一ファイル単位で転送される。
【０００３】
一方、転送効率を上げるため、与えられた帯域を有効に使用する検討がなされている。このひとつに、ＵＤＰ(User Datagram Protocol)に従ったパケット分割技術がある（例えば、特許文献１参照）。ＵＤＰは、コネクションレスであり、且つ無手順のプロトコルであり、ＴＣＰ（Transmission Control Protocol）のプロトコルより制約が少ない。このため、ＵＤＰでは、データ転送レートを転送状態から検出し、データ転送レートを動的に調整することにより、帯域を有効に使用できる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】日本特許公開２０１３−０３８６６４号公報（日本特許第５１５２９４０号公報）
【発明の概要】
【発明が解決しようとする課題】
【０００５】
一方、前述のＴＣＰは、比較的複雑なプロトコルである。即ち、ＴＣＰは、転送毎にコネクションを確立し、且つ転送データのエラー検出等を行い、順序性、信頼性、データの完全性を保証するプロトコルである。特許文献１の技術は、簡易なプロトコルであるＵＤＰにおける帯域の有効利用技術であるため、ＴＣＰよるプロトコルに適用するのが、困難であった。
【０００６】
本発明の目的は、ＴＣＰプロトコルでファイル転送する際に、ＴＣＰの帯域を十分使用することができるファイル転送方法及びファイル転送プログラムを提供することにある。
【課題を解決するための手段】
【０００７】
この目的の達成のため、本発明の一側面は、処理部が、メモリ内の単一のファイルをＮ個（Ｎは整数で、２以上）のデータ群に分割し、Ｎ個のデータ群とオフセット位置を示すＮ個の転送ジョブを作成する工程と、前記処理部が、ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ）の同時接続数のＭ個のストリームのコネクションを形成するＭ個の転送スレッドにＮ個の転送ジョブを割り当て、前記各転送スレッドを前記処理部の複数のコアにスケジューリングし、前記ストリーム毎に暗号化を伴うデータ転送を実行し、前記Ｍ個のストリームのコネクションにより、前記Ｎ個の転送ジョブで指定された前記Ｎ個のデータ群とオフセット位置の内、前記Ｍ個の転送スレッドに割り当てられた前記Ｍ個のデータ群とオフセット位置を並列に転送する工程とを有し、前記Ｍ個のストリームのコネクションは、それぞれ、当該コネクションを形成する転送スレッドに割り当てられた転送ジョブで指定されたデータ群とオフセット位置を転送する。
【発明の効果】
【０００８】
単一のファイルをＮ個のデータ群に分割し、Ｎ個の転送ジョブを作成し、ＴＣＰの同時接続数Ｍのコネクションを利用して、Ｎ個の転送ジョブをＭ個のコネクションで多重転送するため、信頼性のあるＴＣＰの帯域をフルに使用して、ファイルを転送できる。即ち、サイズの大きいファイルの転送時間を短縮できる。又、分割データ群とともにそのデータ群のファイル内の開始位置を示すオフセットを転送するため、分割したファイルのデータ群を独立したコネクション（またはチャネル）で転送しても、受信側でオフセットから分割したデータ群を元のファイルに復元できる。
【図面の簡単な説明】
【０００９】
【図１】実施の形態のファイル転送システムのブロック図である。
【図２】第１の実施の形態のファイル転送構成の全体構成図である。
【図３】図２のファイル分割処理の説明図である。
【図４】図２の多重スレッドストリーミング処理の説明図である。
【図５】多重スレッド転送動作の説明図である。
【図６】図２の多重スレッドの使いまわし処理の説明図である。
【図７】図２のファイル転送システムのソフトウェアモジュールの構成図である。
【図８】図７の転送ジョブ作成処理のフロー図である。
【図９】図７の転送スレッド実行処理のフロー図である。
【図１０】第２の実施の形態のファイル転送方法の説明図である。
【図１１】第３の実施の形態のソフトウェアモジュールの構成図である。
【図１２】図１１のモニターモジュールの処理フロー図である。
【発明を実施するための形態】
【００１０】
以下、実施の形態を、ファイル転送方法の第１の実施の形態、ファイル転送構成、第２の実施の形態、第３の実施の形態、他の実施の形態の順で説明するが、開示の転送方法及びシステムは、この実施の形態に限られない。
【００１１】
（ファイル転送方法の第１の実施の形態）
図１は、実施の形態のファイル転送システムのブロック図である。図１に示すように、ファイル転送システムでは、第１の送受信システム１が、ＴＣＰ（Transmission Control Protocol）ネットワーク３を介し第２の送受信システム２に接続する。
【００１２】
この例では、第１の送受信システム１は、第１の記憶装置１０、第１の端末装置（ここでは、パーソナルコンピュータ）１２を備える。第１の端末装置１２は、第１の記憶装置１０を使用して所望のデータの読み書き処理を行う。又、第１の端末装置１２は、ＬＡＮ（Local Area Network）１８を介しＴＣＰネットワーク３に接続する。
【００１３】
第２の送受信システム２は、第２の記憶装置２０、第１のサーバー２２を備える。第１のサーバー２２は、第２の記憶装置２０を使用して所望のデータの読み書き処理を行う。又、第１のサーバー２２は、ＬＡＮ（Local Area Network）２８を介しＴＣＰネットワーク３に接続する。
【００１４】
第１のサーバー２２は、送受信システムのｓｓｈ（Security Shell）サーバー機能とｆｔｐ（Ｆｉｌｅ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ）サーバー機能とを構成する。又、第１の端末装置１２から第１のサーバー２２（第２の記憶装置２０への）へのデータ送信を、アップロードと称する。同様に、第１のサーバー２２（第２の記憶装置２０）から第１の端末装置１２（第１の記憶装置１０）へのデータ送信を、ダウンロードと称する。
【００１５】
第１の端末装置１２及び第１のサーバー２２の各々は、ＣＰＵ（Central Processing Unit）１００と、メモリ１１０及び通信デバイス１２０とを有する。この実施の形態では、第１の送受信システム１の第１の端末装置１２が、第１の記憶装置１０に格納されたファイル４を、第２の送受信システム２の第１のサーバー２２にＴＣＰネットワーク３を介しｓｓｈプロトコルを使用して、ファイル送信（アップロード）する例を説明する。
【００１６】
図２は、本実施の形態のファイル転送構成の全体構成図であり、図３は図２のファイル分割処理の説明図であり、図４は、図２の多重スレッドストリーミング処理の説明図であり、図５は、多重スレッド転送動作の説明図であり、図６は、図２の多重スレッドの使いまわし処理の説明図である。
【００１７】
図２に示すように、端末装置１２には、アプリケ―ション層のファイル転送モジュール４０，５０と、トランスポート層のＴＣＰ処理モジュール６０とからなる多重転送プログラムがインストールされる。ファイル転送モジュール４０、５０は、転送ジョブ作成モジュール４０と転送スレッド実行モジュール５０とを有する。
【００１８】
転送ジョブ作成プログラム４０は、送信すべき単一のファイル４のファイルサイズをチャンクサイズと呼ぶ単位に分割し（split）、分割したチャンク毎に、ファイル内の開始位置を示すオフセットを持つ転送ジョブを作成する。作成した転送ジョブは、ジョブリスト４１（図４参照）として管理される。
【００１９】
例えば、図３に示すように、転送すべきファイル４のファイルサイズ（file Size）を設定されたチャンクサイズ（chunk Size）で割り、ファイル４を先頭バイト位置からＮ（Ｎ＝file Size／chunk Sizeであり、整数）個のチャンク４−０〜４−Ｎ−１に仮想的に分割する。転送ジョブは、仮想的に分割された各チャンクに対応して作成される。
【００２０】
図２、図３では、分割したファイルを、チャンク０〜Ｎ−１で示す。そして、転送ジョブ作成モジュール４０は、各分割されたチャンク４−０〜４−Ｎ−１を個々に転送するため、転送スレッドを、ＴＣＰ同時最大接続数である最大ストリーム数分作成し、スレッドプール４２（メモリ１１０）に格納する（図４参照）。但し、ＴＣＰの同時最大接続数である最大ストリーム数よりチャンク数Ｎが小さい場合は、チャンク数であるＮ個のスレッドを作成し、スレッドプール４２（メモリ１１０）に格納する。
【００２１】
次に、図４に示すように、図２の転送スレッド実行モジュール５０は、転送ジョブリスト４１の先頭から転送ジョブを、スレッドプール４２内の作成された転送スレッドの数分取り出し、１つの転送スレッドに１つの転送ジョブを割り当て、スレッド毎に転送ジョブを並列に実行する。１つの転送スレッドは１つのコネクションを作成し、ＴＣＰのプロトコルラッパー（protocol wrapper）６０に転送ジョブに対応するチャンクの転送を依頼する。即ち、作成するコネクション数は転送スレッドの数と等しい。
【００２２】
ＴＣＰのプロトコルラッパー（protocol wrapper）６０は、個々のコネクションを使用して、分割されたチャンクを、ＴＣＰパケット３０−１の形式で並列に同時転送する。この時、ＴＣＰのプロトコルラッパー（protocol wrapper）６０は、パケットの暗号化など付加的な処理を実行する。
【００２３】
図２に戻り、ＴＣＰパケット３０−１は、インターネットであるＴＣＰ／ＩＰネットワーク３を経由して、第１のサーバー２２に転送される。第１のサーバー２２は、デーモン（daemon）処理（又はＳＳＨ処理）２２−１を実行し、受信したパケットを復号化する。そして、受信したパケット３０−２を複数のチャンク４−０〜４−Ｎ−１からなるファイル４に復元する。
【００２４】
図４では、第１のサーバー２２は、各コネクションに対し、独立にデータ転送処理２２−１を実行する。このデータ処理２２−１は、暗号化／復号化など付加的処理を含み、ＯＳのジョブスケジューリングで実行される。この受信プロセスでは、１つのＣＰＵ１００は、１つのプロセスを担当する。
【００２５】
図４では、転送すべきファイル４のファイルサイズが「１０５」、チャンクサイズが「１０」、ストリーム数が「３」の例を示す。転送ジョブ作成モジュール４０は、ファイル４を１１個（＝１０５／１０＝１１）のチャンクに分割し、個々のチャンクの先頭位置を示すオフセットとファイル名を付加した１１個の転送ジョブを作成し、ジョブリスト４１に格納する。
【００２６】
例えば、ジョブリスト４１において、転送ジョブ０（offset 0と記す）は、チャンク０に対応する。同様に、転送ジョブ１〜１０（offset １０〜１００と記す）のそれぞれは、チャンク１〜１０に対応する。
【００２７】
転送ジョブ作成モジュール４０は、スレッドプール４２に最大ストリーム数（ここでは、３個）の転送スレッドを作成する。転送スレッド実行プログラム５０は、スレッドプール４２の３つの転送スレッドの個々に転送ジョブを割り当て（即ち、３つの転送ジョブを３つのストリームのコネクションに割り当て）、ＴＣＰのプロトコルラッパー（protocol wrapper）６０に転送を依頼する。そして、図４では、ＴＣＰのプロトコルラッパー（protocol wrapper）６０は、３つのストリームで３つのチャンクを並列に多重転送する。
【００２８】
図５は、この多重転送動作の摸式図である。図５においては、最大ストリーム数（同時接続数）をＭ（例えば、図５では、図４と異なり、「４」）とする。又、ソースファイル４は、Ｎ個のチャンク４−０〜４−Ｎ−１に分割されたものとする。更に、１番目と２番目のチャンク４−０，４−１は転送済みである。その場合、３番目以降のＭ個（ここでは、４個）のチャンクが、Ｍ個（ここでは、４個）のストリーム(コネクション)に割り当てられ、並列に転送される。即ち、単一のファイル４が複数のファイル単位に分割され、分割されたファイル単位が個々に独立のＴＣＰコネクションで転送される。
【００２９】
この個々のＴＣＰコネクションは独立であるため、単一のＴＣＰコネクションと同一の転送制御、例えば、コネクト、エラー検出、リトライ、エラー訂正、ディスコネクト、を行う。又、個々のＴＣＰコネクションでは、データの順序性を保証する。このため、図５に示すように、４つのストリームでは、リトライ等のため、転送の進行度が異なる場合がある。図５では、ディスティネーションファイル４Ａ内のチャンク内に転送の進行度を、パーセントで表示する。
【００３０】
又、チャンク数Ｎが最大ストリーム数Ｍより小さい場合は、このチャンク数Ｎを同時接続数とする。更に、１度接続したストリームのコネクションを１つのチャンクを転送後も保持し続け、チャンク数Ｎがストリーム数Ｍより大きい場合、別の未転送チャンクを転送する際に再利用する。これにより、コネクション接続に関わる通信手続きを短縮できる。図５で説明すると、Ｍ個のストリームは、１つのチャンクの転送終了後、矢印に示すように、そのストリームのコネクションを１つのチャンクを転送後も保持し続け、別の未転送チャンク（図５でwaitingと表示したもの）を転送する際に再利用する。
【００３１】
図４の転送例でのコネクションの再利用を、図６で説明する。図６において、図４で説明したものと同一のものは同一の記号で示す。図４では、１番目、２番目、３番目のチャンク０，１、２の転送ジョブが３つの転送スレッド０，１，２に割り当てられ、並列転送が行われていた。
【００３２】
ここで、１番目、２番目のチャンク０，１の転送が完了すると、転送スレッド０，１のコネクションを保持し続け、４番目、５番目チャンク４．５の転送ジョブを、空いた(転送が完了した)２つの転送スレッド０，１に割り当てる。以降、同様にして、転送スレッドがチャンクの転送を完了すると、ラウンド・ロビン方式で、空いた転送スレッドを、ジョブリスト４１の次の未処理の転送ジョブに割り当てる。
【００３３】
更に、図４に示すように、端末装置１２のＣＰＵ１００が、マルチコア（例えば、３コア以上）構成であり、Ｊａｖａ(登録商標)で動作している場合には、ＪＶＭ（Java Virtual Machine）により、それぞれの転送スレッドが、それぞれのコアに割り当てられ、処理される。即ち、１つのＪＶＭが、それぞれのスレッドを複数のコアにスケジューリングして、処理を割り当て、処理を実行する。本実施の形態では、ストリーム毎にデータ転送に必要な処理を行う。例えば、暗号化通信を伴うファイル転送では、単一ファイルから読み出したデータに対し暗号化処理を実施後、実際にファイル転送する。このため、暗号化処理時に使用されるＣＰＵは１つに限定され、データ転送動作とは別の遅延が発生する。このため、結果として、転送に要する時間が遅延する。
【００３４】
これに対し、本実施の形態では、暗号化処理を伴うファイル転送時に、ストリーム毎に暗号化処理を実施してデータ転送する。このため、ストリーム数に応じたＣＰＵを並列に使用でき、データ転送動作とは別の遅延量を小さくできる。
【００３５】
このように、単一ファイルを複数のチャンクに分割し、個々の転送スレッドを作成することにより、ＴＣＰの最大接続数のストリームで、複数のチャンクを同時転送する。このため、ＴＣＰの制約内で、ＴＣＰの帯域を最大限使用できる。又、ＴＣＰの信頼性、順序性、データ完全性をそのまま利用できる。
【００３６】
一方、分割された個々のチャンクは、１つのファイルとみなして、ＴＣＰ転送される。このため、受信側では、複数のファイルが転送された場合と区別が難しい。即ち、受信側で、転送された個々のチャンクから元の単一のソースファイル４を復元する工夫が必要である。
【００３７】
本実施の形態では、図５に示すように、転送する個々のチャンクデータに同じファイル名とオフセット値を付加する。オフセット値は、チャンクデータのファイル４内での開始位置を示し、チャンクデータの先頭に付加される。即ち、このオフセット値は、図３で説明したように、チャンク分割した際のそのチャンクの開始アドレスである。受信側では、チャンクデータを受信した際に、同じファイル名の個々の開始オフセット位置から個々のチャンクデータを書き始める。従って、全てのチャンクデータを転送し終わると、ディスティネーションファイル４Ａが復元できる。
【００３８】
（ファイル転送構成）
図７は、本実施の形態のファイル転送構成のブロック図であり、図８は、図７の転送ジョブ作成モジュールの処理フロー図であり、図９は、図７の転送スレッド実行モジュールの処理フロー図である。図７において、図１乃至図６で説明したものと同一のものは同一の記号で示す。又、図１と同様に、第１の送受信システム１の第１の端末装置１２が、第１の記憶装置１０に格納されたファイル４を、第２の送受信システム２の第１のサーバー２２にＴＣＰネットワーク３を介しファイル転送（アップロード）する例で説明する。
【００３９】
図７に示すように、端末装置１２では、ＣＰＵ１００が、前述の転送ジョブ作成モジュール４０と、スレッドプール４２と、転送スレッド実行モジュール５０と、暗号化モジュール６０−１と、エラーコード生成モジュール６０−２とを実行する。暗号化モジュール６０−１と、エラーコード生成モジュール６０−２とは、ＴＣＰモジュール６０の一部である。
【００４０】
転送ジョブ作成モジュール４０は、記憶装置１０のソースファイル４（図１参照）をチャンクサイズ単位に分割し（split）、分割したチャンク毎に転送ジョブを作成し、ジョブリスト４１に格納する。又、転送ジョブ作成モジュール４０は、ＴＣＰの最大接続数である最大ストリーム数分の転送スレッドを作成し、スレッドプール４２に格納する。転送スレッド実行モジュール５０は、スレッドプール４２内の作成された転送スレッドに、転送ジョブを割り当て、個々のスレッドへコネクションを割り当て、ＴＣＰのプロトコルラッパー（protocol wrapper）６０に転送を依頼する。
【００４１】
ＴＣＰのプロトコルラッパー（protocol wrapper）６０は、最大ストリーム数（最大接続数）分のコネクション（セッション）を作成し、個々のコネクションを使用して、分割されたチャンクを、ＴＣＰパケット３０−１の形式で並列に同時転送する。この時、ＴＣＰのプロトコルラッパー（protocol wrapper）６０は、暗号化モジュール６０−１でパケットを暗号化処理し、エラーコード生成モジュール６０−２でエラーコードを生成する。送信部（通信デバイス）１２０は、インターネット３を介し送受信データ通信装置２２と最大ストリーム数のコネクションを確立し、ＴＣＰに従い、データ転送する。
【００４２】
送受信データ通信装置２２では、ＣＰＵ１００が、エラーコード検査モジュール２２−２と、復号化モジュール２２−１と、チャンクリアセンブルモジュール２２−３とを実行する。受信部（通信デバイス）１２０は、インターネット３を介しＴＣＰパケットを受信し、エラーコード検査モジュール２２−２は、受信したＴＣＰパケットのエラーを検査する。復号化モジュール２２−１は、エラー検査後のパケットデータを復号化する。チャンクリアセンブルモジュール２２−３は、複数のストリームのチャンクを前述のオフセット値を用いて、ディスティネーションファイル４Ａを復元する（図５参照）。
【００４３】
図８により転送ジョブ作成モジュール４０を説明する。この例では、チャンクサイズ及び同時接続数（コネクション数）Ｍは、ユーザーが指定する固定値である。又、図１０でも説明するように、チャンクサイズを自動割り振りできる。先ず、制御ポインタを説明する。ポインタｊは、チャンク数を示し、初期値は「０」である。ｆｉｌｅ  ｓｉｚｅは、ファイル４のトータルサイズである。Ｎはチャンク数である。Ｍは最大同時接続数である。
【００４４】
Ｓ１：転送ジョブ作成モジュール４０を起動すると、転送ジョブ作成モジュール４０は、チャンクサイズｃｈｕｎｋ  ｓｉｚｅ、ファイルサイズｆｉｌｅ  ｓｉｚｅ及び最大接続数Ｍを読み込む。
【００４５】
Ｓ２：チャンクサイズｃｈｕｎｋ  ｓｉｚｅが、「０」を越えているか判定する。チャンクサイズｃｈｕｎｋ  ｓｉｚｅが、「０」を越えている場合（ｔｒｕｅ）、先ずチャンクサイズが指定されている。
【００４６】
Ｓ３：チャンクサイズｃｈｕｎｋ  ｓｉｚｅが、「０」を越えていない場合（ｆａｌｓｅ）、チャンクサイズｃｈｕｎｋ  ｓｉｚｅは指定されていない。このため、チャンクサイズｃｈｕｎｋ  ｓｉｚｅを計算する。ここでは、図１０の第２の実施の形態でも説明するように、分割したチャンクのサイズｃｈｕｎｋ  ｓｉｚｅが、各チャンクで等しくなるように、チャンクサイズｃｈｕｎｋ  ｓｉｚｅを計算する。例えば、チャンク分割数Ｎを規定値とし、ファイルサイズをチャンク分割数で割り、チャンクサイズｃｈｕｎｋ  ｓｉｚｅを計算する。
【００４７】
Ｓ４：次に、チャンクポインタ数Ｊを初期化し（「０」）、チャンク分割数Ｎを計算する。ステップＳ３で分割数Ｎが規定値なら計算の必要がない。チャンクサイズｃｈｕｎｋ  ｓｉｚｅが指定されている場合には、図２乃至図３で説明したように、チャンク分割数Ｎ（ｆｉｌｅ  ｓｉｚｅ／ｃｈｕｎｋ  ｓｉｚｅ）を計算する。そして、プールとしてスレッドプール（領域）を確保する（ｐｏｏｌ：Ｔｈｒｅａｄ  ｐｏｏｌ）し、プールの最大ジョブ数（ｐｏｏｌ．ｍａｘＪｏｂ）を、同時最大接続数Ｍに設定する（即ち、Ｍ個の転送スレッドを作成する）。そして、ジョブリストｊｏｂＬｉｓｔの領域（Ｖｅｃｔｏｒ（Ｎ））を確保する。尚、ブロック内のモニター（ｍｏｎｉｔｏｒ）は，図１１以下の第３の実施の形態で使用するものであり、第３の実施の形態で説明する。
【００４８】
Ｓ５：チャンクポインタｊが、チャンクの分割数Ｎより小さいか（ｊ＜Ｎ）を判定する。
【００４９】
Ｓ６：チャンクポインタｊが、チャンクの分割数Ｎより小さい場合（ｔｒｕｅ）は、まだ、ファイル４をＮ分割していない状態である。このため、新たなチャンク（転送）ジョブを作成し、ジョブリスト４１に追加する。
【００５０】
Ｓ７：次に、チャンクポインタｊをインクリメント（ｊ＋＋）する。そして、ステップＳ５に戻る。
【００５１】
Ｓ８：チャンクポインタｊが、チャンクの分割数Ｎより小さくない（大きい）場合（ｆａｌｓｅ）は、既に、１つのファイル４に対し、Ｎ個のチャンクの転送ジョブを作成し終えた状態を示す。このため、スレッドプール４２内の転送スレッドに転送ジョブを割り当て、起動（ｓｔａｒｔ）する。これにより、図９の転送スレッド実行モジュールが、最大接続数Ｍの各転送スレッドに対し開始する。この転送スレッド実行モジュールの処理は、図９で後述する。
【００５２】
Ｓ９：スレッドプール４２内の各転送スレッドがｗａｉｔ状態（割り当てる転送ジョブがない）となったかを判定する。
【００５３】
Ｓ１０：スレッドプール４２内の各転送スレッドがｗａｉｔ状態となると、スレッドプール４２に、転送の失敗（ｆａｉｌｅｄ）ジョブがあるかを判定する。
【００５４】
Ｓ１１：ステップＳ１０で、スレッドプール４２内に失敗ジョブがないと判定する（ｆａｌｓｅ）と、転送成功と判断し、終了する。
【００５５】
Ｓ１２：ステップＳ１０で、スレッドプール４２内に失敗ジョブがあると判定する（ｔｒｕｅ）と、転送失敗と判断し、終了する。この場合、ファイル全体の転送失敗と判断する。
【００５６】
このように、ファイル転送を開始する際、ファイルをＮ個のチャンクに分割し、それぞれの転送ジョブを作成する。又、スレッドプールを設け、同時接続数Ｍ分のスレッドを格納し、転送ジョブを転送スレッドに割り当て、転送スレッドの実行（最大接続数の多重転送）を制御する。スレッドプール内の１つの転送スレッドの実行が完了すると、次の転送ジョブを転送スレッドに割り当て、転送スレッドを実行（チャンク転送を起動）する。スレッドプール内の転送スレッドに割り当てる転送ジョブがなくなると、１つのファイル転送完了と判断する。
【００５７】
次に、図９により、転送スレッド実行モジュール５０を説明する。先ず、制御ポインタを説明する。ｒｅｔｒｙは、ＴＣＰの転送リトライ回数を示す。転送状態（ｓｔａｔｅ）は、成功（ｓｕｃｃｅｓｓ）であるか、失敗（ｆａｉｌｅｄ）であるかのいずれかを示す。ｂｕｆｆｅｒは、メモリ１１０内での転送すべきファイルの先頭アドレス（allocate()）を示す。オフセット(offset)は、前述のファイル４内の各チャンクの先頭位置を示し、例えば、i番目のチャンクは、offset=i*chunk size (図３で説明したチャンクサイズ)である。
【００５８】
Ｓ２０：転送スレッド実行モジュール５０を開始すると、リトライポインタretryを「０」に初期化し、転送状態（ｓｔａｔｅ）に失敗（ｆａｉｌｅｄ）を、bufferに、転送すべきファイル４の先頭アドレスをセットする。又、オフセット（Offset）を「i*chunk size」で計算する。
【００５９】
Ｓ２１：セッション（session）を接続（connect）にセットする。これにより、ＴＣＰラッパ６０（図４参照）は、ＴＣＰコネクションを確立する。
【００６０】
Ｓ２２：ＴＣＰラッパ６０から接続に成功したかの通知を受けたかを判定する。接続に成功したとの通知を受けなかった場合（ｆａｌｓｅ）、ステップＳ２９に進む。
【００６１】
Ｓ２３：ＴＣＰラッパ６０から接続に成功したとの通知を受けた場合（ｔｒｕｅ）、転送長ｌｅｎをセットする。即ち、１つのチャンクデータを複数のＴＣＰパケットに分割して、ＴＣＰ転送する。このため、そのチャンクのオフセット位置からＴＣＰパケットの読み込みサイズｂｕｆｆｅｒ分のデータを読み出し、その読み込みサイズを転送長ｌｅｎに設定する。
【００６２】
Ｓ２４：読み出したデータを、ＴＣＰラッパ６０の転送バッファに書き込む。これにより、当該コネクションでそのチャンクのデータ転送を開始する。
【００６３】
Ｓ２５：ＴＣＰラッパ６０からＩ／Ｏエラーの通知があったかを判定する。
【００６４】
Ｓ２６：Ｉ／Ｏエラーの通知がない場合（ｆａｌｓｅ）、そのチャンクの転送が完了したと判断し、オフセット（ｏｆｆｓｅｔ）を更新する。即ち、ｏｆｆｓｅｔ＝ｏｆｆｓｅｔ＋ｌｅｎを計算する。
【００６５】
Ｓ２７：次に、ストリームの終了、即ち、ＥＯＳ（ｅｎｄ  ｏｆ  ｓｔｒｅａｍ  ｃｏｎｄｉｔｉｏｎ）であるか判定する。ＥＯＳは、例えば、ｏｆｆｓｅｔ＞＝（ｉ＋１）＊ｃｈｕｎｋ  ｓｉｚｅとなった場合（即ち、Ｓ２６でファイルサイズを越えた場合）や、ファイルの終了に到達した場合である。ＥＯＳでない場合（ｆａｌｓｅ）、ステップＳ２２に戻る。
【００６６】
Ｓ２８：ステップＳ２７でＥＯＳであると判定すると（ｔｒｕｅ）、転送状態（ｓｔａｔｅ）を成功（ｓｕｃｃｅｓｓ）に設定し、終了する。
【００６７】
Ｓ２９：ステップＳ２５でＩ／Ｏエラーの通知があった場合（ｔｒｕｅ）、リトライ回数ｒｅｔｒｙを「１」インクリメントする。
【００６８】
Ｓ３０：リトライ回数ｒｅｔｒｙがリトライ回数の最大（ｍａｘＲ）を越えたかを判定する。リトライ回数ｒｅｔｒｙがリトライ回数の最大（ｍａｘＲ）を越えた場合（ｔｒｕｅ），転送動作を終了する。この場合、転送状態（ｓｔａｔ）は、ステップＳ２０で初期設定された失敗のままとなる。
【００６９】
Ｓ３１：リトライ回数ｒｅｔｒｙがリトライ回数の最大（ｍａｘＲ）を越えていない場合（ｆａｌｓｅ），セッションを閉鎖（ｃｌｏｓｅ）し、ステップＳ２１に戻る。
【００７０】
このように、転送スレッドを実行する際に、セッションを接続（ｃｏｎｎｅｃｔｉｏｎ）に設定し、当該チャンクの転送コネクションを確保する。当該チャンクの転送コネクションを確保すると、当該チャンクのデータ及びオフセットをＴＣＰラッパ６０に出力する。ＴＣＰラッパ６０が当該コネクションで当該チャンクデータ及びオフセットをＴＣＰで転送する。尚、図９の処理は、１つの転送スレッド分を示し、図８で説明したように、最大接続数Ｍ個の処理が走る。
【００７１】
（ファイル転送方法の第２の実施の形態）
図１０は、第２の実施の形態のファイル転送方法の説明図である。図２で説明した第１の実施の形態では、チャンクサイズは固定であった。このため、図３に示すように、末尾のチャンク４−Ｎ−１のデータ長はチャンクサイズ以下となる可能性がある。
【００７２】
このため、最大同時接続数Ｍを使用した場合、末尾のチャンク４−Ｎ−１を、それ以前の順番のチャンクと並列転送している場合、末尾のチャンクデータが先に転送完了してしまう。この実施の形態は、このような事態を防止し、ファイルを分割して、最大同時接続数Ｍの並列転送することにより、転送時間をより短縮する。
【００７３】
図１０に示すように、ファイルの各チャンクのチャンクサイズを同じにした。この処理は、図８のステップＳ２，Ｓ３で説明した。ファイルの各チャンクのチャンクサイズを同じにしたため、最大同時接続数Ｍを使用した場合、末尾のチャンク４−Ｎ−１を、それ以前の順番のチャンクと並列転送している場合、末尾のチャンクデータが先に転送完了してしまうことを防止できる。このため、ファイルを分割して、最大同時接続数Ｍの並列転送することにより、転送時間をより短縮できる。
【００７４】
（ファイル転送方法の第３の実施の形態）
図２で説明した第１の実施の形態では、最大同時接続数（ストリーム数）Ｍは一定であった。図１１、図１２で説明する第３の実施の形態では、最大同時接続数（ストリーム数）Ｍを転送スピードに応じて変更するものである。例えば、既に転送を終えたチャンクの転送速度に応じて動的に最大接続数を変更する。
【００７５】
図１１は第３の実施の形態のソフトウェアモジュール構成図である。図１１において、図２乃至図６で説明したものと同一のものは、同一の記号で示してある。即ち、図１１の構成は、転送ジョブ作成モジュール４０、スレッドプール４２、転送スレッド実行モジュール５０及びＴＣＰラッパ６０の他に、モニターモジュール７０を設けた。このモニターモジュール７０は、ＴＣＰラッパ６０による転送速度をモニターし、スレッドプール４２の最大接続数Ｍ（転送スレッド数）を変化する。
【００７６】
図１２は、図１１のモニターモジュール７０の処理フロー図である。
【００７７】
Ｓ５０：モニターモジュール７０は、旧速度oldSpeed、現在速度currentSpeedを、「０」に初期化する。
【００７８】
Ｓ５１：モニターモジュール７０は、スレッドプール内の全スレッドの転送速度を、ＴＣＰラッパ６０から取得し、新速度newSpeedを、その合計を計算して得る。
【００７９】
Ｓ５２：現在速度currentSpeedが、設定した遅延時間（例えば、１０００ｍｓ）前の旧速度oldSpeedの１．２倍より大きいか（早いか）を判定する。
【００８０】
Ｓ５３：現在速度currentSpeedが、１０００ｍｓ前の旧速度oldSpeedの１．２倍より大きい場合（ｔｒｕｅ）、最大接続数Ｍを「１」インクリメントする。図７で言えば、ステップＳ３の最大接続数Ｍが増加する。
【００８１】
Ｓ５４：現在速度currentSpeedが、１０００ｍｓ前の旧速度oldSpeedの１．２倍より大きくない場合（ｆａｌｓｅ）、現在速度currentSpeedが、１０００ｍｓ前の旧速度oldSpeedの０．８倍より小さいか（遅いか）を判定する。
【００８２】
Ｓ５５：現在速度currentSpeedが、１０００ｍｓ前の旧速度oldSpeedの０．８倍より小さい場合（ｔｒｕｅ）、最大接続数Ｍを「１」デクリメントする。図８で言えば、ステップＳ４の最大接続数Ｍが減少する。
【００８３】
Ｓ５６：現在速度currentSpeedを、ステップＳ５１の新速度newSpeedに更新する。
【００８４】
Ｓ５７：スレッドプール４２に転送スレッドが転送完了しているかを判定する。スレッドプール４２に転送スレッドが転送完了していない場合（ｆａｌｓｅ），終了する。
【００８５】
Ｓ５８：一方、スレッドプール４２に転送スレッドが転送完了している場合（ｔｒｕｅ）、１０００ｍｓスリープし、ステップＳ５１に戻る。
【００８６】
このようにして、スレッドプール内の転送実行中の転送スレッドの転送速度に応じて、同時最大接続数を変更するため、ＴＣＰの最大ストリーム数を有効に利用できる。又、転送速度が遅い場合、同時最大接続数を減少するため、無用な再送等を防止できる。
【００８７】
（他の実施の形態）
前述の実施の形態では、１つのファイルの転送を例に説明したが、プログラムの起動時に同時に転送するように指定した複数のファイルにも適用できる。若しくはデイレクトリを同時に転送する場合にも適用できる。その際、単一のファイル毎に、前述したファイルの分割と多重化通信を行う。又、同時接続数はプログラムの起動単位で保持し、ストリーム数は複数のファイルに跨って算出する。
【００８８】
以上、本発明を実施の形態により説明したが、本発明の趣旨の範囲内において、本発明は、種々の変形が可能であり、本発明の範囲からこれらを排除するものではない。
【産業上の利用可能性】
【００８９】
単一のファイルをＮ個のデータ群に分割し、Ｎ個の転送ジョブを作成し、ＴＣＰの最大接続数のコネクションを利用して、Ｎ個の転送ジョブをＭ個のコネクション（転送スレッドの実行）で多重転送するため、信頼性のあるＴＣＰの帯域をフルに使用して、ファイル転送できる。即ち、サイズの大きいファイルの転送時間を短縮できる。又、分割データ群とともにそのデータ群のファイル内の位置を示すオフセットを転送するため、分割したファイルのデータ群を独立したコネクション（またはチャネル）で転送しても、受信側でオフセットから分割したデータ群を元のファイルに復元できる。
【符号の説明】
【００９０】
１：クライアント、２：サーバー、３、インターネット、４、転送ソースファイル、４Ａ：ディスティネーションファイル、４−０〜４−Ｎ−１：チャンク(データ群)、ＯＦ：オフセット、１０、２０：記憶装置、１２，２２：端末装置、４０：転送スレッド作成モジュール、４２：スレッドプール、５０：転送スレッド実行モジュール、６０：ＴＣＰラッパ、１００：ＣＰＵ(処理部)、１１０：メモリ、１２０：通信デバイス。    
【図１】
0005996691.tif 000002
【図２】
0005996691.tif 000003
【図３】
0005996691.tif 000004
【図４】
0005996691.tif 000005
【図５】
0005996691.tif 000006
【図６】
0005996691.tif 000007
【図７】
0005996691.tif 000008
【図８】
0005996691.tif 000009
【図９】
0005996691.tif 000010
【図１０】
0005996691.tif 000011
【図１１】
0005996691.tif 000012
【図１２】
0005996691.tif 000013