データ転送装置、データ送信システム、データ送信方法およびプログラム
【課題】ホストCPUの処理負担を軽減させて効率的なデータ転送を行う。
【解決手段】データ転送装置は、コマンド発行部と、送信データ抽出部と、通信処理部と、を備える。コマンド発行部は、制御装置から読み出しが指示されたブロックの読み出しコマンドを記憶装置に対して発行する。送信データ抽出部は、読み出しコマンドに応じて記憶装置から読み出されたデータから送信データを抽出する。通信処理部は、予め定められたプロトコルに基づいて、抽出された送信データをネットワークに送信する。
【解決手段】データ転送装置は、コマンド発行部と、送信データ抽出部と、通信処理部と、を備える。コマンド発行部は、制御装置から読み出しが指示されたブロックの読み出しコマンドを記憶装置に対して発行する。送信データ抽出部は、読み出しコマンドに応じて記憶装置から読み出されたデータから送信データを抽出する。通信処理部は、予め定められたプロトコルに基づいて、抽出された送信データをネットワークに送信する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、データ転送装置、データ送信システム、データ送信方法およびプログラムに関する。
【背景技術】
【0002】
昨今、映像のストリーミング配信が普及しつつある。例えばVOD(Video On Demand)サーバと呼ばれるコンテンツ配信サーバによってストリーミング配信が行われている。このようなコンテンツ配信サーバは、自身がもつストレージから映像コンテンツを読み出し、ネットワーク接続されたユーザの端末に送信する処理を行う。通信プロトコルは、TCP/IPベースのHTTP(Hyper Text Transport Protocol)や、リアルタイム通信向けのUDP/IPベースのRTP(Realtime Transport Protocol)等が使われる。また、RTPの場合は誤り訂正にFEC(Forward Error Correction)等が使われる。
【0003】
このようなVODサーバに用いられるストレージやネットワーク等のデバイスの高速化は著しく進んでいる。イーサネット(登録商標)は、現在1Gbpsが主流になりつつあり、データセンター等では10Gbpsが使われ始めている。また、次世代の40Gbps/100Gbpsイーサネットの仕様策定も完了し、これらについても今後着実に普及していくものと思われる。また、ストレージに関してはHDD(Hard Disk Drive)のRAID(Redundant Arrays of Inexpensive Disks)のストライピング処理(並列化)による高速化に加えて、昨今のSSD(Solid State Drive)の転送性能の向上は著しい。I/F(インタフェース)規格のSATA(Serial Advanced Technology Attachment)に関しても、バンド幅6GbpsのSATA3.0が既に普及している状況であり、単体で実効4Gbps超の読み出しレートを出す製品も出てきている。
【0004】
このようなネットワークやストレージのI/O性能向上に伴って、それを制御するホストCPU(Central Processing Unit)の処理負荷も増大していく。従来はTCP/IPオフロードエンジン(以下、TOE)という技術により、その解決が試みられてきた。TOEは、ホストCPUに代行して、前述のTCP/IPの処理を行う専用プロセッサや専用回路を設けたものであり、ホストCPUからTCP/IP処理負荷をオフロードするものである。このTOEを用いることによって、従来のソフトウェアによる通信プロトコル処理よりも高速にTCP/IP処理を行うことが可能となり、ネットワークストレージの性能向上に貢献できる。
【0005】
ストレージやTOEは、それぞれホストCPUによってスレーブ的に制御され、データはメインメモリを介して入出力することが想定されている。よって、ストレージ上のデータをネットワークに入出力する際、ストレージ(SSD、HDD等)とTOEの間のデータ転送は、通常メインメモリを介して行われる。
【0006】
また、ホストCPU上で動作する、これらの間をブリッジするアプリケーションソフトウェア、または、OS(Operating System)のカーネル空間とユーザ空間のデータの受け渡し処理等により、メインメモリ上で何回分か転送データのコピーが発生する場合もある。さらにストレージにはファイルシステム処理も必要である。一般的なファイルシステムの実装では、ストレージから固定バイト長のセクタ単位で読み書きしたデータを一旦メモリ上に保持し、メモリから任意バイト長のファイルとしてのデータをアプリケーションバッファにコピーする形で渡す。このため、ファイルシステム処理でもデータのコピーが発生する。
【0007】
さらに、コンテンツ配信サーバでは、映像コンテンツのトリックプレイ(早送り再生、巻き戻し再生など、通常再生とは異なる再生形態)に対応した送信を行う必要があり、通常のファイル転送より条件が複雑である。
【0008】
このように、ストレージとTOEの間でデータ転送を行う場合は、ホストCPUのソフトウェア処理が介在することから、少なくとも一回はメインメモリへの読み書きが必要となる。また、OS、アプリケーション、および、ファイルシステムの処理により、メインメモリ上で場合によっては複数回分のメモリコピーが発生し、メインメモリの負荷が大幅に増大する。このようなメモリ負荷の増大に対し、従来は十分な処理性能を持つホストCPUと高速のメインメモリを用意して対応していた。
【先行技術文献】
【特許文献】
【0009】
【特許文献1】特開2005−316629号公報
【発明の概要】
【発明が解決しようとする課題】
【0010】
しかしながら、昨今のネットワークストレージの10Gbpsに迫る転送レートの向上を鑑みると、コストや消費電力の増大が少なからず問題となってきた。特に、メインメモリの性能を上げるためには、一般にホストCPUのグレードアップも伴う。PC(パーソナルコンピュータ)やサーバ等の場合は、付随するチップセットのグレードアップも必要となる。これにより、コストや消費電力の問題が特に顕著となる。
【課題を解決するための手段】
【0011】
実施形態のデータ転送装置は、コマンド発行部と、送信データ抽出部と、通信処理部と、を備える。コマンド発行部は、制御装置から読み出しが指示されたブロックの読み出しコマンドを記憶装置に対して発行する。送信データ抽出部は、読み出しコマンドに応じて記憶装置から読み出されたデータから送信データを抽出する。通信処理部は、予め定められたプロトコルに基づいて、抽出された送信データをネットワークに送信する。
【図面の簡単な説明】
【0012】
【図1】第1の実施形態に係るデータ送信システムのブロック図。
【図2】エクステントマップの構成例を示す図。
【図3】第1の実施形態におけるデータ転送処理のフローチャート。
【図4】コマンドとアドレス領域との対応の一例を示す図。
【図5】第2の実施形態に係るデータ送信システムのブロック図。
【図6】第2の実施形態におけるデータ転送処理のフローチャート。
【図7】エクステントマップの構成例を示す図。
【図8】第2の実施形態の通信処理部のブロック図。
【図9】TTS0〜TTS7のデータの並びを例示する図。
【図10】トリックプレイ向け送信の動作概要を示す図。
【図11】第3の実施形態に係るホストCPUのブロック図。
【図12】第3の実施形態に係る通信処理部のブロック図。
【図13】第3の実施形態におけるデータ転送処理のフローチャート。
【図14】Iフレームとパケットとの関係の一例を示す図。
【図15】データパケットのグルーピングの一例を示す図。
【図16】データパケットのグルーピングの一例を示す図。
【図17】第3の実施形態の変形例に係るホストCPUのブロック図。
【発明を実施するための形態】
【0013】
以下に添付図面を参照して、この発明にかかるデータ転送装置、データ送信システム、データ送信方法およびプログラムの好適な実施形態を詳細に説明する。
【0014】
(第1の実施形態)
図1は、第1の実施形態に係るデータ送信システムの概略構成例を示すブロック図である。破線矢印は制御の流れを示し、実線矢印はストレージから読み出したデータの流れを示し、太い実線矢印は読み出したデータのうち送信するデータ(送信データ)の流れを示す。
【0015】
第1の実施形態のデータ送信システムは、制御装置としてのホストCPU(プロセッサ)200と、記憶装置としてのストレージ300と、データ転送装置100とを備えている。ホストCPU200の制御に基づき、データ転送装置100が送信データをストレージ300から読み出し、ネットワーク400に送信する。
【0016】
第1の実施形態のデータ送信システムの具体的な製品形態としては、PC、サーバ装置、専用LSI、およびFPGA(Field Programmable Gate Array)等のネットワークストレージ、VOD(Video On Demand)サーバ、並びにWebサーバなどが想定されるが、これらに限定されるものではない。
【0017】
ホストCPU200は、データ送信システム全体を制御する。ホストCPU200は、ソフトウェアで実行する主な処理部として、ファイル指定部201と、メタデータ指定部202と、メタデータ解析部203と、送信データ特定部204と、管理情報読み出し指示部205と、エクステントマップ取得部206と、送信データ読み出し指示部207と、を備えている。ホストCPU200は、その他の種々の処理を行うことが可能である。
【0018】
ファイル指定部201は、送信データが含まれるファイルを指定する。メタデータ指定部202は、ファイル内での送信データの位置の特定に利用する特定情報を含むメタデータを指定する。メタデータ解析部203は、指定されたメタデータを解析する。送信データ特定部204は、解析されたメタデータの情報をもとに、指定されたファイルの中の送信データの位置を特定する。
【0019】
管理情報読み出し指示部205は、ストレージ300の管理情報の読み出しを指示する。管理情報とは、ストレージ300に記憶される実データのメタデータである。管理情報は、例えば実データとストレージ300の記録領域とのマッピング情報を含む。なお、管理情報はその他諸々の情報も含む。
【0020】
エクステントマップ取得部206は、読み出した管理情報を解析して、送信データのエクステントマップ(マップ情報)を取得する。エクステントマップとは、ストレージ300内のデータの記憶位置を特定する情報である。エクステントマップの詳細については後述する。
【0021】
送信データ読み出し指示部207は、データ転送装置100に対して、データの読み出しおよびデータの送信を指示する。
【0022】
ストレージ300は、送信データを含む各種データを格納する。ストレージ300の具体的な実装形態は、例えばSSD、HDDおよびSDメモリカード等が想定されるが、その限りではない。また、ストレージ300がRAID機能を備えてもよい。データ転送装置100内のストレージ300とのインタフェースにRAID機能を備えてもよい。
【0023】
データ転送装置100は、ホストCPU200に代行し、ストレージ300からデータを読み出し、読み出したデータに対して通信処理を行い、読み出したデータをネットワーク400に送信する。データ転送装置100は、コマンド発行部110と、通知振り分け部120と、送信データ抽出部130と、通信処理部140と、を備えている。
【0024】
コマンド発行部110は、ストレージ300に対してデータの読み出し等のコマンドを発行する。通知振り分け部120は、発行したコマンドの応答通知を受け取り、受け取った応答通知をホストCPU200とデータ転送装置100とのいずれかに振り分ける。送信データ抽出部130は、ストレージ300から読み出されたデータを受け取り、受け取ったデータから必要なデータを抽出する。通信処理部140は、抽出されたデータに対して予め定められた通信プロトコルに従った通信処理を行い、抽出されたデータをネットワーク400に送信する。
【0025】
通信処理部140は、前述したTOEに相当する。データ転送装置100の具体的な実装の形態としては、FPGAおよび専用LSIなどが想定される。データ転送装置100をPCIカードおよびPCI−Expressカードとして実装してもよい。なお、実装形態はこれらに限られるものではない。
【0026】
ネットワーク400は、イーサネットおよび無線LANなどのあらゆる無線通信または有線通信により構成できる。
【0027】
ホストCPU200とデータ転送装置100は、データ送信システムがPCやサーバ装置などの場合は例えばチップセットやPCI Express等で接続されてもよい。データ送信システムがSoCなどの場合は、ホストCPU200とデータ転送装置100は、例えば専用のバスなどで接続されてもよい。ストレージ300とデータ転送装置100は、例えばSATA、SAS、SCSI、および、SDメモリカード規格などで接続される。これらは一例であり、その他のあらゆる接続方式を適用できる。
【0028】
データ転送装置100は、ハードウェアとソフトウェアのいずれにより構成してもよく、実装の形態は問わない。処理効率の観点からは、ハードウェアベースで構成することが望ましい。また、通信処理部140による通信処理はどのような処理であってもよい。通信処理部140による通信処理としては、例えば、TCP/IPベースのプロトコル処理、UDP/IPベースのプロトコル処理、IPTV向けRTP/FECベースのプロトコル処理、イーサネット処理、および、無線処理などが挙げられる。
【0029】
なお、TCPのような対向装置とコネクションを張るプロトコルの場合、以下の動作説明は、相手とコネクションを張った後のデータ転送の段階での動作になる。
【0030】
ストレージ300は、データを例えばセクタ、クラスタまたはページと呼ばれる単位で管理する。ここでは簡単のため、これらを総称してブロックと呼ぶ。ユーザが扱うデータはブロック単位ではないため、ストレージ300は通常ファイルシステムによりアクセスされる。ファイルシステムは、バイト単位のファイルデータをブロック単位のストレージ300の記録領域にマッピングする仕組みである。ファイルシステムは、ストレージ300上の予め定められた領域に、上述の管理情報をデータと併せて記憶する。
【0031】
ストレージ300からファイルデータを読み出す際は、まずこの管理情報を読み出し、読み出した管理情報を解析し、所望のファイルデータが実際にどのブロックに記憶されているかを表す情報であるエクステントマップを得る。そして、取得したエクステントマップに従ってブロックごとのデータ(ブロックデータ)を読み出し、ブロックデータから必要部分だけを抽出して所望のデータを得る。
【0032】
次に、エクステントマップの詳細について説明する。図2は、エクステントマップの構成例を示す図である。図2は、1ブロックが512バイトであり、ブロック235〜238に所望のファイルの一部のデータが格納されている例を示している。データは、ブロック235の124バイト目から始まっている。このため、データの位置を示す情報(有効データ位置情報)は、オフセット124バイト、長さは1458バイト、などと表わされる。エクステントマップは、ブロック位置情報と、有効データ位置情報とを含む。ブロック位置情報は、データが格納されているブロックの位置を表す情報である。図2の例では、ブロック235〜238が、ブロック位置情報に相当する。有効データ位置情報は、ブロック位置情報で示されるブロック内で、有効データが格納されている位置を表す情報である。このように、エクステントマップは、ストレージ300のどの位置に所望のデータが格納されているかが特定できる情報である。
【0033】
図2の例では、データが格納されているバイト位置をオフセットと長さで有効データ位置情報を示している。有効データ位置情報は、始端バイト位置と終端バイト位置等で表してもよい。このように、有効データ位置情報は、有効データの位置が特定できれば表現形式は問わない。また、図2の例では1458バイトの1つのデータ列の例を示したが、エクステントマップは離散的な複数のデータ列を表わしていてもよい。すなわち、1つのエクステントマップに、例えばブロック235〜238のうちの1458バイトを示す情報と、ブロック346〜350のうちの2000バイトを示す情報の2つのデータ列を含んでいてもよい。
【0034】
なお、以上はエクステントベースのファイルシステムの場合に当てはまる。本実施形態は、ブロック(クラスタ)ベースのファイルシステムにも適用できる。ブロック(クラスタ)ベースのファイルシステムの場合は、エクステントの代わりにブロック(クラスタ)のリストになる。このブロック(クラスタ)のリストをエクステントの特殊な場合(1つのエクステントの長さを512バイトに固定したもの)とみなせば、エクステントベースの場合と同様に考えることが可能である。以後はエクステントの用語を用いて説明し、これら両方を含むものとする。
【0035】
公知の技術では、通常、ホストCPUはアプリケーションのファイルデータ読み出し要求に基づき、デバイスドライバやファイルシステムソフトウェア等の制御ソフトウェアを実行することで、このエクステントマップを取得する。そして、ホストCPUは、エクステントマップに従って所望のデータをストレージから読み出し、アプリケーションに読み出したデータを返す。それに対して本実施形態では、ホストCPU200による処理の一部をデータ転送装置100が代行し、そのままネットワーク400にデータを送信する。具体的な処理の流れは次のようになる。
【0036】
図3は、第1の実施形態におけるデータ転送処理の全体の流れを示すフローチャートである。
【0037】
まず、ファイル指定部201が、例えばアプリケーションソフトウェアの処理に従い送信するファイルを特定し、特定したファイルを送信データ特定部204に指定する(ステップS101)。典型的な例としては、ファイル指定部201は、ネットワーク400に接続された他の機器から要求されたファイルを、送信するファイルとして特定する。
【0038】
さらに、メタデータ指定部202が、送信データの特定に利用するメタデータを指定する(ステップS102)。
【0039】
メタデータに含まれる特定情報は、単純には指定されたファイルの中の送信データのバイト位置を示すものでもよい。例えば、1000バイトのファイルのうち、10バイト目から99バイト目、200バイト目から299バイト目、および、500バイト目から699バイト目の3つのデータの固まりを送信する場合を考える。この場合、特定情報は、(先頭位置,長さ)の形式の3つのデータ(10,90)(200,100)(500,200)を含むリストデータ形式、または、テーブル形式で表される。データが映像や音声コンテンツのストリーミングのデータである場合、特定情報は、再生時間を表わすものであってもよい。例えば、全長が2時間のコンテンツで、そのうち、開始から10分後の時点から15分間、および、開始から30分後の時点から20分間のデータを送信する場合を考える。この場合、特定情報は、(開始時間[sec]、時間の長さ[sec])の形式の2つのデータ(600,900)(1800,1200)で表記してもよい。
【0040】
特定情報は、例えば対向装置で視聴するユーザが指定した位置そのものでもよい。また、特定情報は、コンテンツのうちの特定の俳優が映っているシーンなどを自動抽出したような、データ送信システム側からユーザに対して視聴を推奨する位置のようなものであってもよい。
【0041】
次に、メタデータ解析部203が、指定されたメタデータを解析する(ステップS103)。
【0042】
次に、送信データ特定部204が、解析されたメタデータの情報をもとに、指定されたファイルから、送信データを特定する(ステップS104)。送信データ特定部204は、特定した送信データの位置と、送信データの長さとを含む情報、または当該情報の集合を、管理情報読み出し指示部205に渡す。
【0043】
管理情報読み出し指示部205は、渡された送信データの情報に基づき、ストレージ300からファイルシステムの管理情報を読み出すコマンドの発行を、データ転送装置100のコマンド発行部110に指示する(ステップS105)。
【0044】
ストレージ300は、この指示に応じてコマンド発行部110から発行されたコマンドに基づき、管理情報を読み出してエクステントマップ取得部206に渡す(ステップS106)。
【0045】
エクステントマップ取得部206は、読み出された管理情報を解析し、読み出す送信データのエクステントマップを取得する(ステップS107)。なお、エクステントマップ取得部206が、予めキャッシュしたエクステントマップを取得するように構成してもよい。この場合は、エクステントマップ取得部206が同様の手順で予めエクステントマップを読み出しておく必要がある。
【0046】
次に、送信データ読み出し指示部207が、取得したエクステントマップを、データ転送装置100に渡し、データ転送装置100に対してそのデータの読み出しと送信を指示する(ステップS108)。
【0047】
データ転送装置100のコマンド発行部110が、送信されたエクステントマップを受け取り、受け取ったエクステントマップに従って、実際に送信データを含むブロックを読み出すべく、ストレージ300にコマンドを発行する(ステップS109)。
【0048】
コマンド発行部110は、ストレージ300側のI/F仕様に従ったコマンドを発行する。通常、一度に指定できる読み出しブロック数に限りがあったり、離散的なブロックは同時に指定できなかったりなどの制限がある場合がある。このため、1つのエクステントマップが複数のコマンド群に分割される場合もある。このように、コマンド発行部110は、必要に応じて1つのエクステントマップに対するコマンドを分割する処理も行う。
【0049】
コマンド発行部110がコマンドを順次ストレージ300に対して発行すると、ストレージ300からコマンドに対する応答として送信データが含まれたブロックデータが返ってくる。送信データ抽出部130が、ストレージ300から返された送信データを受け取る。
【0050】
なお、送信データ読み出し指示部207は、ステップS108でコマンド発行部110に指示を出す一方、送信データ抽出部130に対して、個々のコマンドで読み出されるブロックデータのどの部分に送信データが含まれているかを表す情報を渡す。すなわち、前述の図2の例では、送信データ読み出し指示部207は、ブロック235〜238というブロック位置情報をコマンド発行部110に渡し、オフセット124バイトおよび長さ1458バイトという有効データ位置情報を送信データ抽出部130に渡す。
【0051】
送信データ抽出部130は、受け取ったブロックデータから、有効データ位置情報に従い所望のバイト数(図2の例では1458バイト)のデータ列を抽出し、通信処理部140に渡す(ステップS110)。通信処理部140は、必要に応じて対向装置と制御情報を送受信しながら、ネットワーク400上に、抽出された送信データを送信する(ステップS111)。
【0052】
次に、ストレージ300とのI/F処理についてより詳しく説明する。まず、ストレージ300が典型的なSSDやHDDなどのSATA I/Fを備え、さらにバスマスターとしての機能(DMA機能)を備える場合について説明する。この場合、コマンド発行部110は、例えばストレージ300へのコマンドとして、デスクリプタと呼ばれるコマンドを記述したデータを、所定のメモリ上に用意しておく。ストレージ300はコマンドを当該メモリから読み出す。このようにしてコマンド発行部110が発行したコマンドがストレージ300に受け渡される。
【0053】
デスクリプタは通常リングバッファ形式になっており、典型的な公知の技術ではホストCPU200が使用するメインメモリ(主記憶装置、不図示)上に置かれる。本実施形態でも同じ形態をとってもよいが、データ転送装置100内のメモリ、または、データ転送装置100に直接接続されるメモリを用いることが、メインメモリやホストCPU200に負荷を与えないという点で望ましい。
【0054】
ストレージ300が読み出したブロックデータをDMAで書き込む宛先アドレスも、それぞれのデスクリプタに予め指定される。ストレージ300から読み出した管理情報はホストCPU200に渡し、送信データは通信処理部140に渡すといった振り分けは、このアドレス指定によって実現する。すなわち、管理情報をホストCPU200に渡す場合は、通常はメインメモリを介して行うので、デスクリプタに記載する宛先アドレスにメインメモリのアドレスを記載する。送信データを送信データ抽出部130に渡す場合は、宛先アドレスに送信データ抽出部130のアドレスを記載する。これによって、ストレージ300がデスクリプタによって指定された宛先アドレスに読み出したデータを書き込むだけで、読み出したデータをそれぞれに振り分けることができる。
【0055】
ストレージ300は、コマンドを実行してデータを読み出した後に、通知振り分け部120に対してコマンド完了通知を行う。ストレージ300は、例えば割り込みなどによって完了通知を行う。より具体的には、ストレージ300は、例えばどこまでコマンドを処理したか、すなわち、リングバッファのデスクリプタ群のどのデスクリプタまで処理したかを、各デスクリプタの処理完了を示すDONEビットをセットするなどにより通知する。
【0056】
通知振り分け部120は、割り込み通知を受けると、このDONEビットが書かれているデスクリプタを順次読み出し(読み出した後はDONEビットをリセットする)、そのデスクリプタまで処理が完了していることを判断できる。なお、一度に複数のデスクリプタの処理が完了している場合もあり得る。
【0057】
通知振り分け部120は、管理情報の読み出しに用いられるデスクリプタの完了通知を受けた場合は、管理情報読み出し指示部205に完了通知を振分ける。また、通知振り分け部120は、送信データの読み出しに用いられるデスクリプタの完了通知を受けた場合は、送信データ読み出し指示部207に完了通知を通知する。このようにして通知振り分け部120は完了通知をそれぞれに振り分ける。
【0058】
管理情報読み出し指示部205は、通知振り分け部120から完了通知を受けると、管理情報の読み出しが完了したと判断し、エクステントマップ取得部206にエクステントマップの取得を指示する。
【0059】
ストレージ300によるブロックデータの転送には、通常は一定のレイテンシが存在する。このため、ホストCPU200は、転送指示に対するストレージ300からの完了通知を毎回待たずに、複数のブロックの読み出しをまとめて指示する場合がある。その場合、そのままでは送信データ読み出し指示部207(および管理情報読み出し指示部205)とストレージ300と送信データ抽出部130との3者の間で同期が取られなくなる。このため、例えば以下の手法により同期を行う。
【0060】
1つ目の手法は、ストレージ300がコマンドを受けた順番と必ず同じ順番で読み出しを実行する場合に有効な手法である。この手法では、送信データ読み出し指示部207がストレージ300からの複数のブロックの読み出しを指示するとき、その指示と同じ順番で、対応するブロックの中の有効データ位置情報を送信データ抽出部130に通知する。送信データ抽出部130は、受け取った有効データ位置情報を例えばキューイングしておく。送信データ抽出部130は、ストレージ300からブロックデータを受け取った際、キューイングした有効データ位置情報をキューイングした順番に1つずつ取り出せば、ブロックデータとの対応付けができる。
【0061】
2つ目の手法は、ストレージ300が、内部処理の効率等を優先する場合等で、コマンドを受けた順番とは異なる順番で読み出しを実行し得る場合の手法である。この場合は、例えば各ブロックの宛先アドレスとして異なるアドレスを指定する手法等が考えられる。
【0062】
例えば8個の読み出しコマンドをストレージ300にまとめて指示する場合、送信データ読み出し指示部207は、8個のコマンドごとに異なる転送先アドレスを指定しておく。上述のように本実施形態では、転送先のアドレスに送信データ抽出部130のアドレスを指定する。2つ目の手法を適用する場合は、例えば1つのコマンドで最大4つのブロックの読み出し指示を出す場合、各コマンドに対応する転送先アドレスとして、それぞれ送信データ抽出部130のアドレス領域のうちの異なるアドレス領域を指定しておく。
【0063】
図4は、コマンドとアドレス領域との対応の一例を示す図である。図4は、送信データ抽出部130のアドレス領域が0x20200000〜0x202fffffの場合の例を示している。コマンド番号は、コマンドを識別する情報である。図4に示すように、0x20200000〜0x202007ffの512×4バイト領域がコマンド0に対応し、0x20200800〜0x20200fffの512×4バイト領域がコマンド1に対応し、0x20201000〜0x202017ffの512×4バイト領域がコマンド2に対応するというように、コマンドとアドレス領域とを予め対応付けておく。送信データ読み出し指示部207は、発行するコマンドに対して、対応するアドレス領域の先頭を指定するようにコマンド発行部110に指示する。
【0064】
これにより、転送されたブロックデータは、送信データ抽出部130の中の異なるアドレス領域に転送される。送信データ抽出部130は、受けたブロックデータが例えば0x20201200から始まるアドレスに書き込まれたデータであれば、当該データはコマンド2の先頭から2番目のブロックデータであることが特定できる。また、例えばコマンド2で読み出されるブロックデータに対して図2に示す有効データ位置情報が通知されている場合、このブロックデータは有効データの389バイト目から900バイト目のデータであることが分かる。
【0065】
送信データ読み出し指示部207は、送信データ抽出部130に対して8個の有効データ位置情報を通知する。その際、送信データ読み出し指示部207は、コマンド0に対応する有効データ位置情報、コマンド1に対応する有効データ位置情報、コマンド2に対する有効データ位置情報・・・、などのように、有効データ位置情報がいずれのコマンドに対応するかを特定できるように通知する。
【0066】
このような構成により、送信データ抽出部130は、受けたブロックデータ、および、有効データ位置情報がともに、いずれのコマンドに対するものかを判別できる。すなわち、送信データ抽出部130は、コマンドと、ブロックデータおよび有効データ位置情報との対応付けが可能となる。
【0067】
このように、ブロックデータの宛先アドレス領域を分けることによって、送信データ抽出部130が受け取ったブロックデータの順番がもとのデータ列の順番(通常はネットワークに送信する順番)と異なる場合でも、ブロックデータの宛先アドレスを確認することで、そのデータがどのコマンドに基づくデータかが判断できるので、それをもとにデータ列を元の順番に並び替えることが可能となる。
【0068】
なお、アドレスを使うことは本実施形態の一例である。ブロックデータを特定可能な情報であれば、アドレス以外のどのような情報を用いてもよい。また、以上のストレージ300I/Fの詳細は一例であり、これに限られるものではない。
【0069】
ストレージ300が内部エラー等の何らかの理由により、要求されたコマンドの実行を完了できない場合がある。この場合、ストレージ300は、データ転送装置100にエラー通知を行う。このままではホストCPU200はエラーの情報を得られないので、このような場合に、データ転送装置100がホストCPU200にエラー通知を中継して従来通りホストCPU200も異常を知ることができるように構成してもよい。
【0070】
また、通知振り分け部120は必ずしもデータ転送装置100上に構成する必要はなく、ホストCPU200上に構成してもよい。また、コマンド発行部110もその一部の処理をホストCPU200側で行ってもよい。ただし、1つの送信データ読み出し指示を複数のコマンドに分割する処理はデータ転送装置100上で行う方が処理効率の面で望ましい。
【0071】
このように、第1の実施形態にかかるデータ転送装置では、アプリケーションからの要求に基づき、ホストCPU200にデータ転送処理の負荷を与えることなくストレージ300上のデータをネットワーク400に送信することができる。従って、処理効率が向上し、データ転送速度を向上させることができる。また、ホストCPU200、ホストCPU200に付随するチップセット、メモリ、およびマザーボードなどのグレードを下げることができるので、装置の低コスト化を図ることができる。また、データ転送の大部分の処理をホストCPU200のソフトウェア処理ではなくデータ転送装置100のハードウェア処理で実行することが可能となるので、低消費電力化を図ることができる。
【0072】
(第2の実施形態)
第2の実施形態は、データ転送用に複数の通信コネクションが設定され、コネクションごとに独立してフロー制御を行う例を示している。例えばNAS(Network Attached Storage)のようなネットワークストレージ、VODサーバに接続される複数のクライアント端末、または、クライアント端末上の複数のアプリケーションから、同時に読み出し要求やコンテンツ配信要求を受けた場合などに、複数の独立したコネクションでストレージからデータを読み出してネットワークに送信する動作を可能とする。
【0073】
図5は、第2の実施形態に係るデータ送信システムの概略構成例を示すブロック図である。
【0074】
図5に示すように、第2の実施形態のホストCPU200−2は、ファイル指定部201と、メタデータ指定部202と、メタデータ解析部203と、送信データ特定部204−2と、管理情報読み出し指示部205−2と、エクステントマップ取得部206と、送信データ読み出し指示部207−2と、を備えている。
【0075】
第2の実施形態では、送信データ特定部204−2、管理情報読み出し指示部205−2、および送信データ読み出し指示部207−2の機能が第1の実施形態と異なっている。その他の構成および機能は、第1の実施形態のブロック図である図1と同様であるので、同一符号を付し、ここでの説明は省略する。
【0076】
送信データ特定部204−2および管理情報読み出し指示部205−2は、コネクションごとに処理を実行する点が、第1の実施形態と異なっている。送信データ読み出し指示部207−2は、コネクションを識別するコネクション識別情報とともに、データの読み出しを指示する点が、第1の実施形態と異なっている。
【0077】
第2の実施形態のデータ転送装置100−2は、コマンド発行部110と、通知振り分け部120と、送信データ抽出部130−2と、通信処理部140−2と、フロー制御部150−2と、バッファ管理部160−2と、データバッファ170−2と、を備えている。
【0078】
第2の実施形態では、フロー制御部150−2とバッファ管理部160−2とデータバッファ170−2とを追加したこと、および、送信データ抽出部130−2と通信処理部140−2の機能が第1の実施形態と異なっている。その他の構成および機能は、第1の実施形態のブロック図である図1と同様であるので、同一符号を付し、ここでの説明は省略する。
【0079】
データバッファ170−2は、送信データ抽出部130−2と通信処理部140−2との間のデータの受け渡しのためにコネクションごとにデータをバッファリングする。以下では、データバッファ170−2内のコネクションごとのデータを記憶する領域を、単にバッファという場合がある。
【0080】
バッファ管理部160−2は、データバッファ170−2のコネクションごとの状態(バッファ状態)を管理する。フロー制御部150−2は、バッファ管理部160−2からの通知に基づいてコネクションごとのデータのフロー制御を行う。図5では、フロー制御情報の伝達は太い破線で表わしている。
【0081】
送信データ抽出部130−2は、抽出した送信データをデータバッファ170−2に記憶する点が、第1の実施形態と異なっている。通信処理部140−2は、バッファ管理部160−2により管理されるバッファ状態に応じて、データバッファ170−2から送信データを読み出す点が、第1の実施形態と異なっている。
【0082】
図6は、第2の実施形態におけるデータ転送処理の全体の流れを示すフローチャートである。
【0083】
ステップS201からステップS207までは、第1の実施形態のデータ転送処理を示す図3のステップS101からステップS107までと同様の処理なので、その説明を省略する。
【0084】
本実施形態では、送信データ読み出し指示部207−2が、取得したエクステントマップとともに、コネクション識別情報をデータ転送装置100−2に渡し、データ転送装置100−2に対してそのデータの読み出しと送信を指示する(ステップS208)。送信データ読み出し指示部207−2は、例えば、アプリケーションから受け取ったコネクション識別情報をデータ転送装置100−2に渡す。
【0085】
データ転送装置100−2では、フロー制御部150−2がデータの読み出しの指示を受ける。フロー制御部150−2は、コネクションごとにエクステントマップを保持する。すなわち、フロー制御部150−2は、複数のコネクションのデータ読み出し要求を一旦保持しておく。そして、バッファ管理部160−2からバッファに空きがあるコネクションの通知を受けると、フロー制御部150−2は、通知を受けたコネクションの送信データの読み出しコマンドの発行をコマンド発行部110に対して指示する。
【0086】
コマンド発行部110は、フロー制御部150−2から受け取ったエクステントマップに従って、送信データを含むブロックを読み出すための読み出しコマンドを発行する(ステップS209)。ステップS210は、第1の実施形態のステップS110と同様の処理なので、その説明を省略する。
【0087】
第2の実施形態では、送信データ抽出部130−2は、ブロックデータから抽出した送信データを、データバッファ170−2に記憶する(ステップS211)。また、通信処理部140−2は、データバッファ170−2から送信データを読み出してネットワーク400に送信する(ステップS212)。
【0088】
初期状態では全てのコネクションのバッファは空いているので、フロー制御部150−2は、そのままコマンド発行部110に送信データの読み出しを指示することになる。同じコネクションのデータの送信が連続して要求されると、フロー制御部150−2が要求を一旦保持し、バッファ管理部160−2からのバッファ空き通知を待つ状況になる場合がある。
【0089】
コマンド発行部110に一度にコマンド発行を要求するデータのサイズは、バッファの空きサイズ(空き容量)以下でなければならない。一例として、データバッファ170−2のコネクションごとのバッファが128KBずつ確保され、バッファ管理部160−2がいずれかのコネクションで64KB以上バッファに空きが生じたら、そのコネクションのバッファ空きをフロー制御部150−2に通知するものとする。
【0090】
ホストCPUから渡されたエクステントマップが、これより大きいサイズのデータを示している場合も当然ながらあり得る。しかし、フロー制御部150−2が一度にコマンド発行を要求可能なデータのサイズは空いた分の64KB以下のサイズの部分データである。このため、フロー制御部150−2は、この部分データの読み出しをコマンド発行部110に要求する。同時にフロー制御部150−2は、この部分データの中の有効データ位置情報を送信データ抽出部130−2に渡す。そして、フロー制御部150−2は、読み出し処理を完了した部分データの位置を進捗情報としてコネクションごとに保持し、一旦コマンド発行要求を終える。
【0091】
以上の処理を、図7を用いて説明する。図7は、エクステントマップの構成例を示す図である。図7は、ブロック位置情報としてブロック235〜1000、有効データ位置情報としてオフセット124バイト、長さ391602バイトを表すエクステントマップをホストCPU200−2から与えられた例を示している。この場合、最初の部分データは、例えば64KB以下の切りの良いところとしてブロック235〜362の65412バイトとなる。そして、この部分データの有効データ位置情報は、オフセット124バイト、長さ65412バイトである。フロー制御部150−2は、ブロック235〜362の読み出しコマンドの発行をコマンド発行部110に要求する。フロー制御部150−2は、同時に送信データ抽出部130−2にオフセット124バイト、長さ65412バイトという有効データ位置情報を渡す。フロー制御部150−2は、進捗情報として次回処理するブロックはブロック363、または、65413バイト目、という情報を保持し、一旦処理を終える。フロー制御部150−2は、バッファ管理部160−2からの次のバッファ空き通知を待つ。
【0092】
なお、以上で述べた64KBなどの各種データサイズは一例であり、この例に限られるものではない。また、データサイズは一定である必要もなく、サイズが毎回変わる場合も本実施形態を適用できる。
【0093】
一旦部分データの処理を終え、その後に他のコネクションのデータバッファが空いたという通知をバッファ管理部160−2から受けると、フロー制御部150−2は、通知を受けたコネクションに対して同様に部分データの読み出し要求処理を行う。そして、あるコネクションに関して与えられたエクステントマップが示すデータの全てを送信し終える(図7の場合は6番目の部分データの読み出し要求を完了する)と、そのコネクションの与えられたエクステントマップが示すすべてのデータの送信が完了となる。フロー制御部150−2は、すべてのデータの送信が完了した旨をホストCPU200−2に通知する。
【0094】
ホストCPU200−2では、例えば管理情報読み出し指示部205−2がこの通知を受け取り、次のアプリケーションからのデータ送信処理、すなわち管理情報読み出し指示部205−2から始まる一連の処理を実行可能とする。逆に、この通知を受けるまで、管理情報読み出し指示部205−2が次の管理情報の読み出しを一旦保留することで、送信データ特定部204−2との間のフロー制御を実現する。
【0095】
なお、ホストCPU200−2がこの通知を受けるのは必ずしも管理情報読み出し指示部205−2である必要はない。例えば、エクステントマップ取得部206、または、送信データ読み出し指示部207−2でもよい。すなわち、最終的にアプリケーションに対してバックプレッシャが伝達されるようになっていれば、いずれの構成部が通知を受けてもよい。
【0096】
また、以上の例ではデータ転送装置100−2がコネクションごとに同時に1つしかエクステントマップを受け付けない例を示したが、2つ以上のエクステントマップを受け付けるように構成してもよい。複数のエクステントマップを受け付ける構成であっても、エクステントマップは必ず有限個になる。従って、エクステントマップの最大個数を受け付けた際にそれ以上のエクステントマップを受けられないような仕組みを備えることにより、前述の方式を適用できる。
【0097】
送信データ抽出部130−2は、前述のとおり有効データ位置情報をフロー制御部150−2から受け取り、有効データ位置情報に従って抽出した送信データをデータバッファ170−2に書き込む。データバッファ170−2に書き込む際の宛先アドレスは、フロー制御部150−2が生成し、送信データ抽出部130−2に渡す。
【0098】
例えば、データバッファ170−2が前述の説明同様にコネクションごとに128KB確保されており、コネクションごとのバッファの先頭アドレスが以下のように割り当てられているものとする。
コネクション0のバッファの先頭アドレス=0x00000000
コネクション1のバッファの先頭アドレス=0x00020000
コネクション2のバッファの先頭アドレス=0x00040000
【0099】
また、現在コネクション1を処理しており、図7に示すデータの読み出しが初めて要求されたとする。この場合、最初の部分データの宛先アドレスは0x00020000となり、次の部分データの宛先アドレスは65413バイト加えた0x0002ff85となる。
【0100】
このように宛先アドレスを部分データのサイズごとに増加させていくと、データバッファ170−2にはもとの通り一連のデータとして展開される。また、バッファが例えばバイト単位のリングバッファであるとすると、0x0003ffffの次のバイトは0x00020000に書き込むことになる。
【0101】
フロー制御部150−2は、送信データ抽出部130−2に対し、有効データ位置情報と共に、このような宛先アドレスを渡す。送信データ抽出部130−2は、抽出した送信データを、宛先アドレスに従ったアドレスから書き込む。これにより、データバッファ170−2にコネクションごとに適切に送信データを展開することができる。
【0102】
バッファ管理部160−2は、データバッファ170−2のコネクションごとのバッファのデータの供給側の書き込み位置と、データの消費側の読み出し位置と、コネクションごとのバッファの空き状態とを管理する。
【0103】
例えば、コマンド発行部110に部分データの読み出し要求を行い、ストレージ300から読み出し要求に対する応答通知が返ってくると、フロー制御部150−2は、当該コネクションのバッファのどの位置までデータが書き込まれたかを判別できる。このため、フロー制御部150−2は、データが書き込まれた位置を進捗情報としてバッファ管理部160−2に通知する。
【0104】
例えば、図7の最初の部分データを書きこみ終わった際、フロー制御部150−2は、65413バイトという情報をコネクション識別情報とともにバッファ管理部160−2に通知する。この通知によって、バッファ管理部160−2は、コネクション1のバッファのデータの供給側の位置は65413バイトであると把握できる。
【0105】
一方、通信処理部140−2がデータを送信するためにデータバッファ170−2からデータを読み出すと、データの消費側の読み出し位置が移動する。このため、通信処理部140−2は、読み出し終わったバイト位置(正確には次に読み出し始めるバイト位置)をコネクションごとにバッファ管理部160−2に通知する。
【0106】
初期状態では、バッファは128KB(正確には2の17乗の131072バイト)空いている。最初にデータを書き込まれると65413バイト減って空きサイズが65659バイトになる。これは64KB(正確には2の16乗上の65536バイト)より大きいので、バッファ管理部160−2は、バッファ空き通知をフロー制御部150−2に送信する。
【0107】
これにより、フロー制御部150−2は、次の部分データ(図7の例では65536バイト)の読み出し要求を出す。読み出し要求に応じてデータが書き込まれると、バッファサイズがさらに減って23バイトになる。これは64KBより少ないので、バッファ管理部160−2はバッファ空き通知を行わない。
【0108】
従って、フロー制御部150−2は、次の部分データの読み出しを保留する。その後、通信処理部140−2がデータを例えば1KB(1024B)読み出すと、空きバッファサイズは1047バイトに増加する。引き続き通信処理部140−2がデータを読み出していき、空きサイズが65536バイト以上になると、その段階でバッファ管理部160−2はフロー制御部150−2にバッファ空き通知を行う。
【0109】
通信処理部140−2は、処理している通信プロトコル仕様やネットワークの帯域などによって送信速度が制限される。例えばTCPプロトコルのようにフロー制御や輻輳制御を行うような場合は、対向装置やネットワークの込み具合によって送信速度が低下し、データバッファ170−2からのデータの読み出しの進み具合が遅くなる。本実施形態によれば、その場合でも、適切に最上位のアプリケーションまでのフロー制御を実現することができる。逆に、対向装置が十分なデータを受け入れられる場合でも、本実施形態では、通信処理部140−2が現在のデータ供給側の位置を参照して、どの位置までデータを送信可能か判断する。これにより、適切にバッファに充填されている分だけデータを送信するという適切な制御が可能となる。
【0110】
次に、通信処理部140−2がRTPのようなリアルタイム通信プロトコルを用いる場合の具体的な構成例を説明する。図8は、第2の実施形態の通信処理部140−2の構成例を示すブロック図である。
【0111】
図8に示すように、通信処理部140−2は、送信開始指示部141と、パケット送信指示部142と、送信判定部143と、ヘッダ生成部144と、データ読み出し部145と、パケット生成部146と、送信時刻生成部147と、を備えている。
【0112】
送信開始指示部141は、ホストCPU200−2からのデータ送信開始指示を受け付け、受付けた指示に応じてデータの送信開始要求をパケット送信指示部142に送信する。パケット送信指示部142は、送信開始要求を受けると、その後のパケットごとの送信指示を行う。送信判定部143は、送信処理の各種判定処理を行う。ヘッダ生成部144は、パケットのヘッダを生成する。データ読み出し部145は、データバッファ170−2からパケットのデータ部分(ペイロード)を読み出す。パケット生成部146は、
生成されたヘッダと読み出されたデータに基づきパケットを生成する。送信時刻生成部147は、読み出されたデータを含むパケットの次に送信するパケット(次パケット)の送信時刻を生成する。
【0113】
具体的な動作は次のようになる。まず、ホストCPU200−2は、パケット送信を開始するコネクションのコネクション識別情報を指定して、送信開始指示を送信開始指示部141に対して通知する。送信開始指示部141は、パケット送信指示部142に対して最初のパケットの生成を要求する。
【0114】
パケット送信指示部142は、内部にタイマーを持ち、例えば27MHz・32ビットの現在のタイマーカウント値(すなわち現在時刻)を常に更新している。パケット送信指示部142は、コネクションごとに次パケットの送信時刻を例えばテーブル形式で保持する。パケット送信指示部142は、テーブルから送信時刻を順次読み出して現在のタイマーカウント値と比較し、現在時刻を越えていたらそのコネクションのパケット生成を指示する。
【0115】
例えばコネクション1とコネクション3が存在し、コネクション1のパケットの送信時刻として0x40000000が保持され、コネクション3のパケットの送信時刻として0x40000100が保持されているものとする。この場合、現在のタイマーカウント値が0x3fffffffまでのときは、パケット送信指示部142は、パケット生成を指示しない。現在のタイマーカウント値が0x40000000になったときに、パケット送信指示部142は、コネクション1のパケット送信を指示する。現在のタイマーカウント値が0x40000100になったときに、パケット送信指示部142は、コネクション3のパケット送信を指示する。
【0116】
送信判定部143は、パケット送信の指示に基づいてパケットの送信判定を行う。例えば、送信判定部143は、バッファ管理部160−2から現在のデータの供給側の書き込み位置を取得し、その位置が今回のパケット送信で読み出されるデータの終端を超えているか否かを判断する。超えている場合は、送信判定部143は、送信すべきデータが既に準備できているということを意味するので送信可能であると判定する。送信可能であると判定された場合、後段のヘッダ生成部144とデータ読み出し部145とパケット生成部146が動作して、パケットが送信される。
【0117】
送信時刻生成部147は、例えばデータを読み出した後に、次パケットの送信時刻を生成して、生成した送信時刻をパケット送信指示部142に伝える。このときに生成するパケット送信時刻は、例えば、現在送信しているデータストリームのパケット送信間隔(P[sec]とする)と、送信開始時点の時刻(T0[sec]とする)とから算出する。例えば、N番目のパケットの送信時刻はT0+(N−1)×Pとなる。
【0118】
送信時刻生成部147が、次に送信するパケットに格納するデータの先頭バイトの、送信開始バイトからのバイトオフセット(OFS[Byte]とする)と、データストリームのビットレート(BR[Byte/sec]とする)とから、T0+OFS/BRにより送信時刻を算出してもよい。
【0119】
これらは本質的に同等の算出方法である。また、以上の例では簡単のため時間の単位を[sec]としたが、前述した27MHzのクロックカウンタの単位で扱ってもよい。
【0120】
一方で、バッファ管理部160−2から現在のデータの供給側の書き込み位置が今回のパケット送信で読み出されるデータの終端を超えていない場合は、送信判定部143は、送信すべきデータが未だ準備されていないということを意味するので送信できないと判定する。この場合、送信が指示されたパケットの送信は取りやめる。
【0121】
そして、送信判定部143は、送信時刻生成部147に対して次パケットの送信時刻を生成するように指示を出す。このときに生成するパケット送信時刻は、例えば、現在の時刻に対し、前述のパケット送信間隔Pを足した時刻としてよいし、それ以外の所定の時刻としてもよい。さらに、ホストCPU200−2からの設定によっては、この送信データが準備できていないいわゆるバッファアンダーフロー状態を、異常状態としてホストCPU200−2に通知する処理を行ってもよい。この場合、ホストCPU200−2は、例えば通知されたエラーをログに出力するなど異常系の処理を行ってもよい。
【0122】
また、送信しているデータが例えばMPEGのTTS(Timestamped Transport Stream)パケット(4バイトタイムスタンプ値+188バイトTSパケットの合計192バイト)を含む送信パケットの場合、送信パケットの送信時刻は、その送信パケットに格納されている先頭のTTSパケットのタイムスタンプ値を用いる。
【0123】
例えば1つの送信パケットに7つのTTSパケットを格納して送信し、送信を開始するTTSパケットをTTS0とするものとする。この場合、TTS0〜6が1つ目の送信パケットに格納され、TTS7〜13が2つ目の送信パケットに格納され、TTS14〜20が3つ目の送信パケットに格納され、各送信パケットが送信される。このときの各送信パケットの送信時刻は、1つ目の送信パケットはTTS0のタイムスタンプ値、2つ目の送信パケットはTTS7のタイムスタンプ値、3つ目の送信パケットはTTS14のタイムスタンプ値、にそれぞれ基づいた値となる。
【0124】
具体的には、1つ目のパケットの送信時刻をT0、N番目のTTSパケットのタイムスタンプ値をTMS(N)と表わすと、2つ目の送信パケットの送信時刻はT0+TMS(7)−TMS(0)、3つ目の送信パケットの送信時刻はT0+TMS(14)−TMS(0)となる。
【0125】
従って、例えば2つ目の送信パケットの送信時刻を生成するときは、送信時刻生成部147は、1つ目のパケットのデータであるTTS0〜TTS6のデータ(192バイト×7=1344バイト)を読み出した後にさらにTTS7の先頭のタイムスタンプ値(4バイト)も読み出す。また、例えば3つ目の送信パケットの送信時刻を生成するときは、送信時刻生成部147は、2つ目の送信パケットのデータであるTTS7〜TTS13を読み出した後にさらにTTS14の先頭のタイムスタンプ値も読み出す。送信時刻生成部147は、このようにして読み出したタイムスタンプ値をもとに次のパケット送信時刻を求める。
【0126】
さらに、このタイムスタンプ値の読み出しは、直前のデータ読み出しと隙間なく連続して行うように構成してもよい。例えば、1344バイト+4バイト=1348バイトを一括して読み出すように構成してもよい。これにより、バッファへのメモリアクセスのオーバーヘッドを軽減することができる。
【0127】
図9は、TTS0〜TTS7のデータの並びを例示する図である。図9の斜線部分は、各TTSの4バイトのタイムスタンプ値の部分を表す。TTS0〜TTS6と次のTTS7のタイムスタンプ値を併せた部分は図の矢印部分である。データ読み出し部145は、1つ目の送信パケットのデータ読み出し時に、この矢印で占められた領域を一括して読み出す。これにより、1つ目の送信パケットのデータ読み出しと併せて次の送信パケットの送信時刻生成に必要なTTS7のタイムスタンプ値を読み出すことができるため、処理の効率化が図れる。
【0128】
なお、以上のRTP系の通信プロトコルの場合においても、例えばデータ読み出し部145がデータの読み出しを完了した時点で、前述の通り読み出し終わった部分を進捗情報としてバッファ管理部160−2に伝える。例えば、データ読み出し部145は、読み出しの最後のタイムスタンプ値の部分は含めない位置を通知する。図9の場合は、データ読み出し部145は、TTS6の終端位置を通知する。データ読み出し部145が読み出しの最後のタイムスタンプ値の部分を含めた位置を読み出し済みとして通知するように構成してもよい。ただし、タイムスタンプ値はもう読み出せないことを意味する。従って、この構成の場合、例えば図9の例では、次の送信パケットのデータ読み出しまで、読み出した最後のタイムスタンプ値を保持しておく必要がある。そして、データ読み出し部145は、2つ目の送信パケットのデータを読み出すとき、保持したタイムスタンプ値の次のデータから読み出しを行い、保持したタイムスタンプ値と読み出したデータとをマージしてパケット生成部146に渡すことになる。
【0129】
このように、第2の実施形態にかかるデータ転送装置では、第1の実施形態の効果に加えて、通信速度が遅くなっても適切にフロー制御を行うことができるようになる。また、第2の実施形態では通信コネクションごとにフロー制御を行うことができる。このため、あるコネクションのデータフローが止まっていても、それ以外のコネクションのデータフローには影響を与えないように動作することが可能である。
【0130】
(第3の実施形態)
第3の実施形態では、より複雑な動作例として、トリックプレイ向け送信とFECパケット送信について説明する。トリックプレイとは、早送り、巻き戻しなど通常再生とは異なる再生のことを指す。例えばRTPを用いたリアルタイム通信ベースのIPTV向けVODサーバでは、トリックプレイによる再生に対応したストリームの送信が必要となる。
【0131】
図10は、トリックプレイ向け送信の動作概要を示す図である。図10の1段目は標準的なMPEGのGOP構造(Iフレーム、Bフレーム、Pフレームの並び)の一例を示している。2段目はGOPの並びの一例を示している。図10の例では、0.5secごとにGOPが構成されている。
【0132】
トリックプレイでは、早送りなどにより速い速度での再生が指定されたときに、コンテンツの加工等を行わずにそのまま速く再生すると、機器自体の処理速度をその分だけ速くしなくてはならず、コストが高くなる。このため、実際には再生する映像を間引くということを行っている。
【0133】
具体的には、MPEGストリームデータのIフレームだけを抽出して再生する。例えばIフレームが0.5sec間隔で登場する場合、0.25秒間隔で再生すると2倍速になる。さらに、Iフレーム自体を2つのうち1つだけを再生する(1つおきに再生する)ように間引くことで4倍速となる。さらに間引くと8倍速および16倍速などが実現できる。また、再生するIフレームの順番を逆順にすると巻き戻し再生が可能となる。早送りと同様の方式で巻き戻しの2倍速、4倍速、8倍速および16倍速などが実現できる。図10の下半分は、1倍速(x1)から32倍速(x32)までのIフレームの抽出規則の例を示している。トリックプレイ中、クライアント端末はこのように再生を行う。従って、VODサーバは、Iフレームを抽出して、指定された通りのタイミングでクライアント端末に対して送信する必要がある。
【0134】
図11は、第3の実施形態に係るホストCPU200−3の概略構成例を示すブロック図である。図12は、第3の実施形態に係る通信処理部140−3の概略構成例を示すブロック図である。データ転送装置およびストレージの構成および機能は、第2の実施形態と同様であるため説明を省略する。
【0135】
図11に示すように、第3の実施形態のホストCPU200−3は、送信要求受付部208−3と、コンテンツメタデータ読み出し部209−3と、ファイル指定部201−3と、コンテンツメタ―データ解析部210−3と、送信データ特定部204−3と、管理情報読み出し指示部205−2と、エクステントマップ取得部206と、送信データ読み出し指示部207−2と、を備えている。
【0136】
第3の実施形態では、送信要求受付部208−3とコンテンツメタデータ読み出し部209−3とコンテンツメタ―データ解析部210−3を追加したこと、メタデータ指定部202とメタデータ解析部203が削除されたこと、および、ファイル指定部201−3と送信データ特定部204−3の機能が第2の実施形態と異なっている。その他の構成および機能は、第2の実施形態のブロック図である図5と同様であるので、同一符号を付し、ここでの説明は省略する。
【0137】
送信要求受付部208−3は、クライアント端末からのトリックプレイ向け送信要求を受け付ける。送信要求には、例えば、再生するコンテンツを特定するための情報、トリックプレイの再生モード(何倍速の早送りか巻き戻しかなど)、および、再生開始位置(コンテンツの開始時からの相対時間など)などが含まれる。
【0138】
本実施形態では、例えば、再生開始位置やトリックプレイの再生モードが特定情報に相当する。したがって、送信要求受付部208−3が、特定情報を含むメタデータを指定するメタデータ指定部202に相当する。
【0139】
ファイル指定部201−3は、送信要求をもとに、トリックプレイを行うファイル(以下、コンテンツともいう)を特定する。なお、コンテンツの特定方法はこれに限られるものではない。例えば、ファイル指定部201−3が、データ送信システムの動作状態などに応じて再生するコンテンツを特定するように構成してもよい。
【0140】
コンテンツメタデータ読み出し部209−3は、トリックプレイを行うコンテンツのコンテンツメタ―データをストレージ300から読み出す。このように、本実施形態では、コンテンツメタデータをストレージ300に記憶する。なお、ストレージ300以外の記憶装置にコンテンツメタデータを記憶してもよい。コンテンツメタデータは、例えばコンテンツの全てのIフレームの開始バイト位置と長さとを含む。
【0141】
コンテンツメタ―データ解析部210−3は、読み出されたコンテンツメタデータを参照し、コンテンツのIフレームのバイト位置を解析する。送信データ特定部204−3は、解析されたバイト位置の情報をもとに、特定されたコンテンツの中の送信データ(送信するIフレーム)を特定する。
【0142】
図12に示すように、第3の実施形態の通信処理部140−3は、送信開始指示部141と、パケット送信指示部142と、送信判定部143と、ヘッダ生成部144と、データ読み出し部145と、パケット生成部146と、送信時刻生成部147と、先頭判定部148−3と、を備えている。
【0143】
第3の実施形態では、先頭判定部148−3を追加したことが第2の実施形態と異なっている。その他の構成および機能は、第2の実施形態の通信処理部140−2のブロック図である図8と同様であるので、同一符号を付し、ここでの説明は省略する。
【0144】
先頭判定部148−3は、次に送信するパケットがIフレームの先頭か否かを判定する。
【0145】
図13は、第3の実施形態におけるデータ転送処理の全体の流れを示すフローチャートである。
【0146】
まず、送信要求受付部208−3が、クライアント端末からトリックプレイ送信の要求を受ける(ステップS301)。送信要求の受付は、例えばIPTV仕様ではRTSP(Real Time Streaming Protocol)などで実現される。送信要求受付部208−3は、クライアント端末から指定されたトリックプレイの再生モード、再生開始位置を送信データ特定部204−3に渡す。
【0147】
ファイル指定部201−3は、受付けられた送信要求をもとに、いずれのコンテンツのトリックプレイを行うか特定し、特定したコンテンツの情報を送信データ特定部204−3に指定する(ステップS302)。
【0148】
コンテンツメタデータ読み出し部209−3は、特定されたコンテンツに対応するコンテンツメタデータを読み出す(ステップS303)。コンテンツメタ―データ解析部210−3は、読み出されたコンテンツメタデータを解析して、コンテンツ中の全Iフレームのバイト位置を取得する(ステップS304)。コンテンツメタ―データ解析部210−3は、取得したバイト位置を送信データ特定部204−3に渡す。
【0149】
送信データ特定部204−3は、特定されたコンテンツ、および、バイト位置の情報を利用し、実際にどのIフレームを送信するか特定する(ステップS305)。例えば、再生開始時間が10分15秒のとき、GOP間隔が0.5secとすると、送信データ特定部204−3は、(60x10+15)/0.5=1230個目のGOPから再生すると特定できる。トリックプレイの再生モードが4倍速早送りであった場合、図10の抽出規則に従ったとすると、Iフレームを1つおきに送信することになる。従って、送信データ特定部204−3は、1230個目、1232個目、1234個目、1236個目・・・のIフレームを送信すると特定できる。また、送信データ特定部204−3は、コンテンツメタ―データ解析部210−3による解析結果から、特定したIフレームそれぞれのコンテンツ中のバイト位置(先頭位置と先頭位置からの長さ)を特定できる。
【0150】
ステップS306からステップS313までは、第2の実施形態のデータ転送処理を示す図6のステップS205からステップS212までと同様の処理なので、その説明を省略する。
【0151】
なお、通信処理部140−3の動作は第2の実施形態と基本的には同じであるが、トリックプレイではIフレームを0.5sec間隔で送信しなければならないので、そのための処理が異なる。以下に詳細を説明する。
【0152】
まず、送信データに相当するIフレームは複数の送信パケットで構成される。また、前述の通り、送信パケットは例えば7個などのMPEGのTSパケットまたはTTSパケット(単位パケット)で構成される。なお、以下では主にTTSパケットを用いる例を説明するが、TSパケットを用いる場合にも同様に適用できる。
【0153】
図14は、Iフレームとパケットとの関係の一例を示す図である。図14の上段は、抽出したIフレームがデータバッファ170−2上に展開されている様子を示している。先ほどの例では、Iフレーム0が1230個目のIフレームとなり、Iフレーム1が1232個目のIフレームとなり、Iフレーム2が1234個目のIフレームとなる。中段は、送信パケットの構成例を示している。例えばIフレーム0はPKT0〜PKTn−1のn個の送信パケットに分割されて送信される。下段は、MPEG TTSパケットの構成例を示している。例えばPKT0はTTS0〜TTS6で構成されている。
【0154】
各TTSは、第2の実施形態で述べたとおり、先頭4バイトにタイムスタンプ値を格納する。同じIフレーム内の送信パケットを送信する場合は、第2の実施形態と同様にデータ読み出し部145が、タイムスタンプ値を読み出す。そして、送信時刻生成部147が、次パケットの送信時刻を求めるように動作する。
【0155】
一方、前述の通り、次のIフレームは例えば0.25sec後という時刻に定められている。従って、次パケットがIフレームの先頭であった場合、送信時刻生成部147は、読み出したタイムスタンプ値とは関係なく、次パケットの送信時刻を、先のIフレームの先頭となる送信パケット(図14の場合はPKT0)を送信した時刻から、0.25sec後に設定する。
【0156】
先頭判定部148−3は、このような動作を実現するために、次に送信するパケットがIフレームの先頭か否かを判定するために用いられる。具体的には、まず、データ読み出し部145が、タイムスタンプ値にさらに続いてTSパケットのヘッダ(TSヘッダ)を読み出すように構成する。先頭判定部148−3は、例えば読み出されたTSヘッダのPESの先頭を示すpayload_unit_start_indicatorが1になっているかを確認する。コンテンツに映像以外のTSパケットも含んでいる場合は、先頭判定部148−3が、さらにPIDがVIDEOを示していることも併せて確認してもよい。
【0157】
図14ではTTSxにてIフレームの先頭が現れることが示されている。以上のIフレーム先頭判定によって、同じIフレーム内では通常再生と同様の短い間隔で送信パケットを送信しながら、次のIフレームは0.25secなど所定の長い時間間隔を空けて送信するという機能が実現できる。従って、例えばIPTVトリックプレイ向け送信に必要な断続的なIフレームの送信が可能となる。なお、Iフレーム間隔はシステム仕様やコンテンツなどに依存する。従って、上記のIフレーム間隔の0.5secという時間は一例でありこれに限られるものではない。
【0158】
以上のように、本実施形態では、ホストCPU200−3が、図10のようなMPEGデータから、再生に必要なIフレームだけを抽出して、図14で示したようなデータを、データ転送装置100に渡す。したがって、データ転送装置100は、トリックプレイを実現するために、Iフレームの先頭を検出して、パケットを送信するという処理をするだけでよい。すなわち、トリックプレイをする場合にも、データ転送装置100は非常にシンプルな処理だけをすればよく、データ転送装置100の構成をシンプルにできるという効果がある。
【0159】
次に、FECパケットの送信を行う場合について説明する。FECとは、送信するデータパケットに冗長データパケットを付加して、一部のデータパケットがネットワークの途中経路で損失した場合に、損失しなかった残りのデータパケットとその冗長データパケットを用いて、損失したデータパケットを復元する手法である。具体的には、データパケットA、B、Cを送信する場合、例えばX=A xor B xor Cのようにデータのペイロードをビット単位でXORして求めたデータパケットXも併せて送信する。送信した結果、データパケットBが損失した場合、受信側では、残りのデータパケットA、C、およびXからB=A xor C xor XとしてデータパケットBを復元することができる。ただし、データパケットBとデータパケットAなどのように2つのデータパケットを損失した場合などは復元することができない。
【0160】
IPTVの場合もこのFECを応用してデータ(映像および音声データ)の損失を補うことがPro−MPEG仕様により定められている。Pro−MPEGでは、データパケットはRTPパケットで送信される。例えば上記データパケットA、B、CがそのRTPパケットに相当する。パケット長は一定であると定められており、上記のxor演算はそれぞれのデータパケットの同じオフセットのビット同士で行われる。また、実際のデータはストリームとして伝送されるので、データパケットが次々と送信される。Pro−MPEGでは所定数のデータパケットをグルーピングし、グルーピングしたデータパケットごとに順次FECパケットを生成する。
【0161】
図15および図16は、FECパケットを生成するためのデータパケットのグルーピングの一例を示す図である。図15および図16は、送信されるデータパケットを10×10のマトリクス上に並べて表示した様子を示している。図15および図16は、それぞれ縦方向、横方向にデータパケットをグルーピングしてFECパケットを生成する様子を示している。図15のFECをColumn FEC、図16のFECをRow FECと呼ぶ。前述のように、これらのグルーピングされたデータパケットのうち、1つだけロスト(損失)した場合に受信側での復元が可能となる。
【0162】
Column FECは縦方向にグルーピングしていることから、横方向に連続したロスト、すなわち、バーストロストに強いという特徴を持つ。Row FECはColumn FECを補うものであり、ランダムロストに対する耐性を高めるものである。
【0163】
以上のFECパケットは、本実施形態では次のように生成される。例えば、図16の1つ目のRow FECの場合、データパケット1〜10が送信された後に最初のRow FECであるF1が送信される。送信判定部143は、データパケットの送信後に、データパケットの現在のマトリクス中における位置を把握し、Column FECとRow FECを送るかどうかを判定する。例えばマトリクスが10×10で、この中のデータパケットを0〜99で表したとき、データパケットが9、19、29、・・・、99のときにRow FECを送信すると判定するなどのように構成できる。
【0164】
Row FECを送信すると判定された場合、ヘッダ生成部144は、FECパケットのヘッダを生成する。また、データ読み出し部145は、当該FECが保護する全てのデータパケット0〜9のデータを読み出す。そしてパケット生成部146は、生成されたヘッダと、読み出された全てのデータをXORしたデータをペイロードとして、FECパケットを生成して出力する。
【0165】
ところで、以上のFECパケットは、トリックプレイ中、すなわち、Iフレーム送信を行っている場合も同様に送信される。しかし、そのままでは次のような問題が生じる。まず、Iフレームのデータ長は任意であるため、例えば先に例示した送信パケットの長さである1344バイト(=192バイト(MPEG TTSパケットのサイズ)×7)の倍数にならない場合も存在する。より具体的には、Iフレームを構成するTTS数が必ずしも7の倍数にならない場合がある。
【0166】
一方、IPTV向けトリックプレイ方式では、1つの送信パケットの中に複数のIフレームが混在してはいけないという仕様が定められている。
【0167】
前述のように本実施形態では、ホストCPU200−3がIフレームの位置を特定し、データ転送装置内のデータバッファ170−2にIフレームのデータが一旦蓄えられ、Iフレームが送信パケットに分割されて送信される。また、データバッファ170−2上には異なるIフレームが隙間なく詰められている。従って、あるIフレームの終端となる送信パケットを生成したとき、そのIフレームのTTS数が7の倍数ではない場合、その終端となる送信パケットに次のIフレームの先頭部分が含まれることになる。すなわち、1つの送信パケットに複数のIフレームが含まれることになり、仕様違反になる。
【0168】
これを防ぐためには、簡単には次のような方式が考えられる。例えばパケット生成部146などによりIフレームの終端となる送信パケットを生成するときに、端数の部分にNULL TTSを挿入し、続きのデータ(すなわち次のIフレームの先頭データ)は次の送信パケットから送信するように構成する方式である。なお、NULL TTSとは、空のデータを含むTTSパケットを意味する。しかし、この方式ではFECパケットを送信する場合には依然として次のような問題が残る。
【0169】
FECパケットを生成するとき、データ読み出し部145は、保護対象のデータを読み出す。例えば先の1つ目のRow FECの例では、データ読み出し部145は、データパケット0〜9のデータを読み出す。具体的には、データバッファ170−2におけるデータパケット0の先頭データのアドレスをBASEとすると、BASE+1344×0、BASE+1344×1、BASE+1344×2、・・・、1344×9のアドレスから、それぞれ1344バイトずつ読み出すという動作になる。
【0170】
同様に、1つ目のColumn FECの例では、データ読み出し部145は、データパケット0、10、20、・・・、90のデータを読み出すことになる。すなわち、データ読み出し部145は、BASE+1344×0、BASE+1344×10、BASE+1344×20、・・・、BASE+1344×90のアドレスからそれぞれ1344バイトずつ読み出す。ただし、この処理は、各データパケットが必ずデータバッファ170−2の1344バイト固定長のデータに割り当てられていることが前提である。Iフレームの終端でNULL TTSが挿入されるとその前提が崩れるため、このような簡単な計算ではデータパケットの位置が求められなくなる。例えば、データパケット5が含まれるIフレームの終端でNULL TTSが2つ挿入されている場合、データパケット6以降の先頭は、BASE+1344×6−192×2となる。
【0171】
従って、その場合でも正しく計算するためには、NULL TTSを挿入した位置を全て記憶しておき、アドレス計算時にこれを鑑みて計算する必要がある。さらに、FECパケット生成時に読み出したIフレームの終端となる送信パケットの長さが、(TTSのサイズ)×7の倍数ではない場合、NULL TTSを付加してパケット生成部146に渡す必要がある。しかし、このような構成は、処理が複雑になるという問題がある。
【0172】
そこでホストCPUを図17のように構成することが望ましい。図17は、このように構成した第3の実施形態の変形例に係るホストCPU200−3Bの構成例を示すブロック図である。
【0173】
本変形例では、ホストCPU200−3Bは、パケット特定部211−3Bを備える。パケット特定部211−3Bは、特定されたIフレームの長さから、Iフレーム長が、(データパケットを構成するTTS数)の倍数ではない場合に、倍数となるように終端に埋めるNULL TTSを特定する。なお、以下では、TTSを単位としてIフレーム長を表す。例えば、100個のTTSからなるIフレームの長さ(Iフレーム長)を100TTSと表す。Iフレーム長の単位はこれに限られるものではなく、例えばバイトを単位として表してもよい。
【0174】
例えば、Iフレームの長さが100TTSであった場合、100は7で割り切れないが、5TTSを足して105TTSとすることで105/7=15と割り切れるようになる。このため、パケット特定部211−3Bは、5つのTTSを送信すると特定する。
【0175】
例えばストレージ300上にデータパケットを構成するTTS数−1(今回は6)個分の長さのNULL TTSファイルを用意しておく。パケット特定部211−3Bは、読み出すデータの先頭および長さを、それぞれ、NULL TTSファイルの先頭、および、必要なTTS個数分の長さ(上記例では192×5=960バイト)として、後段のエクステントマップ取得部206に指定する。
【0176】
エクステントマップ取得部206は、送信するIフレームの後にこのNULL TTSファイルを処理する。これにより、データバッファ170−2上には7TTSで割り切れないIフレームの終端にはNULL TTSが挿入される。すなわち、データ転送装置は、常にIフレームが7TTSで割り切れるものとして扱うことができる。従って、NULL TTSを挿入する必要がなくなるだけでなく、FECパケット生成の際のデータ読み出しアドレスの計算処理も容易にすることができる。
【0177】
なお、NULL TTSの挿入は、以上の方法に限られない。例えば、ホストCPU200−3Bが直接データバッファに書き込む、あるいは、NULL TTSを生成する処理部をデータ転送装置内に別途設け、それによって書き込むような形態でもよい。本変形例のポイントは、Iフレームが7×TTSの長さで割り切れないとき、データ抽出部が、パケット特定部が特定した個数×TTSの長さを空けて、次のIフレームのデータを書き込むことである。これによって、FECの計算が前述のように容易になる。よって、さらにいうと必ずしもNULL TTSをデータバッファに書き込む必要はなく、データ抽出部が間を空けるだけ空けておき、データ読み出し部がデータを読み出した後に、空けられたところのデータ(不定値が入っている)をNULL TTSで置換するような形態でもよい。
【0178】
以上説明したとおり、第1から第3の実施形態によれば、ホストCPUの処理負担を軽減させて、効率的なデータ転送が可能となる。また、コンテンツ配信サーバの主要機能であるトリックプレイ向け送信での効率的な処理が実現できる。
【0179】
上述した各実施形態で説明したデータ送信システムの少なくとも一部は、ハードウェアで構成してもよいし、ソフトウェアで構成してもよい。ソフトウェアで構成する場合には、データ送信システムの少なくとも一部の機能を実現するプログラムをフレキシブルディスクやCD−ROM等の記録媒体に収納し、コンピュータに読み込ませて実行させてもよい。記録媒体は、磁気ディスクや光ディスク等の着脱可能なものに限定されず、ハードディスク装置やメモリ等の固定型の記録媒体でもよい。
【0180】
また、データ送信システムの少なくとも一部の機能を実現するプログラムを、インターネット等の通信回線(無線通信も含む)を介して頒布してもよい。さらに、同プログラムを暗号化したり、変調をかけたり、圧縮した状態で、インターネット等の有線回線や無線回線を介して、または記録媒体に収納して頒布してもよい。
【0181】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0182】
100 データ転送装置
110 コマンド発行部
120 通知振り分け部
130 送信データ抽出部
140 通信処理部
150−2 フロー制御部
160−2 バッファ管理部
170−2 データバッファ
200 ホストCPU
201 ファイル指定部
202 メタデータ指定部
203 メタデータ解析部
204 送信データ特定部
205 管理情報読み出し指示部
206 エクステントマップ取得部
207 送信データ読み出し指示部
300 ストレージ
400 ネットワーク
【技術分野】
【0001】
本発明の実施形態は、データ転送装置、データ送信システム、データ送信方法およびプログラムに関する。
【背景技術】
【0002】
昨今、映像のストリーミング配信が普及しつつある。例えばVOD(Video On Demand)サーバと呼ばれるコンテンツ配信サーバによってストリーミング配信が行われている。このようなコンテンツ配信サーバは、自身がもつストレージから映像コンテンツを読み出し、ネットワーク接続されたユーザの端末に送信する処理を行う。通信プロトコルは、TCP/IPベースのHTTP(Hyper Text Transport Protocol)や、リアルタイム通信向けのUDP/IPベースのRTP(Realtime Transport Protocol)等が使われる。また、RTPの場合は誤り訂正にFEC(Forward Error Correction)等が使われる。
【0003】
このようなVODサーバに用いられるストレージやネットワーク等のデバイスの高速化は著しく進んでいる。イーサネット(登録商標)は、現在1Gbpsが主流になりつつあり、データセンター等では10Gbpsが使われ始めている。また、次世代の40Gbps/100Gbpsイーサネットの仕様策定も完了し、これらについても今後着実に普及していくものと思われる。また、ストレージに関してはHDD(Hard Disk Drive)のRAID(Redundant Arrays of Inexpensive Disks)のストライピング処理(並列化)による高速化に加えて、昨今のSSD(Solid State Drive)の転送性能の向上は著しい。I/F(インタフェース)規格のSATA(Serial Advanced Technology Attachment)に関しても、バンド幅6GbpsのSATA3.0が既に普及している状況であり、単体で実効4Gbps超の読み出しレートを出す製品も出てきている。
【0004】
このようなネットワークやストレージのI/O性能向上に伴って、それを制御するホストCPU(Central Processing Unit)の処理負荷も増大していく。従来はTCP/IPオフロードエンジン(以下、TOE)という技術により、その解決が試みられてきた。TOEは、ホストCPUに代行して、前述のTCP/IPの処理を行う専用プロセッサや専用回路を設けたものであり、ホストCPUからTCP/IP処理負荷をオフロードするものである。このTOEを用いることによって、従来のソフトウェアによる通信プロトコル処理よりも高速にTCP/IP処理を行うことが可能となり、ネットワークストレージの性能向上に貢献できる。
【0005】
ストレージやTOEは、それぞれホストCPUによってスレーブ的に制御され、データはメインメモリを介して入出力することが想定されている。よって、ストレージ上のデータをネットワークに入出力する際、ストレージ(SSD、HDD等)とTOEの間のデータ転送は、通常メインメモリを介して行われる。
【0006】
また、ホストCPU上で動作する、これらの間をブリッジするアプリケーションソフトウェア、または、OS(Operating System)のカーネル空間とユーザ空間のデータの受け渡し処理等により、メインメモリ上で何回分か転送データのコピーが発生する場合もある。さらにストレージにはファイルシステム処理も必要である。一般的なファイルシステムの実装では、ストレージから固定バイト長のセクタ単位で読み書きしたデータを一旦メモリ上に保持し、メモリから任意バイト長のファイルとしてのデータをアプリケーションバッファにコピーする形で渡す。このため、ファイルシステム処理でもデータのコピーが発生する。
【0007】
さらに、コンテンツ配信サーバでは、映像コンテンツのトリックプレイ(早送り再生、巻き戻し再生など、通常再生とは異なる再生形態)に対応した送信を行う必要があり、通常のファイル転送より条件が複雑である。
【0008】
このように、ストレージとTOEの間でデータ転送を行う場合は、ホストCPUのソフトウェア処理が介在することから、少なくとも一回はメインメモリへの読み書きが必要となる。また、OS、アプリケーション、および、ファイルシステムの処理により、メインメモリ上で場合によっては複数回分のメモリコピーが発生し、メインメモリの負荷が大幅に増大する。このようなメモリ負荷の増大に対し、従来は十分な処理性能を持つホストCPUと高速のメインメモリを用意して対応していた。
【先行技術文献】
【特許文献】
【0009】
【特許文献1】特開2005−316629号公報
【発明の概要】
【発明が解決しようとする課題】
【0010】
しかしながら、昨今のネットワークストレージの10Gbpsに迫る転送レートの向上を鑑みると、コストや消費電力の増大が少なからず問題となってきた。特に、メインメモリの性能を上げるためには、一般にホストCPUのグレードアップも伴う。PC(パーソナルコンピュータ)やサーバ等の場合は、付随するチップセットのグレードアップも必要となる。これにより、コストや消費電力の問題が特に顕著となる。
【課題を解決するための手段】
【0011】
実施形態のデータ転送装置は、コマンド発行部と、送信データ抽出部と、通信処理部と、を備える。コマンド発行部は、制御装置から読み出しが指示されたブロックの読み出しコマンドを記憶装置に対して発行する。送信データ抽出部は、読み出しコマンドに応じて記憶装置から読み出されたデータから送信データを抽出する。通信処理部は、予め定められたプロトコルに基づいて、抽出された送信データをネットワークに送信する。
【図面の簡単な説明】
【0012】
【図1】第1の実施形態に係るデータ送信システムのブロック図。
【図2】エクステントマップの構成例を示す図。
【図3】第1の実施形態におけるデータ転送処理のフローチャート。
【図4】コマンドとアドレス領域との対応の一例を示す図。
【図5】第2の実施形態に係るデータ送信システムのブロック図。
【図6】第2の実施形態におけるデータ転送処理のフローチャート。
【図7】エクステントマップの構成例を示す図。
【図8】第2の実施形態の通信処理部のブロック図。
【図9】TTS0〜TTS7のデータの並びを例示する図。
【図10】トリックプレイ向け送信の動作概要を示す図。
【図11】第3の実施形態に係るホストCPUのブロック図。
【図12】第3の実施形態に係る通信処理部のブロック図。
【図13】第3の実施形態におけるデータ転送処理のフローチャート。
【図14】Iフレームとパケットとの関係の一例を示す図。
【図15】データパケットのグルーピングの一例を示す図。
【図16】データパケットのグルーピングの一例を示す図。
【図17】第3の実施形態の変形例に係るホストCPUのブロック図。
【発明を実施するための形態】
【0013】
以下に添付図面を参照して、この発明にかかるデータ転送装置、データ送信システム、データ送信方法およびプログラムの好適な実施形態を詳細に説明する。
【0014】
(第1の実施形態)
図1は、第1の実施形態に係るデータ送信システムの概略構成例を示すブロック図である。破線矢印は制御の流れを示し、実線矢印はストレージから読み出したデータの流れを示し、太い実線矢印は読み出したデータのうち送信するデータ(送信データ)の流れを示す。
【0015】
第1の実施形態のデータ送信システムは、制御装置としてのホストCPU(プロセッサ)200と、記憶装置としてのストレージ300と、データ転送装置100とを備えている。ホストCPU200の制御に基づき、データ転送装置100が送信データをストレージ300から読み出し、ネットワーク400に送信する。
【0016】
第1の実施形態のデータ送信システムの具体的な製品形態としては、PC、サーバ装置、専用LSI、およびFPGA(Field Programmable Gate Array)等のネットワークストレージ、VOD(Video On Demand)サーバ、並びにWebサーバなどが想定されるが、これらに限定されるものではない。
【0017】
ホストCPU200は、データ送信システム全体を制御する。ホストCPU200は、ソフトウェアで実行する主な処理部として、ファイル指定部201と、メタデータ指定部202と、メタデータ解析部203と、送信データ特定部204と、管理情報読み出し指示部205と、エクステントマップ取得部206と、送信データ読み出し指示部207と、を備えている。ホストCPU200は、その他の種々の処理を行うことが可能である。
【0018】
ファイル指定部201は、送信データが含まれるファイルを指定する。メタデータ指定部202は、ファイル内での送信データの位置の特定に利用する特定情報を含むメタデータを指定する。メタデータ解析部203は、指定されたメタデータを解析する。送信データ特定部204は、解析されたメタデータの情報をもとに、指定されたファイルの中の送信データの位置を特定する。
【0019】
管理情報読み出し指示部205は、ストレージ300の管理情報の読み出しを指示する。管理情報とは、ストレージ300に記憶される実データのメタデータである。管理情報は、例えば実データとストレージ300の記録領域とのマッピング情報を含む。なお、管理情報はその他諸々の情報も含む。
【0020】
エクステントマップ取得部206は、読み出した管理情報を解析して、送信データのエクステントマップ(マップ情報)を取得する。エクステントマップとは、ストレージ300内のデータの記憶位置を特定する情報である。エクステントマップの詳細については後述する。
【0021】
送信データ読み出し指示部207は、データ転送装置100に対して、データの読み出しおよびデータの送信を指示する。
【0022】
ストレージ300は、送信データを含む各種データを格納する。ストレージ300の具体的な実装形態は、例えばSSD、HDDおよびSDメモリカード等が想定されるが、その限りではない。また、ストレージ300がRAID機能を備えてもよい。データ転送装置100内のストレージ300とのインタフェースにRAID機能を備えてもよい。
【0023】
データ転送装置100は、ホストCPU200に代行し、ストレージ300からデータを読み出し、読み出したデータに対して通信処理を行い、読み出したデータをネットワーク400に送信する。データ転送装置100は、コマンド発行部110と、通知振り分け部120と、送信データ抽出部130と、通信処理部140と、を備えている。
【0024】
コマンド発行部110は、ストレージ300に対してデータの読み出し等のコマンドを発行する。通知振り分け部120は、発行したコマンドの応答通知を受け取り、受け取った応答通知をホストCPU200とデータ転送装置100とのいずれかに振り分ける。送信データ抽出部130は、ストレージ300から読み出されたデータを受け取り、受け取ったデータから必要なデータを抽出する。通信処理部140は、抽出されたデータに対して予め定められた通信プロトコルに従った通信処理を行い、抽出されたデータをネットワーク400に送信する。
【0025】
通信処理部140は、前述したTOEに相当する。データ転送装置100の具体的な実装の形態としては、FPGAおよび専用LSIなどが想定される。データ転送装置100をPCIカードおよびPCI−Expressカードとして実装してもよい。なお、実装形態はこれらに限られるものではない。
【0026】
ネットワーク400は、イーサネットおよび無線LANなどのあらゆる無線通信または有線通信により構成できる。
【0027】
ホストCPU200とデータ転送装置100は、データ送信システムがPCやサーバ装置などの場合は例えばチップセットやPCI Express等で接続されてもよい。データ送信システムがSoCなどの場合は、ホストCPU200とデータ転送装置100は、例えば専用のバスなどで接続されてもよい。ストレージ300とデータ転送装置100は、例えばSATA、SAS、SCSI、および、SDメモリカード規格などで接続される。これらは一例であり、その他のあらゆる接続方式を適用できる。
【0028】
データ転送装置100は、ハードウェアとソフトウェアのいずれにより構成してもよく、実装の形態は問わない。処理効率の観点からは、ハードウェアベースで構成することが望ましい。また、通信処理部140による通信処理はどのような処理であってもよい。通信処理部140による通信処理としては、例えば、TCP/IPベースのプロトコル処理、UDP/IPベースのプロトコル処理、IPTV向けRTP/FECベースのプロトコル処理、イーサネット処理、および、無線処理などが挙げられる。
【0029】
なお、TCPのような対向装置とコネクションを張るプロトコルの場合、以下の動作説明は、相手とコネクションを張った後のデータ転送の段階での動作になる。
【0030】
ストレージ300は、データを例えばセクタ、クラスタまたはページと呼ばれる単位で管理する。ここでは簡単のため、これらを総称してブロックと呼ぶ。ユーザが扱うデータはブロック単位ではないため、ストレージ300は通常ファイルシステムによりアクセスされる。ファイルシステムは、バイト単位のファイルデータをブロック単位のストレージ300の記録領域にマッピングする仕組みである。ファイルシステムは、ストレージ300上の予め定められた領域に、上述の管理情報をデータと併せて記憶する。
【0031】
ストレージ300からファイルデータを読み出す際は、まずこの管理情報を読み出し、読み出した管理情報を解析し、所望のファイルデータが実際にどのブロックに記憶されているかを表す情報であるエクステントマップを得る。そして、取得したエクステントマップに従ってブロックごとのデータ(ブロックデータ)を読み出し、ブロックデータから必要部分だけを抽出して所望のデータを得る。
【0032】
次に、エクステントマップの詳細について説明する。図2は、エクステントマップの構成例を示す図である。図2は、1ブロックが512バイトであり、ブロック235〜238に所望のファイルの一部のデータが格納されている例を示している。データは、ブロック235の124バイト目から始まっている。このため、データの位置を示す情報(有効データ位置情報)は、オフセット124バイト、長さは1458バイト、などと表わされる。エクステントマップは、ブロック位置情報と、有効データ位置情報とを含む。ブロック位置情報は、データが格納されているブロックの位置を表す情報である。図2の例では、ブロック235〜238が、ブロック位置情報に相当する。有効データ位置情報は、ブロック位置情報で示されるブロック内で、有効データが格納されている位置を表す情報である。このように、エクステントマップは、ストレージ300のどの位置に所望のデータが格納されているかが特定できる情報である。
【0033】
図2の例では、データが格納されているバイト位置をオフセットと長さで有効データ位置情報を示している。有効データ位置情報は、始端バイト位置と終端バイト位置等で表してもよい。このように、有効データ位置情報は、有効データの位置が特定できれば表現形式は問わない。また、図2の例では1458バイトの1つのデータ列の例を示したが、エクステントマップは離散的な複数のデータ列を表わしていてもよい。すなわち、1つのエクステントマップに、例えばブロック235〜238のうちの1458バイトを示す情報と、ブロック346〜350のうちの2000バイトを示す情報の2つのデータ列を含んでいてもよい。
【0034】
なお、以上はエクステントベースのファイルシステムの場合に当てはまる。本実施形態は、ブロック(クラスタ)ベースのファイルシステムにも適用できる。ブロック(クラスタ)ベースのファイルシステムの場合は、エクステントの代わりにブロック(クラスタ)のリストになる。このブロック(クラスタ)のリストをエクステントの特殊な場合(1つのエクステントの長さを512バイトに固定したもの)とみなせば、エクステントベースの場合と同様に考えることが可能である。以後はエクステントの用語を用いて説明し、これら両方を含むものとする。
【0035】
公知の技術では、通常、ホストCPUはアプリケーションのファイルデータ読み出し要求に基づき、デバイスドライバやファイルシステムソフトウェア等の制御ソフトウェアを実行することで、このエクステントマップを取得する。そして、ホストCPUは、エクステントマップに従って所望のデータをストレージから読み出し、アプリケーションに読み出したデータを返す。それに対して本実施形態では、ホストCPU200による処理の一部をデータ転送装置100が代行し、そのままネットワーク400にデータを送信する。具体的な処理の流れは次のようになる。
【0036】
図3は、第1の実施形態におけるデータ転送処理の全体の流れを示すフローチャートである。
【0037】
まず、ファイル指定部201が、例えばアプリケーションソフトウェアの処理に従い送信するファイルを特定し、特定したファイルを送信データ特定部204に指定する(ステップS101)。典型的な例としては、ファイル指定部201は、ネットワーク400に接続された他の機器から要求されたファイルを、送信するファイルとして特定する。
【0038】
さらに、メタデータ指定部202が、送信データの特定に利用するメタデータを指定する(ステップS102)。
【0039】
メタデータに含まれる特定情報は、単純には指定されたファイルの中の送信データのバイト位置を示すものでもよい。例えば、1000バイトのファイルのうち、10バイト目から99バイト目、200バイト目から299バイト目、および、500バイト目から699バイト目の3つのデータの固まりを送信する場合を考える。この場合、特定情報は、(先頭位置,長さ)の形式の3つのデータ(10,90)(200,100)(500,200)を含むリストデータ形式、または、テーブル形式で表される。データが映像や音声コンテンツのストリーミングのデータである場合、特定情報は、再生時間を表わすものであってもよい。例えば、全長が2時間のコンテンツで、そのうち、開始から10分後の時点から15分間、および、開始から30分後の時点から20分間のデータを送信する場合を考える。この場合、特定情報は、(開始時間[sec]、時間の長さ[sec])の形式の2つのデータ(600,900)(1800,1200)で表記してもよい。
【0040】
特定情報は、例えば対向装置で視聴するユーザが指定した位置そのものでもよい。また、特定情報は、コンテンツのうちの特定の俳優が映っているシーンなどを自動抽出したような、データ送信システム側からユーザに対して視聴を推奨する位置のようなものであってもよい。
【0041】
次に、メタデータ解析部203が、指定されたメタデータを解析する(ステップS103)。
【0042】
次に、送信データ特定部204が、解析されたメタデータの情報をもとに、指定されたファイルから、送信データを特定する(ステップS104)。送信データ特定部204は、特定した送信データの位置と、送信データの長さとを含む情報、または当該情報の集合を、管理情報読み出し指示部205に渡す。
【0043】
管理情報読み出し指示部205は、渡された送信データの情報に基づき、ストレージ300からファイルシステムの管理情報を読み出すコマンドの発行を、データ転送装置100のコマンド発行部110に指示する(ステップS105)。
【0044】
ストレージ300は、この指示に応じてコマンド発行部110から発行されたコマンドに基づき、管理情報を読み出してエクステントマップ取得部206に渡す(ステップS106)。
【0045】
エクステントマップ取得部206は、読み出された管理情報を解析し、読み出す送信データのエクステントマップを取得する(ステップS107)。なお、エクステントマップ取得部206が、予めキャッシュしたエクステントマップを取得するように構成してもよい。この場合は、エクステントマップ取得部206が同様の手順で予めエクステントマップを読み出しておく必要がある。
【0046】
次に、送信データ読み出し指示部207が、取得したエクステントマップを、データ転送装置100に渡し、データ転送装置100に対してそのデータの読み出しと送信を指示する(ステップS108)。
【0047】
データ転送装置100のコマンド発行部110が、送信されたエクステントマップを受け取り、受け取ったエクステントマップに従って、実際に送信データを含むブロックを読み出すべく、ストレージ300にコマンドを発行する(ステップS109)。
【0048】
コマンド発行部110は、ストレージ300側のI/F仕様に従ったコマンドを発行する。通常、一度に指定できる読み出しブロック数に限りがあったり、離散的なブロックは同時に指定できなかったりなどの制限がある場合がある。このため、1つのエクステントマップが複数のコマンド群に分割される場合もある。このように、コマンド発行部110は、必要に応じて1つのエクステントマップに対するコマンドを分割する処理も行う。
【0049】
コマンド発行部110がコマンドを順次ストレージ300に対して発行すると、ストレージ300からコマンドに対する応答として送信データが含まれたブロックデータが返ってくる。送信データ抽出部130が、ストレージ300から返された送信データを受け取る。
【0050】
なお、送信データ読み出し指示部207は、ステップS108でコマンド発行部110に指示を出す一方、送信データ抽出部130に対して、個々のコマンドで読み出されるブロックデータのどの部分に送信データが含まれているかを表す情報を渡す。すなわち、前述の図2の例では、送信データ読み出し指示部207は、ブロック235〜238というブロック位置情報をコマンド発行部110に渡し、オフセット124バイトおよび長さ1458バイトという有効データ位置情報を送信データ抽出部130に渡す。
【0051】
送信データ抽出部130は、受け取ったブロックデータから、有効データ位置情報に従い所望のバイト数(図2の例では1458バイト)のデータ列を抽出し、通信処理部140に渡す(ステップS110)。通信処理部140は、必要に応じて対向装置と制御情報を送受信しながら、ネットワーク400上に、抽出された送信データを送信する(ステップS111)。
【0052】
次に、ストレージ300とのI/F処理についてより詳しく説明する。まず、ストレージ300が典型的なSSDやHDDなどのSATA I/Fを備え、さらにバスマスターとしての機能(DMA機能)を備える場合について説明する。この場合、コマンド発行部110は、例えばストレージ300へのコマンドとして、デスクリプタと呼ばれるコマンドを記述したデータを、所定のメモリ上に用意しておく。ストレージ300はコマンドを当該メモリから読み出す。このようにしてコマンド発行部110が発行したコマンドがストレージ300に受け渡される。
【0053】
デスクリプタは通常リングバッファ形式になっており、典型的な公知の技術ではホストCPU200が使用するメインメモリ(主記憶装置、不図示)上に置かれる。本実施形態でも同じ形態をとってもよいが、データ転送装置100内のメモリ、または、データ転送装置100に直接接続されるメモリを用いることが、メインメモリやホストCPU200に負荷を与えないという点で望ましい。
【0054】
ストレージ300が読み出したブロックデータをDMAで書き込む宛先アドレスも、それぞれのデスクリプタに予め指定される。ストレージ300から読み出した管理情報はホストCPU200に渡し、送信データは通信処理部140に渡すといった振り分けは、このアドレス指定によって実現する。すなわち、管理情報をホストCPU200に渡す場合は、通常はメインメモリを介して行うので、デスクリプタに記載する宛先アドレスにメインメモリのアドレスを記載する。送信データを送信データ抽出部130に渡す場合は、宛先アドレスに送信データ抽出部130のアドレスを記載する。これによって、ストレージ300がデスクリプタによって指定された宛先アドレスに読み出したデータを書き込むだけで、読み出したデータをそれぞれに振り分けることができる。
【0055】
ストレージ300は、コマンドを実行してデータを読み出した後に、通知振り分け部120に対してコマンド完了通知を行う。ストレージ300は、例えば割り込みなどによって完了通知を行う。より具体的には、ストレージ300は、例えばどこまでコマンドを処理したか、すなわち、リングバッファのデスクリプタ群のどのデスクリプタまで処理したかを、各デスクリプタの処理完了を示すDONEビットをセットするなどにより通知する。
【0056】
通知振り分け部120は、割り込み通知を受けると、このDONEビットが書かれているデスクリプタを順次読み出し(読み出した後はDONEビットをリセットする)、そのデスクリプタまで処理が完了していることを判断できる。なお、一度に複数のデスクリプタの処理が完了している場合もあり得る。
【0057】
通知振り分け部120は、管理情報の読み出しに用いられるデスクリプタの完了通知を受けた場合は、管理情報読み出し指示部205に完了通知を振分ける。また、通知振り分け部120は、送信データの読み出しに用いられるデスクリプタの完了通知を受けた場合は、送信データ読み出し指示部207に完了通知を通知する。このようにして通知振り分け部120は完了通知をそれぞれに振り分ける。
【0058】
管理情報読み出し指示部205は、通知振り分け部120から完了通知を受けると、管理情報の読み出しが完了したと判断し、エクステントマップ取得部206にエクステントマップの取得を指示する。
【0059】
ストレージ300によるブロックデータの転送には、通常は一定のレイテンシが存在する。このため、ホストCPU200は、転送指示に対するストレージ300からの完了通知を毎回待たずに、複数のブロックの読み出しをまとめて指示する場合がある。その場合、そのままでは送信データ読み出し指示部207(および管理情報読み出し指示部205)とストレージ300と送信データ抽出部130との3者の間で同期が取られなくなる。このため、例えば以下の手法により同期を行う。
【0060】
1つ目の手法は、ストレージ300がコマンドを受けた順番と必ず同じ順番で読み出しを実行する場合に有効な手法である。この手法では、送信データ読み出し指示部207がストレージ300からの複数のブロックの読み出しを指示するとき、その指示と同じ順番で、対応するブロックの中の有効データ位置情報を送信データ抽出部130に通知する。送信データ抽出部130は、受け取った有効データ位置情報を例えばキューイングしておく。送信データ抽出部130は、ストレージ300からブロックデータを受け取った際、キューイングした有効データ位置情報をキューイングした順番に1つずつ取り出せば、ブロックデータとの対応付けができる。
【0061】
2つ目の手法は、ストレージ300が、内部処理の効率等を優先する場合等で、コマンドを受けた順番とは異なる順番で読み出しを実行し得る場合の手法である。この場合は、例えば各ブロックの宛先アドレスとして異なるアドレスを指定する手法等が考えられる。
【0062】
例えば8個の読み出しコマンドをストレージ300にまとめて指示する場合、送信データ読み出し指示部207は、8個のコマンドごとに異なる転送先アドレスを指定しておく。上述のように本実施形態では、転送先のアドレスに送信データ抽出部130のアドレスを指定する。2つ目の手法を適用する場合は、例えば1つのコマンドで最大4つのブロックの読み出し指示を出す場合、各コマンドに対応する転送先アドレスとして、それぞれ送信データ抽出部130のアドレス領域のうちの異なるアドレス領域を指定しておく。
【0063】
図4は、コマンドとアドレス領域との対応の一例を示す図である。図4は、送信データ抽出部130のアドレス領域が0x20200000〜0x202fffffの場合の例を示している。コマンド番号は、コマンドを識別する情報である。図4に示すように、0x20200000〜0x202007ffの512×4バイト領域がコマンド0に対応し、0x20200800〜0x20200fffの512×4バイト領域がコマンド1に対応し、0x20201000〜0x202017ffの512×4バイト領域がコマンド2に対応するというように、コマンドとアドレス領域とを予め対応付けておく。送信データ読み出し指示部207は、発行するコマンドに対して、対応するアドレス領域の先頭を指定するようにコマンド発行部110に指示する。
【0064】
これにより、転送されたブロックデータは、送信データ抽出部130の中の異なるアドレス領域に転送される。送信データ抽出部130は、受けたブロックデータが例えば0x20201200から始まるアドレスに書き込まれたデータであれば、当該データはコマンド2の先頭から2番目のブロックデータであることが特定できる。また、例えばコマンド2で読み出されるブロックデータに対して図2に示す有効データ位置情報が通知されている場合、このブロックデータは有効データの389バイト目から900バイト目のデータであることが分かる。
【0065】
送信データ読み出し指示部207は、送信データ抽出部130に対して8個の有効データ位置情報を通知する。その際、送信データ読み出し指示部207は、コマンド0に対応する有効データ位置情報、コマンド1に対応する有効データ位置情報、コマンド2に対する有効データ位置情報・・・、などのように、有効データ位置情報がいずれのコマンドに対応するかを特定できるように通知する。
【0066】
このような構成により、送信データ抽出部130は、受けたブロックデータ、および、有効データ位置情報がともに、いずれのコマンドに対するものかを判別できる。すなわち、送信データ抽出部130は、コマンドと、ブロックデータおよび有効データ位置情報との対応付けが可能となる。
【0067】
このように、ブロックデータの宛先アドレス領域を分けることによって、送信データ抽出部130が受け取ったブロックデータの順番がもとのデータ列の順番(通常はネットワークに送信する順番)と異なる場合でも、ブロックデータの宛先アドレスを確認することで、そのデータがどのコマンドに基づくデータかが判断できるので、それをもとにデータ列を元の順番に並び替えることが可能となる。
【0068】
なお、アドレスを使うことは本実施形態の一例である。ブロックデータを特定可能な情報であれば、アドレス以外のどのような情報を用いてもよい。また、以上のストレージ300I/Fの詳細は一例であり、これに限られるものではない。
【0069】
ストレージ300が内部エラー等の何らかの理由により、要求されたコマンドの実行を完了できない場合がある。この場合、ストレージ300は、データ転送装置100にエラー通知を行う。このままではホストCPU200はエラーの情報を得られないので、このような場合に、データ転送装置100がホストCPU200にエラー通知を中継して従来通りホストCPU200も異常を知ることができるように構成してもよい。
【0070】
また、通知振り分け部120は必ずしもデータ転送装置100上に構成する必要はなく、ホストCPU200上に構成してもよい。また、コマンド発行部110もその一部の処理をホストCPU200側で行ってもよい。ただし、1つの送信データ読み出し指示を複数のコマンドに分割する処理はデータ転送装置100上で行う方が処理効率の面で望ましい。
【0071】
このように、第1の実施形態にかかるデータ転送装置では、アプリケーションからの要求に基づき、ホストCPU200にデータ転送処理の負荷を与えることなくストレージ300上のデータをネットワーク400に送信することができる。従って、処理効率が向上し、データ転送速度を向上させることができる。また、ホストCPU200、ホストCPU200に付随するチップセット、メモリ、およびマザーボードなどのグレードを下げることができるので、装置の低コスト化を図ることができる。また、データ転送の大部分の処理をホストCPU200のソフトウェア処理ではなくデータ転送装置100のハードウェア処理で実行することが可能となるので、低消費電力化を図ることができる。
【0072】
(第2の実施形態)
第2の実施形態は、データ転送用に複数の通信コネクションが設定され、コネクションごとに独立してフロー制御を行う例を示している。例えばNAS(Network Attached Storage)のようなネットワークストレージ、VODサーバに接続される複数のクライアント端末、または、クライアント端末上の複数のアプリケーションから、同時に読み出し要求やコンテンツ配信要求を受けた場合などに、複数の独立したコネクションでストレージからデータを読み出してネットワークに送信する動作を可能とする。
【0073】
図5は、第2の実施形態に係るデータ送信システムの概略構成例を示すブロック図である。
【0074】
図5に示すように、第2の実施形態のホストCPU200−2は、ファイル指定部201と、メタデータ指定部202と、メタデータ解析部203と、送信データ特定部204−2と、管理情報読み出し指示部205−2と、エクステントマップ取得部206と、送信データ読み出し指示部207−2と、を備えている。
【0075】
第2の実施形態では、送信データ特定部204−2、管理情報読み出し指示部205−2、および送信データ読み出し指示部207−2の機能が第1の実施形態と異なっている。その他の構成および機能は、第1の実施形態のブロック図である図1と同様であるので、同一符号を付し、ここでの説明は省略する。
【0076】
送信データ特定部204−2および管理情報読み出し指示部205−2は、コネクションごとに処理を実行する点が、第1の実施形態と異なっている。送信データ読み出し指示部207−2は、コネクションを識別するコネクション識別情報とともに、データの読み出しを指示する点が、第1の実施形態と異なっている。
【0077】
第2の実施形態のデータ転送装置100−2は、コマンド発行部110と、通知振り分け部120と、送信データ抽出部130−2と、通信処理部140−2と、フロー制御部150−2と、バッファ管理部160−2と、データバッファ170−2と、を備えている。
【0078】
第2の実施形態では、フロー制御部150−2とバッファ管理部160−2とデータバッファ170−2とを追加したこと、および、送信データ抽出部130−2と通信処理部140−2の機能が第1の実施形態と異なっている。その他の構成および機能は、第1の実施形態のブロック図である図1と同様であるので、同一符号を付し、ここでの説明は省略する。
【0079】
データバッファ170−2は、送信データ抽出部130−2と通信処理部140−2との間のデータの受け渡しのためにコネクションごとにデータをバッファリングする。以下では、データバッファ170−2内のコネクションごとのデータを記憶する領域を、単にバッファという場合がある。
【0080】
バッファ管理部160−2は、データバッファ170−2のコネクションごとの状態(バッファ状態)を管理する。フロー制御部150−2は、バッファ管理部160−2からの通知に基づいてコネクションごとのデータのフロー制御を行う。図5では、フロー制御情報の伝達は太い破線で表わしている。
【0081】
送信データ抽出部130−2は、抽出した送信データをデータバッファ170−2に記憶する点が、第1の実施形態と異なっている。通信処理部140−2は、バッファ管理部160−2により管理されるバッファ状態に応じて、データバッファ170−2から送信データを読み出す点が、第1の実施形態と異なっている。
【0082】
図6は、第2の実施形態におけるデータ転送処理の全体の流れを示すフローチャートである。
【0083】
ステップS201からステップS207までは、第1の実施形態のデータ転送処理を示す図3のステップS101からステップS107までと同様の処理なので、その説明を省略する。
【0084】
本実施形態では、送信データ読み出し指示部207−2が、取得したエクステントマップとともに、コネクション識別情報をデータ転送装置100−2に渡し、データ転送装置100−2に対してそのデータの読み出しと送信を指示する(ステップS208)。送信データ読み出し指示部207−2は、例えば、アプリケーションから受け取ったコネクション識別情報をデータ転送装置100−2に渡す。
【0085】
データ転送装置100−2では、フロー制御部150−2がデータの読み出しの指示を受ける。フロー制御部150−2は、コネクションごとにエクステントマップを保持する。すなわち、フロー制御部150−2は、複数のコネクションのデータ読み出し要求を一旦保持しておく。そして、バッファ管理部160−2からバッファに空きがあるコネクションの通知を受けると、フロー制御部150−2は、通知を受けたコネクションの送信データの読み出しコマンドの発行をコマンド発行部110に対して指示する。
【0086】
コマンド発行部110は、フロー制御部150−2から受け取ったエクステントマップに従って、送信データを含むブロックを読み出すための読み出しコマンドを発行する(ステップS209)。ステップS210は、第1の実施形態のステップS110と同様の処理なので、その説明を省略する。
【0087】
第2の実施形態では、送信データ抽出部130−2は、ブロックデータから抽出した送信データを、データバッファ170−2に記憶する(ステップS211)。また、通信処理部140−2は、データバッファ170−2から送信データを読み出してネットワーク400に送信する(ステップS212)。
【0088】
初期状態では全てのコネクションのバッファは空いているので、フロー制御部150−2は、そのままコマンド発行部110に送信データの読み出しを指示することになる。同じコネクションのデータの送信が連続して要求されると、フロー制御部150−2が要求を一旦保持し、バッファ管理部160−2からのバッファ空き通知を待つ状況になる場合がある。
【0089】
コマンド発行部110に一度にコマンド発行を要求するデータのサイズは、バッファの空きサイズ(空き容量)以下でなければならない。一例として、データバッファ170−2のコネクションごとのバッファが128KBずつ確保され、バッファ管理部160−2がいずれかのコネクションで64KB以上バッファに空きが生じたら、そのコネクションのバッファ空きをフロー制御部150−2に通知するものとする。
【0090】
ホストCPUから渡されたエクステントマップが、これより大きいサイズのデータを示している場合も当然ながらあり得る。しかし、フロー制御部150−2が一度にコマンド発行を要求可能なデータのサイズは空いた分の64KB以下のサイズの部分データである。このため、フロー制御部150−2は、この部分データの読み出しをコマンド発行部110に要求する。同時にフロー制御部150−2は、この部分データの中の有効データ位置情報を送信データ抽出部130−2に渡す。そして、フロー制御部150−2は、読み出し処理を完了した部分データの位置を進捗情報としてコネクションごとに保持し、一旦コマンド発行要求を終える。
【0091】
以上の処理を、図7を用いて説明する。図7は、エクステントマップの構成例を示す図である。図7は、ブロック位置情報としてブロック235〜1000、有効データ位置情報としてオフセット124バイト、長さ391602バイトを表すエクステントマップをホストCPU200−2から与えられた例を示している。この場合、最初の部分データは、例えば64KB以下の切りの良いところとしてブロック235〜362の65412バイトとなる。そして、この部分データの有効データ位置情報は、オフセット124バイト、長さ65412バイトである。フロー制御部150−2は、ブロック235〜362の読み出しコマンドの発行をコマンド発行部110に要求する。フロー制御部150−2は、同時に送信データ抽出部130−2にオフセット124バイト、長さ65412バイトという有効データ位置情報を渡す。フロー制御部150−2は、進捗情報として次回処理するブロックはブロック363、または、65413バイト目、という情報を保持し、一旦処理を終える。フロー制御部150−2は、バッファ管理部160−2からの次のバッファ空き通知を待つ。
【0092】
なお、以上で述べた64KBなどの各種データサイズは一例であり、この例に限られるものではない。また、データサイズは一定である必要もなく、サイズが毎回変わる場合も本実施形態を適用できる。
【0093】
一旦部分データの処理を終え、その後に他のコネクションのデータバッファが空いたという通知をバッファ管理部160−2から受けると、フロー制御部150−2は、通知を受けたコネクションに対して同様に部分データの読み出し要求処理を行う。そして、あるコネクションに関して与えられたエクステントマップが示すデータの全てを送信し終える(図7の場合は6番目の部分データの読み出し要求を完了する)と、そのコネクションの与えられたエクステントマップが示すすべてのデータの送信が完了となる。フロー制御部150−2は、すべてのデータの送信が完了した旨をホストCPU200−2に通知する。
【0094】
ホストCPU200−2では、例えば管理情報読み出し指示部205−2がこの通知を受け取り、次のアプリケーションからのデータ送信処理、すなわち管理情報読み出し指示部205−2から始まる一連の処理を実行可能とする。逆に、この通知を受けるまで、管理情報読み出し指示部205−2が次の管理情報の読み出しを一旦保留することで、送信データ特定部204−2との間のフロー制御を実現する。
【0095】
なお、ホストCPU200−2がこの通知を受けるのは必ずしも管理情報読み出し指示部205−2である必要はない。例えば、エクステントマップ取得部206、または、送信データ読み出し指示部207−2でもよい。すなわち、最終的にアプリケーションに対してバックプレッシャが伝達されるようになっていれば、いずれの構成部が通知を受けてもよい。
【0096】
また、以上の例ではデータ転送装置100−2がコネクションごとに同時に1つしかエクステントマップを受け付けない例を示したが、2つ以上のエクステントマップを受け付けるように構成してもよい。複数のエクステントマップを受け付ける構成であっても、エクステントマップは必ず有限個になる。従って、エクステントマップの最大個数を受け付けた際にそれ以上のエクステントマップを受けられないような仕組みを備えることにより、前述の方式を適用できる。
【0097】
送信データ抽出部130−2は、前述のとおり有効データ位置情報をフロー制御部150−2から受け取り、有効データ位置情報に従って抽出した送信データをデータバッファ170−2に書き込む。データバッファ170−2に書き込む際の宛先アドレスは、フロー制御部150−2が生成し、送信データ抽出部130−2に渡す。
【0098】
例えば、データバッファ170−2が前述の説明同様にコネクションごとに128KB確保されており、コネクションごとのバッファの先頭アドレスが以下のように割り当てられているものとする。
コネクション0のバッファの先頭アドレス=0x00000000
コネクション1のバッファの先頭アドレス=0x00020000
コネクション2のバッファの先頭アドレス=0x00040000
【0099】
また、現在コネクション1を処理しており、図7に示すデータの読み出しが初めて要求されたとする。この場合、最初の部分データの宛先アドレスは0x00020000となり、次の部分データの宛先アドレスは65413バイト加えた0x0002ff85となる。
【0100】
このように宛先アドレスを部分データのサイズごとに増加させていくと、データバッファ170−2にはもとの通り一連のデータとして展開される。また、バッファが例えばバイト単位のリングバッファであるとすると、0x0003ffffの次のバイトは0x00020000に書き込むことになる。
【0101】
フロー制御部150−2は、送信データ抽出部130−2に対し、有効データ位置情報と共に、このような宛先アドレスを渡す。送信データ抽出部130−2は、抽出した送信データを、宛先アドレスに従ったアドレスから書き込む。これにより、データバッファ170−2にコネクションごとに適切に送信データを展開することができる。
【0102】
バッファ管理部160−2は、データバッファ170−2のコネクションごとのバッファのデータの供給側の書き込み位置と、データの消費側の読み出し位置と、コネクションごとのバッファの空き状態とを管理する。
【0103】
例えば、コマンド発行部110に部分データの読み出し要求を行い、ストレージ300から読み出し要求に対する応答通知が返ってくると、フロー制御部150−2は、当該コネクションのバッファのどの位置までデータが書き込まれたかを判別できる。このため、フロー制御部150−2は、データが書き込まれた位置を進捗情報としてバッファ管理部160−2に通知する。
【0104】
例えば、図7の最初の部分データを書きこみ終わった際、フロー制御部150−2は、65413バイトという情報をコネクション識別情報とともにバッファ管理部160−2に通知する。この通知によって、バッファ管理部160−2は、コネクション1のバッファのデータの供給側の位置は65413バイトであると把握できる。
【0105】
一方、通信処理部140−2がデータを送信するためにデータバッファ170−2からデータを読み出すと、データの消費側の読み出し位置が移動する。このため、通信処理部140−2は、読み出し終わったバイト位置(正確には次に読み出し始めるバイト位置)をコネクションごとにバッファ管理部160−2に通知する。
【0106】
初期状態では、バッファは128KB(正確には2の17乗の131072バイト)空いている。最初にデータを書き込まれると65413バイト減って空きサイズが65659バイトになる。これは64KB(正確には2の16乗上の65536バイト)より大きいので、バッファ管理部160−2は、バッファ空き通知をフロー制御部150−2に送信する。
【0107】
これにより、フロー制御部150−2は、次の部分データ(図7の例では65536バイト)の読み出し要求を出す。読み出し要求に応じてデータが書き込まれると、バッファサイズがさらに減って23バイトになる。これは64KBより少ないので、バッファ管理部160−2はバッファ空き通知を行わない。
【0108】
従って、フロー制御部150−2は、次の部分データの読み出しを保留する。その後、通信処理部140−2がデータを例えば1KB(1024B)読み出すと、空きバッファサイズは1047バイトに増加する。引き続き通信処理部140−2がデータを読み出していき、空きサイズが65536バイト以上になると、その段階でバッファ管理部160−2はフロー制御部150−2にバッファ空き通知を行う。
【0109】
通信処理部140−2は、処理している通信プロトコル仕様やネットワークの帯域などによって送信速度が制限される。例えばTCPプロトコルのようにフロー制御や輻輳制御を行うような場合は、対向装置やネットワークの込み具合によって送信速度が低下し、データバッファ170−2からのデータの読み出しの進み具合が遅くなる。本実施形態によれば、その場合でも、適切に最上位のアプリケーションまでのフロー制御を実現することができる。逆に、対向装置が十分なデータを受け入れられる場合でも、本実施形態では、通信処理部140−2が現在のデータ供給側の位置を参照して、どの位置までデータを送信可能か判断する。これにより、適切にバッファに充填されている分だけデータを送信するという適切な制御が可能となる。
【0110】
次に、通信処理部140−2がRTPのようなリアルタイム通信プロトコルを用いる場合の具体的な構成例を説明する。図8は、第2の実施形態の通信処理部140−2の構成例を示すブロック図である。
【0111】
図8に示すように、通信処理部140−2は、送信開始指示部141と、パケット送信指示部142と、送信判定部143と、ヘッダ生成部144と、データ読み出し部145と、パケット生成部146と、送信時刻生成部147と、を備えている。
【0112】
送信開始指示部141は、ホストCPU200−2からのデータ送信開始指示を受け付け、受付けた指示に応じてデータの送信開始要求をパケット送信指示部142に送信する。パケット送信指示部142は、送信開始要求を受けると、その後のパケットごとの送信指示を行う。送信判定部143は、送信処理の各種判定処理を行う。ヘッダ生成部144は、パケットのヘッダを生成する。データ読み出し部145は、データバッファ170−2からパケットのデータ部分(ペイロード)を読み出す。パケット生成部146は、
生成されたヘッダと読み出されたデータに基づきパケットを生成する。送信時刻生成部147は、読み出されたデータを含むパケットの次に送信するパケット(次パケット)の送信時刻を生成する。
【0113】
具体的な動作は次のようになる。まず、ホストCPU200−2は、パケット送信を開始するコネクションのコネクション識別情報を指定して、送信開始指示を送信開始指示部141に対して通知する。送信開始指示部141は、パケット送信指示部142に対して最初のパケットの生成を要求する。
【0114】
パケット送信指示部142は、内部にタイマーを持ち、例えば27MHz・32ビットの現在のタイマーカウント値(すなわち現在時刻)を常に更新している。パケット送信指示部142は、コネクションごとに次パケットの送信時刻を例えばテーブル形式で保持する。パケット送信指示部142は、テーブルから送信時刻を順次読み出して現在のタイマーカウント値と比較し、現在時刻を越えていたらそのコネクションのパケット生成を指示する。
【0115】
例えばコネクション1とコネクション3が存在し、コネクション1のパケットの送信時刻として0x40000000が保持され、コネクション3のパケットの送信時刻として0x40000100が保持されているものとする。この場合、現在のタイマーカウント値が0x3fffffffまでのときは、パケット送信指示部142は、パケット生成を指示しない。現在のタイマーカウント値が0x40000000になったときに、パケット送信指示部142は、コネクション1のパケット送信を指示する。現在のタイマーカウント値が0x40000100になったときに、パケット送信指示部142は、コネクション3のパケット送信を指示する。
【0116】
送信判定部143は、パケット送信の指示に基づいてパケットの送信判定を行う。例えば、送信判定部143は、バッファ管理部160−2から現在のデータの供給側の書き込み位置を取得し、その位置が今回のパケット送信で読み出されるデータの終端を超えているか否かを判断する。超えている場合は、送信判定部143は、送信すべきデータが既に準備できているということを意味するので送信可能であると判定する。送信可能であると判定された場合、後段のヘッダ生成部144とデータ読み出し部145とパケット生成部146が動作して、パケットが送信される。
【0117】
送信時刻生成部147は、例えばデータを読み出した後に、次パケットの送信時刻を生成して、生成した送信時刻をパケット送信指示部142に伝える。このときに生成するパケット送信時刻は、例えば、現在送信しているデータストリームのパケット送信間隔(P[sec]とする)と、送信開始時点の時刻(T0[sec]とする)とから算出する。例えば、N番目のパケットの送信時刻はT0+(N−1)×Pとなる。
【0118】
送信時刻生成部147が、次に送信するパケットに格納するデータの先頭バイトの、送信開始バイトからのバイトオフセット(OFS[Byte]とする)と、データストリームのビットレート(BR[Byte/sec]とする)とから、T0+OFS/BRにより送信時刻を算出してもよい。
【0119】
これらは本質的に同等の算出方法である。また、以上の例では簡単のため時間の単位を[sec]としたが、前述した27MHzのクロックカウンタの単位で扱ってもよい。
【0120】
一方で、バッファ管理部160−2から現在のデータの供給側の書き込み位置が今回のパケット送信で読み出されるデータの終端を超えていない場合は、送信判定部143は、送信すべきデータが未だ準備されていないということを意味するので送信できないと判定する。この場合、送信が指示されたパケットの送信は取りやめる。
【0121】
そして、送信判定部143は、送信時刻生成部147に対して次パケットの送信時刻を生成するように指示を出す。このときに生成するパケット送信時刻は、例えば、現在の時刻に対し、前述のパケット送信間隔Pを足した時刻としてよいし、それ以外の所定の時刻としてもよい。さらに、ホストCPU200−2からの設定によっては、この送信データが準備できていないいわゆるバッファアンダーフロー状態を、異常状態としてホストCPU200−2に通知する処理を行ってもよい。この場合、ホストCPU200−2は、例えば通知されたエラーをログに出力するなど異常系の処理を行ってもよい。
【0122】
また、送信しているデータが例えばMPEGのTTS(Timestamped Transport Stream)パケット(4バイトタイムスタンプ値+188バイトTSパケットの合計192バイト)を含む送信パケットの場合、送信パケットの送信時刻は、その送信パケットに格納されている先頭のTTSパケットのタイムスタンプ値を用いる。
【0123】
例えば1つの送信パケットに7つのTTSパケットを格納して送信し、送信を開始するTTSパケットをTTS0とするものとする。この場合、TTS0〜6が1つ目の送信パケットに格納され、TTS7〜13が2つ目の送信パケットに格納され、TTS14〜20が3つ目の送信パケットに格納され、各送信パケットが送信される。このときの各送信パケットの送信時刻は、1つ目の送信パケットはTTS0のタイムスタンプ値、2つ目の送信パケットはTTS7のタイムスタンプ値、3つ目の送信パケットはTTS14のタイムスタンプ値、にそれぞれ基づいた値となる。
【0124】
具体的には、1つ目のパケットの送信時刻をT0、N番目のTTSパケットのタイムスタンプ値をTMS(N)と表わすと、2つ目の送信パケットの送信時刻はT0+TMS(7)−TMS(0)、3つ目の送信パケットの送信時刻はT0+TMS(14)−TMS(0)となる。
【0125】
従って、例えば2つ目の送信パケットの送信時刻を生成するときは、送信時刻生成部147は、1つ目のパケットのデータであるTTS0〜TTS6のデータ(192バイト×7=1344バイト)を読み出した後にさらにTTS7の先頭のタイムスタンプ値(4バイト)も読み出す。また、例えば3つ目の送信パケットの送信時刻を生成するときは、送信時刻生成部147は、2つ目の送信パケットのデータであるTTS7〜TTS13を読み出した後にさらにTTS14の先頭のタイムスタンプ値も読み出す。送信時刻生成部147は、このようにして読み出したタイムスタンプ値をもとに次のパケット送信時刻を求める。
【0126】
さらに、このタイムスタンプ値の読み出しは、直前のデータ読み出しと隙間なく連続して行うように構成してもよい。例えば、1344バイト+4バイト=1348バイトを一括して読み出すように構成してもよい。これにより、バッファへのメモリアクセスのオーバーヘッドを軽減することができる。
【0127】
図9は、TTS0〜TTS7のデータの並びを例示する図である。図9の斜線部分は、各TTSの4バイトのタイムスタンプ値の部分を表す。TTS0〜TTS6と次のTTS7のタイムスタンプ値を併せた部分は図の矢印部分である。データ読み出し部145は、1つ目の送信パケットのデータ読み出し時に、この矢印で占められた領域を一括して読み出す。これにより、1つ目の送信パケットのデータ読み出しと併せて次の送信パケットの送信時刻生成に必要なTTS7のタイムスタンプ値を読み出すことができるため、処理の効率化が図れる。
【0128】
なお、以上のRTP系の通信プロトコルの場合においても、例えばデータ読み出し部145がデータの読み出しを完了した時点で、前述の通り読み出し終わった部分を進捗情報としてバッファ管理部160−2に伝える。例えば、データ読み出し部145は、読み出しの最後のタイムスタンプ値の部分は含めない位置を通知する。図9の場合は、データ読み出し部145は、TTS6の終端位置を通知する。データ読み出し部145が読み出しの最後のタイムスタンプ値の部分を含めた位置を読み出し済みとして通知するように構成してもよい。ただし、タイムスタンプ値はもう読み出せないことを意味する。従って、この構成の場合、例えば図9の例では、次の送信パケットのデータ読み出しまで、読み出した最後のタイムスタンプ値を保持しておく必要がある。そして、データ読み出し部145は、2つ目の送信パケットのデータを読み出すとき、保持したタイムスタンプ値の次のデータから読み出しを行い、保持したタイムスタンプ値と読み出したデータとをマージしてパケット生成部146に渡すことになる。
【0129】
このように、第2の実施形態にかかるデータ転送装置では、第1の実施形態の効果に加えて、通信速度が遅くなっても適切にフロー制御を行うことができるようになる。また、第2の実施形態では通信コネクションごとにフロー制御を行うことができる。このため、あるコネクションのデータフローが止まっていても、それ以外のコネクションのデータフローには影響を与えないように動作することが可能である。
【0130】
(第3の実施形態)
第3の実施形態では、より複雑な動作例として、トリックプレイ向け送信とFECパケット送信について説明する。トリックプレイとは、早送り、巻き戻しなど通常再生とは異なる再生のことを指す。例えばRTPを用いたリアルタイム通信ベースのIPTV向けVODサーバでは、トリックプレイによる再生に対応したストリームの送信が必要となる。
【0131】
図10は、トリックプレイ向け送信の動作概要を示す図である。図10の1段目は標準的なMPEGのGOP構造(Iフレーム、Bフレーム、Pフレームの並び)の一例を示している。2段目はGOPの並びの一例を示している。図10の例では、0.5secごとにGOPが構成されている。
【0132】
トリックプレイでは、早送りなどにより速い速度での再生が指定されたときに、コンテンツの加工等を行わずにそのまま速く再生すると、機器自体の処理速度をその分だけ速くしなくてはならず、コストが高くなる。このため、実際には再生する映像を間引くということを行っている。
【0133】
具体的には、MPEGストリームデータのIフレームだけを抽出して再生する。例えばIフレームが0.5sec間隔で登場する場合、0.25秒間隔で再生すると2倍速になる。さらに、Iフレーム自体を2つのうち1つだけを再生する(1つおきに再生する)ように間引くことで4倍速となる。さらに間引くと8倍速および16倍速などが実現できる。また、再生するIフレームの順番を逆順にすると巻き戻し再生が可能となる。早送りと同様の方式で巻き戻しの2倍速、4倍速、8倍速および16倍速などが実現できる。図10の下半分は、1倍速(x1)から32倍速(x32)までのIフレームの抽出規則の例を示している。トリックプレイ中、クライアント端末はこのように再生を行う。従って、VODサーバは、Iフレームを抽出して、指定された通りのタイミングでクライアント端末に対して送信する必要がある。
【0134】
図11は、第3の実施形態に係るホストCPU200−3の概略構成例を示すブロック図である。図12は、第3の実施形態に係る通信処理部140−3の概略構成例を示すブロック図である。データ転送装置およびストレージの構成および機能は、第2の実施形態と同様であるため説明を省略する。
【0135】
図11に示すように、第3の実施形態のホストCPU200−3は、送信要求受付部208−3と、コンテンツメタデータ読み出し部209−3と、ファイル指定部201−3と、コンテンツメタ―データ解析部210−3と、送信データ特定部204−3と、管理情報読み出し指示部205−2と、エクステントマップ取得部206と、送信データ読み出し指示部207−2と、を備えている。
【0136】
第3の実施形態では、送信要求受付部208−3とコンテンツメタデータ読み出し部209−3とコンテンツメタ―データ解析部210−3を追加したこと、メタデータ指定部202とメタデータ解析部203が削除されたこと、および、ファイル指定部201−3と送信データ特定部204−3の機能が第2の実施形態と異なっている。その他の構成および機能は、第2の実施形態のブロック図である図5と同様であるので、同一符号を付し、ここでの説明は省略する。
【0137】
送信要求受付部208−3は、クライアント端末からのトリックプレイ向け送信要求を受け付ける。送信要求には、例えば、再生するコンテンツを特定するための情報、トリックプレイの再生モード(何倍速の早送りか巻き戻しかなど)、および、再生開始位置(コンテンツの開始時からの相対時間など)などが含まれる。
【0138】
本実施形態では、例えば、再生開始位置やトリックプレイの再生モードが特定情報に相当する。したがって、送信要求受付部208−3が、特定情報を含むメタデータを指定するメタデータ指定部202に相当する。
【0139】
ファイル指定部201−3は、送信要求をもとに、トリックプレイを行うファイル(以下、コンテンツともいう)を特定する。なお、コンテンツの特定方法はこれに限られるものではない。例えば、ファイル指定部201−3が、データ送信システムの動作状態などに応じて再生するコンテンツを特定するように構成してもよい。
【0140】
コンテンツメタデータ読み出し部209−3は、トリックプレイを行うコンテンツのコンテンツメタ―データをストレージ300から読み出す。このように、本実施形態では、コンテンツメタデータをストレージ300に記憶する。なお、ストレージ300以外の記憶装置にコンテンツメタデータを記憶してもよい。コンテンツメタデータは、例えばコンテンツの全てのIフレームの開始バイト位置と長さとを含む。
【0141】
コンテンツメタ―データ解析部210−3は、読み出されたコンテンツメタデータを参照し、コンテンツのIフレームのバイト位置を解析する。送信データ特定部204−3は、解析されたバイト位置の情報をもとに、特定されたコンテンツの中の送信データ(送信するIフレーム)を特定する。
【0142】
図12に示すように、第3の実施形態の通信処理部140−3は、送信開始指示部141と、パケット送信指示部142と、送信判定部143と、ヘッダ生成部144と、データ読み出し部145と、パケット生成部146と、送信時刻生成部147と、先頭判定部148−3と、を備えている。
【0143】
第3の実施形態では、先頭判定部148−3を追加したことが第2の実施形態と異なっている。その他の構成および機能は、第2の実施形態の通信処理部140−2のブロック図である図8と同様であるので、同一符号を付し、ここでの説明は省略する。
【0144】
先頭判定部148−3は、次に送信するパケットがIフレームの先頭か否かを判定する。
【0145】
図13は、第3の実施形態におけるデータ転送処理の全体の流れを示すフローチャートである。
【0146】
まず、送信要求受付部208−3が、クライアント端末からトリックプレイ送信の要求を受ける(ステップS301)。送信要求の受付は、例えばIPTV仕様ではRTSP(Real Time Streaming Protocol)などで実現される。送信要求受付部208−3は、クライアント端末から指定されたトリックプレイの再生モード、再生開始位置を送信データ特定部204−3に渡す。
【0147】
ファイル指定部201−3は、受付けられた送信要求をもとに、いずれのコンテンツのトリックプレイを行うか特定し、特定したコンテンツの情報を送信データ特定部204−3に指定する(ステップS302)。
【0148】
コンテンツメタデータ読み出し部209−3は、特定されたコンテンツに対応するコンテンツメタデータを読み出す(ステップS303)。コンテンツメタ―データ解析部210−3は、読み出されたコンテンツメタデータを解析して、コンテンツ中の全Iフレームのバイト位置を取得する(ステップS304)。コンテンツメタ―データ解析部210−3は、取得したバイト位置を送信データ特定部204−3に渡す。
【0149】
送信データ特定部204−3は、特定されたコンテンツ、および、バイト位置の情報を利用し、実際にどのIフレームを送信するか特定する(ステップS305)。例えば、再生開始時間が10分15秒のとき、GOP間隔が0.5secとすると、送信データ特定部204−3は、(60x10+15)/0.5=1230個目のGOPから再生すると特定できる。トリックプレイの再生モードが4倍速早送りであった場合、図10の抽出規則に従ったとすると、Iフレームを1つおきに送信することになる。従って、送信データ特定部204−3は、1230個目、1232個目、1234個目、1236個目・・・のIフレームを送信すると特定できる。また、送信データ特定部204−3は、コンテンツメタ―データ解析部210−3による解析結果から、特定したIフレームそれぞれのコンテンツ中のバイト位置(先頭位置と先頭位置からの長さ)を特定できる。
【0150】
ステップS306からステップS313までは、第2の実施形態のデータ転送処理を示す図6のステップS205からステップS212までと同様の処理なので、その説明を省略する。
【0151】
なお、通信処理部140−3の動作は第2の実施形態と基本的には同じであるが、トリックプレイではIフレームを0.5sec間隔で送信しなければならないので、そのための処理が異なる。以下に詳細を説明する。
【0152】
まず、送信データに相当するIフレームは複数の送信パケットで構成される。また、前述の通り、送信パケットは例えば7個などのMPEGのTSパケットまたはTTSパケット(単位パケット)で構成される。なお、以下では主にTTSパケットを用いる例を説明するが、TSパケットを用いる場合にも同様に適用できる。
【0153】
図14は、Iフレームとパケットとの関係の一例を示す図である。図14の上段は、抽出したIフレームがデータバッファ170−2上に展開されている様子を示している。先ほどの例では、Iフレーム0が1230個目のIフレームとなり、Iフレーム1が1232個目のIフレームとなり、Iフレーム2が1234個目のIフレームとなる。中段は、送信パケットの構成例を示している。例えばIフレーム0はPKT0〜PKTn−1のn個の送信パケットに分割されて送信される。下段は、MPEG TTSパケットの構成例を示している。例えばPKT0はTTS0〜TTS6で構成されている。
【0154】
各TTSは、第2の実施形態で述べたとおり、先頭4バイトにタイムスタンプ値を格納する。同じIフレーム内の送信パケットを送信する場合は、第2の実施形態と同様にデータ読み出し部145が、タイムスタンプ値を読み出す。そして、送信時刻生成部147が、次パケットの送信時刻を求めるように動作する。
【0155】
一方、前述の通り、次のIフレームは例えば0.25sec後という時刻に定められている。従って、次パケットがIフレームの先頭であった場合、送信時刻生成部147は、読み出したタイムスタンプ値とは関係なく、次パケットの送信時刻を、先のIフレームの先頭となる送信パケット(図14の場合はPKT0)を送信した時刻から、0.25sec後に設定する。
【0156】
先頭判定部148−3は、このような動作を実現するために、次に送信するパケットがIフレームの先頭か否かを判定するために用いられる。具体的には、まず、データ読み出し部145が、タイムスタンプ値にさらに続いてTSパケットのヘッダ(TSヘッダ)を読み出すように構成する。先頭判定部148−3は、例えば読み出されたTSヘッダのPESの先頭を示すpayload_unit_start_indicatorが1になっているかを確認する。コンテンツに映像以外のTSパケットも含んでいる場合は、先頭判定部148−3が、さらにPIDがVIDEOを示していることも併せて確認してもよい。
【0157】
図14ではTTSxにてIフレームの先頭が現れることが示されている。以上のIフレーム先頭判定によって、同じIフレーム内では通常再生と同様の短い間隔で送信パケットを送信しながら、次のIフレームは0.25secなど所定の長い時間間隔を空けて送信するという機能が実現できる。従って、例えばIPTVトリックプレイ向け送信に必要な断続的なIフレームの送信が可能となる。なお、Iフレーム間隔はシステム仕様やコンテンツなどに依存する。従って、上記のIフレーム間隔の0.5secという時間は一例でありこれに限られるものではない。
【0158】
以上のように、本実施形態では、ホストCPU200−3が、図10のようなMPEGデータから、再生に必要なIフレームだけを抽出して、図14で示したようなデータを、データ転送装置100に渡す。したがって、データ転送装置100は、トリックプレイを実現するために、Iフレームの先頭を検出して、パケットを送信するという処理をするだけでよい。すなわち、トリックプレイをする場合にも、データ転送装置100は非常にシンプルな処理だけをすればよく、データ転送装置100の構成をシンプルにできるという効果がある。
【0159】
次に、FECパケットの送信を行う場合について説明する。FECとは、送信するデータパケットに冗長データパケットを付加して、一部のデータパケットがネットワークの途中経路で損失した場合に、損失しなかった残りのデータパケットとその冗長データパケットを用いて、損失したデータパケットを復元する手法である。具体的には、データパケットA、B、Cを送信する場合、例えばX=A xor B xor Cのようにデータのペイロードをビット単位でXORして求めたデータパケットXも併せて送信する。送信した結果、データパケットBが損失した場合、受信側では、残りのデータパケットA、C、およびXからB=A xor C xor XとしてデータパケットBを復元することができる。ただし、データパケットBとデータパケットAなどのように2つのデータパケットを損失した場合などは復元することができない。
【0160】
IPTVの場合もこのFECを応用してデータ(映像および音声データ)の損失を補うことがPro−MPEG仕様により定められている。Pro−MPEGでは、データパケットはRTPパケットで送信される。例えば上記データパケットA、B、CがそのRTPパケットに相当する。パケット長は一定であると定められており、上記のxor演算はそれぞれのデータパケットの同じオフセットのビット同士で行われる。また、実際のデータはストリームとして伝送されるので、データパケットが次々と送信される。Pro−MPEGでは所定数のデータパケットをグルーピングし、グルーピングしたデータパケットごとに順次FECパケットを生成する。
【0161】
図15および図16は、FECパケットを生成するためのデータパケットのグルーピングの一例を示す図である。図15および図16は、送信されるデータパケットを10×10のマトリクス上に並べて表示した様子を示している。図15および図16は、それぞれ縦方向、横方向にデータパケットをグルーピングしてFECパケットを生成する様子を示している。図15のFECをColumn FEC、図16のFECをRow FECと呼ぶ。前述のように、これらのグルーピングされたデータパケットのうち、1つだけロスト(損失)した場合に受信側での復元が可能となる。
【0162】
Column FECは縦方向にグルーピングしていることから、横方向に連続したロスト、すなわち、バーストロストに強いという特徴を持つ。Row FECはColumn FECを補うものであり、ランダムロストに対する耐性を高めるものである。
【0163】
以上のFECパケットは、本実施形態では次のように生成される。例えば、図16の1つ目のRow FECの場合、データパケット1〜10が送信された後に最初のRow FECであるF1が送信される。送信判定部143は、データパケットの送信後に、データパケットの現在のマトリクス中における位置を把握し、Column FECとRow FECを送るかどうかを判定する。例えばマトリクスが10×10で、この中のデータパケットを0〜99で表したとき、データパケットが9、19、29、・・・、99のときにRow FECを送信すると判定するなどのように構成できる。
【0164】
Row FECを送信すると判定された場合、ヘッダ生成部144は、FECパケットのヘッダを生成する。また、データ読み出し部145は、当該FECが保護する全てのデータパケット0〜9のデータを読み出す。そしてパケット生成部146は、生成されたヘッダと、読み出された全てのデータをXORしたデータをペイロードとして、FECパケットを生成して出力する。
【0165】
ところで、以上のFECパケットは、トリックプレイ中、すなわち、Iフレーム送信を行っている場合も同様に送信される。しかし、そのままでは次のような問題が生じる。まず、Iフレームのデータ長は任意であるため、例えば先に例示した送信パケットの長さである1344バイト(=192バイト(MPEG TTSパケットのサイズ)×7)の倍数にならない場合も存在する。より具体的には、Iフレームを構成するTTS数が必ずしも7の倍数にならない場合がある。
【0166】
一方、IPTV向けトリックプレイ方式では、1つの送信パケットの中に複数のIフレームが混在してはいけないという仕様が定められている。
【0167】
前述のように本実施形態では、ホストCPU200−3がIフレームの位置を特定し、データ転送装置内のデータバッファ170−2にIフレームのデータが一旦蓄えられ、Iフレームが送信パケットに分割されて送信される。また、データバッファ170−2上には異なるIフレームが隙間なく詰められている。従って、あるIフレームの終端となる送信パケットを生成したとき、そのIフレームのTTS数が7の倍数ではない場合、その終端となる送信パケットに次のIフレームの先頭部分が含まれることになる。すなわち、1つの送信パケットに複数のIフレームが含まれることになり、仕様違反になる。
【0168】
これを防ぐためには、簡単には次のような方式が考えられる。例えばパケット生成部146などによりIフレームの終端となる送信パケットを生成するときに、端数の部分にNULL TTSを挿入し、続きのデータ(すなわち次のIフレームの先頭データ)は次の送信パケットから送信するように構成する方式である。なお、NULL TTSとは、空のデータを含むTTSパケットを意味する。しかし、この方式ではFECパケットを送信する場合には依然として次のような問題が残る。
【0169】
FECパケットを生成するとき、データ読み出し部145は、保護対象のデータを読み出す。例えば先の1つ目のRow FECの例では、データ読み出し部145は、データパケット0〜9のデータを読み出す。具体的には、データバッファ170−2におけるデータパケット0の先頭データのアドレスをBASEとすると、BASE+1344×0、BASE+1344×1、BASE+1344×2、・・・、1344×9のアドレスから、それぞれ1344バイトずつ読み出すという動作になる。
【0170】
同様に、1つ目のColumn FECの例では、データ読み出し部145は、データパケット0、10、20、・・・、90のデータを読み出すことになる。すなわち、データ読み出し部145は、BASE+1344×0、BASE+1344×10、BASE+1344×20、・・・、BASE+1344×90のアドレスからそれぞれ1344バイトずつ読み出す。ただし、この処理は、各データパケットが必ずデータバッファ170−2の1344バイト固定長のデータに割り当てられていることが前提である。Iフレームの終端でNULL TTSが挿入されるとその前提が崩れるため、このような簡単な計算ではデータパケットの位置が求められなくなる。例えば、データパケット5が含まれるIフレームの終端でNULL TTSが2つ挿入されている場合、データパケット6以降の先頭は、BASE+1344×6−192×2となる。
【0171】
従って、その場合でも正しく計算するためには、NULL TTSを挿入した位置を全て記憶しておき、アドレス計算時にこれを鑑みて計算する必要がある。さらに、FECパケット生成時に読み出したIフレームの終端となる送信パケットの長さが、(TTSのサイズ)×7の倍数ではない場合、NULL TTSを付加してパケット生成部146に渡す必要がある。しかし、このような構成は、処理が複雑になるという問題がある。
【0172】
そこでホストCPUを図17のように構成することが望ましい。図17は、このように構成した第3の実施形態の変形例に係るホストCPU200−3Bの構成例を示すブロック図である。
【0173】
本変形例では、ホストCPU200−3Bは、パケット特定部211−3Bを備える。パケット特定部211−3Bは、特定されたIフレームの長さから、Iフレーム長が、(データパケットを構成するTTS数)の倍数ではない場合に、倍数となるように終端に埋めるNULL TTSを特定する。なお、以下では、TTSを単位としてIフレーム長を表す。例えば、100個のTTSからなるIフレームの長さ(Iフレーム長)を100TTSと表す。Iフレーム長の単位はこれに限られるものではなく、例えばバイトを単位として表してもよい。
【0174】
例えば、Iフレームの長さが100TTSであった場合、100は7で割り切れないが、5TTSを足して105TTSとすることで105/7=15と割り切れるようになる。このため、パケット特定部211−3Bは、5つのTTSを送信すると特定する。
【0175】
例えばストレージ300上にデータパケットを構成するTTS数−1(今回は6)個分の長さのNULL TTSファイルを用意しておく。パケット特定部211−3Bは、読み出すデータの先頭および長さを、それぞれ、NULL TTSファイルの先頭、および、必要なTTS個数分の長さ(上記例では192×5=960バイト)として、後段のエクステントマップ取得部206に指定する。
【0176】
エクステントマップ取得部206は、送信するIフレームの後にこのNULL TTSファイルを処理する。これにより、データバッファ170−2上には7TTSで割り切れないIフレームの終端にはNULL TTSが挿入される。すなわち、データ転送装置は、常にIフレームが7TTSで割り切れるものとして扱うことができる。従って、NULL TTSを挿入する必要がなくなるだけでなく、FECパケット生成の際のデータ読み出しアドレスの計算処理も容易にすることができる。
【0177】
なお、NULL TTSの挿入は、以上の方法に限られない。例えば、ホストCPU200−3Bが直接データバッファに書き込む、あるいは、NULL TTSを生成する処理部をデータ転送装置内に別途設け、それによって書き込むような形態でもよい。本変形例のポイントは、Iフレームが7×TTSの長さで割り切れないとき、データ抽出部が、パケット特定部が特定した個数×TTSの長さを空けて、次のIフレームのデータを書き込むことである。これによって、FECの計算が前述のように容易になる。よって、さらにいうと必ずしもNULL TTSをデータバッファに書き込む必要はなく、データ抽出部が間を空けるだけ空けておき、データ読み出し部がデータを読み出した後に、空けられたところのデータ(不定値が入っている)をNULL TTSで置換するような形態でもよい。
【0178】
以上説明したとおり、第1から第3の実施形態によれば、ホストCPUの処理負担を軽減させて、効率的なデータ転送が可能となる。また、コンテンツ配信サーバの主要機能であるトリックプレイ向け送信での効率的な処理が実現できる。
【0179】
上述した各実施形態で説明したデータ送信システムの少なくとも一部は、ハードウェアで構成してもよいし、ソフトウェアで構成してもよい。ソフトウェアで構成する場合には、データ送信システムの少なくとも一部の機能を実現するプログラムをフレキシブルディスクやCD−ROM等の記録媒体に収納し、コンピュータに読み込ませて実行させてもよい。記録媒体は、磁気ディスクや光ディスク等の着脱可能なものに限定されず、ハードディスク装置やメモリ等の固定型の記録媒体でもよい。
【0180】
また、データ送信システムの少なくとも一部の機能を実現するプログラムを、インターネット等の通信回線(無線通信も含む)を介して頒布してもよい。さらに、同プログラムを暗号化したり、変調をかけたり、圧縮した状態で、インターネット等の有線回線や無線回線を介して、または記録媒体に収納して頒布してもよい。
【0181】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0182】
100 データ転送装置
110 コマンド発行部
120 通知振り分け部
130 送信データ抽出部
140 通信処理部
150−2 フロー制御部
160−2 バッファ管理部
170−2 データバッファ
200 ホストCPU
201 ファイル指定部
202 メタデータ指定部
203 メタデータ解析部
204 送信データ特定部
205 管理情報読み出し指示部
206 エクステントマップ取得部
207 送信データ読み出し指示部
300 ストレージ
400 ネットワーク
【特許請求の範囲】
【請求項1】
制御装置と接続され、記憶装置にブロック単位で記憶されているデータをネットワークに送信するデータ転送装置であって、
前記制御装置から読み出しが指示されたブロックの読み出しコマンドを前記記憶装置に対して発行するコマンド発行部と、
前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから送信データを抽出する送信データ抽出部と、
予め定められたプロトコルに基づいて、抽出された前記送信データをネットワークに送信する通信処理部と、
を備えることを特徴とするデータ転送装置。
【請求項2】
制御装置と、記憶装置にブロック単位で記憶されているデータをネットワークに送信するデータ転送装置と、を備えるデータ送信システムであって、
前記制御装置は、
前記記憶装置に記憶されたデータのうち送信するデータを表す送信データを含むファイルを指定するファイル指定部と、
前記ファイル内での前記送信データの位置の特定に用いる特定情報を含むメタデータを指定するメタデータ指定部と、
前記特定情報に基づいて、前記ファイル内での前記送信データの位置を特定する送信データ特定部と、
特定された位置の前記送信データを含むブロックの読み出しを前記データ転送装置に対して指示する送信データ読み出し指示部と、を備え、
前記データ転送装置は、
読み出しが指示されたブロックの読み出しコマンドを前記記憶装置に対して発行するコマンド発行部と、
前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから前記送信データを抽出する送信データ抽出部と、
予め定められたプロトコルに基づいて、抽出された前記送信データをネットワークに送信する通信処理部と、を備える、
ことを特徴とするデータ送信システム。
【請求項3】
前記ファイルは、MPEGストリームデータであり、
前記MPEGストリームデータのIフレームの位置を特定するコンテンツメタデータを取得するコンテンツメタデータ取得部を更に備え、
前記特定情報は、トリックプレイの再生方向および再生速度の少なくとも一方を含み、
前記送信データ特定部は、前記特定情報と、前記コンテンツメタデータとに基づいて、送信する前記Iフレームと、前記ファイル内での該Iフレームのバイト位置とを特定すること、
を特徴とする請求項2に記載のデータ送信システム。
【請求項4】
前記制御装置は、
特定された前記送信データと前記ブロックとの対応を表すマップ情報を前記記憶装置から取得するマップ取得部をさらに備え、
前記送信データ読み出し指示部は、さらに、前記マップ情報に基づいて、前記ブロック内の前記送信データの位置を示す位置情報を前記データ転送装置に対して送信し、
前記送信データ抽出部は、前記位置情報に基づいて、前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから前記送信データを抽出すること、
を特徴とする請求項2に記載のデータ送信システム。
【請求項5】
抽出された前記送信データを記憶するバッファ部と、
前記送信データ読み出し指示部により読み出しが指示されたブロックのうち、前記バッファ部の空き容量以下のサイズのブロックの読み出しを前記コマンド発行部に指示するフロー制御部と、をさらに備え、
前記通信処理部は、前記プロトコルに基づいて、前記バッファ部に記憶された前記送信データをネットワークに送信すること、
を特徴とする請求項2に記載のデータ送信システム。
【請求項6】
前記通信処理部は、
前記送信データの送信単位となる送信パケットの送信時刻を生成する時刻生成部と、
前記送信時刻に達したときに、前記送信パケットのペイロードを前記バッファ部から読み出すデータ読み出し部と、
読み出された前記ペイロードに付加するヘッダを生成するヘッダ生成部と、
読み出された前記ペイロードに前記ヘッダを付加した前記送信パケットを生成してネットワークに送信するパケット生成部と、を備えること、
を特徴とする請求項5に記載のデータ送信システム。
【請求項7】
前記時刻生成部は、前記送信データのビットレートに基づいて前記送信時刻を生成すること、
を特徴とする請求項6に記載のデータ送信システム。
【請求項8】
前記送信パケットの構成単位である単位パケットはタイムスタンプを含み、
前記データ読み出し部は、さらに、読み出した前記ペイロードの次に送信する前記ペイロードの先頭の単位パケットに含まれる前記タイムスタンプを前記バッファ部から読み出し、
前記時刻生成部は、読み出された前記タイムスタンプに基づいて前記送信時刻を生成すること、
を特徴とする請求項6に記載のデータ送信システム。
【請求項9】
前記単位パケットは前記タイムスタンプを先頭に含み、
前記バッファ部は、前記単位パケットを送信する順序で前記単位パケットを連続して記憶し、
前記データ読み出し部は、前記送信時刻に達した前記送信パケットと、前記送信時刻に達した前記送信パケットの次に送信する前記送信パケットの先頭の前記単位パケットに含まれる前記タイムスタンプと、を一括して読み出すこと、
を特徴とする請求項8に記載のデータ送信システム。
【請求項10】
前記送信データは、MPEGストリームデータのIフレームであり、
前記送信パケットは、MPEGのTS(Transport Stream)パケットまたはTTS(Timestamped Transport Stream)パケットである複数の単位パケットを含み、
前記単位パケットは、前記Iフレームの先頭の単位パケットであるか否かを判定する判定情報を含み、
前記データ読み出し部は、さらに、読み出した前記送信パケットの次に送信する前記送信パケットの先頭の単位パケットに含まれる前記判定情報を前記バッファ部から読み出し、
前記判定情報に基づいて、次に送信する前記送信パケットの先頭の単位パケットがIフレームの先頭の単位パケットであるか否かを判定する先頭判定部をさらに備え、
前記時刻生成部は、次に送信する前記送信パケットの先頭の単位パケットがIフレームの先頭の単位パケットであると判定された場合、Iフレームの送信間隔に応じた前記送信時刻を生成すること、
を特徴とする請求項6に記載のデータ送信システム。
【請求項11】
前記送信パケットは、予め定められた規定数の前記単位パケットを含み、
前記制御装置は、
送信するIフレームに含まれる単位パケットの個数が、前記規定数の倍数でない場合に、送信するIフレームに含まれる単位パケットの個数が、前記規定数の倍数となるように、送信するIフレームに付加する単位パケットの個数を特定するパケット特定部をさらに備え、
前記送信データ読み出し指示部は、特定された前記送信データを含むブロックの読み出しと、特定された個数の単位パケットの読み出しと、を前記データ転送装置に対して指示すること、
を特徴とする請求項10に記載のデータ送信システム。
【請求項12】
前記送信パケットは、予め定められた規定数の前記単位パケットを含み、
前記制御装置は、
送信するIフレームに含まれる単位パケットの個数が、前記規定数の倍数でない場合に、送信するIフレームに含まれる単位パケットの個数が、前記規定数の倍数となるように、送信するIフレームに付加する単位パケットの個数を特定するパケット特定部をさらに備え、
前記バッファ部は、抽出された前記送信データを、特定された個数の単位パケットのオフセットをつけた位置に記憶すること、
を特徴とする請求項10に記載のデータ送信システム
【請求項13】
前記データ転送装置は、PCI(Peripheral Component Interconnect)−Expressカードとして構成されること、
を特徴とする請求項2に記載のデータ送信システム。
【請求項14】
制御装置と、記憶装置にブロック単位で記憶されているデータをネットワークに送信するデータ転送装置と、を備えるデータ送信システムで実行されるデータ送信方法であって、
前記制御装置が、前記記憶装置に記憶されたデータのうち送信するデータを表す送信データを含むファイルを指定するファイル指定ステップと、
前記制御装置が、前記ファイル内での前記送信データの位置の特定に用いる特定情報を含むメタデータを指定するメタデータ指定ステップと、
前記制御装置が、前記特定情報に基づいて、前記ファイル内での前記送信データの位置を特定する送信データ特定ステップと、
前記制御装置が、特定された位置の前記送信データを含むブロックの読み出しを前記データ転送装置に対して指示する送信データ読み出し指示ステップと、
前記データ転送装置が、読み出しが指示されたブロックの読み出しコマンドを前記記憶装置に対して発行するコマンド発行ステップと、
前記データ転送装置が、前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから前記送信データを抽出する送信データ抽出ステップと、
前記データ転送装置が、予め定められたプロトコルに基づいて、抽出された前記送信データをネットワークに送信する通信処理ステップと、
を含むことを特徴とするデータ送信方法。
【請求項15】
コンピュータを、
記憶装置に記憶されたデータのうち送信するデータを表す送信データを含むファイルを指定するファイル指定部と、
前記ファイル内での前記送信データの位置の特定に用いる特定情報を含むメタデータを指定するメタデータ指定部と、
前記特定情報に基づいて、前記ファイル内での前記送信データの位置を特定する送信データ特定部と、
特定された位置の前記送信データを含むブロックの読み出しを指示する送信データ読み出し指示部と
読み出しが指示されたブロックの読み出しコマンドを前記記憶装置に対して発行するコマンド発行部と、
前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから前記送信データを抽出する送信データ抽出部と、
予め定められたプロトコルに基づいて、抽出された前記送信データをネットワークに送信する通信処理部、
として機能させるためのデータ転送プログラム。
【請求項1】
制御装置と接続され、記憶装置にブロック単位で記憶されているデータをネットワークに送信するデータ転送装置であって、
前記制御装置から読み出しが指示されたブロックの読み出しコマンドを前記記憶装置に対して発行するコマンド発行部と、
前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから送信データを抽出する送信データ抽出部と、
予め定められたプロトコルに基づいて、抽出された前記送信データをネットワークに送信する通信処理部と、
を備えることを特徴とするデータ転送装置。
【請求項2】
制御装置と、記憶装置にブロック単位で記憶されているデータをネットワークに送信するデータ転送装置と、を備えるデータ送信システムであって、
前記制御装置は、
前記記憶装置に記憶されたデータのうち送信するデータを表す送信データを含むファイルを指定するファイル指定部と、
前記ファイル内での前記送信データの位置の特定に用いる特定情報を含むメタデータを指定するメタデータ指定部と、
前記特定情報に基づいて、前記ファイル内での前記送信データの位置を特定する送信データ特定部と、
特定された位置の前記送信データを含むブロックの読み出しを前記データ転送装置に対して指示する送信データ読み出し指示部と、を備え、
前記データ転送装置は、
読み出しが指示されたブロックの読み出しコマンドを前記記憶装置に対して発行するコマンド発行部と、
前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから前記送信データを抽出する送信データ抽出部と、
予め定められたプロトコルに基づいて、抽出された前記送信データをネットワークに送信する通信処理部と、を備える、
ことを特徴とするデータ送信システム。
【請求項3】
前記ファイルは、MPEGストリームデータであり、
前記MPEGストリームデータのIフレームの位置を特定するコンテンツメタデータを取得するコンテンツメタデータ取得部を更に備え、
前記特定情報は、トリックプレイの再生方向および再生速度の少なくとも一方を含み、
前記送信データ特定部は、前記特定情報と、前記コンテンツメタデータとに基づいて、送信する前記Iフレームと、前記ファイル内での該Iフレームのバイト位置とを特定すること、
を特徴とする請求項2に記載のデータ送信システム。
【請求項4】
前記制御装置は、
特定された前記送信データと前記ブロックとの対応を表すマップ情報を前記記憶装置から取得するマップ取得部をさらに備え、
前記送信データ読み出し指示部は、さらに、前記マップ情報に基づいて、前記ブロック内の前記送信データの位置を示す位置情報を前記データ転送装置に対して送信し、
前記送信データ抽出部は、前記位置情報に基づいて、前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから前記送信データを抽出すること、
を特徴とする請求項2に記載のデータ送信システム。
【請求項5】
抽出された前記送信データを記憶するバッファ部と、
前記送信データ読み出し指示部により読み出しが指示されたブロックのうち、前記バッファ部の空き容量以下のサイズのブロックの読み出しを前記コマンド発行部に指示するフロー制御部と、をさらに備え、
前記通信処理部は、前記プロトコルに基づいて、前記バッファ部に記憶された前記送信データをネットワークに送信すること、
を特徴とする請求項2に記載のデータ送信システム。
【請求項6】
前記通信処理部は、
前記送信データの送信単位となる送信パケットの送信時刻を生成する時刻生成部と、
前記送信時刻に達したときに、前記送信パケットのペイロードを前記バッファ部から読み出すデータ読み出し部と、
読み出された前記ペイロードに付加するヘッダを生成するヘッダ生成部と、
読み出された前記ペイロードに前記ヘッダを付加した前記送信パケットを生成してネットワークに送信するパケット生成部と、を備えること、
を特徴とする請求項5に記載のデータ送信システム。
【請求項7】
前記時刻生成部は、前記送信データのビットレートに基づいて前記送信時刻を生成すること、
を特徴とする請求項6に記載のデータ送信システム。
【請求項8】
前記送信パケットの構成単位である単位パケットはタイムスタンプを含み、
前記データ読み出し部は、さらに、読み出した前記ペイロードの次に送信する前記ペイロードの先頭の単位パケットに含まれる前記タイムスタンプを前記バッファ部から読み出し、
前記時刻生成部は、読み出された前記タイムスタンプに基づいて前記送信時刻を生成すること、
を特徴とする請求項6に記載のデータ送信システム。
【請求項9】
前記単位パケットは前記タイムスタンプを先頭に含み、
前記バッファ部は、前記単位パケットを送信する順序で前記単位パケットを連続して記憶し、
前記データ読み出し部は、前記送信時刻に達した前記送信パケットと、前記送信時刻に達した前記送信パケットの次に送信する前記送信パケットの先頭の前記単位パケットに含まれる前記タイムスタンプと、を一括して読み出すこと、
を特徴とする請求項8に記載のデータ送信システム。
【請求項10】
前記送信データは、MPEGストリームデータのIフレームであり、
前記送信パケットは、MPEGのTS(Transport Stream)パケットまたはTTS(Timestamped Transport Stream)パケットである複数の単位パケットを含み、
前記単位パケットは、前記Iフレームの先頭の単位パケットであるか否かを判定する判定情報を含み、
前記データ読み出し部は、さらに、読み出した前記送信パケットの次に送信する前記送信パケットの先頭の単位パケットに含まれる前記判定情報を前記バッファ部から読み出し、
前記判定情報に基づいて、次に送信する前記送信パケットの先頭の単位パケットがIフレームの先頭の単位パケットであるか否かを判定する先頭判定部をさらに備え、
前記時刻生成部は、次に送信する前記送信パケットの先頭の単位パケットがIフレームの先頭の単位パケットであると判定された場合、Iフレームの送信間隔に応じた前記送信時刻を生成すること、
を特徴とする請求項6に記載のデータ送信システム。
【請求項11】
前記送信パケットは、予め定められた規定数の前記単位パケットを含み、
前記制御装置は、
送信するIフレームに含まれる単位パケットの個数が、前記規定数の倍数でない場合に、送信するIフレームに含まれる単位パケットの個数が、前記規定数の倍数となるように、送信するIフレームに付加する単位パケットの個数を特定するパケット特定部をさらに備え、
前記送信データ読み出し指示部は、特定された前記送信データを含むブロックの読み出しと、特定された個数の単位パケットの読み出しと、を前記データ転送装置に対して指示すること、
を特徴とする請求項10に記載のデータ送信システム。
【請求項12】
前記送信パケットは、予め定められた規定数の前記単位パケットを含み、
前記制御装置は、
送信するIフレームに含まれる単位パケットの個数が、前記規定数の倍数でない場合に、送信するIフレームに含まれる単位パケットの個数が、前記規定数の倍数となるように、送信するIフレームに付加する単位パケットの個数を特定するパケット特定部をさらに備え、
前記バッファ部は、抽出された前記送信データを、特定された個数の単位パケットのオフセットをつけた位置に記憶すること、
を特徴とする請求項10に記載のデータ送信システム
【請求項13】
前記データ転送装置は、PCI(Peripheral Component Interconnect)−Expressカードとして構成されること、
を特徴とする請求項2に記載のデータ送信システム。
【請求項14】
制御装置と、記憶装置にブロック単位で記憶されているデータをネットワークに送信するデータ転送装置と、を備えるデータ送信システムで実行されるデータ送信方法であって、
前記制御装置が、前記記憶装置に記憶されたデータのうち送信するデータを表す送信データを含むファイルを指定するファイル指定ステップと、
前記制御装置が、前記ファイル内での前記送信データの位置の特定に用いる特定情報を含むメタデータを指定するメタデータ指定ステップと、
前記制御装置が、前記特定情報に基づいて、前記ファイル内での前記送信データの位置を特定する送信データ特定ステップと、
前記制御装置が、特定された位置の前記送信データを含むブロックの読み出しを前記データ転送装置に対して指示する送信データ読み出し指示ステップと、
前記データ転送装置が、読み出しが指示されたブロックの読み出しコマンドを前記記憶装置に対して発行するコマンド発行ステップと、
前記データ転送装置が、前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから前記送信データを抽出する送信データ抽出ステップと、
前記データ転送装置が、予め定められたプロトコルに基づいて、抽出された前記送信データをネットワークに送信する通信処理ステップと、
を含むことを特徴とするデータ送信方法。
【請求項15】
コンピュータを、
記憶装置に記憶されたデータのうち送信するデータを表す送信データを含むファイルを指定するファイル指定部と、
前記ファイル内での前記送信データの位置の特定に用いる特定情報を含むメタデータを指定するメタデータ指定部と、
前記特定情報に基づいて、前記ファイル内での前記送信データの位置を特定する送信データ特定部と、
特定された位置の前記送信データを含むブロックの読み出しを指示する送信データ読み出し指示部と
読み出しが指示されたブロックの読み出しコマンドを前記記憶装置に対して発行するコマンド発行部と、
前記読み出しコマンドに応じて前記記憶装置から読み出されたデータから前記送信データを抽出する送信データ抽出部と、
予め定められたプロトコルに基づいて、抽出された前記送信データをネットワークに送信する通信処理部、
として機能させるためのデータ転送プログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【公開番号】特開2013−62683(P2013−62683A)
【公開日】平成25年4月4日(2013.4.4)
【国際特許分類】
【出願番号】特願2011−199814(P2011−199814)
【出願日】平成23年9月13日(2011.9.13)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
【公開日】平成25年4月4日(2013.4.4)
【国際特許分類】
【出願日】平成23年9月13日(2011.9.13)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
[ Back to top ]