(57)【特許請求の範囲】
【請求項１】
コンピュータに、
一連のデータ単位に対して特定の数の階層で定義される階層的なブロックであって、各データ単位が前記特定の数の階層のいずれにおいてもいずれか１つのブロックに属するように定義され、かつ、最上層以外の階層の各ブロックは１つ上の階層におけるいずれか１つのブロックのサブセットであるように定義されており、かつ、最下層以外の各階層の各ブロックは１つ下の階層のブロックを２つずつ含む階層的なブロックのうち最上層の同じ第１のブロックに属している複数のデータ単位を取得し、
前記複数のデータ単位の排他的論理和に等しい、前記第１のブロックに対応する誤り訂正情報を生成し、
最下層以外のいずれかの階層の同じブロックに含まれる１つ下の階層の２つのブロックのうちの最初のブロックに該当する各個別のブロックについて、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、当該個別のブロックに対応する誤り訂正情報を生成し、
複数の送信先装置の各々について、最上層から、前記特定の数以下の数であって当該送信先装置に応じて決まる数の階層までの各階層のブロックに対応して生成した誤り訂正情報を、当該誤り訂正情報に対応するブロックに属する最後のデータ単位の次に挿入することによって、当該送信先装置に応じて決まる前記数の階層のうちの最下層の１つのブロックごとに１つの割合で誤り訂正情報が挿入されるようにしながら、前記複数のデータ単位と、挿入した前記誤り訂正情報とを、当該送信先装置へ送信する
ことを含む処理を実行させるプログラム。
【請求項２】
前記処理における、前記第１のブロックに対応する前記誤り訂正情報の生成は、
前記最下層以外の各個別の階層において、前記第１のブロックに含まれ、かつ、対応する前記誤り訂正情報を生成した１つ以上のブロックのうち当該個別の階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層の複数のブロックのうち、前記第１のブロックに含まれ、かつ、前記最下層の中では最後のブロックに属する、すべてのデータ単位と
の排他的論理和を計算することを含む
ことを特徴とする請求項１に記載のプログラム。
【請求項３】
コンピュータに、
一連のデータ単位に対して複数の階層で定義される階層的なブロックであって、各データ単位が前記複数の階層のいずれにおいてもいずれか１つのブロックに属するように定義され、かつ、最上層以外の階層の各ブロックは１つ上の階層におけるいずれか１つのブロックのサブセットであるように定義されており、かつ、最下層以外の各階層の各ブロックは１つ下の階層のブロックを２つずつ含む階層的なブロックのうちで、或る階層の第１のブロックに属する複数のデータ単位の一部または全部を受信し、
前記或る階層が、決められた最下層よりも上の階層の場合は、前記或る階層よりも下の、前記最下層までの各階層について、前記第１のブロックの範囲内において、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を受信し、
前記第１のブロックに対応しており、かつ、前記第１のブロックに属する前記複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報を受信し、
前記第１のブロックに属する前記複数のデータ単位のうち、受信することができなかった消失データ単位があるか否かを判断し、
前記消失データ単位があり、かつ、前記或る階層が前記最下層の場合は、
前記第１のブロックに属するデータ単位のうち受信することができたすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
前記消失データ単位があり、かつ、前記最下層において前記消失データ単位が属する最下層ブロックが、前記最下層における前記２つ以上のブロックの中の前記最後の１つのブロックである場合は、
前記或る階層から前記最下層までの各階層において、前記第１のブロックに含まれ、かつ、対応する前記誤り訂正情報を受信した１つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層ブロックに属する１つ以上のデータ単位のうち受信することができたすべてのデータ単位と
の排他的論理和を計算することにより、前記消失データ単位を復元するか、または、
受信によって取得したか、もしくは既に行った復元によって取得した、前記第１のブロックに属する、前記消失データ単位以外のすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
送信先装置と前記コンピュータとの間の通信路に対応する階層情報を取得し、
受信または復元により取得した、前記第１のブロックに属する前記複数のデータ単位を、前記送信先装置に送信し、
前記或る階層から前記最下層までの階層のうちで、前記階層情報が表す指定階層と同じか前記指定階層より上の各階層のいずれかのブロックに対応する前記誤り訂正情報のすべてを、前記送信先装置に送信し、
前記最下層よりも前記指定階層の方が下の階層である場合に、前記最下層よりも下であり、かつ前記指定階層と同じか前記指定階層より上の各階層について、前記第１のブロックの範囲内で、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を生成し、
生成した前記誤り訂正情報を前記送信先装置に送信する
処理を実行させるプログラム。
【請求項４】
通信装置であって、
送信元装置から
一連のデータ単位に対して複数の階層で定義される階層的なブロックであって、各データ単位が前記複数の階層のいずれにおいてもいずれか１つのブロックに属するように定義され、かつ、最上層以外の階層の各ブロックは１つ上の階層におけるいずれか１つのブロックのサブセットであるように定義されており、かつ、最下層以外の各階層の各ブロックは１つ下の階層のブロックを２つずつ含む階層的なブロックのうちで、或る階層の第１のブロックに属する複数のデータ単位の一部または全部と、
前記或る階層が、決められた最下層よりも上の階層の場合は、前記或る階層よりも下の、前記最下層までの各階層についての、前記第１のブロックの範囲内での、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報と、
前記第１のブロックに対応しており、かつ、前記第１のブロックに属する前記複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報と
を受信する受信部と、
前記第１のブロックに属する前記複数のデータ単位のうち、前記受信部により受信されなかった消失データ単位があるか否かを判断する判断部と、
前記消失データ単位を復元する復元部であって、
前記消失データ単位があり、かつ、前記或る階層が前記最下層の場合は、
前記第１のブロックに属するデータ単位のうち、前記受信部が受信することのできたすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
前記消失データ単位があり、かつ、前記最下層において前記消失データ単位が属する最下層ブロックが、前記最下層における前記２つ以上のブロックの中の前記最後の１つのブロックである場合は、
前記或る階層から前記最下層までの各階層において、前記第１のブロックに含まれ、かつ、対応する前記誤り訂正情報を前記受信部が受信した１つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層ブロックに属する１つ以上のデータ単位のうち、前記受信部が受信することのできたすべてのデータ単位と
の排他的論理和を計算することにより、前記消失データ単位を復元するか、または、
前記受信部における受信によって取得したか、もしくは前記復元部が既に行った復元によって取得した、前記第１のブロックに属する、前記消失データ単位以外のすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元する
ことを特徴とする前記復元部と、
前記通信装置と送信先装置との間の第１の通信路に対応する第１の階層情報を取得する取得部と、
前記第１の階層情報が表す指定階層の方が、前記最下層よりも下の階層である場合に、前記最下層よりも下であり、かつ前記指定階層と同じか前記指定階層より上の各階層について、前記第１のブロックの範囲内で、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を生成する
生成部と、
前記送信先装置に、
前記受信部により全部が受信されたか、または前記復元部による復元によって全部が揃った、前記第１のブロックに属する前記複数のデータ単位と、
前記或る階層から前記最下層までの階層のうちで、前記指定階層と同じか前記指定階層より上の各階層のいずれかのブロックに対応する前記誤り訂正情報のすべてと、
前記最下層よりも前記指定階層の方が下の階層である場合は、さらに、前記生成部が生成した前記誤り訂正情報と
を送信する送信部
を備えることを特徴とする通信装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は誤り訂正に関する。
【背景技術】
【０００２】
誤り訂正に関して、様々な研究が行われている。例えば、或る種の誤り訂正符号では、誤り訂正のための検査ビットが排他的論理和演算を用いて計算されるが、より複雑な演算を用いる誤り訂正符号もある。また、誤り訂正は、例えばマルチキャスト配信システムなどの様々な応用分野に適用することが可能である。
【０００３】
データ伝送時に生じる誤りを訂正する技術として、具体的には、例えば、前方誤り訂正（Forward Error Correction；ＦＥＣ）と自動再送要求（Automatic Repeat-reQuest；ＡＲＱ）が知られている。
【０００４】
ＦＥＣでは、送信されるデータに冗長性が付加される。冗長性と効率性のバランスを考慮した技術もいくつか提案されている。
例えば、データの伝送効率を悪化させることなく、適確な誤り制御を可能にすることを目的としたデータ伝送方法が提案されている。
【０００５】
当該データ伝送方法は、受信装置から、前方誤り訂正方法によっても復号できない損失パケットがあることを示す否定応答を受信する否定応答受信ステップを含む。また、当該データ伝送方法は、否定応答の受信状況（または否定応答に含まれる損失パケットの識別情報）に応じて、冗長データの量を調整する冗長データ量調整ステップを含む。
【０００６】
さらに、当該データ伝送方法は、冗長データ量調整ステップで調整された冗長データの量に応じて、時間当たりに送信されるパケットの制限数を調整する伝送速度制御ステップを含む。また、当該データ伝送方法は、否定応答の受信状況に応じて、シャッフリングスパンを調整するステップと、否定応答の受信状況に応じて、パケットサイズを調整するパケットサイズ調整ステップを含む。
【０００７】
また、エラー訂正用データの計算をより効率的に行えるようにするための、次のような方法も提案されている。すなわち、当該方法によれば、送信データに対して或る挿入間隔で挿入すべきエラー訂正用データを当該送信データについての排他的論理和の計算により生成するにあたって、上記挿入間隔とは独立して累積的に送信データの排他的論理和が計算し続けられる。そして、前回のエラー訂正用データ挿入時点での排他的論理和の計算値と、今回のエラー訂正用パケット挿入予定時点での排他的論理和の計算値との排他的論理和が計算され、計算された排他的論理和により、今回挿入すべきエラー訂正用データが生成される。
【０００８】
また、誤り訂正パケットを用いた伝送率制御方法も提案されている。当該伝送率制御方法は、データパケットと誤り訂正パケットとが所定の割合で構成された第１パケットグループを受信装置に伝送するステップを含む。また、当該伝送率制御方法は、第１パケットグループに関するフィードバック情報により誤り訂正パケットの割合が調節された第２パケットグループを伝送するステップを含む。さらに、当該伝送率制御方法は、第２パケットグループに関するフィードバック情報により伝送率を調節するステップを含む。
【０００９】
さらに、ＲＰＳ（Random Parity System）を回線状況に動的に対応させ，復号成功率を高めることを目的とした通信システムも提案されている。当該通信システムは、送信側装置と受信側装置間で伝送経路を通してデータ転送する通信システムである。
【００１０】
上記送信側装置は、元データから冗長符号化したデータを生成する符号化装置と、符号化装置で符号化された符号化データを伝送経路に送出する送信装置と、符号化装置における符号化率を設定制御する符号化率決定装置を有する。また、上記受信側装置は、伝送経路を経由して送られた符号化データを受信する受信装置と、受信した符号化データから元データを復号する復号装置と、送出された符号化データの経路上での消失率を測定する消失率想定装置を有する。送信側装置の符号化率決定装置は、求められた消失率に基づき、符号化装置における符号化率を変更制御する。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開昭６３−２３４６３２号公報
【特許文献２】特開２０１０−７４５９５号公報
【特許文献３】特開２００４−２５４１２７号公報
【特許文献４】特開２００６−０６７０７２号公報
【特許文献５】特開２００６−３４５５２３号公報
【特許文献６】特開２００７−２５１７３７号公報
【非特許文献】
【００１２】
【非特許文献１】Request for Comments 5109: RTP Payload Format for Generic Forward Error Correction（２００７年１２月）
【発明の概要】
【発明が解決しようとする課題】
【００１３】
第１のノードから第２のノードを介して第３のノードへとデータが送信される通信システムでは、第１と第２のノードの間の第１の通信路におけるエラーレートと、第２と第３のノードの間の第２の通信路におけるエラーレートが異なることがある。したがって、第１の通信路に好適な誤り訂正能力と、第２の通信路に好適な誤り訂正能力とが異なることがある。
【００１４】
また、エラーレートが時間の経過につれて変化することもある。よって、第１の通信路に好適な誤り訂正能力も変化し得るし、第２の通信路に好適な誤り訂正能力も変化し得る。
【００１５】
ここで、誤り訂正能力は、誤り訂正情報をどの程度の割合でデータに挿入するかに応じて異なる。したがって、誤り訂正情報をデータに挿入する割合として好適な割合も、エラーレートに応じて異なる。
【００１６】
例えば、エラーレートに鑑みて誤り訂正情報が挿入される割合が過剰であれば、必要以上に多くの誤り訂正情報が送信されることによる無駄なトラフィックが生じる。逆に、エラーレートに鑑みて誤り訂正情報が挿入される割合が不足していれば、訂正不能な誤りが生じることがある。
【００１７】
そこで本発明は、誤り訂正能力の変更に好適な技術を提供することを目的とする。
【課題を解決するための手段】
【００１８】
一態様によるプログラムがコンピュータに実行させる処理は、複数の階層で定義される階層的なブロックのうち或る階層の同じ第１のブロックに属している複数のデータ単位を取得することを含む。また、前記処理は、前記複数のデータ単位の排他的論理和に等しい、前記第１のブロックに対応する誤り訂正情報を生成することを含む。
【００１９】
さらに、前記処理は、前記或る階層に連続する、前記或る階層よりも下の１層以上の各個別の階層において、当該個別の階層の１つ上の階層の同じブロックに含まれる当該個別の階層の２つ以上のブロックの中で、特定の１つのブロックを除く、１つ以上の個別のブロックの各々について、前記複数のデータ単位のうち、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、当該個別のブロックに対応する誤り訂正情報を生成することを含む。
【００２０】
また、前記処理は、前記複数のデータ単位を送信すること、前記第１のブロックに対応する前記誤り訂正情報を送信すること、および前記個別のブロックの各々に対応する前記誤り訂正情報を送信することを含む。
【発明の効果】
【００２１】
上記プログラムによれば、「前記或る階層に連続する、前記或る階層よりも下の１層以上の階層」の数に応じた割合で、誤り訂正情報が生成され、送信される。したがって、上記プログラムによれば、「前記或る階層に連続する、前記或る階層よりも下の１層以上の階層」の数を変更することにより、誤り訂正能力を変更することが可能である。
【００２２】
また、上記のようにして誤り訂正情報が階層的なブロックに対応して生成されると、送信された複数のデータ単位と誤り訂正情報とを受信する第１の装置が、第２の装置へ複数のデータ単位を転送する場合に、簡単に誤り訂正情報の量を調節することが可能となる。その理由は次のとおりである。
【００２３】
第１の装置は、「前記或る階層に連続する、前記或る階層よりも下の１層以上の階層」よりもさらに下の階層のブロックに対応する誤り訂正情報だけを追加することで、誤り訂正情報が挿入される割合を高くすることができる。
【００２４】
また、第１の装置は、受信した誤り訂正情報のうち、「前記或る階層に連続する、前記或る階層よりも下の１層以上の階層」のうちの最も下の１つか複数の層のブロックに対応する誤り訂正情報を削除するだけで、誤り訂正情報が挿入される割合を低くすることができる。
【００２５】
以上のように、上記プログラムは、階層的に誤り訂正情報をコンピュータに生成させることにより、処理負荷の軽減という効果を奏する。したがって、上記プログラムによれば、誤り訂正能力を変更するのに好適な技術が提供される。
【図面の簡単な説明】
【００２６】
【図１】階層を例示する図である。
【図２】データパケットと、間に階層的に挿入されたＦＥＣパケットとの並びを例示する図である。
【図３】ネットワークトポロジの２つの例を示す図である。
【図４】ＦＥＣパケットの階層的な生成と挿入の例を示す図である。
【図５】消失したデータパケットを、ＦＥＣパケットを利用して復元する例を示す図である。
【図６】ＦＥＣパケットの一部を削除することで階層を浅くする例を示す図である。
【図７】ＦＥＣパケットを追加することで階層を深くする例を示す図である。
【図８】転送装置のハードウェア構成図である。
【図９】転送装置の機能構成図である。
【図１０】階層化されていないＦＥＣパケットを利用する比較例の図である。
【図１１】階層を深くしても処理量の増加が少ないことを説明する図である。
【図１２】本実施形態と比較例で訂正能力に差がないことを説明する図である。
【図１３】配信先管理テーブルの例を示す図である。
【図１４】ブロック管理テーブルの例を示す図である。
【図１５】パケットの形式を説明する図である。
【図１６】ＲＴＰヘッダの図である。
【図１７】ＦＥＣヘッダとＦＥＣレベル０ヘッダの図である。
【図１８】根ノードの動作フローチャート（その１）である。
【図１９】根ノードの動作フローチャート（その２）である。
【図２０】中継ノードと葉ノードに共通の動作フローチャート（その１）である。
【図２１】中継ノードと葉ノードに共通の動作フローチャート（その２）である。
【図２２】中継ノードの動作フローチャートである。
【図２３】葉ノードの動作フローチャートである。
【図２４】第１のケースのタイミングチャートである。
【図２５】第２のケースのタイミングチャートである。
【発明を実施するための形態】
【００２７】
以下、実施形態について、図面を参照しながら詳細に説明する。なお、説明は次の順で行う。
まず、図１〜２を参照して、階層的なブロックと、階層的に挿入される誤り訂正情報について説明する。続いて、図３を参照して、本実施形態が適用されるネットワークトポロジの例を説明する。その後、図４〜７を参照して、ネットワーク内のノードの動作の概要を説明する。そして、図３における個々のノードが、どのような構成によって図４〜７の動作を実現するのかについて、図８〜９を参照して説明する。また、本実施形態の利点についての理解を助けるため、図１０〜１２を参照して、本実施形態と比較例とを比べる。
【００２８】
その後、図１３〜２５を参照して、本実施形態についてさらに具体的に説明する。すなわち、まず図１３〜１４を参照して、ノードが利用する管理情報の例を説明する。続いて、図１５〜１７を参照して、本実施形態で使われるパケットの具体的な形式を説明する。その後、図１８〜２３のフローチャートを参照して、ノードの動作の詳細を説明する。また、ノードの動作の説明においては、図２４〜２５に示す２つのケースにおける動作シーケンスの具体例を適宜参照する。また、最後にその他のいくつかの実施形態についても説明する。
【００２９】
さて、図１は、階層を例示する図である。図１には第１層から第３層までの３つの階層が例示されており、第１層が最上位の階層である。なお、階層の最大数は実施形態に応じて任意であり、階層の数は通信路のエラーレート（換言すればパケットロス率）などの状況に応じて変動する。
【００３０】
図１の例において、第１層ではブロックＢ１−１が定義される。ブロックＢ１−１は２４個のデータパケットＤ０〜Ｄ２３を含む。データパケットＤ０〜Ｄ２３の各々は、適宜のプロトコルのＰＤＵ（Protocol Data Unit）の形にフォーマットされており、誤り訂正の対象であるデータ単位を、ペイロードとして含む。なお、本実施形態で利用可能な具体的なプロトコルの具体例については後述する。また、第１層のブロックが含むデータ単位の数は、図１の例では２４であるが、実施形態に応じて任意である。
【００３１】
図１のとおり、ブロックは階層的に定義される。具体的には、ブロックＢ１−１は第２層の２つのブロックＢ２−１とＢ２−２を含む。ブロックＢ２−１は１２個のデータパケットＤ０〜Ｄ１１を含み、ブロックＢ２−２は１２個のデータパケットＤ１２〜Ｄ２３を含む。したがって、ブロックＢ２−１とＢ２−２は、ブロックＢ１−１のサブセットである。
【００３２】
また、ブロックＢ２−１は、第３層の２つのブロックＢ３−１とＢ３−２を含む。ブロックＢ３−１は６個のデータパケットＤ０〜Ｄ５を含み、ブロックＢ３−２は６個のデータパケットＤ６〜Ｄ１１を含む。したがって、ブロックＢ３−１とＢ３−２は、ブロックＢ２−１のサブセットである。
【００３３】
同様に、ブロックＢ２−２は、第３層の２つのブロックＢ３−３とＢ３−４を含む。そして、ブロックＢ３−３は６個のデータパケットＤ１２〜Ｄ１７を含み、ブロックＢ３−４は６個のデータパケットＤ１８〜Ｄ２３を含む。したがって、ブロックＢ３−３とＢ３−４は、ブロックＢ２−２のサブセットである。
【００３４】
以上のように、データパケットＤ０〜Ｄ２３は、最上位の第１層の同一のブロックＢ１−１に属している。また、データパケットＤ０〜Ｄ２３の各々は、複数の階層の各々において、いずれかのブロックに属している。例えば、データパケットＤ７は、第１層ではブロックＢ１−１に属し、第２層ではブロックＢ２−１に属し、第３層ではブロックＢ３−２に属している。
【００３５】
ところで、本実施形態では、ＦＥＣによる誤り訂正が行われる。本実施形態における訂正対象の「誤り」とは、具体的には、データパケットの消失（すなわちパケットロス）である。そして、本実施形態では、消失したデータパケットを復元するための誤り訂正情報が、後述の転送装置により生成され、送信される。誤り訂正情報は、適宜のプロトコルのＰＤＵの形にフォーマットされる。以下では誤り訂正情報をペイロードとして含むＰＤＵを「ＦＥＣパケット」という。
【００３６】
本実施形態によれば、ブロックが階層的に定義されることに対応して、ＦＥＣパケットも階層的に生成される。すなわち、第１層のブロックＢ１−１に対応して、ブロックＢ１−１に属する２４個のデータ単位の排他的論理和（eXclusive OR；ＸＯＲ）に等しい誤り訂正情報が生成される。具体的には、データパケットＤ０〜Ｄ２３のペイロード中の、誤り訂正の対象のデータ単位同士の排他的論理和が、誤り訂正情報として生成される。そして、生成された誤り訂正情報をペイロードとして含むＦＥＣパケットＦ１−１が生成される。
【００３７】
なお、長さが１ビットのビット値ｘ１とｘ２の排他的論理和ｘ３を、以下では式（１．１）のように演算子“＾”を用いて表す。
【００３８】
x3=x1^x2                             (1.1)
【００３９】
また、長さがｍ１ビット（１≦ｍ１）のビット列ｙ１と長さがｍ２ビット（１≦ｍ２）のビット列ｙ２の排他的論理和ｙ３を、以下では式（１．２）のように演算子“＾”を用いて表す。
【００４０】
y3=y1^y2                             (1.2)
【００４１】
ここで、最上位ビット（Most Significant Bit；ＭＳＢ）を「０ビット目」と呼ぶことにし、ｍ１とｍ２の最大値をｍ３とする。すると、排他的論理和ｙ３は、長さがｍ３ビットのビット列である。
【００４２】
具体的には、ビット列ｙ３は、ビット列ｙ１とｙ２のうちの長い方の長さｍ３に合わせて短い方を必要に応じてビット値０でパディングし、長い方のビット列と、必要に応じてパディングしたビット列との、ビットごとの排他的論理和を計算することで得られる。すなわち、ビット列ｙ１、ｙ２、ｙ３それぞれのｊビット目をｙ１［ｊ］、ｙ２［ｊ］、ｙ３［ｊ］と表すことにすると、ビット値ｙ３［ｊ］は以下の式（１．３）〜（１．５）のとおりである。
【００４３】
y3[j]=y1[j]^y2[j]   (j≦m1-1かつj≦m2-1のとき)       (1.3)
【００４４】
y3[j]=0^y2[j]       (m1-1<j≦m2-1のとき)             (1.4)
【００４５】
y3[j]=y1[j]^0       (m2-1<j≦m1-1のとき)             (1.5)
【００４６】
上記のようにして、ＦＥＣパケットＦ１−１は、第１層のブロックＢ１−１に対応して生成される。
【００４７】
なお、以下では説明の簡略化のため、特に誤解のおそれがない場合は、ヘッダについては無視して「ＦＥＣパケットＦ１−１は、データパケットＤ０〜Ｄ２３の排他的論理和である」などと述べることがある。また、以下では、下記の式（１．６）のように、図中の参照符号を用いた式により、データパケットＤ０〜Ｄ２３とＦＥＣパケットＦ１−１との関係を表すことがある。また、第１層以外の階層のＦＥＣパケットに関しても同様の簡略化した表現による説明を行うことがある。
【００４８】
[F1-1]=[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]^
[D12]^[D13]^[D14]^[D15]^[D16]^[D17]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]          (1.6)
【００４９】
なお、式（１．６）および以下の説明において、“［Ｄ０］”という表記は、データパケットＤ０のうち、ヘッダ等を除く、誤り訂正の対象であるデータ単位の部分を示す。例えば、［Ｄ０］は、具体的には、データパケットＤ０のペイロードである。
【００５０】
同様に、“［Ｆ１−１］”という表記は、ＦＥＣパケットＦ１−１のうち、ヘッダ等を除く、誤り訂正情報の部分を示す。例えば、［Ｆ１−１］は、具体的には、ＦＥＣパケットＦ１−１のペイロードの部分である。
【００５１】
また、或るＦＥＣパケットが或る１つ以上のデータパケットに「関連している（associated）」（あるいは「対応している」）とは、当該ＦＥＣパケットが当該１つ以上のデータパケットから生成されたことを意味する。同様に、当該１つ以上のデータパケットは当該ＦＥＣパケットに関連している。式（１．６）は互いに関連しているデータパケットとＦＥＣパケットの関係を示す式の一例である。
【００５２】
本実施形態では、上記のようにして第１層に対応する誤り訂正情報が生成されるだけではなく、さらに、エラーレートなどの環境に応じて、第２層以下の階層についても、後述の転送装置によりＦＥＣパケットが生成される。つまり、或る階層に連続する１層以上の階層の各々において、当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々について、誤り訂正情報が生成される。また、上記のようにして第２層以下の各階層の１つ以上の個別のブロックの各々について生成される誤り訂正情報は、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい。
【００５３】
なおここで、「或る階層」とは、具体的には、最上位の第１層のことである。しかし、詳しくは後述するとおり、「或る階層」は第２層以下の下の階層であってもよく、その場合の上記の誤り訂正情報の生成とは、階層の数を増やす処理に相当する。
【００５４】
また、例えば、ＦＥＣパケットが生成される対象である上記の「或る階層に連続する１層以上の階層」は、第２層だけのこともあるし、第２層と第３層のこともあるし、第２層〜第４層のこともある。
【００５５】
例えば、図１の例では、第２層の１つ上の第１層の同じブロックＢ１−１に含まれるブロックＢ２−１とＢ２−２の中で、最後のブロックＢ２−２を除くブロックは、ブロックＢ２−１だけである。よって、第２層においてＦＥＣパケットの生成が行われる場合、具体的には、第２層のブロックＢ２−１に対応してＦＥＣパケットＦ２−１が生成され、ブロックＢ２−１の最後に挿入される。しかし、たとえ第２層のＦＥＣパケットの生成が行われる場合であっても、ブロックＢ２−２に対応してＦＥＣパケットが生成されることはない。
【００５６】
具体的には、ブロックＢ２−１に属する１２個のデータパケットＤ０〜Ｄ１１のペイロード中の誤り訂正の対象のデータ単位の部分同士の排他的論理和に等しい誤り訂正情報が生成される。そして、生成された誤り訂正情報は、ＦＥＣパケットＦ２−１中にペイロードとして含まれる。すなわち、式（１．７）で表されるＦＥＣパケットＦ２−１が、ブロックＢ２−１に対応して生成される。
【００５７】
[F2-1]=[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]           (1.7)
【００５８】
また、図１の例では、第３層の１つ上の第２層の同じブロックＢ２−１に含まれるブロックＢ３−１とＢ３−２の中で、最後のブロックＢ３−２を除くブロックは、ブロックＢ３−１だけである。よって、第３層においてＦＥＣパケットの生成が行われる場合、具体的には、第３層のブロックＢ３−１に対応してＦＥＣパケットＦ３−１が生成され、ブロックＢ３−１の最後に挿入される。しかし、たとえ第３層のＦＥＣパケットの生成が行われる場合であっても、ブロックＢ３−２に対応してＦＥＣパケットが生成されることはない。
【００５９】
具体的には、ブロックＢ３−１に属する６個のデータパケットＤ０〜Ｄ５のペイロード中の誤り訂正の対象のデータ単位の部分同士の排他的論理和に等しい誤り訂正情報が生成される。そして、生成された誤り訂正情報は、ＦＥＣパケットＦ３−１中にペイロードとして含まれる。すなわち、式（１．８）で表されるＦＥＣパケットＦ３−１が、ブロックＢ３−１に対応して生成される。
【００６０】
[F3-1]=[D0]^[D1]^[D2]^[D3]^[D4]^[D5]          (1.8)
【００６１】
さらに、図１の例では、第３層の１つ上の第２層の同じブロックＢ２−２に含まれるブロックＢ３−３とＢ３−４の中で、最後のブロックＢ３−４を除くブロックは、ブロックＢ３−３だけである。よって、第３層においてＦＥＣパケットの生成が行われる場合、具体的には、第３層のブロックＢ３−３に対応してＦＥＣパケットＦ３−２が生成され、ブロックＢ３−３の最後に挿入される。しかし、たとえ第３層のＦＥＣパケットの生成が行われる場合であっても、ブロックＢ３−４に対応してＦＥＣパケットが生成されることはない。
【００６２】
具体的には、ブロックＢ３−３に属する６個のデータパケットＤ１２〜Ｄ１７のペイロード中の誤り訂正の対象のデータ単位の部分同士の排他的論理和に等しい誤り訂正情報が生成される。そして、生成された誤り訂正情報は、ＦＥＣパケットＦ３−２中にペイロードとして含まれる。すなわち、式（１．９）で表されるＦＥＣパケットＦ３−２が、ブロックＢ３−３に対応して生成される。
【００６３】
[F3-2]=[D12]^[D13]^[D14]^[D15]^[D16]^[D17]          (1.9)
【００６４】
第４層以上に深い階層においてＦＥＣパケットが生成される場合も、同様に、１つ上の階層で同じブロックに含まれるブロックの中で最後の１つのブロックを除くブロックについて、ＦＥＣパケットの生成が行われる。すると、図１に示すように、ＦＥＣパケットを生成する対象となる最大の深さの階層の各ブロックの最後に、いずれかの層のブロックに対応して生成されたＦＥＣパケットが挿入されて、データパケットとＦＥＣパケットが順に送信される。
【００６５】
例えば、最大の深さが第２層の場合は、ブロックＢ２−１に対応して生成されたＦＥＣパケットＦ２−１がブロックＢ２−１の最後に挿入される。他方、ブロックＢ２−２に対応して生成されるＦＥＣパケットは存在しない。しかし、ブロックＢ２−２の最後はブロックＢ１−１の最後でもあるので、ブロックＢ２−２の最後には、第１層のブロックＢ１−１に対応して生成されたＦＥＣパケットＦ１−１が挿入される。
【００６６】
あるいは、最大の深さが第３層の場合は、ブロックＢ３−１に対応して生成されたＦＥＣパケットＦ３−１がブロックＢ３−１の最後に挿入される。他方、ブロックＢ３−２に対応して生成されるＦＥＣパケットは存在しない。しかし、ブロックＢ３−２の最後はブロックＢ２−１の最後でもあるので、ブロックＢ３−２の最後には、第２層のブロックＢ２−１に対応して生成されたＦＥＣパケットＦ２−１が挿入される。また、ブロックＢ３−３に対応して生成されたＦＥＣパケットＦ３−２がブロックＢ３−３の最後に挿入される。他方、ブロックＢ３−４に対応して生成されるＦＥＣパケットは存在しない。しかし、ブロックＢ３−４の最後はブロックＢ１−１の最後でもある。よって、ブロックＢ３−４の最後には、第１層のブロックＢ１−１に対応して生成されたＦＥＣパケットＦ１−１が挿入される。
【００６７】
以上のようにして、ＦＥＣパケットを生成する対象となる階層のうち最下層のブロックごとに、ＦＥＣパケットが挿入される。
なお、任意の１≦ｉについて、第ｉ階層のブロックが第（ｉ＋１）階層のブロックを３つ以上含んでもよいが、本実施形態では、第ｉ階層のブロックが第（ｉ＋１）階層の２つのブロックを含む。
【００６８】
なぜなら、ＦＥＣパケットの生成を行う階層の最大の深さがエラーレートに合わせて調整される場合の、調整による変化は、第ｉ階層のブロックが含む第（ｉ＋１）階層のブロックの数が２のときに最も緩やかだからである。換言すれば、任意の１≦ｉについて、第ｉ階層のブロックが第（ｉ＋１）階層の２つのブロックを含むように階層的なブロックが定義される場合に、最も細かい粒度で、最も効率のよい調整が実現されるからである。
【００６９】
ここで、上記の「調整による変化」とは、具体的には、ＦＥＣパケットの個数の、データパケットの個数に対する割合の変化のことである。例えば、図１の例では、最大の深さが第３層から第２層に変化すると、上記割合は１／６から１／１２に変化する。逆に、最大の深さが第２層から第３層に変化すると、上記割合は１／１２から１／６に変化する。すなわち、第ｉ階層のブロックが含む第（ｉ＋１）階層のブロックの数がＱの場合、最大の深さが１増えると上記割合はＱ倍になり、最大の深さが１減ると上記割合は１／Ｑになる。
【００７０】
したがって、Ｑが小さいほど、調整による変化が緩やかであり、調整の粒度が細かく、調整の効率が良い。そして、階層的にブロックが定義される場合、当然、Ｑは２以上の整数である。そのため、本実施形態では、最も好ましい値である２が、Ｑとして採用される。
【００７１】
ところで、図１には第１層のブロックとして１つのブロックＢ１−１のみを例示したが、第１層のブロックに属するデータ単位の数（すなわち第１層のブロックサイズ）よりも多くのデータ単位が送信されることもある。その場合、第１層の各ブロックごとに、図１に示したのと同様の処理により、適宜ＦＥＣパケットが挿入される。
【００７２】
例えば、図２は、データパケットと、間に階層的に挿入されたＦＥＣパケットとの並びを例示する図である。図１と同様に第１層のブロックサイズが２４の場合でも、２４個以上のデータパケットが送信されることがある。例えば図２は４８個のデータパケットが送信される例を示すが、第１層の各ブロックごとに、図１に示したのと同様の処理により、適宜ＦＥＣパケットが挿入される。なお、図２は、ＦＥＣパケットを生成する対象の階層の最大の深さが３の場合の例を示している。
【００７３】
具体的には、４８個のデータパケットＤ０〜Ｄ４７のうち、最初の２４個のデータパケットＤ０〜Ｄ２３は第１層の１つ目のブロックＢ１−１に属する。また、後ろの２４個のデータパケットＤ２４〜Ｄ４７は第１層の２つ目のブロックＢ１−２に属する。そして、図１と同様に、ブロックＢ１−１はブロックＢ２−１とＢ２−２を含み、ブロックＢ２−１はブロックＢ３−１とＢ３−２を含み、ブロックＢ２−２はブロックＢ３−３とＢ３−４を含む。
【００７４】
ブロックＢ１−２も、ブロックＢ１−１と同様に階層的に定義されたサブセットのブロックを含む。すなわち、ブロックＢ１−２は第２層のブロックＢ２−３とＢ２−４を含み、ブロックＢ２−３は第３層のブロックＢ３−５とＢ３−６を含み、ブロックＢ２−４は第３層のブロックＢ３−７とＢ３−８を含む。ブロックＢ３−５〜Ｂ３−８には、それぞれ、データパケットＤ２４〜Ｄ２９、Ｄ３０〜Ｄ３５、Ｄ３６〜Ｄ４１、Ｄ４２〜Ｄ４７が属する。
【００７５】
第３層までのブロックに対応してＦＥＣパケットが生成される場合、図１と同様に、ブロックＢ３−１の後にはＦＥＣパケットＦ３−１が挿入され、ブロックＢ３−２の後にはＦＥＣパケットＦ２−１が挿入される。また、ブロックＢ３−３の後にはＦＥＣパケットＦ３−２が挿入され、ブロックＢ３−４の後にはＦＥＣパケットＦ１−１が挿入される。
【００７６】
そして、階層的なＦＥＣパケットの挿入は、第１層の２つ目のブロックＢ１−２に関しても同様である。すなわち、ＦＥＣパケットＦ３−３が、第３層のブロックＢ３−５に対応して生成され、ブロックＢ３−５の後に挿入される。そして、ＦＥＣパケットＦ２−２が、第２層のブロックＢ２−３に対応して生成され、ブロックＢ３−６の後に挿入される。また、ＦＥＣパケットＦ３−４が、第３層のブロックＢ３−７に対応して生成され、ブロックＢ３−７の後に挿入される。そして、ＦＥＣパケットＦ１−２が、第１層のブロックＢ１−２に対応して生成され、ブロックＢ３−８の後に挿入される。
【００７７】
ブロックＢ１−２またはそのサブセットのブロックに対応して挿入される上記のＦＥＣパケットは、以下の式（２．１）〜（２．４）のように表すことができる。
【００７８】
[F3-3]=[D24]^[D25]^[D26]^[D27]^[D28]^[D29]            (2.1)
【００７９】
[F2-2]=[D24]^[D25]^[D26]^[D27]^[D28]^[D29]^
[D30]^[D31]^[D32]^[D33]^[D34]^[D35]          (2.2)
【００８０】
[F3-4]=[D36]^[D37]^[D38]^[D39]^[D40]^[D41]            (2.3)
【００８１】
[F1-2]=[D24]^[D25]^[D26]^[D27]^[D28]^[D29]^
[D30]^[D31]^[D32]^[D33]^[D34]^[D35]^
[D36]^[D37]^[D38]^[D39]^[D40]^[D41]^
[D42]^[D43]^[D44]^[D45]^[D46]^[D47]          (2.4)
【００８２】
以上のように、第１層のブロックサイズよりも多くのデータパケットが送信される場合でも、適宜ＦＥＣパケットの生成と挿入が行われる。
【００８３】
続いて、上記のようなデータパケットとＦＥＣパケットが送信されるネットワークの例について、図３を参照して説明する。図３は、ネットワークトポロジの２つの例を示す図である。本実施形態は、例えばネットワーク１００に適用されてもよいし、ネットワーク１２０に適用されてもよい。
【００８４】
ネットワーク１００は、ツリー型のトポロジのネットワークの例である。ネットワーク１００における根ノードはノード１０１である。ノード１０１は、パケット（すなわちデータパケットとＦＥＣパケット）をノード１０２と１０３に送信する。ノード１０２は、ノード１０１から受信したパケットをノード１０４と１０５に転送する。同様に、ノード１０３は、ノード１０１から受信したパケットをノード１０６に転送する。
【００８５】
また、ノード１０４は、ノード１０２から受信したパケットをノード１０７と１０８に転送する。ノード１０５は、ノード１０２から受信したパケットをノード１０９に転送する。そして、ノード１０６は、ノード１０３から受信したパケットをノード１１０と１１１に転送する。
【００８６】
ノード１０７〜１１１は、図３に示すごとく、ネットワーク１００における葉ノードなので、受信したパケットを転送しない。なお、以下では、根ノードでもなく葉ノードでもないノード１０２〜１０６を「中継ノード」と称する。
【００８７】
また、ネットワーク１２０は、分岐のないネットワーク（すなわち、２つ以上の子ノードを持つノードが存在しないネットワーク）の例である。ネットワーク１２０のトポロジもツリーの１種である。ネットワーク１２０の根ノードはノード１２１であり、ノード１２１は、パケットをノード１２２に送信する。ノード１２２は、ノード１２１から受信したパケットをノード１２３に転送する。そして、ノード１２３は、ノード１２２から受信したパケットをノード１２４に転送する。ノード１２２と１２３は中継ノードであり、ノード１２４は葉ノードである。よって、ノード１２４はパケットを転送しない。
【００８８】
ところで、ネットワーク１００内の各リンクは、それぞれエラーレートが異なり得る。例えば、ノード１０１と１０２の間のリンクのエラーレートよりも、ノード１０１と１０３の間のリンクのエラーレートの方が大幅に高いかもしれない。そのため、もし、ノード１０１が、ノード１０２と１０３に対して同じ割合で、ＦＥＣパケットをデータパケット同士の間に挿入すると、ＦＥＣパケットが過剰になるか、または不足するおそれがある。つまり、ノード１０２は余計なＦＥＣパケットを受信することになるかもしれないし、あるいは逆に、ノード１０３にとってはＦＥＣパケットが不足するかもしれない。
【００８９】
したがって、ノード１０１は、ノード１０２と１０３にそれぞれ合わせた割合でＦＥＣパケットをデータパケット同士の間に挿入することが好ましい。しかし、仮にノード１０１の子ノードの数が、図３のように２個ではなく、多数（例えば１００個あるいは１０００個など）である場合は、各子ノードに応じた異なる割合でのＦＥＣパケットの生成と挿入による処理負荷の増大を無視することはできない。よって、処理負荷の増大を抑制することが好ましい。
【００９０】
本実施形態によれば、このような処理負荷の抑制も実現される。つまり、たとえノード１０１が多数の子ノードを持っていても、処理負荷が極端に増大することがない。子ノードを複数有する根ノードにおける処理負荷の抑制が可能な理由は、詳しくは後述するが、図１〜２を参照して説明したようにＦＥＣパケットに階層構造があるからである。
【００９１】
また、例えばノード１０１と１０２の間のリンクのエラーレートよりも、ノード１０２と１０４の間のエラーレートの方が大幅に高いかもしれない。すると、ノード１０２が、ノード１０１から受信したデータパケットとＦＥＣパケットをそのままノード１０４に転送するのは不適切な場合がある。なぜなら、ノード１０２にとってはノード１０１から受信することができなかったデータパケットを復元するのに十分な割合でＦＥＣパケットが挿入されているとしても、当該割合はノード１０４にとっては不足かもしれないからである。よって、ノード１０２は、ＦＥＣパケットが挿入される割合を増やす処理をすることが適切な場合がある。
【００９２】
逆に、例えばノード１０１と１０３の間のリンクのエラーレートは、ノード１０３と１０６の間のエラーレートよりも大幅に高いかもしれない。この場合、ノード１０３が、ノード１０１から受信したデータパケットとＦＥＣパケットをそのままノード１０６に転送すると、ノード１０６にとっては不必要なほど多くのＦＥＣパケットが、ノード１０６に送信されるおそれがある。つまり、結果的にＦＥＣパケットの一部は無駄なトラフィックになってしまうかもしれない。よって、ノード１０３は、ＦＥＣパケットが挿入される割合を減らす処理をすることが適切な場合がある。
【００９３】
また、或る中継ノードが複数の子ノードを有する場合、当該中継ノードは、ＦＥＣパケットが挿入される割合を増やしたり減らしたりする処理を、各子ノードに応じて行うことが好ましい。ここで、子ノードが多数の場合は、処理負荷の増大を無視することができないので、処理負荷の増大を抑制することが好ましい。
【００９４】
本実施形態によれば、このような処理負荷の抑制も実現される。つまり、たとえ中継ノードが多数の子ノードを持っていても、処理負荷が極端に増大することがない。子ノードを複数有する中継ノードにおける処理負荷の抑制が可能な理由は、詳しくは後述するが、図１〜２を参照して説明したようにＦＥＣパケットに階層構造があるからである。
【００９５】
そして、ネットワーク１２０においても、各リンクは、それぞれエラーレートが異なり得る。したがって、ネットワーク１２０においても、上記のネットワーク１００における例と同様に、ＦＥＣパケットが挿入される割合を増やしたり減らしたりする処理を中継ノードが行うことが好ましい状況が生じ得る。
【００９６】
また、ネットワーク１００と１２０のいずれにおいても、どのリンクも、時間の経過とともにエラーレートが変化し得る。したがって、ネットワークトポロジによらず、各リンクの動的に変化し得るエラーレートに応じた適切な割合で、ＦＥＣパケットがデータパケットの間に挿入されることが好ましい。詳しくは後述するが、図１〜２を参照して説明した階層的なＦＥＣパケットを利用することにより、エラーレートに応じた適切な割合でのＦＥＣパケットの挿入が実現され、しかも各ノードの処理負荷を抑制することができる。
【００９７】
ところで、図３に示す各ノード１０１〜１１１および１２１〜１２４は、具体的には例えば後述の転送装置である。本実施形態の転送装置は、根ノードとして動作することもでき、中継ノードとして動作することもでき、葉ノードとして動作することもできる。
【００９８】
また、各ノード１０１〜１１１および１２１〜１２４は、具体的には、本実施形態が適用されるプロトコルのレイヤに応じて、ルータでもよいし、ＰＣ（Personal Computer）またはサーバのような汎用的なコンピュータでもよい。
【００９９】
例えば、本実施形態は、ルータの機能を拡張して、いわゆる「インテリジェントルータ」を実現するために利用されてもよい。その場合、各ノード１０１〜１１１および１２１〜１２４は、ルータであり、図３におけるノード間の矢印は物理的な接続を示す。
【０１００】
あるいは、本実施形態は、オーバレイマルチキャストとも呼ばれるＡＬＭ（Application Layer Multicast）の配信システムに利用されてもよい。その場合、各ノード１０１〜１１１および１２１〜１２４は、汎用的なコンピュータであり、図３におけるノード間の矢印は、配信ツリーにおける論理的な接続を示す。
【０１０１】
各ノード１０１〜１１１および１２１〜１２４が、ルータと汎用的なコンピュータのいずれであるにしろ、誤り訂正情報が階層的に生成され、挿入されるという特徴は変わらない。また、図３に示したトポロジが物理的なトポロジであるか論理的なトポロジであるかによらず、誤り訂正情報が階層的に生成され、挿入される。
【０１０２】
また、本実施形態は、例えばネットワーク１００において、根ノード１０１から、ネットワーク１００内の残りの１０個のノード１０２〜１１１へのマルチキャストに適用可能である。あるいは、本実施形態は、根ノード１０１から、ネットワーク１００内の一部のノード（例えば、５個の葉ノードだけ、あるいは、５個の葉ノードと１個以上の中継ノード）へのマルチキャストにも適用可能である。
【０１０３】
同様に、本実施形態は、ネットワーク１２０において、根ノード１２１から、ネットワーク１２０内の残りの３個のノード１２２〜１２４（あるいは葉ノード１２４と、中継ノードのうちの一方とを含む２個）へのマルチキャストに適用可能である。また、本実施形態は、根ノード１２１からノード１２４へのユニキャストにも適用可能である。
【０１０４】
そして、本実施形態が上記のマルチキャストまたはユニキャストのどの例に適用されるにしろ、誤り訂正情報が階層的に生成され、挿入されるという特徴は変わらない。
続いて、図４〜７を参照して、ネットワーク内のノードの動作の概要を、処理負荷の少なさという利点とともに説明する。
【０１０５】
図４は、ＦＥＣパケットの階層的な生成と挿入の例を示す図である。図１〜２を参照して説明したとおり、本実施形態では階層的なＦＥＣパケットが生成され、データパケットの間に挿入される。図４にも図２と同様に４８個のデータパケットＤ０〜Ｄ４７と、第１〜３階層の各ブロックの範囲と、各ブロックに対応して生成および挿入された８個のＦＥＣパケットが示されている。
【０１０６】
ところで、図３のノード１０１は、一連のデータパケット（例えばデータパケットＤ０〜Ｄ４７）を一度処理するだけで、任意に決められた最大深さＮ（１≦Ｎ）までの各階層のＦＥＣパケットを生成することもできる。すなわち、ノード１０１は、一連のデータパケットから、ワンパス（one-pass）処理により、１≦ｎ≦Ｎなるすべてのｎについて第ｎ層のＦＥＣパケットを生成することができる。ブロックとＦＥＣパケット自体は階層化されているにもかかわらず、ワンパス処理によりＦＥＣパケットを生成することができるという点は、処理負荷の抑制および記憶領域の消費抑制という面での利点である。
【０１０７】
例えば、ノード１０１は、まず、１≦ｎ≦Ｎなるすべてのｎについて第ｎ層のＦＥＣパケット用の記憶領域を割り当ててもよい。そして、ノード１０１は、データパケットを先頭から順に処理していき、処理対象の１つのデータパケットにつき次の処理を行ってもよい。
【０１０８】
すなわち、ノード１０１は、或る１つのデータパケットを処理する際、各ｎについて、処理対象のデータパケットが第ｎ層のブロックの最初のデータパケットか、２番目以降のデータパケットかを判断する。そして、もし処理対象のデータパケットが第ｎ層のブロックの最初のデータパケットであれば、ノード１０１は、第ｎ層用に割り当てた記憶領域に、処理対象のデータパケットを記憶する。また、もし処理対象のデータパケットが第ｎ層のブロックの２番目以降のデータパケットなら、ノード１０１は、第ｎ層用に割り当てた記憶領域上に現在記憶されているデータと、処理対象のデータパケットとの排他的論理和を、当該記憶領域上に上書きする。
【０１０９】
以上のような処理により、排他的論理和の計算が漸次的に進行するので、ワンパス処理によって各層のＦＥＣパケットが生成可能である。
また、各層のＦＥＣパケットの生成は、以下に説明する別の手順によっても可能である。以下の手順も、ワンパス処理の一例である。
【０１１０】
例えば、式（１．７）と（１．８）から、次の式（４．１）が成立する。
【０１１１】
[F2-1]=[F3-1]^[D6]^[D7]^[D8]^[D9]^[D10]^[D11]          (4.1)
【０１１２】
そして、式（１．６）と（１．７）と（１．９）から、次の式（４．２）が成立する。
【０１１３】
[F1-1]=[F2-1]^[F3-2]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]           (4.2)
【０１１４】
上記の式（４．１）と（４．２）は、以下のことを示している。すなわち、ノード１０１がデータパケット列を先頭から順に処理していくときに、第ｎ層のブロックに対応してＦＥＣパケットを生成するには、第ｎ層のブロックに属するすべてのデータパケットそのものが必ずしも必要なわけではない。その代わり、より深い階層のブロックに対応して既に生成したＦＥＣパケットと、第Ｎ層の直近のブロックに属するデータパケットのみからでも、ノード１０１は、第ｎ層のブロックに対応するＦＥＣパケットを生成することができる。
【０１１５】
上記の式（４．１）と（４．２）を一般化して説明すれば以下のとおりである。すなわち、ノード１０１は、第２層またはそれ以上に深い各階層のブロックに対応して最後に生成したＦＥＣパケットを保持する。ここで「最後」とは、「第１層の現在処理中のブロックに含まれる当該階層のブロックのうち、既に対応するＦＥＣパケットを生成したブロックの中では最後」という意味である。
【０１１６】
以下では、ｎ≧２のとき、第ｎ層のブロックに対応して最後に生成したＦＥＣパケットを“ＦＥＣ_Ｌａｓｔ（ｎ）”と表す。ノード１０１は、２≦ｎ≦ＮなるすべてのｎについてＦＥＣパケットＦＥＣ_Ｌａｓｔ（ｎ）を保持していれば、既に生成したＦＥＣパケットの生成に用いたデータパケットそのものを保持し続けなくてもよい。
【０１１７】
また、最下層（すなわち第Ｎ層）の最後のブロックに属するデータパケットの排他的論理和を“ＦＥＣ＿Ｎｅｗ（）”と表す。ここで「最後」とは、「第１層の現在処理中のブロックに含まれる第Ｎ層のブロックのうち、生成対象のＦＥＣパケットの挿入位置より前にあるブロックの中では最後」という意味である。
【０１１８】
例えば、Ｎ＝３の場合に、図４に示すように第１〜３階層のブロックサイズがそれぞれ２４、１２、６であるとする。このとき、ノード１０１は、図４に示すとおり、データパケットＤ５、Ｄ１１、Ｄ１７、Ｄ２３、Ｄ２９、Ｄ３５、Ｄ４１、Ｄ４７の直後にそれぞれＦＥＣパケットを挿入する。ここで、生成および挿入の対象が第ｎ層のＦＥＣパケットであるとき、当該ＦＥＣパケットを“ＦＥＣ（ｎ）”と表すことにすると、ＦＥＣ（ｎ）は、式（４．３）と（４．４）のように定義される。以下に詳しく説明するとおり、式（４．３）は式（４．１）と（４．２）を一般化した式である。
【０１１９】
FEC(n)=FEC_Last(n+1)^FEC_Last(n+2)^FEC_Last(n+3)^…^
FEC_Last(N)^FEC_New()    (1≦n≦N-1のとき)    (4.3)
【０１２０】
FEC(n)=FEC_New()          (n=Nのとき)                  (4.4)
【０１２１】
例えば、図４ではＮ＝３である。よって、第１層の現在処理中のブロックがブロックＢ１−１である場合を例として、ＦＥＣパケットＦ３−１、Ｆ２−１、Ｆ３−２、およびＦ１−１の生成について上記の式（４．３）と（４．４）を参照して説明すれば以下のとおりである。
【０１２２】
データパケットＤ５の直後に挿入するＦＥＣパケットＦ３−１の階層は３である。よって、この場合、ｎ＝Ｎ＝３なので式（４．４）が適用される。また、この場合、最下層（すなわち第３層）の最後のブロックとはブロックＢ３−１のことである。したがって、ＦＥＣ＿Ｎｅｗ（）とは、具体的にはブロックＢ３−１に属するすべてのデータパケットＤ０〜Ｄ５の排他的論理和である。よって、ＦＥＣパケットＦ３−１については式（４．４）から式（４．５）が得られ、式（４．５）の結果は式（１．８）とも一致する。
【０１２３】
[F3-1]=FEC(n)
=FEC(3)
=FEC_New()
=[D0]^[D1]^[D2]^[D3]^[D4]^[D5]          (4.5)
【０１２４】
また、データパケットＤ１１の直後に挿入するＦＥＣパケットＦ２−１の階層は２である。よって、この場合、ｎ＝２≦Ｎ−１なので式（４．３）が適用される。また、この場合、第（ｎ＋１）層（つまり第３層）のブロックに対応して最後に生成したＦＥＣパケットはＦＥＣパケットＦ３−１である。そして、この場合、最下層の最後のブロックとはブロックＢ３−２のことなので、ＦＥＣ＿Ｎｅｗ（）とは、具体的にはブロックＢ３−２に属するすべてのデータパケットＤ６〜Ｄ１１の排他的論理和である。よって、ＦＥＣパケットＦ２−１については式（４．３）から式（４．６）が得られ、式（４．６）の結果は式（４．１）とも一致する。
【０１２５】
[F2-1]=FEC(n)
=FEC(2)
=FEC_Last(3)^FEC_New()
=[F3-1]^[D6]^[D7]^[D8]^[D9]^[D10]^[D11]          (4.6)
【０１２６】
また、データパケットＤ１７の直後に挿入するＦＥＣパケットＦ３−２の階層は３である。よって、この場合、式（４．４）が適用される。また、この場合、最下層の最後のブロックとはブロックＢ３−３のことである。したがって、ＦＥＣ＿Ｎｅｗ（）とは、具体的にはブロックＢ３−３に属するすべてのデータパケットＤ１２〜Ｄ１７の排他的論理和である。よって、ＦＥＣパケットＦ３−２については式（４．４）から式（４．７）が得られ、式（４．７）の結果は式（１．９）とも一致する。
【０１２７】
[F3-2]=FEC(n)
=FEC(3)
=FEC_New()
=[D12]^[D13]^[D14]^[D15]^[D16]^[D17]          (4.7)
【０１２８】
また、データパケットＤ２３の直後に挿入するＦＥＣパケットＦ１−１の階層は１である。よって、この場合、式（４．３）が適用される。また、この場合、第（ｎ＋１）層（つまり第２層）のブロックに対応して最後に生成したＦＥＣパケットはＦＥＣパケットＦ２−１であり、第（ｎ＋２）層（つまり第３層）のブロックに対応して最後に生成したＦＥＣパケットはＦＥＣパケットＦ３−２である。そして、この場合、最下層の最後のブロックとはブロックＢ３−４のことなので、ＦＥＣ＿Ｎｅｗ（）とは、具体的にはブロックＢ３−４に属するすべてのデータパケットＤ１８〜Ｄ２３の排他的論理和である。よって、ＦＥＣパケットＦ１−１については式（４．３）から式（４．８）が得られ、式（４．８）の結果は式（４．２）とも一致する。
【０１２９】
[F1-1]=FEC(n)
=FEC(1)
=FEC_Last(2)^FEC_Last(3)^FEC_New()
=[FEC2-1]^[FEC3-2]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]          (4.8)
【０１３０】
以上説明したとおり、ＦＥＣパケットを生成するには、データパケットのみを利用してもよいし、生成済みのＦＥＣパケットも利用してもよい。図４には、或るブロックに対応するＦＥＣパケットが、当該ブロックに属するすべてのデータパケットから直接的に生成される場合を示す矢印が示されている。さらに、図４には、第ｎ層の或るブロックに対応するＦＥＣパケットが、より深い階層の生成済みのＦＥＣパケットと最下層の直近のブロックのデータパケットから生成される場合を示す矢印も示されている。もちろん、後者の場合であっても、ＦＥＣパケットは間接的にはデータパケットから生成されているのだから、ＦＥＣパケットがデータパケットに基づいているという点には変わりがない。
【０１３１】
以上、「第１層の現在処理中のブロック」がブロックＢ１−１であり、かつＮ＝３である場合を例にして、式（４．３）と（４．４）について具体的に説明したが、もちろん、式（４．３）と（４．４）は、その他の場合にも成立する。つまり、式（４．３）と（４．４）は、「第１層の現在処理中のブロック」がどのブロックであろうとも、Ｎがどのような値であろうとも、成立する。
【０１３２】
なお、各階層のブロックが直下の階層のブロックを２つずつ含み、かつ最下層が第Ｎ層の場合に、第１層の現在処理中のブロック内でＸ番目に挿入されるＦＥＣパケットの階層ｎは、式（４．９）を満たすａ（０≦ａ≦Ｎ−１）を用いて、ｎ＝Ｎ−ａと表せる。
【０１３３】
X=2(a+1)i+2a-1            (4.9)
【０１３４】
式（４．９）において、０≦Ｘ＜２（Ｎ−１）であり、ｉは０以上の整数である。式（４．９）の具体例を説明すれば以下のとおりである。
【０１３５】
例えば、Ｎ＝１のときは、０≦Ｘ＜２０＝１なので、Ｘ＝０の場合しかない。そして、図１から理解されるように、Ｘ＝０のときは、ｎ＝１であるから、ｎ＝Ｎ−０と表すことができる（すなわちａ＝０である）。
【０１３６】
そして、ｉ＝０とおくことにより、「Ｎ＝１のとき、式（４．９）は正しい」ということが理解されるだろう。つまり、上記のａに関する前提によれば、Ｎ＝１のとき、０≦ａ≦１−１＝０である（すなわちａ＝０の場合しかない）。そして、ａ＝０を式（４．９）に代入すると、式（４．１０）が得られる。式（４．１０）においてｉ＝０とおけば、Ｘ＝０が得られるので、Ｘ＝０は式（４．９）を満たす。つまり、Ｎ＝１のとき式（４．９）は正しい。
【０１３７】
X=21i+20-1=2i            (4.10)
【０１３８】
また、Ｎ＝２のときは、０≦Ｘ＜２１＝２なので、Ｘ＝０またはＸ＝１である。他方、上記のａに関する前提によれば、Ｎ＝２のとき、０≦ａ≦Ｎ−１＝１である。そして、以下のとおり、Ｎ＝２のときも式（４．９）は正しい。
【０１３９】
具体的には、図１においてＮ＝２のとき、０番目にＦＥＣパケットＦ２−１が挿入されており、１番目にＦＥＣパケットＦ１−１が挿入されていることから理解されるように、Ｘ＝０のときは、ｎ＝２＝Ｎ−０である（つまりａ＝０である）。ここで、上記のとおり、ａ＝０のときに式（４．９）は式（４．１０）のように変形されるので、式（４．１０）においてｉ＝０とおけば、Ｘ＝０は式（４．９）を満たす。
【０１４０】
さらに、図１から理解されるように、Ｘ＝１のときは、ｎ＝１＝Ｎ−１であるからａ＝１である。そして、ａ＝１を式（４．９）に代入すると式（４．１１）が得られる。式（４．１１）においてｉ＝０とおけば、Ｘ＝１が得られるので、Ｘ＝１も式（４．９）を満たす。
【０１４１】
X=22i+21-1=4i+1            (4.11)
【０１４２】
また、Ｎ＝３のときは、０≦Ｘ＜２２＝４である。他方、上記のａに関する前提によれば、Ｎ＝３のとき、０≦ａ≦３−１＝２である。
【０１４３】
また、図１においてＮ＝３のとき、０番目にＦＥＣパケットＦ３−１が挿入されており、１番目にＦＥＣパケットＦ２−１が挿入されており、２番目にＦＥＣパケットＦ３−２が挿入されており、３番目にＦＥＣパケットＦ１−１が挿入されている。このことから理解されるように、Ｘ＝０またはＸ＝２のときは、ｎ＝３＝Ｎ−０であるからａ＝０であり、Ｘ＝１のときは、ｎ＝２＝Ｎ−１であるからａ＝１であり、Ｘ＝３のときは、ｎ＝１＝Ｎ−２であるからａ＝２である。
【０１４４】
ここで、上記のとおり、ａ＝０のときに式（４．９）は式（４．１０）のように変形される。式（４．１０）においてｉ＝０とおけば、Ｘ＝０が得られるので、Ｘ＝０は式（４．９）を満たす。また、式（４．１０）においてｉ＝１とおけば、Ｘ＝２が得られるので、Ｘ＝２も式（４．９）を満たす。
【０１４５】
また、上記のとおり、ａ＝１のときに式（４．９）は式（４．１１）のように変形される。式（４．１１）においてｉ＝０とおけば、Ｘ＝１が得られるので、Ｘ＝１も式（４．９）を満たす。
【０１４６】
また、ａ＝２のときに式（４．９）は式（４．１２）のように変形される。式（４．１２）においてｉ＝０とおけば、Ｘ＝３が得られるので、Ｘ＝３も式（４．９）を満たす。
【０１４７】
X=23i+22-1=8i+3            (4.12)
【０１４８】
以上の具体例の説明から理解されるように、式（４．９）を満たすａ（０≦ａ≦Ｎ−１）が０≦Ｘ＜２（Ｎ−１）なるＸに対して一意に定まる。よって、例えばノード１０１は、次に生成および挿入するＸ番目のＦＥＣパケットの階層（ｎ＝Ｎ−ａ）を認識することができ、認識した階層ｎにしたがって、式（４．３）または（４．４）により、Ｘ番目のＦＥＣパケットを生成することができる。なお、ＦＥＣパケットを生成するノード（例えばノード１０１）は、式（４．９）を使わずに、図１４とともに後述するブロック管理テーブル５００のような情報を用いて、次に生成および挿入するＸ番目のＦＥＣパケットの階層を認識することもできる。
【０１４９】
図５は、消失したデータパケットを、ＦＥＣパケットを利用して復元する例を示す図である。図５では、消失したデータパケットがハッチングにより図示されている。
ここで、ビット列ｙと同じ長さで全ビットが０のビット列を“ｚｅｒｏ（ｙ）”と表記することにすると、排他的論理和の性質から、任意のビット列ｙに関して、式（５．１）と（５．２）が成り立つ。
【０１５０】
y^y=zero(y)            (5.1)
【０１５１】
y^zero(y)=y            (5.2)
【０１５２】
したがって、例えばブロックＢ３−１に属するデータパケットＤ２が、ノード１０１からノード１０２へのリンクで消失した場合、ノード１０２は、次のようにしてデータパケットＤ２を復元することができる。すなわち、ノード１０２は、同じブロックＢ３−１に属する残りの５つのデータパケットＤ０、Ｄ１、Ｄ３〜Ｄ５と、ブロックＢ３−１に対応して生成され、送信されたＦＥＣパケットＦ３−１との排他的論理和を計算することで、データパケットＤ２を復元する。
【０１５３】
上記の計算によりデータパケットＤ２の復元が可能なことは、式（１．８）、（５．１）、および（５．２）から導かれる次の式（５．３）により明らかである。
【０１５４】
[D0]^[D1]^[D3]^[D4]^[D5]^[F3-1]
=[D0]^[D1]^[D3]^[D4]^[D5]^([D0]^[D1]^[D2]^[D3]^[D4]^[D5])
=([D0]^[D0])^([D1]^[D1])^[D2]^([D3]^[D3])^([D4]^[D4])^([D5]^[D5])
=[D2]            (5.3)
【０１５５】
また、例えばブロックＢ３−２に属するデータパケットＤ８が、ノード１０１からノード１０２へのリンクで消失した場合、ノード１０２は、２種類の処理のいずれによっても、データパケットＤ２を復元することができる。第１の処理は、次の（Ａ−１）と（Ａ−２）の事実に注目した処理である。
【０１５６】
（Ａ−１）ブロックＢ３−２は、図１に示すように、１つ上の第２層のブロックＢ２−１の中では最後のブロックである。したがって、ブロックＢ３−２に対応して生成される第３層のＦＥＣパケットは存在しない。
【０１５７】
（Ａ−２）その代わり、ブロックＢ３−２の最後には、ブロックＢ２−１に対応して生成されたＦＥＣパケットＦ２−１が挿入されている。
上記（Ａ−１）と（Ａ−２）より、ノード１０２は、ブロックＢ２−１に属する残りの１１個のデータパケットと、ＦＥＣパケットＦ２−１との排他的論理和を計算することで、消失したデータパケットＤ８を復元することができる。なお、データパケットＤ８だけでなく、さらにブロックＢ３−１中のデータパケットＤ０〜Ｄ５のいずれか１つが消失した場合には、ノード１０２は、上記のデータパケットＤ２の例と同様にして、ブロックＢ３−１中で消失したデータパケットを先に復元する。すると、ブロックＢ３−１に属する６つのデータパケットＤ０〜Ｄ５がすべて揃う。よって、ノード１０２は、消失したデータパケットＤ８を復元することができる。
【０１５８】
以上説明した第１の処理は、次の式（５．４）からも明らかである。なお、式（５．４）は、式（５．３）の導出と同様にして式（１．７）、（５．１）、および（５．２）から導出される。
【０１５９】
[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^[D6]^[D7]^[D9]^[D10]^[D11]^[F2-1]
=[D8]            (5.4)
【０１６０】
ところが、上記の第１の処理によれば、ノード１０２は、ブロックＢ３−２中のいずれかのデータパケットの消失に備えて、ブロックＢ３−１に属するすべてのデータパケットを保持し続けなくてはならない。つまり、第１の処理によれば、ノード１０２は多くのバッファ領域を消費してしまう。
【０１６１】
そこで、上記のデータパケットＤ８が消失する例において、ノード１０２は、バッファ領域の消費を抑制するため、以下に説明する第２の処理によりデータパケットＤ８を復元してもよい。すなわち、ノード１０２は、下記（Ｂ−１）〜（Ｂ−３）の各パケットの排他的論理和を計算することで、データパケットＤ８を復元することができる。
【０１６２】
（Ｂ−１）最下層（図５の例では第３層）において、消失したデータパケットＤ８と同じブロックＢ３−２に属する、残りの５つのデータパケットＤ６、Ｄ７、Ｄ９〜Ｄ１１。
（Ｂ−２）消失したデータパケットＤ８より後に挿入される最初のＦＥＣパケット（すなわちＦＥＣパケットＦ２−１）。
【０１６３】
（Ｂ−３）上記（Ｂ−２）のＦＥＣパケットＦ２−１に対応する第２層よりも深いすべての階層（図５の例では、第３層のみ）について、当該階層のＦＥＣパケットのうちで最後のもの。すなわち、図５の例では、ＦＥＣパケットＦ３−１のみ。ここで「最後」とは、消失したデータパケットＤ８より後に挿入される最初のＦＥＣパケット２−１に対応するブロックＢ２−１に含まれる同じ階層のブロック同士での比較において最後のブロックに対応するＦＥＣパケット、という意味である。
【０１６４】
換言すれば、上記（Ｂ−３）での「最後」とは、復元対象のデータパケットが属するブロックのうち、対応して生成されたＦＥＣパケットを持つブロックの中では最も下の階層のブロックの範囲内で最後のブロックに対応するＦＥＣパケット、という意味である。
【０１６５】
例えば、データパケットＤ８は第３層においてブロックＢ３−２に属するが、ブロックＢ３−２に対応して生成されたＦＥＣパケットはない。一方、データパケットＤ８が第２層と第１層においてそれぞれブロックＢ２−１とＢ１−１に属し、ブロックＢ２−１とＢ１−１には、それぞれに対応して生成されたＦＥＣパケットＦ２−１とＦ１−１がある。よって、上記（Ｂ−３）の意味での「最後」のＦＥＣパケットとは、第２層と第１層のうち下の方の階層である第２層のブロックＢ２−１の範囲内で、同じ階層のブロックの中では最後のブロックに対応するＦＥＣパケットである。つまり、第３層についての「最後」のＦＥＣパケットは、ＦＥＣパケットＦ３−１である。
【０１６６】
以上説明したように（Ｂ−１）〜（Ｂ−３）の排他的論理和を計算する第２の処理によりデータパケットＤ８の復元が可能なことは、次の式（５．５）からも明らかである。なお、式（５．５）は、式（５．４）と式（１．８）から導出される。
【０１６７】
[F3-1]^[D6]^[D7]^[D9]^[D10]^[D11]^[F2-1]
=[D8]            (5.5)
【０１６８】
そして、ノード１０１からノード１０２へのリンクでデータパケットＤ８が消失した場合と同様に、データパケットＤ１９が消失した場合も、ノード１０２は、第１または第２の処理により、データパケットＤ１９を復元することができる。すなわち、第１の処理は次の（Ｃ−１）と（Ｃ−２）の事実に注目した処理である。
【０１６９】
（Ｃ−１）データパケットＤ１９は、最下層の第３層においてブロックＢ３−４に属する。しかし、ブロックＢ３−４は、１つ上の第２層のブロックＢ２−１の中では最後のブロックである。したがって、ブロックＢ３−４に対応して生成される第３層のＦＥＣパケットは存在しない。
【０１７０】
（Ｃ−２）その代わり、ブロックＢ３−４の最後には、ブロックＢ１−１に対応して生成されたＦＥＣパケットＦ１−１が挿入されている。
上記（Ｃ−１）と（Ｃ−２）より、ノード１０２は、ブロックＢ１−１に属する残りの２３個のデータパケットと、ＦＥＣパケットＦ１−１との排他的論理和を計算することで、消失したデータパケットＤ１９を復元することができる。なお、ノード１０２は、ブロックＢ３−１〜Ｂ３−３のそれぞれにおいて１個までのデータパケットが消失した場合であっても、第１の処理によりデータパケットＤ１９を復元することができる。
【０１７１】
なぜなら、ノード１０２は、ブロックＢ３−１中のデータパケットを、上記のデータパケットＤ２の例と同様にして復元することができ、ブロックＢ３−２中のデータパケットを、上記のデータパケットＤ８の例と同様にして復元することができるからである。そして、ノード１０２は、ブロックＢ３−３中のいずれか１個のデータパケットが消失した場合でも、ブロックＢ３−３中の残りの５個のデータパケットとＦＥＣパケットＦ３−２から、消失したデータパケットを復元することができるからである。
【０１７２】
したがって、ノード１０２は、ブロックＢ３−１〜Ｂ３−３に属するデータパケットが消失した場合には、消失したデータパケットを先に復元する。それにより、ブロックＢ１−１に属する、データパケットＤ１９以外の２３個のデータパケットが揃う。よって、たとえデータパケットＤ１９が消失するだけでなくブロックＢ３−１〜Ｂ３−３でもデータパケットの消失が生じたとしても、ノード１０２は、第１の処理により、データパケットＤ１９を復元することができる。
【０１７３】
以上説明した第１の処理によるデータパケットＤ１９の復元は、次の式（５．６）からも明らかである。なお、式（５．６）は、式（５．３）の導出と同様にして式（１．６）、（５．１）、および（５．２）より導出される。
【０１７４】
[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]^
[D12]^[D13]^[D14]^[D15]^[D16]^[D17]^
[D18]^[D20]^[D21]^[D22]^[D23]^[F1-1]
=[D19]            (5.6)
【０１７５】
ところが、上記の第１の処理によれば、ノード１０２は、ブロックＢ３−４中のいずれかのデータパケットの消失に備えて、ブロックＢ３−１〜Ｂ３−３に属するすべてのデータパケットを保持し続けなくてはならない。つまり、第１の処理によれば、ノード１０２は多くのバッファ領域を消費してしまう。
【０１７６】
そこで、上記のデータパケットＤ１９が消失する例において、ノード１０２は、バッファ領域の消費を抑制するため、以下に説明する第２の処理によりデータパケットＤ１９を復元してもよい。すなわち、ノード１０２は、下記（Ｄ−１）〜（Ｄ−３）の各パケットの排他的論理和を計算することで、データパケットＤ１９を復元することができる。
【０１７７】
（Ｄ−１）最下層（図５の例では第３層）において、消失したデータパケットＤ１９と同じブロックＢ３−４に属する、残りの５つのデータパケットＤ１８、Ｄ２０〜Ｓ２３．
（Ｄ−２）消失したデータパケットＤ１９より後に挿入される最初のＦＥＣパケット（すなわちＦＥＣパケットＦ１−１）。
【０１７８】
（Ｄ−３）上記（Ｄ−２）のＦＥＣパケットＦ１−１に対応する第１層よりも深いすべての階層（図５の例では、第２層と第３層）について、当該階層のＦＥＣパケットのうちで最後のもの。すなわち、図５の例では、第２層についてのＦＥＣパケットＦ２−１と、第３層についてのＦＥＣパケットＦ３−２。なおここでの「最後」の意味は、上記（Ｂ−３）で説明したのと同様であり、データパケットＤ１９が消失する例では、ブロックＢ１−１の範囲内での同じ階層のブロック同士の比較で「最後」、という意味である。
【０１７９】
以上説明した第２の処理によりデータパケットＤ１９の復元が可能なことは、次の式（５．７）からも明らかである。なお、式（５．７）は、式（５．６）と式（１．７）と式（１．９）から導出される。
【０１８０】
[F2-1]^[F3-2]^[D18]^[D20]^[D21]^[D22]^[D23]^[F1-1]
=[D19]            (5.7)
【０１８１】
なお、上記の説明では、ノード１０１からノード１０２への送信中にデータパケットが消失した場合の、ノード１０２による復元を具体例として挙げた。しかし、もちろんノード１０１と１０２の間のリンク以外のリンク上でデータパケットが消失した場合にも、他のノードが同様にしてデータパケットを復元することができる。
【０１８２】
また、図５の例では、最下層が第３層であるが、もちろん階層の最大の深さＮは任意である。そこで、データパケットＤ８とＤ１９の復元について説明した上記の第２の処理を一般化して説明すれば、次のとおりである。
【０１８３】
式（４．３）と式（４．４）に関して説明した上記の定義によれば、ＦＥＣ＿Ｎｅｗ（）は、最下層（すなわち第Ｎ層）の最後のブロックに属するデータパケットの排他的論理和である。したがって、第Ｎ層において或るブロックに属する或るデータパケットが消失した場合、消失したデータパケットは、当該「或るブロック」に属する残りのデータパケットと、ＦＥＣ＿Ｎｅｗ（）との排他的論理和を計算することにより、復元することができる。
【０１８４】
例えば、Ｎ＝３である図５の例において、データパケットＤ１９が消失した場合、第３層においてデータパケットＤ１９が属するのはブロックＢ３−４であるから、「最下層の最後のブロック」はブロックＢ３−４である。よって、ＦＥＣ＿Ｎｅｗ（）は、定義より、ブロックＢ３−４に属するデータパケットＤ１８〜Ｄ２３の排他的論理和のことである。したがって、消失したデータパケットＤ１９は、ブロックＢ３−４に属する残りの５個のデータパケットＤ１８、Ｄ２０〜Ｄ２３と、ＦＥＣ＿Ｎｅｗ（）との排他的論理和を計算することにより、復元することができる。そして、ＦＥＣ＿Ｎｅｗ（）は、以下のように表される。
【０１８５】
１≦ｎ≦Ｎ−１のとき、式（４．３）の両辺に“＾ＦＥＣ（ｎ）＾ＦＥＣ＿Ｎｅｗ（）”を加えることにより次の式（５．８）が導出される。
【０１８６】
FEC(n)^FEC(n)^FEC_New()=FEC_Last(n+1)^FEC_Last(n+2)^FEC_Last(n+3)^…^
FEC_Last(N)^FEC_New()^
FEC(n)^FEC_New()              (5.8)
【０１８７】
そして、式（５．１）と（５．２）を用いて式（５．８）の左辺と右辺をそれぞれ変形すると、１≦ｎ≦Ｎ−１のときに関する式（５．９）が得られる。
【０１８８】
FEC_New()=FEC_Last(n+1)^FEC_Last(n+2)^FEC_Last(n+3)^…^
FEC_Last(N)^FEC(n)            (5.9)
【０１８９】
また、ｎ＝Ｎのとき、式（４．４）から次の式（５．１０）が得られる。
【０１９０】
FEC_New()=FEC(n)                                      (5.10)
【０１９１】
なお、式（５．９）と式（５．１０）におけるＦＥＣ（ｎ）は、図４と図５の説明から明らかなように、消失したデータパケットよりも後に挿入される最初のＦＥＣパケットであり、ｎは当該ＦＥＣパケットの階層である。
【０１９２】
例えば、図５の例において、データパケットＤ２が消失した場合は、ＦＥＣ（ｎ）＝［Ｆ３−１］かつｎ＝３である。また、データパケットＤ８が消失した場合は、ＦＥＣ（ｎ）＝［Ｆ２−１］かつｎ＝２である。そして、データパケットＤ１９が消失した場合は、ＦＥＣ（ｎ）＝［Ｆ１−１］かつｎ＝１である。なお、図５には例示していないが、例えばデータパケットＤ１４が消失した場合は、ＦＥＣ（ｎ）＝［Ｆ３−２］かつｎ＝３である。
【０１９３】
例えば、ノード１０１からパケットを受信するノード１０２は、最下層の第Ｎ層の最新のブロックに属するデータパケットと、第２層以下の各階層で最後に受信したＦＥＣパケットさえ保持していれば、消失したデータパケットを復元することができる。具体的には、ノード１０２は、次のようにしてデータパケットを復元する。
【０１９４】
ノード１０２は、データパケットの消失を検知した場合、消失したデータパケットの第１層のブロック内での順番から、上記のｎの値を認識することができる。よって、ノード１０２は、認識したｎの値に応じて、式（５．９）によりＦＥＣ＿Ｎｅｗ（）を計算するか、または、式（５．１０）により、保持しているＦＥＣ（ｎ）をＦＥＣ＿Ｎｅｗ（）として得る。
【０１９５】
そして、ノード１０２は、消失したデータパケットと第Ｎ層において同じブロックに属する残りのデータパケットと、ＦＥＣ＿Ｎｅｗ（）との排他的論理和を計算することにより、消失したデータパケットを復元する。
【０１９６】
例えば、データパケットＤ２が消失した場合は、データパケットＤ２よりも後の最初のＦＥＣパケットＦ３−１は第３層のブロックＢ３−1に対応するので、ｎ＝３である。よって、ノード１０２は、式（５．１０）にしたがって式（５．１１）のＦＥＣ＿Ｎｅｗ（）を得る。
【０１９７】
FEC_New()=FEC(3)=[FEC3-1]                             (5.11)
【０１９８】
ここで、消失したデータパケットＤ２が属する最下層のブロックＢ３−１に属する残りのデータパケットは、データパケットＤ０、Ｄ１、Ｄ３〜Ｄ５である。よって、ノード１０２は、式（５．１１）により得られるＦＥＣ＿Ｎｅｗ（）と、５個のデータパケットＤ０、Ｄ１、Ｄ３〜Ｄ５との排他的論理和を計算することで、データパケットＤ２を復元する。この復元は、式（５．３）を参照して説明したとおりである。
【０１９９】
そして、データパケットＤ８が消失した場合は、データパケットＤ８よりも後の最初のＦＥＣパケットＦ２−１は第２層のブロックＢ２−１に対応するので、ｎ＝２である。よって、ノード１０２は、式（５．９）にしたがって式（５．１２）のＦＥＣ＿Ｎｅｗ（）を得る。
【０２００】
FEC_New()=FEC_Last(3)^FEC(2)=[FEC3-1]^[FEC2-1]        (5.12)
【０２０１】
ここで、消失したデータパケットＤ８が属する最下層のブロックＢ３−２に属する残りのデータパケットは、データパケットＤ６、Ｄ７、Ｄ９〜Ｄ１１である。よって、ノード１０２は、式（５．１２）により得られるＦＥＣ＿Ｎｅｗ（）と、５個のデータパケットＤ６、Ｄ７、Ｄ９〜Ｄ１１との排他的論理和を計算することで、データパケットＤ８を復元する。この復元は、式（５．５）を参照して説明したとおりである。
【０２０２】
また、データパケットＤ１９が消失した場合は、データパケットＤ１９よりも後の最初のＦＥＣパケットＦ１−１は第１層のブロックＢ１−１に対応するので、ｎ＝１である。よって、ノード１０２は、式（５．９）にしたがって式（５．１３）のＦＥＣ＿Ｎｅｗ（）を得る。
【０２０３】
FEC_New()=FEC_Last(2)^FEC_Last(3)^FEC(1)
=[FEC2-1]^[FEC3-2]^[FEC1-1]                  (5.13)
【０２０４】
ここで、消失したデータパケットＤ１９が属する最下層のブロックＢ３−４に属する残りのデータパケットは、データパケットＤ１８、Ｄ２０〜Ｄ２３である。よって、ノード１０２は、式（５．１３）により得られるＦＥＣ＿Ｎｅｗ（）と、５個のデータパケットＤ１８、Ｄ２０〜Ｄ２３との排他的論理和を計算することで、データパケットＤ１９を復元する。この復元は、式（５．７）を参照して説明したとおりである。
【０２０５】
以上説明したように、消失したデータパケットが最下層の第Ｎ層において属するブロックに対応するＦＥＣパケットが定義されていれば、式（５．１０）による復元が行われる。なぜなら、消失したデータパケットの後の最初のＦＥＣパケットに対応するブロックの階層は、第Ｎ層だからである。
【０２０６】
逆に、消失したデータパケットが最下層の第Ｎ層において属するブロックが、１つ上の階層（つまり第（Ｎ−１）層）の同じブロックの中で最後のブロック（例えば図５のブロックＢ３−４）である場合は、式（５．９）による復元が行われる。なぜなら、消失したデータパケットの後の最初のＦＥＣパケットに対応するブロックは、第Ｎ層よりも浅い階層のブロックだからである。
【０２０７】
ところで、例えば図３において、ノード１０１と１０３の間のリンクのエラーレートは、ノード１０３と１０６の間のエラーレートより高い場合があり得る。この場合、ノード１０１がノード１０３にデータパケットを送信するときには、第３層までのＦＥＣパケットをデータパケットとあわせて送信することが好ましいかもしれない。しかし、ノード１０６にとって十分な誤り訂正能力は、第２層までのＦＥＣパケットだけで得られるかもしれない。
【０２０８】
すると、もし、ノード１０３がノード１０１から受信した第３層のＦＥＣパケットをノード１０６に転送すると、ノード１０６は、不必要に多くのパケットを受信することになってしまう。そこで、無駄なトラフィックを削減するためには、ノード１０３は、第３層のＦＥＣパケットのノード１０６への転送を行わないことが好ましい。図６は、例えば上記のようなＦＥＣパケットの転送の抑制を示す図である。
【０２０９】
すなわち、図６は、ＦＥＣパケットの一部を削除することで階層を浅くする例を示す図である。上記の例において、例えばノード１０３は、ノード１０１から、第１層から第３層までのＦＥＣパケットを、データパケットとともに受信する。図６の上段には、ノード１０１からノード１０３へ送信されるパケットとして、以下の（Ｅ−１）〜（Ｅ−４）が例示されている。
【０２１０】
（Ｅ−１）データパケットＤ０〜Ｄ４７
（Ｅ−２）第１層のＦＥＣパケットＦ１−１およびＦ１−２
（Ｅ−３）第２層のＦＥＣパケットＦ２−１およびＦ２−２
（Ｅ−４）第３層のＦＥＣパケットＦ３−１、Ｆ３−２、Ｆ３−３、およびＦ３−４
【０２１１】
ノード１０３は、もし消失したデータパケットがあれば、消失した当該データパケットを適宜復元する。消失したデータパケットを復元する方法は、図５を参照して説明したとおりである。そして、ノード１０３は、受信または復元した各データパケットを、ノード１０６に転送する。
【０２１２】
また、ノード１０３は、第１層から第２層までのＦＥＣパケットをノード１０６に転送する。しかし、ノード１０３は、転送先のノード１０６にとって不要な第３層のＦＥＣパケットは、ノード１０６に転送しない。よって、図６の下段には、ノード１０３からノード１０６へ送信されるパケットとして、上記の（Ｅ−１）〜（Ｅ−３）が例示されている。
【０２１３】
もちろん、本実施形態によれば、ノード１０３以外のどの中継ノードも、上記と同様にして、ＦＥＣパケットの一部を転送対象から削除することで、ＦＥＣパケットの階層を浅くすることができる。
【０２１４】
また、上記の例では、ノード１０３が受信するＦＥＣパケットの中で最下層の第３層のＦＥＣパケットのみが転送対象から削除されるが、中継ノードは、最下層を含む２階層以上のＦＥＣパケットを転送対象から削除してもよい。例えば、ノード１０３とノード１０６の間のリンクのエラーレートが非常に低ければ、ノード１０６にとっては第１層のＦＥＣパケットだけで十分な誤り訂正能力が得られるかもしれない。その場合、ノード１０３は、第３層と第２層のＦＥＣパケットをノード１０６に転送しないようにすることが好ましい。
【０２１５】
以上のように本実施形態によれば、ＦＥＣパケットが挿入される割合をリンクのエラーレートの違いに応じて減らすための処理は、単に、受信したＦＥＣパケットの一部の転送をしないように制御を行うことだけである。したがって、本実施形態によれば、中継ノードの処理負荷をほとんど増大させることなく、過剰なＦＥＣパケットの送信を抑制することができる。
【０２１６】
ところで、上記の図６の例とは逆に、例えば、図３のノード１０１と１０２の間のリンクのエラーレートよりも、ノード１０２と１０４の間のエラーレートの方が高い場合に、中継ノード１０２は、必要に応じて、より深い階層のＦＥＣパケットを新たに追加する。例えば、「ノード１０２にとって十分な誤り訂正能力は、第３層までのＦＥＣパケットだけで得られるが、ノード１０４にとって十分な誤り訂正能力を得るには、第４層までのＦＥＣパケットが必要」という場合がある。
【０２１７】
すると、もし、ノード１０２が、ノード１０１から受信したデータパケットと第３層までのＦＥＣパケットだけをノード１０４に転送したとすると、データパケットが消失したとき、ノード１０４はデータパケットの復元ができないかもしれない。そこで、ノード１０４にとって適切な誤り訂正能力が得られるようにするためには、ノード１０２は、新たに第４層のＦＥＣパケットを生成し、生成した第４層のＦＥＣパケットをデータパケットの途中に挿入しながらパケットの転送を行うことが好ましい。図７は、例えば上記のようなＦＥＣパケットの追加を示す図である。
【０２１８】
すなわち、図７は、ＦＥＣパケットを追加することで階層を深くする例を示す図である。上記の例において、例えばノード１０２は、ノード１０１から、第１層から第３層までのＦＥＣパケットを、データパケットとともに受信する。図７の上段には、ノード１０１からノード１０２へ送信されるパケットとして、以下の（Ｆ−１）〜（Ｆ−４）が例示されている。
【０２１９】
（Ｆ−１）データパケットＤ０〜Ｄ２３
（Ｆ−２）第１層のＦＥＣパケットＦ１−１
（Ｆ−３）第２層のＦＥＣパケットＦ２−１
（Ｆ−４）第３層のＦＥＣパケットＦ３−１およびＦ３−２
【０２２０】
ノード１０２は、もし消失したデータパケットがあれば、消失した当該データパケットを適宜復元する。消失したデータパケットを復元する方法は、図５を参照して説明したとおりである。そして、ノード１０２は、受信または復元した各データパケットを、ノード１０４に転送する。また、ノード１０２は、受信した第３層までのすべてのＦＥＣパケットをノード１０４に転送する。
【０２２１】
さらに、ノード１０２は、第４層のＦＥＣパケットを生成してノード１０４に送信する。よって、図７の下段には、ノード１０２からノード１０４に送信されるパケットとして、上記の（Ｆ−１）〜（Ｆ−４）と下記の（Ｆ−５）が例示されている。
【０２２２】
（Ｆ−５）第４層のＦＥＣパケットＦ４−１、Ｆ４−２、Ｆ４−３、およびＦ４−４
具体的には、第３層のブロックＢ３−１は、第４層の２つのブロックＢ４−１とＢ４−２を含み、第３層のブロックＢ３−２は、第４層の２つのブロックＢ４−３とＢ４−４を含む。また、第３層のブロックＢ３−３は、第４層の２つのブロックＢ４−５とＢ４−６を含み、第３層のブロックＢ３−４は、第４層の２つのブロックＢ４−７とＢ４−８を含む。よって、ノード１０２は次の（Ｇ−１）〜（Ｇ−１６）のようにしてＦＥＣパケットを追加し、階層を深くする。なお、以下の（Ｇ−１）〜（Ｇ−１６）の説明における「データパケット」とは、ノード１０２がノード１０１から受信したか、またはノード１０２が復元したデータパケットのことである。
【０２２３】
（Ｇ−１）ノード１０２は、ブロックＢ４−１に属するデータパケットＤ０〜Ｄ２をノード１０４に送信する。
（Ｇ−２）ノード１０２は、データパケットＤ０〜Ｄ２の排他的論理和を計算することにより、ブロックＢ４−１に対応する第４層のＦＥＣパケットＦ４−１を生成する。そして、ノード１０２は、ＦＥＣパケットＦ４−１をデータパケットＤ２の後に挿入する。つまり、ノード１０２は、データパケットＤ２に続けてＦＥＣパケットＦ４−１をノード１０４に送信する。
【０２２４】
（Ｇ−３）ノード１０２は、ブロックＢ４−２に属するデータパケットＤ３〜Ｄ５をノード１０４に送信する。なお、ブロックＢ４−２は、１つ上の第３層のブロックＢ３−１の中で最後のブロックなので、ブロックＢ４−２に対応する第４層のＦＥＣパケットは存在しない。
【０２２５】
（Ｇ−４）ノード１０２は、データパケットＤ５の直後のＦＥＣパケットＦ３−１をノード１０４に送信する。なお、ＦＥＣパケットＦ３−１は、ノード１０１からノード１０２へと送信されるので、ＦＥＣパケットＦ３−１自体が消失しない限り、ノード１０２は、ＦＥＣパケットＦ３−１を生成する必要はない。
【０２２６】
（Ｇ−５）ノード１０２は、ブロックＢ４−３に属するデータパケットＤ６〜Ｄ８をノード１０４に送信する。
（Ｇ−６）ノード１０２は、データパケットＤ６〜Ｄ８の排他的論理和を計算することにより、ブロックＢ４−３に対応する第４層のＦＥＣパケットＦ４−２を生成する。そして、ノード１０２は、データパケットＤ８の後に続けてＦＥＣパケットＦ４−２をノード１０４に送信する。
【０２２７】
（Ｇ−７）ノード１０２は、ブロックＢ４−４に属するデータパケットＤ９〜Ｄ１１をノード１０４に送信する。なお、ブロックＢ４−４に対応する第４層のＦＥＣパケットは存在しない。
【０２２８】
（Ｇ−８）ノード１０２は、データパケットＤ１１の直後のＦＥＣパケットＦ２−１をノード１０４に送信する。なお、ＦＥＣパケットＦ２−１は、ノード１０１からノード１０２へと送信されるので、ＦＥＣパケットＦ２−１自体が消失しない限り、ノード１０２は、ＦＥＣパケットＦ２−１を生成する必要はない。
【０２２９】
（Ｇ−９）ノード１０２は、ブロックＢ４−５に属するデータパケットＤ１２〜Ｄ１４をノード１０４に送信する。
（Ｇ−１０）ノード１０２は、データパケットＤ１２〜Ｄ１４の排他的論理和を計算することにより、ブロックＢ４−５に対応する第４層のＦＥＣパケットＦ４−３を生成する。そして、ノード１０２は、データパケットＤ１４の後に続けてＦＥＣパケットＦ４−３をノード１０４に送信する。
【０２３０】
（Ｇ−１１）ノード１０２は、ブロックＢ４−６に属するデータパケットＤ１５〜Ｄ１７をノード１０４に送信する。なお、ブロックＢ４−６に対応する第４層のＦＥＣパケットは存在しない。
【０２３１】
（Ｇ−１２）ノード１０２は、データパケットＤ１７の直後のＦＥＣパケットＦ３−２をノード１０４に送信する。なお、ＦＥＣパケットＦ３−２は、ノード１０１からノード１０２へと送信されるので、ＦＥＣパケットＦ３−２自体が消失しない限り、ノード１０２は、ＦＥＣパケットＦ３−２を生成する必要はない。
【０２３２】
（Ｇ−１３）ノード１０２は、ブロックＢ４−７に属するデータパケットＤ１８〜Ｄ２０をノード１０４に送信する。
（Ｇ−１４）ノード１０２は、データパケットＤ１８〜Ｄ２０の排他的論理和を計算することにより、ブロックＢ４−７に対応する第４層のＦＥＣパケットＦ４−４を生成する。そして、ノード１０２は、データパケットＤ２０の後に続けてＦＥＣパケットＦ４−４をノード１０４に送信する。
【０２３３】
（Ｇ−１５）ノード１０２は、ブロックＢ４−８に属するデータパケットＤ２１〜Ｄ２３をノード１０４に送信する。なお、ブロックＢ４−８に対応する第４層のＦＥＣパケットは存在しない。
【０２３４】
（Ｇ−１６）ノード１０２は、データパケットＤ２３の直後のＦＥＣパケットＦ１−１をノード１０４に送信する。なお、ＦＥＣパケットＦ１−１は、ノード１０１からノード１０２へと送信されるので、ＦＥＣパケットＦ１−１自体が消失しない限り、ノード１０２は、ＦＥＣパケットＦ１−１を生成する必要はない。
【０２３５】
以上の（Ｇ−１）〜（Ｇ−１６）から明らかなように、第１層から第３層までのＦＥＣパケットは、ＦＥＣパケット自体が消失しない限りは、ノード１０２が生成する必要はない。つまり、ノード１０２は、新たに深くした階層（すなわち図７の例では第４層）のＦＥＣパケットのみを新たに生成すればよい。
【０２３６】
したがって、本実施形態によれば、ＦＥＣパケットが挿入される割合をリンクのエラーレートの違いに応じて増やすための処理は、増やした階層のＦＥＣパケットの生成と送信だけである。つまり、中継ノードは、第１層からの全階層のＦＥＣパケットをすべて生成しなおす必要はない。
【０２３７】
よって、本実施形態によれば、中継ノードの処理負荷の増大を抑制しつつ、ＦＥＣパケットが挿入される割合をエラーレートに応じて適切に上昇させることができる。例えば、上記の図７の例におけるノード１０２は、第４層のＦＥＣパケットを新たに生成および送信するだけで、ＦＥＣパケットが挿入される割合を、１／６（つまり、６個のデータパケットあたり１個のＦＥＣパケット）から１／３に上昇させることができる。
【０２３８】
もちろん、本実施形態によれば、ノード１０２以外のどの中継ノードも、上記と同様にして、ＦＥＣパケットを追加することで、ＦＥＣパケット階層を深くすることができる。
また、上記の例では、ノード１０２が１つだけ階層を深くしているが、中継ノードは、２階層以上のＦＥＣパケットを新たに追加してもよい。例えば、ノード１０２とノード１０４の間のリンクのエラーレートが非常に高ければ、ノード１０４にとって十分な誤り訂正能力は、第４層までのＦＥＣパケットだけでは得られないかもしれない。その場合、ノード１０２は、図７には不図示の第５層のＦＥＣパケットもさらに生成し、ノード１０４に送信することが好ましい。
【０２３９】
なお、その場合、第５層の各ブロックには、１つまたは２つのデータパケットが属する。つまり、同じ階層のブロック同士は、異なるブロックサイズであってもよい。
以上、図１〜７を参照して本実施形態について説明したが、上記で説明したノードは、例えば図８〜９のような構成を有する転送装置であってもよい。
【０２４０】
図８は、転送装置のハードウェア構成図である。図８の転送装置２００は、図３の各ノードとして動作する、ルータまたは汎用的なコンピュータの例である。
転送装置２００は、プログラムを実行するＣＰＵ（Central Processing Unit）２０１と、ワークエリア用のＲＡＭ（Random Access Memory）２０２を備える。つまり、本実施形態の転送装置２００としてのルータは、ＣＰＵ２０１を有するコンピュータの一種でもある。
【０２４１】
転送装置２００がルータの場合には、ＲＡＭ２０２は、ルーティングテーブルを格納していてもよい。また、転送装置２００が、ＡＬＭの配信ツリーにノードとして含まれる汎用的なコンピュータの場合は、ＲＡＭ２０２は、配信ツリーにおいて転送装置２００の子ノードであるノードのアドレスを記憶していてもよい。
【０２４２】
また、転送装置２００は、ネットワーク２１０または不図示のケーブルを介して他の装置と通信するための通信インタフェイス２０３を備える。通信インタフェイス２０３は、有線インタフェイス、無線インタフェイス、または両者の組み合わせである。
【０２４３】
ネットワーク２１０は、例えばＬＡＮ（Local Area Network）、ＷＡＮ（Wide Area Network）、インターネット、またはそれらの組み合わせでもよい。例えば転送装置２００が図３のノード１０２である場合、転送装置２００は、ネットワーク２１０または不図示のケーブルを介して、少なくともノード１０１と１０４と１０５に接続されている。
【０２４４】
転送装置２００はさらに、キーボードやポインティングデバイスなどの入力装置２０４と、ディスプレイやスピーカなどの出力装置２０５を備えていてもよい。また、転送装置２００は、ＲＯＭ（Read Only Memory）、ＨＤＤ（Hard Disk Drive）、フラッシュメモリなどの不揮発性記憶装置２０６を備える。
【０２４５】
転送装置２００は、さらにコンピュータ読み取り可能な記憶媒体２０９の駆動装置２０７を有していてもよい。記憶媒体２０９の例は、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク、磁気ディスク、半導体メモリカード等である。なお、記憶媒体２０９は、有形の（tangible）媒体であり、信号搬送波のような一時的な（transitory）媒体ではない。
【０２４６】
図８の例では、ＣＰＵ２０１、ＲＡＭ２０２、通信インタフェイス２０３、入力装置２０４、出力装置２０５、不揮発性記憶装置２０６、および駆動装置２０７が互いにバス２０８で接続されている。しかし、図８とは異なる構成のコンピュータを転送装置２００として利用する実施形態も可能である。
【０２４７】
ＣＰＵ２０１が実行するプログラムは、例えば、予め不揮発性記憶装置２０６に格納されていてもよい。または、プログラムは、プログラム提供者２１１から、ネットワーク２１０と通信インタフェイス２０３を介して、不揮発性記憶装置２０６にダウンロードされて格納されてもよい。あるいは、プログラムは記憶媒体２０９に格納されていてもよい。この場合、記憶媒体２０９が駆動装置２０７にセットされ、プログラムが駆動装置２０７を介して記憶媒体２０９から読み込まれて不揮発性記憶装置２０６にコピーされてもよい。
いずれにしろ、ＣＰＵ２０１は、プログラムをＲＡＭ２０２にロードし、ロードしたプログラムを実行することができる。
【０２４８】
図９は、転送装置の機能構成図である。図９の転送装置３００は、具体的には、例えば図８に示す各種ハードウェアを備える転送装置２００により実現されてもよい。また、転送装置３００は、ネットワークを介して間接的に、あるいは光ファイバなどの伝送媒体を介して直接的に、送信元装置３１０および送信先装置３２０と接続されている。
【０２４９】
例えば、送信元装置３１０と転送装置３００と送信先装置３２０がルータである場合、転送装置３００は、送信元装置３１０および送信先装置３２０と、光ファイバなどの伝送媒体を介して接続される。逆に、送信元装置３１０と転送装置３００と送信先装置３２０が、ＡＬＭの配信ツリーにノードとして含まれる汎用的なコンピュータである場合、転送装置３００は、送信元装置３１０および送信先装置３２０と、ネットワークを介して接続される。
【０２５０】
本実施形態では、送信元装置３１０および送信先装置３２０も、図８の転送装置２００と同様のハードウェアを有し、図９の転送装置３００と同様の機能を有する。なお、図９には、中継ノードとして動作する転送装置３００を図示してある。転送装置３００が根ノードまたは葉ノードとして動作する場合については、後述する。
【０２５１】
転送装置３００は、受信部３０１とバッファ部３０２と判断部３０３と復元部３０４と取得部３０５と生成部３０６と送信部３０７と指示部３０８を有する。
受信部３０１は、送信元装置３１０からデータパケットとＦＥＣパケットを受信し、受信したパケットをバッファ部３０２に出力する。受信部３０１は、図８の通信インタフェイス２０３とＣＰＵ２０１により実現されてもよい。
【０２５２】
また、受信部３０１は、受信したパケットから、パケットロスを検出するための情報（以下「検出用情報」という）を抽出し、抽出した検出用情報を判断部３０３に出力する。検出用情報の具体例は後述するが、例えばパケットのヘッダに含まれるシーケンス番号でもよい。さらに、受信部３０１は、パケットを受信したことを復元部３０４に通知する。
【０２５３】
また、バッファ部３０２は、パケットを保持する不図示のメモリと、メモリの管理を行う不図示の制御部とを含む。パケットを保持するメモリは、例えば図８のＲＡＭ２０２である。制御部は、例えばＣＰＵ２０１により実現される。
【０２５４】
例えば、バッファ部３０２内の上記制御部は、メモリの使用状況を示す情報を管理するメモリ管理テーブルをＲＡＭ２０２上に作成し、メモリ管理テーブルを参照しながら、メモリの割り当てや解放を行う。メモリ管理テーブルは、メモリ内のパケットの先頭アドレスを示すフィールドを有し、パケットサイズやパケット識別情報などを示すフィールドをさらに有していてもよい。パケット識別情報としては、例えば、データパケットとＦＥＣパケットを区別するための情報、データパケットにおけるシーケンス番号、ＦＥＣパケットの階層を示す情報、などが利用可能である。
【０２５５】
したがって、バッファ部３０２は、メモリ管理テーブルを参照することで、他の構成要素（例えば復元部３０４や生成部３０６など）から指定された階層のＦＥＣパケットがメモリのどこに格納されているかを認識することもできる。また、同様にしてバッファ部３０２は、他の構成要素から指定された順番のデータパケットがメモリのどこに格納されているかを認識することもできる。
【０２５６】
例えば、バッファ部３０２は、復元部３０４から指定されたパケットの先頭アドレスを以上のようにして認識し、認識した先頭アドレスを復元部３０４に通知してもよい。当該通知により復元部３０４は、指定したパケットのデータを読み取ることができる。例えば以上のようにして、復元部３０４と生成部３０６と送信部３０７は、バッファ部３０２にアクセスすることにより、パケットを読み出したり、新たなパケットをバッファ部３０２上に生成したりすることができる。
【０２５７】
判断部３０３は、受信部３０１から出力された検出用情報を用いて、パケットロスが発生したか否かを判断する。そして、判断部３０３は、パケットロスが発生したか否か（すなわち、消失したパケットがあるか否か）の判断結果を、復元部３０４と指示部３０８に通知する。また、パケットロスが発生した場合、判断部３０３は、消失したパケットを特定するためのパケット識別情報を、判断結果の一部として復元部３０４に通知する。判断部３０３は、例えばＣＰＵ２０１により実現される。
【０２５８】
復元部３０４は、例えばＣＰＵ２０１により実現される。復元部３０４は、受信部３０１からの通知と判断部３０３からの通知に基づいて、パケットを復元する処理を行うか否かを決定する。また、消失したパケットがある場合、復元部３０４は、判断部３０３から通知されるパケット識別情報から、復元する対象のパケットを認識する。
【０２５９】
そして、消失したパケットがある場合、復元部３０４は以下の処理を行う。すなわち、復元部３０４は、バッファ部３０２から復元に用いるパケットを読み出し、読み出したパケットから消失したパケットを復元し、復元したパケットをバッファ部３０２に出力する。復元部３０４によるパケットの復元は、具体的には図５を参照して説明したとおりである。
【０２６０】
なお、或るパケットが消失した場合に、復元部３０４は、他のどのパケットを用いれば消失したパケットを復元することができるのかを、消失したパケットのパケット識別情報から認識することが可能である。具体的には、例えば、復元部３０４は、復元に用いるパケットを認識するために、図１４とともに後述するブロック管理テーブル５００を参照してもよい。
【０２６１】
また、復元部３０４は、パケットの受信の復元の進捗を示す情報（以下「進捗情報」という）を生成部３０６と送信部３０７に通知してもよい。
例えば、図５の例で、受信部３０１が、データパケットＤ１を受信した後に、データパケットＤ２を受信せずに、データパケットＤ３を受信した場合、判断部３０３がデータパケットＤ２の消失を検出する。しかし、復元部３０４はデータパケットＤ２の復元処理を開始するのは、ＦＥＣパケットＦ３−１が受信された後である。そこで、復元部３０４は、例えば「データパケットＤ３まで受信が完了しているが、データパケットＤ２は消失しており、データパケットＤ２の復元はまだ開始していない」といった進捗情報を出力してもよい。
【０２６２】
取得部３０５は、転送装置３００から送信先装置３２０への送信において第何階層までのＦＥＣパケットが挿入されることが望ましいかを示す情報（以下「第１の階層情報」という）を、送信先装置３２０から取得する。さらに、取得部３０５は、取得した第１の階層情報を生成部３０６に通知する。取得部３０５は、例えばＣＰＵ２０１と通信インタフェイス２０３により実現される。
【０２６３】
例えば、転送装置３００と送信先装置３２０の間の通信路のエラーレートに鑑みて、或る時点では、第３層までのＦＥＣパケットだけで、送信先装置３２０にとって適切な誤り訂正能力が得られるかもしれない。この場合、送信先装置３２０は、第３層を示す第１の階層情報を転送装置３００に送信する。よって、取得部３０５は、第３層を示す第１の階層情報を取得する。
【０２６４】
生成部３０６は、必要に応じて、転送装置３００が送信元装置３１０から受信した中では最下層のＦＥＣパケットよりも、さらに深い階層のＦＥＣパケットを生成する。そして、生成部３０６は、生成したＦＥＣパケットをバッファ部３０２に出力するとともに、ＦＥＣパケットを生成したことを送信部３０７に通知する。生成部３０６は、例えばＣＰＵ２０１により実現される。
【０２６５】
具体的には、生成部３０６は、取得部３０５から出力される第１の階層情報から、図７のような階層を深くする処理を行うか否かを決定する。また、生成部３０６は、階層を深くする処理を行う場合に、復元部３０４から出力される進捗情報から、より深い階層のＦＥＣパケットをいつ生成するかを決定してもよい。
【０２６６】
例えば、以下の（Ｈ−１）〜（Ｈ−３）がすべて成立する場合、生成部３０６は、復元部３０４から出力される進捗情報が（Ｈ−１）を示した後でありさえすれば、データパケットＤ３〜Ｄ５の受信を待つことなく、ＦＥＣパケットＦ４−１を生成してもよい。
【０２６７】
（Ｈ−１）図７のように、データパケットＤ０〜Ｄ２が消失せずに受信された。
（Ｈ−２）取得部３０５から通知された第１の階層情報が第４層を示している。
（Ｈ−３）送信元装置３１０からは第３層までのＦＥＣパケットが転送装置３００に送信されており、第４層のＦＥＣパケットは送信されていない。
【０２６８】
また、上記（Ｈ−２）〜（Ｈ−３）と下記（Ｈ−４）が成立する場合、生成部３０６は、復元部３０４から出力される進捗情報が「データパケットＤ２の復元が完了した」と示すようになってはじめて、ＦＥＣパケットＦ４−１を生成することができる。
【０２６９】
（Ｈ−４）図５のように、データパケットＤ０とＤ１は受信されたが、データパケットＤ２が消失した。
また、上記（Ｈ−２）〜（Ｈ−３）とは逆に、例えば下記（Ｈ−５）〜（Ｈ−６）が成立する場合、生成部３０６は、「新たにＦＥＣパケットを生成する必要はない」と判断する。
【０２７０】
（Ｈ−５）取得部３０５から通知された第１の階層情報が第３層を示している。
（Ｈ−６）送信元装置３１０から転送装置３００に送信されるＦＥＣパケットの最大の深さは、第３層以上である。
【０２７１】
送信部３０７は、バッファ部３０２からパケットを読み出して送信先装置３２０に送信する。なお、送信部３０７は、復元部３０４と生成部３０６からの通知により、送信先装置３２０へ送信するパケットがバッファ部３０２中に保持されているか、それともまだ保持されていないかを認識することができる。
【０２７２】
送信部３０７は、さらに、送信し終わったパケットをメモリから削除するようバッファ部３０２に依頼する。すると、バッファ部３０２は、依頼にしたがい、送信し終わったパケットを記憶していたメモリ領域を解放する。なお、送信部３０７は、例えばＣＰＵ２０１と通信インタフェイス２０３により実現される。
【０２７３】
また、指示部３０８は、受信されたパケットの数と消失したパケットの数から、エラーレートを算出する。そして、指示部３０８は、送信元装置３１０から転送装置３００への送信において、第何階層までのＦＥＣパケットが挿入されることが望ましいかを示す情報（以下「第２の階層情報」という）を、エラーレートから算出する。指示部３０８は、第２の階層情報を送信元装置３１０に送信する。
【０２７４】
なお、具体的な算出方法は後述するが、第２の階層情報は、誤り訂正前のエラーレートと、決められた訂正性能から算出される。また、訂正性能は、例えば、誤り訂正後に許容されるエラーレートによって表されてもよい。
そして、上記のように動作する指示部３０８は、例えば、ＣＰＵ２０１と通信インタフェイス２０３により実現される。
【０２７５】
ところで、上記の説明は、階層そのものを示す情報が、第１と第２の階層情報として装置間で送信される場合についての例示である。例えば、第１と第２の階層情報は、「３」という数値によって「第３層」を示してもよい。
【０２７６】
このように階層そのものを示す情報が第１と第２の階層情報として装置間で送信される場合、取得部３０５は、単に送信先装置３２０から第１の階層情報を取得すればよい。他方で、指示部３０８は、エラーレート（換言すればパケットの消失率）から第２の階層情報を算出する処理を行う。
【０２７７】
しかし、もちろん実施形態によっては、階層そのものを示す情報以外の情報が、装置間で送信されてもよい（つまり、送信先装置３２０から取得部３０５に送信されてもよいし、指示部３０８から送信元装置３１０に送信されてもよい）。例えば、「２」という正の数値によって、最下層をあと２層深くすることを要求する情報が、装置間で送信されてもよい。同様に、「−１」という負の数値によって、最下層をあと１層浅くすることを要求する情報が、装置間で送信されてもよい。
【０２７８】
このように、現在の最下層の深さとの差分が装置間で送信される場合、取得部３０５は、送信先装置３２０から取得した差分値を、送信先装置３２０の現在の最下層の深さと足すことで、送信先装置３２０の新たな最下層の深さを示す第１の階層情報を取得する。また、指示部３０８は、送信元装置３１０と転送装置３００の間のエラーレートから適切な階層の深さを算出し、さらに、算出した深さから現在の転送装置３００にとっての最下層の深さを引くことで、送信元装置３１０に送信する差分値を算出する。
【０２７９】
あるいは、エラーレートを示す情報が、装置間で送信されてもよい。例えば、「転送装置３００と送信先装置３２０の間のリンクのエラーレートは２％である」と示す「０．０２」という数値が送信先装置３２０から取得部３０５に送信されてもよい。
【０２８０】
このようにエラーレートを示す情報が装置間で送信される場合、上記の例とは逆に、取得部３０５は、送信先装置３２０から取得したエラーレートから、当該エラーレートに適した最下層の深さを、第１の階層情報として算出する。そして、取得部３０５は、算出した第１の階層情報を生成部３０６に通知する。また、指示部３０８は、層の深さについての計算を行うことなく、単に、送信元装置３１０と転送装置３００の間のリンクについて認識したエラーレートを送信元装置３１０に通知すればよい。
【０２８１】
また、上記のとおり転送装置３００は、中継ノードとして動作することができるだけでなく、根ノードまたは葉ノードとしても動作することができる。
根ノードとして動作する転送装置３００は、受信部３０１と判断部３０３と復元部３０４と指示部３０８を持たなくてもよい。その代わり、根ノードとして動作する転送装置３００は、データパケットを生成してバッファ部３０２に出力する不図示のデータパケット供給部を有する。
【０２８２】
転送装置３００がルータである場合、データパケット供給部は、例えば、ルータ自身が管理するネットワーク（例えばＬＡＮ）内のコンピュータからデータパケットを受け取り、受け取ったデータパケットをバッファ部３０２に供給（つまり出力）する。この場合、データパケット供給部は、例えば通信インタフェイス２０３とＣＰＵ２０１により実現されてもよい。
【０２８３】
また、転送装置３００が、ＡＬＭの配信ツリーにノードとして含まれる汎用的なコンピュータである場合、データパケット供給部は、データパケットを生成し、生成したデータパケットをバッファ部３０２に供給（つまり出力）する。この場合、データパケット供給部は、例えばＣＰＵ２０１により実現されてもよいし、ＣＰＵ２０１と入力装置２０４により実現されてもよい。例えば、入力装置２０４がカメラまたはマイクを含み、入力装置２０４から入力されるデータを使ってＣＰＵ２０１がデータパケットを生成してもよい。
【０２８４】
そして、転送装置３００が根ノードとして動作する場合、生成部３０６は、第１層から、取得部３０５から出力される第１の階層情報が示す最下層までのすべての階層のＦＥＣパケットを、バッファ部３０２に保持されているデータパケットを用いて生成する。
【０２８５】
また、葉ノードとして動作する転送装置３００は、取得部３０５と生成部３０６と送信部３０７を持たなくてもよい。さらに、葉ノードとして動作する転送装置３００は、受信または復元されてバッファ部３０２に格納されたデータパケットに関する上位レイヤの処理を行う不図示の上位レイヤ処理部をさらに含む。例えば、上位レイヤ処理部は、ＣＰＵ２０１により実現されてもよいし、ＣＰＵ２０１と出力装置２０５により実現されてもよい。例えば、データパケットのペイロードが動画データである場合、ＣＰＵ２０１は、ディスプレイとスピーカを含む出力装置２０５を制御して、出力装置２０５に動画の出力を行わせてもよい。なお、中継ノードとして動作する転送装置３００も、上位レイヤ処理部を含んでいてもよい。
【０２８６】
また、図９の転送装置３００を実現するためのハードウェアは、図８に例示したハードウェアには限らない。例えば、判断部３０３、復元部３０４、および生成部３０６の一部または全部は、プログラムを実行するＣＰＵ２０１の代わりに、ハードウェア回路を用いて実現されてもよい。ハードウェア回路としては、例えば、ＦＰＧＡ（Field Programmable Gate Array）のようなリコンフィギュラブル回路も利用可能であるし、ＡＳＩＣ（Application Specific Integrated Circuit）も利用可能である。
【０２８７】
本実施形態のＦＥＣパケットは、排他的論理和演算という比較的単純な演算によって定義される。したがって、ＦＥＣパケットの生成処理と、ＦＥＣパケットを用いたデータパケットの復元処理は、ハードウェア回路にも適している。よって、処理の高速化を図るため、例えば復元部３０４と生成部３０６は、ＣＰＵ２０１の代わりにハードウェア回路によって実現されてもよい。
続いて、本実施形態の利点についての理解を助けるため、図１０〜１２を参照して、本実施形態と比較例とを比べる。
【０２８８】
図１０は、階層化されていないＦＥＣパケットを利用する比較例の図である。すなわち、図１０の比較例では、特定の数のデータパケットごとに１個の割合で階層化されていないＦＥＣパケットが挿入される。ＦＥＣパケットが階層化されていない場合、ＦＥＣパケットが挿入される割合をエラーレートに応じて変化させるには、上記「特定の数」を変化させる必要がある。
【０２８９】
例えば、本実施形態に関する上述の図１、２、４〜７の具体例では、第１層のブロックサイズが２４であり第２層のブロックサイズが１２である。そこで、図１０では、比較例において上記「特定の数」が２４から１２に変更される場合を例示する。
【０２９０】
ここで、図１０の比較例と本実施形態との違いを説明する便宜上、例えば、次の（Ｉ−１）〜（Ｉ−３）のように仮定する。
（Ｉ−１）図３のネットワーク１００内の各ノードが比較例にしたがって動作する。
【０２９１】
（Ｉ−２）ノード１０３からノード１０６へ送信される一連のパケットでは、２４個のデータパケットごとに１個の割合でＦＥＣパケットが挿入される。
（Ｉ−３）ノード１０６からノード１１０へ送信される一連のパケットでは、１２個のデータパケットごとに１個の割合でＦＥＣパケットが挿入される。
【０２９２】
仮定（Ｉ−１）〜（Ｉ−３）が意味するのは、階層化されないＦＥＣパケットがデータパケットに挿入される割合を１／２４から１／１２に変更する、という処理を、ノード１０６が行うということである。仮定（Ｉ−１）〜（Ｉ−３）のもとでデータパケットＤ０〜Ｄ４７がノード１０３からノード１０６を介してノード１１０へ送信される場合を例として、より詳しく説明すると、図１０の比較例では次のような処理が行われる。
【０２９３】
ノード１０３からノード１０６への送信においては、ブロックサイズが２４の非階層化ブロックＢａ−１に属するデータパケットＤ０〜Ｄ２３が送信され、その後、データパケットＤ０〜Ｄ２３から生成されるＦＥＣパケットＦａ−１が送信される。そして、ブロックサイズが２４の非階層化ブロックＢａ−２に属するデータパケットＤ２４〜Ｄ４７が送信され、その後、データパケットＤ２４〜Ｄ４７から生成されるＦＥＣパケットＦａ−２が送信される。ここで、ＦＥＣパケットＦａ−１とＦａ−２は、式（１０．１）と（１０．２）のように表される。
【０２９４】
[Fa-1]=[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]^
[D12]^[D13]^[D14]^[D15]^[D16]^[D17]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]          (10.1)
【０２９５】
[Fa-2]=[D24]^[D25]^[D26]^[D27]^[D28]^[D29]^
[D30]^[D31]^[D32]^[D33]^[D34]^[D35]^
[D36]^[D37]^[D38]^[D39]^[D40]^[D41]^
[D42]^[D43]^[D44]^[D45]^[D46]^[D47]          (10.2)
式（１．６）と（１０．１）より、［Ｆ１−１］＝［Ｆａ−１］である。また、式（２．４）と（１０．２）より、［Ｆ１−２］＝［Ｆａ−２］である。
【０２９６】
また、ノード１０６からノード１１０への送信においては、ブロックサイズが１２の非階層化ブロックＢｂ−１に属するデータパケットＤ０〜Ｄ１１が送信され、その後、データパケットＤ０〜Ｄ１１から生成されるＦＥＣパケットＦｂ−１が送信される。そして、ブロックサイズが１２の非階層化ブロックＢｂ−２に属するデータパケットＤ１２〜Ｄ２３が送信され、その後、データパケットＤ１２〜Ｄ２３から生成されるＦＥＣパケットＦｂ−２が送信される。
【０２９７】
さらに、ブロックサイズが１２の非階層化ブロックＢｂ−３に属するデータパケットＤ２４〜Ｄ３５が送信され、その後、データパケットＤ２４〜Ｄ３５から生成されるＦＥＣパケットＦｂ−３が送信される。そして、ブロックサイズが１２の非階層化ブロックＢｂ−４に属するデータパケットＤ３６〜Ｄ４７が送信され、その後、データパケットＤ３６〜Ｄ４７から生成されるＦＥＣパケットＦｂ−４が送信される。
【０２９８】
ここで、ＦＥＣパケットＦｂ−１〜Ｆｂ−４は、式（１０．３）〜（１０．６）により表される。
【０２９９】
[Fb-1]=[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]              (10.3)
【０３００】
[Fb-2]=[D12]^[D13]^[D14]^[D15]^[D16]^[D17]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]          (10.4)
【０３０１】
[Fb-3]=[D24]^[D25]^[D26]^[D27]^[D28]^[D29]^
[D30]^[D31]^[D32]^[D33]^[D34]^[D35]          (10.5)
【０３０２】
[Fb-4]=[D36]^[D37]^[D38]^[D39]^[D40]^[D41]^
[D42]^[D43]^[D44]^[D45]^[D46]^[D47]          (10.6)
【０３０３】
式（１．７）と（１０．３）より、［Ｆ２−１］＝［Ｆｂ−１］である。しかし、データパケットＤ２３の直後に挿入されるという点では共通の、本実施形態のＦＥＣパケットＦ１−１と、比較例のＦＥＣパケットＦｂ−２とを比べると、式（１．６）と（１０．４）のとおり、［Ｆ１−１］≠［Ｆｂ−２］である。
【０３０４】
すなわち、仮定（Ｉ−１）〜（Ｉ−３）のもとでノード１０６は、新たにＦＥＣパケットＦｂ−１を生成するだけでなく、新たにＦＥＣパケットＦｂ−２を生成することになる。つまり、比較例におけるノード１０６は、ノード１０３から受信したＦＥＣパケットＦａ−１をそのまま転送する代わりに、新たにＦＥＣパケットＦｂ−２を生成し、生成したＦＥＣパケットＦｂ−２を送信する。
【０３０５】
同様に、式（２．２）と（１０．５）より、［Ｆ２−２］＝［Ｆｂ−３］である。しかし、データパケットＤ４７直後に挿入されるという点では共通の、本実施形態のＦＥＣパケットＦ１−２と、比較例のＦＥＣパケットＦｂ−４を比べると、式（２．４）と（１０．６）のとおり、［Ｆ１−２］≠［Ｆｂ−４］である。
【０３０６】
すなわち、仮定（Ｉ−１）〜（Ｉ−３）のもとでノード１０６は、新たにＦＥＣパケットＦｂ−２を生成するだけでなく、新たにＦＥＣパケットＦｂ−４を生成することになる。つまり、比較例におけるノード１０６は、ノード１０３から受信したＦＥＣパケットＦａ−２をそのまま転送する代わりに、新たにＦＥＣパケットＦｂ−４を生成し、生成したＦＥＣパケットＦｂ−４を送信する。
【０３０７】
したがって、ＦＥＣパケットが挿入される割合を増やすために中継ノードに生じる処理負荷は、比較例の方が本実施形態よりも高い。
また、ＦＥＣパケットが挿入される割合を減らすために中継ノードに生じる処理負荷も、比較例の方が本実施形態よりも高い。例えば、ＦＥＣパケットが挿入される割合を１／１２から１／２４に減らす場合を例として理由を説明すると、次のとおりである。
【０３０８】
式（１０．１）と（１０．４）より［Ｆａ−１］≠［Ｆｂ−２］であり、式（１０．２）と（１０．６）より［Ｆａ−２］≠［Ｆｂ−４］である。したがって、ＦＥＣパケットが挿入される割合を１／１２から１／２４に減らすためには、比較例の中継ノードは、受信したＦＥＣパケットＦｂ−２とＦｂ−４を使うことはできず、新たにＦＥＣパケットＦａ−１とＦａ−２を生成しなくてはいけない。ＦＥＣパケットの生成は、単に受信したＦＥＣパケットのうちのＦＥＣパケットＦｂ−１とＦｂ−３の転送をやめるのに比べて、当然処理負荷が高い。
【０３０９】
以上説明したように、処理負荷の観点から、本実施形態は比較例よりも優れている。そして、本実施形態のこの利点は、或る中継ノードが多くの子ノードにデータパケットを転送する場合に特に顕著である。
【０３１０】
なぜなら、複数の子ノードそれぞれとの間の各リンクのエラーレートは、一般的には、まちまちだからである。もし、比較例の中継ノードが、異なるエラーレートに合わせた割合でＦＥＣパケットを生成しようとすると、例えば「ＦＥＣパケットＦａ−１をすべての子ノードに共通して使う」といったことができないので、子ノードの数の増大に応じて処理負荷が増大する。それに対し、本実施形態の中継ノードは、上位階層（例えば第１層）のＦＥＣパケットをすべての子ノードに共通して使うことができる。よって、本実施形態の中継ノードが生成するＦＥＣパケットの数の増加は、比較例における増加と比べて、少なくて済む。
【０３１１】
図１１は、本実施形態では階層を深くしても処理量の増加が少ないことを説明する図である。図７を参照して説明したように、本実施形態では、ＦＥＣパケットの階層の最大の深さを第Ｎ層から第（Ｎ＋ΔＮ）階層にするために中継ノードは、第（Ｎ＋１）階層から第（Ｎ＋ΔＮ）階層までのＦＥＣパケットのみを生成すればよい。
【０３１２】
例えばＮ＝１でΔＮ＝１の場合、図１１に示すように、本実施形態の中継ノードは、第１層のＦＥＣパケットＦ１−１とＦ１−２に関しては、受信したＦＥＣパケットＦ１−１とＦ１−２をそのまま転送すればよい。そして、中継ノードは、第２層のＦＥＣパケットＦ２−１とＦ２−２だけを新たに生成すればよい。
【０３１３】
したがって、図１０と図１１を比べると、ＦＥＣパケットが挿入される割合を１／２４から１／１２に増やすに際して、４８個のデータパケットあたりに中継ノードが新たに生成するＦＥＣパケットの数は、比較例では４個、本実施形態では２個である。つまり、新たなＦＥＣパケットの生成のための処理負荷は、本実施形態では比較例の半分で済む。
【０３１４】
さて、上記のとおり本実施形態は比較例よりも処理負荷が少ないという利点があるが、この利点は、決して誤り訂正能力とトレードオフの関係にあるわけではない。つまり、本実施形態は、比較例と比べて、誤り訂正能力を低下させることなく、処理負荷の軽減を達成することができる。
【０３１５】
図１２は、本実施形態と比較例で訂正能力に差がないことを説明する図である。具体的に、図１２には、１２個のデータパケットに対して１個の割合でＦＥＣパケットが挿入される場合が例示されている。また、図１２において、上段は最下層が第２層である場合の本実施形態を表し、下段は比較例を表す。また、図１２では、データパケットＤ５、Ｄ１６、Ｄ２８、Ｄ３１、およびＤ４４が消失したという仮定のもとで、本実施形態と比較例それぞれによる誤り訂正が図示されている。
【０３１６】
本実施形態による中継ノードまたは葉ノード（具体的には図９の転送装置３００）は、データパケットＤ５が消失した場合、式（１２．１）によりデータパケットＤ５を復元することができる。
【０３１７】
[D5]=[D0]^[D1]^[D2]^[D3]^[D4]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]^[F2-1]         (12.1)
【０３１８】
また、比較例による中継ノードまたは葉ノードも、式（１２．２）によりデータパケットＤ５を復元することができる。
【０３１９】
[D5]=[D0]^[D1]^[D2]^[D3]^[D4]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]^[Fa-1]         (12.2)
【０３２０】
そして、本実施形態による中継ノードまたは葉ノードは、データパケットＤ１６が消失した場合、復元したデータパケットＤ５を用いて式（１２．３）によりデータパケットＤ１６を復元することができる。また、本実施形態による中継ノードまたは葉ノードは、データパケットＤ５を使わずに式（１２．４）によりデータパケットＤ１６を復元することもできる。このように２通りの復元が可能なことは、図５を参照して説明したとおりである。
【０３２１】
[D16]=[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]^
[D12]^[D13]^[D14]^[D15]^[D17]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]^[F1-1]    (12.3)
【０３２２】
[D16]=[F2-1]^[D12]^[D13]^[D14]^[D15]^[D17]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]^[F1-1]    (12.4)
【０３２３】
また、比較例による中継ノードまたは葉ノードは、式（１２．５）によりデータパケットＤ１６を復元することができる。
【０３２４】
[D16]=[D12]^[D13]^[D14]^[D15]^[D17]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]^[Fb-2]    (12.5)
【０３２５】
以上のように、大きさが１２のブロック（つまり、本実施形態では第２層のブロック、比較例では非階層化ブロック）内の１つのデータパケットが消失した場合、本実施形態でも比較例でも、消失したデータパケットは復元可能である。
【０３２６】
他方、大きさが１２のブロック内の２つ以上のデータパケット（図１２の例では、データパケットＤ２８とＤ３１）が消失した場合、本実施形態でも比較例でも、消失したデータパケットは復元不能である。つまり、１つのＦＥＣパケットによりカバーされる範囲で複数のデータパケットが消失すると、データパケットは復元不能である。なぜなら、本実施形態でも比較例でも、ＦＥＣパケットが排他的論理和演算により生成されているからである。
【０３２７】
また、以上のように復元不能だったデータパケットＤ２８とＤ３１を含むブロックの後のブロックで、さらにデータパケットＤ４４が消失した場合も、本実施形態と比較例に誤り訂正能力の差はない。なぜなら、本実施形態による中継ノードまたは葉ノードは、式（１２．６）によりデータパケットＤ４４を復元することができ、比較例による中継ノードまたは葉ノードは、式（１２．７）によりデータパケットＤ４４を復元することができるからである。
【０３２８】
[D44]=[F2-2]^[D36]^[D37]^[D38]^[D39]^[D40]^[D41]^
[D42]^[D43]^[D45]^[D46]^[D47]^[F1-2]          (12.6)
【０３２９】
[D44]=[D36]^[D37]^[D38]^[D39]^[D40]^[D41]^
[D42]^[D43]^[D45]^[D46]^[D47]^[Fb-4]          (12.7)
【０３３０】
以上例示したとおり、本実施形態によれば、誤り訂正能力の低下を招くことなく、比較例よりも処理負荷を少なくすることが可能となる。
【０３３１】
続いて、ＡＬＭに本実施形態が利用される場合を例にして、本実施形態についてさらに詳しく説明する。なお、以下では説明の便宜上、ＡＬＭにおけるデータ配信ツリーが図３のネットワーク１００のように構築されているとする。
【０３３２】
図１３は、転送装置３００が記憶する配信先管理テーブルの例を示す図である。図９には１つの送信先装置３２０のみを図示したが、転送装置３００は複数の送信先装置３２０にデータパケットを送信してもよい。例えば、転送装置３００が図３のノード１０４であるとき、２つのノード１０７と１０８の各々が送信先装置３２０に相当する。
【０３３３】
そこで、転送装置３００は、１つまたは複数の送信先装置３２０を管理するため、図１３のような配信先管理テーブル４００を管理する。配信先管理テーブル４００は、例えばＲＡＭ２０２上に記憶されてもよい。また、配信先管理テーブル４００は、図９の転送装置３００内の各部からアクセス可能である。
【０３３４】
転送装置３００がＺ（Ｚ≧１）個の送信先装置３２０にデータパケットを送信する場合、配信先管理テーブル４００はＺ個のエントリを含む。また、図１３の例では、各エントリは、以下の（Ｊ−１）〜（Ｊ−５）のフィールドを含む。
【０３３５】
（Ｊ−１）エントリを識別するための識別番号（図１３では「Ｎｏ．」と表記）。
（Ｊ−２）送信先装置３２０のＩＰ（Internet Protocol）アドレス。
（Ｊ−３）取得部３０５が取得した第１の階層情報が示す階層。
【０３３６】
（Ｊ−４）（Ｊ−３）の階層のブロックサイズ。
（Ｊ−５）送信先装置３２０から通知された、転送装置３００と送信先装置３２０の間のエラーレート。
【０３３７】
例えば、図１３の例では、「１」という識別番号で識別される１番目のエントリは、「１９５．１７３．１．２００」というＩＰアドレスで識別される送信先装置３２０に関するエントリである。そして、１番目のエントリに対応する送信先装置３２０が転送装置３００に通知してきたエラーレートは「０．０２」（つまり２％）である。そして、１番目のエントリは、「２％というエラーレートに対して十分な誤り訂正能力を供給するには、ブロックサイズが２４の第１層のブロックに対応するＦＥＣパケットだけで十分である」ということを示している。
【０３３８】
もちろん、（Ｊ−２）のＩＰアドレスによって個々の送信先装置３２０は識別可能なので、（Ｊ−１）の識別番号フィールドは省略可能である。
また、本実施形態では、各階層のブロックサイズは、ネットワーク内の全ノード（例えば図３のノード１０１〜１１１）で共通の定数として予め決められているので、（Ｊ−４）のブロックサイズフィールドも省略可能である。図１３では、本実施形態についての理解を助けるために、（Ｊ−３）の階層フィールドに示された値に対応する値が（Ｊ−４）のブロックサイズフィールドに示されている。
【０３３９】
また、（Ｊ−５）のエラーレートフィールドも、なくてもよい。例えば、送信先装置３２０から取得部３０５が受信する情報が、階層そのものを示す値の場合、取得部３０５は、送信先装置３２０から受信した値を、送信先装置３２０に対応するエントリ中の（Ｊ−３）の階層フィールドに上書きするだけでよい。よって、（Ｊ−５）のエラーレートフィールドはなくてもよい。
【０３４０】
また、送信先装置３２０から取得部３０５が受信する情報が、現在の最下層の深さとの差分を示す値の場合、取得部３０５は、送信先装置３２０から受信した差分値と、送信先装置３２０に対応するエントリ中の（Ｊ−３）の階層フィールドの現在の値を足す。そして、取得部３０５は、加算結果を（Ｊ−３）の階層フィールドに上書きする。よって、差分値が送信先装置３２０から送信される場合も、（Ｊ−５）のエラーレートフィールドはなくてもよい。
【０３４１】
送信先装置３２０から取得部３０５が受信する情報が、エラーレートを示す情報である場合、取得部３０５は、送信先装置３２０から受信した情報から、エラーレートに適した階層の深さを算出する。そして、算出した値を、送信先装置３２０に対応するエントリ中の（Ｊ−３）の階層フィールドに上書きする。よって、エラーレートを示す情報が送信先装置３２０から送信される場合も、（Ｊ−５）のエラーレートフィールドは、必ずしも必要ではない。
【０３４２】
しかし図１３に示すように、配信先管理テーブル４００が（Ｊ−５）のエラーレートフィールドを含んでいてもよい。その場合、取得部３０５は送信先装置３２０から通知されたエラーレートの値を（Ｊ−５）のエラーレートフィールドに上書きする。
【０３４３】
なお、送信先装置３２０から取得部３０５への通知と、指示部３０８から送信元装置３１０への通知は、例えば、ＩＰパケットの形で送られてもよい。よって、取得部３０５は、複数の送信先装置３２０のうちのいずれか１つから通知を受けると、通知の送信元ＩＰアドレスから、通知を送信してきた送信先装置３２０に対応する配信先管理テーブル４００内のエントリを特定することができる。つまり、取得部３０５は、ＩＰパケット中の送信元ＩＰアドレスから、配信先管理テーブル４００のどのエントリを更新すればよいのかを認識することができる。
【０３４４】
また、本実施形態では、ＡＬＭにおいて使われるポート番号（例えばＵＤＰ（User Datagram Protocol）のポート番号）が予め決められている。しかし、実施形態によっては、ポート番号はノードごとにまちまちであってもよい。その場合には、配信先管理テーブル４００がさらにポート番号のフィールドを含む。
なお、配信先管理テーブル４００は、エントリを持たない状態から、例えば以下のようにして初期化されてもよい。
【０３４５】
ＡＬＭには様々な種類があるが、典型的には、データパケットの配信に先立つ配信ツリーの構築フェーズにおいて、親ノードに子ノードを認識させるための通信が、子ノードと親ノードの間で行われる。同様の通信は、データパケットの配信中の、配信ツリーの動的な再構築フェーズにおいても行われ得る。
【０３４６】
つまり、配信ツリーの構築または再構築のフェーズでは、転送装置３００は送信元装置３１０に対して、転送装置３００を送信元装置３１０の子ノードとして登録するよう、要求する。同様に、送信先装置３２０は転送装置３００に対して、送信先装置３２０を転送装置３００の子ノードとして登録するよう、要求する。
【０３４７】
例えば、取得部３０５が、送信先装置３２０から上記の要求を受け付けてもよい。すると、取得部３０５は、配信先管理テーブル４００に新規エントリを追加し、新規エントリに新たな識別番号を割り当て、送信先装置３２０のＩＰアドレスを新規エントリのＩＰアドレスフィールドに設定する。また、取得部３０５は、階層フィールドとブロックサイズフィールドに適宜のデフォルト値を設定する。例えば、デフォルトの階層が第２層の場合、ブロックサイズのデフォルト値は第２層に対応する１２である。取得部３０５は、エラーレートフィールドには特に値を設定しなくてよい。
【０３４８】
以上のように、配信ツリーの構築または再構築のフェーズにおける、新たな送信先装置３２０からの要求を契機として、配信先管理テーブル４００にはエントリが作成される。作成されたエントリの階層、ブロックサイズ、エラーレートの各フィールドの値は、実際のデータパケット配信が始まると、リンクの状態に応じて動的かつ適切に書き換えられてゆく。
【０３４９】
図１４は、転送装置３００が記憶するブロック管理テーブルの例を示す図である。図９の転送装置３００は、図１４のようなブロック管理テーブル５００を参照することにより、ブロックとＦＥＣパケットの階層構造を認識する。ブロック管理テーブル５００は、例えばＲＡＭ２０２上に記憶されてもよい。また、ブロック管理テーブル５００は、転送装置３００内の各部からアクセス可能である。
【０３５０】
ブロック管理テーブル５００に含まれる各エントリは、「階層」、「ブロックの開始番号」、「ブロックの終了番号」という３つのフィールドを有する。各エントリは、１つのブロックに対応する。より正確には、ＦＥＣパケットの生成対象のブロックを表すエントリのみがブロック管理テーブル５００に含まれ、対応するＦＥＣパケットが定義されないブロック（例えばブロックＢ２−２など）を表すエントリは、ブロック管理テーブル５００には存在しない。なお、図１４では８個のエントリが、ブロックの終了番号の昇順にソートされている。
【０３５１】
第１層のブロックサイズは実施形態に応じて任意に定めることができるが、本実施形態においては２４である。また、本実施形態では、各ブロックが直下の階層のブロックを２つずつ含み、当該２つのブロックのブロックサイズは等しい。したがって、本実施形態では、第２層のブロックサイズは１２（＝２４／２）であり、第３層のブロックサイズは６（＝１２／２）であり、第４層のブロックサイズは３（＝６／２）である。
【０３５２】
また、本実施形態では、「第５層以上の深い階層は使用しない」という前提があるものとする。そのため、ブロック管理テーブル５００の８個のエントリの中での階層の最大値は４である。もし、第４層までのＦＥＣパケットでは復元不能なデータパケットがあれば、転送装置３００は送信元装置３１０にデータパケットの再送を要求すればよい。
【０３５３】
なお、たとえ上記の「第５層以上の深い階層は使用しない」のような前提があったとしても、現実的なエラーレートに基づいて第１層のブロックサイズが適切に定められていれば、再送要求はほとんど生じない。よって、上記の前提は、実質的には、誤り訂正能力を制限するものではまったくない。
【０３５４】
また、以下では第１層のブロック内でのデータパケットの順序を０番から順に数えるものとする。すると、例えば図７に示したブロックの階層構造からも明らかなように、ブロック管理テーブル５００には次の（Ｋ−１）〜（Ｋ−８）のエントリが含まれる。
【０３５５】
（Ｋ−１）０番目から２番目のデータパケットが属する、第４層のブロック（図７の例では、対応してＦＥＣパケットＦ４−１が生成されるブロックＢ４−１に相当）を示すエントリ。
【０３５６】
（Ｋ−２）０番目から５番目のデータパケットが属する、第３層のブロック（図７の例では、対応してＦＥＣパケットＦ３−１が生成されるブロックＢ３−１に相当）を示すエントリ。
【０３５７】
（Ｋ−３）６番目から８番目のデータパケットが属する、第４層のブロック（図７の例では、対応してＦＥＣパケットＦ４−２が生成されるブロックＢ４−３に相当）を示すエントリ。
【０３５８】
（Ｋ−４）０番目から１１番目のデータパケットが属する、第２層のブロック（図７の例では、対応してＦＥＣパケットＦ２−１が生成されるブロックＢ２−１に相当）を示すエントリ。
【０３５９】
（Ｋ−５）１２番目から１４番目のデータパケットが属する、第４層のブロック（図７の例では、対応してＦＥＣパケットＦ４−３が生成されるブロックＢ４−５に相当)を示すエントリ。
【０３６０】
（Ｋ−６）１２番目から１７番目のデータパケットが属する、第３層のブロック（図７の例では、対応してＦＥＣパケットＦ３−２が生成されるブロックＢ３−３に相当）を示すエントリ。
【０３６１】
（Ｋ−７）１８番目から２０番目のデータパケットが属する、第４層のブロック（図７の例では、対応してＦＥＣパケットＦ４−４が生成されるブロックＢ４−７に相当）を示すエントリ。
【０３６２】
（Ｋ−８）０番目から２３番目のデータパケットが属する、第１層のブロック（図７の例では、対応してＦＥＣパケットＦ１−１が生成されるブロックＢ１−１に相当）を示すエントリ。
【０３６３】
なお、ブロック管理テーブル５００は、第１層のブロックサイズと、例えば「第５層以上の深い階層は使用しない」といったような上記の前提から、静的に内容が規定される。よって、ブロック管理テーブル５００は、例えばＣＰＵ２０１によって予め生成されてＲＡＭ２０２に格納されてもよい。
【０３６４】
さて、図１５は、パケットの形式を説明する図である。図１、２、４〜７、１１〜１２に例示したデータパケットとＦＥＣパケットそれぞれの具体例は、例えば、図１５のデータパケット６００とＦＥＣパケット７００である。
【０３６５】
データパケット６００は、ＩＰパケットであり、ＩＰヘッダ６０１とＩＰペイロード６０２を含む。そして、ＩＰペイロード６０２は、ＵＤＰパケットであり、ＵＤＰヘッダ６０３とＵＤＰペイロード６０４を含む。また、ＵＤＰペイロード６０４は、ＲＴＰ（Real-time Transport Protocol）パケットであり、ＲＴＰヘッダ６０５とＲＴＰペイロード６０６を含む。
【０３６６】
なお、ＲＦＣ（Request For Comments）７９１に定義されているように、ＩＰヘッダ６０１は、送信元ＩＰアドレスと送信先ＩＰアドレスのフィールドを含む。送信元ＩＰアドレスフィールドには、データパケット６００を送信する転送装置３００自身のＩＰアドレスが設定される。また、送信先ＩＰアドレスフィールドには、配信先管理テーブル４００に記憶されている送信先装置３２０のＩＰアドレスが設定される。
【０３６７】
また、ＲＦＣ７６８に定義されているように、ＵＤＰヘッダ６０３は送信元ポートと送信先ポートのフィールドを含む。本実施形態では、送信元ポート番号と送信先ポート番号は、予め決められた固定の番号である。なお、ＲＴＰヘッダ６０５の詳細は、図１６とともに後述する。
【０３６８】
また、ＦＥＣパケット７００も、ＩＰパケットであり、ＩＰヘッダ７０１とＩＰペイロード７０２を含む。そして、ＩＰペイロード７０２は、ＵＤＰパケットであり、ＵＤＰヘッダ７０３とＵＤＰペイロード７０４を含む。また、ＵＤＰペイロード７０４は、ＲＴＰパケットであり、ＲＴＰヘッダ７０５とＲＴＰペイロード７０６を含む。そして、ＲＴＰペイロード７０６は、ＦＥＣヘッダ７０７とＦＥＣレベル０ヘッダ７０８とＦＥＣレベル０ペイロード７０９を含む。
【０３６９】
なお、ＩＰヘッダ７０１の送信元ＩＰアドレスフィールドには、ＦＥＣパケット７００を送信する転送装置３００自身のＩＰアドレスが設定される。また、ＩＰヘッダ７０１の送信先ＩＰアドレスフィールドには、配信先管理テーブル４００に記憶されている送信先装置３２０のＩＰアドレスが設定される。そして、本実施形態では、ＵＤＰヘッダ７０３中の送信元ポート番号と送信先ポート番号は、予め決められた固定の番号である。
【０３７０】
なお、ＲＦＣ５１０９で定義されるＦＥＣパケットは、複数のレベルについてそれぞれヘッダとペイロードを含むことができる。例えば、２つのレベルが使われる場合、ＦＥＣパケットは、ＦＥＣヘッダの後に、ＦＥＣレベル０ヘッダ、ＦＥＣレベル０ペイロード、ＦＥＣレベル１ヘッダ、ＦＥＣレベル１ペイロードを含む。しかし本実施形態ではレベル０のみが使われるので、ＦＥＣパケット７００は図１５に示す形式である。なお、複数のレベルが使われる変形例については後述する。
【０３７１】
図１６は、ＲＴＰヘッダの図である。図１５のＲＴＰヘッダ６０５と７０５は、図１６に示すフィールドを含む。図１６のＲＴＰヘッダは、ＲＦＣ３５５０で定義されており、具体的には以下の（Ｌ−１）〜（Ｌ−１０）のフィールドを含む。
【０３７２】
（Ｌ−１）ＲＴＰのバージョン番号を示す、２ビットの「バージョン」フィールド（図１６では「Ｖ」と表記）。ＲＦＣ３５５０のバージョン番号は２である。
（Ｌ−２）ＲＴＰパケットがパディングを含むか否かを示す、１ビットの「パディング」フィールド（図１６では「Ｐ」と表記）。
【０３７３】
（Ｌ−３）図１６に示したフィールドに続けてＲＴＰヘッダに１つ以上のフィールドを追加することによる拡張が行われるか否かを示す、１ビットの「拡張（extension）」フィールド（図１６では「Ｘ」と表記）。
【０３７４】
（Ｌ−４）後述の「貢献ソース（ＣＳＲＣ；Contributing SouRCe）識別子」フィールドがいくつＲＴＰヘッダ内に含まれるかを示す、４ビットの「ＣＳＲＣカウント」フィールド（図１６では「ＣＣ」と表記）。なお、ＦＥＣパケット７００内のＲＴＰヘッダ７０５では、ＣＳＲＣカウントの値は０である。よって、ＦＥＣパケット７００のＲＴＰヘッダ７０５はＣＳＲＣ識別子を含まない。
【０３７５】
（Ｌ−５）プロファイルに応じた意味を表す、１ビットの「マーカ」フィールド（図１６では「Ｍ」と表記）。
（Ｌ−６）ＲＴＰペイロードの形式を示す、７ビットの「ペイロードタイプ」フィールド（図１６では「ＰＴ」と表記）。ＲＦＣ３５５１によれば、例えばＭＰＥＧ（Moving Picture Expert Group）２トランスポートストリームの場合、ペイロードタイプは「ＭＰ２Ｔ」というシンボルで表され、値は３３である。また、ＲＦＣ５１０９によれば、ＦＥＣパケット７００内のＲＴＰヘッダ７０５では、ペイロードタイプの値は１２７である。よって、ペイロードタイプは、データパケットとＦＥＣパケットを区別するための情報の一例である。
【０３７６】
（Ｌ−７）１６ビットの「シーケンス番号」フィールド。連続するＲＴＰデータパケットには、１ずつインクリメントされるシーケンス番号が割り当てられる。シーケンス番号の開始番号はランダムであることが望ましいが、ランダムでなくてもよい。
【０３７７】
（Ｌ−８）ＲＴＰペイロードの最初のオクテットがサンプリングされた時刻を示す、３２ビットの「タイムスタンプ」フィールド。例えば、ペイロードタイプがＭＰ２Ｔのとき、９０ｋＨｚでカウントアップされるカウンタの値がタイムスタンプとして使われる。
【０３７８】
（Ｌ−９）ＲＴＰパケットのストリームの源（例えばマイク、ビデオカメラ、ミキサなど）を識別するための、３２ビットの「同期ソース（ＳＳＲＣ；Synchronization SouRCe）識別子」フィールド。同じ同期ソースからのＲＴＰデータパケットには、同じＳＳＲＣ識別子が割り当てられる。なお、ＳＳＲＣ識別子としては、所定の関数を使って得られるランダムな値が使われる。例えば図１に示す一連のデータパケットとＦＥＣパケットの同期ソース識別子はすべて等しい。
【０３７９】
（Ｌ−１０）複数のストリームが混ぜられて送信される場合に各ストリームを識別するための「貢献ソース（ＣＳＲＣ）識別子」フィールド。ＣＳＲＣ識別子フィールドの数は、ＣＳＲＣカウントフィールドに設定されているとおりであり、０個から１５個までである。また、個々のＣＳＲＣ識別子フィールドの長さは３２ビットである。
【０３８０】
以上説明したように、図１５のＲＴＰヘッダ６０５と７０５は、図１６に示した上記（Ｌ−１）〜（Ｌ−１０）のフィールドを含む。例えば、図１〜２、４〜７、１１〜１２に例示した本実施形態のデータパケットは、具体的には、同じＳＳＲＣ識別子が割り当てられ、かつ同じ一群のノード（例えば図３のノード１０２〜１１１）にマルチキャストされるＲＴＰデータパケットであってもよい。転送装置３００の判断部３０３は、データパケット６００のＲＴＰヘッダ６０５内のシーケンス番号を参照することにより、パケットロスを検出することができ、どのデータパケットが消失したかを認識することができる。
【０３８１】
図１７は、ＦＥＣヘッダとＦＥＣレベル０ヘッダの図である。図１５のＦＥＣヘッダ７０７は、図１７に示すフィールドを含む。図１７のＦＥＣヘッダ７０７は、ＲＦＣ５１０９で定義されるＦＥＣヘッダを本実施形態において拡張したものであり、具体的には以下の（Ｍ−１）〜（Ｍ−１１）のフィールドを含む。
【０３８２】
（Ｍ−１）「Ｅビット」とも呼ばれる、１ビットの拡張（extension）フラグ。ＲＦＣ５１０９では、将来の拡張に備えてＥビットを０に設定するよう定義されているが、本実施形態では、ＲＦＣ５１０９で定義されるＦＥＣヘッダを拡張するために、Ｅビットは１に設定される。
【０３８３】
（Ｍ−２）「Ｌビット」とも呼ばれる、１ビットの「長いマスク（long-mask）」フラグ。Ｌビットが０のとき、ＦＥＣレベル０ヘッダ７０８では１６ビットの短いマスクが使われ、Ｌビットが１のとき、ＦＥＣレベル０ヘッダ７０８では４８ビットの長いマスクが使われる。本実施形態では、ＦＥＣパケットに対応するブロックの大きさが１６以下の場合にＬビットが０に設定され、ＦＥＣパケットに対応するブロックの大きさが１７以上４８以下の場合にＬビットが１に設定される。また、本実施形態のようにＲＦＣ５１０９のＦＥＣパケットを拡張して利用する実施形態においては、第１層のブロックの大きさは４８を超えないものとする。
【０３８４】
（Ｍ−３）消失したデータパケット６００のＲＴＰヘッダ６０５のパディングフィールド（図１６では「Ｐ」と表記）の値を復元するための、１ビットの「Ｐリカバリ」フィールド。Ｐリカバリフィールドの値は、当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００のパディングフィールドの値の排他的論理和である。
【０３８５】
（Ｍ−４）消失したデータパケット６００のＲＴＰヘッダ６０５の拡張フィールド（図１６では「Ｘ」と表記）の値を復元するための、１ビットの「Ｘリカバリ」フィールド。Ｘリカバリフィールドの値は、当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００の拡張フィールドの値の排他的論理和である。
【０３８６】
（Ｍ−５）消失したデータパケット６００のＲＴＰヘッダ６０５のＣＳＲＣカウントフィールド（図１６では「ＣＣ」と表記）の値を復元するための、４ビットの「ＣＣリカバリ」フィールド。ＣＣリカバリフィールドの値は、当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００のＣＳＲＣカウントフィールドの値の排他的論理和である。
【０３８７】
（Ｍ−６）消失したデータパケット６００のＲＴＰヘッダ６０５のマーカフィールド（図１６では「Ｍ」と表記）の値を復元するための、１ビットの「Ｍリカバリ」フィールド。Ｍリカバリフィールドの値は、当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００のマーカフィールドの値の排他的論理和である。
【０３８８】
（Ｍ−７）消失したデータパケット６００のＲＴＰヘッダ６０５のペイロードタイプフィールド（図１６では「ＰＴ」と表記）の値を復元するための、７ビットの「ＰＴリカバリ」フィールド。ＰＴリカバリフィールドの値は、当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００のペイロードタイプフィールドの値の排他的論理和である。
【０３８９】
（Ｍ−８）当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００のＲＴＰヘッダ６０５のシーケンス番号のうちで最小の値を示す、１６ビットの「ＳＮベース」フィールド。例えば、シーケンス番号が５００番から５２３番までの２４個のデータパケット６００と関連しているＦＥＣパケット７００のＳＮベースフィールドの値は、５００である。
【０３９０】
（Ｍ−９）消失したデータパケット６００のＲＴＰヘッダ６０５のタイムスタンプフィールドの値を復元するための、３２ビットの「ＴＳリカバリ」フィールド。ＴＳリカバリフィールドの値は、当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００のタイムスタンプの値の排他的論理和である。
【０３９１】
（Ｍ−１０）復元したデータパケット６００の長さを決定するため、１６ビットの「長さリカバリ」フィールド。長さリカバリフィールドは、当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００の長さの和をバイト単位で数えた値である。具体的には、数える対象の長さとは、ＲＴＰペイロード６０６と、ＣＳＲＣ識別子のリストと、ＲＴＰヘッダ６０５に続く拡張の部分（ＲＴＰパケットが拡張されている場合）と、パディング（ＲＴＰパケットがパディングを含む場合）の合計の長さである。
【０３９２】
（Ｍ−１１）ＦＥＣパケットの階層を示す、８ビットの「階層」フィールド。階層フィールドは、本実施形態による拡張によって加えられるフィールドであり、ＲＦＣ５１０９で定義されているフィールドではない。
【０３９３】
なお、階層フィールドの長さは、実施形態によっては８ビットより短くてもよいし、８ビットより長くてもよい。しかし、ＦＥＣヘッダ７０７の長さが８ビットの倍数となるように階層フィールドの長さを定義すると、半端なビットがなくて処理が容易になるので、本実施形態では階層フィールドの長さは８ビットである。
【０３９４】
また、階層の数の２進表記そのものが階層フィールドに設定される実施形態では２５５（＝２８−１）階層までを表すことが可能である。しかし、「最も深い階層が、第８階層またはそれより浅い階層である」と予め決められている実施形態においては、階層フィールドは、８ビットのうちの階層を示す１ビットのみが１に設定される、という形式であってもよい。
【０３９５】
例えば、階層フィールドのＭＳＢを「０ビット目」と呼ぶことにすると、階層フィールドは、（ｉ−１）ビット目のみが１のときに第ｉ階層を示す（１≦ｉ≦８）。もちろん実施形態によっては、階層フィールドのＬＳＢ（Least Significant Bit）を「０ビット目」と呼ぶことにしてもよい。
【０３９６】
上記に例示したいずれの形式でも、階層フィールドがＦＥＣパケットの階層を示すことに変わりはない。例えば、ＦＥＣパケットＦ２−１のＦＥＣヘッダ７０７内の階層フィールドは第２層を示す値に設定される。
【０３９７】
続いて、図１７のＦＥＣレベル０ヘッダ７０８について説明する。ＦＥＣレベル０ヘッダ７０８は、ＲＦＣ５１０９で定義されているとおり、以下の（Ｎ−１）と（Ｎ−２）のフィールドを含む。
【０３９８】
（Ｎ−１）ＲＴＰパケットのうち、レベル０でＦＥＣにより保護する対象となる（つまり、排他的論理和の演算の対象である）部分の長さを示す、１６ビットの「保護長さ（protection length）」フィールド。本実施形態では、レベル０のみが使われるので、保護長さフィールドには、当該ＦＥＣパケット７００と関連しているすべてのデータパケット６００のうちで、排他的論理和の演算の対象となる部分の最長の長さが設定される。
【０３９９】
（Ｎ−２）どのデータパケット６００がレベル０において当該ＦＥＣパケット７００と関連しているのかを示すマスクフィールド。マスクフィールドの長さは、ＦＥＣヘッダ７０７においてＬビットが０のときは１６ビットであり、Ｌビットが１のときは４８ビットである。ここで、説明の便宜上、ＦＥＣヘッダ７０７のＳＮベースフィールドの値をＳＮとする。すると、ＲＴＰヘッダ６０５中のシーケンス番号が（ＳＮ＋ｉ）のデータパケット６００が当該ＦＥＣパケット７００に関連している場合にのみ、マスクフィールドのｉビット目が１に設定される。なお、マスクフィールドのＭＳＢがｉ＝０の場合に対応する。
【０４００】
なお、図１４のブロック管理テーブル５００に示したように、最下層以外の階層がみな同じ個数（例えば２個）のブロックに分割され、同じ階層のブロックの大きさが等しい場合は、階層から一意にブロックサイズが決まる。例えば、第３層の４つのブロックＢ３−１〜Ｂ３−４の大きさはいずれも６（＝２４／２（３−１））である。このように階層から一意にブロックサイズが決まる場合、転送装置３００内の各部は、どのデータパケット６００がＦＥＣパケット７００と関連しているのかを、ＦＥＣヘッダ７０７内のＳＮベースフィールドと階層フィールドそれぞれの値から認識してもよい。
【０４０１】
例えば、ＳＮベースフィールドの値が５００であり、階層フィールドが第３層を示している場合、ＦＥＣパケット７００と関連するのは、シーケンス番号が５００から５０５までの６個のデータパケット６００である。以上のように、均等にブロックが分割される場合、転送装置３００内の各部は、ＦＥＣレベル０ヘッダ７０８のマスクフィールドを用いなくても、どのデータパケット６００がＦＥＣパケット７００と関連しているのかを認識することができる。
【０４０２】
つまり、ＦＥＣパケットと関連しているデータパケットを識別するための情報として、ＳＮベースと階層のフィールドが使われてもよく、ＳＮベースとマスクのフィールドが使われてもよく、ＳＮベースと階層とマスクのフィールドが使われてもよい。
【０４０３】
さて、続いて転送装置３００の動作について説明する。上記のとおり、転送装置３００は、根ノードとして動作することもでき、中継ノードとして動作することもでき、葉ノードとして動作することもできる。説明の便宜上、まず図１８〜１９を参照して、転送装置３００が根ノードとして動作する場合について説明する。その後、転送装置３００が中継ノードとして動作する場合と葉ノードとして動作する場合に関して、図２０〜２１を参照して共通点について説明し、図２２〜２３を参照して相違点について説明する。なお、図２０〜２３に関する説明においては、図２４〜２５のタイミングチャートを適宜参照する。
【０４０４】
図１８〜１９は、根ノードの動作フローチャートである。例えば図３の根ノード１０１または１２１として動作する転送装置３００は、図１８〜１９のフローチャートの処理を行う。
【０４０５】
なお、根ノードとして動作する転送装置３００は、上述のように不図示のデータパケット供給部を有する。例えば、データパケット供給部は、ＭＰＥＧ２データを生成する。そして、データパケット供給部は、ＲＴＰヘッダ６０５を生成し、生成したＭＰＥＧ２データをＲＴＰペイロード６０６に格納することにより、ＲＴＰパケット（つまりＵＤＰペイロード６０４）を生成する。なお、ＲＴＰヘッダ６０５の生成処理は、新たなシーケンス番号を発行することを含む。
【０４０６】
また、データパケット供給部は、生成したＲＴＰパケットをバッファ部３０２に出力する。データパケット供給部は、例えば、転送装置３００に接続されたマイクおよびビデオカメラ（または、図８の入力装置２０４により実現される、転送装置３００に内蔵のマイクおよびビデオカメラ）、ならびにＣＰＵ２０１により実現されてもよい。
【０４０７】
データパケット供給部は、図１８の処理を開始するように生成部３０６に命令する。また、データパケット供給部は、０番目に生成したＲＴＰパケットのシーケンス番号を生成部３０６に通知する。
【０４０８】
例えば、データパケット供給部は、０番目に生成したＲＴＰパケットをバッファ部３０２に出力したときに、生成部３０６に対して上記命令と通知を行ってもよい。そして、データパケット供給部は、続いて１番目以降のＲＴＰパケットを順次生成し、生成した各ＲＴＰパケットのシーケンス番号を、ＲＴＰパケットの生成のたびに生成部３０６に通知してもよい。あるいは、データパケット供給部は、いくつかのＲＴＰパケットを生成してバッファ部３０２に蓄積してから、上記命令と通知をまとめて行ってもよい。生成部３０６は、例えば、上記命令と通知を契機として図１８の処理を開始する。
【０４０９】
ステップＳ１０１で、生成部３０６は、図１３の配信先管理テーブル４００の階層フィールドを参照して、配信先管理テーブル４００に登録されているＺ個の送信先装置３２０それぞれの階層のうちで、最も深い階層ｍａｘＮを認識する。
【０４１０】
続いて、ステップＳ１０２で生成部３０６は、階層を示すインデックスｎを１に初期化する。
そして、次のステップＳ１０３で生成部３０６は、第ｎ層のＦＥＣパケット７００用の記憶領域を確保するようバッファ部３０２に要求し、バッファ部３０２は要求された記憶領域を確保する。なお、バッファ部３０２内の不図示の制御部は、確保した記憶領域の先頭アドレスを、第ｎ層という階層と対応づけて管理する。
【０４１１】
また、例えば、データパケット供給部が固定長のＲＴＰペイロード６０６を生成する場合、バッファ部３０２が確保する記憶領域の大きさは、上記固定長にＦＥＣパケット７００内の各種ヘッダの長さを足した長さでよい。あるいは、データパケット供給部が生成するＲＴＰペイロード６０６の最大長さが予め決められている場合、バッファ部３０２が確保する記憶領域の大きさは、上記最大長さにＦＥＣパケット７００内の各種ヘッダの長さを足した長さでよい。
【０４１２】
そして、次のステップＳ１０４で生成部３０６は、ｎ＜ｍａｘＮか否かを判断する。もしｎ＜ｍａｘＮならば処理はステップＳ１０５に移行し、ｎ≧ｍａｘＮならば処理はステップＳ１０６に移行する。
【０４１３】
ステップＳ１０５で生成部３０６は、インデックスｎを１だけインクリメントする。そして、処理はステップＳ１０３に戻る。
以上のステップＳ１０１〜Ｓ１０５は、第１層から第ｍａｘＮ層までのＦＥＣパケット７００用の記憶領域を確保するための前処理である。前処理の後、ステップＳ１０６〜Ｓ１２１において、第１層のブロック内の各データパケットについての繰り返し処理が行われ、最後にステップＳ１２２〜Ｓ１２５の後処理が行われる。
【０４１４】
さて、ステップＳ１０６で生成部３０６は、第１層のブロック内でのデータパケット６００の順序を示すインデックスｄを０に初期化する。
そして、次のステップＳ１０７で生成部３０６は、階層を示すインデックスｎを再度１に初期化する。
【０４１５】
続いて、次のステップＳ１０８で生成部３０６は、図１４のブロック管理テーブル５００を参照して、インデックスｄが第ｎ層のいずれかのブロックの開始番号であるか否かを判断する。もし、インデックスｄが第ｎ層のいずれかのブロックの開始番号であれば、処理はステップＳ１０９に移行する。逆に、インデックスｄが第ｎ層のどのブロックの開始番号でもなければ、処理はステップＳ１１０に移行する。
【０４１６】
例えば、ｄ＝０かつｎ＝１の場合、生成部３０６は、ブロック管理テーブル５００を検索し、検索の結果、最後のエントリを見つけて、インデックス０が第１層のブロックの開始番号であることを認識する。よって、ｄ＝０かつｎ＝１の場合、処理はステップＳ１０９に移行する。
【０４１７】
ステップＳ１０９で生成部３０６は、ｄ番目のデータパケット６００をバッファ部３０２から読み出す。そして、生成部３０６は、第ｎ層のＦＥＣパケット７００用の記憶領域に、読み出したｄ番目のデータパケット６００のデータをコピーする。
【０４１８】
例えば、生成部３０６は、図１８の処理の契機としてデータパケット供給部から通知された、０番目のＲＴＰパケットのシーケンス番号を「ベース番号」として保持していてもよい。すると、生成部３０６は、ベース番号とインデックスｄを足すことで、ｄ番目のデータパケットのシーケンス番号を得ることができる。
【０４１９】
よって、生成部３０６は、「データパケット」というパケットタイプと、ｄ番目のデータパケットのシーケンス番号とのペアを、バッファ部３０２に指定することで、バッファ部３０２からｄ番目のデータパケットを読み出すことができる。また、生成部３０６は、層の深さｎをバッファ部３０２に通知することで、コピー先のＦＥＣパケット７００用の記憶領域の先頭アドレスをバッファ部３０２に指定することもできる。
【０４２０】
なお、バッファ部３０２に対してパケットを指定するための方法は、実施形態に応じて異なっていてよく、上記の方法は一例に過ぎない。
なお、本実施形態では、より具体的には、生成部３０６はステップＳ１０９で以下のような処理を行う。
【０４２１】
生成部３０６は、第ｎ層のＦＥＣパケット７００のＲＴＰヘッダ７０５を設定する。例えば、生成部３０６は、ペイロードタイプフィールドに決められた定数を設定し、ＦＥＣパケット７００用にシーケンス番号を発行するなどの処理を行う。ＦＥＣパケット７００用のＲＴＰヘッダ７０５の設定に関しては公知なので詳しい説明を省略する。
【０４２２】
また、生成部３０６は、第ｎ層のＦＥＣパケット７００のＦＥＣヘッダ７０７を初期化する。例えば、生成部３０６は、第ｎ層のＦＥＣパケット７００のＦＥＣヘッダ７０７中の各リカバリフィールドに、ｄ番目のデータパケット６００のＲＴＰヘッダ６０５中の対応するフィールドの値をコピーする。
【０４２３】
また、生成部３０６は、ＦＥＣヘッダ７０７のＥビットを１に設定してＦＥＣヘッダ７０７を拡張し、ＦＥＣヘッダ７０７の階層フィールドに、第ｎ層を示す値を設定する。さらに、生成部３０６は、ＦＥＣヘッダ７０７のＳＮベースフィールドに、ｄ番目のデータパケット６００のシーケンス番号をコピーする。また、生成部３０６は、ステップＳ１０８の検索で見つけたブロック管理テーブル５００のエントリのブロック開始番号とブロック終了番号から、生成対象のＦＥＣパケット７００に対応するブロックの大きさを計算し、計算した大きさに応じてＦＥＣヘッダ７０７のＬビットを適宜設定する。
【０４２４】
さらに、生成部３０６は、第ｎ層のＦＥＣパケット７００のＦＥＣレベル０ヘッダ７０８を初期化する。例えば、データパケット供給部が固定長のＲＴＰペイロード６０６を生成する場合は、生成部３０６は、ＦＥＣレベル０ヘッダ７０８の保護長さに所定の定数を設定する。また、生成部３０６は、マスクフィールドの全ビットを０に初期化した後、ｄ番目のデータパケット６００に対応するビット（ステップＳ１０９では０ビット目）を１に設定する。
【０４２５】
そして、生成部３０６は、ｄ番目のデータパケット６００のＲＴＰペイロード６０６を、第ｎ層のＦＥＣパケット７００のＦＥＣレベル０ペイロード７０９にコピーする。
以上のようにして、ステップＳ１０９では、第ｎ層のＦＥＣパケット７００用の記憶領域に、ｄ番目のデータパケット６００のデータがコピーされる。
【０４２６】
また、ステップＳ１１０で生成部３０６は、ｄ番目のデータパケット６００をバッファ部３０２から読み出す。そして、生成部３０６は、第ｎ層のＦＥＣパケット７００用の記憶領域に現在記憶されているデータと、読み出したｄ番目のデータパケット６００のデータとの排他的論理和を計算する。さらに、生成部３０６は、計算した排他的論理和を、第ｎ層のＦＥＣパケット７００用の記憶領域に上書きする。より具体的には、生成部３０６は、以下の上書き処理を行う。
【０４２７】
生成部３０６は、第ｎ層のＦＥＣパケット７００のＦＥＣヘッダ７０７中の各リカバリフィールドに、現在の値と、ｄ番目のデータパケット６００のＲＴＰヘッダ６０５中の対応するフィールドの値との排他的論理和を上書きする。そして、生成部３０６は、第ｎ層のＦＥＣパケット７００のＦＥＣレベル０ペイロード７０９に、現在の値と、ｄ番目のデータパケット６００のＲＴＰペイロード６０６との排他的論理和を上書きする。また、生成部３０６は、第ｎ層のＦＥＣパケット７００のＦＥＣレベル０ヘッダ７０８のマスクフィールドにおいてｄ番目のデータパケット６００に対応するビットを１に設定する。
【０４２８】
そして、ステップＳ１０９またはＳ１１０の処理の後、生成部３０６は、ステップＳ１１１で、ｎ＜ｍａｘＮか否かを判断する。もしｎ＜ｍａｘＮならば処理はステップＳ１１２に移行し、ｎ≧ｍａｘＮならば処理は図１９のステップＳ１１３に移行する。
【０４２９】
ステップＳ１１２で生成部３０６はインデックスｎを１だけインクリメントする。そして、処理はステップＳ１０８に戻る。以上のステップＳ１０７〜Ｓ１１２により、生成部３０６は、第１層から第ｍａｘＮ層までのＦＥＣパケット７００のそれぞれに、ｄ番目のデータパケット６００の内容を反映する。
【０４３０】
そして、図１９のステップＳ１１３で生成部３０６は、ｄ番目のデータパケットを送信するよう送信部３０７に要求する。要求を受けた送信部３０７は、ステップＳ１１３で、配信先管理テーブル４００の各エントリを順に処理するためのインデックスｋを１に初期化する。
【０４３１】
続いて、ステップＳ１１４で送信部３０７は、配信先管理テーブル４００のｋ番目のエントリに対応する送信先装置３２０にｄ番目のデータパケット６００を送信する。
より詳しくは、ステップＳ１１４で送信部３０７は、配信先管理テーブル４００のｋ番目のエントリからＩＰアドレスを読み取り、読み取ったＩＰアドレスを用いてデータパケット６００のＩＰヘッダ６０１を生成する。また、送信部３０７は、ＵＤＰヘッダ６０３も生成する。そして、送信部３０７は、ＩＰヘッダ６０１とＵＤＰヘッダ６０３を付加したＲＴＰパケットであるデータパケット６００を、ｋ番目の送信先装置３２０に送信する。
【０４３２】
そして、次のステップＳ１１５で送信部３０７は、配信先管理テーブル４００のｋ番目のエントリにおける階層フィールドの値Ｎｋ（すなわち、ｋ番目の送信先装置３２０の層の深さ）を読み取る。
【０４３３】
また、次のステップＳ１１６で送信部３０７は、ブロック管理テーブル５００を参照して、インデックスｄが第Ｎｋ層またはそれより浅い層のいずれかのブロックの終了番号か否かを判断する。そして、もしインデックスｄが第Ｎｋ層またはそれより浅い層のいずれかのブロックの終了番号であれば、送信部３０７は、インデックスｄがどの階層のブロックの終了番号なのかを記憶し、処理はステップＳ１１７に移行する。逆に、インデックスｄが第Ｎｋ層またはそれより浅い層のどのブロックの終了番号でもなければ、処理はステップＳ１１８に移行する。
【０４３４】
例えば、ｋ＝２とすると、図１３の配信先管理テーブル４００のｋ番目のエントリの階層フィールドの値は２なので、Ｎｋ＝２である。よって、送信部３０７は、インデックスｄが第２層または第１層のいずれかのブロックの終了番号なのか否かを判断する。
【０４３５】
さて、ステップＳ１１７で送信部３０７は、ステップＳ１１６で記憶した階層のＦＥＣパケット７００用の記憶領域に記憶されているデータ（すなわち、終了番号がｄのブロックに対応するＦＥＣパケット７００のデータ）を読み出す。そして、送信部３０７は、読み出したＦＥＣパケットをｋ番目の送信先装置３２０に送信する。
【０４３６】
より詳しくは、ステップＳ１１７で送信部３０７は、配信先管理テーブル４００のｋ番目のエントリからＩＰアドレスを読み取り、読み取ったＩＰアドレスを用いてＦＥＣパケット７００のＩＰヘッダ７０１を生成する。また、送信部３０７は、ＵＤＰヘッダ７０３も生成する。そして、送信部３０７は、ＩＰヘッダ７０１とＵＤＰヘッダ７０３を付加したＲＴＰパケットであるＦＥＣパケット７００を、ｋ番目の送信先装置３２０に送信する。ＦＥＣパケット７００の送信後、処理はステップＳ１１８に移行する。
【０４３７】
ステップＳ１１８で送信部３０７は、インデックスｋが送信先装置３２０の数（すなわち配信先管理テーブル４００のエントリ数Ｚ）未満か否かを判断する。もし、インデックスｋが送信先装置３２０の数Ｚ未満であれば、処理はステップＳ１１９に移行する。逆に、インデックスｋが送信先装置３２０の数Ｚに達していれば、送信部３０７は生成部３０６に送信終了を通知し、処理はステップＳ１２０に移行する。
【０４３８】
ステップＳ１１９で送信部３０７は、インデックスｋを１だけインクリメントする。そして処理はステップＳ１１４に戻る。
また、ステップＳ１２０で生成部３０６は、インデックスｄが第１層のブロックの終了番号未満であるか否かを判断する。第１層のブロックの終了番号は、第１層のブロックサイズが固定であれば、生成部３０６を実現するＣＰＵ２０１が実行するプログラムに定数として定義されていてもよい。あるいは、生成部３０６は、図１４のようにソートされたブロック管理テーブル５００の最後のエントリ（すなわち第１層のブロックを示すエントリ）におけるブロックの終了番号フィールドの値を読み取ってもよい。
【０４３９】
そして、インデックスｄが第１層のブロックの終了番号未満の場合、処理はステップＳ１２１に移行する。逆に、インデックスｄが第１層のブロックの終了番号に達している場合、処理はステップＳ１２２に移行する。
【０４４０】
ステップＳ１２１で生成部３０６は、インデックスｄを１だけインクリメントする。そして、処理は図１８のステップＳ１０７に戻る。
また、ステップＳ１２２で生成部３０６は、階層を示すインデックスｎを再度１に初期化する。
【０４４１】
次のステップＳ１２３で生成部３０６は、第ｎ層のＦＥＣパケット７００用の記憶領域を解放するようバッファ部３０２に要求し、バッファ部３０２は要求にしたがって記憶領域を解放する。
【０４４２】
そして、次のステップＳ１２４で生成部３０６は、ｎ＜ｍａｘＮか否かを判断する。もしｎ＜ｍａｘＮならば処理はステップＳ１２５に移行し、ｎ≧ｍａｘＮならば生成部３０６は、現在の第１層のブロックに関する図１８〜１９の一連の処理を終了する。
【０４４３】
また、ステップＳ１２５で生成部３０６は、インデックスｎを１だけインクリメントする。そして、処理はステップＳ１２３に戻る。以上のステップＳ１２２〜Ｓ１２５により、ステップＳ１０２〜Ｓ１０５で確保された記憶領域が解放される。
【０４４４】
なお、上記の図１８〜１９に示した例では、第１層の１つのブロック（例えば図２のブロックＢ１−１）の最後で一旦処理が終了する。しかし、図２に示すように、データパケット供給部は、第１層の複数のブロックに相当する多数のＲＴＰペイロード６０６を生成することがある。
【０４４５】
そこで、データパケット供給部は、第１層のブロックに対応する個数のＲＴＰパケットを生成するたびに、生成部３０６に対して、図１８〜１９の処理を開始するよう命令してもよい。例えば、図２の場合は、データパケット供給部は、データパケットＤ０に対応するＲＴＰパケットを生成したときと、データパケットＤ２４に対応するＲＴＰパケットを生成したときに、それぞれ、図１８〜１９の処理を開始するよう生成部３０６に命令してもよい。
【０４４６】
あるいは、データパケット供給部は、データパケットＤ０に対応するＲＴＰパケットを生成したときにだけ、生成部３０６に処理を開始するよう命令してもよい。この場合、図１８〜１９の処理は次のように変形されてもよい。具体的には、ステップＳ１２０でインデックスｄが第１層のブロックの終了番号に達していたら、生成部３０６は、ステップＳ１２２以降の処理を行う代わりに、再度ステップＳ１０６以下の処理を行う。
【０４４７】
そして、データパケット供給部は、ストリームの最後のデータパケットに対応するＲＴＰパケットを生成したときに、生成部３０６に対して、処理を終了するように命令してもよい。なお、処理の終了を生成部３０６に命令する際、データパケット供給部は、最後のＲＴＰパケットのシーケンス番号を生成部３０６に通知してもよい。すると、終了の命令を受けた生成部３０６は、最後のＲＴＰパケットまで処理し終わってから、ステップＳ１２２〜Ｓ１２５の処理を行う。
【０４４８】
続いて、図２０〜２３のフローチャートを参照して、中継ノードと葉ノードの動作について説明する。なお、図２０〜２１は、中継ノードと葉ノードに共通の動作を示し、図２２は、中継ノードに特有の動作を示し、図２３は、葉ノードに特有の動作を示す。
【０４４９】
また、中継ノードと葉ノードの動作の説明においては、図２４と図２５のタイミングチャートも適宜参照する。図２４と図２５は、それぞれ、第１のケースと第２のケースのタイミングチャートである。
【０４５０】
なお、図２０〜２３の説明においては、転送装置３００にとっての最下層を「第Ｎ層」と表記する（１≦Ｎ）。図２４と図２５の例では、Ｎ＝３である。
本実施形態では、送信元装置３１０も図１３の配信先管理テーブル４００と同様の形式の配信先管理テーブル（不図示）を保持する。そして、送信元装置３１０の配信先管理テーブル内の或るエントリには、転送装置３００のＩＰアドレスと、「第Ｎ層」という階層が記録されている。よって、送信元装置３１０から転送装置３００へは、第１層〜第Ｎ層のＦＥＣパケットが送信される。
【０４５１】
さて、図２４の第１のケースは、図５と同じく、ブロックＢ１−１内のデータパケットＤ２、Ｄ８およびＤ１９が消失した場合を示す。図２４では、ブロックＢ１−１に属する２４個のデータパケットと、ブロックＢ１−１またはそのサブセットであるいずれかのブロックに対応して生成される４個のＦＥＣパケットについて、それぞれ「受信・格納」または「消失」と示されている。
【０４５２】
図２４における「受信・格納」は、パケットが正常に受信部３０１により受信されてバッファ部３０２に格納されたことを示し、「消失」は、パケットが消失したため受信部３０１により受信されなかったことを示す。また、図２４における吹き出しは、パケットの受信を契機として転送装置３００が行う処理を強調して示す。
【０４５３】
なお、図２４における「総パケットカウンタ」と「消失パケットカウンタ」は、詳しくは後述するが、転送装置３００内のカウンタであり、判断部３０３と指示部３０８からアクセス可能である。図２４では、データパケットＤ０の受信の直前の２つのカウンタの値がそれぞれＴとＬであったと仮定して、２つのカウンタの値の変遷を示している。
【０４５４】
また、図２５の第２のケースは、データパケットＤ２とＦＥＣパケットＦ２−１とデータパケットＤ１５とＦＥＣパケットＦ３−２とデータパケットＤ１９が消失した場合を示す。図２５の形式は図２４と同様である。詳しくは後述するが、第２のケースでは、消失したデータパケットＤ１５が属するブロックＢ３−３に対応するＦＥＣパケットＦ３−２自体も消失しているので、データパケットＤ１５が復元不能であり、転送装置３００はデータパケットＤ１５の再送を送信元装置３１０に要求する。
【０４５５】
なお、以下では説明の簡略化のため、以下の（Ｏ−１）と（Ｏ−２）を仮定する。
（Ｏ−１）転送装置３００内の各部は、送信元装置３１０から送信されるデータパケットのうち、第１層の最初のブロック内の０番目のデータパケット（つまりストリームの先頭のデータパケット）のシーケンス番号を予め認識している。
【０４５６】
（Ｏ−２）転送装置３００内の各部は、第１層のブロックサイズを予め認識している。
上記（Ｏ−１）の仮定を成立させるために、例えば、ストリームの先頭のデータパケットのシーケンス番号を通知するための制御パケットを、送信元装置３１０が事前に転送装置３００に送信してもよい。すると、ストリームの先頭のデータパケットのシーケンス番号を、転送装置３００内の各部が予め認識することができる。なお、制御パケットを使わなくても、図２０の処理を変形することでこの仮定（Ｏ−１）を成立させることができるが、そのような変形については後述する。
【０４５７】
また、上記（Ｏ−２）の仮定も、例えば、第１層のブロックサイズが定数として固定的に予め決められていれば、成立する。あるいは、第１層のブロックサイズを通知するための制御パケットを、送信元装置３１０が事前に転送装置３００に送信することにより、転送装置３００内の各部が第１層のブロックサイズを認識してもよい。
【０４５８】
上記の仮定（Ｏ−１）と（Ｏ−２）によれば、転送装置３００内の各部は、以下の式（２０．１）により、受信したデータパケットの第１層のブロック内での順序を示す番号を認識することができる。
【０４５９】
seqB=(seq-seq0) mod bSize                             (20.1)
【０４６０】
なお、式（２０．１）において、“ｓｅｑ”は、転送装置３００が受信したデータパケットのシーケンス番号であり、“ｓｅｑ０”は、ストリームの先頭のデータパケットシーケンス番号である。また、“ｂＳｉｚｅ”は、第１層のブロックサイズであり、“ｓｅｑＢ”は、転送装置３００が受信したデータパケットの第１層のブロック内での番号である。そして、“ｍｏｄ”は剰余演算子である。なお、図１４のブロック管理テーブル５００における番号は、式（２０．１）に示した、第１層のブロック内での順序を示す番号ｓｅｑＢにより表されている。
【０４６１】
さて、図２０の処理は、受信部３０１による送信元装置３１０からのパケットの受信を契機として開始される。以下では、図２０の処理の開始の契機となった受信を「今回の受信」ともいう。
【０４６２】
まずステップＳ２０１で、受信部３０１は今回受信したパケットをバッファ部３０２に出力し、バッファ部３０２はパケットを格納する。また、ステップＳ２０１で受信部３０１は、少なくとも、受信したパケットのＲＴＰヘッダのペイロードタイプとシーケンス番号を抽出し、抽出したペイロードタイプとシーケンス番号を、判断部３０３に通知する。さらに、受信部３０１は、復元部３０４に対し、パケットの受信を通知する。
【０４６３】
すると、ステップＳ２０２で判断部３０３は、今回受信されたパケットのタイプがデータパケットであるかＦＥＣパケットであるかを、受信部３０１から通知されたペイロードタイプの値から判断する。図１６に関して説明したとおり、ＦＥＣパケット７００のＲＴＰヘッダ７０５では、ペイロードタイプの値は１２７という特定の値なので、判断部３０３はペイロードタイプの値からステップＳ２０２の判断を行うことができる。
【０４６４】
そして、今回受信されたパケットがデータパケットの場合、処理は図２１のステップＳ２０３に移行する。逆に、今回受信されたパケットがＦＥＣパケットの場合、処理はステップＳ２１４に移行する。
【０４６５】
図２０のステップＳ２０３の処理が実行されるのは、次の（Ｐ−１）〜（Ｐ−４）の場合のいずれかである。
（Ｐ−１）次に受信されるはずのパケットはデータパケットであり、かつ、次に受信されるはずのデータパケットが、正常にステップＳ２０１で受信部３０１に受信された場合。例えば、図２４において、転送装置３００がデータパケットＤ０を受信した時点における「次に受信されるはずのデータパケット」は、データパケットＤ１である。よって、データパケットＤ１が受信されたときは、この（Ｐ−１）の場合に該当する。
【０４６６】
（Ｐ−２）次に受信されるはずのパケットはデータパケットであるが、次に受信されるはずのデータパケットが消失してしまい、次に受信されるはずのデータパケットよりも後の別のデータパケットが、ステップＳ２０１で受信部３０１に受信された場合。例えば、図２４において、転送装置３００がデータパケットＤ１を受信した時点における「次に受信されるはずのデータパケット」はデータパケットＤ２であるが、データパケットＤ２は消失し、次に実際に受信されるのはデータパケットＤ３である。よって、図２４でデータパケットＤ３が受信されたときは、この（Ｐ−２）の場合に該当する。
【０４６７】
（Ｐ−３）次に受信されるはずのパケットはＦＥＣパケットであるが、次に受信されるはずのＦＥＣパケットが消失してしまい、次に受信されるはずのＦＥＣパケットよりも後のデータパケットが、ステップＳ２０１で受信部３０１に受信された場合。例えば、図２５において、転送装置３００がデータパケットＤ１１を受信した時点における「次に受信されるはずのＦＥＣパケット」はＦＥＣパケットＦ２−１であるが、ＦＥＣパケットＦ２−１は消失し、次に実際に受信されるのはデータパケットＤ１２である。また、図２５において、転送装置３００がデータパケットＤ１７を受信した時点における「次に受信されるはずのＦＥＣパケット」はＦＥＣパケットＦ３−２であるが、ＦＥＣパケットＦ３−２は消失し、次に実際に受信されるのはデータパケットＤ１８である。よって、図２５でデータパケットＤ１２が受信されたときと、データパケットＤ１８が受信されたときは、この（Ｐ−３）の場合に該当する。
【０４６８】
（Ｐ−４）過去に復元不能だったために送信元装置３１０に再送を要求したデータパケットが、ステップＳ２０１で受信部３０１に受信された場合。例えば、図２５においては、消失し、しかも復元不能だったデータパケットＤ１５の再送が要求される。送信元装置３１０から再送されたデータパケットＤ１５が、データパケットＤ１８の受信の後に受信された場合が、この（Ｐ−４）の場合に該当する。なお、この（Ｐ−４）の場合は、次に受信されるはずのパケットのタイプによらず、生じ得る。
【０４６９】
以上のように、ステップＳ２０１で受信されたパケットがデータパケットの場合としては、（Ｐ−１）〜（Ｐ−４）の４通りの場合があり得る。そこで、ステップＳ２０３で判断部３０３は、今回の受信が（Ｐ−３）に該当するか否かを判断する。判断のための処理の詳細は、例えば以下のとおりである。
【０４７０】
判断部３０３は、受信部３０１が前回パケットを受信したときに受信部３０１が判断部３０３に通知したシーケンス番号とペイロードタイプを、「前回のシーケンス番号」と「前回のペイロードタイプ」として保持する。そして、ステップＳ２０３において、前回のペイロードタイプがＦＥＣパケットを示していれば、判断部３０３は、「今回のステップＳ２０１の受信は（Ｐ−３）に該当しない」と判断し、処理はステップＳ２０４に移行する。なぜなら、本実施形態ではＦＥＣパケットは連続しないからである。
【０４７１】
他方、前回のペイロードタイプがデータパケットを示す場合、判断部３０３は、式（２０．１）にしたがい、前回のシーケンス番号に対応する、第１層のブロック内での順序を示す番号を計算する。つまり、判断部３０３は、前回のシーケンス番号をｓｅｑに代入して、式（２０．１）のｓｅｑＢを計算する。そして、判断部３０３は、計算した番号ｓｅｑＢが、図１４のブロック管理テーブル５００のいずれかのエントリにおけるブロックの終了番号と一致するか否かを判断する。
【０４７２】
そして、もしブロックの終了番号が番号ｓｅｑＢと一致するエントリがブロック管理テーブル５００の中に見つかれば、判断部３０３は、「今回の受信は（Ｐ−３）に該当する」と判断する。すなわち、判断部３０３は、ステップＳ２０３において、ＦＥＣパケットの消失を新たに検出する。そして、処理はステップＳ２０６に移行する。
【０４７３】
例えば、図２５の例で、データパケットＤ１２が受信された時点では、前回のシーケンス番号はデータパケットＤ１１のシーケンス番号である。よって、ｓｅｑＢ＝１１である。また、図１４のブロック管理テーブル５００は、ブロックの終了番号が１１のエントリを有する。したがって、判断部３０３はステップＳ２０３においてＦＥＣパケットＦ２−１の消失を新たに検出し、「今回の受信は（Ｐ−３）に該当する」と判断する。
【０４７４】
なお、判断部３０３は、上記のようにしてＦＥＣパケットの消失を新たに検出した場合、消失したＦＥＣパケットの階層（すなわちブロック管理テーブル５００内で見つかったエントリにおける階層）を内部的に記憶してもよい。例えば、上記のようにＦＥＣパケットＦ２−１の消失を検出した場合、判断部３０３は、第２層のＦＥＣパケットの消失を検出したことを内部的に記憶してもよい。
【０４７５】
逆に、もしブロックの終了番号が番号ｓｅｑＢと一致するエントリがブロック管理テーブル５００の中に存在しなければ、判断部３０３は、「今回の受信は（Ｐ−１）、（Ｐ−２）または（Ｐ−４）に該当する」と判断する。そして、処理はステップＳ２０３からステップＳ２０４へと移行する。
【０４７６】
ステップＳ２０４が実行されるのは、今回の受信が（Ｐ−１）、（Ｐ−２）または（Ｐ−４）に該当する場合である。そこで、ステップＳ２０４において判断部３０３は、今回の受信が（Ｐ−４）に該当するか否かを判断する。
【０４７７】
例えば、転送装置３００は、転送装置３００内の各部から参照可能なリスト（以下「再送要求リスト」という）を、例えばＲＡＭ２０２上に保持していてもよい。そして、再送要求リストの個々の要素は、転送装置３００が送信元装置３１０に再送を要求したデータパケットのシーケンス番号であってもよい。再送要求リストへの要素の追加は後述のステップＳ２１０またはＳ２１９で行われる。判断部３０３は、再送要求リストを参照することで、今回の受信が（Ｐ−４）に該当するか否かを判断することができる。
【０４７８】
もし、ステップＳ２０１で受信部３０１から通知されたシーケンス番号が再送要求リストに含まれていれば、判断部３０３は、「今回の受信は（Ｐ−４）に該当する」と判断し、ステップＳ２０１で受信部３０１から通知されたシーケンス番号を再送要求リストから削除する。そして、処理はステップＳ２１２に移行する。
【０４７９】
例えば、図２５において、データパケットＤ１５が受信されたとき、再送要求リストにデータパケットＤ１５のシーケンス番号が含まれている。よって、ステップＳ２０４で判断部３０３は「今回の受信は（Ｐ−４）に該当する」と判断する。
【０４８０】
逆に、ステップＳ２０１で受信部３０１から通知されたシーケンス番号が再送要求リストに含まれていなければ、判断部３０３は、「今回の受信は（Ｐ−１）または（Ｐ−２）に該当する」と判断する。そして、処理はステップＳ２０５に移行する。
【０４８１】
ステップＳ２０５は、上記のとおり今回の受信が（Ｐ−１）または（Ｐ−２）に該当する場合に実行される。本実施形態では、「今回の受信が（Ｐ−１）と（Ｐ−２）のどちらに該当するのか」という判断は、後にＦＥＣパケットが受信されるか、またはＦＥＣパケットの消失が検出されるまで、延期される。よって、ステップＳ２０５では、判断部３０３が、総パケットカウンタの値を１だけインクリメントする。そして、今回の受信を契機とした処理は終了する。
【０４８２】
なお、総パケットカウンタは、本来転送装置３００が受信するはずのパケットの数を数えるためのカウンタである。また、消失パケットカウンタは、消失したパケットの数を数えるためのカウンタである。２つのカウンタの初期値は０である。また、２つのカウンタは、第１層の複数のブロックをまたいでカウントアップされる。すなわち、２つのカウンタは、第１層のブロックごとにクリアされるわけではない。
【０４８３】
上記のとおり、「今回の受信が（Ｐ−１）と（Ｐ−２）のどちらに該当するのか」という判断は延期されるので、ステップＳ２０５では消失パケットカウンタの値は変化しない。他方で、今回１個のデータパケットが受信されたので、判断部３０３は総パケットカウンタを１だけインクリメントする。
【０４８４】
例えば、図２４と図２５のいずれでも、今回の受信が（Ｐ−１）または（Ｐ−２）に該当する場合は、総パケットカウンタの値が１増えるが、消失パケットカウンタの値は変化しない。より具体的には、例えば、図２４でデータパケットＤ０が受信されると、総パケットカウンタの値がＴから（Ｔ＋１）に増えるが、消失パケットカウンタの値はＬのまま変化しない。また、データパケットＤ３が受信されると、総パケットカウンタの値が（Ｔ＋２）から（Ｔ＋３）に増えるが、消失パケットカウンタの値はＬのまま変化しない。データパケットＤ２の消失に合わせて消失パケットカウンタがインクリメントされるのは、後にＦＥＣパケットＦ３−１が受信されたときである。
【０４８５】
さて、ステップＳ２０６の処理が実行されるのは、上記のとおり、今回の受信が（Ｐ−３）に該当する場合である。よって、判断部３０３は、ステップＳ２０３で検出したＦＥＣパケットの消失に合わせて、ステップＳ２０６で消失パケットカウンタを１だけインクリメントする。
【０４８６】
例えば、図２５の例で、データパケットＤ１２が受信されたとき、ステップＳ２０３で判断部３０３はＦＥＣパケットＦ２−１の消失を検出する。よって、判断部３０３は、消失したＦＥＣパケットＦ２−１を消失パケットとして数えるため、ステップＳ２０６で消失パケットカウンタを１だけインクリメントする。
【０４８７】
同様に、図２５の例で、データパケットＤ１８が受信されたとき、ステップＳ２０３で判断部３０３はＦＥＣパケットＦ３−２の消失を検出する。よって、判断部３０３は、消失したＦＥＣパケットＦ３−２を消失パケットとして数えるため、ステップＳ２０６で消失パケットカウンタを１だけインクリメントする。
【０４８８】
そして、次のステップＳ２０７で判断部３０３は、総パケットカウンタを２だけインクリメントする。なぜなら、総パケットカウンタが数える対象の「本来転送装置３００が受信するはずのパケット」には、今回受信されたデータパケットと、当該データパケットの受信を契機としてステップＳ２０３で消失が検出されたＦＥＣパケットの双方が含まれるからである。
【０４８９】
例えば、図２５の例で、データパケットＤ１２が受信されたとき、判断部３０３は、ステップＳ２０７で総パケットカウンタを２だけインクリメントする。つまり、判断部３０３は、データパケットＤ１２とＦＥＣパケットＦ２−１を、「本来転送装置３００が受信するはずのパケット」として数える。同様に、図２５の例で、データパケットＤ１８が受信されたとき、判断部３０３はステップＳ２０７で、データパケットＤ１８とＦＥＣパケットＦ３−２を数える。
【０４９０】
続いて、ステップＳ２０８で判断部３０３は、第Ｎ層（すなわち最下層）の直前のブロック中のデータパケットをすべて受信部３０１が既に受信したか否かを判断する。なおここで、「第Ｎ層の直前のブロック」とは、ステップＳ２０３で消失が検出されたＦＥＣパケットの直前のデータパケットが第Ｎ層において属するブロックである。
【０４９１】
そして、第Ｎ層の直前のブロック中のデータパケットをすべて受信部３０１が受信済みの場合、処理はステップＳ２０９に移行する。逆に、第Ｎ層の直前のブロック中に、まだ受信部３０１が受信していないデータパケットがある場合、処理はステップＳ２１０に移行する。
【０４９２】
なお、転送装置３００にとっての最下層である第Ｎ層を示す値（例えば整数Ｎそのもの）は、例えば指示部３０８内部に保持されており、他の構成要素（例えば判断部３０３、復元部３０４、生成部３０６など）からも参照可能である。転送装置３００が送信元装置３１０から送信先装置３２０への転送を開始した直後は、第Ｎ層を示す値として、例えばデフォルト値が使われてもよい。もちろん、指示部３０８が送信元装置３１０に第２の階層情報を通知した後は、第２の階層情報が示す階層は第Ｎ層である。そして、Ｎの値は、送信元装置３１０と転送装置３００の間のリンクのエラーレートの変動に応じて動的に変化し得る。
【０４９３】
また、ステップＳ２０８で判断部３０３は、図１４のブロック管理テーブル５００から「第Ｎ層の直前のブロック」に属するデータパケットを特定することができる。よって、判断部３０３は、特定したデータパケットが格納されているか否かをバッファ部３０２内の不図示の制御部に問い合せることで、ステップＳ２０８の判断を行うことができる。ステップＳ２０８の判断処理の具体例は、例えば、以下のとおりである。
【０４９４】
図２５において、受信部３０１がデータパケットＤ１１を受信した後に、ＦＥＣパケットＦ２−１を受信することなく、データパケットＤ１２を受信した場合、「第Ｎ層の直前のブロック」は、データパケットＤ６〜Ｄ１１が属するブロックＢ３−２である。そして、図２５の例では、データパケットＤ６〜Ｄ１１は消失せずに受信されている。よって、この場合、処理はステップＳ２０９に移行する。
【０４９５】
具体的には、判断部３０３は、ステップＳ２０３で見つけたエントリの階層フィールドの値がＮより小さい場合、ステップＳ２０３で見つけたエントリよりも前にあり、かつ階層フィールドの値がＮに等しいエントリのうちで、最後のエントリを探す。すると、ブロックＢ３−１に対応する２番目のエントリが見つかり、このエントリにおけるブロックの終了番号フィールドの値は５である。また、判断部３０３がステップＳ２０３で見つけたブロック管理テーブル５００のエントリは、ブロックＢ２−１に対応する４番目のエントリであり、ブロックの終了番号として１１という値を持つ。
【０４９６】
よって、判断部３０３は、６（＝５＋１）番目のデータパケットＤ６から、１１番目のデータパケットＤ１１までを、「第Ｎ層の直前のブロック」に属するデータパケットとして特定する。そして、判断部３０３は、バッファ部３０２への問い合わせの結果、データパケットＤ６〜Ｄ１１がすべて受信済みであることを認識する。したがって、処理はステップＳ２０９に移行する。
【０４９７】
他方、図２５において、受信部３０１がデータパケットＤ１７を受信した後に、ＦＥＣパケットＦ３−２を受信することなく、データパケットＤ１８を受信した場合、「第Ｎ層の直前のブロック」は、データパケットＤ１２〜Ｄ１７が属するブロックＢ３−３である。そして、図２５の例では、データパケットＤ１２〜Ｄ１７のうち、データパケットＤ１５が消失しており、受信されていない。よって、この場合、処理はステップＳ２１０に移行する。
【０４９８】
この場合、判断部３０３は、ステップＳ２０３において、ブロック管理テーブル５００の６番目のエントリを既に見つけている。そして、見つかったエントリの階層フィールドの値はＮ（＝３）なので、判断部３０３は、見つかったエントリの内容から、データパケットＤ１２〜Ｄ１７を「第Ｎ層の直前のブロック」に属するデータパケットとして特定する。すると、判断部３０３は、バッファ部３０２への問い合わせの結果、データパケットＤ１５が受信されていないことを認識する。したがって、処理はステップＳ２１０に移行する。
【０４９９】
ステップＳ２０９で判断部３０３は、生成部３０６に対し、第Ｎ層の直前のブロックに属するデータパケットを用いて、消失したＦＥＣパケットを生成するよう、要求する。そして、生成部３０６は、要求にしたがってＦＥＣパケットを生成し、バッファ部３０２に出力する。すると、処理は図２０のステップＳ２２２に移行する。
【０５００】
なお、判断部３０３は、消失したＦＥＣパケットの生成を生成部３０６に命令すると、消失したＦＥＣパケットの階層を記憶する内部記憶を書き換える。例えば、判断部３０３は、消失した第２層のＦＥＣパケットＦ２−１の生成を生成部３０６に命令した場合、「第２層のＦＥＣパケットの消失を検出した」という内部記憶をクリアする。
【０５０１】
ステップＳ２０９の処理は、具体的には、例えば、以下のように行われてもよい。
まず、判断部３０３は、ステップＳ２０３の判断においてブロック管理テーブル５００の検索の結果見つかったエントリの内容から、ＦＥＣパケットの生成に用いるパケットを特定する。例えば、図２５の例で受信部３０１がデータパケットＤ１２を受信した場合、判断部３０３は、消失したＦＥＣパケットＦ２−１を生成するために用いるパケットとして、ＦＥＣパケットＦ３−１とデータパケットＤ６〜Ｄ１１を以下のようにして特定してもよい。
【０５０２】
ステップＳ２０３で判断部３０３は、「階層が２であり、ブロックの開始番号が０であり、ブロックの終了番号が１１である」というエントリを既に見つけている。また、図２５の例では、Ｎ＝３である。よって、判断部３０３は、見つけたエントリの階層（＝２）より深い、第Ｎ層までの各階層のＦＥＣパケットで、バッファ部３０２に記憶されているものすべてを、消失したＦＥＣパケットＦ２−１を生成するために用いるパケットとして、生成部３０６に指定する。
【０５０３】
なお、本実施形態では、後述するように、ＦＥＣパケットが受信されると、同じ階層のＦＥＣパケットが既にバッファ部３０２に格納されている場合は、同じ階層の古いＦＥＣパケットが捨てられる。よって、上記の例では、判断部３０３は、第３層の受信済みのＦＥＣパケットＦ３−１を、消失したＦＥＣパケットＦ２−１を生成するために用いるパケットとして認識することができる。
【０５０４】
また、判断部３０３は、さらに、ステップＳ２０８で認識した「第Ｎ層の直前のブロック」に属するデータパケットＤ６〜Ｄ１１を、消失したＦＥＣパケットＦ２−１を生成するために用いるパケットとして認識する。そして、判断部３０３は、以上のようにして認識したデータパケットＤ６〜Ｄ１１とＦＥＣパケットＦ３−１を使ってＦＥＣパケットＦ２−１を生成するよう、生成部３０６に命令する。
【０５０５】
すると、生成部３０６は、バッファ部３０２からデータパケットＤ６〜Ｄ１１とＦＥＣパケットＦ３−１を読み出す。そして、生成部３０６は、式（４．１）にしたがってＦＥＣパケットＦ２−１を生成し、生成したＦＥＣパケットＦ２−１をバッファ部３０２に格納する。
【０５０６】
つまり、生成部３０６は、ＦＥＣパケットＦ２−１のＦＥＣレベル０ペイロード７０９として、ＦＥＣパケットＦ３−１のＦＥＣレベル０ペイロード７０９とデータパケットＤ６〜Ｄ１１それぞれのＲＴＰペイロード６０６の排他的論理和を計算する。そして、生成部３０６は、ＦＥＣパケットＦ２−１のＦＥＣヘッダ７０７において、Ｅビットを１に設定し、ＦＥＣパケットＦ２−１に対応する階層である「第２層」を示す値を階層フィールドに設定する。
【０５０７】
また、生成部３０６は、ＦＥＣパケットＦ３−１のＦＥＣヘッダ７０７内の各リカバリフィールドの値と、データパケットＤ６〜Ｄ１１それぞれのＲＴＰヘッダ６０５内の対応するフィールドの値の排他的論理和を計算する。そして、生成部３０６は、計算した値をＦＥＣパケットＦ２−１のＦＥＣヘッダ７０７内の各リカバリフィールドに設定する。
【０５０８】
また、生成部３０６は、データパケットＤ６〜Ｄ１１のシーケンス番号に基づいて、ＦＥＣパケットＦ２−１のＦＥＣヘッダ７０７内のＳＮベースフィールドと、ＦＥＣレベル０ヘッダ７０８内のマスクフィールドを設定する。なお、ここで説明を省略した他のフィールド（図１６〜１７を参照）については、生成部３０６は、ＲＦＣ５１０９に適合するように適宜値を設定する。
【０５０９】
生成部３０６は、以上のようにして生成したＦＥＣパケットＦ２−１を、「第２層」という階層と対応づけてバッファ部３０２に記憶させる。そして、処理はステップＳ２０９から図２０のステップＳ２２２に移行する。
【０５１０】
さて、ステップＳ２１０で判断部３０３は、第Ｎ層の直前のブロックに属するデータパケットのうち、まだ受信されていないことをステップＳ２０８で確認した１つまたは複数のデータパケット（つまり消失したデータパケット）の再送を、送信元装置３１０に要求する。例えば、図２５では、データパケットＤ１８の受信を契機にＦＥＣパケットＦ３−２の消失がステップＳ２０３で検出された後、ステップＳ２１０で判断部３０３がデータパケットＤ１５の再送を送信元装置３１０に要求する。
【０５１１】
なお、再送要求は指示部３０８を介して行われてもよい。また、再送要求は、消失したデータパケットを識別するためのシーケンス番号を含む。
そして、次のステップＳ２１１で判断部３０３は、総パケットカウンタと消失パケットカウンタを、ステップＳ２１０で再送を要求したデータパケットの数だけ、インクリメントする。そして、今回のパケットの受信を契機とする処理は終了する。
【０５１２】
例えば、図２５の上記の例では、Ｓ２１０で判断部３０３が再送を要求したデータパケットはデータパケットＤ１５だけである。よって、ステップＳ２１１で判断部３０３は、総パケットカウンタを１だけインクリメントし、消失パケットカウンタを１だけインクリメントする。
【０５１３】
その結果、データパケットＤ１８の受信を契機として、総パケットカウンタはステップＳ２０７とＳ２１１で合計３だけインクリメントされ、図２５のとおり値が（Ｔ＋１９）から（Ｔ＋２２）になる。また、データパケットＤ１８の受信を契機として、消失パケットカウンタはステップＳ２０６とＳ２１１で合計２だけインクリメントされ、図２５のとおり値が（Ｌ＋２）から（Ｌ＋４）になる。
【０５１４】
ところで、図２１のステップＳ２１２が実行されるのは、上記のとおり、今回の受信が（Ｐ−４）に該当する場合である。そこで、ステップＳ２１２で判断部３０３は、今回の受信により第Ｎ層の直前のブロック中のデータパケットがすべて揃ったか否かを判断する。ステップＳ２１２では、例えばステップＳ２０８での判断と同様に、判断部３０３からバッファ部３０２への問い合わせを通して判断がなされてもよい。
【０５１５】
もし、今回の受信によってもまだ第Ｎ層の直前のブロック中のデータパケットが揃わない場合は、第Ｎ層の直前のブロック中のデータパケットがすべて揃うのを待つために、今回の受信を契機とする一連の処理は終了する。例えば、過去に判断部３０３がステップＳ２１０において複数のデータパケットの再送を送信元装置３１０に要求した場合、再送を要求したうちの１つのデータパケットを受信部３０１が受信した段階では、第Ｎ層の直前のブロック中のデータパケットがまだすべて揃わない。よって、残りのデータパケットが再送されるまで待つために、処理が終了する。
【０５１６】
逆に、今回の受信により第Ｎ層の直前のブロック中のデータパケットがすべて揃った場合は、処理はステップＳ２１２からステップＳ２１３に移行する。例えば、図２５の例で、今回の受信が、再送されたデータパケットＤ１５の受信である場合、今回の受信により、第Ｎ層の直前のブロックのすべてのデータパケットが揃う。よって、この場合、処理はステップＳ２１３に移行する。
【０５１７】
なお、ステップＳ２１２での「第Ｎ層の直前のブロック」とは、再送要求の要否の判断の契機となったＦＥＣパケット（ステップＳ２０３で消失が検出されたか、またはステップＳ２０１で受信されたもの）の直前の第Ｎ層のブロックのことである。例えば、図２５の例において、今回の受信が、再送されたデータパケットＤ１５の受信である場合は、データパケットＤ１２〜Ｄ１７の属するブロックＢ３−３が「第Ｎ層の直前のブロック」である。
【０５１８】
さて、ステップＳ２１３で判断部３０３は、消失したＦＥＣパケットがあるか否かを判断する。例えば、図２５の例で、データパケットＤ１８の受信を契機として、判断部３０３は、ステップＳ２０３でＦＥＣパケット３−２の消失を検出すると、第３層のＦＥＣパケットの消失を検出したことを内部的に記憶してもよい。すると、ステップＳ２１３で判断部３０３は、判断部３０３自身の内部記憶に基づいて、消失したＦＥＣパケットがあるか否かを判断することができる。
【０５１９】
なお、たとえＦＥＣパケットが消失しなくても、第Ｎ層の１つのブロックの中で複数のデータパケットが消失すれば、再送が生じる。よって、ステップＳ２１３が実行される場合に、消失したＦＥＣパケットがあるとは限らない。そのため、判断部３０３はステップＳ２１３で、まず、消失したＦＥＣパケットがあるか否かを判断する。そして、もし消失したＦＥＣパケットがなければ、処理は図２０のステップＳ２２２に移行する。
【０５２０】
逆に、もし消失したＦＥＣパケットがあれば、ステップＳ２１３でさらに判断部３０３は、ＦＥＣパケットの生成を生成部３０６に命令する。すると、生成部３０６はＦＥＣパケットを生成してバッファ部３０２に出力する。そして、処理は図２０のステップＳ２２２に移行する。
【０５２１】
なお、判断部３０３は、消失したＦＥＣパケットの生成を生成部３０６に命令すると、消失したＦＥＣパケットの階層を記憶する内部記憶を書き換える。例えば、判断部３０３は、消失した第３層のＦＥＣパケットＦ３−２の生成を生成部３０６に命令した場合、「第３層のＦＥＣパケットの消失を検出した」という内部記憶をクリアする。
【０５２２】
ステップＳ２１３におけるＦＥＣパケットの生成の詳細は、ステップＳ２０９と類似である。例えば、図２５の例では、再送されたデータパケットＤ１５の受信を契機として、ステップＳ２１３で判断部３０３が、消失したＦＥＣパケットＦ３−２を生成するために用いるパケットとして、データパケットＤ１２〜Ｄ１７を生成部３０６に指定する。なお、このように消失したＦＥＣパケットＦ３−２が最下層（第３層）の場合、生成部３０６は、受信済みの他のＦＥＣパケットを使わない。
【０５２３】
つまり、生成部３０６は、ＦＥＣパケットＦ３−２のＦＥＣレベル０ペイロード７０９として、データパケットＤ１２〜Ｄ１７それぞれのＲＴＰペイロード６０６の排他的論理和を計算する。そして、生成部３０６は、ＦＥＣパケットＦ３−２のＦＥＣヘッダ７０７において、Ｅビットを１に設定し、ＦＥＣパケットＦ３−２に対応する階層である「第３層」を示す値を階層フィールドに設定する。
【０５２４】
また、生成部３０６は、ＦＥＣパケットＦ３−２のＦＥＣヘッダ７０７内の各リカバリフィールドに、データパケットＤ１２〜Ｄ１７それぞれのＲＴＰヘッダ６０５内の対応するフィールドの値の排他的論理和を設定する。さらに、生成部３０６は、データパケットＤ１２〜Ｄ１７のシーケンス番号に基づいて、ＦＥＣパケットＦ３−２のＦＥＣヘッダ７０７内のＳＮベースフィールドと、ＦＥＣレベル０ヘッダ７０８内のマスクフィールドを設定する。なお、ここで説明を省略した他のフィールド（図１６〜１７を参照）については、生成部３０６は、ＲＦＣ５１０９に適合するように適宜値を設定する。
【０５２５】
生成部３０６は、以上のようにして生成したＦＥＣパケットＦ３−２を、「第３層」という階層と対応づけてバッファ部３０２に記憶させる。そして、処理はステップＳ２１３から図２０のステップＳ２２２に移行する。
【０５２６】
さて、図２０のステップＳ２１４は、今回の受信がＦＥＣパケットの受信である場合に実行される。ＦＥＣパケットの受信を検出した判断部３０３は、今回受信したＦＥＣパケットと同じ階層のＦＥＣパケットが既にバッファ部３０２に格納されている場合は、同じ階層の古いＦＥＣパケットを廃棄するようバッファ部３０２に命令する。そしてバッファ部３０２は命令にしたがって古いＦＥＣパケットを廃棄する。
【０５２７】
例えば、図２４の例で、ＦＥＣパケットＦ３−２が受信された時点では、バッファ部３０２に同じ第３層のＦＥＣパケットＦ３−１が格納されている。よって、判断部３０３はＦＥＣパケットＦ３−１の廃棄をバッファ部３０２に命令する。
【０５２８】
他方、図２４の例で、ＦＥＣパケットＦ２−１が受信された時点では、バッファ部３０２に格納されている第２層の他のＦＥＣパケットはない。よって、廃棄されるＦＥＣパケットはない。
【０５２９】
上記のようにして場合に応じて古いＦＥＣパケットが廃棄された後、さらに、ステップＳ２１４で判断部３０３は、第Ｎ層の注目しているブロック中のデータパケットの受信状況を判断する。なお、ここで「第Ｎ層の注目しているブロック」とは、今回受信されたＦＥＣパケットの直前のデータパケットが第Ｎ層において属するブロックのことである。
【０５３０】
そして、第Ｎ層の注目しているブロックに属するすべてのデータパケットが受信部３０１によりすべて受信できていた場合、処理はステップＳ２１５に移行する。また、第Ｎ層の注目しているブロックに属するデータパケットのうち１つだけが消失した場合（すなわち残りのデータパケットはすべて受信部３０１により受信できていた場合）、処理はステップＳ２１６に移行する。そして、第Ｎ層の注目しているブロックに属するデータパケットのうち２つ以上が消失した場合、処理はステップＳ２１９に移行する。なお、ステップＳ２１４における受信状況の判断は、具体的には、ステップＳ２０８の判断と同様に、バッファ部３０２への問い合わせにより実現されてもよい。
【０５３１】
例えば、図２４と図２５の例では、ＦＥＣパケットＦ３−１を受信部３０１が受信した場合、「第Ｎ層の注目しているブロック」はデータパケットＤ０〜Ｄ５の属するブロックＢ３−１であり、データパケットＤ２が消失している。よって、処理はステップＳ２１４からステップＳ２１６へ移行する。
【０５３２】
同様に、図２４の例で、今回の受信がＦＥＣパケットＦ２−１の受信である場合も、処理はステップＳ２１４からステップＳ２１６に移行する。なぜなら、データパケットＤ６〜Ｄ１１のうちデータパケットＤ８が消失しているからである。
【０５３３】
同様に、図２４の例で、今回の受信がＦＥＣパケットＦ１−１の受信である場合も、処理はステップＳ２１４からステップＳ２１６に移行する。なぜなら、データパケットＤ１８〜Ｄ２３のうちデータパケットＤ１９が消失しているからである。
【０５３４】
また、図２４の例で、今回の受信がＦＥＣパケットＦ３−２の受信である場合、第Ｎ層の注目しているブロックに属するデータパケットＤ１２〜Ｄ１７はすべて既に受信されている。よって、処理はステップＳ２１４からステップＳ２１５に移行する。
【０５３５】
さて、ステップＳ２１５で判断部３０３は、今回のＦＥＣパケットの受信を総パケットカウンタに反映するため、総パケットカウンタを１だけインクリメントする。そして、処理はステップＳ２２２に移行する。
【０５３６】
他方、ステップＳ２１６で判断部３０３は、消失した１つのデータパケットを復元するよう、復元部３０４に要求する。そして、復元部３０４は、要求にしたがって、復元に用いるＦＥＣパケットとデータパケットをバッファ部３０２から読み出し、読み出したパケットを使って、消失したデータパケットを復元する。また、復元部３０４は、復元したデータパケットをバッファ部３０２に出力する。ステップＳ２１６の詳細は、例えば以下のようであってもよい。
【０５３７】
判断部３０３は、今回受信されたＦＥＣパケットの階層を、ＦＥＣヘッダ７０７の階層フィールドから認識する。
そして、判断部３０３が認識した階層が最下層（つまり第Ｎ層）の場合、式（５．１０）によれば、ＦＥＣ＿Ｎｅｗ（）は、今回受信されたＦＥＣパケットに対応する。よって、判断部３０３は、第Ｎ層の注目しているブロックに属する、消失した１つのデータパケット以外のすべてのデータパケットと、今回受信されたＦＥＣパケットとを用いて復元を行うよう、復元部３０４に命令する。
【０５３８】
例えば、図２４の例でＦＥＣパケットＦ３−１が受信された場合、判断部３０３が認識する階層は第３層（つまり第Ｎ層）である。よって、判断部３０３は、第３層の注目しているブロックＢ３−１に属するデータパケットＤ０、Ｄ１、Ｄ３〜Ｄ５と、ＦＥＣパケットＦ３−１とを用いてデータパケットＤ２を復元するよう、復元部３０４に命令する。
【０５３９】
すると、復元部３０４は、データパケットＤ０、Ｄ１、Ｄ３〜Ｄ５とＦＥＣパケットＦ３−１をバッファ部３０２から読み出し、読み出したパケットを使ってデータパケットＤ２を復元する。そして、復元部３０４は、復元したデータパケットＤ２をバッファ部３０２に出力する。
【０５４０】
具体的には、復元部３０４は、ＦＥＣパケットＦ３−１のＦＥＣレベル０ペイロード７０９とデータパケットＤ０、Ｄ１、Ｄ３〜Ｄ５それぞれのＲＴＰペイロード６０６の排他的論理和を、データパケットＤ２のＲＴＰペイロード６０６として計算する。
【０５４１】
また、復元部３０４は、ＦＥＣパケットＦ３−１のＦＥＣヘッダ７０７内の各リカバリフィールドの値と、データパケットＤ０、Ｄ１、Ｄ３〜Ｄ５それぞれのＲＴＰヘッダ６０５内の対応するフィールドの値の排他的論理和を計算する。そして、復元部３０４は、計算した値を、データパケットＤ２のＲＴＰヘッダ６０５内の対応するフィールドに設定する。
【０５４２】
あるいは、図２４の例でＦＥＣパケットＦ１−１が受信された場合、今回受信されたＦＥＣパケットＦ１−１のＦＥＣヘッダ７０７の階層フィールドから判断部３０３が認識する階層は第１層である。このように、判断部３０３が認識した階層が最下層ではない場合、式（５．９）によれば、ＦＥＣ＿Ｎｅｗ（）は、今回受信されたＦＥＣパケットと、判断部３０３が認識した階層より深い各階層の受信済みのＦＥＣパケットとの排他的論理和である。
【０５４３】
例えば、図２４の例でＦＥＣパケットＦ１−１が受信された場合、ｎ＝１＜Ｎなので、式（５．９）（より具体的には式（５．１３））のとおり、ＦＥＣ＿Ｎｅｗ（）は、ＦＥＣパケットＦ１−１とＦ２−１とＦ３−２の排他的論理和である。よって、判断部３０３は、ＦＥＣパケットＦ１−１とＦ２−１とＦ３−２と、データパケットＤ１８、Ｄ２０〜Ｄ２３を用いてデータパケットＤ１９を復元するよう、復元部３０４に命令する。
【０５４４】
すると、復元部３０４は、ＦＥＣパケットＦ１−１とＦ２−１とＦ３−２と、データパケットＤ１８、Ｄ２０〜Ｄ２３をバッファ部３０２から読み出し、読み出したパケットを使ってデータパケットＤ１９を復元する。そして、復元部３０４は、復元したデータパケットＤ１９をバッファ部３０２に出力する。
【０５４５】
具体的には、復元部３０４は、ＦＥＣパケットＦ１−１とＦ２−１とＦ３−２それぞれのＦＥＣレベル０ペイロード７０９と、データパケットＤ１８、Ｄ２０〜Ｄ２３それぞれのＲＴＰペイロード６０６の排他的論理和を計算する。そして、復元部３０４は、計算結果をデータパケットＤ１９のＲＴＰペイロード６０６に設定する。
【０５４６】
また、復元部３０４は、ＦＥＣパケットＦ１−１とＦ２−１とＦ３−２それぞれのＦＥＣヘッダ７０７内の各リカバリフィールドの値と、データパケットＤ１８、Ｄ２０〜Ｄ２３それぞれのＲＴＰヘッダ６０５内の対応するフィールドの値の排他的論理和を計算する。そして、復元部３０４は、計算した値を、データパケットＤ１９のＲＴＰヘッダ６０５内の対応するフィールドに設定する。
【０５４７】
以上のようにして消失したデータパケットがバッファ部３０２上に復元されると、処理はステップＳ２１６からステップＳ２１７へと移行する。そして、ステップＳ２１７で判断部３０３は、消失パケットカウンタを１だけインクリメントする。
【０５４８】
例えば、図２４の例でＦＥＣパケットＦ２−１が受信された場合、ＦＥＣパケットＦ２−１の受信を契機として、データパケットＤ８の消失をステップＳ２１４で判断部３０３が確認済みである。よって、判断部３０３は、データパケットＤ８の消失を反映するため、消失パケットカウンタを１だけインクリメントする。
【０５４９】
さらに、次のステップＳ２１８で判断部３０３は、今回のＦＥＣパケットの受信と、１つのデータパケットの消失とを総パケットカウンタに反映するため、総パケットカウンタを２だけインクリメントする。そして、処理はステップＳ２２２に移行する。なお、ステップＳ２１６〜Ｓ２１８の実行順は適宜入れ換えられてもよい。
【０５５０】
さて、上記「第Ｎ層の注目しているブロック」において、２つ以上のデータパケットが消失していた場合に、ステップＳ２１９〜Ｓ２２１の処理が実行される。すなわち、受信済みのデータパケットとＦＥＣパケットからでは消失したデータパケットを復元することができない場合、ステップＳ２１９〜Ｓ２２１の処理が実行される。なお、ステップＳ２１９〜Ｓ２２１の実行順は適宜入れ換えられてもよい。
【０５５１】
具体的には、ステップＳ２１９で判断部３０３は、消失した２つ以上のデータパケットのすべての再送を送信元装置３１０に要求する。再送要求は、消失したデータパケットを識別するためのシーケンス番号を含む。また、再送要求は指示部３０８を介して行われてもよい。
【０５５２】
そして、ステップＳ２２０で判断部３０３は、消失パケットカウンタを、ステップＳ２１９で再送を要求したデータパケットの数だけ、インクリメントする。
また、ステップＳ２２１で判断部３０３は、総パケットカウンタを、ステップＳ２１９で再送を要求したデータパケットの数に１を足した数だけ、インクリメントする。１を足す理由は、今回のＦＥＣパケットの受信を総パケットカウンタに反映するためである。そして、データパケットの再送を待つため、今回の受信を契機とした一連の処理は終了する。
【０５５３】
さて、ステップＳ２２２が実行されるのは、ステップＳ２０９、Ｓ２１３、Ｓ２１５またはＳ２１８の実行後である。つまり、ステップＳ２２２以降の処理は、或るＦＥＣパケットと当該ＦＥＣパケットの直前の第Ｎ層のブロックに属するすべてのデータパケットがすべてバッファ部３０２中に揃っている場合に、実行される。
【０５５４】
本実施形態では、具体的にまずステップＳ２２２で指示部３０８は、誤り訂正前のパケットロス率Ｐ（つまり送信元装置３１０と転送装置３００の間のリンクでのエラーレート）を計算する。具体的には、指示部３０８は、消失パケットカウンタの値を総パケットカウンタの値で割ることで、誤り訂正前のパケットロス率Ｐを得る。
【０５５５】
また、本実施形態では、誤り訂正後の許容エラー率Ａが予め定数として定められている。誤り訂正後の許容エラー率Ａは、例えば、指示部３０８を実現するためにＣＰＵ２０１が実行するプログラムに定数として定義されていてもよい。なお、誤り訂正後の許容エラー率Ａは、０＜Ａ＜１の任意の値でよい。例えば、Ａ＝０．００１でもよい。
【０５５６】
例えば動画や音声などのストリーミングデータでは、或る程度の割合までならば、たとえデータが欠落しても、動画や音声を視聴している人間にとってあまり不自然には感じられない。つまり、データパケットのペイロードの内容によっては、消失したデータパケットのうちの一部が復元不能であったとしても、許容されることがある。
【０５５７】
また、データパケットのペイロードの内容によらず、一般に、通信システムにおいては、一定程度以下での頻度での再送要求は許容される。もちろん、「一定程度」の具体的な値は通信の用途や目的などに応じて様々に異なる。
【０５５８】
そこで、例えば上記のようなストリーミングデータの特性や、許容される再送要求の発生頻度などに応じて、適宜の定数が誤り訂正後の許容エラー率Ａとして予め定められ、指示部３０８に設定される。つまり、誤り訂正後の許容エラー率Ａは、復元不能なデータパケットの割合として許容される値を示す。
【０５５９】
そこで、ステップＳ２２２でさらに指示部３０８は、計算した誤り訂正前のパケットロス率Ｐと、予め決められた誤り訂正後の許容エラー率Ａから、必要な誤り訂正性能を得るために適切な層の深さＮｎｅｗを、以下のようにして計算する。
【０５６０】
ここで、Ｂ個のデータパケットに１個の割合でＦＥＣパケットが１個挿入されるとする。つまり、最下層のブロックがＢ個のデータパケットからなるとする。例えば、図１の例では、最下層が第３層ならばＢ＝６であり、最下層が第２層ならばＢ＝１２である。
【０５６１】
すると、ＦＥＣパケットを用いた誤り訂正後のパケットロス率は約ＢＰ２である。なぜなら、「或るデータパケットが、ＦＥＣパケットを用いた誤り訂正によっても復元不能である」ということは、「下記（Ｑ−１）と（Ｑ−２）がともに成立する」ということ同値だからである。
【０５６２】
（Ｑ−１）当該或るデータパケットが消失した。
（Ｑ−２）第Ｎ層において、消失した当該或るデータパケットと同じブロックに属する残りの（Ｂ−１）個のデータパケットのうち１つ以上が消失したか、または、上記ブロックの直後に挿入されるＦＥＣパケットが消失した。
【０５６３】
ここで、（Ｑ−１）が成立する確率は、パケットロス率Ｐである。また、（Ｑ−２）が成立する確率は、１−（１−Ｐ）Ｂである。そして、２項定理より式（２０．２）が成り立つ。
【０５６４】
【数１】
0005682253.tif 000002
【０５６５】
また、パケットロス率Ｐに関しては、Ｐ≪１と見なすことができる。そして、Ｐ≪１のとき、Ｐの２次以上の項を無視することができるので、式（２０．２）から式（２０．３）が得られる。
【０５６６】
(1-P)B≒BCB-1×(-P)1+BCB×(-P)0=-BP+1         (20.3)
【０５６７】
したがって、Ｐ≪１のとき、（Ｑ−２）が成立する確率は、式（２０．４）のとおりである。
【０５６８】
1-(1-P)B≒1-(-BP+1)=BP                      (20.4)
【０５６９】
したがって、（Ｑ−１）と（Ｑ−２）がともに成立する確率は、式（２０．５）のとおり約ＢＰ２である。
【０５７０】
P{1-(1-P)B}≒BP2                            (20.5)
【０５７１】
したがって、ステップＳ２２２で指示部３０８は、誤り訂正後のパケットロス率ＢＰ２が誤り訂正後の許容エラー率Ａ以下となるような適切なＢの値を計算し、計算したＢの値から適切な層の深さＮｎｅｗを得る。つまり、指示部３０８は、式（２０．６）を満たす最大のＢとして、式（２０．７）のＢを計算する。
【０５７２】
BP2≦A                                     (20.6)
【０５７３】
B=A/P2                                     (20.7)
【０５７４】
例えば、Ａ＝０．００３かつＰ＝０．０２のとき、式（２０．７）によればＢ＝７．５である。よって、指示部３０８は、ブロックサイズが７．５以下の階層のうち最も浅い階層の深さを、適切な層の深さＮｎｅｗとして得る。例えば、図１や図１４の例では、第２層のブロックサイズが１２で第３層のブロックサイズが６なので、Ｎｎｅｗ＝３である。指示部３０８は、ブロックサイズを認識するために図１４のブロック管理テーブル５００を参照してもよい。
【０５７５】
なお、以上の誤り訂正前のパケットロス率Ｐと、誤り訂正後の許容エラー率Ａと、最下層のブロックサイズＢとの関係を、別の観点から述べれば、次のとおりである。
式（２０．６）を変形すると、次の式（２０．８）が得られる。
【０５７６】
【数２】
0005682253.tif 000003
【０５７７】
ここで、式（２０．８）の右辺のＢに、現在の転送装置３００にとっての最下層のブロックサイズを代入したときに、誤り訂正前のパケットロス率Ｐが式（２０．８）を満たすならば、現在の誤り訂正性能（ＦＥＣ強度ともいう）は十分である。逆に、式（２０．８）が満たされないならば、現在の誤り訂正性能は不足であるから、第Ｎ層よりも深い階層を最下層とするよう、指示部３０８は送信元装置３１０に指示する必要がある。
【０５７８】
さて、ステップＳ２２２で上記のように適切な階層の深さＮｎｅｗが計算されると、処理はステップＳ２２３に移行する。そして、ステップＳ２２３で指示部３０８は、現在の最下層の深さＮが、計算された適切な階層の深さＮｎｅｗよりも浅いか否かを判断する。そして、Ｎ＜Ｎｎｅｗの場合（つまり十分な誤り訂正性能が得られていない場合）、処理はステップＳ２２４に移行する。逆に、Ｎ≧Ｎｎｅｗの場合（つまり十分な誤り訂正性能が得られている場合）、処理はステップＳ２２５に移行する。
【０５７９】
ステップＳ２２４で指示部３０８は、ＦＥＣパケットの増加要求を送信元装置３１０へ送信する。増加要求は、適切な階層の深さＮｎｅｗを指定する情報（例えば、深さＮｎｅｗそのもの、あるいは深さＮｎｅｗと深さＮの差）を含む。つまり、ＦＥＣパケットを生成する対象の階層の最大深さを深くする（具体的にはＮからＮｎｅｗに変える）ことで、ＦＥＣパケットが挿入される割合を増やすように、指示部３０８は送信元装置３１０に要求する。
【０５８０】
増加要求の送信後、処理は図２２または図２３のステップＳ２２７へ移行する。すなわち、転送装置３００が中継ノードとして動作している場合は、増加要求の送信後、処理は図２２のステップＳ２２７へ移行し、転送装置３００が葉ノードとして動作している場合は、増加要求の送信後、処理は図２３のステップＳ２２７へ移行する。
【０５８１】
また、ステップＳ２２５で指示部３０８は、現在の最下層の深さＮが、計算された適切な層の深さＮｎｅｗよりも深いか否かを判断する。そして、Ｎ＞Ｎｎｅｗの場合（つまり過剰な誤り訂正性能が得られている場合）、処理はステップＳ２２６に移行する。
【０５８２】
逆に、Ｎ＝Ｎｎｅｗの場合（つまり現在の誤り訂正性能が適切である場合）、処理は図２２または図２３のステップＳ２２７へ移行する。つまり、転送装置３００が中継ノードとして動作している場合は、処理が図２２のステップＳ２２７へ移行し、転送装置３００が葉ノードとして動作している場合は、処理が図２３のステップＳ２２７へと移行する。
【０５８３】
また、ステップＳ２２６で指示部３０８は、ＦＥＣパケットの削減要求を送信元装置３１０へ送信する。削減要求は、適切な階層の深さＮｎｅｗを指定する情報（例えば、深さＮｎｅｗそのもの、あるいは深さＮｎｅｗと深さＮの差）を含む。つまり、ＦＥＣパケットを生成する対象の階層の最大深さを浅くする（具体的にはＮからＮｎｅｗに変える）ことで、ＦＥＣパケットが挿入される割合を減らすように、指示部３０８は、送信元装置３１０に要求する。
【０５８４】
削減要求の送信後、処理は図２２または図２３のステップＳ２２７へ移行する。すなわち、転送装置３００が中継ノードとして動作している場合は、削減要求の送信後、処理は図２２のステップＳ２２７へ移行し、転送装置３００が葉ノードとして動作している場合は、削減要求の送信後、処理は図２３のステップＳ２２７へ移行する。
【０５８５】
さて、図２２のステップＳ２２７で、中継ノードとして動作する転送装置３００のバッファ部３０２内の不図示の制御部は、注目している第Ｎ層のブロックに属するデータパケットを、不図示の上位層アプリケーションに供給する。例えば、バッファ部３０２内の制御部は、注目している第Ｎ層のブロックに属する各データパケットのＵＤＰペイロード６０４であるＲＴＰパケットを、動画再生アプリケーションに供給してもよい。
【０５８６】
なお、ステップＳ２２７における「注目している第Ｎ層のブロック」とは、下記（Ｒ−１）〜（Ｒ−３）のいずれかである。
（Ｒ−１）ステップＳ２０９からステップＳ２２２へ処理が進んだ後にステップＳ２２７が実行される場合は、ステップＳ２０８の「第Ｎ層の直前のブロック」。例えば、図２５の例でデータパケットＤ１２が受信された場合は、データパケットＤ１２の受信を契機に消失が検出されたＦＥＣパケットＦ２−１の直前のデータパケットＤ６〜Ｄ１１が属する第３層のブロックＢ３−２。
【０５８７】
（Ｒ−２）ステップＳ２１３からステップＳ２２２へ処理が進んだ後にステップＳ２２７が実行される場合は、ステップＳ２１２の「第Ｎ層の直前のブロック」。例えば、図２５の例で再送されたデータパケットＤ１５が受信された場合は、データパケットＤ１５を含む第３層のブロックＢ３−３。
【０５８８】
（Ｒ−３）ステップＳ２１５またはＳ２１８からステップＳ２２２へ処理が進んだ後にステップＳ２２７が実行される場合は、ステップＳ２１４の「第Ｎ層の注目しているブロック」。例えば、図２４の例でＦＥＣパケットＦ３−１が受信された場合は、ＦＥＣパケットＦ３−１の直前のデータパケットＤ０〜Ｄ５が属する第３層のブロックＢ３−１。また、図２４の例でＦＥＣパケットＦ３−２が受信された場合は、ＦＥＣパケットＦ３−２の直前のデータパケットＤ１２〜Ｄ１７が属する第３層のブロックＢ３−３。
【０５８９】
さて、次のステップＳ２２８で送信部３０７は、配信先管理テーブル４００の各エントリを順に処理するためのインデックスｋを１に初期化する。
続いて、ステップＳ２２９で送信部３０７は、配信先管理テーブル４００のｋ番目のエントリを参照し、ｋ番目の送信先装置３２０の階層の深さを読み取る。送信部３０７が読み取った階層の深さがＮと等しい場合、処理はステップＳ２３０に移行する。また、送信部３０７が読み取った階層の深さＮより浅い場合、処理はステップＳ２３１に移行する。そして、送信部３０７が読み取った階層の深さがＮより深い場合、処理はステップＳ２３２に移行する。
【０５９０】
ステップＳ２３０で送信部３０７は、ステップＳ２２７における「注目している第Ｎ層のブロック」に属するデータパケット６００と、それらのデータパケット６００の直後のＦＥＣパケット７００をｋ番目の送信先装置３２０に送信する。そして、処理はステップＳ２３３に移行する。
【０５９１】
なお、送信部３０７は、送信に際して、データパケット６００のＩＰヘッダ６０１とＦＥＣパケット７００のＩＰヘッダ７０１それぞれの送信先ＩＰアドレスフィールドに、配信先管理テーブル４００のｋ番目のエントリのＩＰアドレスを設定する。また、送信部３０７は、ＩＰヘッダ６０１とＩＰヘッダ７０１それぞれの送信元ＩＰアドレスフィールドに、転送装置３００自身のＩＰアドレスを設定する。
【０５９２】
さて、ステップＳ２３１で送信部３０７は、ＦＥＣパケット７００を間引きつつ、ステップＳ２２７における「注目している第Ｎ層のブロック」に属するデータパケット６００をｋ番目の送信先装置３２０に送信する。なお、送信部３０７は、送信に際して、ステップＳ２３０と同様にＩＰヘッダ６０１とＩＰヘッダ７０１を設定する。そして、処理はステップＳ２３３に移行する。
【０５９３】
なお、ステップＳ２３１での「間引き」とは、具体的には次のような処理のことである。
つまり、ｋ番目の送信先装置３２０の階層の深さが、ステップＳ２２７における「注目している第Ｎ層のブロック」の直後のＦＥＣパケット７００の階層と同じかそれより深い場合、送信部３０７は、当該ＦＥＣパケット７００をｋ番目の送信先装置３２０に送信する。逆に、ｋ番目の送信先装置３２０の階層の深さが、当該ＦＥＣパケット７００の階層より浅い場合、送信部３０７は、ｋ番目の送信先装置３２０へは、当該ＦＥＣパケット７００を送信しない。
【０５９４】
例えば、図２４の例において、今回の受信がＦＥＣパケットＦ２−１の受信である場合、「注目している第Ｎ層のブロック」は、データパケットＤ６〜Ｄ１１が属するブロックＢ３−２である。そして、ブロックＢ３−２の直後のＦＥＣパケットＦ２−１の階層は第２層である。
【０５９５】
よって、送信部３０７は、ｋ番目の送信先装置３２０の階層の深さが第２層かそれより深い場合に、ＦＥＣパケットＦ２−１をｋ番目の送信先装置３２０に送信する。逆に、ｋ番目の送信先装置３２０の階層の深さが第２層より浅い（要するに第１層である）場合、送信部３０７は、ｋ番目の送信先装置３２０へはＦＥＣパケットＦ２−１を送信しない。
【０５９６】
さて、ステップＳ２３２では、生成部３０６と送信部３０７が協働して、１つまたは複数のＦＥＣパケット７００を追加しつつ、ステップＳ２２７における「注目している第Ｎ層のブロック」に属するデータパケット６００をｋ番目の送信先装置３２０に送信する。なお、送信部３０７は、送信に際して、ステップＳ２３０と同様にＩＰヘッダ６０１とＩＰヘッダ７０１を設定する。そして、処理はステップＳ２３３に移行する。
【０５９７】
なお、ステップＳ２３２でのＦＥＣパケット７００の追加は、具体的には、図７を参照して説明したのと同様の処理である。例えば、図２４の例において、今回の受信がＦＥＣパケットＦ２−１の受信であり、ｋ番目の送信先装置３２０の層の深さが第４層であるとする。
【０５９８】
この場合、上記のとおり「注目している第Ｎ層のブロック」は、データパケットＤ６〜Ｄ１１が属するブロックＢ３−２である。よって、生成部３０６は、ブロック管理テーブル５００を参照して、ブロックＢ３−２のサブセットのブロックに対応するエントリのうち、階層が第Ｎ層より深く、かつｋ番目の送信先装置３２０の層の深さまでであるエントリを検索する。検索の結果、生成部３０６は、ブロックＢ３−２にサブセットとして含まれる第４層のブロックＢ４−３に対応するエントリを見つける。
【０５９９】
よって、生成部３０６は、見つけたエントリにしたがって、ブロックＢ４−３に属するデータパケットＤ６〜Ｄ８をバッファ部３０２から読み出し、データパケットＤ６〜Ｄ８からＦＥＣパケットＦ４−２を生成する。そして、生成部３０６は、生成したＦＥＣパケットＦ４−２をバッファ部３０２に出力する。
【０６００】
また、生成部３０６は、新たに生成したのはＦＥＣパケットＦ４−２のみであることと、生成したＦＥＣパケットＦ４−２の順番がデータパケットＤ８の直後であることを送信部３０７に通知する。すると、送信部３０７は、ｋ番目の送信先装置３２０へと、データパケットＤ６〜Ｄ８を送信し、ＦＥＣパケットＦ４−２を送信し、データパケットＤ９〜Ｄ１１を送信する。
【０６０１】
もちろん、ｋ番目の送信先装置３２０の層の深さによっては、ステップＳ２３２で生成部３０６が複数の階層の複数のＦＥＣパケット７００を生成することもある。
また、生成部３０６が、例えば５番目の送信先装置３２０に対応して第４層のＦＥＣパケット７００を生成した後で、８番目の送信先装置３２０に関してもステップＳ２３２が実行されることもあり得る。この場合、生成部３０６は、第４層の同じＦＥＣパケット７００を再度生成する必要はない。送信部３０７は、５番目の送信先装置３２０に対応して既に生成されてバッファ部３０２に格納されている第４層のＦＥＣパケット７００を、(適宜ＩＰヘッダ７０１を書き換えたうえで）８番目の送信先装置３２０にも送信すればよい。
【０６０２】
さて、ステップＳ２３３で送信部３０７は、インデックスｋが送信先装置３２０の数（すなわち配信先管理テーブル４００のエントリ数Ｚ）未満か否かを判断する。もし、インデックスｋが送信先装置３２０の数Ｚ未満であれば、処理はステップＳ２３４に移行する。逆に、インデックスｋが送信先装置３２０の数Ｚに達していれば、処理はステップＳ２３５に移行する。
【０６０３】
そして、ステップＳ２３４で送信部３０７は、インデックスｋを１だけインクリメントする。そして、処理はステップＳ２２９に戻る。
また、ステップＳ２３５で送信部３０７は、ステップＳ２２７における「注目している第Ｎ層のブロック」に属するすべてのデータパケットを削除するよう、バッファ部３０２に命令する。例えば、送信部３０７は、削除対象のデータパケットのシーケンス番号をバッファ部３０２に対して指定する。そして、バッファ部３０２は、指定されたデータパケットを削除する。
【０６０４】
なお、上記のステップＳ２２９〜Ｓ２３４の繰り返しループにおいて１回でもステップＳ２３２が実行された場合は、ステップＳ２３５で送信部３０７はさらに、ステップＳ２３２で生成部３０６が生成したＦＥＣパケットの削除もバッファ部３０２に命令する。そして、バッファ部３０２は、命令にしたがって、第Ｎ層よりも深い階層のＦＥＣパケットを削除する。
【０６０５】
そして、次のステップＳ２３６でバッファ部３０２は、ステップＳ２２７における「注目している第Ｎ層のブロック」は第１層のブロックの中で第Ｎ層の最後のブロックであるか否かを、例えばブロック管理テーブル５００を参照して判断する。そして、「注目している第Ｎ層のブロック」が第１層のブロックの中で第Ｎ層の最後のブロックである場合、処理はステップＳ２３７に移行する。逆に、「注目している第Ｎ層のブロック」が第１層のブロックの中で第Ｎ層の最後以外の位置のブロックの場合、今回の受信を契機とする処理は終了する。
【０６０６】
例えば、「注目している第Ｎ層のブロック」が、データパケットＤ１８〜Ｄ２３の属するブロックＢ３−４である場合は、処理はステップＳ２３７に移行する。逆に、「注目している第Ｎ層のブロック」が、データパケットＤ１２〜Ｄ１７の属するブロックＢ３−３である場合は、処理は終了する。
そして、ステップＳ２３７でバッファ部３０２は、保持しているＦＥＣパケットをすべて削除する。すると、今回の受信を契機とする処理は終了する。
【０６０７】
さて、葉ノードとして動作する転送装置３００においては、図２０のステップＳ２２４、Ｓ２２５、またはＳ２２６の後、処理が図２３のステップＳ２２７に移行する。図２３に示すステップＳ２２７、Ｓ２３５、Ｓ２３６およびＳ２３７は、図２２と同様であるので、詳しい説明は省略する。つまり、葉ノードとして動作する転送装置３００は、図２２のステップＳ２２８〜Ｓ２３４の転送処理を行わず、ステップＳ２２７の処理の直後にステップＳ２３５以降の処理を行う。
【０６０８】
ところで、以上説明した実施形態は、根ノードにおけるＦＥＣパケットの生成と、中継ノードが階層を深くするために行うＦＥＣパケットの生成の共通点という観点から、以下のように概観することもできる。つまり、転送装置２００または３００のようなコンピュータが行う様々な処理のうち、ＦＥＣパケットの生成に特に着目すると、上記実施形態は以下のようにまとめることもできる。
【０６０９】
すなわち、転送装置２００または３００のようなコンピュータは、プログラムにしたがって、まず、複数の階層で定義される階層的なブロックのうち或る階層の同じ第１のブロックに属している複数のデータ単位を取得する。
【０６１０】
ここで、「データ単位」の具体例は、データパケット６００中のＲＴＰペイロード６０６である。また、根ノードにおける「取得」は、データパケット供給部からの供給による取得であり、中継ノードにおける「取得」は、親ノード（例えば転送装置３００にとっての送信元装置３１０）からの受信による取得である。
【０６１１】
そして、上記「或る階層」が最上位の第１層の場合、上記「複数のデータ単位」の具体例は、データパケットＤ０〜Ｄ２３それぞれのＲＴＰペイロード６０６である。つまり、この場合の「第１のブロック」はブロックＢ１−１である。
【０６１２】
また、上記「或る階層」が第２層の場合、上記「複数のデータ単位」の具体例は、データパケットＤ０〜Ｄ１１それぞれのＲＴＰペイロード６０６である。つまり、この場合の「第１のブロック」はブロックＢ２−１である。
【０６１３】
また、上記「或る階層」が第３層の場合、上記「複数のデータ単位」の具体例は、データパケットＤ０〜Ｄ５それぞれのＲＴＰペイロード６０６である。つまり、この場合の「第１のブロック」はブロックＢ３−１である。
【０６１４】
また、上記「或る階層」が第３層の場合の上記「複数のデータ単位」の別の具体例は、データパケットＤ１２〜Ｄ１７それぞれのＲＴＰペイロード６０６である。つまり、この場合の「第１のブロック」はブロックＢ３−３である。
【０６１５】
また、コンピュータは、上記「複数のデータ単位」の排他的論理和に等しい、第１のブロックに対応する誤り訂正情報を生成する。ここで、「誤り訂正情報」の具体例は、ＦＥＣパケット７００のＦＥＣレベル０ペイロード７０９である。例えば、上記「複数のデータ単位」がデータパケットＤ０〜Ｄ２３それぞれのＲＴＰペイロード６０６の場合は、誤り訂正情報は、ＦＥＣパケットＦ１−１のＦＥＣレベル０ペイロード７０９である。
【０６１６】
さらに、コンピュータは、上記「或る階層」に連続する、上記「或る階層」よりも下の１層以上の各個別の階層において、以下の処理を行う。つまり、コンピュータは、当該個別の階層の１つ上の階層の同じブロックに含まれる当該個別の階層の２つ以上のブロックの中で、特定の１つのブロックを除く、１つ以上の個別のブロックの各々について、以下の処理を行う。具体的には、コンピュータは、上記「複数のデータ単位」のうち、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、当該個別のブロックに対応する誤り訂正情報を生成する。
【０６１７】
好ましくは、上記の「特定の１つのブロック」は、１つ上の階層の同じブロックに含まれる２つ以上のブロックの中で、最後のブロックである。例えば、第２層における「特定の１つのブロック」の具体例は、第１層の同じブロックＢ１−１に含まれる第２層のブロックＢ２−１とＢ２−２のうち、最後のブロックＢ２−２である。よって、誤り訂正情報の生成対象である「個別のブロック」の具体例は、ブロックＢ２−１である。
【０６１８】
また、第３層における「特定の１つのブロック」の具体例は、第２層の同じブロックＢ２−１に含まれる第３層のブロックＢ３−１とＢ３−２のうち、最後のブロックＢ３−２である。よって、誤り訂正情報の生成対象である「個別のブロック」の具体例は、ブロックＢ３−１である。
【０６１９】
なお、メモリ消費量の増大やネットワーク転送遅延の増大が問題にならないのであれば、上記の「特定の１つのブロック」は、例えば、１つ上の階層の同じブロックに含まれる２つ以上のブロックの中の最初のブロックであってもよい。
【０６２０】
例えば、ブロックＢ１−１のサブセットであるブロックＢ２−１とＢ２−２のうち、最初のブロックＢ２−１が「特定の１つのブロック」であってもよい。その場合、ブロックＢ２−２に対応してＦＥＣパケットが生成され、生成されたＦＥＣパケットがブロックＢ２−２の直前（つまりデータパケットＤ１１とＤ１２の間）に挿入される。第２層以外の他の階層についても同様である。そして、「特定の１つのブロック」が最初のブロックである場合、最上位の第１層のブロックＢ１−１に対応するＦＥＣパケットは、ブロックＢ１−１の直前（つまりデータパケットＤ０の直前）に挿入される。
【０６２１】
また、コンピュータは、上記「複数のデータ単位」と、上記「第１のブロック」に対応する誤り訂正情報と、各「個別のブロック」に対応する誤り訂正情報を送信する。
以上概観したコンピュータの動作は、根ノードが第１層から第Ｎ層までのＦＥＣパケットを生成して送信することに該当する。
【０６２２】
また、以上概観したコンピュータの動作は、中継ノードが第１層またはそれより深い階層のブロックに属する一連のデータパケットを受信し、受信したデータパケットを用いて、いくつかの階層に対応するＦＥＣパケットを生成して送信することにも該当する。中継ノードによるＦＥＣパケットの生成は、例えば、消失したＦＥＣパケットを復元するために行われる場合もあるし、階層を深くするために行われる場合もある。
【０６２３】
また、コンピュータは、上記各「個別のブロック」に対応する誤り訂正情報を先に生成してから、それを利用して上記「第１のブロック」に対応する誤り訂正情報を生成してもよい。つまり、コンピュータは、式（４．３）にしたがって「第１のブロック」に対応する誤り訂正情報を生成してもよい。
【０６２４】
換言すれば、コンピュータは、上記の「或る階層に連続する、或る階層よりも下の１層以上の各個別の階層」において、「第１のブロック」に含まれ、かつ対応する誤り訂正情報を生成した１つ以上のブロックのうち当該個別の階層の中では最後のブロックを認識する。そして、コンピュータは、各階層について認識した各ブロックに対応する誤り訂正情報と、上記「１層以上の個別の階層」のうちの最下層の複数のブロックのうち、「第１のブロック」に含まれ、かつ、最下層の中では最後のブロックに属する、すべてのデータ単位の排他的論理和を計算する。
【０６２５】
例えば、「或る階層」が第１層で最下層が第３層の場合、コンピュータは、下記（Ｓ−１）〜（Ｓ−２）の排他的論理和を計算することで、誤り訂正情報としての、ＦＥＣパケットＦ１−１のＦＥＣレベル０ペイロード７０９を生成する。
【０６２６】
（Ｓ−１）ブロックＢ２−１に対応するＦＥＣパケットＦ２−１とブロックＢ３−３に対応するＦＥＣパケットＦ３−２それぞれのＦＥＣレベル０ペイロード７０９。
（Ｓ−２）ブロックＢ１−１に含まれ第３層の中では最後のブロックＢ３−４に属するデータパケットＤ１８〜Ｄ２３それぞれのＲＴＰペイロード６０６。
【０６２７】
もちろん、コンピュータは、生成済みのより下層のブロックに対応する誤り訂正情報を利用しなくてもよい。つまり、コンピュータは、「第１のブロック」（例えばブロックＢ１−１）に属するすべてのデータ単位を用いて、それらすべてのデータ単位の排他的論理和を計算することにより、「第１のブロック」に対応する誤り訂正情報を生成してもよい。
【０６２８】
さて、以上の概観は、誤り訂正情報の生成に着目して根ノードと中継ノードの共通点を述べたものだが、逆に、中継ノードと葉ノードの共通点という観点から上記実施形態を概観すれば、下記のとおりである。
【０６２９】
すなわち、転送装置２００または３００のようなコンピュータは、プログラムにしたがって、複数の階層で定義される階層的なブロックのうちで、或る階層の第１のブロックに属する複数のデータ単位の一部または全部を受信する。ここでの「或る階層」は、例えば第１層の場合もあるし、それより深い第２層や第３層の場合もある。
【０６３０】
また、コンピュータは、上記「或る階層」が、決められた最下層よりも上の階層の場合は、「或る階層」よりも下の、最下層までの各階層についても誤り訂正情報を受信する。例えば、「或る階層」が第１層で最下層が第３層ならば、コンピュータは第２層と第３層についての誤り訂正情報を受信する。
【０６３１】
具体的には、各階層について受信される誤り訂正情報とは、当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応する。かつ、各階層について受信される誤り訂正情報とは、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい。
【０６３２】
例えば、第２層について受信される誤り訂正情報の例としてのＦＥＣパケットＦ２−１（のＦＥＣレベル０ペイロード７０９）は、第１層の同じブロックＢ１−１に含まれるブロックＢ２−１とＢ２−２のうち、最後ではない方のブロックＢ２−１に対応する。そして、ＦＥＣパケットＦ２−１のＦＥＣレベル０ペイロード７０９は、ブロックＢ２−１に属するすべてのデータパケットＤ０〜Ｄ１１それぞれのＲＴＰペイロード６０６の排他的論理和に等しい。
【０６３３】
また、コンピュータは、上記「第１のブロック」に対応しており、かつ、「第１のブロック」に属する複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報を受信する。例えば、「第１のブロック」がブロックＢ１−１の場合、コンピュータは、誤り訂正情報としてのＦＥＣレベル０ペイロード７０９を含むＦＥＣパケットＦ１−１を受信する。また、「第１のブロック」がブロックＢ２−１の場合、コンピュータは、誤り訂正情報としてのＦＥＣレベル０ペイロード７０９を含むＦＥＣパケットＦ２−１を受信する。
【０６３４】
そして、コンピュータは、上記「第１のブロック」に属する複数のデータ単位のうち、受信することができなかった消失データ単位があるか否かを判断し、消失データ単位があれば排他的論理和の計算により消失データ単位を復元する。復元は、具体的には以下のように行われる。
【０６３５】
上記「或る階層」が最下層の場合、コンピュータは、最下層のブロックでもある「第１のブロック」に属するデータ単位のうち、受信することができたすべてのデータ単位と、「第１のブロック」に対応する誤り訂正情報の排他的論理和を計算する。消失データ単位は、排他的論理和の計算により復元される。
【０６３６】
例えば、図２４の例において、「或る階層」が最下層の第３層であり、「第１のブロック」がブロックＢ３−１であるとする。図２４の例では、ブロックＢ３−１に属するデータパケットＤ２が消失している。この場合、コンピュータは、下記（Ｔ−１）〜（Ｔ−２）の排他的論理和を計算することで、「消失データ単位」（つまりデータパケットＤ２のＲＴＰペイロード６０６）を復元する。
【０６３７】
（Ｔ−１）ブロックＢ３−１に属するデータパケットＤ０、Ｄ１、Ｄ３〜Ｄ５それぞれのＲＴＰペイロード６０６。
（Ｔ−２）ブロックＢ３−１に対応するＦＥＣパケットＦ３−１のＦＥＣレベル０ペイロード７０９。
【０６３８】
また、最下層において消失データ単位が属する「最下層ブロック」が、最下層における、上記の「２つ以上のブロックの中で、最後の１つのブロック」である場合、コンピュータは、以下の２通りの方法のいずれかにより消失データ単位を復元する。
【０６３９】
第１の方法では、コンピュータは、下記（Ｕ−１）〜（Ｕ−２）の排他的論理和を計算することで消失データ単位を復元する。
（Ｕ−１）上記「或る階層」から最下層までの各階層において、上記「第１のブロック」に含まれ、かつ、対応する誤り訂正情報を受信した１つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの誤り訂正情報。
【０６４０】
（Ｕ−２）上記「最下層ブロック」に属する１つ以上のデータ単位のうち、受信することができたすべてのデータ単位。
例えば、図２４の例において、「或る階層」が第２層であり、「第１のブロック」がブロックＢ２−１であるとする。この場合、「第１のブロックに含まれ、かつ、対応する誤り訂正情報を受信した１つ以上のブロックのうち、同じ階層の中では最後のブロック」とは、ブロックＢ２−１自体と、第３層のブロックＢ３−１である。
【０６４１】
また、図２４の例では、ブロックＢ２−１に属するデータパケットＤ８が消失している。そして、消失したデータパケットＤ８が最下層の第３層において属する最下層ブロックは、ブロックＢ３−２である。
【０６４２】
よって、コンピュータは、下記（Ｖ−１）〜（Ｖ−２）の排他的論理和を計算することで、「消失データ単位」（つまりデータパケットＤ８のＲＴＰペイロード６０６）を復元する。
【０６４３】
（Ｖ−１）ブロックＢ３−１とＢ２−１にそれぞれ対応するＦＥＣパケットＦ３−１とＦ２−１それぞれのＦＥＣレベル０ペイロード７０９。
（Ｖ−２）ブロックＢ３−２に属するデータパケットＤ６、Ｄ７、Ｄ９〜Ｄ１１それぞれのＲＴＰペイロード６０６の排他的論理和を計算する。
【０６４４】
あるいは、図２４の例において、「或る階層」が第１層であり、「第１のブロック」がブロックＢ１−１であるとする。この場合、「第１のブロックに含まれ、かつ、対応する誤り訂正情報を受信した１つ以上のブロックのうち、同じ階層の中では最後のブロック」とは、ブロックＢ１−１自体と、第２層のブロックＢ２−１と、第３層のブロックＢ３−３である。
【０６４５】
また、図２４の例では、ブロックＢ１−１に属するデータパケットＤ１９が消失している。そして、消失したデータパケットＤ１９が最下層の第３層において属する最下層ブロックは、ブロックＢ３−４である。
【０６４６】
よって、コンピュータは、下記（Ｗ−１）〜（Ｗ−２）の排他的論理和を計算することで、「消失データ単位」（つまりデータパケットＤ１９のＲＴＰペイロード６０６）を復元する。
【０６４７】
（Ｗ−１）ブロックＢ２−１とＢ３−３とＢ１−１にそれぞれ対応するＦＥＣパケットＦ２−１とＦ３−２とＦ１−１それぞれのＦＥＣレベル０ペイロード７０９。
（Ｗ−２）ブロックＢ３−４に属するデータパケットＤ１８、Ｄ２０〜２３それぞれのＲＴＰペイロード６０６。
【０６４８】
つまり、消失データ単位がある場合、消失データ単位の後の最初の誤り訂正情報に対応する階層を上記「或る階層」と見なすことにより、図２０〜２５を参照して説明した実施形態における復元は、上記のように一般化することができる。
【０６４９】
例えば、図２４のとおり、ブロックＢ１−１の受信が完了する前に、ブロックＢ１−１のサブセットであるブロックＢ２−１の受信は、当然、完了する。よって、消失したデータパケットＤ８を除くブロックＢ２−１と、ブロックＢ２−１に対応するＦＥＣパケットＦ２−１の受信が完了すると、上記コンピュータは、「或る階層」が第２層で「第１のブロック」がブロックＢ２−１の場合の処理を行うことができる。その結果、ブロックＢ２−１とＦＥＣパケットＦ２−１の受信が完了した段階で、データパケットＤ８は復元される。
【０６５０】
つまり、データパケットＤ８は確かに第１層においてブロックＢ１−１に属するが、データパケットＤ８の復元は、「或る階層」が第１層で「第１のブロック」がブロックＢ１−１の場合の処理をコンピュータが開始する前に既に終わっている。よって、上記で概観したコンピュータの動作では、「或る階層」が第１層で「第１のブロック」がブロックＢ１−１の場合については、復元済みのデータパケットＤ８のＲＴＰペイロード６０６が「消失データ単位」に当たらないことが暗黙に仮定されるものとする。
【０６５１】
他方、データパケットＤ１９は第２層ではブロックＢ２−２に属し、ブロックＢ２−２は１つ上の第１層のブロックＢ１−１に含まれる第２層のブロックの中では最後のブロックである。よって、ブロックＢ２−２の受信が完了する段階では、当然、ブロックＢ１−１の受信も完了する。したがって、第２層においてブロックＢ２−２に属するデータパケットＤ１９の復元は、「或る階層」が第１層で「第１のブロック」がブロックＢ１−１の場合のコンピュータの動作として実現される。
【０６５２】
また、最下層において消失データ単位が属する「最下層ブロック」が、最下層における、上記の「２つ以上のブロックの中で、最後の１つのブロック」である場合の、消失データ単位の復元のための第２の方法は、以下のとおりである。
【０６５３】
第２の方法では、コンピュータは、受信によって取得したか、既に行った復元によって取得した、上記「第１のブロック」に属する、消失データ単位以外のすべてのデータ単位と、「第１のブロック」に対応する誤り訂正情報の排他的論理和を計算する。この排他的論理和の計算により、消失データ単位は復元される。
【０６５４】
例えば、図２４の例において、「或る階層」が第１層で「第１のブロック」がブロックＢ１−１とする。この場合、コンピュータは、次のようにして、消失したデータパケットＤ１９のＲＴＰペイロード６０６を復元してもよい。
【０６５５】
つまり、コンピュータは、下記（Ｘ−１）〜（Ｘ−３）の排他的論理和を計算することにより、「消失データ単位」（つまりデータパケットＤ１９のＲＴＰペイロード６０６）を復元してもよい。
【０６５６】
（Ｘ−１）受信によって取得したデータパケットＤ０、Ｄ１、Ｄ３〜Ｄ７、Ｄ９〜Ｄ１８、Ｄ２０〜Ｄ２３それぞれのＲＴＰペイロード６０６。
（Ｘ−２）復元により取得したデータパケットＤ２、Ｄ８それぞれのＲＴＰペイロード６０６。
（Ｘ−３）ＦＥＣパケットＦ１−１のＦＥＣレベル０ペイロード７０９。
【０６５７】
また、消失データ単位を上記のようにして復元したコンピュータは、受信または復元により取得した、上記「第１のブロック」に属するすべてのデータ単位を、送信先装置に送信してもよい。つまり、コンピュータは、中継ノードとして動作してもよい。なお、データ単位の送信の際、コンピュータは、適宜の割合でデータ単位同士の間に誤り訂正情報を挿入して、誤り訂正情報も送信先装置に送信する。
【０６５８】
具体的には、中継ノードとして動作するコンピュータは、送信先装置と当該コンピュータ自身との間の通信路に対応する階層情報を取得する。階層情報の具体例は、例えば、配信先管理テーブル４００の階層フィールドの値である。また、階層情報は、例えば初期値は所定のデフォルト値でもよいが、送信先装置から適宜の頻度で動的に指定されることが好ましい。
【０６５９】
そして、コンピュータは、上記「或る階層」から最下層までの階層のうちで、階層情報が表す指定階層と同じか指定階層より上の各階層のいずれかのブロックに対応する誤り訂正情報のすべてを、送信先装置に送信する。
【０６６０】
例えば、「或る階層」が第１層、最下層が第３層、指定階層が第２層の場合、コンピュータは、第１層または第２層のいずれかのブロックに対応する誤り訂正情報をすべて送信する。例えば、「或る階層」の上記「第１のブロック」がブロックＢ１−１の場合、コンピュータは、下記（Ｙ−１）と（Ｙ−２）を送信する。
【０６６１】
（Ｙ−１）ブロックＢ１−１に対応する誤り訂正情報をＦＥＣレベル０ペイロード７０９として含むＦＥＣパケットＦ１−１。
（Ｙ−２）ブロックＢ２−１に対応する誤り訂正情報をＦＥＣレベル０ペイロード７０９として含むＦＥＣパケットＦ２−１。
【０６６２】
また、最下層よりも指定階層の方が下の階層である場合に、最下層よりも下であり、かつ指定階層と同じか指定階層より上の各階層について、上記「第１のブロック」の範囲内で、コンピュータは誤り訂正情報を生成する。具体的には、コンピュータは、誤り訂正情報の生成対象である当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応する誤り訂正情報を生成する。生成される誤り訂正情報は、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい。また、コンピュータは以上のようにして生成した誤り訂正情報を送信先装置に送信する。
【０６６３】
例えば、最下層が第２層、指定階層が第４層の場合、コンピュータは、第３層と第４層について誤り訂正情報を生成する。例えば、上記「或る階層」が第１層であり「第１のブロック」がブロックＢ１−１の場合、コンピュータは、第３層に関する誤り訂正情報として、ＦＥＣパケットＦ３−１とＦ３−２それぞれのＦＥＣレベル０ペイロード７０９を生成する。また、コンピュータは、第４層に関しする誤り訂正情報として、ＦＥＣパケットＦ４−１、Ｆ４−２、Ｆ４−３、およびＦ４−４それぞれのＦＥＣレベル０ペイロード７０９を生成する。
【０６６４】
なお、本発明は上記実施形態に限られるものではなく、上記実施形態は様々に変形可能である。以下に、上記実施形態を変形するいくつかの観点を例示する。例えば、上記実施形態は、下記の観点から様々に変形することができ、これらの変形は、相互に矛盾しない限り、任意に組み合わせることが可能である。
【０６６５】
変形の第１の観点は、送信されるデータの種類とパケットの形式に関する。上記実施形態では、具体例としてＲＴＰパケットにより送信されるＭＰＥＧ２データを例示したが、送信されるデータの種類（つまりデータパケットのペイロードの内容）は任意である。例えば、ストリーミング配信のためのＡＬＭではなく、ファイル共有のためにデータパケットのマルチキャストが行われてもよい。
【０６６６】
また、図１５〜１７に示したパケットの形式も一例に過ぎない。実施形態によっては、ＲＴＰが使われなくてもよい。また、実施形態によってはＵＤＰの代わりにＴＣＰ（Transmission Control Protocol）が使われてもよいことも無論である。
【０６６７】
例えば、ＲＦＣ５１０９で定義される既存のプロトコルを拡張する代わりに、独自のプロトコルが使われてもよい。独自のプロトコルは、例えば、ＵＤＰまたはＴＣＰの上位レイヤのプロトコルとして定義されてもよい。
【０６６８】
独自のプロトコルのヘッダは、データパケットとＦＥＣパケットを区別するための情報を格納するフィールドを含む。データパケットとＦＥＣパケットを区別するための情報は、例えば、１ビットのフラグでもよいし、ＲＴＰヘッダ中のペイロードタイプフィールドのように、１ビットよりも長いフィールドでもよい。また、ＦＥＣパケットにおいては、独自プロトコルのヘッダはさらに、ＦＥＣパケットの階層を示す情報と、ＦＥＣパケットと関連しているデータパケットを識別するための情報を含む。
【０６６９】
そして、データパケットは、上記のような独自プロトコルのヘッダに続けて、任意の種類のペイロードを含む。また、ＦＥＣパケットは、上記のような独自プロトコルのヘッダに続けて、対応する複数のデータパケットのペイロードの排他的論理和を、ペイロードとして含む。
【０６７０】
変形の第２の観点は、図１５〜１７のパケット形式の拡張に関する。図１５の例では、レベル０しか使われないが、複数のレベルへの拡張が行われてもよい。一般に、ストリーミングデータではペイロードの先頭に近いほど重要な情報が含まれることが多い。そこで、ＲＦＣ５１０９は、ペイロードの先頭に近いほどより多くのＦＥＣデータにより保護されるようにするための、複数のレベルの使用についても規定している。
【０６７１】
例えば、データパケット６００のＲＴＰペイロード６０６の先頭からＬ０バイトをレベル０で保護し、残りのＬ１バイトをレベル１で保護するように、上記実施形態が拡張されてもよい。例えば、階層的なブロックが図１と同様に定義され、かつ、転送装置３００にとっての最下層が第Ｎ層であるとする。すると、ＲＴＰペイロード６０６の先頭からＬ０バイトを第Ｎ層までのＦＥＣパケットにより保護し、残りのＬ１バイトを（Ｎ−１）層までのＦＥＣパケットにより保護する実施形態が可能である。
【０６７２】
例えば、Ｎ＝３とする。この場合、ブロックＢ３−１に対応するＦＥＣパケットは、ブロックＢ３−１に属するデータパケットＤ０〜Ｄ５それぞれのＲＴＰペイロード６０６の先頭からＬ０バイトの排他的論理和を、ＦＥＣレベル０ペイロード７０９として含む。しかし、最下層のブロックＢ３−１に対応するＦＥＣパケットは、ＦＥＣレベル１ヘッダとＦＥＣレベル１ペイロードを含まない。
【０６７３】
また、ブロックＢ３−３に対応するＦＥＣパケットは、ブロックＢ３−３に属するデータパケットＤ１２〜Ｄ１７それぞれのＲＴＰペイロード６０６の先頭からＬ０バイトの排他的論理和を、ＦＥＣレベル０ペイロード７０９として含む。しかし、ブロックＢ３−３に対応するＦＥＣパケットは、ＦＥＣレベル１ヘッダとＦＥＣレベル１ペイロードを含まない。
【０６７４】
また、ブロックＢ２−１に対応するＦＥＣパケットは、ブロックＢ２−１に属するデータパケットＤ０〜Ｄ１１それぞれのＲＴＰペイロード６０６の先頭からＬ０バイトの排他的論理和を、ＦＥＣレベル０ペイロード７０９として含む。さらに、ブロックＢ２−１に対応するＦＥＣパケットは、ブロックＢ２−１に属するデータパケットＤ０〜Ｄ１１それぞれのＲＴＰペイロード６０６の残りのＬ１バイトの排他的論理和を、ＦＥＣレベル１ペイロードとして含む。
【０６７５】
そして、ブロックＢ１−１に対応するＦＥＣパケットは、ブロックＢ１−１に属するデータパケットＤ０〜Ｄ２３それぞれのＲＴＰペイロード６０６の先頭からＬ０バイトの排他的論理和を、ＦＥＣレベル０ペイロード７０９として含む。さらに、ブロックＢ１−１に対応するＦＥＣパケットは、ブロックＢ１−１に属するデータパケットＤ０〜Ｄ２３それぞれのＲＴＰペイロード６０６の残りのＬ１バイトの排他的論理和を、ＦＥＣレベル１ペイロードとして含む。
【０６７６】
以上のように、データパケット６００のＲＴＰペイロード６０６のうち、レベルｐ（０≦ｐ）に該当する部分の排他的論理和が、第１層から第（Ｎ−ｐ）層までの各ブロックに対応するＦＥＣパケット７００のＦＥＣレベルｐペイロードに設定されてもよい。
【０６７７】
変形の第３の観点は、上記の仮定（Ｏ−１）に関する。転送装置３００は、上記実施形態のようにパケットを受信して格納するとすぐにステップＳ２０２以降の処理を行う代わりに、受信したパケットを或る程度の期間にわたってバッファ部３０２に蓄積してから、ステップＳ２０２以下の処理を開始してもよい。すると制御パケットを使わずに仮定（Ｏ−１）を成立させることも可能である。
【０６７８】
上記の「或る程度の期間」は、例えば、第Ｎ層（つまり最下層）のブロックに対応する最初のＦＥＣパケットが受信されるまでの時間であってもよい。例えば、転送装置３００は、データパケットＤ０〜Ｄ５を受信する間は、単に受信したデータパケットＤ０〜Ｄ５をバッファ部３０２に蓄積するだけでもよい。
【０６７９】
そして、転送装置３００は、第３層の初めてのＦＥＣパケットＦ３−１の受信を契機として、ストリームの先頭のデータパケットＤ０のシーケンス番号を認識し、蓄積済みのパケットについてのステップＳ２０２以下の処理を開始してもよい。例えば、転送装置３００は、ＦＥＣパケットＦ３−１のＳＢベースフィールドの値を、ストリームの先頭のデータパケットＤ０のシーケンス番号として認識することができる。
【０６８０】
なお、以上のように転送装置３００がしばらくパケットを蓄積してから蓄積済みのパケットの処理を開始する実施形態では、パケットの順序が送信時とは多少入れ替わって受信されても、入れ替わりの影響が或る程度は吸収されるという効果も得られる。
【０６８１】
変形の第４の観点は、バースト的な消失に関する。上記実施形態に関しては、主にＦＥＣパケットの階層化という観点から説明した。そのため、いくつかの例外処理については、一部説明を省略した。実施形態によっては、転送装置３００は、上記実施形態では説明を省略した例外処理をさらに行ってもよい。
【０６８２】
例えば、第Ｎ層の１つのブロックの全体にわたってパケットが消失したり、あるいはさらに大きな範囲にわたって、連続するパケットがバースト的に消失したりすることがあり得る。バースト的なパケットロスに備えて、転送装置３００は、例えば、パケットの受信が途絶した時間が所定の閾値を超えると、次に何らかのパケットを受信するまで待たずに、送信元装置３１０に再送を要求してもよい。
【０６８３】
変形の第５の観点は、再送要求の省略に関する。実施形態によっては、ステップＳ２１０やＳ２１９の再送要求が適宜省略されてもよい。つまり、転送装置３００は、第Ｎ層のブロックのデータパケットがすべて揃わなくても、ステップＳ２２２〜Ｓ２３７の処理を行ってもよい。
【０６８４】
例えば、動画または音声のデータの一部が欠けても、動画または音声を視聴する人間はデータの欠落に気付かないことがある。よって、ペイロードの種類によっては、必ずしもすべてのデータパケットが揃わなくてもよい場合がある。
【０６８５】
そして、どの深さまでの階層に対応するＦＥＣパケットを送信元装置３１０が転送装置３００に送信するかということは、図２０のステップＳ２２２〜Ｓ２２６の処理により、調整され、やがては誤り訂正後の許容エラー率Ａに応じて適切に収束する。すると、収束後は、たとえ或るデータパケットが復元不能だったとしても、復元不能なデータパケットの割合は、誤り訂正後の許容エラー率Ａ以下である。よって、実施形態によっては、再送要求が省略されてもよい。
【０６８６】
変形の第６の観点は、転送装置３００がＦＥＣパケットの増加または削減を送信元装置３１０に要求する頻度に関する。図２０の実施形態では、転送装置３００は、第Ｎ層（最下層）のブロックごとに１回、層の深さが適切か否かを検証し、必要に応じてＦＥＣパケットの増加または削減を送信元装置３１０に要求する。しかし、要求の頻度は、実施形態に応じて任意である。
【０６８７】
例えば、実施形態によっては、上記の「第Ｎ層のブロックごとに１回」という頻度の代わりに、「第１層のＭ個（１≦Ｍ）のブロックごとに１回」という頻度が採用されてもよい。
【０６８８】
変形の第７の観点は、中継ノードとして動作する転送装置３００がパケットを転送するタイミングに関する。図２０の実施形態では、転送装置３００は、受信したパケットを即座に転送するのではなく、バッファ部３０２に蓄積し、第Ｎ層の１つのブロックのすべてのデータパケットが揃ってからパケットの転送を行う。そのため、第Ｎ層のブロックサイズに対応する転送遅延が生じる。
【０６８９】
しかし、転送装置３００が受信したパケットをバッファ部３０２に蓄積する時間の長さは、実施形態に応じて任意である。例えば、転送装置３００は、送信元装置３１０から受信したデータパケットを即座に各送信先装置３２０に転送してもよい。その場合、転送装置３００は、転送済みのデータパケットをすぐには廃棄せず、第Ｎ層で同じブロックに属する他のデータパケットの消失に備えて、バッファ部３０２に保持する。
【０６９０】
変形の第８の観点は、エラーレート（つまりパケット消失率）から第１または第２の階層情報を取得する方法に関する。
例えば、送信先装置３２０がエラーレート自体を取得部３０５に通知する場合、取得部３０５は、式（２０．７）とブロック管理テーブル５００のブロックサイズの定義にしたがって適切な階層の深さを計算し、計算結果を第１の階層情報として取得してもよい。あるいは、指示部３０８は、エラーレートから、式（２０．７）とブロック管理テーブル５００のブロックサイズの定義にしたがって適切な階層の深さを計算し、計算結果を第２の階層情報として送信元装置３１０に通知してもよい。
【０６９１】
しかし、取得部３０５と指示部３０８は、計算を行う代わりに、例えば、エラーレートの下限値とエラーレートの上限値と階層の深さとを関連付けて記憶するテーブルを参照することにより、階層情報を取得することもできる。
【０６９２】
例えば、指示部３０８は、テーブルを検索して、送信元装置３１０と転送装置３００の間のリンクのエラーレートを含む範囲を下限値と上限値の組により表すエントリを特定する。そして、指示部３０８は、特定したエントリに記憶されている階層を第２の階層情報として取得し、取得した第２の階層情報を送信元装置３１０に送信する。
【０６９３】
もちろん、取得部３０５も同様にして、計算を行う代わりにテーブルを参照することにより、第１の階層情報を取得することができる。また、テーブル中の各エントリの値は、例えば誤り訂正後に許容されるエラーレートなどに基づいて、予め設定されているものとする。
【０６９４】
変形の第９の観点は、転送装置３００が保持するデータの形式に関する。例えば図１３と図１４にテーブル形式でデータを例示したが、テーブル以外の任意のデータ形式（例えばアレイや線形リストなど）が利用可能である。
【０６９５】
変形の第１０の観点は、誤り訂正情報の生成と、誤り訂正情報を用いた復元でそれぞれ用いる関数に関する。上記実施形態では、誤り訂正情報の生成と、誤り訂正情報を用いた復元の双方において、排他的論理和の計算が行われる。しかし、実施形態によっては、他の関数が使われてもよい。
【０６９６】
ここで、説明の便宜上、ｕｉをデータ単位とする。つまり、ｕｉは何らかのビット列であり、具体的には例えばデータパケットのペイロードである。
また、データ単位の集合｛ｕｉ｜０≦ｉ＜ｎ｝から誤り訂正情報を計算する関数ｆは、式（Ａ．１）のように表すことができる。
【０６９７】
f({ui|0≦i<n})                                (A.1)
【０６９８】
そして、消失したデータ単位ｕｊ（∀ｊ，０≦ｊ＜ｎ）を復元する関数ｇは、式（Ａ．２）のように表すことができる。
【０６９９】
uj=g({ui|0≦i<n, i≠j}∪{f({ui|0≦i<n})})      (A.2)
【０７００】
関数ｆとｇは、下記の式（Ａ．３）と（Ａ．４）を満たすものであれば、任意である。なお、式（Ａ．３）と（Ａ．４）における集合Ｓ１とＳ２は、データ単位を要素とする非空の集合とする。
【０７０１】
f(S1∪S2)=f({f(S1)}∪S2)                       (A.3)
【０７０２】
uj=g(S1∪S2∪{f(S1∪S2∪{uj})})
=g({f(S1)}∪S2∪{f(S1∪S2∪{uj})})           (A.4)
【０７０３】
上記の各実施形態は、集合Ｓに対してｆ（Ｓ）が「集合Ｓの各要素同士の排他的論理和をとる関数」と定義され、かつ、ｇ（Ｓ）が同じく「集合Ｓの各要素同士の排他的論理和をとる関数」と定義された例である。このように定義された関数ｆが式（Ａ．３）を満たすことは、例えば、集合（Ｓ１∪Ｓ２）がブロックＢ１−１であり、集合Ｓ１がブロックＢ２−１である場合の例などから、理解されるだろう。また、このように定義された関数ｇが式（Ａ．４）を満たすことは、例えば集合（Ｓ１∪Ｓ２∪｛ｕｊ｝）がブロックＢ１−１であり、集合Ｓ１がブロックＢ２−１とＢ３−２をあわせた全体またはブロックＢ２−１である場合の例などから、理解されるだろう。
【０７０４】
最後に、上記の種々の実施形態に関して、さらに下記の付記を開示する。
（付記１）
コンピュータに、
複数の階層で定義される階層的なブロックのうち或る階層の同じ第１のブロックに属している複数のデータ単位を取得し、
前記複数のデータ単位の排他的論理和に等しい、前記第１のブロックに対応する誤り訂正情報を生成し、
前記或る階層に連続する、前記或る階層よりも下の１層以上の各個別の階層において、
当該個別の階層の１つ上の階層の同じブロックに含まれる当該個別の階層の２つ以上のブロックの中で、特定の１つのブロックを除く、１つ以上の個別のブロックの各々について、前記複数のデータ単位のうち、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、当該個別のブロックに対応する誤り訂正情報を生成し、
前記複数のデータ単位を送信し、
前記第１のブロックに対応する前記誤り訂正情報を送信し、
前記個別のブロックの各々に対応する前記誤り訂正情報を送信する
ことを含む処理を実行させるプログラム。
（付記２）
前記特定の１つのブロックは、前記２つ以上のブロックの中で最後の１つのブロックであり、
前記処理における、前記第１のブロックに対応する前記誤り訂正情報の生成は、
前記１層以上の各個別の階層において、前記第１のブロックに含まれ、かつ、対応する前記誤り訂正情報を生成した１つ以上のブロックのうち当該個別の階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記１層以上の個別の階層のうちの最下層の複数のブロックのうち、前記第１のブロックに含まれ、かつ、前記最下層の中では最後のブロックに属する、すべてのデータ単位と
の排他的論理和を計算することを含む
ことを特徴とする付記１に記載のプログラム。
（付記３）
前記処理における、前記第１のブロックに対応する前記誤り訂正情報の生成は、
前記第１のブロックに属する前記複数のデータ単位をすべて用いて、前記複数のデータ単位の排他的論理和を計算することを含む
ことを特徴とする付記１に記載のプログラム。
（付記４）
前記複数の階層のうち最下層以外の各階層の各ブロックは、１つ下の階層のブロックを２つずつ含む
ことを特徴とする付記１から３のいずれか１項に記載のプログラム。
（付記５）
コンピュータに、
複数の階層で定義される階層的なブロックのうちで、或る階層の第１のブロックに属する複数のデータ単位の一部または全部を受信し、
前記或る階層が、決められた最下層よりも上の階層の場合は、前記或る階層よりも下の、前記最下層までの各階層について、前記第１のブロックの範囲内において、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を受信し、
前記第１のブロックに対応しており、かつ、前記第１のブロックに属する前記複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報を受信し、
前記第１のブロックに属する前記複数のデータ単位のうち、受信することができなかった消失データ単位があるか否かを判断し、
前記消失データ単位があり、かつ、前記或る階層が前記最下層の場合は、
前記第１のブロックに属するデータ単位のうち受信することができたすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
前記消失データ単位があり、かつ、前記最下層において前記消失データ単位が属する最下層ブロックが、前記最下層における前記２つ以上のブロックの中の前記最後の１つのブロックである場合は、
前記或る階層から前記最下層までの各階層において、前記第１のブロックに含まれ、かつ、対応する前記誤り訂正情報を受信した１つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層ブロックに属する１つ以上のデータ単位のうち受信することができたすべてのデータ単位と
の排他的論理和を計算することにより、前記消失データ単位を復元するか、または、
受信によって取得したか、もしくは既に行った復元によって取得した、前記第１のブロックに属する、前記消失データ単位以外のすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元する
処理を実行させるプログラム。
（付記６）
送信先装置と前記コンピュータとの間の通信路に対応する階層情報を取得し、
受信または復元により取得した、前記第１のブロックに属する前記複数のデータ単位を、前記送信先装置に送信し、
前記或る階層から前記最下層までの階層のうちで、前記階層情報が表す指定階層と同じか前記指定階層より上の各階層のいずれかのブロックに対応する前記誤り訂正情報のすべてを、前記送信先装置に送信する
ことを、さらに前記処理が含むことを特徴とする付記５に記載のプログラム。
（付記７）
前記最下層よりも前記指定階層の方が下の階層である場合に、前記最下層よりも下であり、かつ前記指定階層と同じか前記指定階層より上の各階層について、前記第１のブロックの範囲内で、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を生成し、
生成した前記誤り訂正情報を前記送信先装置に送信する
ことを、さらに前記処理が含むことを特徴とする付記６に記載のプログラム。
（付記８）
通信装置であって、
送信元装置から
複数の階層で定義される階層的なブロックのうちで、或る階層の第１のブロックに属する複数のデータ単位の一部または全部と、
前記或る階層が、決められた最下層よりも上の階層の場合は、前記或る階層よりも下の、前記最下層までの各階層についての、前記第１のブロックの範囲内での、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報と、
前記第１のブロックに対応しており、かつ、前記第１のブロックに属する前記複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報と
を受信する受信部と、
前記第１のブロックに属する前記複数のデータ単位のうち、前記受信部により受信されなかった消失データ単位があるか否かを判断する判断部と、
前記消失データ単位を復元する復元部であって、
前記消失データ単位があり、かつ、前記或る階層が前記最下層の場合は、
前記第１のブロックに属するデータ単位のうち、前記受信部が受信することのできたすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
前記消失データ単位があり、かつ、前記最下層において前記消失データ単位が属する最下層ブロックが、前記最下層における前記２つ以上のブロックの中の前記最後の１つのブロックである場合は、
前記或る階層から前記最下層までの各階層において、前記第１のブロックに含まれ、かつ、対応する前記誤り訂正情報を前記受信部が受信した１つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層ブロックに属する１つ以上のデータ単位のうち、前記受信部が受信することのできたすべてのデータ単位と
の排他的論理和を計算することにより、前記消失データ単位を復元するか、または、
前記受信部における受信によって取得したか、もしくは前記復元部が既に行った復元によって取得した、前記第１のブロックに属する、前記消失データ単位以外のすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元する
ことを特徴とする前記復元部と、
前記通信装置と送信先装置との間の第１の通信路に対応する第１の階層情報を取得する取得部と、
前記第１の階層情報が表す指定階層の方が、前記最下層よりも下の階層である場合に、前記最下層よりも下であり、かつ前記指定階層と同じか前記指定階層より上の各階層について、前記第１のブロックの範囲内で、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を生成する
生成部と、
前記送信先装置に、
前記受信部により全部が受信されたか、または前記復元部による復元によって全部が揃った、前記第１のブロックに属する前記複数のデータ単位と、
前記或る階層から前記最下層までの階層のうちで、前記指定階層と同じか前記指定階層より上の各階層のいずれかのブロックに対応する前記誤り訂正情報のすべてと、
前記最下層よりも前記指定階層の方が下の階層である場合は、さらに、前記生成部が生成した前記誤り訂正情報と
を送信する送信部
を備えることを特徴とする通信装置。
（付記９）
前記第１の階層情報は、前記第１の通信路におけるデータ単位の第１の消失率が大きいほど下の階層を前記指定階層として示す情報であり、
前記取得部は、前記送信先装置から前記第１の階層情報を受信し、
前記通信装置はさらに、
前記判断部による判断にしたがって、前記通信装置と前記送信元装置との間の第２の通信路におけるデータ単位の第２の消失率を認識し、
前記第２の消失率で消失するデータ単位に対しては、前記最下層の各ブロックごとに１回の割合での前記誤り訂正情報の挿入では、決められた訂正性能が得られない場合、
前記最下層よりも下の第１の特定の階層であって、前記第１の特定の階層の各ブロックごとに１回の割合で前記誤り訂正情報が挿入されれば、前記第２の消失率で消失するデータ単位に対しても前記訂正性能が得られる、前記第１の特定の階層を、前記第２の消失率から認識し、
前記第１の特定の階層を表す値を第２の階層情報として前記送信元装置に指示し、
前記第２の消失率で消失するデータ単位に対しては、前記最下層よりも上の第２の特定の階層の各ブロックごとに１回の割合で前記誤り訂正情報が挿入されれば前記訂正性能が得られる場合、
前記第２の消失率から前記第２の特定の階層を認識し、
前記第２の特定の階層を表す値を前記第２の階層情報として前記送信元装置に指示する、
指示部を備えることを特徴とする付記８に記載の通信装置。
（付記１０）
前記第１の階層情報は、前記第１の通信路におけるデータ単位の第１の消失率が大きいほど下の階層を前記指定階層として示す情報であり、
前記判断部による判断にしたがって、前記通信装置と前記送信元装置との間の第２の通信路におけるデータ単位の第２の消失率を認識し、前記第２の消失率を前記送信元装置に指示する指示部を前記通信装置はさらに備え、
前記取得部は、
前記第１の消失率を前記送信先装置から受信し、
前記第１の消失率で消失するデータ単位に対しては、前記最下層の各ブロックごとに１回の割合での前記誤り訂正情報の挿入では、決められた訂正性能が得られない場合、
前記最下層よりも下の第３の特定の階層であって、前記第３の特定の階層の各ブロックごとに１回の割合で前記誤り訂正情報が挿入されれば、前記第１の消失率で消失するデータ単位に対しても前記訂正性能が得られる、前記第３の特定の階層を、前記第１の消失率から認識し、
前記第３の特定の階層を表す値を前記第１の階層情報として取得し、
前記第１の消失率で消失するデータ単位に対しては、前記最下層よりも上の第４の特定の階層の各ブロックごとに１回の割合で前記誤り訂正情報が挿入されれば前記訂正性能が得られる場合、
前記第１の消失率から前記第４の特定の階層を認識し、
前記第４の特定の階層を表す値を前記第１の階層情報として取得する
ことを特徴とする付記８に記載の通信装置。
（付記１１）
コンピュータが、
複数の階層で定義される階層的なブロックのうち或る階層の同じ第１のブロックに属している複数のデータ単位を取得し、
前記複数のデータ単位の排他的論理和に等しい、前記第１のブロックに対応する誤り訂正情報を生成し、
前記或る階層に連続する、前記或る階層よりも下の１層以上の各個別の階層において、
当該個別の階層の１つ上の階層の同じブロックに含まれる当該個別の階層の２つ以上のブロックの中で、特定の１つのブロックを除く、１つ以上の個別のブロックの各々について、前記複数のデータ単位のうち、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、当該個別のブロックに対応する誤り訂正情報を生成し、
前記複数のデータ単位を送信し、
前記第１のブロックに対応する前記誤り訂正情報を送信し、
前記個別のブロックの各々に対応する前記誤り訂正情報を送信する
ことを特徴とする方法。
（付記１２）
コンピュータが、
複数の階層で定義される階層的なブロックのうちで、或る階層の第１のブロックに属する複数のデータ単位の一部または全部を受信し、
前記或る階層が、決められた最下層よりも上の階層の場合は、前記或る階層よりも下の、前記最下層までの各階層について、前記第１のブロックの範囲内において、
当該階層の１つ上の階層の同じブロックに含まれる当該階層の２つ以上のブロックの中で、最後の１つのブロックを除く、当該階層の１つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を受信し、
前記第１のブロックに対応しており、かつ、前記第１のブロックに属する前記複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報を受信し、
前記第１のブロックに属する前記複数のデータ単位のうち、受信することができなかった消失データ単位があるか否かを判断し、
前記消失データ単位があり、かつ、前記或る階層が前記最下層の場合は、
前記第１のブロックに属するデータ単位のうち受信することができたすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
前記消失データ単位があり、かつ、前記最下層において前記消失データ単位が属する最下層ブロックが、前記最下層における前記２つ以上のブロックの中の前記最後の１つのブロックである場合は、
前記或る階層から前記最下層までの各階層において、前記第１のブロックに含まれ、かつ、対応する前記誤り訂正情報を受信した１つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層ブロックに属する１つ以上のデータ単位のうち受信することができたすべてのデータ単位と
の排他的論理和を計算することにより、前記消失データ単位を復元するか、または、
受信によって取得したか、もしくは既に行った復元によって取得した、前記第１のブロックに属する、前記消失データ単位以外のすべてのデータ単位と、
前記第１のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元する
ことを特徴とする方法。
【符号の説明】
【０７０５】
Ｂ１−１〜Ｂ４−８、Ｂａ−１〜Ｂａ−２、Ｂｂ−１〜Ｂｂ−４  ブロック
Ｄ０〜Ｄ４７、６００  データパケット
Ｆ１−１〜Ｆ４−４、Ｆａ−１〜Ｆａ−２、Ｆｂ−１〜Ｆｂ−４、７００  ＦＥＣパケット
１００、１２０、２１０  ネットワーク
１０１〜１１１、１２１〜１２４  ノード
２００、３００  転送装置
２０１  ＣＰＵ
２０２  ＲＡＭ
２０３  通信インタフェイス
２０４  入力装置
２０５  出力装置
２０６  不揮発性記憶装置
２０７  駆動装置
２０８  バス
２０９  記憶媒体
２１１  プログラム提供者
３０１  受信部
３０２  バッファ部
３０３  判断部
３０４  復元部
３０５  取得部
３０６  生成部
３０７  送信部
３０８  指示部
３１０  送信元装置
３２０  送信先装置
４００  配信先管理テーブル
５００  ブロック管理テーブル
６０１、７０１  ＩＰヘッダ
６０２、７０２  ＩＰペイロード
６０３、７０３  ＵＤＰヘッダ
６０４、７０４  ＵＤＰペイロード
６０５、７０５  ＲＴＰヘッダ
６０６、７０６  ＲＴＰペイロード
７０７  ＦＥＣヘッダ
７０８  ＦＥＣレベル０ヘッダ
７０９  ＦＥＣレベル０ペイロード
【図１】
0005682253.tif 000004
【図２】
0005682253.tif 000005
【図３】
0005682253.tif 000006
【図４】
0005682253.tif 000007
【図５】
0005682253.tif 000008
【図６】
0005682253.tif 000009
【図７】
0005682253.tif 000010
【図８】
0005682253.tif 000011
【図９】
0005682253.tif 000012
【図１０】
0005682253.tif 000013
【図１１】
0005682253.tif 000014
【図１２】
0005682253.tif 000015
【図１３】
0005682253.tif 000016
【図１４】
0005682253.tif 000017
【図１５】
0005682253.tif 000018
【図１６】
0005682253.tif 000019
【図１７】
0005682253.tif 000020
【図１８】
0005682253.tif 000021
【図１９】
0005682253.tif 000022
【図２０】
0005682253.tif 000023
【図２１】
0005682253.tif 000024
【図２２】
0005682253.tif 000025
【図２３】
0005682253.tif 000026
【図２４】
0005682253.tif 000027
【図２５】
0005682253.tif 000028