以下、実施形態について、図面を参照しながら詳細に説明する。なお、説明は次の順で行う。
まず、図1〜2を参照して、階層的なブロックと、階層的に挿入される誤り訂正情報について説明する。続いて、図3を参照して、本実施形態が適用されるネットワークトポロジの例を説明する。その後、図4〜7を参照して、ネットワーク内のノードの動作の概要を説明する。そして、図3における個々のノードが、どのような構成によって図4〜7の動作を実現するのかについて、図8〜9を参照して説明する。また、本実施形態の利点についての理解を助けるため、図10〜12を参照して、本実施形態と比較例とを比べる。
その後、図13〜25を参照して、本実施形態についてさらに具体的に説明する。すなわち、まず図13〜14を参照して、ノードが利用する管理情報の例を説明する。続いて、図15〜17を参照して、本実施形態で使われるパケットの具体的な形式を説明する。その後、図18〜23のフローチャートを参照して、ノードの動作の詳細を説明する。また、ノードの動作の説明においては、図24〜25に示す2つのケースにおける動作シーケンスの具体例を適宜参照する。また、最後にその他のいくつかの実施形態についても説明する。
さて、図1は、階層を例示する図である。図1には第1層から第3層までの3つの階層が例示されており、第1層が最上位の階層である。なお、階層の最大数は実施形態に応じて任意であり、階層の数は通信路のエラーレート(換言すればパケットロス率)などの状況に応じて変動する。
図1の例において、第1層ではブロックB1−1が定義される。ブロックB1−1は24個のデータパケットD0〜D23を含む。データパケットD0〜D23の各々は、適宜のプロトコルのPDU(Protocol Data Unit)の形にフォーマットされており、誤り訂正の対象であるデータ単位を、ペイロードとして含む。なお、本実施形態で利用可能な具体的なプロトコルの具体例については後述する。また、第1層のブロックが含むデータ単位の数は、図1の例では24であるが、実施形態に応じて任意である。
図1のとおり、ブロックは階層的に定義される。具体的には、ブロックB1−1は第2層の2つのブロックB2−1とB2−2を含む。ブロックB2−1は12個のデータパケットD0〜D11を含み、ブロックB2−2は12個のデータパケットD12〜D23を含む。したがって、ブロックB2−1とB2−2は、ブロックB1−1のサブセットである。
また、ブロックB2−1は、第3層の2つのブロックB3−1とB3−2を含む。ブロックB3−1は6個のデータパケットD0〜D5を含み、ブロックB3−2は6個のデータパケットD6〜D11を含む。したがって、ブロックB3−1とB3−2は、ブロックB2−1のサブセットである。
同様に、ブロックB2−2は、第3層の2つのブロックB3−3とB3−4を含む。そして、ブロックB3−3は6個のデータパケットD12〜D17を含み、ブロックB3−4は6個のデータパケットD18〜D23を含む。したがって、ブロックB3−3とB3−4は、ブロックB2−2のサブセットである。
以上のように、データパケットD0〜D23は、最上位の第1層の同一のブロックB1−1に属している。また、データパケットD0〜D23の各々は、複数の階層の各々において、いずれかのブロックに属している。例えば、データパケットD7は、第1層ではブロックB1−1に属し、第2層ではブロックB2−1に属し、第3層ではブロックB3−2に属している。
ところで、本実施形態では、FECによる誤り訂正が行われる。本実施形態における訂正対象の「誤り」とは、具体的には、データパケットの消失(すなわちパケットロス)である。そして、本実施形態では、消失したデータパケットを復元するための誤り訂正情報が、後述の転送装置により生成され、送信される。誤り訂正情報は、適宜のプロトコルのPDUの形にフォーマットされる。以下では誤り訂正情報をペイロードとして含むPDUを「FECパケット」という。
本実施形態によれば、ブロックが階層的に定義されることに対応して、FECパケットも階層的に生成される。すなわち、第1層のブロックB1−1に対応して、ブロックB1−1に属する24個のデータ単位の排他的論理和(eXclusive OR;XOR)に等しい誤り訂正情報が生成される。具体的には、データパケットD0〜D23のペイロード中の、誤り訂正の対象のデータ単位同士の排他的論理和が、誤り訂正情報として生成される。そして、生成された誤り訂正情報をペイロードとして含むFECパケットF1−1が生成される。
なお、長さが1ビットのビット値x1とx2の排他的論理和x3を、以下では式(1.1)のように演算子“^”を用いて表す。
x3=x1^x2 (1.1)
また、長さがm1ビット(1≦m1)のビット列y1と長さがm2ビット(1≦m2)のビット列y2の排他的論理和y3を、以下では式(1.2)のように演算子“^”を用いて表す。
y3=y1^y2 (1.2)
ここで、最上位ビット(Most Significant Bit;MSB)を「0ビット目」と呼ぶことにし、m1とm2の最大値をm3とする。すると、排他的論理和y3は、長さがm3ビットのビット列である。
具体的には、ビット列y3は、ビット列y1とy2のうちの長い方の長さm3に合わせて短い方を必要に応じてビット値0でパディングし、長い方のビット列と、必要に応じてパディングしたビット列との、ビットごとの排他的論理和を計算することで得られる。すなわち、ビット列y1、y2、y3それぞれのjビット目をy1[j]、y2[j]、y3[j]と表すことにすると、ビット値y3[j]は以下の式(1.3)〜(1.5)のとおりである。
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)
上記のようにして、FECパケットF1−1は、第1層のブロックB1−1に対応して生成される。
なお、以下では説明の簡略化のため、特に誤解のおそれがない場合は、ヘッダについては無視して「FECパケットF1−1は、データパケットD0〜D23の排他的論理和である」などと述べることがある。また、以下では、下記の式(1.6)のように、図中の参照符号を用いた式により、データパケットD0〜D23とFECパケットF1−1との関係を表すことがある。また、第1層以外の階層のFECパケットに関しても同様の簡略化した表現による説明を行うことがある。
[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)
なお、式(1.6)および以下の説明において、“[D0]”という表記は、データパケットD0のうち、ヘッダ等を除く、誤り訂正の対象であるデータ単位の部分を示す。例えば、[D0]は、具体的には、データパケットD0のペイロードである。
同様に、“[F1−1]”という表記は、FECパケットF1−1のうち、ヘッダ等を除く、誤り訂正情報の部分を示す。例えば、[F1−1]は、具体的には、FECパケットF1−1のペイロードの部分である。
また、或るFECパケットが或る1つ以上のデータパケットに「関連している(associated)」(あるいは「対応している」)とは、当該FECパケットが当該1つ以上のデータパケットから生成されたことを意味する。同様に、当該1つ以上のデータパケットは当該FECパケットに関連している。式(1.6)は互いに関連しているデータパケットとFECパケットの関係を示す式の一例である。
本実施形態では、上記のようにして第1層に対応する誤り訂正情報が生成されるだけではなく、さらに、エラーレートなどの環境に応じて、第2層以下の階層についても、後述の転送装置によりFECパケットが生成される。つまり、或る階層に連続する1層以上の階層の各々において、当該階層の1つ上の階層の同じブロックに含まれる当該階層の2つ以上のブロックの中で最後の1つのブロックを除く、当該階層の1つ以上の個別のブロックの各々について、誤り訂正情報が生成される。また、上記のようにして第2層以下の各階層の1つ以上の個別のブロックの各々について生成される誤り訂正情報は、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい。
なおここで、「或る階層」とは、具体的には、最上位の第1層のことである。しかし、詳しくは後述するとおり、「或る階層」は第2層以下の下の階層であってもよく、その場合の上記の誤り訂正情報の生成とは、階層の数を増やす処理に相当する。
また、例えば、FECパケットが生成される対象である上記の「或る階層に連続する1層以上の階層」は、第2層だけのこともあるし、第2層と第3層のこともあるし、第2層〜第4層のこともある。
例えば、図1の例では、第2層の1つ上の第1層の同じブロックB1−1に含まれるブロックB2−1とB2−2の中で、最後のブロックB2−2を除くブロックは、ブロックB2−1だけである。よって、第2層においてFECパケットの生成が行われる場合、具体的には、第2層のブロックB2−1に対応してFECパケットF2−1が生成され、ブロックB2−1の最後に挿入される。しかし、たとえ第2層のFECパケットの生成が行われる場合であっても、ブロックB2−2に対応してFECパケットが生成されることはない。
具体的には、ブロックB2−1に属する12個のデータパケットD0〜D11のペイロード中の誤り訂正の対象のデータ単位の部分同士の排他的論理和に等しい誤り訂正情報が生成される。そして、生成された誤り訂正情報は、FECパケットF2−1中にペイロードとして含まれる。すなわち、式(1.7)で表されるFECパケットF2−1が、ブロックB2−1に対応して生成される。
[F2-1]=[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11] (1.7)
また、図1の例では、第3層の1つ上の第2層の同じブロックB2−1に含まれるブロックB3−1とB3−2の中で、最後のブロックB3−2を除くブロックは、ブロックB3−1だけである。よって、第3層においてFECパケットの生成が行われる場合、具体的には、第3層のブロックB3−1に対応してFECパケットF3−1が生成され、ブロックB3−1の最後に挿入される。しかし、たとえ第3層のFECパケットの生成が行われる場合であっても、ブロックB3−2に対応してFECパケットが生成されることはない。
具体的には、ブロックB3−1に属する6個のデータパケットD0〜D5のペイロード中の誤り訂正の対象のデータ単位の部分同士の排他的論理和に等しい誤り訂正情報が生成される。そして、生成された誤り訂正情報は、FECパケットF3−1中にペイロードとして含まれる。すなわち、式(1.8)で表されるFECパケットF3−1が、ブロックB3−1に対応して生成される。
[F3-1]=[D0]^[D1]^[D2]^[D3]^[D4]^[D5] (1.8)
さらに、図1の例では、第3層の1つ上の第2層の同じブロックB2−2に含まれるブロックB3−3とB3−4の中で、最後のブロックB3−4を除くブロックは、ブロックB3−3だけである。よって、第3層においてFECパケットの生成が行われる場合、具体的には、第3層のブロックB3−3に対応してFECパケットF3−2が生成され、ブロックB3−3の最後に挿入される。しかし、たとえ第3層のFECパケットの生成が行われる場合であっても、ブロックB3−4に対応してFECパケットが生成されることはない。
具体的には、ブロックB3−3に属する6個のデータパケットD12〜D17のペイロード中の誤り訂正の対象のデータ単位の部分同士の排他的論理和に等しい誤り訂正情報が生成される。そして、生成された誤り訂正情報は、FECパケットF3−2中にペイロードとして含まれる。すなわち、式(1.9)で表されるFECパケットF3−2が、ブロックB3−3に対応して生成される。
[F3-2]=[D12]^[D13]^[D14]^[D15]^[D16]^[D17] (1.9)
第4層以上に深い階層においてFECパケットが生成される場合も、同様に、1つ上の階層で同じブロックに含まれるブロックの中で最後の1つのブロックを除くブロックについて、FECパケットの生成が行われる。すると、図1に示すように、FECパケットを生成する対象となる最大の深さの階層の各ブロックの最後に、いずれかの層のブロックに対応して生成されたFECパケットが挿入されて、データパケットとFECパケットが順に送信される。
例えば、最大の深さが第2層の場合は、ブロックB2−1に対応して生成されたFECパケットF2−1がブロックB2−1の最後に挿入される。他方、ブロックB2−2に対応して生成されるFECパケットは存在しない。しかし、ブロックB2−2の最後はブロックB1−1の最後でもあるので、ブロックB2−2の最後には、第1層のブロックB1−1に対応して生成されたFECパケットF1−1が挿入される。
あるいは、最大の深さが第3層の場合は、ブロックB3−1に対応して生成されたFECパケットF3−1がブロックB3−1の最後に挿入される。他方、ブロックB3−2に対応して生成されるFECパケットは存在しない。しかし、ブロックB3−2の最後はブロックB2−1の最後でもあるので、ブロックB3−2の最後には、第2層のブロックB2−1に対応して生成されたFECパケットF2−1が挿入される。また、ブロックB3−3に対応して生成されたFECパケットF3−2がブロックB3−3の最後に挿入される。他方、ブロックB3−4に対応して生成されるFECパケットは存在しない。しかし、ブロックB3−4の最後はブロックB1−1の最後でもある。よって、ブロックB3−4の最後には、第1層のブロックB1−1に対応して生成されたFECパケットF1−1が挿入される。
以上のようにして、FECパケットを生成する対象となる階層のうち最下層のブロックごとに、FECパケットが挿入される。
なお、任意の1≦iについて、第i階層のブロックが第(i+1)階層のブロックを3つ以上含んでもよいが、本実施形態では、第i階層のブロックが第(i+1)階層の2つのブロックを含む。
なぜなら、FECパケットの生成を行う階層の最大の深さがエラーレートに合わせて調整される場合の、調整による変化は、第i階層のブロックが含む第(i+1)階層のブロックの数が2のときに最も緩やかだからである。換言すれば、任意の1≦iについて、第i階層のブロックが第(i+1)階層の2つのブロックを含むように階層的なブロックが定義される場合に、最も細かい粒度で、最も効率のよい調整が実現されるからである。
ここで、上記の「調整による変化」とは、具体的には、FECパケットの個数の、データパケットの個数に対する割合の変化のことである。例えば、図1の例では、最大の深さが第3層から第2層に変化すると、上記割合は1/6から1/12に変化する。逆に、最大の深さが第2層から第3層に変化すると、上記割合は1/12から1/6に変化する。すなわち、第i階層のブロックが含む第(i+1)階層のブロックの数がQの場合、最大の深さが1増えると上記割合はQ倍になり、最大の深さが1減ると上記割合は1/Qになる。
したがって、Qが小さいほど、調整による変化が緩やかであり、調整の粒度が細かく、調整の効率が良い。そして、階層的にブロックが定義される場合、当然、Qは2以上の整数である。そのため、本実施形態では、最も好ましい値である2が、Qとして採用される。
ところで、図1には第1層のブロックとして1つのブロックB1−1のみを例示したが、第1層のブロックに属するデータ単位の数(すなわち第1層のブロックサイズ)よりも多くのデータ単位が送信されることもある。その場合、第1層の各ブロックごとに、図1に示したのと同様の処理により、適宜FECパケットが挿入される。
例えば、図2は、データパケットと、間に階層的に挿入されたFECパケットとの並びを例示する図である。図1と同様に第1層のブロックサイズが24の場合でも、24個以上のデータパケットが送信されることがある。例えば図2は48個のデータパケットが送信される例を示すが、第1層の各ブロックごとに、図1に示したのと同様の処理により、適宜FECパケットが挿入される。なお、図2は、FECパケットを生成する対象の階層の最大の深さが3の場合の例を示している。
具体的には、48個のデータパケットD0〜D47のうち、最初の24個のデータパケットD0〜D23は第1層の1つ目のブロックB1−1に属する。また、後ろの24個のデータパケットD24〜D47は第1層の2つ目のブロックB1−2に属する。そして、図1と同様に、ブロックB1−1はブロックB2−1とB2−2を含み、ブロックB2−1はブロックB3−1とB3−2を含み、ブロックB2−2はブロックB3−3とB3−4を含む。
ブロックB1−2も、ブロックB1−1と同様に階層的に定義されたサブセットのブロックを含む。すなわち、ブロックB1−2は第2層のブロックB2−3とB2−4を含み、ブロックB2−3は第3層のブロックB3−5とB3−6を含み、ブロックB2−4は第3層のブロックB3−7とB3−8を含む。ブロックB3−5〜B3−8には、それぞれ、データパケットD24〜D29、D30〜D35、D36〜D41、D42〜D47が属する。
第3層までのブロックに対応してFECパケットが生成される場合、図1と同様に、ブロックB3−1の後にはFECパケットF3−1が挿入され、ブロックB3−2の後にはFECパケットF2−1が挿入される。また、ブロックB3−3の後にはFECパケットF3−2が挿入され、ブロックB3−4の後にはFECパケットF1−1が挿入される。
そして、階層的なFECパケットの挿入は、第1層の2つ目のブロックB1−2に関しても同様である。すなわち、FECパケットF3−3が、第3層のブロックB3−5に対応して生成され、ブロックB3−5の後に挿入される。そして、FECパケットF2−2が、第2層のブロックB2−3に対応して生成され、ブロックB3−6の後に挿入される。また、FECパケットF3−4が、第3層のブロックB3−7に対応して生成され、ブロックB3−7の後に挿入される。そして、FECパケットF1−2が、第1層のブロックB1−2に対応して生成され、ブロックB3−8の後に挿入される。
ブロックB1−2またはそのサブセットのブロックに対応して挿入される上記のFECパケットは、以下の式(2.1)〜(2.4)のように表すことができる。
[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)
以上のように、第1層のブロックサイズよりも多くのデータパケットが送信される場合でも、適宜FECパケットの生成と挿入が行われる。
続いて、上記のようなデータパケットとFECパケットが送信されるネットワークの例について、図3を参照して説明する。図3は、ネットワークトポロジの2つの例を示す図である。本実施形態は、例えばネットワーク100に適用されてもよいし、ネットワーク120に適用されてもよい。
ネットワーク100は、ツリー型のトポロジのネットワークの例である。ネットワーク100における根ノードはノード101である。ノード101は、パケット(すなわちデータパケットとFECパケット)をノード102と103に送信する。ノード102は、ノード101から受信したパケットをノード104と105に転送する。同様に、ノード103は、ノード101から受信したパケットをノード106に転送する。
また、ノード104は、ノード102から受信したパケットをノード107と108に転送する。ノード105は、ノード102から受信したパケットをノード109に転送する。そして、ノード106は、ノード103から受信したパケットをノード110と111に転送する。
ノード107〜111は、図3に示すごとく、ネットワーク100における葉ノードなので、受信したパケットを転送しない。なお、以下では、根ノードでもなく葉ノードでもないノード102〜106を「中継ノード」と称する。
また、ネットワーク120は、分岐のないネットワーク(すなわち、2つ以上の子ノードを持つノードが存在しないネットワーク)の例である。ネットワーク120のトポロジもツリーの1種である。ネットワーク120の根ノードはノード121であり、ノード121は、パケットをノード122に送信する。ノード122は、ノード121から受信したパケットをノード123に転送する。そして、ノード123は、ノード122から受信したパケットをノード124に転送する。ノード122と123は中継ノードであり、ノード124は葉ノードである。よって、ノード124はパケットを転送しない。
ところで、ネットワーク100内の各リンクは、それぞれエラーレートが異なり得る。例えば、ノード101と102の間のリンクのエラーレートよりも、ノード101と103の間のリンクのエラーレートの方が大幅に高いかもしれない。そのため、もし、ノード101が、ノード102と103に対して同じ割合で、FECパケットをデータパケット同士の間に挿入すると、FECパケットが過剰になるか、または不足するおそれがある。つまり、ノード102は余計なFECパケットを受信することになるかもしれないし、あるいは逆に、ノード103にとってはFECパケットが不足するかもしれない。
したがって、ノード101は、ノード102と103にそれぞれ合わせた割合でFECパケットをデータパケット同士の間に挿入することが好ましい。しかし、仮にノード101の子ノードの数が、図3のように2個ではなく、多数(例えば100個あるいは1000個など)である場合は、各子ノードに応じた異なる割合でのFECパケットの生成と挿入による処理負荷の増大を無視することはできない。よって、処理負荷の増大を抑制することが好ましい。
本実施形態によれば、このような処理負荷の抑制も実現される。つまり、たとえノード101が多数の子ノードを持っていても、処理負荷が極端に増大することがない。子ノードを複数有する根ノードにおける処理負荷の抑制が可能な理由は、詳しくは後述するが、図1〜2を参照して説明したようにFECパケットに階層構造があるからである。
また、例えばノード101と102の間のリンクのエラーレートよりも、ノード102と104の間のエラーレートの方が大幅に高いかもしれない。すると、ノード102が、ノード101から受信したデータパケットとFECパケットをそのままノード104に転送するのは不適切な場合がある。なぜなら、ノード102にとってはノード101から受信することができなかったデータパケットを復元するのに十分な割合でFECパケットが挿入されているとしても、当該割合はノード104にとっては不足かもしれないからである。よって、ノード102は、FECパケットが挿入される割合を増やす処理をすることが適切な場合がある。
逆に、例えばノード101と103の間のリンクのエラーレートは、ノード103と106の間のエラーレートよりも大幅に高いかもしれない。この場合、ノード103が、ノード101から受信したデータパケットとFECパケットをそのままノード106に転送すると、ノード106にとっては不必要なほど多くのFECパケットが、ノード106に送信されるおそれがある。つまり、結果的にFECパケットの一部は無駄なトラフィックになってしまうかもしれない。よって、ノード103は、FECパケットが挿入される割合を減らす処理をすることが適切な場合がある。
また、或る中継ノードが複数の子ノードを有する場合、当該中継ノードは、FECパケットが挿入される割合を増やしたり減らしたりする処理を、各子ノードに応じて行うことが好ましい。ここで、子ノードが多数の場合は、処理負荷の増大を無視することができないので、処理負荷の増大を抑制することが好ましい。
本実施形態によれば、このような処理負荷の抑制も実現される。つまり、たとえ中継ノードが多数の子ノードを持っていても、処理負荷が極端に増大することがない。子ノードを複数有する中継ノードにおける処理負荷の抑制が可能な理由は、詳しくは後述するが、図1〜2を参照して説明したようにFECパケットに階層構造があるからである。
そして、ネットワーク120においても、各リンクは、それぞれエラーレートが異なり得る。したがって、ネットワーク120においても、上記のネットワーク100における例と同様に、FECパケットが挿入される割合を増やしたり減らしたりする処理を中継ノードが行うことが好ましい状況が生じ得る。
また、ネットワーク100と120のいずれにおいても、どのリンクも、時間の経過とともにエラーレートが変化し得る。したがって、ネットワークトポロジによらず、各リンクの動的に変化し得るエラーレートに応じた適切な割合で、FECパケットがデータパケットの間に挿入されることが好ましい。詳しくは後述するが、図1〜2を参照して説明した階層的なFECパケットを利用することにより、エラーレートに応じた適切な割合でのFECパケットの挿入が実現され、しかも各ノードの処理負荷を抑制することができる。
ところで、図3に示す各ノード101〜111および121〜124は、具体的には例えば後述の転送装置である。本実施形態の転送装置は、根ノードとして動作することもでき、中継ノードとして動作することもでき、葉ノードとして動作することもできる。
また、各ノード101〜111および121〜124は、具体的には、本実施形態が適用されるプロトコルのレイヤに応じて、ルータでもよいし、PC(Personal Computer)またはサーバのような汎用的なコンピュータでもよい。
例えば、本実施形態は、ルータの機能を拡張して、いわゆる「インテリジェントルータ」を実現するために利用されてもよい。その場合、各ノード101〜111および121〜124は、ルータであり、図3におけるノード間の矢印は物理的な接続を示す。
あるいは、本実施形態は、オーバレイマルチキャストとも呼ばれるALM(Application Layer Multicast)の配信システムに利用されてもよい。その場合、各ノード101〜111および121〜124は、汎用的なコンピュータであり、図3におけるノード間の矢印は、配信ツリーにおける論理的な接続を示す。
各ノード101〜111および121〜124が、ルータと汎用的なコンピュータのいずれであるにしろ、誤り訂正情報が階層的に生成され、挿入されるという特徴は変わらない。また、図3に示したトポロジが物理的なトポロジであるか論理的なトポロジであるかによらず、誤り訂正情報が階層的に生成され、挿入される。
また、本実施形態は、例えばネットワーク100において、根ノード101から、ネットワーク100内の残りの10個のノード102〜111へのマルチキャストに適用可能である。あるいは、本実施形態は、根ノード101から、ネットワーク100内の一部のノード(例えば、5個の葉ノードだけ、あるいは、5個の葉ノードと1個以上の中継ノード)へのマルチキャストにも適用可能である。
同様に、本実施形態は、ネットワーク120において、根ノード121から、ネットワーク120内の残りの3個のノード122〜124(あるいは葉ノード124と、中継ノードのうちの一方とを含む2個)へのマルチキャストに適用可能である。また、本実施形態は、根ノード121からノード124へのユニキャストにも適用可能である。
そして、本実施形態が上記のマルチキャストまたはユニキャストのどの例に適用されるにしろ、誤り訂正情報が階層的に生成され、挿入されるという特徴は変わらない。
続いて、図4〜7を参照して、ネットワーク内のノードの動作の概要を、処理負荷の少なさという利点とともに説明する。
図4は、FECパケットの階層的な生成と挿入の例を示す図である。図1〜2を参照して説明したとおり、本実施形態では階層的なFECパケットが生成され、データパケットの間に挿入される。図4にも図2と同様に48個のデータパケットD0〜D47と、第1〜3階層の各ブロックの範囲と、各ブロックに対応して生成および挿入された8個のFECパケットが示されている。
ところで、図3のノード101は、一連のデータパケット(例えばデータパケットD0〜D47)を一度処理するだけで、任意に決められた最大深さN(1≦N)までの各階層のFECパケットを生成することもできる。すなわち、ノード101は、一連のデータパケットから、ワンパス(one-pass)処理により、1≦n≦Nなるすべてのnについて第n層のFECパケットを生成することができる。ブロックとFECパケット自体は階層化されているにもかかわらず、ワンパス処理によりFECパケットを生成することができるという点は、処理負荷の抑制および記憶領域の消費抑制という面での利点である。
例えば、ノード101は、まず、1≦n≦Nなるすべてのnについて第n層のFECパケット用の記憶領域を割り当ててもよい。そして、ノード101は、データパケットを先頭から順に処理していき、処理対象の1つのデータパケットにつき次の処理を行ってもよい。
すなわち、ノード101は、或る1つのデータパケットを処理する際、各nについて、処理対象のデータパケットが第n層のブロックの最初のデータパケットか、2番目以降のデータパケットかを判断する。そして、もし処理対象のデータパケットが第n層のブロックの最初のデータパケットであれば、ノード101は、第n層用に割り当てた記憶領域に、処理対象のデータパケットを記憶する。また、もし処理対象のデータパケットが第n層のブロックの2番目以降のデータパケットなら、ノード101は、第n層用に割り当てた記憶領域上に現在記憶されているデータと、処理対象のデータパケットとの排他的論理和を、当該記憶領域上に上書きする。
以上のような処理により、排他的論理和の計算が漸次的に進行するので、ワンパス処理によって各層のFECパケットが生成可能である。
また、各層のFECパケットの生成は、以下に説明する別の手順によっても可能である。以下の手順も、ワンパス処理の一例である。
例えば、式(1.7)と(1.8)から、次の式(4.1)が成立する。
[F2-1]=[F3-1]^[D6]^[D7]^[D8]^[D9]^[D10]^[D11] (4.1)
そして、式(1.6)と(1.7)と(1.9)から、次の式(4.2)が成立する。
[F1-1]=[F2-1]^[F3-2]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23] (4.2)
上記の式(4.1)と(4.2)は、以下のことを示している。すなわち、ノード101がデータパケット列を先頭から順に処理していくときに、第n層のブロックに対応してFECパケットを生成するには、第n層のブロックに属するすべてのデータパケットそのものが必ずしも必要なわけではない。その代わり、より深い階層のブロックに対応して既に生成したFECパケットと、第N層の直近のブロックに属するデータパケットのみからでも、ノード101は、第n層のブロックに対応するFECパケットを生成することができる。
上記の式(4.1)と(4.2)を一般化して説明すれば以下のとおりである。すなわち、ノード101は、第2層またはそれ以上に深い各階層のブロックに対応して最後に生成したFECパケットを保持する。ここで「最後」とは、「第1層の現在処理中のブロックに含まれる当該階層のブロックのうち、既に対応するFECパケットを生成したブロックの中では最後」という意味である。
以下では、n≧2のとき、第n層のブロックに対応して最後に生成したFECパケットを“FEC_Last(n)”と表す。ノード101は、2≦n≦NなるすべてのnについてFECパケットFEC_Last(n)を保持していれば、既に生成したFECパケットの生成に用いたデータパケットそのものを保持し続けなくてもよい。
また、最下層(すなわち第N層)の最後のブロックに属するデータパケットの排他的論理和を“FEC_New()”と表す。ここで「最後」とは、「第1層の現在処理中のブロックに含まれる第N層のブロックのうち、生成対象のFECパケットの挿入位置より前にあるブロックの中では最後」という意味である。
例えば、N=3の場合に、図4に示すように第1〜3階層のブロックサイズがそれぞれ24、12、6であるとする。このとき、ノード101は、図4に示すとおり、データパケットD5、D11、D17、D23、D29、D35、D41、D47の直後にそれぞれFECパケットを挿入する。ここで、生成および挿入の対象が第n層のFECパケットであるとき、当該FECパケットを“FEC(n)”と表すことにすると、FEC(n)は、式(4.3)と(4.4)のように定義される。以下に詳しく説明するとおり、式(4.3)は式(4.1)と(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)
例えば、図4ではN=3である。よって、第1層の現在処理中のブロックがブロックB1−1である場合を例として、FECパケットF3−1、F2−1、F3−2、およびF1−1の生成について上記の式(4.3)と(4.4)を参照して説明すれば以下のとおりである。
データパケットD5の直後に挿入するFECパケットF3−1の階層は3である。よって、この場合、n=N=3なので式(4.4)が適用される。また、この場合、最下層(すなわち第3層)の最後のブロックとはブロックB3−1のことである。したがって、FEC_New()とは、具体的にはブロックB3−1に属するすべてのデータパケットD0〜D5の排他的論理和である。よって、FECパケットF3−1については式(4.4)から式(4.5)が得られ、式(4.5)の結果は式(1.8)とも一致する。
[F3-1]=FEC(n)
=FEC(3)
=FEC_New()
=[D0]^[D1]^[D2]^[D3]^[D4]^[D5] (4.5)
また、データパケットD11の直後に挿入するFECパケットF2−1の階層は2である。よって、この場合、n=2≦N−1なので式(4.3)が適用される。また、この場合、第(n+1)層(つまり第3層)のブロックに対応して最後に生成したFECパケットはFECパケットF3−1である。そして、この場合、最下層の最後のブロックとはブロックB3−2のことなので、FEC_New()とは、具体的にはブロックB3−2に属するすべてのデータパケットD6〜D11の排他的論理和である。よって、FECパケットF2−1については式(4.3)から式(4.6)が得られ、式(4.6)の結果は式(4.1)とも一致する。
[F2-1]=FEC(n)
=FEC(2)
=FEC_Last(3)^FEC_New()
=[F3-1]^[D6]^[D7]^[D8]^[D9]^[D10]^[D11] (4.6)
また、データパケットD17の直後に挿入するFECパケットF3−2の階層は3である。よって、この場合、式(4.4)が適用される。また、この場合、最下層の最後のブロックとはブロックB3−3のことである。したがって、FEC_New()とは、具体的にはブロックB3−3に属するすべてのデータパケットD12〜D17の排他的論理和である。よって、FECパケットF3−2については式(4.4)から式(4.7)が得られ、式(4.7)の結果は式(1.9)とも一致する。
[F3-2]=FEC(n)
=FEC(3)
=FEC_New()
=[D12]^[D13]^[D14]^[D15]^[D16]^[D17] (4.7)
また、データパケットD23の直後に挿入するFECパケットF1−1の階層は1である。よって、この場合、式(4.3)が適用される。また、この場合、第(n+1)層(つまり第2層)のブロックに対応して最後に生成したFECパケットはFECパケットF2−1であり、第(n+2)層(つまり第3層)のブロックに対応して最後に生成したFECパケットはFECパケットF3−2である。そして、この場合、最下層の最後のブロックとはブロックB3−4のことなので、FEC_New()とは、具体的にはブロックB3−4に属するすべてのデータパケットD18〜D23の排他的論理和である。よって、FECパケットF1−1については式(4.3)から式(4.8)が得られ、式(4.8)の結果は式(4.2)とも一致する。
[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)
以上説明したとおり、FECパケットを生成するには、データパケットのみを利用してもよいし、生成済みのFECパケットも利用してもよい。図4には、或るブロックに対応するFECパケットが、当該ブロックに属するすべてのデータパケットから直接的に生成される場合を示す矢印が示されている。さらに、図4には、第n層の或るブロックに対応するFECパケットが、より深い階層の生成済みのFECパケットと最下層の直近のブロックのデータパケットから生成される場合を示す矢印も示されている。もちろん、後者の場合であっても、FECパケットは間接的にはデータパケットから生成されているのだから、FECパケットがデータパケットに基づいているという点には変わりがない。
以上、「第1層の現在処理中のブロック」がブロックB1−1であり、かつN=3である場合を例にして、式(4.3)と(4.4)について具体的に説明したが、もちろん、式(4.3)と(4.4)は、その他の場合にも成立する。つまり、式(4.3)と(4.4)は、「第1層の現在処理中のブロック」がどのブロックであろうとも、Nがどのような値であろうとも、成立する。
なお、各階層のブロックが直下の階層のブロックを2つずつ含み、かつ最下層が第N層の場合に、第1層の現在処理中のブロック内でX番目に挿入されるFECパケットの階層nは、式(4.9)を満たすa(0≦a≦N−1)を用いて、n=N−aと表せる。
X=2(a+1)i+2a-1 (4.9)
式(4.9)において、0≦X<2(N−1)であり、iは0以上の整数である。式(4.9)の具体例を説明すれば以下のとおりである。
例えば、N=1のときは、0≦X<20=1なので、X=0の場合しかない。そして、図1から理解されるように、X=0のときは、n=1であるから、n=N−0と表すことができる(すなわちa=0である)。
そして、i=0とおくことにより、「N=1のとき、式(4.9)は正しい」ということが理解されるだろう。つまり、上記のaに関する前提によれば、N=1のとき、0≦a≦1−1=0である(すなわちa=0の場合しかない)。そして、a=0を式(4.9)に代入すると、式(4.10)が得られる。式(4.10)においてi=0とおけば、X=0が得られるので、X=0は式(4.9)を満たす。つまり、N=1のとき式(4.9)は正しい。
X=21i+20-1=2i (4.10)
また、N=2のときは、0≦X<21=2なので、X=0またはX=1である。他方、上記のaに関する前提によれば、N=2のとき、0≦a≦N−1=1である。そして、以下のとおり、N=2のときも式(4.9)は正しい。
具体的には、図1においてN=2のとき、0番目にFECパケットF2−1が挿入されており、1番目にFECパケットF1−1が挿入されていることから理解されるように、X=0のときは、n=2=N−0である(つまりa=0である)。ここで、上記のとおり、a=0のときに式(4.9)は式(4.10)のように変形されるので、式(4.10)においてi=0とおけば、X=0は式(4.9)を満たす。
さらに、図1から理解されるように、X=1のときは、n=1=N−1であるからa=1である。そして、a=1を式(4.9)に代入すると式(4.11)が得られる。式(4.11)においてi=0とおけば、X=1が得られるので、X=1も式(4.9)を満たす。
X=22i+21-1=4i+1 (4.11)
また、N=3のときは、0≦X<22=4である。他方、上記のaに関する前提によれば、N=3のとき、0≦a≦3−1=2である。
また、図1においてN=3のとき、0番目にFECパケットF3−1が挿入されており、1番目にFECパケットF2−1が挿入されており、2番目にFECパケットF3−2が挿入されており、3番目にFECパケットF1−1が挿入されている。このことから理解されるように、X=0またはX=2のときは、n=3=N−0であるからa=0であり、X=1のときは、n=2=N−1であるからa=1であり、X=3のときは、n=1=N−2であるからa=2である。
ここで、上記のとおり、a=0のときに式(4.9)は式(4.10)のように変形される。式(4.10)においてi=0とおけば、X=0が得られるので、X=0は式(4.9)を満たす。また、式(4.10)においてi=1とおけば、X=2が得られるので、X=2も式(4.9)を満たす。
また、上記のとおり、a=1のときに式(4.9)は式(4.11)のように変形される。式(4.11)においてi=0とおけば、X=1が得られるので、X=1も式(4.9)を満たす。
また、a=2のときに式(4.9)は式(4.12)のように変形される。式(4.12)においてi=0とおけば、X=3が得られるので、X=3も式(4.9)を満たす。
X=23i+22-1=8i+3 (4.12)
以上の具体例の説明から理解されるように、式(4.9)を満たすa(0≦a≦N−1)が0≦X<2(N−1)なるXに対して一意に定まる。よって、例えばノード101は、次に生成および挿入するX番目のFECパケットの階層(n=N−a)を認識することができ、認識した階層nにしたがって、式(4.3)または(4.4)により、X番目のFECパケットを生成することができる。なお、FECパケットを生成するノード(例えばノード101)は、式(4.9)を使わずに、図14とともに後述するブロック管理テーブル500のような情報を用いて、次に生成および挿入するX番目のFECパケットの階層を認識することもできる。
図5は、消失したデータパケットを、FECパケットを利用して復元する例を示す図である。図5では、消失したデータパケットがハッチングにより図示されている。
ここで、ビット列yと同じ長さで全ビットが0のビット列を“zero(y)”と表記することにすると、排他的論理和の性質から、任意のビット列yに関して、式(5.1)と(5.2)が成り立つ。
y^y=zero(y) (5.1)
y^zero(y)=y (5.2)
したがって、例えばブロックB3−1に属するデータパケットD2が、ノード101からノード102へのリンクで消失した場合、ノード102は、次のようにしてデータパケットD2を復元することができる。すなわち、ノード102は、同じブロックB3−1に属する残りの5つのデータパケットD0、D1、D3〜D5と、ブロックB3−1に対応して生成され、送信されたFECパケットF3−1との排他的論理和を計算することで、データパケットD2を復元する。
上記の計算によりデータパケットD2の復元が可能なことは、式(1.8)、(5.1)、および(5.2)から導かれる次の式(5.3)により明らかである。
[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)
また、例えばブロックB3−2に属するデータパケットD8が、ノード101からノード102へのリンクで消失した場合、ノード102は、2種類の処理のいずれによっても、データパケットD2を復元することができる。第1の処理は、次の(A−1)と(A−2)の事実に注目した処理である。
(A−1)ブロックB3−2は、図1に示すように、1つ上の第2層のブロックB2−1の中では最後のブロックである。したがって、ブロックB3−2に対応して生成される第3層のFECパケットは存在しない。
(A−2)その代わり、ブロックB3−2の最後には、ブロックB2−1に対応して生成されたFECパケットF2−1が挿入されている。
上記(A−1)と(A−2)より、ノード102は、ブロックB2−1に属する残りの11個のデータパケットと、FECパケットF2−1との排他的論理和を計算することで、消失したデータパケットD8を復元することができる。なお、データパケットD8だけでなく、さらにブロックB3−1中のデータパケットD0〜D5のいずれか1つが消失した場合には、ノード102は、上記のデータパケットD2の例と同様にして、ブロックB3−1中で消失したデータパケットを先に復元する。すると、ブロックB3−1に属する6つのデータパケットD0〜D5がすべて揃う。よって、ノード102は、消失したデータパケットD8を復元することができる。
以上説明した第1の処理は、次の式(5.4)からも明らかである。なお、式(5.4)は、式(5.3)の導出と同様にして式(1.7)、(5.1)、および(5.2)から導出される。
[D0]^[D1]^[D2]^[D3]^[D4]^[D5]^[D6]^[D7]^[D9]^[D10]^[D11]^[F2-1]
=[D8] (5.4)
ところが、上記の第1の処理によれば、ノード102は、ブロックB3−2中のいずれかのデータパケットの消失に備えて、ブロックB3−1に属するすべてのデータパケットを保持し続けなくてはならない。つまり、第1の処理によれば、ノード102は多くのバッファ領域を消費してしまう。
そこで、上記のデータパケットD8が消失する例において、ノード102は、バッファ領域の消費を抑制するため、以下に説明する第2の処理によりデータパケットD8を復元してもよい。すなわち、ノード102は、下記(B−1)〜(B−3)の各パケットの排他的論理和を計算することで、データパケットD8を復元することができる。
(B−1)最下層(図5の例では第3層)において、消失したデータパケットD8と同じブロックB3−2に属する、残りの5つのデータパケットD6、D7、D9〜D11。
(B−2)消失したデータパケットD8より後に挿入される最初のFECパケット(すなわちFECパケットF2−1)。
(B−3)上記(B−2)のFECパケットF2−1に対応する第2層よりも深いすべての階層(図5の例では、第3層のみ)について、当該階層のFECパケットのうちで最後のもの。すなわち、図5の例では、FECパケットF3−1のみ。ここで「最後」とは、消失したデータパケットD8より後に挿入される最初のFECパケット2−1に対応するブロックB2−1に含まれる同じ階層のブロック同士での比較において最後のブロックに対応するFECパケット、という意味である。
換言すれば、上記(B−3)での「最後」とは、復元対象のデータパケットが属するブロックのうち、対応して生成されたFECパケットを持つブロックの中では最も下の階層のブロックの範囲内で最後のブロックに対応するFECパケット、という意味である。
例えば、データパケットD8は第3層においてブロックB3−2に属するが、ブロックB3−2に対応して生成されたFECパケットはない。一方、データパケットD8が第2層と第1層においてそれぞれブロックB2−1とB1−1に属し、ブロックB2−1とB1−1には、それぞれに対応して生成されたFECパケットF2−1とF1−1がある。よって、上記(B−3)の意味での「最後」のFECパケットとは、第2層と第1層のうち下の方の階層である第2層のブロックB2−1の範囲内で、同じ階層のブロックの中では最後のブロックに対応するFECパケットである。つまり、第3層についての「最後」のFECパケットは、FECパケットF3−1である。
以上説明したように(B−1)〜(B−3)の排他的論理和を計算する第2の処理によりデータパケットD8の復元が可能なことは、次の式(5.5)からも明らかである。なお、式(5.5)は、式(5.4)と式(1.8)から導出される。
[F3-1]^[D6]^[D7]^[D9]^[D10]^[D11]^[F2-1]
=[D8] (5.5)
そして、ノード101からノード102へのリンクでデータパケットD8が消失した場合と同様に、データパケットD19が消失した場合も、ノード102は、第1または第2の処理により、データパケットD19を復元することができる。すなわち、第1の処理は次の(C−1)と(C−2)の事実に注目した処理である。
(C−1)データパケットD19は、最下層の第3層においてブロックB3−4に属する。しかし、ブロックB3−4は、1つ上の第2層のブロックB2−1の中では最後のブロックである。したがって、ブロックB3−4に対応して生成される第3層のFECパケットは存在しない。
(C−2)その代わり、ブロックB3−4の最後には、ブロックB1−1に対応して生成されたFECパケットF1−1が挿入されている。
上記(C−1)と(C−2)より、ノード102は、ブロックB1−1に属する残りの23個のデータパケットと、FECパケットF1−1との排他的論理和を計算することで、消失したデータパケットD19を復元することができる。なお、ノード102は、ブロックB3−1〜B3−3のそれぞれにおいて1個までのデータパケットが消失した場合であっても、第1の処理によりデータパケットD19を復元することができる。
なぜなら、ノード102は、ブロックB3−1中のデータパケットを、上記のデータパケットD2の例と同様にして復元することができ、ブロックB3−2中のデータパケットを、上記のデータパケットD8の例と同様にして復元することができるからである。そして、ノード102は、ブロックB3−3中のいずれか1個のデータパケットが消失した場合でも、ブロックB3−3中の残りの5個のデータパケットとFECパケットF3−2から、消失したデータパケットを復元することができるからである。
したがって、ノード102は、ブロックB3−1〜B3−3に属するデータパケットが消失した場合には、消失したデータパケットを先に復元する。それにより、ブロックB1−1に属する、データパケットD19以外の23個のデータパケットが揃う。よって、たとえデータパケットD19が消失するだけでなくブロックB3−1〜B3−3でもデータパケットの消失が生じたとしても、ノード102は、第1の処理により、データパケットD19を復元することができる。
以上説明した第1の処理によるデータパケットD19の復元は、次の式(5.6)からも明らかである。なお、式(5.6)は、式(5.3)の導出と同様にして式(1.6)、(5.1)、および(5.2)より導出される。
[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)
ところが、上記の第1の処理によれば、ノード102は、ブロックB3−4中のいずれかのデータパケットの消失に備えて、ブロックB3−1〜B3−3に属するすべてのデータパケットを保持し続けなくてはならない。つまり、第1の処理によれば、ノード102は多くのバッファ領域を消費してしまう。
そこで、上記のデータパケットD19が消失する例において、ノード102は、バッファ領域の消費を抑制するため、以下に説明する第2の処理によりデータパケットD19を復元してもよい。すなわち、ノード102は、下記(D−1)〜(D−3)の各パケットの排他的論理和を計算することで、データパケットD19を復元することができる。
(D−1)最下層(図5の例では第3層)において、消失したデータパケットD19と同じブロックB3−4に属する、残りの5つのデータパケットD18、D20〜S23.
(D−2)消失したデータパケットD19より後に挿入される最初のFECパケット(すなわちFECパケットF1−1)。
(D−3)上記(D−2)のFECパケットF1−1に対応する第1層よりも深いすべての階層(図5の例では、第2層と第3層)について、当該階層のFECパケットのうちで最後のもの。すなわち、図5の例では、第2層についてのFECパケットF2−1と、第3層についてのFECパケットF3−2。なおここでの「最後」の意味は、上記(B−3)で説明したのと同様であり、データパケットD19が消失する例では、ブロックB1−1の範囲内での同じ階層のブロック同士の比較で「最後」、という意味である。
以上説明した第2の処理によりデータパケットD19の復元が可能なことは、次の式(5.7)からも明らかである。なお、式(5.7)は、式(5.6)と式(1.7)と式(1.9)から導出される。
[F2-1]^[F3-2]^[D18]^[D20]^[D21]^[D22]^[D23]^[F1-1]
=[D19] (5.7)
なお、上記の説明では、ノード101からノード102への送信中にデータパケットが消失した場合の、ノード102による復元を具体例として挙げた。しかし、もちろんノード101と102の間のリンク以外のリンク上でデータパケットが消失した場合にも、他のノードが同様にしてデータパケットを復元することができる。
また、図5の例では、最下層が第3層であるが、もちろん階層の最大の深さNは任意である。そこで、データパケットD8とD19の復元について説明した上記の第2の処理を一般化して説明すれば、次のとおりである。
式(4.3)と式(4.4)に関して説明した上記の定義によれば、FEC_New()は、最下層(すなわち第N層)の最後のブロックに属するデータパケットの排他的論理和である。したがって、第N層において或るブロックに属する或るデータパケットが消失した場合、消失したデータパケットは、当該「或るブロック」に属する残りのデータパケットと、FEC_New()との排他的論理和を計算することにより、復元することができる。
例えば、N=3である図5の例において、データパケットD19が消失した場合、第3層においてデータパケットD19が属するのはブロックB3−4であるから、「最下層の最後のブロック」はブロックB3−4である。よって、FEC_New()は、定義より、ブロックB3−4に属するデータパケットD18〜D23の排他的論理和のことである。したがって、消失したデータパケットD19は、ブロックB3−4に属する残りの5個のデータパケットD18、D20〜D23と、FEC_New()との排他的論理和を計算することにより、復元することができる。そして、FEC_New()は、以下のように表される。
1≦n≦N−1のとき、式(4.3)の両辺に“^FEC(n)^FEC_New()”を加えることにより次の式(5.8)が導出される。
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)
そして、式(5.1)と(5.2)を用いて式(5.8)の左辺と右辺をそれぞれ変形すると、1≦n≦N−1のときに関する式(5.9)が得られる。
FEC_New()=FEC_Last(n+1)^FEC_Last(n+2)^FEC_Last(n+3)^…^
FEC_Last(N)^FEC(n) (5.9)
また、n=Nのとき、式(4.4)から次の式(5.10)が得られる。
FEC_New()=FEC(n) (5.10)
なお、式(5.9)と式(5.10)におけるFEC(n)は、図4と図5の説明から明らかなように、消失したデータパケットよりも後に挿入される最初のFECパケットであり、nは当該FECパケットの階層である。
例えば、図5の例において、データパケットD2が消失した場合は、FEC(n)=[F3−1]かつn=3である。また、データパケットD8が消失した場合は、FEC(n)=[F2−1]かつn=2である。そして、データパケットD19が消失した場合は、FEC(n)=[F1−1]かつn=1である。なお、図5には例示していないが、例えばデータパケットD14が消失した場合は、FEC(n)=[F3−2]かつn=3である。
例えば、ノード101からパケットを受信するノード102は、最下層の第N層の最新のブロックに属するデータパケットと、第2層以下の各階層で最後に受信したFECパケットさえ保持していれば、消失したデータパケットを復元することができる。具体的には、ノード102は、次のようにしてデータパケットを復元する。
ノード102は、データパケットの消失を検知した場合、消失したデータパケットの第1層のブロック内での順番から、上記のnの値を認識することができる。よって、ノード102は、認識したnの値に応じて、式(5.9)によりFEC_New()を計算するか、または、式(5.10)により、保持しているFEC(n)をFEC_New()として得る。
そして、ノード102は、消失したデータパケットと第N層において同じブロックに属する残りのデータパケットと、FEC_New()との排他的論理和を計算することにより、消失したデータパケットを復元する。
例えば、データパケットD2が消失した場合は、データパケットD2よりも後の最初のFECパケットF3−1は第3層のブロックB3−1に対応するので、n=3である。よって、ノード102は、式(5.10)にしたがって式(5.11)のFEC_New()を得る。
FEC_New()=FEC(3)=[FEC3-1] (5.11)
ここで、消失したデータパケットD2が属する最下層のブロックB3−1に属する残りのデータパケットは、データパケットD0、D1、D3〜D5である。よって、ノード102は、式(5.11)により得られるFEC_New()と、5個のデータパケットD0、D1、D3〜D5との排他的論理和を計算することで、データパケットD2を復元する。この復元は、式(5.3)を参照して説明したとおりである。
そして、データパケットD8が消失した場合は、データパケットD8よりも後の最初のFECパケットF2−1は第2層のブロックB2−1に対応するので、n=2である。よって、ノード102は、式(5.9)にしたがって式(5.12)のFEC_New()を得る。
FEC_New()=FEC_Last(3)^FEC(2)=[FEC3-1]^[FEC2-1] (5.12)
ここで、消失したデータパケットD8が属する最下層のブロックB3−2に属する残りのデータパケットは、データパケットD6、D7、D9〜D11である。よって、ノード102は、式(5.12)により得られるFEC_New()と、5個のデータパケットD6、D7、D9〜D11との排他的論理和を計算することで、データパケットD8を復元する。この復元は、式(5.5)を参照して説明したとおりである。
また、データパケットD19が消失した場合は、データパケットD19よりも後の最初のFECパケットF1−1は第1層のブロックB1−1に対応するので、n=1である。よって、ノード102は、式(5.9)にしたがって式(5.13)のFEC_New()を得る。
FEC_New()=FEC_Last(2)^FEC_Last(3)^FEC(1)
=[FEC2-1]^[FEC3-2]^[FEC1-1] (5.13)
ここで、消失したデータパケットD19が属する最下層のブロックB3−4に属する残りのデータパケットは、データパケットD18、D20〜D23である。よって、ノード102は、式(5.13)により得られるFEC_New()と、5個のデータパケットD18、D20〜D23との排他的論理和を計算することで、データパケットD19を復元する。この復元は、式(5.7)を参照して説明したとおりである。
以上説明したように、消失したデータパケットが最下層の第N層において属するブロックに対応するFECパケットが定義されていれば、式(5.10)による復元が行われる。なぜなら、消失したデータパケットの後の最初のFECパケットに対応するブロックの階層は、第N層だからである。
逆に、消失したデータパケットが最下層の第N層において属するブロックが、1つ上の階層(つまり第(N−1)層)の同じブロックの中で最後のブロック(例えば図5のブロックB3−4)である場合は、式(5.9)による復元が行われる。なぜなら、消失したデータパケットの後の最初のFECパケットに対応するブロックは、第N層よりも浅い階層のブロックだからである。
ところで、例えば図3において、ノード101と103の間のリンクのエラーレートは、ノード103と106の間のエラーレートより高い場合があり得る。この場合、ノード101がノード103にデータパケットを送信するときには、第3層までのFECパケットをデータパケットとあわせて送信することが好ましいかもしれない。しかし、ノード106にとって十分な誤り訂正能力は、第2層までのFECパケットだけで得られるかもしれない。
すると、もし、ノード103がノード101から受信した第3層のFECパケットをノード106に転送すると、ノード106は、不必要に多くのパケットを受信することになってしまう。そこで、無駄なトラフィックを削減するためには、ノード103は、第3層のFECパケットのノード106への転送を行わないことが好ましい。図6は、例えば上記のようなFECパケットの転送の抑制を示す図である。
すなわち、図6は、FECパケットの一部を削除することで階層を浅くする例を示す図である。上記の例において、例えばノード103は、ノード101から、第1層から第3層までのFECパケットを、データパケットとともに受信する。図6の上段には、ノード101からノード103へ送信されるパケットとして、以下の(E−1)〜(E−4)が例示されている。
(E−1)データパケットD0〜D47
(E−2)第1層のFECパケットF1−1およびF1−2
(E−3)第2層のFECパケットF2−1およびF2−2
(E−4)第3層のFECパケットF3−1、F3−2、F3−3、およびF3−4
ノード103は、もし消失したデータパケットがあれば、消失した当該データパケットを適宜復元する。消失したデータパケットを復元する方法は、図5を参照して説明したとおりである。そして、ノード103は、受信または復元した各データパケットを、ノード106に転送する。
また、ノード103は、第1層から第2層までのFECパケットをノード106に転送する。しかし、ノード103は、転送先のノード106にとって不要な第3層のFECパケットは、ノード106に転送しない。よって、図6の下段には、ノード103からノード106へ送信されるパケットとして、上記の(E−1)〜(E−3)が例示されている。
もちろん、本実施形態によれば、ノード103以外のどの中継ノードも、上記と同様にして、FECパケットの一部を転送対象から削除することで、FECパケットの階層を浅くすることができる。
また、上記の例では、ノード103が受信するFECパケットの中で最下層の第3層のFECパケットのみが転送対象から削除されるが、中継ノードは、最下層を含む2階層以上のFECパケットを転送対象から削除してもよい。例えば、ノード103とノード106の間のリンクのエラーレートが非常に低ければ、ノード106にとっては第1層のFECパケットだけで十分な誤り訂正能力が得られるかもしれない。その場合、ノード103は、第3層と第2層のFECパケットをノード106に転送しないようにすることが好ましい。
以上のように本実施形態によれば、FECパケットが挿入される割合をリンクのエラーレートの違いに応じて減らすための処理は、単に、受信したFECパケットの一部の転送をしないように制御を行うことだけである。したがって、本実施形態によれば、中継ノードの処理負荷をほとんど増大させることなく、過剰なFECパケットの送信を抑制することができる。
ところで、上記の図6の例とは逆に、例えば、図3のノード101と102の間のリンクのエラーレートよりも、ノード102と104の間のエラーレートの方が高い場合に、中継ノード102は、必要に応じて、より深い階層のFECパケットを新たに追加する。例えば、「ノード102にとって十分な誤り訂正能力は、第3層までのFECパケットだけで得られるが、ノード104にとって十分な誤り訂正能力を得るには、第4層までのFECパケットが必要」という場合がある。
すると、もし、ノード102が、ノード101から受信したデータパケットと第3層までのFECパケットだけをノード104に転送したとすると、データパケットが消失したとき、ノード104はデータパケットの復元ができないかもしれない。そこで、ノード104にとって適切な誤り訂正能力が得られるようにするためには、ノード102は、新たに第4層のFECパケットを生成し、生成した第4層のFECパケットをデータパケットの途中に挿入しながらパケットの転送を行うことが好ましい。図7は、例えば上記のようなFECパケットの追加を示す図である。
すなわち、図7は、FECパケットを追加することで階層を深くする例を示す図である。上記の例において、例えばノード102は、ノード101から、第1層から第3層までのFECパケットを、データパケットとともに受信する。図7の上段には、ノード101からノード102へ送信されるパケットとして、以下の(F−1)〜(F−4)が例示されている。
(F−1)データパケットD0〜D23
(F−2)第1層のFECパケットF1−1
(F−3)第2層のFECパケットF2−1
(F−4)第3層のFECパケットF3−1およびF3−2
ノード102は、もし消失したデータパケットがあれば、消失した当該データパケットを適宜復元する。消失したデータパケットを復元する方法は、図5を参照して説明したとおりである。そして、ノード102は、受信または復元した各データパケットを、ノード104に転送する。また、ノード102は、受信した第3層までのすべてのFECパケットをノード104に転送する。
さらに、ノード102は、第4層のFECパケットを生成してノード104に送信する。よって、図7の下段には、ノード102からノード104に送信されるパケットとして、上記の(F−1)〜(F−4)と下記の(F−5)が例示されている。
(F−5)第4層のFECパケットF4−1、F4−2、F4−3、およびF4−4
具体的には、第3層のブロックB3−1は、第4層の2つのブロックB4−1とB4−2を含み、第3層のブロックB3−2は、第4層の2つのブロックB4−3とB4−4を含む。また、第3層のブロックB3−3は、第4層の2つのブロックB4−5とB4−6を含み、第3層のブロックB3−4は、第4層の2つのブロックB4−7とB4−8を含む。よって、ノード102は次の(G−1)〜(G−16)のようにしてFECパケットを追加し、階層を深くする。なお、以下の(G−1)〜(G−16)の説明における「データパケット」とは、ノード102がノード101から受信したか、またはノード102が復元したデータパケットのことである。
(G−1)ノード102は、ブロックB4−1に属するデータパケットD0〜D2をノード104に送信する。
(G−2)ノード102は、データパケットD0〜D2の排他的論理和を計算することにより、ブロックB4−1に対応する第4層のFECパケットF4−1を生成する。そして、ノード102は、FECパケットF4−1をデータパケットD2の後に挿入する。つまり、ノード102は、データパケットD2に続けてFECパケットF4−1をノード104に送信する。
(G−3)ノード102は、ブロックB4−2に属するデータパケットD3〜D5をノード104に送信する。なお、ブロックB4−2は、1つ上の第3層のブロックB3−1の中で最後のブロックなので、ブロックB4−2に対応する第4層のFECパケットは存在しない。
(G−4)ノード102は、データパケットD5の直後のFECパケットF3−1をノード104に送信する。なお、FECパケットF3−1は、ノード101からノード102へと送信されるので、FECパケットF3−1自体が消失しない限り、ノード102は、FECパケットF3−1を生成する必要はない。
(G−5)ノード102は、ブロックB4−3に属するデータパケットD6〜D8をノード104に送信する。
(G−6)ノード102は、データパケットD6〜D8の排他的論理和を計算することにより、ブロックB4−3に対応する第4層のFECパケットF4−2を生成する。そして、ノード102は、データパケットD8の後に続けてFECパケットF4−2をノード104に送信する。
(G−7)ノード102は、ブロックB4−4に属するデータパケットD9〜D11をノード104に送信する。なお、ブロックB4−4に対応する第4層のFECパケットは存在しない。
(G−8)ノード102は、データパケットD11の直後のFECパケットF2−1をノード104に送信する。なお、FECパケットF2−1は、ノード101からノード102へと送信されるので、FECパケットF2−1自体が消失しない限り、ノード102は、FECパケットF2−1を生成する必要はない。
(G−9)ノード102は、ブロックB4−5に属するデータパケットD12〜D14をノード104に送信する。
(G−10)ノード102は、データパケットD12〜D14の排他的論理和を計算することにより、ブロックB4−5に対応する第4層のFECパケットF4−3を生成する。そして、ノード102は、データパケットD14の後に続けてFECパケットF4−3をノード104に送信する。
(G−11)ノード102は、ブロックB4−6に属するデータパケットD15〜D17をノード104に送信する。なお、ブロックB4−6に対応する第4層のFECパケットは存在しない。
(G−12)ノード102は、データパケットD17の直後のFECパケットF3−2をノード104に送信する。なお、FECパケットF3−2は、ノード101からノード102へと送信されるので、FECパケットF3−2自体が消失しない限り、ノード102は、FECパケットF3−2を生成する必要はない。
(G−13)ノード102は、ブロックB4−7に属するデータパケットD18〜D20をノード104に送信する。
(G−14)ノード102は、データパケットD18〜D20の排他的論理和を計算することにより、ブロックB4−7に対応する第4層のFECパケットF4−4を生成する。そして、ノード102は、データパケットD20の後に続けてFECパケットF4−4をノード104に送信する。
(G−15)ノード102は、ブロックB4−8に属するデータパケットD21〜D23をノード104に送信する。なお、ブロックB4−8に対応する第4層のFECパケットは存在しない。
(G−16)ノード102は、データパケットD23の直後のFECパケットF1−1をノード104に送信する。なお、FECパケットF1−1は、ノード101からノード102へと送信されるので、FECパケットF1−1自体が消失しない限り、ノード102は、FECパケットF1−1を生成する必要はない。
以上の(G−1)〜(G−16)から明らかなように、第1層から第3層までのFECパケットは、FECパケット自体が消失しない限りは、ノード102が生成する必要はない。つまり、ノード102は、新たに深くした階層(すなわち図7の例では第4層)のFECパケットのみを新たに生成すればよい。
したがって、本実施形態によれば、FECパケットが挿入される割合をリンクのエラーレートの違いに応じて増やすための処理は、増やした階層のFECパケットの生成と送信だけである。つまり、中継ノードは、第1層からの全階層のFECパケットをすべて生成しなおす必要はない。
よって、本実施形態によれば、中継ノードの処理負荷の増大を抑制しつつ、FECパケットが挿入される割合をエラーレートに応じて適切に上昇させることができる。例えば、上記の図7の例におけるノード102は、第4層のFECパケットを新たに生成および送信するだけで、FECパケットが挿入される割合を、1/6(つまり、6個のデータパケットあたり1個のFECパケット)から1/3に上昇させることができる。
もちろん、本実施形態によれば、ノード102以外のどの中継ノードも、上記と同様にして、FECパケットを追加することで、FECパケット階層を深くすることができる。
また、上記の例では、ノード102が1つだけ階層を深くしているが、中継ノードは、2階層以上のFECパケットを新たに追加してもよい。例えば、ノード102とノード104の間のリンクのエラーレートが非常に高ければ、ノード104にとって十分な誤り訂正能力は、第4層までのFECパケットだけでは得られないかもしれない。その場合、ノード102は、図7には不図示の第5層のFECパケットもさらに生成し、ノード104に送信することが好ましい。
なお、その場合、第5層の各ブロックには、1つまたは2つのデータパケットが属する。つまり、同じ階層のブロック同士は、異なるブロックサイズであってもよい。
以上、図1〜7を参照して本実施形態について説明したが、上記で説明したノードは、例えば図8〜9のような構成を有する転送装置であってもよい。
図8は、転送装置のハードウェア構成図である。図8の転送装置200は、図3の各ノードとして動作する、ルータまたは汎用的なコンピュータの例である。
転送装置200は、プログラムを実行するCPU(Central Processing Unit)201と、ワークエリア用のRAM(Random Access Memory)202を備える。つまり、本実施形態の転送装置200としてのルータは、CPU201を有するコンピュータの一種でもある。
転送装置200がルータの場合には、RAM202は、ルーティングテーブルを格納していてもよい。また、転送装置200が、ALMの配信ツリーにノードとして含まれる汎用的なコンピュータの場合は、RAM202は、配信ツリーにおいて転送装置200の子ノードであるノードのアドレスを記憶していてもよい。
また、転送装置200は、ネットワーク210または不図示のケーブルを介して他の装置と通信するための通信インタフェイス203を備える。通信インタフェイス203は、有線インタフェイス、無線インタフェイス、または両者の組み合わせである。
ネットワーク210は、例えばLAN(Local Area Network)、WAN(Wide Area Network)、インターネット、またはそれらの組み合わせでもよい。例えば転送装置200が図3のノード102である場合、転送装置200は、ネットワーク210または不図示のケーブルを介して、少なくともノード101と104と105に接続されている。
転送装置200はさらに、キーボードやポインティングデバイスなどの入力装置204と、ディスプレイやスピーカなどの出力装置205を備えていてもよい。また、転送装置200は、ROM(Read Only Memory)、HDD(Hard Disk Drive)、フラッシュメモリなどの不揮発性記憶装置206を備える。
転送装置200は、さらにコンピュータ読み取り可能な記憶媒体209の駆動装置207を有していてもよい。記憶媒体209の例は、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク、磁気ディスク、半導体メモリカード等である。なお、記憶媒体209は、有形の(tangible)媒体であり、信号搬送波のような一時的な(transitory)媒体ではない。
図8の例では、CPU201、RAM202、通信インタフェイス203、入力装置204、出力装置205、不揮発性記憶装置206、および駆動装置207が互いにバス208で接続されている。しかし、図8とは異なる構成のコンピュータを転送装置200として利用する実施形態も可能である。
CPU201が実行するプログラムは、例えば、予め不揮発性記憶装置206に格納されていてもよい。または、プログラムは、プログラム提供者211から、ネットワーク210と通信インタフェイス203を介して、不揮発性記憶装置206にダウンロードされて格納されてもよい。あるいは、プログラムは記憶媒体209に格納されていてもよい。この場合、記憶媒体209が駆動装置207にセットされ、プログラムが駆動装置207を介して記憶媒体209から読み込まれて不揮発性記憶装置206にコピーされてもよい。
いずれにしろ、CPU201は、プログラムをRAM202にロードし、ロードしたプログラムを実行することができる。
図9は、転送装置の機能構成図である。図9の転送装置300は、具体的には、例えば図8に示す各種ハードウェアを備える転送装置200により実現されてもよい。また、転送装置300は、ネットワークを介して間接的に、あるいは光ファイバなどの伝送媒体を介して直接的に、送信元装置310および送信先装置320と接続されている。
例えば、送信元装置310と転送装置300と送信先装置320がルータである場合、転送装置300は、送信元装置310および送信先装置320と、光ファイバなどの伝送媒体を介して接続される。逆に、送信元装置310と転送装置300と送信先装置320が、ALMの配信ツリーにノードとして含まれる汎用的なコンピュータである場合、転送装置300は、送信元装置310および送信先装置320と、ネットワークを介して接続される。
本実施形態では、送信元装置310および送信先装置320も、図8の転送装置200と同様のハードウェアを有し、図9の転送装置300と同様の機能を有する。なお、図9には、中継ノードとして動作する転送装置300を図示してある。転送装置300が根ノードまたは葉ノードとして動作する場合については、後述する。
転送装置300は、受信部301とバッファ部302と判断部303と復元部304と取得部305と生成部306と送信部307と指示部308を有する。
受信部301は、送信元装置310からデータパケットとFECパケットを受信し、受信したパケットをバッファ部302に出力する。受信部301は、図8の通信インタフェイス203とCPU201により実現されてもよい。
また、受信部301は、受信したパケットから、パケットロスを検出するための情報(以下「検出用情報」という)を抽出し、抽出した検出用情報を判断部303に出力する。検出用情報の具体例は後述するが、例えばパケットのヘッダに含まれるシーケンス番号でもよい。さらに、受信部301は、パケットを受信したことを復元部304に通知する。
また、バッファ部302は、パケットを保持する不図示のメモリと、メモリの管理を行う不図示の制御部とを含む。パケットを保持するメモリは、例えば図8のRAM202である。制御部は、例えばCPU201により実現される。
例えば、バッファ部302内の上記制御部は、メモリの使用状況を示す情報を管理するメモリ管理テーブルをRAM202上に作成し、メモリ管理テーブルを参照しながら、メモリの割り当てや解放を行う。メモリ管理テーブルは、メモリ内のパケットの先頭アドレスを示すフィールドを有し、パケットサイズやパケット識別情報などを示すフィールドをさらに有していてもよい。パケット識別情報としては、例えば、データパケットとFECパケットを区別するための情報、データパケットにおけるシーケンス番号、FECパケットの階層を示す情報、などが利用可能である。
したがって、バッファ部302は、メモリ管理テーブルを参照することで、他の構成要素(例えば復元部304や生成部306など)から指定された階層のFECパケットがメモリのどこに格納されているかを認識することもできる。また、同様にしてバッファ部302は、他の構成要素から指定された順番のデータパケットがメモリのどこに格納されているかを認識することもできる。
例えば、バッファ部302は、復元部304から指定されたパケットの先頭アドレスを以上のようにして認識し、認識した先頭アドレスを復元部304に通知してもよい。当該通知により復元部304は、指定したパケットのデータを読み取ることができる。例えば以上のようにして、復元部304と生成部306と送信部307は、バッファ部302にアクセスすることにより、パケットを読み出したり、新たなパケットをバッファ部302上に生成したりすることができる。
判断部303は、受信部301から出力された検出用情報を用いて、パケットロスが発生したか否かを判断する。そして、判断部303は、パケットロスが発生したか否か(すなわち、消失したパケットがあるか否か)の判断結果を、復元部304と指示部308に通知する。また、パケットロスが発生した場合、判断部303は、消失したパケットを特定するためのパケット識別情報を、判断結果の一部として復元部304に通知する。判断部303は、例えばCPU201により実現される。
復元部304は、例えばCPU201により実現される。復元部304は、受信部301からの通知と判断部303からの通知に基づいて、パケットを復元する処理を行うか否かを決定する。また、消失したパケットがある場合、復元部304は、判断部303から通知されるパケット識別情報から、復元する対象のパケットを認識する。
そして、消失したパケットがある場合、復元部304は以下の処理を行う。すなわち、復元部304は、バッファ部302から復元に用いるパケットを読み出し、読み出したパケットから消失したパケットを復元し、復元したパケットをバッファ部302に出力する。復元部304によるパケットの復元は、具体的には図5を参照して説明したとおりである。
なお、或るパケットが消失した場合に、復元部304は、他のどのパケットを用いれば消失したパケットを復元することができるのかを、消失したパケットのパケット識別情報から認識することが可能である。具体的には、例えば、復元部304は、復元に用いるパケットを認識するために、図14とともに後述するブロック管理テーブル500を参照してもよい。
また、復元部304は、パケットの受信の復元の進捗を示す情報(以下「進捗情報」という)を生成部306と送信部307に通知してもよい。
例えば、図5の例で、受信部301が、データパケットD1を受信した後に、データパケットD2を受信せずに、データパケットD3を受信した場合、判断部303がデータパケットD2の消失を検出する。しかし、復元部304はデータパケットD2の復元処理を開始するのは、FECパケットF3−1が受信された後である。そこで、復元部304は、例えば「データパケットD3まで受信が完了しているが、データパケットD2は消失しており、データパケットD2の復元はまだ開始していない」といった進捗情報を出力してもよい。
取得部305は、転送装置300から送信先装置320への送信において第何階層までのFECパケットが挿入されることが望ましいかを示す情報(以下「第1の階層情報」という)を、送信先装置320から取得する。さらに、取得部305は、取得した第1の階層情報を生成部306に通知する。取得部305は、例えばCPU201と通信インタフェイス203により実現される。
例えば、転送装置300と送信先装置320の間の通信路のエラーレートに鑑みて、或る時点では、第3層までのFECパケットだけで、送信先装置320にとって適切な誤り訂正能力が得られるかもしれない。この場合、送信先装置320は、第3層を示す第1の階層情報を転送装置300に送信する。よって、取得部305は、第3層を示す第1の階層情報を取得する。
生成部306は、必要に応じて、転送装置300が送信元装置310から受信した中では最下層のFECパケットよりも、さらに深い階層のFECパケットを生成する。そして、生成部306は、生成したFECパケットをバッファ部302に出力するとともに、FECパケットを生成したことを送信部307に通知する。生成部306は、例えばCPU201により実現される。
具体的には、生成部306は、取得部305から出力される第1の階層情報から、図7のような階層を深くする処理を行うか否かを決定する。また、生成部306は、階層を深くする処理を行う場合に、復元部304から出力される進捗情報から、より深い階層のFECパケットをいつ生成するかを決定してもよい。
例えば、以下の(H−1)〜(H−3)がすべて成立する場合、生成部306は、復元部304から出力される進捗情報が(H−1)を示した後でありさえすれば、データパケットD3〜D5の受信を待つことなく、FECパケットF4−1を生成してもよい。
(H−1)図7のように、データパケットD0〜D2が消失せずに受信された。
(H−2)取得部305から通知された第1の階層情報が第4層を示している。
(H−3)送信元装置310からは第3層までのFECパケットが転送装置300に送信されており、第4層のFECパケットは送信されていない。
また、上記(H−2)〜(H−3)と下記(H−4)が成立する場合、生成部306は、復元部304から出力される進捗情報が「データパケットD2の復元が完了した」と示すようになってはじめて、FECパケットF4−1を生成することができる。
(H−4)図5のように、データパケットD0とD1は受信されたが、データパケットD2が消失した。
また、上記(H−2)〜(H−3)とは逆に、例えば下記(H−5)〜(H−6)が成立する場合、生成部306は、「新たにFECパケットを生成する必要はない」と判断する。
(H−5)取得部305から通知された第1の階層情報が第3層を示している。
(H−6)送信元装置310から転送装置300に送信されるFECパケットの最大の深さは、第3層以上である。
送信部307は、バッファ部302からパケットを読み出して送信先装置320に送信する。なお、送信部307は、復元部304と生成部306からの通知により、送信先装置320へ送信するパケットがバッファ部302中に保持されているか、それともまだ保持されていないかを認識することができる。
送信部307は、さらに、送信し終わったパケットをメモリから削除するようバッファ部302に依頼する。すると、バッファ部302は、依頼にしたがい、送信し終わったパケットを記憶していたメモリ領域を解放する。なお、送信部307は、例えばCPU201と通信インタフェイス203により実現される。
また、指示部308は、受信されたパケットの数と消失したパケットの数から、エラーレートを算出する。そして、指示部308は、送信元装置310から転送装置300への送信において、第何階層までのFECパケットが挿入されることが望ましいかを示す情報(以下「第2の階層情報」という)を、エラーレートから算出する。指示部308は、第2の階層情報を送信元装置310に送信する。
なお、具体的な算出方法は後述するが、第2の階層情報は、誤り訂正前のエラーレートと、決められた訂正性能から算出される。また、訂正性能は、例えば、誤り訂正後に許容されるエラーレートによって表されてもよい。
そして、上記のように動作する指示部308は、例えば、CPU201と通信インタフェイス203により実現される。
ところで、上記の説明は、階層そのものを示す情報が、第1と第2の階層情報として装置間で送信される場合についての例示である。例えば、第1と第2の階層情報は、「3」という数値によって「第3層」を示してもよい。
このように階層そのものを示す情報が第1と第2の階層情報として装置間で送信される場合、取得部305は、単に送信先装置320から第1の階層情報を取得すればよい。他方で、指示部308は、エラーレート(換言すればパケットの消失率)から第2の階層情報を算出する処理を行う。
しかし、もちろん実施形態によっては、階層そのものを示す情報以外の情報が、装置間で送信されてもよい(つまり、送信先装置320から取得部305に送信されてもよいし、指示部308から送信元装置310に送信されてもよい)。例えば、「2」という正の数値によって、最下層をあと2層深くすることを要求する情報が、装置間で送信されてもよい。同様に、「−1」という負の数値によって、最下層をあと1層浅くすることを要求する情報が、装置間で送信されてもよい。
このように、現在の最下層の深さとの差分が装置間で送信される場合、取得部305は、送信先装置320から取得した差分値を、送信先装置320の現在の最下層の深さと足すことで、送信先装置320の新たな最下層の深さを示す第1の階層情報を取得する。また、指示部308は、送信元装置310と転送装置300の間のエラーレートから適切な階層の深さを算出し、さらに、算出した深さから現在の転送装置300にとっての最下層の深さを引くことで、送信元装置310に送信する差分値を算出する。
あるいは、エラーレートを示す情報が、装置間で送信されてもよい。例えば、「転送装置300と送信先装置320の間のリンクのエラーレートは2%である」と示す「0.02」という数値が送信先装置320から取得部305に送信されてもよい。
このようにエラーレートを示す情報が装置間で送信される場合、上記の例とは逆に、取得部305は、送信先装置320から取得したエラーレートから、当該エラーレートに適した最下層の深さを、第1の階層情報として算出する。そして、取得部305は、算出した第1の階層情報を生成部306に通知する。また、指示部308は、層の深さについての計算を行うことなく、単に、送信元装置310と転送装置300の間のリンクについて認識したエラーレートを送信元装置310に通知すればよい。
また、上記のとおり転送装置300は、中継ノードとして動作することができるだけでなく、根ノードまたは葉ノードとしても動作することができる。
根ノードとして動作する転送装置300は、受信部301と判断部303と復元部304と指示部308を持たなくてもよい。その代わり、根ノードとして動作する転送装置300は、データパケットを生成してバッファ部302に出力する不図示のデータパケット供給部を有する。
転送装置300がルータである場合、データパケット供給部は、例えば、ルータ自身が管理するネットワーク(例えばLAN)内のコンピュータからデータパケットを受け取り、受け取ったデータパケットをバッファ部302に供給(つまり出力)する。この場合、データパケット供給部は、例えば通信インタフェイス203とCPU201により実現されてもよい。
また、転送装置300が、ALMの配信ツリーにノードとして含まれる汎用的なコンピュータである場合、データパケット供給部は、データパケットを生成し、生成したデータパケットをバッファ部302に供給(つまり出力)する。この場合、データパケット供給部は、例えばCPU201により実現されてもよいし、CPU201と入力装置204により実現されてもよい。例えば、入力装置204がカメラまたはマイクを含み、入力装置204から入力されるデータを使ってCPU201がデータパケットを生成してもよい。
そして、転送装置300が根ノードとして動作する場合、生成部306は、第1層から、取得部305から出力される第1の階層情報が示す最下層までのすべての階層のFECパケットを、バッファ部302に保持されているデータパケットを用いて生成する。
また、葉ノードとして動作する転送装置300は、取得部305と生成部306と送信部307を持たなくてもよい。さらに、葉ノードとして動作する転送装置300は、受信または復元されてバッファ部302に格納されたデータパケットに関する上位レイヤの処理を行う不図示の上位レイヤ処理部をさらに含む。例えば、上位レイヤ処理部は、CPU201により実現されてもよいし、CPU201と出力装置205により実現されてもよい。例えば、データパケットのペイロードが動画データである場合、CPU201は、ディスプレイとスピーカを含む出力装置205を制御して、出力装置205に動画の出力を行わせてもよい。なお、中継ノードとして動作する転送装置300も、上位レイヤ処理部を含んでいてもよい。
また、図9の転送装置300を実現するためのハードウェアは、図8に例示したハードウェアには限らない。例えば、判断部303、復元部304、および生成部306の一部または全部は、プログラムを実行するCPU201の代わりに、ハードウェア回路を用いて実現されてもよい。ハードウェア回路としては、例えば、FPGA(Field Programmable Gate Array)のようなリコンフィギュラブル回路も利用可能であるし、ASIC(Application Specific Integrated Circuit)も利用可能である。
本実施形態のFECパケットは、排他的論理和演算という比較的単純な演算によって定義される。したがって、FECパケットの生成処理と、FECパケットを用いたデータパケットの復元処理は、ハードウェア回路にも適している。よって、処理の高速化を図るため、例えば復元部304と生成部306は、CPU201の代わりにハードウェア回路によって実現されてもよい。
続いて、本実施形態の利点についての理解を助けるため、図10〜12を参照して、本実施形態と比較例とを比べる。
図10は、階層化されていないFECパケットを利用する比較例の図である。すなわち、図10の比較例では、特定の数のデータパケットごとに1個の割合で階層化されていないFECパケットが挿入される。FECパケットが階層化されていない場合、FECパケットが挿入される割合をエラーレートに応じて変化させるには、上記「特定の数」を変化させる必要がある。
例えば、本実施形態に関する上述の図1、2、4〜7の具体例では、第1層のブロックサイズが24であり第2層のブロックサイズが12である。そこで、図10では、比較例において上記「特定の数」が24から12に変更される場合を例示する。
ここで、図10の比較例と本実施形態との違いを説明する便宜上、例えば、次の(I−1)〜(I−3)のように仮定する。
(I−1)図3のネットワーク100内の各ノードが比較例にしたがって動作する。
(I−2)ノード103からノード106へ送信される一連のパケットでは、24個のデータパケットごとに1個の割合でFECパケットが挿入される。
(I−3)ノード106からノード110へ送信される一連のパケットでは、12個のデータパケットごとに1個の割合でFECパケットが挿入される。
仮定(I−1)〜(I−3)が意味するのは、階層化されないFECパケットがデータパケットに挿入される割合を1/24から1/12に変更する、という処理を、ノード106が行うということである。仮定(I−1)〜(I−3)のもとでデータパケットD0〜D47がノード103からノード106を介してノード110へ送信される場合を例として、より詳しく説明すると、図10の比較例では次のような処理が行われる。
ノード103からノード106への送信においては、ブロックサイズが24の非階層化ブロックBa−1に属するデータパケットD0〜D23が送信され、その後、データパケットD0〜D23から生成されるFECパケットFa−1が送信される。そして、ブロックサイズが24の非階層化ブロックBa−2に属するデータパケットD24〜D47が送信され、その後、データパケットD24〜D47から生成されるFECパケットFa−2が送信される。ここで、FECパケットFa−1とFa−2は、式(10.1)と(10.2)のように表される。
[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)
式(1.6)と(10.1)より、[F1−1]=[Fa−1]である。また、式(2.4)と(10.2)より、[F1−2]=[Fa−2]である。
また、ノード106からノード110への送信においては、ブロックサイズが12の非階層化ブロックBb−1に属するデータパケットD0〜D11が送信され、その後、データパケットD0〜D11から生成されるFECパケットFb−1が送信される。そして、ブロックサイズが12の非階層化ブロックBb−2に属するデータパケットD12〜D23が送信され、その後、データパケットD12〜D23から生成されるFECパケットFb−2が送信される。
さらに、ブロックサイズが12の非階層化ブロックBb−3に属するデータパケットD24〜D35が送信され、その後、データパケットD24〜D35から生成されるFECパケットFb−3が送信される。そして、ブロックサイズが12の非階層化ブロックBb−4に属するデータパケットD36〜D47が送信され、その後、データパケットD36〜D47から生成されるFECパケットFb−4が送信される。
ここで、FECパケットFb−1〜Fb−4は、式(10.3)〜(10.6)により表される。
[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)
式(1.7)と(10.3)より、[F2−1]=[Fb−1]である。しかし、データパケットD23の直後に挿入されるという点では共通の、本実施形態のFECパケットF1−1と、比較例のFECパケットFb−2とを比べると、式(1.6)と(10.4)のとおり、[F1−1]≠[Fb−2]である。
すなわち、仮定(I−1)〜(I−3)のもとでノード106は、新たにFECパケットFb−1を生成するだけでなく、新たにFECパケットFb−2を生成することになる。つまり、比較例におけるノード106は、ノード103から受信したFECパケットFa−1をそのまま転送する代わりに、新たにFECパケットFb−2を生成し、生成したFECパケットFb−2を送信する。
同様に、式(2.2)と(10.5)より、[F2−2]=[Fb−3]である。しかし、データパケットD47直後に挿入されるという点では共通の、本実施形態のFECパケットF1−2と、比較例のFECパケットFb−4を比べると、式(2.4)と(10.6)のとおり、[F1−2]≠[Fb−4]である。
すなわち、仮定(I−1)〜(I−3)のもとでノード106は、新たにFECパケットFb−2を生成するだけでなく、新たにFECパケットFb−4を生成することになる。つまり、比較例におけるノード106は、ノード103から受信したFECパケットFa−2をそのまま転送する代わりに、新たにFECパケットFb−4を生成し、生成したFECパケットFb−4を送信する。
したがって、FECパケットが挿入される割合を増やすために中継ノードに生じる処理負荷は、比較例の方が本実施形態よりも高い。
また、FECパケットが挿入される割合を減らすために中継ノードに生じる処理負荷も、比較例の方が本実施形態よりも高い。例えば、FECパケットが挿入される割合を1/12から1/24に減らす場合を例として理由を説明すると、次のとおりである。
式(10.1)と(10.4)より[Fa−1]≠[Fb−2]であり、式(10.2)と(10.6)より[Fa−2]≠[Fb−4]である。したがって、FECパケットが挿入される割合を1/12から1/24に減らすためには、比較例の中継ノードは、受信したFECパケットFb−2とFb−4を使うことはできず、新たにFECパケットFa−1とFa−2を生成しなくてはいけない。FECパケットの生成は、単に受信したFECパケットのうちのFECパケットFb−1とFb−3の転送をやめるのに比べて、当然処理負荷が高い。
以上説明したように、処理負荷の観点から、本実施形態は比較例よりも優れている。そして、本実施形態のこの利点は、或る中継ノードが多くの子ノードにデータパケットを転送する場合に特に顕著である。
なぜなら、複数の子ノードそれぞれとの間の各リンクのエラーレートは、一般的には、まちまちだからである。もし、比較例の中継ノードが、異なるエラーレートに合わせた割合でFECパケットを生成しようとすると、例えば「FECパケットFa−1をすべての子ノードに共通して使う」といったことができないので、子ノードの数の増大に応じて処理負荷が増大する。それに対し、本実施形態の中継ノードは、上位階層(例えば第1層)のFECパケットをすべての子ノードに共通して使うことができる。よって、本実施形態の中継ノードが生成するFECパケットの数の増加は、比較例における増加と比べて、少なくて済む。
図11は、本実施形態では階層を深くしても処理量の増加が少ないことを説明する図である。図7を参照して説明したように、本実施形態では、FECパケットの階層の最大の深さを第N層から第(N+ΔN)階層にするために中継ノードは、第(N+1)階層から第(N+ΔN)階層までのFECパケットのみを生成すればよい。
例えばN=1でΔN=1の場合、図11に示すように、本実施形態の中継ノードは、第1層のFECパケットF1−1とF1−2に関しては、受信したFECパケットF1−1とF1−2をそのまま転送すればよい。そして、中継ノードは、第2層のFECパケットF2−1とF2−2だけを新たに生成すればよい。
したがって、図10と図11を比べると、FECパケットが挿入される割合を1/24から1/12に増やすに際して、48個のデータパケットあたりに中継ノードが新たに生成するFECパケットの数は、比較例では4個、本実施形態では2個である。つまり、新たなFECパケットの生成のための処理負荷は、本実施形態では比較例の半分で済む。
さて、上記のとおり本実施形態は比較例よりも処理負荷が少ないという利点があるが、この利点は、決して誤り訂正能力とトレードオフの関係にあるわけではない。つまり、本実施形態は、比較例と比べて、誤り訂正能力を低下させることなく、処理負荷の軽減を達成することができる。
図12は、本実施形態と比較例で訂正能力に差がないことを説明する図である。具体的に、図12には、12個のデータパケットに対して1個の割合でFECパケットが挿入される場合が例示されている。また、図12において、上段は最下層が第2層である場合の本実施形態を表し、下段は比較例を表す。また、図12では、データパケットD5、D16、D28、D31、およびD44が消失したという仮定のもとで、本実施形態と比較例それぞれによる誤り訂正が図示されている。
本実施形態による中継ノードまたは葉ノード(具体的には図9の転送装置300)は、データパケットD5が消失した場合、式(12.1)によりデータパケットD5を復元することができる。
[D5]=[D0]^[D1]^[D2]^[D3]^[D4]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]^[F2-1] (12.1)
また、比較例による中継ノードまたは葉ノードも、式(12.2)によりデータパケットD5を復元することができる。
[D5]=[D0]^[D1]^[D2]^[D3]^[D4]^
[D6]^[D7]^[D8]^[D9]^[D10]^[D11]^[Fa-1] (12.2)
そして、本実施形態による中継ノードまたは葉ノードは、データパケットD16が消失した場合、復元したデータパケットD5を用いて式(12.3)によりデータパケットD16を復元することができる。また、本実施形態による中継ノードまたは葉ノードは、データパケットD5を使わずに式(12.4)によりデータパケットD16を復元することもできる。このように2通りの復元が可能なことは、図5を参照して説明したとおりである。
[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)
また、比較例による中継ノードまたは葉ノードは、式(12.5)によりデータパケットD16を復元することができる。
[D16]=[D12]^[D13]^[D14]^[D15]^[D17]^
[D18]^[D19]^[D20]^[D21]^[D22]^[D23]^[Fb-2] (12.5)
以上のように、大きさが12のブロック(つまり、本実施形態では第2層のブロック、比較例では非階層化ブロック)内の1つのデータパケットが消失した場合、本実施形態でも比較例でも、消失したデータパケットは復元可能である。
他方、大きさが12のブロック内の2つ以上のデータパケット(図12の例では、データパケットD28とD31)が消失した場合、本実施形態でも比較例でも、消失したデータパケットは復元不能である。つまり、1つのFECパケットによりカバーされる範囲で複数のデータパケットが消失すると、データパケットは復元不能である。なぜなら、本実施形態でも比較例でも、FECパケットが排他的論理和演算により生成されているからである。
また、以上のように復元不能だったデータパケットD28とD31を含むブロックの後のブロックで、さらにデータパケットD44が消失した場合も、本実施形態と比較例に誤り訂正能力の差はない。なぜなら、本実施形態による中継ノードまたは葉ノードは、式(12.6)によりデータパケットD44を復元することができ、比較例による中継ノードまたは葉ノードは、式(12.7)によりデータパケットD44を復元することができるからである。
[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)
以上例示したとおり、本実施形態によれば、誤り訂正能力の低下を招くことなく、比較例よりも処理負荷を少なくすることが可能となる。
続いて、ALMに本実施形態が利用される場合を例にして、本実施形態についてさらに詳しく説明する。なお、以下では説明の便宜上、ALMにおけるデータ配信ツリーが図3のネットワーク100のように構築されているとする。
図13は、転送装置300が記憶する配信先管理テーブルの例を示す図である。図9には1つの送信先装置320のみを図示したが、転送装置300は複数の送信先装置320にデータパケットを送信してもよい。例えば、転送装置300が図3のノード104であるとき、2つのノード107と108の各々が送信先装置320に相当する。
そこで、転送装置300は、1つまたは複数の送信先装置320を管理するため、図13のような配信先管理テーブル400を管理する。配信先管理テーブル400は、例えばRAM202上に記憶されてもよい。また、配信先管理テーブル400は、図9の転送装置300内の各部からアクセス可能である。
転送装置300がZ(Z≧1)個の送信先装置320にデータパケットを送信する場合、配信先管理テーブル400はZ個のエントリを含む。また、図13の例では、各エントリは、以下の(J−1)〜(J−5)のフィールドを含む。
(J−1)エントリを識別するための識別番号(図13では「No.」と表記)。
(J−2)送信先装置320のIP(Internet Protocol)アドレス。
(J−3)取得部305が取得した第1の階層情報が示す階層。
(J−4)(J−3)の階層のブロックサイズ。
(J−5)送信先装置320から通知された、転送装置300と送信先装置320の間のエラーレート。
例えば、図13の例では、「1」という識別番号で識別される1番目のエントリは、「195.173.1.200」というIPアドレスで識別される送信先装置320に関するエントリである。そして、1番目のエントリに対応する送信先装置320が転送装置300に通知してきたエラーレートは「0.02」(つまり2%)である。そして、1番目のエントリは、「2%というエラーレートに対して十分な誤り訂正能力を供給するには、ブロックサイズが24の第1層のブロックに対応するFECパケットだけで十分である」ということを示している。
もちろん、(J−2)のIPアドレスによって個々の送信先装置320は識別可能なので、(J−1)の識別番号フィールドは省略可能である。
また、本実施形態では、各階層のブロックサイズは、ネットワーク内の全ノード(例えば図3のノード101〜111)で共通の定数として予め決められているので、(J−4)のブロックサイズフィールドも省略可能である。図13では、本実施形態についての理解を助けるために、(J−3)の階層フィールドに示された値に対応する値が(J−4)のブロックサイズフィールドに示されている。
また、(J−5)のエラーレートフィールドも、なくてもよい。例えば、送信先装置320から取得部305が受信する情報が、階層そのものを示す値の場合、取得部305は、送信先装置320から受信した値を、送信先装置320に対応するエントリ中の(J−3)の階層フィールドに上書きするだけでよい。よって、(J−5)のエラーレートフィールドはなくてもよい。
また、送信先装置320から取得部305が受信する情報が、現在の最下層の深さとの差分を示す値の場合、取得部305は、送信先装置320から受信した差分値と、送信先装置320に対応するエントリ中の(J−3)の階層フィールドの現在の値を足す。そして、取得部305は、加算結果を(J−3)の階層フィールドに上書きする。よって、差分値が送信先装置320から送信される場合も、(J−5)のエラーレートフィールドはなくてもよい。
送信先装置320から取得部305が受信する情報が、エラーレートを示す情報である場合、取得部305は、送信先装置320から受信した情報から、エラーレートに適した階層の深さを算出する。そして、算出した値を、送信先装置320に対応するエントリ中の(J−3)の階層フィールドに上書きする。よって、エラーレートを示す情報が送信先装置320から送信される場合も、(J−5)のエラーレートフィールドは、必ずしも必要ではない。
しかし図13に示すように、配信先管理テーブル400が(J−5)のエラーレートフィールドを含んでいてもよい。その場合、取得部305は送信先装置320から通知されたエラーレートの値を(J−5)のエラーレートフィールドに上書きする。
なお、送信先装置320から取得部305への通知と、指示部308から送信元装置310への通知は、例えば、IPパケットの形で送られてもよい。よって、取得部305は、複数の送信先装置320のうちのいずれか1つから通知を受けると、通知の送信元IPアドレスから、通知を送信してきた送信先装置320に対応する配信先管理テーブル400内のエントリを特定することができる。つまり、取得部305は、IPパケット中の送信元IPアドレスから、配信先管理テーブル400のどのエントリを更新すればよいのかを認識することができる。
また、本実施形態では、ALMにおいて使われるポート番号(例えばUDP(User Datagram Protocol)のポート番号)が予め決められている。しかし、実施形態によっては、ポート番号はノードごとにまちまちであってもよい。その場合には、配信先管理テーブル400がさらにポート番号のフィールドを含む。
なお、配信先管理テーブル400は、エントリを持たない状態から、例えば以下のようにして初期化されてもよい。
ALMには様々な種類があるが、典型的には、データパケットの配信に先立つ配信ツリーの構築フェーズにおいて、親ノードに子ノードを認識させるための通信が、子ノードと親ノードの間で行われる。同様の通信は、データパケットの配信中の、配信ツリーの動的な再構築フェーズにおいても行われ得る。
つまり、配信ツリーの構築または再構築のフェーズでは、転送装置300は送信元装置310に対して、転送装置300を送信元装置310の子ノードとして登録するよう、要求する。同様に、送信先装置320は転送装置300に対して、送信先装置320を転送装置300の子ノードとして登録するよう、要求する。
例えば、取得部305が、送信先装置320から上記の要求を受け付けてもよい。すると、取得部305は、配信先管理テーブル400に新規エントリを追加し、新規エントリに新たな識別番号を割り当て、送信先装置320のIPアドレスを新規エントリのIPアドレスフィールドに設定する。また、取得部305は、階層フィールドとブロックサイズフィールドに適宜のデフォルト値を設定する。例えば、デフォルトの階層が第2層の場合、ブロックサイズのデフォルト値は第2層に対応する12である。取得部305は、エラーレートフィールドには特に値を設定しなくてよい。
以上のように、配信ツリーの構築または再構築のフェーズにおける、新たな送信先装置320からの要求を契機として、配信先管理テーブル400にはエントリが作成される。作成されたエントリの階層、ブロックサイズ、エラーレートの各フィールドの値は、実際のデータパケット配信が始まると、リンクの状態に応じて動的かつ適切に書き換えられてゆく。
図14は、転送装置300が記憶するブロック管理テーブルの例を示す図である。図9の転送装置300は、図14のようなブロック管理テーブル500を参照することにより、ブロックとFECパケットの階層構造を認識する。ブロック管理テーブル500は、例えばRAM202上に記憶されてもよい。また、ブロック管理テーブル500は、転送装置300内の各部からアクセス可能である。
ブロック管理テーブル500に含まれる各エントリは、「階層」、「ブロックの開始番号」、「ブロックの終了番号」という3つのフィールドを有する。各エントリは、1つのブロックに対応する。より正確には、FECパケットの生成対象のブロックを表すエントリのみがブロック管理テーブル500に含まれ、対応するFECパケットが定義されないブロック(例えばブロックB2−2など)を表すエントリは、ブロック管理テーブル500には存在しない。なお、図14では8個のエントリが、ブロックの終了番号の昇順にソートされている。
第1層のブロックサイズは実施形態に応じて任意に定めることができるが、本実施形態においては24である。また、本実施形態では、各ブロックが直下の階層のブロックを2つずつ含み、当該2つのブロックのブロックサイズは等しい。したがって、本実施形態では、第2層のブロックサイズは12(=24/2)であり、第3層のブロックサイズは6(=12/2)であり、第4層のブロックサイズは3(=6/2)である。
また、本実施形態では、「第5層以上の深い階層は使用しない」という前提があるものとする。そのため、ブロック管理テーブル500の8個のエントリの中での階層の最大値は4である。もし、第4層までのFECパケットでは復元不能なデータパケットがあれば、転送装置300は送信元装置310にデータパケットの再送を要求すればよい。
なお、たとえ上記の「第5層以上の深い階層は使用しない」のような前提があったとしても、現実的なエラーレートに基づいて第1層のブロックサイズが適切に定められていれば、再送要求はほとんど生じない。よって、上記の前提は、実質的には、誤り訂正能力を制限するものではまったくない。
また、以下では第1層のブロック内でのデータパケットの順序を0番から順に数えるものとする。すると、例えば図7に示したブロックの階層構造からも明らかなように、ブロック管理テーブル500には次の(K−1)〜(K−8)のエントリが含まれる。
(K−1)0番目から2番目のデータパケットが属する、第4層のブロック(図7の例では、対応してFECパケットF4−1が生成されるブロックB4−1に相当)を示すエントリ。
(K−2)0番目から5番目のデータパケットが属する、第3層のブロック(図7の例では、対応してFECパケットF3−1が生成されるブロックB3−1に相当)を示すエントリ。
(K−3)6番目から8番目のデータパケットが属する、第4層のブロック(図7の例では、対応してFECパケットF4−2が生成されるブロックB4−3に相当)を示すエントリ。
(K−4)0番目から11番目のデータパケットが属する、第2層のブロック(図7の例では、対応してFECパケットF2−1が生成されるブロックB2−1に相当)を示すエントリ。
(K−5)12番目から14番目のデータパケットが属する、第4層のブロック(図7の例では、対応してFECパケットF4−3が生成されるブロックB4−5に相当)を示すエントリ。
(K−6)12番目から17番目のデータパケットが属する、第3層のブロック(図7の例では、対応してFECパケットF3−2が生成されるブロックB3−3に相当)を示すエントリ。
(K−7)18番目から20番目のデータパケットが属する、第4層のブロック(図7の例では、対応してFECパケットF4−4が生成されるブロックB4−7に相当)を示すエントリ。
(K−8)0番目から23番目のデータパケットが属する、第1層のブロック(図7の例では、対応してFECパケットF1−1が生成されるブロックB1−1に相当)を示すエントリ。
なお、ブロック管理テーブル500は、第1層のブロックサイズと、例えば「第5層以上の深い階層は使用しない」といったような上記の前提から、静的に内容が規定される。よって、ブロック管理テーブル500は、例えばCPU201によって予め生成されてRAM202に格納されてもよい。
さて、図15は、パケットの形式を説明する図である。図1、2、4〜7、11〜12に例示したデータパケットとFECパケットそれぞれの具体例は、例えば、図15のデータパケット600とFECパケット700である。
データパケット600は、IPパケットであり、IPヘッダ601とIPペイロード602を含む。そして、IPペイロード602は、UDPパケットであり、UDPヘッダ603とUDPペイロード604を含む。また、UDPペイロード604は、RTP(Real-time Transport Protocol)パケットであり、RTPヘッダ605とRTPペイロード606を含む。
なお、RFC(Request For Comments)791に定義されているように、IPヘッダ601は、送信元IPアドレスと送信先IPアドレスのフィールドを含む。送信元IPアドレスフィールドには、データパケット600を送信する転送装置300自身のIPアドレスが設定される。また、送信先IPアドレスフィールドには、配信先管理テーブル400に記憶されている送信先装置320のIPアドレスが設定される。
また、RFC768に定義されているように、UDPヘッダ603は送信元ポートと送信先ポートのフィールドを含む。本実施形態では、送信元ポート番号と送信先ポート番号は、予め決められた固定の番号である。なお、RTPヘッダ605の詳細は、図16とともに後述する。
また、FECパケット700も、IPパケットであり、IPヘッダ701とIPペイロード702を含む。そして、IPペイロード702は、UDPパケットであり、UDPヘッダ703とUDPペイロード704を含む。また、UDPペイロード704は、RTPパケットであり、RTPヘッダ705とRTPペイロード706を含む。そして、RTPペイロード706は、FECヘッダ707とFECレベル0ヘッダ708とFECレベル0ペイロード709を含む。
なお、IPヘッダ701の送信元IPアドレスフィールドには、FECパケット700を送信する転送装置300自身のIPアドレスが設定される。また、IPヘッダ701の送信先IPアドレスフィールドには、配信先管理テーブル400に記憶されている送信先装置320のIPアドレスが設定される。そして、本実施形態では、UDPヘッダ703中の送信元ポート番号と送信先ポート番号は、予め決められた固定の番号である。
なお、RFC5109で定義されるFECパケットは、複数のレベルについてそれぞれヘッダとペイロードを含むことができる。例えば、2つのレベルが使われる場合、FECパケットは、FECヘッダの後に、FECレベル0ヘッダ、FECレベル0ペイロード、FECレベル1ヘッダ、FECレベル1ペイロードを含む。しかし本実施形態ではレベル0のみが使われるので、FECパケット700は図15に示す形式である。なお、複数のレベルが使われる変形例については後述する。
図16は、RTPヘッダの図である。図15のRTPヘッダ605と705は、図16に示すフィールドを含む。図16のRTPヘッダは、RFC3550で定義されており、具体的には以下の(L−1)〜(L−10)のフィールドを含む。
(L−1)RTPのバージョン番号を示す、2ビットの「バージョン」フィールド(図16では「V」と表記)。RFC3550のバージョン番号は2である。
(L−2)RTPパケットがパディングを含むか否かを示す、1ビットの「パディング」フィールド(図16では「P」と表記)。
(L−3)図16に示したフィールドに続けてRTPヘッダに1つ以上のフィールドを追加することによる拡張が行われるか否かを示す、1ビットの「拡張(extension)」フィールド(図16では「X」と表記)。
(L−4)後述の「貢献ソース(CSRC;Contributing SouRCe)識別子」フィールドがいくつRTPヘッダ内に含まれるかを示す、4ビットの「CSRCカウント」フィールド(図16では「CC」と表記)。なお、FECパケット700内のRTPヘッダ705では、CSRCカウントの値は0である。よって、FECパケット700のRTPヘッダ705はCSRC識別子を含まない。
(L−5)プロファイルに応じた意味を表す、1ビットの「マーカ」フィールド(図16では「M」と表記)。
(L−6)RTPペイロードの形式を示す、7ビットの「ペイロードタイプ」フィールド(図16では「PT」と表記)。RFC3551によれば、例えばMPEG(Moving Picture Expert Group)2トランスポートストリームの場合、ペイロードタイプは「MP2T」というシンボルで表され、値は33である。また、RFC5109によれば、FECパケット700内のRTPヘッダ705では、ペイロードタイプの値は127である。よって、ペイロードタイプは、データパケットとFECパケットを区別するための情報の一例である。
(L−7)16ビットの「シーケンス番号」フィールド。連続するRTPデータパケットには、1ずつインクリメントされるシーケンス番号が割り当てられる。シーケンス番号の開始番号はランダムであることが望ましいが、ランダムでなくてもよい。
(L−8)RTPペイロードの最初のオクテットがサンプリングされた時刻を示す、32ビットの「タイムスタンプ」フィールド。例えば、ペイロードタイプがMP2Tのとき、90kHzでカウントアップされるカウンタの値がタイムスタンプとして使われる。
(L−9)RTPパケットのストリームの源(例えばマイク、ビデオカメラ、ミキサなど)を識別するための、32ビットの「同期ソース(SSRC;Synchronization SouRCe)識別子」フィールド。同じ同期ソースからのRTPデータパケットには、同じSSRC識別子が割り当てられる。なお、SSRC識別子としては、所定の関数を使って得られるランダムな値が使われる。例えば図1に示す一連のデータパケットとFECパケットの同期ソース識別子はすべて等しい。
(L−10)複数のストリームが混ぜられて送信される場合に各ストリームを識別するための「貢献ソース(CSRC)識別子」フィールド。CSRC識別子フィールドの数は、CSRCカウントフィールドに設定されているとおりであり、0個から15個までである。また、個々のCSRC識別子フィールドの長さは32ビットである。
以上説明したように、図15のRTPヘッダ605と705は、図16に示した上記(L−1)〜(L−10)のフィールドを含む。例えば、図1〜2、4〜7、11〜12に例示した本実施形態のデータパケットは、具体的には、同じSSRC識別子が割り当てられ、かつ同じ一群のノード(例えば図3のノード102〜111)にマルチキャストされるRTPデータパケットであってもよい。転送装置300の判断部303は、データパケット600のRTPヘッダ605内のシーケンス番号を参照することにより、パケットロスを検出することができ、どのデータパケットが消失したかを認識することができる。
図17は、FECヘッダとFECレベル0ヘッダの図である。図15のFECヘッダ707は、図17に示すフィールドを含む。図17のFECヘッダ707は、RFC5109で定義されるFECヘッダを本実施形態において拡張したものであり、具体的には以下の(M−1)〜(M−11)のフィールドを含む。
(M−1)「Eビット」とも呼ばれる、1ビットの拡張(extension)フラグ。RFC5109では、将来の拡張に備えてEビットを0に設定するよう定義されているが、本実施形態では、RFC5109で定義されるFECヘッダを拡張するために、Eビットは1に設定される。
(M−2)「Lビット」とも呼ばれる、1ビットの「長いマスク(long-mask)」フラグ。Lビットが0のとき、FECレベル0ヘッダ708では16ビットの短いマスクが使われ、Lビットが1のとき、FECレベル0ヘッダ708では48ビットの長いマスクが使われる。本実施形態では、FECパケットに対応するブロックの大きさが16以下の場合にLビットが0に設定され、FECパケットに対応するブロックの大きさが17以上48以下の場合にLビットが1に設定される。また、本実施形態のようにRFC5109のFECパケットを拡張して利用する実施形態においては、第1層のブロックの大きさは48を超えないものとする。
(M−3)消失したデータパケット600のRTPヘッダ605のパディングフィールド(図16では「P」と表記)の値を復元するための、1ビットの「Pリカバリ」フィールド。Pリカバリフィールドの値は、当該FECパケット700と関連しているすべてのデータパケット600のパディングフィールドの値の排他的論理和である。
(M−4)消失したデータパケット600のRTPヘッダ605の拡張フィールド(図16では「X」と表記)の値を復元するための、1ビットの「Xリカバリ」フィールド。Xリカバリフィールドの値は、当該FECパケット700と関連しているすべてのデータパケット600の拡張フィールドの値の排他的論理和である。
(M−5)消失したデータパケット600のRTPヘッダ605のCSRCカウントフィールド(図16では「CC」と表記)の値を復元するための、4ビットの「CCリカバリ」フィールド。CCリカバリフィールドの値は、当該FECパケット700と関連しているすべてのデータパケット600のCSRCカウントフィールドの値の排他的論理和である。
(M−6)消失したデータパケット600のRTPヘッダ605のマーカフィールド(図16では「M」と表記)の値を復元するための、1ビットの「Mリカバリ」フィールド。Mリカバリフィールドの値は、当該FECパケット700と関連しているすべてのデータパケット600のマーカフィールドの値の排他的論理和である。
(M−7)消失したデータパケット600のRTPヘッダ605のペイロードタイプフィールド(図16では「PT」と表記)の値を復元するための、7ビットの「PTリカバリ」フィールド。PTリカバリフィールドの値は、当該FECパケット700と関連しているすべてのデータパケット600のペイロードタイプフィールドの値の排他的論理和である。
(M−8)当該FECパケット700と関連しているすべてのデータパケット600のRTPヘッダ605のシーケンス番号のうちで最小の値を示す、16ビットの「SNベース」フィールド。例えば、シーケンス番号が500番から523番までの24個のデータパケット600と関連しているFECパケット700のSNベースフィールドの値は、500である。
(M−9)消失したデータパケット600のRTPヘッダ605のタイムスタンプフィールドの値を復元するための、32ビットの「TSリカバリ」フィールド。TSリカバリフィールドの値は、当該FECパケット700と関連しているすべてのデータパケット600のタイムスタンプの値の排他的論理和である。
(M−10)復元したデータパケット600の長さを決定するため、16ビットの「長さリカバリ」フィールド。長さリカバリフィールドは、当該FECパケット700と関連しているすべてのデータパケット600の長さの和をバイト単位で数えた値である。具体的には、数える対象の長さとは、RTPペイロード606と、CSRC識別子のリストと、RTPヘッダ605に続く拡張の部分(RTPパケットが拡張されている場合)と、パディング(RTPパケットがパディングを含む場合)の合計の長さである。
(M−11)FECパケットの階層を示す、8ビットの「階層」フィールド。階層フィールドは、本実施形態による拡張によって加えられるフィールドであり、RFC5109で定義されているフィールドではない。
なお、階層フィールドの長さは、実施形態によっては8ビットより短くてもよいし、8ビットより長くてもよい。しかし、FECヘッダ707の長さが8ビットの倍数となるように階層フィールドの長さを定義すると、半端なビットがなくて処理が容易になるので、本実施形態では階層フィールドの長さは8ビットである。
また、階層の数の2進表記そのものが階層フィールドに設定される実施形態では255(=28−1)階層までを表すことが可能である。しかし、「最も深い階層が、第8階層またはそれより浅い階層である」と予め決められている実施形態においては、階層フィールドは、8ビットのうちの階層を示す1ビットのみが1に設定される、という形式であってもよい。
例えば、階層フィールドのMSBを「0ビット目」と呼ぶことにすると、階層フィールドは、(i−1)ビット目のみが1のときに第i階層を示す(1≦i≦8)。もちろん実施形態によっては、階層フィールドのLSB(Least Significant Bit)を「0ビット目」と呼ぶことにしてもよい。
上記に例示したいずれの形式でも、階層フィールドがFECパケットの階層を示すことに変わりはない。例えば、FECパケットF2−1のFECヘッダ707内の階層フィールドは第2層を示す値に設定される。
続いて、図17のFECレベル0ヘッダ708について説明する。FECレベル0ヘッダ708は、RFC5109で定義されているとおり、以下の(N−1)と(N−2)のフィールドを含む。
(N−1)RTPパケットのうち、レベル0でFECにより保護する対象となる(つまり、排他的論理和の演算の対象である)部分の長さを示す、16ビットの「保護長さ(protection length)」フィールド。本実施形態では、レベル0のみが使われるので、保護長さフィールドには、当該FECパケット700と関連しているすべてのデータパケット600のうちで、排他的論理和の演算の対象となる部分の最長の長さが設定される。
(N−2)どのデータパケット600がレベル0において当該FECパケット700と関連しているのかを示すマスクフィールド。マスクフィールドの長さは、FECヘッダ707においてLビットが0のときは16ビットであり、Lビットが1のときは48ビットである。ここで、説明の便宜上、FECヘッダ707のSNベースフィールドの値をSNとする。すると、RTPヘッダ605中のシーケンス番号が(SN+i)のデータパケット600が当該FECパケット700に関連している場合にのみ、マスクフィールドのiビット目が1に設定される。なお、マスクフィールドのMSBがi=0の場合に対応する。
なお、図14のブロック管理テーブル500に示したように、最下層以外の階層がみな同じ個数(例えば2個)のブロックに分割され、同じ階層のブロックの大きさが等しい場合は、階層から一意にブロックサイズが決まる。例えば、第3層の4つのブロックB3−1〜B3−4の大きさはいずれも6(=24/2(3−1))である。このように階層から一意にブロックサイズが決まる場合、転送装置300内の各部は、どのデータパケット600がFECパケット700と関連しているのかを、FECヘッダ707内のSNベースフィールドと階層フィールドそれぞれの値から認識してもよい。
例えば、SNベースフィールドの値が500であり、階層フィールドが第3層を示している場合、FECパケット700と関連するのは、シーケンス番号が500から505までの6個のデータパケット600である。以上のように、均等にブロックが分割される場合、転送装置300内の各部は、FECレベル0ヘッダ708のマスクフィールドを用いなくても、どのデータパケット600がFECパケット700と関連しているのかを認識することができる。
つまり、FECパケットと関連しているデータパケットを識別するための情報として、SNベースと階層のフィールドが使われてもよく、SNベースとマスクのフィールドが使われてもよく、SNベースと階層とマスクのフィールドが使われてもよい。
さて、続いて転送装置300の動作について説明する。上記のとおり、転送装置300は、根ノードとして動作することもでき、中継ノードとして動作することもでき、葉ノードとして動作することもできる。説明の便宜上、まず図18〜19を参照して、転送装置300が根ノードとして動作する場合について説明する。その後、転送装置300が中継ノードとして動作する場合と葉ノードとして動作する場合に関して、図20〜21を参照して共通点について説明し、図22〜23を参照して相違点について説明する。なお、図20〜23に関する説明においては、図24〜25のタイミングチャートを適宜参照する。
図18〜19は、根ノードの動作フローチャートである。例えば図3の根ノード101または121として動作する転送装置300は、図18〜19のフローチャートの処理を行う。
なお、根ノードとして動作する転送装置300は、上述のように不図示のデータパケット供給部を有する。例えば、データパケット供給部は、MPEG2データを生成する。そして、データパケット供給部は、RTPヘッダ605を生成し、生成したMPEG2データをRTPペイロード606に格納することにより、RTPパケット(つまりUDPペイロード604)を生成する。なお、RTPヘッダ605の生成処理は、新たなシーケンス番号を発行することを含む。
また、データパケット供給部は、生成したRTPパケットをバッファ部302に出力する。データパケット供給部は、例えば、転送装置300に接続されたマイクおよびビデオカメラ(または、図8の入力装置204により実現される、転送装置300に内蔵のマイクおよびビデオカメラ)、ならびにCPU201により実現されてもよい。
データパケット供給部は、図18の処理を開始するように生成部306に命令する。また、データパケット供給部は、0番目に生成したRTPパケットのシーケンス番号を生成部306に通知する。
例えば、データパケット供給部は、0番目に生成したRTPパケットをバッファ部302に出力したときに、生成部306に対して上記命令と通知を行ってもよい。そして、データパケット供給部は、続いて1番目以降のRTPパケットを順次生成し、生成した各RTPパケットのシーケンス番号を、RTPパケットの生成のたびに生成部306に通知してもよい。あるいは、データパケット供給部は、いくつかのRTPパケットを生成してバッファ部302に蓄積してから、上記命令と通知をまとめて行ってもよい。生成部306は、例えば、上記命令と通知を契機として図18の処理を開始する。
ステップS101で、生成部306は、図13の配信先管理テーブル400の階層フィールドを参照して、配信先管理テーブル400に登録されているZ個の送信先装置320それぞれの階層のうちで、最も深い階層maxNを認識する。
続いて、ステップS102で生成部306は、階層を示すインデックスnを1に初期化する。
そして、次のステップS103で生成部306は、第n層のFECパケット700用の記憶領域を確保するようバッファ部302に要求し、バッファ部302は要求された記憶領域を確保する。なお、バッファ部302内の不図示の制御部は、確保した記憶領域の先頭アドレスを、第n層という階層と対応づけて管理する。
また、例えば、データパケット供給部が固定長のRTPペイロード606を生成する場合、バッファ部302が確保する記憶領域の大きさは、上記固定長にFECパケット700内の各種ヘッダの長さを足した長さでよい。あるいは、データパケット供給部が生成するRTPペイロード606の最大長さが予め決められている場合、バッファ部302が確保する記憶領域の大きさは、上記最大長さにFECパケット700内の各種ヘッダの長さを足した長さでよい。
そして、次のステップS104で生成部306は、n<maxNか否かを判断する。もしn<maxNならば処理はステップS105に移行し、n≧maxNならば処理はステップS106に移行する。
ステップS105で生成部306は、インデックスnを1だけインクリメントする。そして、処理はステップS103に戻る。
以上のステップS101〜S105は、第1層から第maxN層までのFECパケット700用の記憶領域を確保するための前処理である。前処理の後、ステップS106〜S121において、第1層のブロック内の各データパケットについての繰り返し処理が行われ、最後にステップS122〜S125の後処理が行われる。
さて、ステップS106で生成部306は、第1層のブロック内でのデータパケット600の順序を示すインデックスdを0に初期化する。
そして、次のステップS107で生成部306は、階層を示すインデックスnを再度1に初期化する。
続いて、次のステップS108で生成部306は、図14のブロック管理テーブル500を参照して、インデックスdが第n層のいずれかのブロックの開始番号であるか否かを判断する。もし、インデックスdが第n層のいずれかのブロックの開始番号であれば、処理はステップS109に移行する。逆に、インデックスdが第n層のどのブロックの開始番号でもなければ、処理はステップS110に移行する。
例えば、d=0かつn=1の場合、生成部306は、ブロック管理テーブル500を検索し、検索の結果、最後のエントリを見つけて、インデックス0が第1層のブロックの開始番号であることを認識する。よって、d=0かつn=1の場合、処理はステップS109に移行する。
ステップS109で生成部306は、d番目のデータパケット600をバッファ部302から読み出す。そして、生成部306は、第n層のFECパケット700用の記憶領域に、読み出したd番目のデータパケット600のデータをコピーする。
例えば、生成部306は、図18の処理の契機としてデータパケット供給部から通知された、0番目のRTPパケットのシーケンス番号を「ベース番号」として保持していてもよい。すると、生成部306は、ベース番号とインデックスdを足すことで、d番目のデータパケットのシーケンス番号を得ることができる。
よって、生成部306は、「データパケット」というパケットタイプと、d番目のデータパケットのシーケンス番号とのペアを、バッファ部302に指定することで、バッファ部302からd番目のデータパケットを読み出すことができる。また、生成部306は、層の深さnをバッファ部302に通知することで、コピー先のFECパケット700用の記憶領域の先頭アドレスをバッファ部302に指定することもできる。
なお、バッファ部302に対してパケットを指定するための方法は、実施形態に応じて異なっていてよく、上記の方法は一例に過ぎない。
なお、本実施形態では、より具体的には、生成部306はステップS109で以下のような処理を行う。
生成部306は、第n層のFECパケット700のRTPヘッダ705を設定する。例えば、生成部306は、ペイロードタイプフィールドに決められた定数を設定し、FECパケット700用にシーケンス番号を発行するなどの処理を行う。FECパケット700用のRTPヘッダ705の設定に関しては公知なので詳しい説明を省略する。
また、生成部306は、第n層のFECパケット700のFECヘッダ707を初期化する。例えば、生成部306は、第n層のFECパケット700のFECヘッダ707中の各リカバリフィールドに、d番目のデータパケット600のRTPヘッダ605中の対応するフィールドの値をコピーする。
また、生成部306は、FECヘッダ707のEビットを1に設定してFECヘッダ707を拡張し、FECヘッダ707の階層フィールドに、第n層を示す値を設定する。さらに、生成部306は、FECヘッダ707のSNベースフィールドに、d番目のデータパケット600のシーケンス番号をコピーする。また、生成部306は、ステップS108の検索で見つけたブロック管理テーブル500のエントリのブロック開始番号とブロック終了番号から、生成対象のFECパケット700に対応するブロックの大きさを計算し、計算した大きさに応じてFECヘッダ707のLビットを適宜設定する。
さらに、生成部306は、第n層のFECパケット700のFECレベル0ヘッダ708を初期化する。例えば、データパケット供給部が固定長のRTPペイロード606を生成する場合は、生成部306は、FECレベル0ヘッダ708の保護長さに所定の定数を設定する。また、生成部306は、マスクフィールドの全ビットを0に初期化した後、d番目のデータパケット600に対応するビット(ステップS109では0ビット目)を1に設定する。
そして、生成部306は、d番目のデータパケット600のRTPペイロード606を、第n層のFECパケット700のFECレベル0ペイロード709にコピーする。
以上のようにして、ステップS109では、第n層のFECパケット700用の記憶領域に、d番目のデータパケット600のデータがコピーされる。
また、ステップS110で生成部306は、d番目のデータパケット600をバッファ部302から読み出す。そして、生成部306は、第n層のFECパケット700用の記憶領域に現在記憶されているデータと、読み出したd番目のデータパケット600のデータとの排他的論理和を計算する。さらに、生成部306は、計算した排他的論理和を、第n層のFECパケット700用の記憶領域に上書きする。より具体的には、生成部306は、以下の上書き処理を行う。
生成部306は、第n層のFECパケット700のFECヘッダ707中の各リカバリフィールドに、現在の値と、d番目のデータパケット600のRTPヘッダ605中の対応するフィールドの値との排他的論理和を上書きする。そして、生成部306は、第n層のFECパケット700のFECレベル0ペイロード709に、現在の値と、d番目のデータパケット600のRTPペイロード606との排他的論理和を上書きする。また、生成部306は、第n層のFECパケット700のFECレベル0ヘッダ708のマスクフィールドにおいてd番目のデータパケット600に対応するビットを1に設定する。
そして、ステップS109またはS110の処理の後、生成部306は、ステップS111で、n<maxNか否かを判断する。もしn<maxNならば処理はステップS112に移行し、n≧maxNならば処理は図19のステップS113に移行する。
ステップS112で生成部306はインデックスnを1だけインクリメントする。そして、処理はステップS108に戻る。以上のステップS107〜S112により、生成部306は、第1層から第maxN層までのFECパケット700のそれぞれに、d番目のデータパケット600の内容を反映する。
そして、図19のステップS113で生成部306は、d番目のデータパケットを送信するよう送信部307に要求する。要求を受けた送信部307は、ステップS113で、配信先管理テーブル400の各エントリを順に処理するためのインデックスkを1に初期化する。
続いて、ステップS114で送信部307は、配信先管理テーブル400のk番目のエントリに対応する送信先装置320にd番目のデータパケット600を送信する。
より詳しくは、ステップS114で送信部307は、配信先管理テーブル400のk番目のエントリからIPアドレスを読み取り、読み取ったIPアドレスを用いてデータパケット600のIPヘッダ601を生成する。また、送信部307は、UDPヘッダ603も生成する。そして、送信部307は、IPヘッダ601とUDPヘッダ603を付加したRTPパケットであるデータパケット600を、k番目の送信先装置320に送信する。
そして、次のステップS115で送信部307は、配信先管理テーブル400のk番目のエントリにおける階層フィールドの値Nk(すなわち、k番目の送信先装置320の層の深さ)を読み取る。
また、次のステップS116で送信部307は、ブロック管理テーブル500を参照して、インデックスdが第Nk層またはそれより浅い層のいずれかのブロックの終了番号か否かを判断する。そして、もしインデックスdが第Nk層またはそれより浅い層のいずれかのブロックの終了番号であれば、送信部307は、インデックスdがどの階層のブロックの終了番号なのかを記憶し、処理はステップS117に移行する。逆に、インデックスdが第Nk層またはそれより浅い層のどのブロックの終了番号でもなければ、処理はステップS118に移行する。
例えば、k=2とすると、図13の配信先管理テーブル400のk番目のエントリの階層フィールドの値は2なので、Nk=2である。よって、送信部307は、インデックスdが第2層または第1層のいずれかのブロックの終了番号なのか否かを判断する。
さて、ステップS117で送信部307は、ステップS116で記憶した階層のFECパケット700用の記憶領域に記憶されているデータ(すなわち、終了番号がdのブロックに対応するFECパケット700のデータ)を読み出す。そして、送信部307は、読み出したFECパケットをk番目の送信先装置320に送信する。
より詳しくは、ステップS117で送信部307は、配信先管理テーブル400のk番目のエントリからIPアドレスを読み取り、読み取ったIPアドレスを用いてFECパケット700のIPヘッダ701を生成する。また、送信部307は、UDPヘッダ703も生成する。そして、送信部307は、IPヘッダ701とUDPヘッダ703を付加したRTPパケットであるFECパケット700を、k番目の送信先装置320に送信する。FECパケット700の送信後、処理はステップS118に移行する。
ステップS118で送信部307は、インデックスkが送信先装置320の数(すなわち配信先管理テーブル400のエントリ数Z)未満か否かを判断する。もし、インデックスkが送信先装置320の数Z未満であれば、処理はステップS119に移行する。逆に、インデックスkが送信先装置320の数Zに達していれば、送信部307は生成部306に送信終了を通知し、処理はステップS120に移行する。
ステップS119で送信部307は、インデックスkを1だけインクリメントする。そして処理はステップS114に戻る。
また、ステップS120で生成部306は、インデックスdが第1層のブロックの終了番号未満であるか否かを判断する。第1層のブロックの終了番号は、第1層のブロックサイズが固定であれば、生成部306を実現するCPU201が実行するプログラムに定数として定義されていてもよい。あるいは、生成部306は、図14のようにソートされたブロック管理テーブル500の最後のエントリ(すなわち第1層のブロックを示すエントリ)におけるブロックの終了番号フィールドの値を読み取ってもよい。
そして、インデックスdが第1層のブロックの終了番号未満の場合、処理はステップS121に移行する。逆に、インデックスdが第1層のブロックの終了番号に達している場合、処理はステップS122に移行する。
ステップS121で生成部306は、インデックスdを1だけインクリメントする。そして、処理は図18のステップS107に戻る。
また、ステップS122で生成部306は、階層を示すインデックスnを再度1に初期化する。
次のステップS123で生成部306は、第n層のFECパケット700用の記憶領域を解放するようバッファ部302に要求し、バッファ部302は要求にしたがって記憶領域を解放する。
そして、次のステップS124で生成部306は、n<maxNか否かを判断する。もしn<maxNならば処理はステップS125に移行し、n≧maxNならば生成部306は、現在の第1層のブロックに関する図18〜19の一連の処理を終了する。
また、ステップS125で生成部306は、インデックスnを1だけインクリメントする。そして、処理はステップS123に戻る。以上のステップS122〜S125により、ステップS102〜S105で確保された記憶領域が解放される。
なお、上記の図18〜19に示した例では、第1層の1つのブロック(例えば図2のブロックB1−1)の最後で一旦処理が終了する。しかし、図2に示すように、データパケット供給部は、第1層の複数のブロックに相当する多数のRTPペイロード606を生成することがある。
そこで、データパケット供給部は、第1層のブロックに対応する個数のRTPパケットを生成するたびに、生成部306に対して、図18〜19の処理を開始するよう命令してもよい。例えば、図2の場合は、データパケット供給部は、データパケットD0に対応するRTPパケットを生成したときと、データパケットD24に対応するRTPパケットを生成したときに、それぞれ、図18〜19の処理を開始するよう生成部306に命令してもよい。
あるいは、データパケット供給部は、データパケットD0に対応するRTPパケットを生成したときにだけ、生成部306に処理を開始するよう命令してもよい。この場合、図18〜19の処理は次のように変形されてもよい。具体的には、ステップS120でインデックスdが第1層のブロックの終了番号に達していたら、生成部306は、ステップS122以降の処理を行う代わりに、再度ステップS106以下の処理を行う。
そして、データパケット供給部は、ストリームの最後のデータパケットに対応するRTPパケットを生成したときに、生成部306に対して、処理を終了するように命令してもよい。なお、処理の終了を生成部306に命令する際、データパケット供給部は、最後のRTPパケットのシーケンス番号を生成部306に通知してもよい。すると、終了の命令を受けた生成部306は、最後のRTPパケットまで処理し終わってから、ステップS122〜S125の処理を行う。
続いて、図20〜23のフローチャートを参照して、中継ノードと葉ノードの動作について説明する。なお、図20〜21は、中継ノードと葉ノードに共通の動作を示し、図22は、中継ノードに特有の動作を示し、図23は、葉ノードに特有の動作を示す。
また、中継ノードと葉ノードの動作の説明においては、図24と図25のタイミングチャートも適宜参照する。図24と図25は、それぞれ、第1のケースと第2のケースのタイミングチャートである。
なお、図20〜23の説明においては、転送装置300にとっての最下層を「第N層」と表記する(1≦N)。図24と図25の例では、N=3である。
本実施形態では、送信元装置310も図13の配信先管理テーブル400と同様の形式の配信先管理テーブル(不図示)を保持する。そして、送信元装置310の配信先管理テーブル内の或るエントリには、転送装置300のIPアドレスと、「第N層」という階層が記録されている。よって、送信元装置310から転送装置300へは、第1層〜第N層のFECパケットが送信される。
さて、図24の第1のケースは、図5と同じく、ブロックB1−1内のデータパケットD2、D8およびD19が消失した場合を示す。図24では、ブロックB1−1に属する24個のデータパケットと、ブロックB1−1またはそのサブセットであるいずれかのブロックに対応して生成される4個のFECパケットについて、それぞれ「受信・格納」または「消失」と示されている。
図24における「受信・格納」は、パケットが正常に受信部301により受信されてバッファ部302に格納されたことを示し、「消失」は、パケットが消失したため受信部301により受信されなかったことを示す。また、図24における吹き出しは、パケットの受信を契機として転送装置300が行う処理を強調して示す。
なお、図24における「総パケットカウンタ」と「消失パケットカウンタ」は、詳しくは後述するが、転送装置300内のカウンタであり、判断部303と指示部308からアクセス可能である。図24では、データパケットD0の受信の直前の2つのカウンタの値がそれぞれTとLであったと仮定して、2つのカウンタの値の変遷を示している。
また、図25の第2のケースは、データパケットD2とFECパケットF2−1とデータパケットD15とFECパケットF3−2とデータパケットD19が消失した場合を示す。図25の形式は図24と同様である。詳しくは後述するが、第2のケースでは、消失したデータパケットD15が属するブロックB3−3に対応するFECパケットF3−2自体も消失しているので、データパケットD15が復元不能であり、転送装置300はデータパケットD15の再送を送信元装置310に要求する。
なお、以下では説明の簡略化のため、以下の(O−1)と(O−2)を仮定する。
(O−1)転送装置300内の各部は、送信元装置310から送信されるデータパケットのうち、第1層の最初のブロック内の0番目のデータパケット(つまりストリームの先頭のデータパケット)のシーケンス番号を予め認識している。
(O−2)転送装置300内の各部は、第1層のブロックサイズを予め認識している。
上記(O−1)の仮定を成立させるために、例えば、ストリームの先頭のデータパケットのシーケンス番号を通知するための制御パケットを、送信元装置310が事前に転送装置300に送信してもよい。すると、ストリームの先頭のデータパケットのシーケンス番号を、転送装置300内の各部が予め認識することができる。なお、制御パケットを使わなくても、図20の処理を変形することでこの仮定(O−1)を成立させることができるが、そのような変形については後述する。
また、上記(O−2)の仮定も、例えば、第1層のブロックサイズが定数として固定的に予め決められていれば、成立する。あるいは、第1層のブロックサイズを通知するための制御パケットを、送信元装置310が事前に転送装置300に送信することにより、転送装置300内の各部が第1層のブロックサイズを認識してもよい。
上記の仮定(O−1)と(O−2)によれば、転送装置300内の各部は、以下の式(20.1)により、受信したデータパケットの第1層のブロック内での順序を示す番号を認識することができる。
seqB=(seq-seq0) mod bSize (20.1)
なお、式(20.1)において、“seq”は、転送装置300が受信したデータパケットのシーケンス番号であり、“seq0”は、ストリームの先頭のデータパケットシーケンス番号である。また、“bSize”は、第1層のブロックサイズであり、“seqB”は、転送装置300が受信したデータパケットの第1層のブロック内での番号である。そして、“mod”は剰余演算子である。なお、図14のブロック管理テーブル500における番号は、式(20.1)に示した、第1層のブロック内での順序を示す番号seqBにより表されている。
さて、図20の処理は、受信部301による送信元装置310からのパケットの受信を契機として開始される。以下では、図20の処理の開始の契機となった受信を「今回の受信」ともいう。
まずステップS201で、受信部301は今回受信したパケットをバッファ部302に出力し、バッファ部302はパケットを格納する。また、ステップS201で受信部301は、少なくとも、受信したパケットのRTPヘッダのペイロードタイプとシーケンス番号を抽出し、抽出したペイロードタイプとシーケンス番号を、判断部303に通知する。さらに、受信部301は、復元部304に対し、パケットの受信を通知する。
すると、ステップS202で判断部303は、今回受信されたパケットのタイプがデータパケットであるかFECパケットであるかを、受信部301から通知されたペイロードタイプの値から判断する。図16に関して説明したとおり、FECパケット700のRTPヘッダ705では、ペイロードタイプの値は127という特定の値なので、判断部303はペイロードタイプの値からステップS202の判断を行うことができる。
そして、今回受信されたパケットがデータパケットの場合、処理は図21のステップS203に移行する。逆に、今回受信されたパケットがFECパケットの場合、処理はステップS214に移行する。
図20のステップS203の処理が実行されるのは、次の(P−1)〜(P−4)の場合のいずれかである。
(P−1)次に受信されるはずのパケットはデータパケットであり、かつ、次に受信されるはずのデータパケットが、正常にステップS201で受信部301に受信された場合。例えば、図24において、転送装置300がデータパケットD0を受信した時点における「次に受信されるはずのデータパケット」は、データパケットD1である。よって、データパケットD1が受信されたときは、この(P−1)の場合に該当する。
(P−2)次に受信されるはずのパケットはデータパケットであるが、次に受信されるはずのデータパケットが消失してしまい、次に受信されるはずのデータパケットよりも後の別のデータパケットが、ステップS201で受信部301に受信された場合。例えば、図24において、転送装置300がデータパケットD1を受信した時点における「次に受信されるはずのデータパケット」はデータパケットD2であるが、データパケットD2は消失し、次に実際に受信されるのはデータパケットD3である。よって、図24でデータパケットD3が受信されたときは、この(P−2)の場合に該当する。
(P−3)次に受信されるはずのパケットはFECパケットであるが、次に受信されるはずのFECパケットが消失してしまい、次に受信されるはずのFECパケットよりも後のデータパケットが、ステップS201で受信部301に受信された場合。例えば、図25において、転送装置300がデータパケットD11を受信した時点における「次に受信されるはずのFECパケット」はFECパケットF2−1であるが、FECパケットF2−1は消失し、次に実際に受信されるのはデータパケットD12である。また、図25において、転送装置300がデータパケットD17を受信した時点における「次に受信されるはずのFECパケット」はFECパケットF3−2であるが、FECパケットF3−2は消失し、次に実際に受信されるのはデータパケットD18である。よって、図25でデータパケットD12が受信されたときと、データパケットD18が受信されたときは、この(P−3)の場合に該当する。
(P−4)過去に復元不能だったために送信元装置310に再送を要求したデータパケットが、ステップS201で受信部301に受信された場合。例えば、図25においては、消失し、しかも復元不能だったデータパケットD15の再送が要求される。送信元装置310から再送されたデータパケットD15が、データパケットD18の受信の後に受信された場合が、この(P−4)の場合に該当する。なお、この(P−4)の場合は、次に受信されるはずのパケットのタイプによらず、生じ得る。
以上のように、ステップS201で受信されたパケットがデータパケットの場合としては、(P−1)〜(P−4)の4通りの場合があり得る。そこで、ステップS203で判断部303は、今回の受信が(P−3)に該当するか否かを判断する。判断のための処理の詳細は、例えば以下のとおりである。
判断部303は、受信部301が前回パケットを受信したときに受信部301が判断部303に通知したシーケンス番号とペイロードタイプを、「前回のシーケンス番号」と「前回のペイロードタイプ」として保持する。そして、ステップS203において、前回のペイロードタイプがFECパケットを示していれば、判断部303は、「今回のステップS201の受信は(P−3)に該当しない」と判断し、処理はステップS204に移行する。なぜなら、本実施形態ではFECパケットは連続しないからである。
他方、前回のペイロードタイプがデータパケットを示す場合、判断部303は、式(20.1)にしたがい、前回のシーケンス番号に対応する、第1層のブロック内での順序を示す番号を計算する。つまり、判断部303は、前回のシーケンス番号をseqに代入して、式(20.1)のseqBを計算する。そして、判断部303は、計算した番号seqBが、図14のブロック管理テーブル500のいずれかのエントリにおけるブロックの終了番号と一致するか否かを判断する。
そして、もしブロックの終了番号が番号seqBと一致するエントリがブロック管理テーブル500の中に見つかれば、判断部303は、「今回の受信は(P−3)に該当する」と判断する。すなわち、判断部303は、ステップS203において、FECパケットの消失を新たに検出する。そして、処理はステップS206に移行する。
例えば、図25の例で、データパケットD12が受信された時点では、前回のシーケンス番号はデータパケットD11のシーケンス番号である。よって、seqB=11である。また、図14のブロック管理テーブル500は、ブロックの終了番号が11のエントリを有する。したがって、判断部303はステップS203においてFECパケットF2−1の消失を新たに検出し、「今回の受信は(P−3)に該当する」と判断する。
なお、判断部303は、上記のようにしてFECパケットの消失を新たに検出した場合、消失したFECパケットの階層(すなわちブロック管理テーブル500内で見つかったエントリにおける階層)を内部的に記憶してもよい。例えば、上記のようにFECパケットF2−1の消失を検出した場合、判断部303は、第2層のFECパケットの消失を検出したことを内部的に記憶してもよい。
逆に、もしブロックの終了番号が番号seqBと一致するエントリがブロック管理テーブル500の中に存在しなければ、判断部303は、「今回の受信は(P−1)、(P−2)または(P−4)に該当する」と判断する。そして、処理はステップS203からステップS204へと移行する。
ステップS204が実行されるのは、今回の受信が(P−1)、(P−2)または(P−4)に該当する場合である。そこで、ステップS204において判断部303は、今回の受信が(P−4)に該当するか否かを判断する。
例えば、転送装置300は、転送装置300内の各部から参照可能なリスト(以下「再送要求リスト」という)を、例えばRAM202上に保持していてもよい。そして、再送要求リストの個々の要素は、転送装置300が送信元装置310に再送を要求したデータパケットのシーケンス番号であってもよい。再送要求リストへの要素の追加は後述のステップS210またはS219で行われる。判断部303は、再送要求リストを参照することで、今回の受信が(P−4)に該当するか否かを判断することができる。
もし、ステップS201で受信部301から通知されたシーケンス番号が再送要求リストに含まれていれば、判断部303は、「今回の受信は(P−4)に該当する」と判断し、ステップS201で受信部301から通知されたシーケンス番号を再送要求リストから削除する。そして、処理はステップS212に移行する。
例えば、図25において、データパケットD15が受信されたとき、再送要求リストにデータパケットD15のシーケンス番号が含まれている。よって、ステップS204で判断部303は「今回の受信は(P−4)に該当する」と判断する。
逆に、ステップS201で受信部301から通知されたシーケンス番号が再送要求リストに含まれていなければ、判断部303は、「今回の受信は(P−1)または(P−2)に該当する」と判断する。そして、処理はステップS205に移行する。
ステップS205は、上記のとおり今回の受信が(P−1)または(P−2)に該当する場合に実行される。本実施形態では、「今回の受信が(P−1)と(P−2)のどちらに該当するのか」という判断は、後にFECパケットが受信されるか、またはFECパケットの消失が検出されるまで、延期される。よって、ステップS205では、判断部303が、総パケットカウンタの値を1だけインクリメントする。そして、今回の受信を契機とした処理は終了する。
なお、総パケットカウンタは、本来転送装置300が受信するはずのパケットの数を数えるためのカウンタである。また、消失パケットカウンタは、消失したパケットの数を数えるためのカウンタである。2つのカウンタの初期値は0である。また、2つのカウンタは、第1層の複数のブロックをまたいでカウントアップされる。すなわち、2つのカウンタは、第1層のブロックごとにクリアされるわけではない。
上記のとおり、「今回の受信が(P−1)と(P−2)のどちらに該当するのか」という判断は延期されるので、ステップS205では消失パケットカウンタの値は変化しない。他方で、今回1個のデータパケットが受信されたので、判断部303は総パケットカウンタを1だけインクリメントする。
例えば、図24と図25のいずれでも、今回の受信が(P−1)または(P−2)に該当する場合は、総パケットカウンタの値が1増えるが、消失パケットカウンタの値は変化しない。より具体的には、例えば、図24でデータパケットD0が受信されると、総パケットカウンタの値がTから(T+1)に増えるが、消失パケットカウンタの値はLのまま変化しない。また、データパケットD3が受信されると、総パケットカウンタの値が(T+2)から(T+3)に増えるが、消失パケットカウンタの値はLのまま変化しない。データパケットD2の消失に合わせて消失パケットカウンタがインクリメントされるのは、後にFECパケットF3−1が受信されたときである。
さて、ステップS206の処理が実行されるのは、上記のとおり、今回の受信が(P−3)に該当する場合である。よって、判断部303は、ステップS203で検出したFECパケットの消失に合わせて、ステップS206で消失パケットカウンタを1だけインクリメントする。
例えば、図25の例で、データパケットD12が受信されたとき、ステップS203で判断部303はFECパケットF2−1の消失を検出する。よって、判断部303は、消失したFECパケットF2−1を消失パケットとして数えるため、ステップS206で消失パケットカウンタを1だけインクリメントする。
同様に、図25の例で、データパケットD18が受信されたとき、ステップS203で判断部303はFECパケットF3−2の消失を検出する。よって、判断部303は、消失したFECパケットF3−2を消失パケットとして数えるため、ステップS206で消失パケットカウンタを1だけインクリメントする。
そして、次のステップS207で判断部303は、総パケットカウンタを2だけインクリメントする。なぜなら、総パケットカウンタが数える対象の「本来転送装置300が受信するはずのパケット」には、今回受信されたデータパケットと、当該データパケットの受信を契機としてステップS203で消失が検出されたFECパケットの双方が含まれるからである。
例えば、図25の例で、データパケットD12が受信されたとき、判断部303は、ステップS207で総パケットカウンタを2だけインクリメントする。つまり、判断部303は、データパケットD12とFECパケットF2−1を、「本来転送装置300が受信するはずのパケット」として数える。同様に、図25の例で、データパケットD18が受信されたとき、判断部303はステップS207で、データパケットD18とFECパケットF3−2を数える。
続いて、ステップS208で判断部303は、第N層(すなわち最下層)の直前のブロック中のデータパケットをすべて受信部301が既に受信したか否かを判断する。なおここで、「第N層の直前のブロック」とは、ステップS203で消失が検出されたFECパケットの直前のデータパケットが第N層において属するブロックである。
そして、第N層の直前のブロック中のデータパケットをすべて受信部301が受信済みの場合、処理はステップS209に移行する。逆に、第N層の直前のブロック中に、まだ受信部301が受信していないデータパケットがある場合、処理はステップS210に移行する。
なお、転送装置300にとっての最下層である第N層を示す値(例えば整数Nそのもの)は、例えば指示部308内部に保持されており、他の構成要素(例えば判断部303、復元部304、生成部306など)からも参照可能である。転送装置300が送信元装置310から送信先装置320への転送を開始した直後は、第N層を示す値として、例えばデフォルト値が使われてもよい。もちろん、指示部308が送信元装置310に第2の階層情報を通知した後は、第2の階層情報が示す階層は第N層である。そして、Nの値は、送信元装置310と転送装置300の間のリンクのエラーレートの変動に応じて動的に変化し得る。
また、ステップS208で判断部303は、図14のブロック管理テーブル500から「第N層の直前のブロック」に属するデータパケットを特定することができる。よって、判断部303は、特定したデータパケットが格納されているか否かをバッファ部302内の不図示の制御部に問い合せることで、ステップS208の判断を行うことができる。ステップS208の判断処理の具体例は、例えば、以下のとおりである。
図25において、受信部301がデータパケットD11を受信した後に、FECパケットF2−1を受信することなく、データパケットD12を受信した場合、「第N層の直前のブロック」は、データパケットD6〜D11が属するブロックB3−2である。そして、図25の例では、データパケットD6〜D11は消失せずに受信されている。よって、この場合、処理はステップS209に移行する。
具体的には、判断部303は、ステップS203で見つけたエントリの階層フィールドの値がNより小さい場合、ステップS203で見つけたエントリよりも前にあり、かつ階層フィールドの値がNに等しいエントリのうちで、最後のエントリを探す。すると、ブロックB3−1に対応する2番目のエントリが見つかり、このエントリにおけるブロックの終了番号フィールドの値は5である。また、判断部303がステップS203で見つけたブロック管理テーブル500のエントリは、ブロックB2−1に対応する4番目のエントリであり、ブロックの終了番号として11という値を持つ。
よって、判断部303は、6(=5+1)番目のデータパケットD6から、11番目のデータパケットD11までを、「第N層の直前のブロック」に属するデータパケットとして特定する。そして、判断部303は、バッファ部302への問い合わせの結果、データパケットD6〜D11がすべて受信済みであることを認識する。したがって、処理はステップS209に移行する。
他方、図25において、受信部301がデータパケットD17を受信した後に、FECパケットF3−2を受信することなく、データパケットD18を受信した場合、「第N層の直前のブロック」は、データパケットD12〜D17が属するブロックB3−3である。そして、図25の例では、データパケットD12〜D17のうち、データパケットD15が消失しており、受信されていない。よって、この場合、処理はステップS210に移行する。
この場合、判断部303は、ステップS203において、ブロック管理テーブル500の6番目のエントリを既に見つけている。そして、見つかったエントリの階層フィールドの値はN(=3)なので、判断部303は、見つかったエントリの内容から、データパケットD12〜D17を「第N層の直前のブロック」に属するデータパケットとして特定する。すると、判断部303は、バッファ部302への問い合わせの結果、データパケットD15が受信されていないことを認識する。したがって、処理はステップS210に移行する。
ステップS209で判断部303は、生成部306に対し、第N層の直前のブロックに属するデータパケットを用いて、消失したFECパケットを生成するよう、要求する。そして、生成部306は、要求にしたがってFECパケットを生成し、バッファ部302に出力する。すると、処理は図20のステップS222に移行する。
なお、判断部303は、消失したFECパケットの生成を生成部306に命令すると、消失したFECパケットの階層を記憶する内部記憶を書き換える。例えば、判断部303は、消失した第2層のFECパケットF2−1の生成を生成部306に命令した場合、「第2層のFECパケットの消失を検出した」という内部記憶をクリアする。
ステップS209の処理は、具体的には、例えば、以下のように行われてもよい。
まず、判断部303は、ステップS203の判断においてブロック管理テーブル500の検索の結果見つかったエントリの内容から、FECパケットの生成に用いるパケットを特定する。例えば、図25の例で受信部301がデータパケットD12を受信した場合、判断部303は、消失したFECパケットF2−1を生成するために用いるパケットとして、FECパケットF3−1とデータパケットD6〜D11を以下のようにして特定してもよい。
ステップS203で判断部303は、「階層が2であり、ブロックの開始番号が0であり、ブロックの終了番号が11である」というエントリを既に見つけている。また、図25の例では、N=3である。よって、判断部303は、見つけたエントリの階層(=2)より深い、第N層までの各階層のFECパケットで、バッファ部302に記憶されているものすべてを、消失したFECパケットF2−1を生成するために用いるパケットとして、生成部306に指定する。
なお、本実施形態では、後述するように、FECパケットが受信されると、同じ階層のFECパケットが既にバッファ部302に格納されている場合は、同じ階層の古いFECパケットが捨てられる。よって、上記の例では、判断部303は、第3層の受信済みのFECパケットF3−1を、消失したFECパケットF2−1を生成するために用いるパケットとして認識することができる。
また、判断部303は、さらに、ステップS208で認識した「第N層の直前のブロック」に属するデータパケットD6〜D11を、消失したFECパケットF2−1を生成するために用いるパケットとして認識する。そして、判断部303は、以上のようにして認識したデータパケットD6〜D11とFECパケットF3−1を使ってFECパケットF2−1を生成するよう、生成部306に命令する。
すると、生成部306は、バッファ部302からデータパケットD6〜D11とFECパケットF3−1を読み出す。そして、生成部306は、式(4.1)にしたがってFECパケットF2−1を生成し、生成したFECパケットF2−1をバッファ部302に格納する。
つまり、生成部306は、FECパケットF2−1のFECレベル0ペイロード709として、FECパケットF3−1のFECレベル0ペイロード709とデータパケットD6〜D11それぞれのRTPペイロード606の排他的論理和を計算する。そして、生成部306は、FECパケットF2−1のFECヘッダ707において、Eビットを1に設定し、FECパケットF2−1に対応する階層である「第2層」を示す値を階層フィールドに設定する。
また、生成部306は、FECパケットF3−1のFECヘッダ707内の各リカバリフィールドの値と、データパケットD6〜D11それぞれのRTPヘッダ605内の対応するフィールドの値の排他的論理和を計算する。そして、生成部306は、計算した値をFECパケットF2−1のFECヘッダ707内の各リカバリフィールドに設定する。
また、生成部306は、データパケットD6〜D11のシーケンス番号に基づいて、FECパケットF2−1のFECヘッダ707内のSNベースフィールドと、FECレベル0ヘッダ708内のマスクフィールドを設定する。なお、ここで説明を省略した他のフィールド(図16〜17を参照)については、生成部306は、RFC5109に適合するように適宜値を設定する。
生成部306は、以上のようにして生成したFECパケットF2−1を、「第2層」という階層と対応づけてバッファ部302に記憶させる。そして、処理はステップS209から図20のステップS222に移行する。
さて、ステップS210で判断部303は、第N層の直前のブロックに属するデータパケットのうち、まだ受信されていないことをステップS208で確認した1つまたは複数のデータパケット(つまり消失したデータパケット)の再送を、送信元装置310に要求する。例えば、図25では、データパケットD18の受信を契機にFECパケットF3−2の消失がステップS203で検出された後、ステップS210で判断部303がデータパケットD15の再送を送信元装置310に要求する。
なお、再送要求は指示部308を介して行われてもよい。また、再送要求は、消失したデータパケットを識別するためのシーケンス番号を含む。
そして、次のステップS211で判断部303は、総パケットカウンタと消失パケットカウンタを、ステップS210で再送を要求したデータパケットの数だけ、インクリメントする。そして、今回のパケットの受信を契機とする処理は終了する。
例えば、図25の上記の例では、S210で判断部303が再送を要求したデータパケットはデータパケットD15だけである。よって、ステップS211で判断部303は、総パケットカウンタを1だけインクリメントし、消失パケットカウンタを1だけインクリメントする。
その結果、データパケットD18の受信を契機として、総パケットカウンタはステップS207とS211で合計3だけインクリメントされ、図25のとおり値が(T+19)から(T+22)になる。また、データパケットD18の受信を契機として、消失パケットカウンタはステップS206とS211で合計2だけインクリメントされ、図25のとおり値が(L+2)から(L+4)になる。
ところで、図21のステップS212が実行されるのは、上記のとおり、今回の受信が(P−4)に該当する場合である。そこで、ステップS212で判断部303は、今回の受信により第N層の直前のブロック中のデータパケットがすべて揃ったか否かを判断する。ステップS212では、例えばステップS208での判断と同様に、判断部303からバッファ部302への問い合わせを通して判断がなされてもよい。
もし、今回の受信によってもまだ第N層の直前のブロック中のデータパケットが揃わない場合は、第N層の直前のブロック中のデータパケットがすべて揃うのを待つために、今回の受信を契機とする一連の処理は終了する。例えば、過去に判断部303がステップS210において複数のデータパケットの再送を送信元装置310に要求した場合、再送を要求したうちの1つのデータパケットを受信部301が受信した段階では、第N層の直前のブロック中のデータパケットがまだすべて揃わない。よって、残りのデータパケットが再送されるまで待つために、処理が終了する。
逆に、今回の受信により第N層の直前のブロック中のデータパケットがすべて揃った場合は、処理はステップS212からステップS213に移行する。例えば、図25の例で、今回の受信が、再送されたデータパケットD15の受信である場合、今回の受信により、第N層の直前のブロックのすべてのデータパケットが揃う。よって、この場合、処理はステップS213に移行する。
なお、ステップS212での「第N層の直前のブロック」とは、再送要求の要否の判断の契機となったFECパケット(ステップS203で消失が検出されたか、またはステップS201で受信されたもの)の直前の第N層のブロックのことである。例えば、図25の例において、今回の受信が、再送されたデータパケットD15の受信である場合は、データパケットD12〜D17の属するブロックB3−3が「第N層の直前のブロック」である。
さて、ステップS213で判断部303は、消失したFECパケットがあるか否かを判断する。例えば、図25の例で、データパケットD18の受信を契機として、判断部303は、ステップS203でFECパケット3−2の消失を検出すると、第3層のFECパケットの消失を検出したことを内部的に記憶してもよい。すると、ステップS213で判断部303は、判断部303自身の内部記憶に基づいて、消失したFECパケットがあるか否かを判断することができる。
なお、たとえFECパケットが消失しなくても、第N層の1つのブロックの中で複数のデータパケットが消失すれば、再送が生じる。よって、ステップS213が実行される場合に、消失したFECパケットがあるとは限らない。そのため、判断部303はステップS213で、まず、消失したFECパケットがあるか否かを判断する。そして、もし消失したFECパケットがなければ、処理は図20のステップS222に移行する。
逆に、もし消失したFECパケットがあれば、ステップS213でさらに判断部303は、FECパケットの生成を生成部306に命令する。すると、生成部306はFECパケットを生成してバッファ部302に出力する。そして、処理は図20のステップS222に移行する。
なお、判断部303は、消失したFECパケットの生成を生成部306に命令すると、消失したFECパケットの階層を記憶する内部記憶を書き換える。例えば、判断部303は、消失した第3層のFECパケットF3−2の生成を生成部306に命令した場合、「第3層のFECパケットの消失を検出した」という内部記憶をクリアする。
ステップS213におけるFECパケットの生成の詳細は、ステップS209と類似である。例えば、図25の例では、再送されたデータパケットD15の受信を契機として、ステップS213で判断部303が、消失したFECパケットF3−2を生成するために用いるパケットとして、データパケットD12〜D17を生成部306に指定する。なお、このように消失したFECパケットF3−2が最下層(第3層)の場合、生成部306は、受信済みの他のFECパケットを使わない。
つまり、生成部306は、FECパケットF3−2のFECレベル0ペイロード709として、データパケットD12〜D17それぞれのRTPペイロード606の排他的論理和を計算する。そして、生成部306は、FECパケットF3−2のFECヘッダ707において、Eビットを1に設定し、FECパケットF3−2に対応する階層である「第3層」を示す値を階層フィールドに設定する。
また、生成部306は、FECパケットF3−2のFECヘッダ707内の各リカバリフィールドに、データパケットD12〜D17それぞれのRTPヘッダ605内の対応するフィールドの値の排他的論理和を設定する。さらに、生成部306は、データパケットD12〜D17のシーケンス番号に基づいて、FECパケットF3−2のFECヘッダ707内のSNベースフィールドと、FECレベル0ヘッダ708内のマスクフィールドを設定する。なお、ここで説明を省略した他のフィールド(図16〜17を参照)については、生成部306は、RFC5109に適合するように適宜値を設定する。
生成部306は、以上のようにして生成したFECパケットF3−2を、「第3層」という階層と対応づけてバッファ部302に記憶させる。そして、処理はステップS213から図20のステップS222に移行する。
さて、図20のステップS214は、今回の受信がFECパケットの受信である場合に実行される。FECパケットの受信を検出した判断部303は、今回受信したFECパケットと同じ階層のFECパケットが既にバッファ部302に格納されている場合は、同じ階層の古いFECパケットを廃棄するようバッファ部302に命令する。そしてバッファ部302は命令にしたがって古いFECパケットを廃棄する。
例えば、図24の例で、FECパケットF3−2が受信された時点では、バッファ部302に同じ第3層のFECパケットF3−1が格納されている。よって、判断部303はFECパケットF3−1の廃棄をバッファ部302に命令する。
他方、図24の例で、FECパケットF2−1が受信された時点では、バッファ部302に格納されている第2層の他のFECパケットはない。よって、廃棄されるFECパケットはない。
上記のようにして場合に応じて古いFECパケットが廃棄された後、さらに、ステップS214で判断部303は、第N層の注目しているブロック中のデータパケットの受信状況を判断する。なお、ここで「第N層の注目しているブロック」とは、今回受信されたFECパケットの直前のデータパケットが第N層において属するブロックのことである。
そして、第N層の注目しているブロックに属するすべてのデータパケットが受信部301によりすべて受信できていた場合、処理はステップS215に移行する。また、第N層の注目しているブロックに属するデータパケットのうち1つだけが消失した場合(すなわち残りのデータパケットはすべて受信部301により受信できていた場合)、処理はステップS216に移行する。そして、第N層の注目しているブロックに属するデータパケットのうち2つ以上が消失した場合、処理はステップS219に移行する。なお、ステップS214における受信状況の判断は、具体的には、ステップS208の判断と同様に、バッファ部302への問い合わせにより実現されてもよい。
例えば、図24と図25の例では、FECパケットF3−1を受信部301が受信した場合、「第N層の注目しているブロック」はデータパケットD0〜D5の属するブロックB3−1であり、データパケットD2が消失している。よって、処理はステップS214からステップS216へ移行する。
同様に、図24の例で、今回の受信がFECパケットF2−1の受信である場合も、処理はステップS214からステップS216に移行する。なぜなら、データパケットD6〜D11のうちデータパケットD8が消失しているからである。
同様に、図24の例で、今回の受信がFECパケットF1−1の受信である場合も、処理はステップS214からステップS216に移行する。なぜなら、データパケットD18〜D23のうちデータパケットD19が消失しているからである。
また、図24の例で、今回の受信がFECパケットF3−2の受信である場合、第N層の注目しているブロックに属するデータパケットD12〜D17はすべて既に受信されている。よって、処理はステップS214からステップS215に移行する。
さて、ステップS215で判断部303は、今回のFECパケットの受信を総パケットカウンタに反映するため、総パケットカウンタを1だけインクリメントする。そして、処理はステップS222に移行する。
他方、ステップS216で判断部303は、消失した1つのデータパケットを復元するよう、復元部304に要求する。そして、復元部304は、要求にしたがって、復元に用いるFECパケットとデータパケットをバッファ部302から読み出し、読み出したパケットを使って、消失したデータパケットを復元する。また、復元部304は、復元したデータパケットをバッファ部302に出力する。ステップS216の詳細は、例えば以下のようであってもよい。
判断部303は、今回受信されたFECパケットの階層を、FECヘッダ707の階層フィールドから認識する。
そして、判断部303が認識した階層が最下層(つまり第N層)の場合、式(5.10)によれば、FEC_New()は、今回受信されたFECパケットに対応する。よって、判断部303は、第N層の注目しているブロックに属する、消失した1つのデータパケット以外のすべてのデータパケットと、今回受信されたFECパケットとを用いて復元を行うよう、復元部304に命令する。
例えば、図24の例でFECパケットF3−1が受信された場合、判断部303が認識する階層は第3層(つまり第N層)である。よって、判断部303は、第3層の注目しているブロックB3−1に属するデータパケットD0、D1、D3〜D5と、FECパケットF3−1とを用いてデータパケットD2を復元するよう、復元部304に命令する。
すると、復元部304は、データパケットD0、D1、D3〜D5とFECパケットF3−1をバッファ部302から読み出し、読み出したパケットを使ってデータパケットD2を復元する。そして、復元部304は、復元したデータパケットD2をバッファ部302に出力する。
具体的には、復元部304は、FECパケットF3−1のFECレベル0ペイロード709とデータパケットD0、D1、D3〜D5それぞれのRTPペイロード606の排他的論理和を、データパケットD2のRTPペイロード606として計算する。
また、復元部304は、FECパケットF3−1のFECヘッダ707内の各リカバリフィールドの値と、データパケットD0、D1、D3〜D5それぞれのRTPヘッダ605内の対応するフィールドの値の排他的論理和を計算する。そして、復元部304は、計算した値を、データパケットD2のRTPヘッダ605内の対応するフィールドに設定する。
あるいは、図24の例でFECパケットF1−1が受信された場合、今回受信されたFECパケットF1−1のFECヘッダ707の階層フィールドから判断部303が認識する階層は第1層である。このように、判断部303が認識した階層が最下層ではない場合、式(5.9)によれば、FEC_New()は、今回受信されたFECパケットと、判断部303が認識した階層より深い各階層の受信済みのFECパケットとの排他的論理和である。
例えば、図24の例でFECパケットF1−1が受信された場合、n=1<Nなので、式(5.9)(より具体的には式(5.13))のとおり、FEC_New()は、FECパケットF1−1とF2−1とF3−2の排他的論理和である。よって、判断部303は、FECパケットF1−1とF2−1とF3−2と、データパケットD18、D20〜D23を用いてデータパケットD19を復元するよう、復元部304に命令する。
すると、復元部304は、FECパケットF1−1とF2−1とF3−2と、データパケットD18、D20〜D23をバッファ部302から読み出し、読み出したパケットを使ってデータパケットD19を復元する。そして、復元部304は、復元したデータパケットD19をバッファ部302に出力する。
具体的には、復元部304は、FECパケットF1−1とF2−1とF3−2それぞれのFECレベル0ペイロード709と、データパケットD18、D20〜D23それぞれのRTPペイロード606の排他的論理和を計算する。そして、復元部304は、計算結果をデータパケットD19のRTPペイロード606に設定する。
また、復元部304は、FECパケットF1−1とF2−1とF3−2それぞれのFECヘッダ707内の各リカバリフィールドの値と、データパケットD18、D20〜D23それぞれのRTPヘッダ605内の対応するフィールドの値の排他的論理和を計算する。そして、復元部304は、計算した値を、データパケットD19のRTPヘッダ605内の対応するフィールドに設定する。
以上のようにして消失したデータパケットがバッファ部302上に復元されると、処理はステップS216からステップS217へと移行する。そして、ステップS217で判断部303は、消失パケットカウンタを1だけインクリメントする。
例えば、図24の例でFECパケットF2−1が受信された場合、FECパケットF2−1の受信を契機として、データパケットD8の消失をステップS214で判断部303が確認済みである。よって、判断部303は、データパケットD8の消失を反映するため、消失パケットカウンタを1だけインクリメントする。
さらに、次のステップS218で判断部303は、今回のFECパケットの受信と、1つのデータパケットの消失とを総パケットカウンタに反映するため、総パケットカウンタを2だけインクリメントする。そして、処理はステップS222に移行する。なお、ステップS216〜S218の実行順は適宜入れ換えられてもよい。
さて、上記「第N層の注目しているブロック」において、2つ以上のデータパケットが消失していた場合に、ステップS219〜S221の処理が実行される。すなわち、受信済みのデータパケットとFECパケットからでは消失したデータパケットを復元することができない場合、ステップS219〜S221の処理が実行される。なお、ステップS219〜S221の実行順は適宜入れ換えられてもよい。
具体的には、ステップS219で判断部303は、消失した2つ以上のデータパケットのすべての再送を送信元装置310に要求する。再送要求は、消失したデータパケットを識別するためのシーケンス番号を含む。また、再送要求は指示部308を介して行われてもよい。
そして、ステップS220で判断部303は、消失パケットカウンタを、ステップS219で再送を要求したデータパケットの数だけ、インクリメントする。
また、ステップS221で判断部303は、総パケットカウンタを、ステップS219で再送を要求したデータパケットの数に1を足した数だけ、インクリメントする。1を足す理由は、今回のFECパケットの受信を総パケットカウンタに反映するためである。そして、データパケットの再送を待つため、今回の受信を契機とした一連の処理は終了する。
さて、ステップS222が実行されるのは、ステップS209、S213、S215またはS218の実行後である。つまり、ステップS222以降の処理は、或るFECパケットと当該FECパケットの直前の第N層のブロックに属するすべてのデータパケットがすべてバッファ部302中に揃っている場合に、実行される。
本実施形態では、具体的にまずステップS222で指示部308は、誤り訂正前のパケットロス率P(つまり送信元装置310と転送装置300の間のリンクでのエラーレート)を計算する。具体的には、指示部308は、消失パケットカウンタの値を総パケットカウンタの値で割ることで、誤り訂正前のパケットロス率Pを得る。
また、本実施形態では、誤り訂正後の許容エラー率Aが予め定数として定められている。誤り訂正後の許容エラー率Aは、例えば、指示部308を実現するためにCPU201が実行するプログラムに定数として定義されていてもよい。なお、誤り訂正後の許容エラー率Aは、0<A<1の任意の値でよい。例えば、A=0.001でもよい。
例えば動画や音声などのストリーミングデータでは、或る程度の割合までならば、たとえデータが欠落しても、動画や音声を視聴している人間にとってあまり不自然には感じられない。つまり、データパケットのペイロードの内容によっては、消失したデータパケットのうちの一部が復元不能であったとしても、許容されることがある。
また、データパケットのペイロードの内容によらず、一般に、通信システムにおいては、一定程度以下での頻度での再送要求は許容される。もちろん、「一定程度」の具体的な値は通信の用途や目的などに応じて様々に異なる。
そこで、例えば上記のようなストリーミングデータの特性や、許容される再送要求の発生頻度などに応じて、適宜の定数が誤り訂正後の許容エラー率Aとして予め定められ、指示部308に設定される。つまり、誤り訂正後の許容エラー率Aは、復元不能なデータパケットの割合として許容される値を示す。
そこで、ステップS222でさらに指示部308は、計算した誤り訂正前のパケットロス率Pと、予め決められた誤り訂正後の許容エラー率Aから、必要な誤り訂正性能を得るために適切な層の深さNnewを、以下のようにして計算する。
ここで、B個のデータパケットに1個の割合でFECパケットが1個挿入されるとする。つまり、最下層のブロックがB個のデータパケットからなるとする。例えば、図1の例では、最下層が第3層ならばB=6であり、最下層が第2層ならばB=12である。
すると、FECパケットを用いた誤り訂正後のパケットロス率は約BP2である。なぜなら、「或るデータパケットが、FECパケットを用いた誤り訂正によっても復元不能である」ということは、「下記(Q−1)と(Q−2)がともに成立する」ということ同値だからである。
(Q−1)当該或るデータパケットが消失した。
(Q−2)第N層において、消失した当該或るデータパケットと同じブロックに属する残りの(B−1)個のデータパケットのうち1つ以上が消失したか、または、上記ブロックの直後に挿入されるFECパケットが消失した。
ここで、(Q−1)が成立する確率は、パケットロス率Pである。また、(Q−2)が成立する確率は、1−(1−P)Bである。そして、2項定理より式(20.2)が成り立つ。
また、パケットロス率Pに関しては、P≪1と見なすことができる。そして、P≪1のとき、Pの2次以上の項を無視することができるので、式(20.2)から式(20.3)が得られる。
(1-P)B≒BCB-1×(-P)1+BCB×(-P)0=-BP+1 (20.3)
したがって、P≪1のとき、(Q−2)が成立する確率は、式(20.4)のとおりである。
1-(1-P)B≒1-(-BP+1)=BP (20.4)
したがって、(Q−1)と(Q−2)がともに成立する確率は、式(20.5)のとおり約BP2である。
P{1-(1-P)B}≒BP2 (20.5)
したがって、ステップS222で指示部308は、誤り訂正後のパケットロス率BP2が誤り訂正後の許容エラー率A以下となるような適切なBの値を計算し、計算したBの値から適切な層の深さNnewを得る。つまり、指示部308は、式(20.6)を満たす最大のBとして、式(20.7)のBを計算する。
BP2≦A (20.6)
B=A/P2 (20.7)
例えば、A=0.003かつP=0.02のとき、式(20.7)によればB=7.5である。よって、指示部308は、ブロックサイズが7.5以下の階層のうち最も浅い階層の深さを、適切な層の深さNnewとして得る。例えば、図1や図14の例では、第2層のブロックサイズが12で第3層のブロックサイズが6なので、Nnew=3である。指示部308は、ブロックサイズを認識するために図14のブロック管理テーブル500を参照してもよい。
なお、以上の誤り訂正前のパケットロス率Pと、誤り訂正後の許容エラー率Aと、最下層のブロックサイズBとの関係を、別の観点から述べれば、次のとおりである。
式(20.6)を変形すると、次の式(20.8)が得られる。
ここで、式(20.8)の右辺のBに、現在の転送装置300にとっての最下層のブロックサイズを代入したときに、誤り訂正前のパケットロス率Pが式(20.8)を満たすならば、現在の誤り訂正性能(FEC強度ともいう)は十分である。逆に、式(20.8)が満たされないならば、現在の誤り訂正性能は不足であるから、第N層よりも深い階層を最下層とするよう、指示部308は送信元装置310に指示する必要がある。
さて、ステップS222で上記のように適切な階層の深さNnewが計算されると、処理はステップS223に移行する。そして、ステップS223で指示部308は、現在の最下層の深さNが、計算された適切な階層の深さNnewよりも浅いか否かを判断する。そして、N<Nnewの場合(つまり十分な誤り訂正性能が得られていない場合)、処理はステップS224に移行する。逆に、N≧Nnewの場合(つまり十分な誤り訂正性能が得られている場合)、処理はステップS225に移行する。
ステップS224で指示部308は、FECパケットの増加要求を送信元装置310へ送信する。増加要求は、適切な階層の深さNnewを指定する情報(例えば、深さNnewそのもの、あるいは深さNnewと深さNの差)を含む。つまり、FECパケットを生成する対象の階層の最大深さを深くする(具体的にはNからNnewに変える)ことで、FECパケットが挿入される割合を増やすように、指示部308は送信元装置310に要求する。
増加要求の送信後、処理は図22または図23のステップS227へ移行する。すなわち、転送装置300が中継ノードとして動作している場合は、増加要求の送信後、処理は図22のステップS227へ移行し、転送装置300が葉ノードとして動作している場合は、増加要求の送信後、処理は図23のステップS227へ移行する。
また、ステップS225で指示部308は、現在の最下層の深さNが、計算された適切な層の深さNnewよりも深いか否かを判断する。そして、N>Nnewの場合(つまり過剰な誤り訂正性能が得られている場合)、処理はステップS226に移行する。
逆に、N=Nnewの場合(つまり現在の誤り訂正性能が適切である場合)、処理は図22または図23のステップS227へ移行する。つまり、転送装置300が中継ノードとして動作している場合は、処理が図22のステップS227へ移行し、転送装置300が葉ノードとして動作している場合は、処理が図23のステップS227へと移行する。
また、ステップS226で指示部308は、FECパケットの削減要求を送信元装置310へ送信する。削減要求は、適切な階層の深さNnewを指定する情報(例えば、深さNnewそのもの、あるいは深さNnewと深さNの差)を含む。つまり、FECパケットを生成する対象の階層の最大深さを浅くする(具体的にはNからNnewに変える)ことで、FECパケットが挿入される割合を減らすように、指示部308は、送信元装置310に要求する。
削減要求の送信後、処理は図22または図23のステップS227へ移行する。すなわち、転送装置300が中継ノードとして動作している場合は、削減要求の送信後、処理は図22のステップS227へ移行し、転送装置300が葉ノードとして動作している場合は、削減要求の送信後、処理は図23のステップS227へ移行する。
さて、図22のステップS227で、中継ノードとして動作する転送装置300のバッファ部302内の不図示の制御部は、注目している第N層のブロックに属するデータパケットを、不図示の上位層アプリケーションに供給する。例えば、バッファ部302内の制御部は、注目している第N層のブロックに属する各データパケットのUDPペイロード604であるRTPパケットを、動画再生アプリケーションに供給してもよい。
なお、ステップS227における「注目している第N層のブロック」とは、下記(R−1)〜(R−3)のいずれかである。
(R−1)ステップS209からステップS222へ処理が進んだ後にステップS227が実行される場合は、ステップS208の「第N層の直前のブロック」。例えば、図25の例でデータパケットD12が受信された場合は、データパケットD12の受信を契機に消失が検出されたFECパケットF2−1の直前のデータパケットD6〜D11が属する第3層のブロックB3−2。
(R−2)ステップS213からステップS222へ処理が進んだ後にステップS227が実行される場合は、ステップS212の「第N層の直前のブロック」。例えば、図25の例で再送されたデータパケットD15が受信された場合は、データパケットD15を含む第3層のブロックB3−3。
(R−3)ステップS215またはS218からステップS222へ処理が進んだ後にステップS227が実行される場合は、ステップS214の「第N層の注目しているブロック」。例えば、図24の例でFECパケットF3−1が受信された場合は、FECパケットF3−1の直前のデータパケットD0〜D5が属する第3層のブロックB3−1。また、図24の例でFECパケットF3−2が受信された場合は、FECパケットF3−2の直前のデータパケットD12〜D17が属する第3層のブロックB3−3。
さて、次のステップS228で送信部307は、配信先管理テーブル400の各エントリを順に処理するためのインデックスkを1に初期化する。
続いて、ステップS229で送信部307は、配信先管理テーブル400のk番目のエントリを参照し、k番目の送信先装置320の階層の深さを読み取る。送信部307が読み取った階層の深さがNと等しい場合、処理はステップS230に移行する。また、送信部307が読み取った階層の深さNより浅い場合、処理はステップS231に移行する。そして、送信部307が読み取った階層の深さがNより深い場合、処理はステップS232に移行する。
ステップS230で送信部307は、ステップS227における「注目している第N層のブロック」に属するデータパケット600と、それらのデータパケット600の直後のFECパケット700をk番目の送信先装置320に送信する。そして、処理はステップS233に移行する。
なお、送信部307は、送信に際して、データパケット600のIPヘッダ601とFECパケット700のIPヘッダ701それぞれの送信先IPアドレスフィールドに、配信先管理テーブル400のk番目のエントリのIPアドレスを設定する。また、送信部307は、IPヘッダ601とIPヘッダ701それぞれの送信元IPアドレスフィールドに、転送装置300自身のIPアドレスを設定する。
さて、ステップS231で送信部307は、FECパケット700を間引きつつ、ステップS227における「注目している第N層のブロック」に属するデータパケット600をk番目の送信先装置320に送信する。なお、送信部307は、送信に際して、ステップS230と同様にIPヘッダ601とIPヘッダ701を設定する。そして、処理はステップS233に移行する。
なお、ステップS231での「間引き」とは、具体的には次のような処理のことである。
つまり、k番目の送信先装置320の階層の深さが、ステップS227における「注目している第N層のブロック」の直後のFECパケット700の階層と同じかそれより深い場合、送信部307は、当該FECパケット700をk番目の送信先装置320に送信する。逆に、k番目の送信先装置320の階層の深さが、当該FECパケット700の階層より浅い場合、送信部307は、k番目の送信先装置320へは、当該FECパケット700を送信しない。
例えば、図24の例において、今回の受信がFECパケットF2−1の受信である場合、「注目している第N層のブロック」は、データパケットD6〜D11が属するブロックB3−2である。そして、ブロックB3−2の直後のFECパケットF2−1の階層は第2層である。
よって、送信部307は、k番目の送信先装置320の階層の深さが第2層かそれより深い場合に、FECパケットF2−1をk番目の送信先装置320に送信する。逆に、k番目の送信先装置320の階層の深さが第2層より浅い(要するに第1層である)場合、送信部307は、k番目の送信先装置320へはFECパケットF2−1を送信しない。
さて、ステップS232では、生成部306と送信部307が協働して、1つまたは複数のFECパケット700を追加しつつ、ステップS227における「注目している第N層のブロック」に属するデータパケット600をk番目の送信先装置320に送信する。なお、送信部307は、送信に際して、ステップS230と同様にIPヘッダ601とIPヘッダ701を設定する。そして、処理はステップS233に移行する。
なお、ステップS232でのFECパケット700の追加は、具体的には、図7を参照して説明したのと同様の処理である。例えば、図24の例において、今回の受信がFECパケットF2−1の受信であり、k番目の送信先装置320の層の深さが第4層であるとする。
この場合、上記のとおり「注目している第N層のブロック」は、データパケットD6〜D11が属するブロックB3−2である。よって、生成部306は、ブロック管理テーブル500を参照して、ブロックB3−2のサブセットのブロックに対応するエントリのうち、階層が第N層より深く、かつk番目の送信先装置320の層の深さまでであるエントリを検索する。検索の結果、生成部306は、ブロックB3−2にサブセットとして含まれる第4層のブロックB4−3に対応するエントリを見つける。
よって、生成部306は、見つけたエントリにしたがって、ブロックB4−3に属するデータパケットD6〜D8をバッファ部302から読み出し、データパケットD6〜D8からFECパケットF4−2を生成する。そして、生成部306は、生成したFECパケットF4−2をバッファ部302に出力する。
また、生成部306は、新たに生成したのはFECパケットF4−2のみであることと、生成したFECパケットF4−2の順番がデータパケットD8の直後であることを送信部307に通知する。すると、送信部307は、k番目の送信先装置320へと、データパケットD6〜D8を送信し、FECパケットF4−2を送信し、データパケットD9〜D11を送信する。
もちろん、k番目の送信先装置320の層の深さによっては、ステップS232で生成部306が複数の階層の複数のFECパケット700を生成することもある。
また、生成部306が、例えば5番目の送信先装置320に対応して第4層のFECパケット700を生成した後で、8番目の送信先装置320に関してもステップS232が実行されることもあり得る。この場合、生成部306は、第4層の同じFECパケット700を再度生成する必要はない。送信部307は、5番目の送信先装置320に対応して既に生成されてバッファ部302に格納されている第4層のFECパケット700を、(適宜IPヘッダ701を書き換えたうえで)8番目の送信先装置320にも送信すればよい。
さて、ステップS233で送信部307は、インデックスkが送信先装置320の数(すなわち配信先管理テーブル400のエントリ数Z)未満か否かを判断する。もし、インデックスkが送信先装置320の数Z未満であれば、処理はステップS234に移行する。逆に、インデックスkが送信先装置320の数Zに達していれば、処理はステップS235に移行する。
そして、ステップS234で送信部307は、インデックスkを1だけインクリメントする。そして、処理はステップS229に戻る。
また、ステップS235で送信部307は、ステップS227における「注目している第N層のブロック」に属するすべてのデータパケットを削除するよう、バッファ部302に命令する。例えば、送信部307は、削除対象のデータパケットのシーケンス番号をバッファ部302に対して指定する。そして、バッファ部302は、指定されたデータパケットを削除する。
なお、上記のステップS229〜S234の繰り返しループにおいて1回でもステップS232が実行された場合は、ステップS235で送信部307はさらに、ステップS232で生成部306が生成したFECパケットの削除もバッファ部302に命令する。そして、バッファ部302は、命令にしたがって、第N層よりも深い階層のFECパケットを削除する。
そして、次のステップS236でバッファ部302は、ステップS227における「注目している第N層のブロック」は第1層のブロックの中で第N層の最後のブロックであるか否かを、例えばブロック管理テーブル500を参照して判断する。そして、「注目している第N層のブロック」が第1層のブロックの中で第N層の最後のブロックである場合、処理はステップS237に移行する。逆に、「注目している第N層のブロック」が第1層のブロックの中で第N層の最後以外の位置のブロックの場合、今回の受信を契機とする処理は終了する。
例えば、「注目している第N層のブロック」が、データパケットD18〜D23の属するブロックB3−4である場合は、処理はステップS237に移行する。逆に、「注目している第N層のブロック」が、データパケットD12〜D17の属するブロックB3−3である場合は、処理は終了する。
そして、ステップS237でバッファ部302は、保持しているFECパケットをすべて削除する。すると、今回の受信を契機とする処理は終了する。
さて、葉ノードとして動作する転送装置300においては、図20のステップS224、S225、またはS226の後、処理が図23のステップS227に移行する。図23に示すステップS227、S235、S236およびS237は、図22と同様であるので、詳しい説明は省略する。つまり、葉ノードとして動作する転送装置300は、図22のステップS228〜S234の転送処理を行わず、ステップS227の処理の直後にステップS235以降の処理を行う。
ところで、以上説明した実施形態は、根ノードにおけるFECパケットの生成と、中継ノードが階層を深くするために行うFECパケットの生成の共通点という観点から、以下のように概観することもできる。つまり、転送装置200または300のようなコンピュータが行う様々な処理のうち、FECパケットの生成に特に着目すると、上記実施形態は以下のようにまとめることもできる。
すなわち、転送装置200または300のようなコンピュータは、プログラムにしたがって、まず、複数の階層で定義される階層的なブロックのうち或る階層の同じ第1のブロックに属している複数のデータ単位を取得する。
ここで、「データ単位」の具体例は、データパケット600中のRTPペイロード606である。また、根ノードにおける「取得」は、データパケット供給部からの供給による取得であり、中継ノードにおける「取得」は、親ノード(例えば転送装置300にとっての送信元装置310)からの受信による取得である。
そして、上記「或る階層」が最上位の第1層の場合、上記「複数のデータ単位」の具体例は、データパケットD0〜D23それぞれのRTPペイロード606である。つまり、この場合の「第1のブロック」はブロックB1−1である。
また、上記「或る階層」が第2層の場合、上記「複数のデータ単位」の具体例は、データパケットD0〜D11それぞれのRTPペイロード606である。つまり、この場合の「第1のブロック」はブロックB2−1である。
また、上記「或る階層」が第3層の場合、上記「複数のデータ単位」の具体例は、データパケットD0〜D5それぞれのRTPペイロード606である。つまり、この場合の「第1のブロック」はブロックB3−1である。
また、上記「或る階層」が第3層の場合の上記「複数のデータ単位」の別の具体例は、データパケットD12〜D17それぞれのRTPペイロード606である。つまり、この場合の「第1のブロック」はブロックB3−3である。
また、コンピュータは、上記「複数のデータ単位」の排他的論理和に等しい、第1のブロックに対応する誤り訂正情報を生成する。ここで、「誤り訂正情報」の具体例は、FECパケット700のFECレベル0ペイロード709である。例えば、上記「複数のデータ単位」がデータパケットD0〜D23それぞれのRTPペイロード606の場合は、誤り訂正情報は、FECパケットF1−1のFECレベル0ペイロード709である。
さらに、コンピュータは、上記「或る階層」に連続する、上記「或る階層」よりも下の1層以上の各個別の階層において、以下の処理を行う。つまり、コンピュータは、当該個別の階層の1つ上の階層の同じブロックに含まれる当該個別の階層の2つ以上のブロックの中で、特定の1つのブロックを除く、1つ以上の個別のブロックの各々について、以下の処理を行う。具体的には、コンピュータは、上記「複数のデータ単位」のうち、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、当該個別のブロックに対応する誤り訂正情報を生成する。
好ましくは、上記の「特定の1つのブロック」は、1つ上の階層の同じブロックに含まれる2つ以上のブロックの中で、最後のブロックである。例えば、第2層における「特定の1つのブロック」の具体例は、第1層の同じブロックB1−1に含まれる第2層のブロックB2−1とB2−2のうち、最後のブロックB2−2である。よって、誤り訂正情報の生成対象である「個別のブロック」の具体例は、ブロックB2−1である。
また、第3層における「特定の1つのブロック」の具体例は、第2層の同じブロックB2−1に含まれる第3層のブロックB3−1とB3−2のうち、最後のブロックB3−2である。よって、誤り訂正情報の生成対象である「個別のブロック」の具体例は、ブロックB3−1である。
なお、メモリ消費量の増大やネットワーク転送遅延の増大が問題にならないのであれば、上記の「特定の1つのブロック」は、例えば、1つ上の階層の同じブロックに含まれる2つ以上のブロックの中の最初のブロックであってもよい。
例えば、ブロックB1−1のサブセットであるブロックB2−1とB2−2のうち、最初のブロックB2−1が「特定の1つのブロック」であってもよい。その場合、ブロックB2−2に対応してFECパケットが生成され、生成されたFECパケットがブロックB2−2の直前(つまりデータパケットD11とD12の間)に挿入される。第2層以外の他の階層についても同様である。そして、「特定の1つのブロック」が最初のブロックである場合、最上位の第1層のブロックB1−1に対応するFECパケットは、ブロックB1−1の直前(つまりデータパケットD0の直前)に挿入される。
また、コンピュータは、上記「複数のデータ単位」と、上記「第1のブロック」に対応する誤り訂正情報と、各「個別のブロック」に対応する誤り訂正情報を送信する。
以上概観したコンピュータの動作は、根ノードが第1層から第N層までのFECパケットを生成して送信することに該当する。
また、以上概観したコンピュータの動作は、中継ノードが第1層またはそれより深い階層のブロックに属する一連のデータパケットを受信し、受信したデータパケットを用いて、いくつかの階層に対応するFECパケットを生成して送信することにも該当する。中継ノードによるFECパケットの生成は、例えば、消失したFECパケットを復元するために行われる場合もあるし、階層を深くするために行われる場合もある。
また、コンピュータは、上記各「個別のブロック」に対応する誤り訂正情報を先に生成してから、それを利用して上記「第1のブロック」に対応する誤り訂正情報を生成してもよい。つまり、コンピュータは、式(4.3)にしたがって「第1のブロック」に対応する誤り訂正情報を生成してもよい。
換言すれば、コンピュータは、上記の「或る階層に連続する、或る階層よりも下の1層以上の各個別の階層」において、「第1のブロック」に含まれ、かつ対応する誤り訂正情報を生成した1つ以上のブロックのうち当該個別の階層の中では最後のブロックを認識する。そして、コンピュータは、各階層について認識した各ブロックに対応する誤り訂正情報と、上記「1層以上の個別の階層」のうちの最下層の複数のブロックのうち、「第1のブロック」に含まれ、かつ、最下層の中では最後のブロックに属する、すべてのデータ単位の排他的論理和を計算する。
例えば、「或る階層」が第1層で最下層が第3層の場合、コンピュータは、下記(S−1)〜(S−2)の排他的論理和を計算することで、誤り訂正情報としての、FECパケットF1−1のFECレベル0ペイロード709を生成する。
(S−1)ブロックB2−1に対応するFECパケットF2−1とブロックB3−3に対応するFECパケットF3−2それぞれのFECレベル0ペイロード709。
(S−2)ブロックB1−1に含まれ第3層の中では最後のブロックB3−4に属するデータパケットD18〜D23それぞれのRTPペイロード606。
もちろん、コンピュータは、生成済みのより下層のブロックに対応する誤り訂正情報を利用しなくてもよい。つまり、コンピュータは、「第1のブロック」(例えばブロックB1−1)に属するすべてのデータ単位を用いて、それらすべてのデータ単位の排他的論理和を計算することにより、「第1のブロック」に対応する誤り訂正情報を生成してもよい。
さて、以上の概観は、誤り訂正情報の生成に着目して根ノードと中継ノードの共通点を述べたものだが、逆に、中継ノードと葉ノードの共通点という観点から上記実施形態を概観すれば、下記のとおりである。
すなわち、転送装置200または300のようなコンピュータは、プログラムにしたがって、複数の階層で定義される階層的なブロックのうちで、或る階層の第1のブロックに属する複数のデータ単位の一部または全部を受信する。ここでの「或る階層」は、例えば第1層の場合もあるし、それより深い第2層や第3層の場合もある。
また、コンピュータは、上記「或る階層」が、決められた最下層よりも上の階層の場合は、「或る階層」よりも下の、最下層までの各階層についても誤り訂正情報を受信する。例えば、「或る階層」が第1層で最下層が第3層ならば、コンピュータは第2層と第3層についての誤り訂正情報を受信する。
具体的には、各階層について受信される誤り訂正情報とは、当該階層の1つ上の階層の同じブロックに含まれる当該階層の2つ以上のブロックの中で、最後の1つのブロックを除く、当該階層の1つ以上の個別のブロックの各々に対応する。かつ、各階層について受信される誤り訂正情報とは、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい。
例えば、第2層について受信される誤り訂正情報の例としてのFECパケットF2−1(のFECレベル0ペイロード709)は、第1層の同じブロックB1−1に含まれるブロックB2−1とB2−2のうち、最後ではない方のブロックB2−1に対応する。そして、FECパケットF2−1のFECレベル0ペイロード709は、ブロックB2−1に属するすべてのデータパケットD0〜D11それぞれのRTPペイロード606の排他的論理和に等しい。
また、コンピュータは、上記「第1のブロック」に対応しており、かつ、「第1のブロック」に属する複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報を受信する。例えば、「第1のブロック」がブロックB1−1の場合、コンピュータは、誤り訂正情報としてのFECレベル0ペイロード709を含むFECパケットF1−1を受信する。また、「第1のブロック」がブロックB2−1の場合、コンピュータは、誤り訂正情報としてのFECレベル0ペイロード709を含むFECパケットF2−1を受信する。
そして、コンピュータは、上記「第1のブロック」に属する複数のデータ単位のうち、受信することができなかった消失データ単位があるか否かを判断し、消失データ単位があれば排他的論理和の計算により消失データ単位を復元する。復元は、具体的には以下のように行われる。
上記「或る階層」が最下層の場合、コンピュータは、最下層のブロックでもある「第1のブロック」に属するデータ単位のうち、受信することができたすべてのデータ単位と、「第1のブロック」に対応する誤り訂正情報の排他的論理和を計算する。消失データ単位は、排他的論理和の計算により復元される。
例えば、図24の例において、「或る階層」が最下層の第3層であり、「第1のブロック」がブロックB3−1であるとする。図24の例では、ブロックB3−1に属するデータパケットD2が消失している。この場合、コンピュータは、下記(T−1)〜(T−2)の排他的論理和を計算することで、「消失データ単位」(つまりデータパケットD2のRTPペイロード606)を復元する。
(T−1)ブロックB3−1に属するデータパケットD0、D1、D3〜D5それぞれのRTPペイロード606。
(T−2)ブロックB3−1に対応するFECパケットF3−1のFECレベル0ペイロード709。
また、最下層において消失データ単位が属する「最下層ブロック」が、最下層における、上記の「2つ以上のブロックの中で、最後の1つのブロック」である場合、コンピュータは、以下の2通りの方法のいずれかにより消失データ単位を復元する。
第1の方法では、コンピュータは、下記(U−1)〜(U−2)の排他的論理和を計算することで消失データ単位を復元する。
(U−1)上記「或る階層」から最下層までの各階層において、上記「第1のブロック」に含まれ、かつ、対応する誤り訂正情報を受信した1つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの誤り訂正情報。
(U−2)上記「最下層ブロック」に属する1つ以上のデータ単位のうち、受信することができたすべてのデータ単位。
例えば、図24の例において、「或る階層」が第2層であり、「第1のブロック」がブロックB2−1であるとする。この場合、「第1のブロックに含まれ、かつ、対応する誤り訂正情報を受信した1つ以上のブロックのうち、同じ階層の中では最後のブロック」とは、ブロックB2−1自体と、第3層のブロックB3−1である。
また、図24の例では、ブロックB2−1に属するデータパケットD8が消失している。そして、消失したデータパケットD8が最下層の第3層において属する最下層ブロックは、ブロックB3−2である。
よって、コンピュータは、下記(V−1)〜(V−2)の排他的論理和を計算することで、「消失データ単位」(つまりデータパケットD8のRTPペイロード606)を復元する。
(V−1)ブロックB3−1とB2−1にそれぞれ対応するFECパケットF3−1とF2−1それぞれのFECレベル0ペイロード709。
(V−2)ブロックB3−2に属するデータパケットD6、D7、D9〜D11それぞれのRTPペイロード606の排他的論理和を計算する。
あるいは、図24の例において、「或る階層」が第1層であり、「第1のブロック」がブロックB1−1であるとする。この場合、「第1のブロックに含まれ、かつ、対応する誤り訂正情報を受信した1つ以上のブロックのうち、同じ階層の中では最後のブロック」とは、ブロックB1−1自体と、第2層のブロックB2−1と、第3層のブロックB3−3である。
また、図24の例では、ブロックB1−1に属するデータパケットD19が消失している。そして、消失したデータパケットD19が最下層の第3層において属する最下層ブロックは、ブロックB3−4である。
よって、コンピュータは、下記(W−1)〜(W−2)の排他的論理和を計算することで、「消失データ単位」(つまりデータパケットD19のRTPペイロード606)を復元する。
(W−1)ブロックB2−1とB3−3とB1−1にそれぞれ対応するFECパケットF2−1とF3−2とF1−1それぞれのFECレベル0ペイロード709。
(W−2)ブロックB3−4に属するデータパケットD18、D20〜23それぞれのRTPペイロード606。
つまり、消失データ単位がある場合、消失データ単位の後の最初の誤り訂正情報に対応する階層を上記「或る階層」と見なすことにより、図20〜25を参照して説明した実施形態における復元は、上記のように一般化することができる。
例えば、図24のとおり、ブロックB1−1の受信が完了する前に、ブロックB1−1のサブセットであるブロックB2−1の受信は、当然、完了する。よって、消失したデータパケットD8を除くブロックB2−1と、ブロックB2−1に対応するFECパケットF2−1の受信が完了すると、上記コンピュータは、「或る階層」が第2層で「第1のブロック」がブロックB2−1の場合の処理を行うことができる。その結果、ブロックB2−1とFECパケットF2−1の受信が完了した段階で、データパケットD8は復元される。
つまり、データパケットD8は確かに第1層においてブロックB1−1に属するが、データパケットD8の復元は、「或る階層」が第1層で「第1のブロック」がブロックB1−1の場合の処理をコンピュータが開始する前に既に終わっている。よって、上記で概観したコンピュータの動作では、「或る階層」が第1層で「第1のブロック」がブロックB1−1の場合については、復元済みのデータパケットD8のRTPペイロード606が「消失データ単位」に当たらないことが暗黙に仮定されるものとする。
他方、データパケットD19は第2層ではブロックB2−2に属し、ブロックB2−2は1つ上の第1層のブロックB1−1に含まれる第2層のブロックの中では最後のブロックである。よって、ブロックB2−2の受信が完了する段階では、当然、ブロックB1−1の受信も完了する。したがって、第2層においてブロックB2−2に属するデータパケットD19の復元は、「或る階層」が第1層で「第1のブロック」がブロックB1−1の場合のコンピュータの動作として実現される。
また、最下層において消失データ単位が属する「最下層ブロック」が、最下層における、上記の「2つ以上のブロックの中で、最後の1つのブロック」である場合の、消失データ単位の復元のための第2の方法は、以下のとおりである。
第2の方法では、コンピュータは、受信によって取得したか、既に行った復元によって取得した、上記「第1のブロック」に属する、消失データ単位以外のすべてのデータ単位と、「第1のブロック」に対応する誤り訂正情報の排他的論理和を計算する。この排他的論理和の計算により、消失データ単位は復元される。
例えば、図24の例において、「或る階層」が第1層で「第1のブロック」がブロックB1−1とする。この場合、コンピュータは、次のようにして、消失したデータパケットD19のRTPペイロード606を復元してもよい。
つまり、コンピュータは、下記(X−1)〜(X−3)の排他的論理和を計算することにより、「消失データ単位」(つまりデータパケットD19のRTPペイロード606)を復元してもよい。
(X−1)受信によって取得したデータパケットD0、D1、D3〜D7、D9〜D18、D20〜D23それぞれのRTPペイロード606。
(X−2)復元により取得したデータパケットD2、D8それぞれのRTPペイロード606。
(X−3)FECパケットF1−1のFECレベル0ペイロード709。
また、消失データ単位を上記のようにして復元したコンピュータは、受信または復元により取得した、上記「第1のブロック」に属するすべてのデータ単位を、送信先装置に送信してもよい。つまり、コンピュータは、中継ノードとして動作してもよい。なお、データ単位の送信の際、コンピュータは、適宜の割合でデータ単位同士の間に誤り訂正情報を挿入して、誤り訂正情報も送信先装置に送信する。
具体的には、中継ノードとして動作するコンピュータは、送信先装置と当該コンピュータ自身との間の通信路に対応する階層情報を取得する。階層情報の具体例は、例えば、配信先管理テーブル400の階層フィールドの値である。また、階層情報は、例えば初期値は所定のデフォルト値でもよいが、送信先装置から適宜の頻度で動的に指定されることが好ましい。
そして、コンピュータは、上記「或る階層」から最下層までの階層のうちで、階層情報が表す指定階層と同じか指定階層より上の各階層のいずれかのブロックに対応する誤り訂正情報のすべてを、送信先装置に送信する。
例えば、「或る階層」が第1層、最下層が第3層、指定階層が第2層の場合、コンピュータは、第1層または第2層のいずれかのブロックに対応する誤り訂正情報をすべて送信する。例えば、「或る階層」の上記「第1のブロック」がブロックB1−1の場合、コンピュータは、下記(Y−1)と(Y−2)を送信する。
(Y−1)ブロックB1−1に対応する誤り訂正情報をFECレベル0ペイロード709として含むFECパケットF1−1。
(Y−2)ブロックB2−1に対応する誤り訂正情報をFECレベル0ペイロード709として含むFECパケットF2−1。
また、最下層よりも指定階層の方が下の階層である場合に、最下層よりも下であり、かつ指定階層と同じか指定階層より上の各階層について、上記「第1のブロック」の範囲内で、コンピュータは誤り訂正情報を生成する。具体的には、コンピュータは、誤り訂正情報の生成対象である当該階層の1つ上の階層の同じブロックに含まれる当該階層の2つ以上のブロックの中で、最後の1つのブロックを除く、当該階層の1つ以上の個別のブロックの各々に対応する誤り訂正情報を生成する。生成される誤り訂正情報は、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい。また、コンピュータは以上のようにして生成した誤り訂正情報を送信先装置に送信する。
例えば、最下層が第2層、指定階層が第4層の場合、コンピュータは、第3層と第4層について誤り訂正情報を生成する。例えば、上記「或る階層」が第1層であり「第1のブロック」がブロックB1−1の場合、コンピュータは、第3層に関する誤り訂正情報として、FECパケットF3−1とF3−2それぞれのFECレベル0ペイロード709を生成する。また、コンピュータは、第4層に関しする誤り訂正情報として、FECパケットF4−1、F4−2、F4−3、およびF4−4それぞれのFECレベル0ペイロード709を生成する。
なお、本発明は上記実施形態に限られるものではなく、上記実施形態は様々に変形可能である。以下に、上記実施形態を変形するいくつかの観点を例示する。例えば、上記実施形態は、下記の観点から様々に変形することができ、これらの変形は、相互に矛盾しない限り、任意に組み合わせることが可能である。
変形の第1の観点は、送信されるデータの種類とパケットの形式に関する。上記実施形態では、具体例としてRTPパケットにより送信されるMPEG2データを例示したが、送信されるデータの種類(つまりデータパケットのペイロードの内容)は任意である。例えば、ストリーミング配信のためのALMではなく、ファイル共有のためにデータパケットのマルチキャストが行われてもよい。
また、図15〜17に示したパケットの形式も一例に過ぎない。実施形態によっては、RTPが使われなくてもよい。また、実施形態によってはUDPの代わりにTCP(Transmission Control Protocol)が使われてもよいことも無論である。
例えば、RFC5109で定義される既存のプロトコルを拡張する代わりに、独自のプロトコルが使われてもよい。独自のプロトコルは、例えば、UDPまたはTCPの上位レイヤのプロトコルとして定義されてもよい。
独自のプロトコルのヘッダは、データパケットとFECパケットを区別するための情報を格納するフィールドを含む。データパケットとFECパケットを区別するための情報は、例えば、1ビットのフラグでもよいし、RTPヘッダ中のペイロードタイプフィールドのように、1ビットよりも長いフィールドでもよい。また、FECパケットにおいては、独自プロトコルのヘッダはさらに、FECパケットの階層を示す情報と、FECパケットと関連しているデータパケットを識別するための情報を含む。
そして、データパケットは、上記のような独自プロトコルのヘッダに続けて、任意の種類のペイロードを含む。また、FECパケットは、上記のような独自プロトコルのヘッダに続けて、対応する複数のデータパケットのペイロードの排他的論理和を、ペイロードとして含む。
変形の第2の観点は、図15〜17のパケット形式の拡張に関する。図15の例では、レベル0しか使われないが、複数のレベルへの拡張が行われてもよい。一般に、ストリーミングデータではペイロードの先頭に近いほど重要な情報が含まれることが多い。そこで、RFC5109は、ペイロードの先頭に近いほどより多くのFECデータにより保護されるようにするための、複数のレベルの使用についても規定している。
例えば、データパケット600のRTPペイロード606の先頭からL0バイトをレベル0で保護し、残りのL1バイトをレベル1で保護するように、上記実施形態が拡張されてもよい。例えば、階層的なブロックが図1と同様に定義され、かつ、転送装置300にとっての最下層が第N層であるとする。すると、RTPペイロード606の先頭からL0バイトを第N層までのFECパケットにより保護し、残りのL1バイトを(N−1)層までのFECパケットにより保護する実施形態が可能である。
例えば、N=3とする。この場合、ブロックB3−1に対応するFECパケットは、ブロックB3−1に属するデータパケットD0〜D5それぞれのRTPペイロード606の先頭からL0バイトの排他的論理和を、FECレベル0ペイロード709として含む。しかし、最下層のブロックB3−1に対応するFECパケットは、FECレベル1ヘッダとFECレベル1ペイロードを含まない。
また、ブロックB3−3に対応するFECパケットは、ブロックB3−3に属するデータパケットD12〜D17それぞれのRTPペイロード606の先頭からL0バイトの排他的論理和を、FECレベル0ペイロード709として含む。しかし、ブロックB3−3に対応するFECパケットは、FECレベル1ヘッダとFECレベル1ペイロードを含まない。
また、ブロックB2−1に対応するFECパケットは、ブロックB2−1に属するデータパケットD0〜D11それぞれのRTPペイロード606の先頭からL0バイトの排他的論理和を、FECレベル0ペイロード709として含む。さらに、ブロックB2−1に対応するFECパケットは、ブロックB2−1に属するデータパケットD0〜D11それぞれのRTPペイロード606の残りのL1バイトの排他的論理和を、FECレベル1ペイロードとして含む。
そして、ブロックB1−1に対応するFECパケットは、ブロックB1−1に属するデータパケットD0〜D23それぞれのRTPペイロード606の先頭からL0バイトの排他的論理和を、FECレベル0ペイロード709として含む。さらに、ブロックB1−1に対応するFECパケットは、ブロックB1−1に属するデータパケットD0〜D23それぞれのRTPペイロード606の残りのL1バイトの排他的論理和を、FECレベル1ペイロードとして含む。
以上のように、データパケット600のRTPペイロード606のうち、レベルp(0≦p)に該当する部分の排他的論理和が、第1層から第(N−p)層までの各ブロックに対応するFECパケット700のFECレベルpペイロードに設定されてもよい。
変形の第3の観点は、上記の仮定(O−1)に関する。転送装置300は、上記実施形態のようにパケットを受信して格納するとすぐにステップS202以降の処理を行う代わりに、受信したパケットを或る程度の期間にわたってバッファ部302に蓄積してから、ステップS202以下の処理を開始してもよい。すると制御パケットを使わずに仮定(O−1)を成立させることも可能である。
上記の「或る程度の期間」は、例えば、第N層(つまり最下層)のブロックに対応する最初のFECパケットが受信されるまでの時間であってもよい。例えば、転送装置300は、データパケットD0〜D5を受信する間は、単に受信したデータパケットD0〜D5をバッファ部302に蓄積するだけでもよい。
そして、転送装置300は、第3層の初めてのFECパケットF3−1の受信を契機として、ストリームの先頭のデータパケットD0のシーケンス番号を認識し、蓄積済みのパケットについてのステップS202以下の処理を開始してもよい。例えば、転送装置300は、FECパケットF3−1のSBベースフィールドの値を、ストリームの先頭のデータパケットD0のシーケンス番号として認識することができる。
なお、以上のように転送装置300がしばらくパケットを蓄積してから蓄積済みのパケットの処理を開始する実施形態では、パケットの順序が送信時とは多少入れ替わって受信されても、入れ替わりの影響が或る程度は吸収されるという効果も得られる。
変形の第4の観点は、バースト的な消失に関する。上記実施形態に関しては、主にFECパケットの階層化という観点から説明した。そのため、いくつかの例外処理については、一部説明を省略した。実施形態によっては、転送装置300は、上記実施形態では説明を省略した例外処理をさらに行ってもよい。
例えば、第N層の1つのブロックの全体にわたってパケットが消失したり、あるいはさらに大きな範囲にわたって、連続するパケットがバースト的に消失したりすることがあり得る。バースト的なパケットロスに備えて、転送装置300は、例えば、パケットの受信が途絶した時間が所定の閾値を超えると、次に何らかのパケットを受信するまで待たずに、送信元装置310に再送を要求してもよい。
変形の第5の観点は、再送要求の省略に関する。実施形態によっては、ステップS210やS219の再送要求が適宜省略されてもよい。つまり、転送装置300は、第N層のブロックのデータパケットがすべて揃わなくても、ステップS222〜S237の処理を行ってもよい。
例えば、動画または音声のデータの一部が欠けても、動画または音声を視聴する人間はデータの欠落に気付かないことがある。よって、ペイロードの種類によっては、必ずしもすべてのデータパケットが揃わなくてもよい場合がある。
そして、どの深さまでの階層に対応するFECパケットを送信元装置310が転送装置300に送信するかということは、図20のステップS222〜S226の処理により、調整され、やがては誤り訂正後の許容エラー率Aに応じて適切に収束する。すると、収束後は、たとえ或るデータパケットが復元不能だったとしても、復元不能なデータパケットの割合は、誤り訂正後の許容エラー率A以下である。よって、実施形態によっては、再送要求が省略されてもよい。
変形の第6の観点は、転送装置300がFECパケットの増加または削減を送信元装置310に要求する頻度に関する。図20の実施形態では、転送装置300は、第N層(最下層)のブロックごとに1回、層の深さが適切か否かを検証し、必要に応じてFECパケットの増加または削減を送信元装置310に要求する。しかし、要求の頻度は、実施形態に応じて任意である。
例えば、実施形態によっては、上記の「第N層のブロックごとに1回」という頻度の代わりに、「第1層のM個(1≦M)のブロックごとに1回」という頻度が採用されてもよい。
変形の第7の観点は、中継ノードとして動作する転送装置300がパケットを転送するタイミングに関する。図20の実施形態では、転送装置300は、受信したパケットを即座に転送するのではなく、バッファ部302に蓄積し、第N層の1つのブロックのすべてのデータパケットが揃ってからパケットの転送を行う。そのため、第N層のブロックサイズに対応する転送遅延が生じる。
しかし、転送装置300が受信したパケットをバッファ部302に蓄積する時間の長さは、実施形態に応じて任意である。例えば、転送装置300は、送信元装置310から受信したデータパケットを即座に各送信先装置320に転送してもよい。その場合、転送装置300は、転送済みのデータパケットをすぐには廃棄せず、第N層で同じブロックに属する他のデータパケットの消失に備えて、バッファ部302に保持する。
変形の第8の観点は、エラーレート(つまりパケット消失率)から第1または第2の階層情報を取得する方法に関する。
例えば、送信先装置320がエラーレート自体を取得部305に通知する場合、取得部305は、式(20.7)とブロック管理テーブル500のブロックサイズの定義にしたがって適切な階層の深さを計算し、計算結果を第1の階層情報として取得してもよい。あるいは、指示部308は、エラーレートから、式(20.7)とブロック管理テーブル500のブロックサイズの定義にしたがって適切な階層の深さを計算し、計算結果を第2の階層情報として送信元装置310に通知してもよい。
しかし、取得部305と指示部308は、計算を行う代わりに、例えば、エラーレートの下限値とエラーレートの上限値と階層の深さとを関連付けて記憶するテーブルを参照することにより、階層情報を取得することもできる。
例えば、指示部308は、テーブルを検索して、送信元装置310と転送装置300の間のリンクのエラーレートを含む範囲を下限値と上限値の組により表すエントリを特定する。そして、指示部308は、特定したエントリに記憶されている階層を第2の階層情報として取得し、取得した第2の階層情報を送信元装置310に送信する。
もちろん、取得部305も同様にして、計算を行う代わりにテーブルを参照することにより、第1の階層情報を取得することができる。また、テーブル中の各エントリの値は、例えば誤り訂正後に許容されるエラーレートなどに基づいて、予め設定されているものとする。
変形の第9の観点は、転送装置300が保持するデータの形式に関する。例えば図13と図14にテーブル形式でデータを例示したが、テーブル以外の任意のデータ形式(例えばアレイや線形リストなど)が利用可能である。
変形の第10の観点は、誤り訂正情報の生成と、誤り訂正情報を用いた復元でそれぞれ用いる関数に関する。上記実施形態では、誤り訂正情報の生成と、誤り訂正情報を用いた復元の双方において、排他的論理和の計算が行われる。しかし、実施形態によっては、他の関数が使われてもよい。
ここで、説明の便宜上、uiをデータ単位とする。つまり、uiは何らかのビット列であり、具体的には例えばデータパケットのペイロードである。
また、データ単位の集合{ui|0≦i<n}から誤り訂正情報を計算する関数fは、式(A.1)のように表すことができる。
f({ui|0≦i<n}) (A.1)
そして、消失したデータ単位uj(∀j,0≦j<n)を復元する関数gは、式(A.2)のように表すことができる。
uj=g({ui|0≦i<n, i≠j}∪{f({ui|0≦i<n})}) (A.2)
関数fとgは、下記の式(A.3)と(A.4)を満たすものであれば、任意である。なお、式(A.3)と(A.4)における集合S1とS2は、データ単位を要素とする非空の集合とする。
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)
上記の各実施形態は、集合Sに対してf(S)が「集合Sの各要素同士の排他的論理和をとる関数」と定義され、かつ、g(S)が同じく「集合Sの各要素同士の排他的論理和をとる関数」と定義された例である。このように定義された関数fが式(A.3)を満たすことは、例えば、集合(S1∪S2)がブロックB1−1であり、集合S1がブロックB2−1である場合の例などから、理解されるだろう。また、このように定義された関数gが式(A.4)を満たすことは、例えば集合(S1∪S2∪{uj})がブロックB1−1であり、集合S1がブロックB2−1とB3−2をあわせた全体またはブロックB2−1である場合の例などから、理解されるだろう。
最後に、上記の種々の実施形態に関して、さらに下記の付記を開示する。
(付記1)
コンピュータに、
複数の階層で定義される階層的なブロックのうち或る階層の同じ第1のブロックに属している複数のデータ単位を取得し、
前記複数のデータ単位の排他的論理和に等しい、前記第1のブロックに対応する誤り訂正情報を生成し、
前記或る階層に連続する、前記或る階層よりも下の1層以上の各個別の階層において、
当該個別の階層の1つ上の階層の同じブロックに含まれる当該個別の階層の2つ以上のブロックの中で、特定の1つのブロックを除く、1つ以上の個別のブロックの各々について、前記複数のデータ単位のうち、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、当該個別のブロックに対応する誤り訂正情報を生成し、
前記複数のデータ単位を送信し、
前記第1のブロックに対応する前記誤り訂正情報を送信し、
前記個別のブロックの各々に対応する前記誤り訂正情報を送信する
ことを含む処理を実行させるプログラム。
(付記2)
前記特定の1つのブロックは、前記2つ以上のブロックの中で最後の1つのブロックであり、
前記処理における、前記第1のブロックに対応する前記誤り訂正情報の生成は、
前記1層以上の各個別の階層において、前記第1のブロックに含まれ、かつ、対応する前記誤り訂正情報を生成した1つ以上のブロックのうち当該個別の階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記1層以上の個別の階層のうちの最下層の複数のブロックのうち、前記第1のブロックに含まれ、かつ、前記最下層の中では最後のブロックに属する、すべてのデータ単位と
の排他的論理和を計算することを含む
ことを特徴とする付記1に記載のプログラム。
(付記3)
前記処理における、前記第1のブロックに対応する前記誤り訂正情報の生成は、
前記第1のブロックに属する前記複数のデータ単位をすべて用いて、前記複数のデータ単位の排他的論理和を計算することを含む
ことを特徴とする付記1に記載のプログラム。
(付記4)
前記複数の階層のうち最下層以外の各階層の各ブロックは、1つ下の階層のブロックを2つずつ含む
ことを特徴とする付記1から3のいずれか1項に記載のプログラム。
(付記5)
コンピュータに、
複数の階層で定義される階層的なブロックのうちで、或る階層の第1のブロックに属する複数のデータ単位の一部または全部を受信し、
前記或る階層が、決められた最下層よりも上の階層の場合は、前記或る階層よりも下の、前記最下層までの各階層について、前記第1のブロックの範囲内において、
当該階層の1つ上の階層の同じブロックに含まれる当該階層の2つ以上のブロックの中で、最後の1つのブロックを除く、当該階層の1つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を受信し、
前記第1のブロックに対応しており、かつ、前記第1のブロックに属する前記複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報を受信し、
前記第1のブロックに属する前記複数のデータ単位のうち、受信することができなかった消失データ単位があるか否かを判断し、
前記消失データ単位があり、かつ、前記或る階層が前記最下層の場合は、
前記第1のブロックに属するデータ単位のうち受信することができたすべてのデータ単位と、
前記第1のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
前記消失データ単位があり、かつ、前記最下層において前記消失データ単位が属する最下層ブロックが、前記最下層における前記2つ以上のブロックの中の前記最後の1つのブロックである場合は、
前記或る階層から前記最下層までの各階層において、前記第1のブロックに含まれ、かつ、対応する前記誤り訂正情報を受信した1つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層ブロックに属する1つ以上のデータ単位のうち受信することができたすべてのデータ単位と
の排他的論理和を計算することにより、前記消失データ単位を復元するか、または、
受信によって取得したか、もしくは既に行った復元によって取得した、前記第1のブロックに属する、前記消失データ単位以外のすべてのデータ単位と、
前記第1のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元する
処理を実行させるプログラム。
(付記6)
送信先装置と前記コンピュータとの間の通信路に対応する階層情報を取得し、
受信または復元により取得した、前記第1のブロックに属する前記複数のデータ単位を、前記送信先装置に送信し、
前記或る階層から前記最下層までの階層のうちで、前記階層情報が表す指定階層と同じか前記指定階層より上の各階層のいずれかのブロックに対応する前記誤り訂正情報のすべてを、前記送信先装置に送信する
ことを、さらに前記処理が含むことを特徴とする付記5に記載のプログラム。
(付記7)
前記最下層よりも前記指定階層の方が下の階層である場合に、前記最下層よりも下であり、かつ前記指定階層と同じか前記指定階層より上の各階層について、前記第1のブロックの範囲内で、
当該階層の1つ上の階層の同じブロックに含まれる当該階層の2つ以上のブロックの中で、最後の1つのブロックを除く、当該階層の1つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を生成し、
生成した前記誤り訂正情報を前記送信先装置に送信する
ことを、さらに前記処理が含むことを特徴とする付記6に記載のプログラム。
(付記8)
通信装置であって、
送信元装置から
複数の階層で定義される階層的なブロックのうちで、或る階層の第1のブロックに属する複数のデータ単位の一部または全部と、
前記或る階層が、決められた最下層よりも上の階層の場合は、前記或る階層よりも下の、前記最下層までの各階層についての、前記第1のブロックの範囲内での、
当該階層の1つ上の階層の同じブロックに含まれる当該階層の2つ以上のブロックの中で、最後の1つのブロックを除く、当該階層の1つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報と、
前記第1のブロックに対応しており、かつ、前記第1のブロックに属する前記複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報と
を受信する受信部と、
前記第1のブロックに属する前記複数のデータ単位のうち、前記受信部により受信されなかった消失データ単位があるか否かを判断する判断部と、
前記消失データ単位を復元する復元部であって、
前記消失データ単位があり、かつ、前記或る階層が前記最下層の場合は、
前記第1のブロックに属するデータ単位のうち、前記受信部が受信することのできたすべてのデータ単位と、
前記第1のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
前記消失データ単位があり、かつ、前記最下層において前記消失データ単位が属する最下層ブロックが、前記最下層における前記2つ以上のブロックの中の前記最後の1つのブロックである場合は、
前記或る階層から前記最下層までの各階層において、前記第1のブロックに含まれ、かつ、対応する前記誤り訂正情報を前記受信部が受信した1つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層ブロックに属する1つ以上のデータ単位のうち、前記受信部が受信することのできたすべてのデータ単位と
の排他的論理和を計算することにより、前記消失データ単位を復元するか、または、
前記受信部における受信によって取得したか、もしくは前記復元部が既に行った復元によって取得した、前記第1のブロックに属する、前記消失データ単位以外のすべてのデータ単位と、
前記第1のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元する
ことを特徴とする前記復元部と、
前記通信装置と送信先装置との間の第1の通信路に対応する第1の階層情報を取得する取得部と、
前記第1の階層情報が表す指定階層の方が、前記最下層よりも下の階層である場合に、前記最下層よりも下であり、かつ前記指定階層と同じか前記指定階層より上の各階層について、前記第1のブロックの範囲内で、
当該階層の1つ上の階層の同じブロックに含まれる当該階層の2つ以上のブロックの中で、最後の1つのブロックを除く、当該階層の1つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を生成する
生成部と、
前記送信先装置に、
前記受信部により全部が受信されたか、または前記復元部による復元によって全部が揃った、前記第1のブロックに属する前記複数のデータ単位と、
前記或る階層から前記最下層までの階層のうちで、前記指定階層と同じか前記指定階層より上の各階層のいずれかのブロックに対応する前記誤り訂正情報のすべてと、
前記最下層よりも前記指定階層の方が下の階層である場合は、さらに、前記生成部が生成した前記誤り訂正情報と
を送信する送信部
を備えることを特徴とする通信装置。
(付記9)
前記第1の階層情報は、前記第1の通信路におけるデータ単位の第1の消失率が大きいほど下の階層を前記指定階層として示す情報であり、
前記取得部は、前記送信先装置から前記第1の階層情報を受信し、
前記通信装置はさらに、
前記判断部による判断にしたがって、前記通信装置と前記送信元装置との間の第2の通信路におけるデータ単位の第2の消失率を認識し、
前記第2の消失率で消失するデータ単位に対しては、前記最下層の各ブロックごとに1回の割合での前記誤り訂正情報の挿入では、決められた訂正性能が得られない場合、
前記最下層よりも下の第1の特定の階層であって、前記第1の特定の階層の各ブロックごとに1回の割合で前記誤り訂正情報が挿入されれば、前記第2の消失率で消失するデータ単位に対しても前記訂正性能が得られる、前記第1の特定の階層を、前記第2の消失率から認識し、
前記第1の特定の階層を表す値を第2の階層情報として前記送信元装置に指示し、
前記第2の消失率で消失するデータ単位に対しては、前記最下層よりも上の第2の特定の階層の各ブロックごとに1回の割合で前記誤り訂正情報が挿入されれば前記訂正性能が得られる場合、
前記第2の消失率から前記第2の特定の階層を認識し、
前記第2の特定の階層を表す値を前記第2の階層情報として前記送信元装置に指示する、
指示部を備えることを特徴とする付記8に記載の通信装置。
(付記10)
前記第1の階層情報は、前記第1の通信路におけるデータ単位の第1の消失率が大きいほど下の階層を前記指定階層として示す情報であり、
前記判断部による判断にしたがって、前記通信装置と前記送信元装置との間の第2の通信路におけるデータ単位の第2の消失率を認識し、前記第2の消失率を前記送信元装置に指示する指示部を前記通信装置はさらに備え、
前記取得部は、
前記第1の消失率を前記送信先装置から受信し、
前記第1の消失率で消失するデータ単位に対しては、前記最下層の各ブロックごとに1回の割合での前記誤り訂正情報の挿入では、決められた訂正性能が得られない場合、
前記最下層よりも下の第3の特定の階層であって、前記第3の特定の階層の各ブロックごとに1回の割合で前記誤り訂正情報が挿入されれば、前記第1の消失率で消失するデータ単位に対しても前記訂正性能が得られる、前記第3の特定の階層を、前記第1の消失率から認識し、
前記第3の特定の階層を表す値を前記第1の階層情報として取得し、
前記第1の消失率で消失するデータ単位に対しては、前記最下層よりも上の第4の特定の階層の各ブロックごとに1回の割合で前記誤り訂正情報が挿入されれば前記訂正性能が得られる場合、
前記第1の消失率から前記第4の特定の階層を認識し、
前記第4の特定の階層を表す値を前記第1の階層情報として取得する
ことを特徴とする付記8に記載の通信装置。
(付記11)
コンピュータが、
複数の階層で定義される階層的なブロックのうち或る階層の同じ第1のブロックに属している複数のデータ単位を取得し、
前記複数のデータ単位の排他的論理和に等しい、前記第1のブロックに対応する誤り訂正情報を生成し、
前記或る階層に連続する、前記或る階層よりも下の1層以上の各個別の階層において、
当該個別の階層の1つ上の階層の同じブロックに含まれる当該個別の階層の2つ以上のブロックの中で、特定の1つのブロックを除く、1つ以上の個別のブロックの各々について、前記複数のデータ単位のうち、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、当該個別のブロックに対応する誤り訂正情報を生成し、
前記複数のデータ単位を送信し、
前記第1のブロックに対応する前記誤り訂正情報を送信し、
前記個別のブロックの各々に対応する前記誤り訂正情報を送信する
ことを特徴とする方法。
(付記12)
コンピュータが、
複数の階層で定義される階層的なブロックのうちで、或る階層の第1のブロックに属する複数のデータ単位の一部または全部を受信し、
前記或る階層が、決められた最下層よりも上の階層の場合は、前記或る階層よりも下の、前記最下層までの各階層について、前記第1のブロックの範囲内において、
当該階層の1つ上の階層の同じブロックに含まれる当該階層の2つ以上のブロックの中で、最後の1つのブロックを除く、当該階層の1つ以上の個別のブロックの各々に対応しており、かつ、当該個別のブロックに属するすべてのデータ単位の排他的論理和に等しい、誤り訂正情報を受信し、
前記第1のブロックに対応しており、かつ、前記第1のブロックに属する前記複数のデータ単位すべての排他的論理和に等しい、誤り訂正情報を受信し、
前記第1のブロックに属する前記複数のデータ単位のうち、受信することができなかった消失データ単位があるか否かを判断し、
前記消失データ単位があり、かつ、前記或る階層が前記最下層の場合は、
前記第1のブロックに属するデータ単位のうち受信することができたすべてのデータ単位と、
前記第1のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元し、
前記消失データ単位があり、かつ、前記最下層において前記消失データ単位が属する最下層ブロックが、前記最下層における前記2つ以上のブロックの中の前記最後の1つのブロックである場合は、
前記或る階層から前記最下層までの各階層において、前記第1のブロックに含まれ、かつ、対応する前記誤り訂正情報を受信した1つ以上のブロックのうち、同じ階層の中では最後のブロックに対応する、それぞれの前記誤り訂正情報と、
前記最下層ブロックに属する1つ以上のデータ単位のうち受信することができたすべてのデータ単位と
の排他的論理和を計算することにより、前記消失データ単位を復元するか、または、
受信によって取得したか、もしくは既に行った復元によって取得した、前記第1のブロックに属する、前記消失データ単位以外のすべてのデータ単位と、
前記第1のブロックに対応する前記誤り訂正情報と
の排他的論理和を計算することにより、前記消失データ単位を復元する
ことを特徴とする方法。