以下に添付図面を参照して、この受信装置の好適な実施の形態を詳細に説明する。以下の各実施例の説明においては、同様の構成要素には同一の符号を付して、重複する説明を省略する。
・受信装置の一例
図1は、実施の形態にかかる受信装置の一例を示す図である。図1には、受信装置において、分割後の受信データから元のデータを再構成する処理を行う処理部が示されている。
図1に示すように、受信装置1は、第1の格納部2、制御部3、第2のデータ領域4、第1のデータ領域5、記憶領域6及び第2の格納部7を有する。受信装置1は、連続するパケットを通信するシステムにおいて、受信可能なパケット数を制限するウィンドウを使用する自動再送要求を用いてデータを受信する。
第1の格納部2は、例えば図示省略する受信部から、受信部が受信するパケットのデータを受け取る。受信部は、例えば連続するパケットを通信するシステムにおいて自動再送要求に対応する送信装置から送信されるパケットのデータを受信する。送信装置は、送信対象のデータを複数のパケットに分割し、各パケットのデータに順番を示すシーケンス番号を付与して送信する。第1の格納部2は、受信部から受け取るパケットのデータを格納する。
第2のデータ領域4は、受信待ちを示すシーケンス番号、及びインデックス番号を保持する。受信待ちを示すシーケンス番号は、受信装置1が次に受信するのを期待するデータのシーケンス番号である。インデックス番号は、記憶領域6の先頭位置を示す番号である。インデックス番号によって示される記憶領域6の先頭位置は、受信待ちを示すシーケンス番号に応じて変わる。
第1のデータ領域5は、識別子を保持する。識別子は、記憶領域6にデータが格納されているか否かを識別するのに用いられる。記憶領域6は、第1の格納部2に格納されているデータを記憶する。第2の格納部7は、記憶領域6から、データを処理する図示省略する処理装置へ転送されるデータを格納する。
制御部3は、第1の格納部2に格納されるデータのシーケンス番号を解析する。制御部3は、第1の格納部2に格納されているデータを、このデータに付与されているシーケンス番号に対応する記憶領域6の領域に書き込む。制御部3は、記憶領域6にデータを書き込むと、このデータに付与されているシーケンス番号に対応する識別子を、データ格納済みを示すように変更する。
制御部3は、受信待ちを示すシーケンス番号に対応する識別子がデータ格納済みを示す場合、識別子が連続してデータ格納済みを示す範囲のシーケンス番号に対応する記憶領域6のデータを第2の格納部7へ転送する。また、制御部3は、第2の格納部7へのデータの転送とともに、受信待ちを示すシーケンス番号及びインデックス番号を、次の受信待ちを示すシーケンス番号に対応する番号にそれぞれ更新する。
・受信方法の一例
図2は、実施の形態にかかる受信方法の一例を示すフローチャートである。図2に示す受信方法は、図1に示す受信装置1により実施されてもよい。本実施例は、一例として図1に示す受信装置1により実施される場合について説明する。
図2に示すように、受信装置1においてデータの受信が開始されると、受信装置1は、受信するパケットのデータを第1の格納部2に格納する(ステップS1)。次いで、制御部3は、第1の格納部2に格納されているデータのシーケンス番号を解析する(ステップS2)。ウィンドウによって制限される範囲にシーケンス番号が含まれないデータは、例えば破棄されてもよい。
次いで、制御部3は、第1の格納部2に格納されており、ウィンドウによって制限される範囲にシーケンス番号が含まれるデータを、このデータに付与されているシーケンス番号に対応する記憶領域6の領域に格納する(ステップS3)。また、制御部3は、記憶領域6にデータを格納すると、このデータに付与されているシーケンス番号に対応する識別子を、データ格納済みを示すように変更する。
次いで、制御部3は、受信待ちを示すシーケンス番号に対応する識別子がデータ格納済みを示しているか否かを判断する(ステップS4)。データ格納済みを示していない場合(ステップS4:No)、ステップS1へ戻り、受信待ちを示すシーケンス番号に対応する識別子がデータ格納済みを示すまで、ステップS1〜ステップS4を繰り返す。
受信待ちを示すシーケンス番号に対応する識別子がデータ格納済みを示す場合(ステップS4:Yes)、制御部3は、受信待ちを示すシーケンス番号及びインデックス番号を、次の受信待ちを示すシーケンス番号に対応する番号にそれぞれ更新する(ステップS5)。また、制御部3は、受信待ちを示すシーケンス番号に対応する識別子を含む複数の識別子が連続してデータ格納済みを示す範囲のシーケンス番号に対応する記憶領域6のデータを第2の格納部7へ転送する(ステップS6)。第2の格納部7に格納されるデータは、第2の格納部7から後段の処理部へ転送される。
次いで、受信装置1は、全てのパケットの受信が終了するか否かを判断する(ステップS7)。受信が終了していないパケットがある場合(ステップS7:No)、ステップS1へ戻り、全てのパケットの受信が終了するまで、ステップS1〜ステップS7を繰り返す。全てのパケットの受信が終了すると(ステップS7:Yes)、一連の処理が終了する。
図1に示す受信装置1及び図2に示す受信方法によれば、受信装置1により受信されるデータは、このデータに付与されているシーケンス番号に対応する記憶領域6の領域に格納される。受信装置1が、受信待ちを示すシーケンス番号のデータを受信し、受信待ちを示すシーケンス番号に対応する識別子を含む複数の識別子が連続してデータ格納済みを示すと、連続してデータ格納済みを示す識別子の範囲のシーケンス番号に対応するデータが記憶領域6から第2の格納部7へ転送される。従って、受信の順番がシーケンス番号順でなくても、分割後のデータから元のデータを再構成することができる。また、受信装置1が、受信するデータの容量を予め把握していなくても、シーケンス番号順にデータが並ぶ。従って、例えばストリームデータを受信する場合のように、受信するデータの容量が不定であっても、分割後のデータから元のデータを再構成することができる。
・受信装置の別の例
図3は、実施の形態にかかる受信装置の別の例のハードウェア構成を示す図である。図3に示すように、受信装置11は、受信部12、受信用バッファ13、CPU(Central Processing Unit、中央処理装置)14、ダウンリンク用の転送部15、ダウンリンク用の転送用バッファ16及びインターフェース部17を有する。受信用バッファ13、CPU14及びダウンリンク用の転送用バッファ16は、データバス18に接続されている。
受信部12は、入力端子24に接続されている。入力端子24には、図示しない通信路が接続される。受信部12は、入力端子24を介して通信路から入力するデータを受信する。受信用バッファ13は、受信部12に接続されている。受信用バッファ13は、受信部12から渡されるデータを格納してデータバス18へ出力する。
ダウンリンク用の転送用バッファ16は、図示しない上位レイヤの処理装置へ転送されるデータをデータバス18から受け取って格納する。ダウンリンク用の転送部15は、ダウンリンク用の転送用バッファ16に接続されている。ダウンリンク用の転送部15は、ダウンリンク用の転送用バッファ16に格納されているデータをインターフェース部17へ出力する。
インターフェース部17は、ダウンリンク用の転送部15に接続されている。インターフェース部17は、受信装置11と上位レイヤとの接続を司る。ダウンリンク用の転送用バッファ16に格納されているデータは、ダウンリンク用の転送部15により、インターフェース部17を介して上位レイヤへ転送される。
また、受信装置11は、送信用バッファ19、送信部20、メインメモリ21、アップリンク用の転送用バッファ22及びアップリンク用の転送部23を有する。送信用バッファ19、メインメモリ21及びアップリンク用の転送用バッファ22は、データバス18に接続されている。
アップリンク用の転送部23は、インターフェース部17に接続されている。アップリンク用の転送部23は、インターフェース部17を介して上位レイヤから渡されるデータをアップリンク用の転送用バッファ22へ転送する。アップリンク用の転送用バッファ22は、アップリンク用の転送部23に接続されている。アップリンク用の転送用バッファ22は、アップリンク用の転送部23から受け取るデータを格納してデータバス18へ出力する。
メインメモリ21は、データバス18から受け取るデータを格納し、格納しているデータをデータバス18へ出力する。例えば、メインメモリ21には、受信用バッファ13から出力されるデータ、またはアップリンク用の転送用バッファ22から出力されるデータが格納されてもよい。メインメモリ21には、CPU14における自動再送要求などの処理において生成されるACKパケットまたはNACKパケットが格納されてもよい。
また、メインメモリ21からは、ダウンリンク用の転送部15により上位レイヤへ転送されるデータ、または送信部20により通信路へ出力されるデータが出力されてもよい。送信部20により通信路へ出力されるデータには、ACKパケットまたはNACKパケットが含まれていてもよい。
送信用バッファ19は、通信路へ出力されるデータをデータバス18から受け取って格納する。送信部20は、送信用バッファ19及び出力端子25に接続されている。送信部20は、送信用バッファ19に格納されているデータを出力端子25へ出力する。出力端子25は、図示しない通信路に接続される。送信部20により出力端子25へ出力されるデータは、図示しない通信路へ出力される。
CPU14は、後述する受信方法を実現するプログラムを実行して、自動再送要求などの処理を行う。CPU14は、自動再送要求の処理を行う際に、ACKパケットまたはNACKパケットを生成する。プログラムは、CPU14内の不揮発性メモリに格納されていてもよいし、データバス18に接続するリードオンリーメモリ(ROM:Read Only Memory)などの不揮発性メモリに格納されていてもよい。
図4は、実施の形態にかかる受信装置の別の例の機能的な構成を示す図である。図4には、受信装置において、分割後の受信データから元のデータを再構成する処理を行う処理部が示されている。
図4に示すように、受信装置31は、受信用バッファ32、制御部33、書込・読出部34、ACK送信部35、管理テーブルA36、管理テーブルB37、メモリ38及び転送用バッファ39を有する。受信装置31は、連続するパケットを通信するシステムにおいて、ウィンドウを使用する自動再送要求を用いてデータを受信する。
例えば、制御部33、書込・読出部34及びACK送信部35は、後述する受信方法を実現するプログラムをCPU14が実行することにより実現されてもよい。あるいは、制御部33、書込・読出部34及びACK送信部35は、ハードウェアにより実現されてもよい。本実施例では、CPU14がプログラムを実行することにより実現されるとする。
受信用バッファ32は、第1の格納部の一例であり、例えば図3に示す受信用バッファ13により実現されてもよい。受信用バッファ32は、例えば受信部12(図3参照)からパケットのデータを受け取って格納する。パケットのデータには、例えば連続するパケットを通信するシステムの送信装置により、順番を示すシーケンス番号が付与されている。
管理テーブルA36は、第2のデータ領域の一例であり、例えば図3に示すメインメモリ21により実現されてもよい。管理テーブルA36は、インデックス番号、受信待ちを示すシーケンス番号及び処理待ちを示すシーケンス番号を保持する。これ以降の説明及び図面においては、受信待ちを示すシーケンス番号及び処理待ちを示すシーケンス番号を、それぞれ、受信待ちシーケンス番号及び処理待ちシーケンス番号と称することがある。
インデックス番号は、メモリ38の先頭位置を示す番号である。受信待ちシーケンス番号は、受信装置31が次に受信するのを期待するデータのシーケンス番号である。インデックス番号によって示されるメモリ38の先頭位置は、受信待ちシーケンス番号に応じて変わる。処理待ちシーケンス番号は、受信装置31によって受信されてメモリ38に格納されており、転送用バッファ39へ転送可能であるにもかかわらず、転送用バッファ39へ転送されずに、上位レイヤの処理装置での処理を待つ状態にあるデータのシーケンス番号である。
管理テーブルB37は、第1のデータ領域の一例であり、例えば図3に示すメインメモリ21により実現されてもよい。管理テーブルB37は、メモリ38にデータが格納されていることを示すフラグを保持する。フラグは、識別子の一例である。管理テーブルB37の一例については、後述する。
メモリ38は、記憶領域の一例であり、例えば図3に示すメインメモリ21により実現されてもよい。メモリ38は、受信用バッファ32に格納されているデータを記憶する。
転送用バッファ39は、第2の格納部の一例であり、例えば図3に示すダウンリンク用の転送用バッファ16により実現されてもよい。転送用バッファ39は、メモリ38から上位レイヤの処理装置へ転送されるデータを格納する。
制御部33は、受信用バッファ32に格納されるデータのシーケンス番号を解析する。制御部33は、管理テーブルA36を参照し、受信用バッファ32に格納されるデータのシーケンス番号に対応するメモリ38の領域を求める。制御部33は、書込・読出部34に対して、受信用バッファ32に格納されるデータを、このデータのシーケンス番号に対応するメモリ38の領域に書き込む指示をする。制御部33は、管理テーブルB37にアクセスして、メモリ38に書き込まれるデータのシーケンス番号に対応するフラグを、データ格納済みを示すように変更する。
制御部33は、管理テーブルB37を参照し、受信待ちシーケンス番号に対応するフラグがデータ格納済みを示す場合、書込・読出部34に対して、フラグが連続してデータ格納済みを示す範囲のシーケンス番号に対応するメモリ38のデータを転送用バッファ39へ転送する指示をする。制御部33は、管理テーブルA36にアクセスして、受信待ちシーケンス番号及びインデックス番号を、次の受信待ちシーケンス番号に対応する番号にそれぞれ更新する。制御部33は、管理テーブルA36にアクセスして、処理待ちシーケンス番号を、次の処理待ちシーケンス番号に対応する番号に更新する。
制御部33は、受信待ちシーケンス番号及び処理待ちシーケンス番号に基づいて、ウィンドウの範囲を制御する。制御部33は、受信待ちシーケンス番号及びウィンドウの範囲をACK送信部35へ通知する。
書込・読出部34は、制御部33からの指示に基づいて、メモリ38へのデータの書き込みまたはメモリ38からのデータの読み出しを行う。ACK送信部35は、制御部33から通知される受信待ちシーケンス番号及びウィンドウの範囲をACKに設定し、ACKを例えばメインメモリ21(図3参照)へ送る。
・シーケンス番号とウィンドウの範囲との関係
図5は、図4に示す受信装置におけるシーケンス番号とウィンドウの範囲との関係を説明する図である。図5において、Nは、整数であり、シーケンス番号の最大値よりも1だけ大きい値である。つまり、シーケンス番号の範囲は、0〜[N−1]である。Mは、Nよりも小さい整数であり、ウィンドウサイズの最大値である。Wは、0〜Mの整数であり、ウィンドウサイズの値である。xは、0〜[N−1]の整数であり、受信待ちシーケンス番号の値である。yは、0〜[N−1]の整数であり、処理待ちシーケンス番号の値である。rは、0〜[N−1]の整数であり、受信用バッファ32に格納されているデータのシーケンス番号の値である。
[x−1]番目のパケットまでは巡回冗長検査(CRC:Cyclic Redundancy Check)に間違いがなく、正常に受信している状態であるとする。このとき、巡回冗長検査に間違いがなければ、次に受信することのできるパケットのシーケンス番号の値rの範囲は、次の(1)式または(2)式で表される。
x≦r<x+W (x+W≦Nの場合) ・・・(1)
x≦r または r<x+W−N (x+W>Nの場合) ・・・(2)
(2)式は、シーケンス番号が一周して、[(N−1)+1]が0となるところを含む場合である。シーケンス番号の値rが(1)式または(2)式を満たさない場合には、パケットが破棄される。例えば、N=2048、W=1024及びx=100である場合、シーケンス番号の値rが100≦r<1124を満たすパケットが受信され、それ以外のシーケンス番号を有するパケットは破棄される。
受信待ちシーケンス番号の値xと処理待ちシーケンス番号の値yが異なる場合、受信済みで処理待ちとなるパケットが発生していることになる。例えば図5に示す例では、シーケンス番号の値がy〜[x−1]である領域42は、受信済みであるが、処理待ちとなる領域である。シーケンス番号の値がx〜[x+W−1]である領域43は、受信可能な領域である。シーケンス番号の値が0〜[y−1]である領域41または[x+W]〜[N−1]である領域44は、受信不可能な領域である。
・管理テーブルA及び管理テーブルBとメモリとの関係
図6は、図4に示す受信装置における管理テーブルとメモリとの関係を説明する図である。図6において、iindexは、0〜[W−1]の整数であり、インデックス番号の値である。iは、0〜[W−1]の整数であり、管理テーブルB37においてフラグを格納する各フィールドに付されるインデックス値である。
インデックス値iは、メモリ38の各メモリブロック51〜58のアドレスに対応している。各メモリブロック51〜58のアドレスは、インデックス値iに対応する固定値であり、動的に書き換わらない。メモリブロック51〜58はブロック領域の一例である。
図6に示すように、管理テーブルA36は、インデックス番号の値iindex、受信待ちシーケンス番号の値x及び処理待ちシーケンス番号の値yの3つの変数を保持する。管理テーブルB37は、各インデックス値iのフィールドに1つずつフラグを格納する。フラグの値が「1」であるとき、対応するメモリ38のメモリブロック51〜58にデータが格納されていることを示す。フラグの値が「0」であるとき、対応するメモリ38のメモリブロック51〜58にデータが格納されていないことを示す。
初期化時やARQリセット時には、受信済みのパケットがないので、各フラグの値は「0」に設定される。また、受信済みで処理待ちとなるパケットが発生している場合、処理待ちとなるパケットを格納しているメモリ38のメモリブロック51〜58に対応するフラグの値は、「0」に設定される。
メモリ38は、例えばM個のメモリブロック51〜58を有していてもよい。各メモリブロック51〜58は、例えばSバイトの容量を有していてもよい。従って、メモリ38は、例えばM×Sバイトの容量を有していてもよい。ただし、Sは、パケットのペイロードの最大サイズであり、単位はバイトである。つまり、1回に送ることのできるパケットのサイズは1〜Sバイトであり、1回に送ることのできるパケットごとにシーケンス番号が付与される。
管理テーブルA36のインデックス番号の値iindex、受信待ちシーケンス番号の値x及び次に受信するパケットのシーケンス番号の値rに対応するインデックス値iは、次の(3)式または(4)式で求められる。ただし、「mod」は、剰余を求める演算であり、「AmodB」は、AをBで除するときの剰余を求める。
i=(r−x+iindex)modM (x≦rの場合) ・・・(3)
i=(r+N−x+iindex)modM (x>rの場合) ・・・(4)
(4)式は、シーケンス番号が一周して、[N−1]が0となるところを含む場合である。次に受信するシーケンス番号の値がrであるパケットのデータは、(3)式または(4)式で求められるインデックス値iに対応するメモリ38のメモリブロック51〜58に格納される。
図6に示す例は、例えばウィンドウサイズの最大値Mが8であり、受信待ちシーケンス番号の値xが100であり、インデックス番号の値iindexが2である場合の例である。また、図6に示す例は、処理待ちシーケンス番号の値yが100であるので、処理待ちのパケットのない状態であり、シーケンス番号の値が101、104及び106である各パケットを受信している状態である。
この場合、インデックス番号の値iindexが2であるので、メモリ38において、インデックス値2に対応するメモリブロック53が先頭のメモリブロックとなる。つまり、シーケンス番号の値が100であるパケットのデータは、インデックス値2に対応するメモリブロック53に格納される。
r=101、x=100、iindex=2及びM=8を上記(3)式に代入すると、i=3となる。従って、シーケンス番号の値が101であるパケットのデータは、インデックス値3に対応するメモリブロック54に格納されている。
r=104、x=100、iindex=2及びM=8を上記(3)式に代入すると、i=6となる。従って、シーケンス番号が104であるパケットのデータは、インデックス値6に対応するメモリブロック57に格納されている。
r=106、x=100、iindex=2及びM=8を上記(3)式に代入すると、i=8となる。従って、シーケンス番号が106であるパケットのデータは、インデックス値0に対応するメモリブロック51に格納されている。図6において、ハッチングの付されているメモリブロックは、データを格納しているメモリブロックである(図8〜図17においても同じ)。
このように、受信するパケットのシーケンス番号に基づいてインデックス値iが求まり、インデックス値iに対応するメモリブロックにパケットのデータが格納される。それによって、シーケンス番号順に到達しないパケットがメモリ38上でシーケンス番号順に並ぶことになる。
また、管理テーブルB37において、インデックス値iが3、6及び0である各フラグの値は「1」に設定される。インデックス値iが2、4、5、7及び1である各フラグの値は「0」である。従って、制御部33(図4参照)は、管理テーブルB37の各フラグを参照することによって、メモリ38のどのメモリブロックにデータが格納されているかということを知ることができる。
・受信方法の別の例
図7は、実施の形態にかかる受信方法の別の例を示すフローチャートである。図7に示す受信方法は、図4に示す受信装置31により実施されてもよい。本実施例は、一例として図4に示す受信装置31により実施される場合について説明する。図8〜図16は、図4に示す受信装置における管理テーブル及びメモリの状態の変化の一例を示す図である。
図7に示すように、受信装置31においてデータの受信が開始されると、受信用バッファ32に新たなデータが格納され、受信用バッファ32のデータが更新される。制御部33は、受信用バッファ32に格納されているデータのシーケンス番号の値rを解析する(ステップS11)。シーケンス番号の値rが上記(1)式または(2)式を満たさないデータは、例えば破棄されてもよい。
シーケンス番号の値rが上記(1)式または(2)式を満たす場合、制御部33は、管理テーブルA36を参照し、シーケンス番号の値rが受信待ちシーケンス番号の値x以上であるか否かを判断する(ステップS12)。rがx以上である場合(ステップS12:Yes)、制御部33は、上記(3)式を計算してインデックス値iを求める(ステップS13)。rがx以上でない場合(ステップS12:No)、制御部33は、上記(4)式を計算してインデックス値iを求める(ステップS14)。
インデックス値iが求まると、制御部33は、管理テーブルB37にアクセスして、インデックス値iに対応するフラグ、すなわちi番目のフラグの値を「1」に設定する(ステップS15)。また、制御部33は、受信用バッファ32に格納されているデータを、インデックス値iに対応するメモリ38のメモリブロックへ転送して書き込む。
次いで、制御部33は、管理テーブルB37を参照し、iindex番目のフラグの値が「1」であるか否かを判断する(ステップS16)。iindex番目のフラグの値が「1」である場合(ステップS16:Yes)、ステップS17へ進み、iindex番目のフラグの値が「0」になるまでステップS16〜ステップS18を繰り返す。
iindex番目のフラグの値が「0」である場合(ステップS16:No)、ステップS22へ進み、受信待ちシーケンス番号の値x及び処理待ちシーケンス番号の値yが確定するまでステップS22〜ステップS30を繰り返す。ステップS17、ステップS18及びステップS22〜ステップS30については、後述する。
図7に示すフローチャートが何回か繰り返されることによって、例えば図6に示す状態になることがある。図6に示す状態では、インデックス値2に対応するメモリブロック53がメモリ38の先頭であり、シーケンス番号が101、104及び106である各パケットが既にメモリ38に格納されており、処理待ちのない状況で、シーケンス番号100のパケットの受信を待っている。
図6に示す状態において、例えば新たにシーケンス番号の値rが102であるパケットを受信するとする(ステップS11)。この場合、x=100、iindex=2及びM=8であるので(ステップS12:Yes)、インデックス値iは4になる(ステップS13)。
従って、制御部33は、管理テーブルB37にアクセスし、4番目のフラグの値を「1」に設定する(ステップS15)。また、制御部33は、受信用バッファ32に格納されているシーケンス番号102のパケットのデータを、インデックス値4に対応するメモリ38のメモリブロック55へ転送して書き込む。それによって、管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図8に示す状態となる。
図8に示す状態では、シーケンス番号100のパケットを受信していないので、iindex番目のフラグの値は「0」である(ステップS16:No)。従って、ステップS22へ進む。このとき、上位レイヤが、受信するデータを受け入れることができる状態に遷移しているとする(ステップS21)。
制御部33は、管理テーブルA36を参照し、受信待ちシーケンス番号の値xが処理待ちシーケンス番号の値y以上であるか否かを判断する(ステップS22)。xがy以上である場合(ステップS22:Yes)、制御部33は、次の(5)式よりxとyとの差分dを求める(ステップS23)。xがy以上でない場合(ステップS22:No)、制御部33は、次の(6)式よりxとyとの差分dを求める(ステップS24)。差分dが求まると、制御部33は、次の(7)式よりウィンドウサイズの値Wを求める(ステップS25)。
d=x−y (x≧yの場合)・・・(5)
d=x+N−y (x<yの場合)・・・(6)
W=M−d ・・・(7)
ウィンドウサイズの値Wが求まると、制御部33は、受信待ちシーケンス番号の値xが処理待ちシーケンス番号の値yに等しいか否かを判断する(ステップS26)。x=yである場合(ステップS26:Yes)、受信待ちシーケンス番号の値x及びウィンドウサイズの値Wが確定するので、ステップS11で更新される受信データに対する一連の処理を終了する。xとyとが等しくない場合には(ステップS26:No)、ステップS27ヘ進み、ステップS27〜ステップS30を行う。ステップS27〜ステップS30については、後述する。
図8に示す状態では、x=y=100であるので(ステップS22:Yes)、差分dが0となり(ステップS23)、ウィンドウサイズの値Wはウィンドウサイズの最大値Mとなる(ステップS25)。そして、x=yであるので(ステップS26:Yes)、受信待ちシーケンス番号の値xが100に確定し、ウィンドウサイズの値WがMに確定して、シーケンス番号102のパケットの受信処理が終了する。
図8に示す状態において、例えば新たにシーケンス番号の値rが100であるパケットを受信するとする(ステップS11)。シーケンス番号の値rが100であるパケットは、次に受信するのが期待されているパケットである。この場合、x=100、iindex=2及びM=8であるので(ステップS12:Yes)、インデックス値iは2になる(ステップS13)。
従って、制御部33は、管理テーブルB37にアクセスし、2番目のフラグの値を「1」に設定する(ステップS15)。また、制御部33は、受信用バッファ32に格納されているシーケンス番号100のパケットのデータを、インデックス値2に対応するメモリ38のメモリブロック53へ転送して書き込む。それによって、管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図9に示す状態となる。
図9に示す状態では、iindex番目のフラグの値は「1」である(ステップS16:Yes)。従って、ステップS17へ進む。制御部33は、管理テーブルB37にアクセスし、iindex番目のフラグの値を「0」に設定する(ステップS17)。また、制御部33は、次の(8)式によりインデックス番号の値iindexを更新し、次の(9)式により受信待ちシーケンス番号の値xを更新する(ステップS18)。ステップS17とステップS18とは、いずれが先でもよい。
iindex=(iindex+1)modM ・・・(8)
x=(x+1)modN ・・・(9)
そして、ステップS16へ戻る。ステップS16で、iindex番目のフラグの値が「0」になるまで、ステップS16〜ステップS18を繰り返す。
図9に示す状態では、1回目のステップS17によって、管理テーブルB37の2番目のフラグの値が「0」に設定される。また、1回目のステップS18によって、上記(8)式よりiindex=3に更新され、上記(9)式よりx=101に更新される。それによって、管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図10に示す状態となる。
ステップS16に戻ると、iindex番目、すなわち3番目のフラグの値が「1」であるので(ステップS16:Yes)、2回目のステップS17によって、管理テーブルB37の3番目のフラグの値が「0」に設定される。また、2回目のステップS18によって、iindex=4に更新され、x=102に更新される。それによって、管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図11に示す状態となる。
再びステップS16に戻ると、iindex番目、すなわち4番目のフラグの値が「1」であるので(ステップS16:Yes)、3回目のステップS17によって、管理テーブルB37の4番目のフラグの値が「0」に設定される。また、3回目のステップS18によって、iindex=5に更新され、x=103に更新される。それによって、管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図12に示す状態となる。
再びステップS16に戻ると、図12に示すように、iindex番目、すなわち5番目のフラグの値が「0」であるので(ステップS16:No)、ステップS22へ進む。このとき、上位レイヤが、受信するデータを受け入れることができる状態に遷移しているとする(ステップS21)。
図12に示す状態では、x=103及びy=100であるので(ステップS22:Yes)、差分dが3となり(ステップS23)、ウィンドウサイズの値Wは[M−3]となる(ステップS25)。本実施例ではMが8であるので、ウィンドウサイズの値Wは5となる。そして、x=yでないので(ステップS26:No)、ステップS27へ進む。
制御部33は、上位レイヤで、受信装置11で受信されてメモリ38に格納されているデータを受け入れることができるか否かを判断する(ステップS27)。例えば、制御部33は、転送用バッファ39(図4参照)が空である場合に、上位レイヤがデータを受け入れることができる状態にあると判断してもよい。
上位レイヤがデータを受け入れることができる場合(ステップS27:Yes)、制御部33は、次の(10)式よりjの値を求める。jは、0〜[W−1]の整数である。
j=(iindex+W)modM ・・・(10)
次いで、制御部33は、インデックス値jに対応するメモリ38のメモリブロックに格納されているデータを転送用バッファ39へ転送する(ステップS29)。転送用バッファ39に格納されるデータは、上位レイヤへ転送される。制御部33は、転送用バッファ39から上位レイヤへ転送するデータを、上位層で規定されるデータフォーマットに変換して転送してもよいし、上位レイヤとのデータの送信または受信に関する制御情報を含めて転送してもよい。制御部33は、上位レイヤの状態を、データを受け入れられない状態に更新する。データの転送後、制御部33は、次の(11)式より処理待ちシーケンス番号の値yを更新する(ステップS30)。
y=(y+1)modN ・・・(11)
そして、ステップS22へ戻る。このとき、上位レイヤが、受信するデータを受け入れることができる状態に遷移しているとする(ステップS21)。ステップS26でx=yとなるか(ステップS26:Yes)、ステップS27で上位レイヤがデータを受け入れることができない状態になるまで、ステップS22〜ステップS30を繰り返す。ステップS26でx=yであるか(ステップS26:Yes)、ステップS27で上位レイヤがデータを受け入れることができない場合(ステップS27:No)、受信待ちシーケンス番号の値x及びウィンドウサイズの値Wを確定し、一連の処理を終了する。
図12に示す状態において、上位レイヤがデータを受け入れることができる場合(ステップS27:Yes)、上記(10)式よりjの値は2となる(ステップS28)。従って、制御部33は、インデックス値2に対応するメモリ38のメモリブロック53に格納されているデータを転送用バッファ39へ転送する(ステップS29)。また、制御部33は、上記(11)式より処理待ちシーケンス番号の値yを101に更新する(ステップS30)。それによって、管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図13に示す状態となる。
ステップS22に戻ると、図13に示す状態では、受信待ちシーケンス番号の値xが103であり、処理待ちシーケンス番号の値yが101であるので(ステップS22:Yes)、差分dは2となり(ステップS23)、ウィンドウサイズの値Wは6となる(ステップS25)。x=yでなく(ステップS26:No)、上位レイヤがデータを受け入れることができる場合(ステップS27:Yes)、jの値は3となる(ステップS28)。
従って、制御部33は、インデックス値3に対応するメモリ38のメモリブロック54に格納されているデータを転送用バッファ39へ転送する(ステップS29)。また、処理待ちシーケンス番号の値yは102となる(ステップS30)。それによって、管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図14に示す状態となる。
再びステップS22に戻ると、図14に示す状態では、受信待ちシーケンス番号の値xが103であり、処理待ちシーケンス番号の値yが102であるので(ステップS22:Yes)、差分dは1となり(ステップS23)、ウィンドウサイズの値Wは7となる(ステップS25)。x=yでなく(ステップS26:No)、上位レイヤがデータを受け入れることができる場合(ステップS27:Yes)、jの値は4となる(ステップS28)。
従って、制御部33は、インデックス値4に対応するメモリ38のメモリブロック55に格納されているデータを転送用バッファ39へ転送する(ステップS29)。また、処理待ちシーケンス番号の値yは103となる(ステップS30)。それによって、管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図15に示す状態となる。
再びステップS22に戻ると、図15に示す状態では、受信待ちシーケンス番号の値xが103であり、処理待ちシーケンス番号の値yが103であるので(ステップS22:Yes)、差分dは0となり(ステップS23)、ウィンドウサイズの値Wは8となる(ステップS25)。そして、x=yとなるので(ステップS26:Yes)、受信待ちシーケンス番号の値x及びウィンドウサイズの値Wを確定し、シーケンス番号が100であるパケットの受信に伴う一連の処理を終了する。
一方、図12に示す状態において、上位レイヤがデータを受け入れることができない場合(ステップS27:No)、受信待ちシーケンス番号の値xが103に確定し、ウィンドウサイズの値Wが5に確定する。処理待ちシーケンス番号の値yは100のままである。また、メモリ38において、インデックス値2、3及び4に対応する各メモリブロック53〜55には、データが格納されているままである。従って、このときの管理テーブルA36、管理テーブルB37及びメモリ38は、例えば図16に示す状態となる。そして、シーケンス番号が100であるパケットの受信に伴う一連の処理を終了する。
初期化時やARQリセット時には、iindexを「0」に初期化する。xとyはARQに依存した値で初期化を行う。例えば、ARQのシーケンス番号が0から始まる場合は、x=y=0に処理化する。
・管理テーブル及びメモリの別の例
図17は、図4に示す受信装置における管理テーブル及びメモリの別の例を示す図である。図17に示すように、管理テーブルB37が、フラグを保持する領域61、及びメモリアドレスを保持する領域62を有していてもよい。メモリアドレスを保持する領域62には、インデックス値iに対応する離散的なメモリアドレスが設定されていてもよい。
例えば、図17に示す例のように、インデックス値0、インデックス値1、インデックス値2及びインデックス値3に対応するメモリアドレスをそれぞれ「0xA000」、「0xA100」、「0xA200」及び「0xA300」としてもよい。また、例えば、インデックス値4及びインデックス値5に対応するメモリアドレスをそれぞれ「0xB000」及び「0xB100」としてもよい。
また、例えば、インデックス値6及びインデックス値7に対応するメモリアドレスをそれぞれ「0xC000」及び「0xC100」としてもよい。このようにメモリアドレスを設定することによって、メモリ38として複数のメモリ63、64、65を用いたり、複数のメモリ空間を用いることができる。この場合には、メモリアドレスを保持する領域62を参照してメモリアクセスを行う。
・計算の簡易化
ウィンドウサイズの最大値Mが2のC乗である場合、[M−1]とのビットマスクを取ることにより、modの計算を容易に行うことができる。従って、上記(3)式、(4)式、(8)式または(10)式の代わりに、それぞれ次の(3')式、(4')式、(8')式または(10')式を用いてもよい。ただし、「&」はビットごとのアンド演算を表す。
i=(r−x+iindex)&(2C−1) (x≦rの場合) ・・・(3')
i=(r+N−x+iindex)&(2C−1) (x>rの場合) ・・・(4')
iindex=(iindex+1)&(2C−1) ・・・(8')
j=(iindex+W)&(2C−1) ・・・(10')
同様に、シーケンス番号の最大値よりも1だけ大きい値Nが2のD乗である場合、[N−1]とのビットマスクを取ることにより、modの計算を容易に行うことができる。従って、上記(9)式または(11)式の代わりに、それぞれ次の(9')式または(11')式を用いてもよい。
x=(x+1)&(2D−1) ・・・(9')
y=(y+1)&(2D−1) ・・・(11')
本実施例は、Go−Back−N ARQといわれるタイプの自動再送要求技術に適用可能である。また、本実施例は、Selective Repeat ARQといわれるタイプの自動再送要求技術にも適用可能である。
図4に示す受信装置31及び図7に示す受信方法によれば、受信装置31により受信されるデータは、このデータに付与されているシーケンス番号に対応するメモリ38のメモリブロックに格納される。受信装置31が、受信待ちを示すシーケンス番号のデータを受信し、受信待ちを示すシーケンス番号に対応するフラグを含む複数のフラグが連続してデータ格納済みを示すと、連続してデータ格納済みを示すフラグの範囲のシーケンス番号に対応するデータがメモリ38から転送用バッファ39へ転送される。従って、受信の順番がシーケンス番号順でなくても、パケットのデータから元のデータを再構成することができる。
また、図4に示す受信装置31及び図7に示す受信方法によれば、受信装置31が、受信するデータの容量を予め把握していなくても、メモリ38上にシーケンス番号順にデータが並び、シーケンス番号順にデータが上位レイヤへ転送される。従って、例えばストリームデータを受信する場合のように、受信するデータの容量が不定であっても、パケットのデータから元のデータを再構成することができる。
また、図4に示す受信装置31及び図7に示す受信方法によれば、インデックス番号の値iindexが変わることによって、メモリ38の先頭になるメモリブロックが変わる。メモリ38の先頭になるメモリブロックを循環させることによって、一定サイズのメモリを用いて不定長のデータを再構成することができる。
また、図4に示す受信装置31及び図7に示す受信方法によれば、インデックス番号の値iindex、インデックス値i、jの値、受信待ちシーケンス番号の値x及び処理待ちシーケンス番号の値yの値に剰余の値が用いられている。それによって、メモリ38は、小さいメモリ容量で不定長のデータを格納することができる。
また、図4に示す受信装置31及び図7に示す受信方法によれば、受信装置31は、データを受信して管理テーブルA36及び管理テーブルB37を参照することによって、データをメモリ38の対応するメモリブロックに格納することができる。従って、パケットのデータから元のデータを従来よりも速く再構成することができる。また、受信装置31は、管理テーブルA36及び管理テーブルB37を参照することによって、受信済みの連続するシーケンス番号のデータを確認することができる。従って、パケットのデータから元のデータを従来よりも速く再構成することができる。
上述した各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)連続したパケットを通信するシステムにおいて、受信可能なパケット数を制限するウィンドウを使用した自動再送要求を用いてデータを受信する受信装置であって、前記パケットのデータを格納する第1の格納部と、前記第1の格納部に格納されたデータのシーケンス番号を解析する制御部と、複数のブロック領域を含み、前記第1の格納部に格納されたデータを、前記シーケンス番号に対応するブロック領域に記憶する記憶領域と、各々が、対応するブロック領域にデータが格納されているか否かを識別する複数の識別子を保持する第1のデータ領域と、前記制御部で解析されたシーケンス番号のうち受信待ちを示すシーケンス番号、及び前記記憶領域の先頭となるブロック領域の位置を示すインデックス番号を保持する第2のデータ領域と、前記データを処理する処理装置へ転送されるデータを格納する第2の格納部と、を有し、前記制御部は、前記第1のデータ領域の識別子が、前記受信待ちを示すシーケンス番号に対応するブロック領域に、データが格納されていることを示していた場合に、該識別子が連続してデータが格納されていることを示す範囲のシーケンス番号に対応する前記ブロック領域のデータを前記第2の格納部へ転送し、前記第2のデータ領域の前記受信待ちを示すシーケンス番号、及び前記インデックス番号を、次の受信待ちを示すシーケンス番号に対応する番号にそれぞれ更新することを特徴とする受信装置。
(付記2)前記インデックス番号をiindexとし、前記ウィンドウの最大値をMとし、前記受信待ちを示すシーケンス番号の値をxとし、前記シーケンス番号の最大値に1を加算した値をNとするとき、前記制御部は、前記第2のデータ領域の前記受信待ちを示すシーケンス番号を、前記xに1を加算した値を前記Nで除するときの剰余の値に更新し、前記インデックス番号を、前記iindexに1を加算した値を前記Mで除するときの剰余の値に更新することを特徴とする付記1に記載の受信装置。
(付記3)前記インデックス番号をiindexとし、前記ウィンドウの最大値をMとし、前記受信待ちを示すシーケンス番号の値をxとし、前記シーケンス番号の最大値に1を加算した値をNとし、前記第1の格納部に格納されているデータのシーケンス番号をrとするとき、前記制御部は、前記rが前記x以上の値であるときに、前記rから前記xを減算して前記iindexを加算した値を前記Mで除するときの剰余の値i、または前記rが前記xよりも小さい値であるときに、前記rに前記Nを加算した値から前記xを減算して前記iindexを加算した値を前記Mで除するときの剰余の値iを求め、前記第1のデータ領域における前記iに対応する領域の前記識別子を、前記ブロック領域にデータが格納されたことを示す値にすることを特徴とする付記1または2に記載の受信装置。
(付記4)前記制御部で解析されたシーケンス番号のうち前記ブロック領域から前記第2の格納部への転送待ちを示すシーケンス番号をyとし、前記シーケンス番号の最大値に1を加算した値をNとするとき、前記第2のデータ領域は、前記転送待ちを示すシーケンス番号を保持し、前記制御部は、前記ブロック領域から前記第2の格納部へデータが転送されるたびに、前記第2のデータ領域の前記転送待ちを示すシーケンス番号を、前記yに1を加算した値を前記Nで除するときの剰余の値に更新することを特徴とする付記1乃至3のいずれか一項に記載の受信装置。
(付記5)前記ウィンドウの最大値をMとし、前記受信待ちを示すシーケンス番号の値をxとし、前記制御部で解析されたシーケンス番号のうち前記ブロック領域から前記第2の格納部への転送待ちを示すシーケンス番号をyとし、前記シーケンス番号の最大値に1を加算した値をNとするとき、前記制御部は、前記xが前記y以上の値であるときに、前記Mから前記xを減算して前記yを加算した値W、または前記xが前記yよりも小さい値であるときに、前記Mから前記x及び前記Nを減算して前記yを加算した値Wを求め、前記Wを前記ウィンドウの値にすることを特徴とする付記1乃至4のいずれか一項に記載の受信装置。
(付記6)前記第1のデータ領域には、前記識別子ごとに対応する前記記憶領域のブロック領域のアドレスが保持されており、前記アドレスによってデータの格納先を指定することによって非連続のメモリまたは非連続のメモリ空間を前記データの保存領域として用いることを特徴とする付記1乃至5のいずれか一項に記載の受信装置。
(付記7)連続したパケットを通信するシステムにおいて、受信可能なパケット数を制限するウィンドウを使用した自動再送要求を用いてデータを受信する受信方法であって、前記パケットのデータを第1の格納部に格納し、前記第1の格納部に格納されたデータのシーケンス番号を解析し、前記第1の格納部に格納されたデータを、複数のブロック領域を含む記憶領域の、前記シーケンス番号に対応するブロック領域に記憶し、対応するブロック領域にデータが格納されているか否かを識別する識別子であって前記解析されたシーケンス番号のうち受信待ちを示すシーケンス番号に対応する識別子が、該識別子に対応するブロック領域にデータが格納されていることを示していた場合に、該識別子が連続してデータが格納されていることを示す範囲のシーケンス番号に対応する前記ブロック領域のデータを第2の格納部へ転送し、前記受信待ちを示すシーケンス番号、及び前記記憶領域の先頭となるブロック領域の位置を示すインデックス番号を、次の受信待ちを示すシーケンス番号に対応する番号にそれぞれ更新することを特徴とする受信方法。
(付記8)前記インデックス番号をiindexとし、前記ウィンドウの最大値をMとし、前記受信待ちを示すシーケンス番号の値をxとし、前記シーケンス番号の最大値に1を加算した値をNとするとき、前記受信待ちを示すシーケンス番号を、前記xに1を加算した値を前記Nで除するときの剰余の値に更新し、前記インデックス番号を、前記iindexに1を加算した値を前記Mで除するときの剰余の値に更新することを特徴とする付記7に記載の受信方法。
(付記9)前記インデックス番号をiindexとし、前記ウィンドウの最大値をMとし、前記受信待ちを示すシーケンス番号の値をxとし、前記シーケンス番号の最大値に1を加算した値をNとし、前記第1の格納部に格納されているデータのシーケンス番号をrとするとき、前記rが前記x以上の値であるときに、前記rから前記xを減算して前記iindexを加算した値を前記Mで除するときの剰余の値i、または前記rが前記xよりも小さい値であるときに、前記rに前記Nを加算した値から前記xを減算して前記iindexを加算した値を前記Mで除するときの剰余の値iを求め、前記iに対応する前記識別子を、前記ブロック領域にデータが格納されたことを示す値にすることを特徴とする付記7または8に記載の受信方法。
(付記10)前記解析されたシーケンス番号のうち前記ブロック領域から前記第2の格納部への転送待ちを示すシーケンス番号をyとし、前記シーケンス番号の最大値に1を加算した値をNとするとき、前記ブロック領域から前記第2の格納部へデータが転送されるたびに、前記転送待ちを示すシーケンス番号を、前記yに1を加算した値を前記Nで除するときの剰余の値に更新することを特徴とする付記7乃至9のいずれか一項に記載の受信方法。
(付記11)前記ウィンドウの最大値をMとし、前記受信待ちを示すシーケンス番号の値をxとし、前記解析されたシーケンス番号のうち前記ブロック領域から前記第2の格納部への転送待ちを示すシーケンス番号をyとし、前記シーケンス番号の最大値に1を加算した値をNとするとき、前記xが前記y以上の値であるときに、前記Mから前記xを減算して前記yを加算した値W、または前記xが前記yよりも小さい値であるときに、前記Mから前記x及び前記Nを減算して前記yを加算した値Wを求め、前記Wを前記ウィンドウの値にすることを特徴とする付記7乃至10のいずれか一項に記載の受信方法。