品質の保証がされていないベストエフォートタイプのIP(Internet Protocol)ネットワークでは、ネットワーク機器内部でのバッファ溢れや、伝送中のビットエラー等によって送信パケットの廃棄が発生する。そのため、確実にデータを伝送するための送達確認を行うプロトコルとしてTCP(Transmission Control Protocol)が幅広く利用されている(例えば、非特許文献1参照)。
例えば、図12に示すように、TCPを利用して相互通信接続を行う通信端末10,20において、通信端末10にはパケット送信装置11及びパケット受信装置12が設けられ、通信端末20にはパケット送信装置22及びパケット受信装置21が設けられる。パケット送信装置11及びパケット受信装置21とパケット送信装置22及びパケット受信装置12はそれぞれ同様の機能を有し、代表してパケット送信装置11及びパケット受信装置21に注目して説明する。パケット送信装置11は、データ送信用パケットを所定の通信路を介してパケット受信装置21に送信すると、パケット受信装置21は、受信した旨の報告として送達確認応答用パケットをパケット送信装置11に送信する。
より具体的には、TCPでは、パケット受信装置21がパケットを受信すると、受信した旨の報告として、次に送信を要求するパケットの番号をパケット送信装置11に通知する。そして、パケット送信装置11は、パケット受信装置21から通知される報告に基づいて、パケットが正常にパケット受信装置21に到達したことを確認する。パケット送信装置11は、パケット受信装置21から通知される報告に基づいて、送達確認応答なしに送出可能なパケットの数を表す輻輳ウインドウサイズ(cwnd: congestion window size)を調整する。例えばパケットが正常に受信された場合はcwndを拡大し、パケットロスが検出された場合はcwndを縮小する。
このcwndを調整する技法は輻輳制御技法と呼ばれ、通信の状態によってその制御技法が切り替えられる。一般的には通信開始時やタイムアウト後に適用される「スロースタートフェーズ」、通信が安定している際に適用される「輻輳回避フェーズ」、ロスパケットを再送するための「ロスリカバリフェーズ」といったフェーズに応じて輻輳制御技法を切り替える。RFC5681には一般的なTCPが用いる輻輳制御技法が記載されている(例えば、非特許文献2参照)。RFC5681に記載されているスロースタートフェーズの動作では、cwndがスロースタート閾値(ssthresh)未満である場合、式(1)によりcwndを拡大する。ssthreshは、スロースタートフェーズと輻輳回避フェーズの切り替えを決定する閾値である。
cwnd = min(N, MSS) (1)
Nは新たに送達確認されたバイト数、MSSはパケットに含まれるデータの最大バイト数である。cwndがssthresh以上になるか、パケットロスが発生した時点でスロースタートフェーズでの動作を終了する。
TCP CUBIC(例えば、非特許文献3参照)やCTCP(例えば、非特許文献4参照)など様々なTCPが提案されているが、「スロースタートフェーズ」での動作はRFC5681と同じであり、「輻輳回避フェーズ」に独自の輻輳制御アルゴリズムが組み込まれている。
一例のスロースタートフェーズでの動作として、Limited Slow‐Startが提案されている(例えば、非特許文献5参照)。RFC5681では、cwndがssthreshより大きくなるまで式(1)によりcwndを拡大するが、Limited Slow‐Startでは新たにmax_ssthreshという閾値を導入し、cwndがmax_ssthreshより大きくなると1往復遅延時間(rtt:Round Trip Time)辺りに増加するcwndをmax_ssthresh/2に制限する。
他例のスロースタートフェーズでの動作として、Hystartが提案されている(例えば、非特許文献6参照)。Hystartでは、スロースタート終了条件についてRFC5681に加えて2つの新しい条件を定義している。1つは、1往復遅延時間(rtt)中に送信するパケット列の送信にかかる時間が閾値を超えた場合に終了する。もう1つは、所定の1計測期間中に送信するパケット列の先頭の数パケットで計測した最小のrttであるrttminが、それまでに計測した最小のrttであるrttbaseよりも閾値以上に大きくなっている場合に終了する。ここに、rttbaseは通信を開始してから現時点までに計測した最小のrttである。
また、スロースタートフェーズの前に、独自の帯域測定を行う技法が提案されている(例えば、特許文献1参照)。この技法では、通信開始時にTCPの輻輳ウインドウサイズにはよらず予め決められた数のパケットを送信し、その結果をTCPの輻輳制御方式にフィードバックすることで、より高速に輻輳ウインドウサイズを拡大可能としている。
これらのスロースタートフェーズに関する動作を適用可能な従来技術のRFC5681やRFC3742等に基づくパケット送信装置を総括するに、そのパケット送信装置11の概略構成を示すと、図13のようになる。尚、図13に示すパケット送信装置11は、後述する本発明との対比に係る機能ブロックのみを図示したものであり、送達確認を行うパケット通信方式のパケット送信装置としてその他の必要な機能は、従来から知られている既知の技術と同様の構成とすることができ、その詳細な説明は省略する。図13に示す従来技術に基づくパケット送信装置11は、送信時刻書込部111、パケット送信部112、送達確認応答受信部113、パケットロス判定部114及びパケット送信制御部115を備え、パケット送信制御部115は、ロス再送動作部116、ロスリカバリ動作部117、輻輳回避動作部118及びスロースタート動作部119からなる。
送信時刻書込部111は、パケット送信時に送信時刻を記録する。この送信時刻は、パケット送信装置11の本体内メモリ(図示せず)にパケット番号とともに記録することができる。或いは、TCPのタイムスタンプオプションを用いて記録することもできる。
パケット送信部112は、パケット受信装置21に向けてパケットを送信する。その後、送達確認応答受信部113は、パケット受信装置21から通知される送達確認応答用パケットを受信すると、次の処理を開始する。
送達確認応答受信部113は、送達確認応答用パケットを受信すると、パケット送信部112からのパケット送信から送達確認応答用パケットを受信するまでにかかったrttを計算する。rttの計算は、本体内メモリに記録した送信時刻と受信時刻の差とすることができる。或いは、TCPタイムスタンプオプションを用いることができる。rttの計算後、送達確認応答受信部113は、パケットロス判定部114へ送達確認応答用パケットとrttを通知する。
パケットロス判定部114は、送達確認応答部113から送達確認応答用パケットとrttを受信すると、rttbaseを更新し、パケットロスの発生の有無を判定する。パケットロスが発生している場合には、パケットロス判定部114は、ロス再送動作部116へ送達確認応答用パケットとrttを通知し、所定のパケットロス再送動作を実行させる。パケットロスが発生していない場合は、パケットロス判定部114は、現在の動作フェーズがロスリカバリフェーズの場合はロスリカバリ動作部117へ、輻輳回避フェーズの場合は輻輳回避動作部118へ、送達確認応答用パケットとrttを通知する。また、パケットロス判定部114は、スロースタートフェーズの場合はスロースタート動作部119へ、式(1)に関する所定のスロースタートの動作指示を通知する。
ロス再送動作部116は、送達確認応答用パケットとrttを基に送信パケットの再送処理を実行する。
ロスリカバリ動作部117は、送達確認応答用パケットとrttを基にパケットロスの発生後の通信状況の回復を行うようcwndの値の拡大又は縮小の調整処理を実行する。
輻輳回避動作部118は、送達確認応答用パケットとrttを基に通信路の輻輳を回避するようcwndの値を更新する。
ただし、ロス再送動作部116、ロスリカバリ動作部117及び輻輳回避動作部118は、一般的なTCPなどを含み既知の輻輳制御技法に基づいたレート制御処理を実行するように構成すればよく、その動作の更なる詳細については省略する。
スロースタート動作部119は、パケットロスが発生していない間、式(1)を基にcwndの値を拡大するよう更新する。
このようにして、パケット送信制御部115は、パケットロスの発生の有無に応じて各種の動作フェーズに基づいたレート制御を実行する。
以下、図面を参照して、本発明による一実施形態のパケット送信装置、通信端末及びスロースタート制御方法を説明する。
図1は、本発明による一実施形態のパケット送信装置11aにおけるブロック図である。パケット送信装置11aは、図13に示すパケット送信装置11に置き換えて、図12に示す通信端末10に設ける装置である。同様に、通信端末20に対しても、パケット送信装置22に置き換えてパケット送信装置11aと同様の構成を設けることができる。したがって、図12に示すように、TCPを利用して相互通信接続を行う通信端末10,20において、パケット送信装置11aは、データ送信用パケットを所定の通信路を介してパケット受信装置21に送信すると、パケット受信装置21は、受信した旨の報告として送達確認応答用パケットをパケット送信装置11aに送信する。尚、図1に示すパケット送信装置11aは、本発明に係る機能ブロックのみを図示したものであり、送達確認を行うパケット通信方式のパケット送信装置としてその他の必要な機能は、従来から知られている既知の技術と同様の構成とすることができ、その詳細な説明は省略する。
図1に示すように、本実施形態のパケット送信装置11aは、送信時刻書込部111、パケット送信部112、送達確認応答受信部113、パケットロス判定部114及びパケット送信制御部115を備え、パケット送信制御部115は、ロス再送動作部116、ロスリカバリ動作部117、輻輳回避動作部118及びスロースタート動作部119aからなる。尚、図13に示すパケット送信装置11と比較して、本実施形態のパケット送信装置11aは、スロースタート動作部119の代わりに、スロースタート動作部119aを備える点で相違しており、同様な構成要素には同一の参照番号を付している。
送信時刻書込部111は、データ送信用パケットの送信時の送信時刻を記録する。この送信時刻は、パケット送信装置11の本体内メモリ(図示せず)にパケット番号とともに記録することができる。或いは、TCPのタイムスタンプオプションを用いて記録することもできる。
パケット送信部112は、パケット受信装置21に向けてパケットを送信する。その後、送達確認応答受信部113は、パケット受信装置21から通知される送達確認応答用パケット(以下、「ACKパケット」と表記する。)を受信すると、次の処理を開始する。
送達確認応答受信部113は、ACKパケットを受信すると、パケット送信部112からのパケット送信からACKパケットを受信するまでにかかった往復遅延時間(rtt)を計算する。rttの計算は、本体内メモリに記録した当該ACKパケットに対応する送信パケットの送信時刻(以下、「sndtime」と表記する。)と当該ACKパケットの受信時刻(以下、「rcvtime」と表記する。)の差とすることができる。或いは、本体内メモリに記録する代わりに、TCPタイムスタンプオプションを用いることができる。rttの計算後、送達確認応答受信部113は、パケットロス判定部114へACKパケットとrtt,sndtime,rcvtimeを通知する。より具体的には、図2に示すように、送達確認応答受信部113は、ACKパケットを受信すると(ステップS11)、送信時刻(sndtime)と受信時刻(rcvtime)の差から往復遅延時間(rtt)を求め(ステップS12)、rttの計算後、パケットロス判定部114へACKパケット及びrtt,sndtime,rcvtimeを通知する(ステップS13)。
パケットロス判定部114は、送達確認応答部113からACKパケットと、rtt,sndtime,rcvtimeを受信すると、ACKパケット内の送達確認番号(「ACK番号」とも称される。)によりパケットロス判定を行う。パケットロスが発生している場合には、パケットロス判定部114は、ロス再送動作部116へACKパケットとrttを通知する。パケットロスが発生していない場合は、パケットロス判定部114は、現在の動作フェーズがロスリカバリフェーズの場合はロスリカバリ動作部117へACKパケットとrttを通知し、輻輳回避フェーズの場合は輻輳回避動作部118へACKパケットとrttを通知し、スロースタートフェーズの場合はスロースタート動作部119aへACKパケットとrtt、sndtime、rcvtimeを通知する。より具体的には、図3に示すように、パケットロス判定部114は、送達確認応答受信部113から送達確認応答用パケットとrttを受信すると(ステップS21)、パケットロスが発生しているか否かの判定を行う(ステップS22)。パケットロスの判定には、例えばACKパケットに含まれるACK番号が同じパケットを3回受信した場合とする方法がある。
パケットロスが発生している場合には(ステップS22:Yes)、パケットロス判定部114は、ロス再送動作部116へACKパケットとrttを通知し、所定のパケットロス再送動作を実行させる(ステップS23)。パケットロスが発生していない場合は(ステップS22:No)、パケットロス判定部114は、現在の動作フェーズがロスリカバリフェーズの場合はロスリカバリ動作部117へ(ステップS24,S25)、輻輳回避フェーズの場合は輻輳回避動作部118へ(ステップS24,S26)、ACKパケットとrttを通知する。また、パケットロス判定部114は、スロースタートフェーズの場合は本発明に係るスロースタート動作部119aへ、ACKパケットとrtt、sndtime、rcvtimeを通知する(ステップS24,S27)。
パケット送信制御部115は、パケットロスの発生の有無に応じて各種の動作フェーズに基づいたレート制御を実行する。尚、ロス再送動作部116、ロスリカバリ動作部117及び輻輳回避動作部118は、一般的なTCPなどを含み既知の輻輳制御技法に基づいたレート制御処理を実行するように構成すればよく、その動作の更なる詳細については省略する。特に、パケット送信制御部115は、スロースタート動作部119aによる比較的高速に輻輳ウインドウサイズを拡大するスロースタートフェーズと、輻輳回避動作部118による比較的緩やかに輻輳ウインドウサイズを調整する輻輳回避フェーズとを遷移しながらレート制御を実行するよう動作する。
詳細に後述するが、本発明に係る実施例1のスロースタート動作部119aは、通信を開始してから現時点までに計測した最小のrttであるrttbaseを用い、このrttbaseを比較・監視しつつ、パケットの送受信結果から輻輳ウインドウサイズの上限値(以下、「cwndlimit」と表記する。)を決定し、スロースタートフェーズの終了判定に用いるよう構成される。また、本発明に係る実施例2のスロースタート動作部119aは、通信を開始してから現時点までに計測した最小のrttであるrttbaseと、受信したACKパケットに対応するrttに関して予め定めた1計測期間毎に計測する全てのrttの中で最小のrttであるrttminを算出・更新し、このrttbase及びrttminを比較・監視しつつ、パケット遅延の変動量を考慮してパケットの送受信結果から輻輳ウインドウサイズの上限値(cwndlimit)を決定し、スロースタートフェーズの終了判定に用いるよう構成される。尚、本発明に係るrttminは、非特許文献6に開示されるHystartにおける最小のrtt(rttmin)とは相違する点に留意する。
ここで、「計測期間」に関して説明する。例えば、図4(A)に示すように、通信端末10が連続的に送信するデータ送信用パケットD1,D2,D3を通信端末20に向けて送信するとともに、データ送信用パケットD1,D2,D3の各々に対応するACKパケットACK1,ACK2,ACK3を受信する場合を考えたとき、1計測期間は、計測期間の計測の開始から通信端末10(パケット送信装置11a)が最初に送信するパケットに対する送達確認応答(ACK)が到着するまで、とすることができる。
或いは、図4(B)に示すように、1計測期間は、計測期間の計測の開始から所定時間経過時まで(例えば、直前の1計測期間における最小のrtt(rttmin)経過時まで)、とすることができる。尚、計測期間は、IPデータフローに対して連続的に定めてもよいし、間欠的に定めてもよく、計測期間で求めたrttminは少なくとも次回の計測期間でrttminを求めるまで保持するように構成し、rttminを用いるcwnd等の更新にはその更新時点で保持するrttminを用いるようにする。
(実施例1のスロースタート動作部)
まず、本発明に係る実施例1のスロースタート動作部119aについて、図5乃至図7を参照して説明する。図5は、本発明に係る実施例1のスロースタート動作部119aの構成を示すブロック図である。図6は、本発明に係る実施例1のスロースタート動作部119aの輻輳ウインドウ増加処理を示すフローチャートである。図7は、本発明に係る実施例1のスロースタート動作部119aの輻輳ウインドウ上限算出処理を示すフローチャートである。
図5に示すように、実施例1のスロースタート動作部119aは、輻輳ウインドウ増加処理を実行する輻輳ウインドウ増加部1191と、輻輳ウインドウ上限算出処理を実行する輻輳ウインドウ上限算出部1192とを備える。
まず、図6を参照して、輻輳ウインドウ増加部1191による輻輳ウインドウ増加処理を説明する。
輻輳ウインドウ増加部1191は、パケットロス判定部114からACKパケットと、rtt,sndtime,rcvtimeを受信すると(ステップS31)、式(2)によりrttbaseを更新する(ステップS32,S33)。rttbaseは通信開始から通信中に計測したrttの最小値である。rttbaseの通信開始時における初期値は、とりうる最大の値など、或る決まった値とすることができる。
if rttbase > rtt (2)
then rttbase = rtt
次に、輻輳ウインドウ増加部1191は、ACKパケットと、rttbase,sndtime,rcvtime,cwndmaxを輻輳ウインドウ上限算出部1192に通知する(ステップS34)。cwndmaxは、輻輳ウインドウ上限算出部1192において輻輳ウインドウサイズの上限値(cwndlimit)の算出に用いる値である。cwndmaxの値の計算方法(更新方法)や、輻輳ウインドウサイズの上限値(cwndlimit)の算出手順については後述する。
続いて、輻輳ウインドウ増加部1191は、輻輳ウインドウ上限算出部1192からcwndlimitを受信すると(ステップS35)、1計測期間を経過していたか否かを判定する(ステップS36)。1計測期間の判定方法として、前述した図4のように、例えば1計測期間の測定を開始してから最初に送信したパケットに対する送達確認応答を受信した時とする方法や、1計測期間の開始時から所定時間が経過した時とする方法がある。この1計測期間が経過していた場合(ステップS36:Yes)、輻輳ウインドウ増加部1191は、スロースタートフェーズを終了するか否かの判定を行う(ステップS38〜S40)。この判定は現在の輻輳ウインドウサイズ(cwnd)と輻輳ウインドウサイズの上限値(cwndlimit)の比較によって行われ、即ち式(3)によって行う。
if cwnd ≧ cwndlimit (3)
then スロースタートフェーズを終了、
else スロースタートフェーズを継続。
そして、スロースタートフェーズを終了する場合(ステップS38:Yes)、式(4)に示す処理を行う(ステップS40)。
ssthresh = cwnd (4)
cwnd = cwnd + MSS
一方、スロースタートフェーズを継続する場合(ステップS38:No)、式(5)に示す処理を行う(ステップS39)。
cwnd = min(cwnd + γ,cwndlimit) (5)
γは、1回のACKパケットの受信で増加させる輻輳ウインドウサイズ(cwnd)の大きさであり、MSS、又は今回受信したACKパケットにより送達確認が行われたバイト数とすることができる。
また、スロースタートフェーズを継続する場合(ステップS38:No)、cwndmaxの更新も行う(ステップS39)。cwndmaxは、輻輳ウインドウ上限算出部1192において輻輳ウインドウサイズの上限値(cwndlimit)の算出に用いる値であり、より具体的には次回のスロースタートフェーズ終了判定までに取りうる輻輳ウインドウの最大値であり、cwndmaxの初期値として、通信開始時には取りうる最大の値とすることができる。また、通信開始後にスロースタート閾値(ssthresh)を用いてスロースタートフェーズと輻輳回避フェーズの切り替えが為されていたときは、今回のスロースタートフェーズに用いるcwndmaxの初期値をスロースタート閾値(ssthresh)の値とすることができる。
cwndmaxは、今回のスロースタートフェーズにてcwndが更新される度に所定の更新式に基づいて更新され、より具体的な更新式の例として、輻輳ウインドウ増加部1191は、例えば更新するcwndmaxを、更新されたcwndの2倍の値とすることや、更新されたcwndの2倍の値と、直前の1計測期間の経過時に決定された輻輳ウインドウサイズの上限値cwndlimitのうち小さい方の値として決定する。
そして、1計測期間が経過していないと判定した場合(ステップS36:No)、輻輳ウインドウ増加部1191は、式(5)に示す処理を行う(ステップS37)。
次に、図7を参照して、輻輳ウインドウ上限算出部1192による輻輳ウインドウ上限算出処理を説明する。
輻輳ウインドウ上限算出部1192は、輻輳ウインドウ増加部1191からACKパケットと、rttbase,sndtime,rcvtime,cwndmaxを受信すると(ステップS41)、輻輳ウインドウサイズの上限値cwndlimitを下記の手順で計算する。cwndlimitは、今回のスロースタートフェーズ中に輻輳ウインドウサイズを増加させる場合の上限値であり、ACKパケットから受信レートを算出し計算を行う。cwndlimitの初期値は、事前に想定した予め定めた最大値(取りうる最大の値)とすることができる。
輻輳ウインドウサイズの上限値cwndlimitの算出は、ACKパケットを受信する度に行い、まず、cwndmaxから求められる送信レートと、今回受信したACKパケットに対応する送信パケットの送信レートとの比較を行う(ステップS42)。
今回受信したACKパケットに対応する送信パケットの送信レートが、cwndmaxから求められる送信レート以上であるときに(ステップS42:Yes)、続いて、今回受信したACKパケットが最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなすACKパケット群)に含まれるか否かの判定を行う(ステップS43)。これにより、無線ネットワークのような遅延変動が起きやすい環境でスロースタートフェーズ時に生じうる輻輳による遅延変動を有して受信するACKパケットが一連の送信パケットに対応するものとして扱うか否かを判定する。この判定には、以下の二例の判定方法が有効である。
第1例の判定方法は、式(6)により行う。尚、sndtimelastは、直前に受信したACKパケットに対応する送信パケットの送信時刻である。
if sndtime−sndtimelast ≦ (MSS/cwndmax)×rttbase (6)
then 最近時に受信したパケット群に含まれる。
else 最近時に受信したパケット群に含まれない。
第2例の判定方法は、式(7)により行う。尚、rcvbyteは最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなしたACKパケット群)で受信したバイト数、sndtimefirstは最近時に受信したパケット群の先頭のACKパケットに対応する送信パケットの送信時刻である。
if sndtime−sndtimefirst ≦
((rcvbyte + 送達確認バイト数)/cwndmax)×rttbase (7)
then 最近時に受信したパケット群に含まれる。
else 最近時に受信したパケット群に含まれない。
今回受信したACKパケットに対応する送信パケットの送信レートが、cwndmaxから求められる送信レート以上でないとき(ステップS42:No)、及び、今回受信したACKパケットが最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなすACKパケット群)に含まれないと判定したとき(ステップS43:No)、最近時に受信したパケット群の記録から式(8)により、最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなしたACKパケット群)の受信レートを基準にして、この受信レートを満たす輻輳ウインドウサイズcwndestを算出する(ステップS45)。
cwndest = rcvbyte × rttbase/(rcvtimelast−rcvtimefirst) (8)
ここに、rcvbyteは最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなしたACKパケット群)で受信したバイト数、rcvtimelastは最近時に受信したパケット群のうち最後のACKパケットを受信した時刻、rcvtimefirstは最近時に受信したパケット群のうち先頭のACKパケットを受信した時刻である。
また、1rtt以上に輻輳ウインドウサイズの算出に要する計測状態が継続することを防ぐことを意図して、1rtt未満で定期的に、輻輳ウインドウサイズの算出を行うようにするために、式(9)に示すように、今回受信したACKパケットに対応する送信パケットに対して連続した送信の期間(sndtime - sndtimefirst)が所定の閾値(本例では、rttbase /2)を超える場合も、式(8)による輻輳ウインドウサイズcwndestを算出するようにする。
if sndtime−sndtimefirst > rttbase /2 (9)
then 式(8)による輻輳ウインドウサイズの算出。
cwndestを算出すると、式(10)により1計測期間でのcwndestの最大値cwndlimit-tmpを更新する(ステップS46,S47)。尚、cwndlimit-tmpの初期値は、cwndlimit-tmp = 0である。
if cwndlimit-tmp < cwndest (10)
then cwndlimit-tmp = cwndest
更に、次に受信するACKパケットに関するステップS44の判定や、輻輳ウインドウサイズの算出のために、式(11)のように各変数をリセットする(ステップS48)。
rcvbyte = 0 (11)
sndtimefirst = sndtime
rcvtimefirst = rcvtime
今回受信したACKパケットに対応する送信パケットの送信レートが、cwndmaxから求められる送信レート以上であり(ステップS42:Yes)、今回受信したACKパケットが最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなすACKパケット群)に含まれると判定したとき(ステップS43:Yes)、即ち送信間隔に基づく判定で連続したパケット列とみなし、且つ連続したパケット列に関する送信パケットの所定の送信期間が予め定めた閾値を超えない場合、式(12)により、当該連続したパケット列の受信バイト数を更新する(ステップS44)。
rcvbyte = rcvbyte + 送達確認バイト数 (12)
次に、1計測期間が経過したか否かを判定し(ステップS49)、1計測期間が経過していたと判定するときは(ステップS49:Yes)、cwndlimit-tmpの更新が行われているか否かを判定する(ステップS50)。
cwndlimit-tmpの更新が行われている場合に(ステップS50:Yes)、式(13)によりcwndlimitを更新する(ステップS51)。
if cwndlimit-tmp > 0 (13)
then cwndlimit = cwndlimit-tmp ,
cwndlimit-tmp = 0
1計測期間を経過していないと判定したとき(ステップS49:No)、及び、cwndlimit-tmpの更新が行われていないとき(ステップS50:No)、cwndlimitは前回値のままである。
ステップS50を経てcwndlimitの値が決定されると、式(14)によりsndtimelast, rcvtimelastを更新する(ステップS52)。尚、実施例1では、式(6)による場合のみ、sndtimelastを利用する。
sndtimelast = sndtime (14)
rcvtimelast = rcvtime
最後に、輻輳ウインドウ上限算出部1192は、cwndlimitを輻輳ウインドウ増加部1191へ通知する(ステップS53)。したがって、輻輳ウインドウ上限算出部1192は、ステップS42及びステップS43の双方の判定を満たすときは当該最近時に受信したパケット群の受信バイト数に今回受信したACKパケットにより送達確認したバイト数を加えた受信バイト数を定め(ステップS44)、ステップS42及びステップS43のいずれか一方の判定を満たさないときには、該受信バイト数から求められる当該最近時に受信したパケット群の受信レートを基準にした輻輳ウインドウサイズ(cwndlimit-tmp)を算出して1計測期間毎に更新し、1計測期間毎に更新した該輻輳ウインドウサイズ(cwndlimit-tmp)を輻輳ウインドウサイズの上限値(cwndlimit)として決定する。そして、輻輳ウインドウ増加部1191は、ACKパケットを受信する度に1計測期間の経過時に決定されたcwndlimit以下で輻輳ウインドウサイズ(cwnd)を所定幅で拡大し、計測期間毎に、1計測期間の経過時に決定されたcwndlimitと当該拡大したcwndとを比較してスロースタートフェーズから輻輳回避フェーズへの遷移を判定する。
このように、輻輳ウインドウ増加部1191及び輻輳ウインドウ上限算出部1192を備える実施例1のスロースタート動作部119aを構成し、パケット送信装置11aに具備させることで、バースト的なパケットロスの発生を抑制し、これにより通信開始時のスロースタートフェーズにおける輻輳ウインドウサイズを拡大させる前の輻輳回避フェーズへの移行を効率よく抑制することができるので、高速な通信が可能となる。
(実施例2のスロースタート動作部)
次に、本発明に係る実施例1のスロースタート動作部119aについて、図8乃至図11を参照して説明する。図8は、本発明に係る実施例2のスロースタート動作部119aの構成を示すブロック図である。図9は、本発明に係る実施例2のスロースタート動作部119aの輻輳ウインドウ増加処理を示すフローチャートである。図10は、本発明に係る実施例2のスロースタート動作部119aの遅延変動量算出処理を示すフローチャートである。図11は、本発明に係る実施例2のスロースタート動作部119aの輻輳ウインドウ上限算出処理を示すフローチャートである。尚、図8は、実施例1と同様な構成要素には同一の参照番号を付している。
図8に示すように、実施例2のスロースタート動作部119aは、輻輳ウインドウ増加処理を実行する輻輳ウインドウ増加部1191と、輻輳ウインドウ上限算出処理を実行する輻輳ウインドウ上限算出部1192と、輻輳とは無関係の遅延変動量を推定する遅延変動量推定部1193を備える。
実施例2において、遅延変動量推定部1193は、受信するACKパケット毎のrttの変動量を監視して連続するACKパケットのパケット列の最大の変動量を計測し、1計測期間毎に当該最大の変動量について移動平均した値をrttの平均変動量として算出する。そして、輻輳ウインドウ上限算出部1192は、このrttの平均変動量を加味して輻輳ウインドウの上限値(cwndlimit)を決定する。そして、輻輳ウインドウ増加部1191は、通信を開始してから現時点までに計測した最小のrtt(rttbase)に当該平均変動量を加えた値と、計測期間内におけるrttについて直前の1計測期間で計測した最小のrtt(rttmin)との比較によってスロースタート終了判定を行い、終了と判定された場合にはスロースタートフェーズから輻輳回避フェーズへ遷移させる。したがって、実施例2は、当該rttの平均変動量を加味してスロースタートフェーズの終了判定を行うことを可能とする点で、実施例1とは相違する。
まず、図9を参照して、輻輳ウインドウ増加部1191による輻輳ウインドウ増加処理を説明する。
輻輳ウインドウ増加部1191は、パケットロス判定部114からACKパケットと、rtt,sndtime,rcvtimeを受信すると(ステップS61)、式(15)によりrttminを更新する(ステップS62,S63)。rttminは直前の1計測期間で決定したrttの最小値である。尚、通信を開始してから1計測期間を経過する前のrttminの値は、通信を開始してから現時点までに計測した最小のrttであるrttbaseと同じ値とすることができる。尚、rttbaseの通信開始時における初期値は、とりうる最大の値など、或る決まった値とすることができる。また、1計測期間の開始から最初に計測したrttについては、その大きさに関わらずrttminに代入する。
if (1計測期間で最初に計測したrtt) or (rttmin > rtt) (15)
then rttmin = rtt
式(15)によりrttminを更新した場合(ステップS63)、続けて式(2)によりrttbaseを更新する(ステップS64,S65)。rttbaseは通信中に計測したrttの最小値である。通信開始時には、とりうる最大の値など、或る決まった値に初期化することができる。
次に、輻輳ウインドウ増加部1191は、遅延変動量推定部1193へACKパケットと、rtt,sndtimeを通知し(ステップS66)、遅延変動量推定部1193からjitteraveを受信する(ステップS67)。jitteraveは輻輳とは無関係の遅延変動量であり、その算出方法は図10を参照して後述する。
次に、輻輳ウインドウ増加部1191は、ACKパケットと、rttbase,jitterave,sndtime,rcvtime,cwndmaxを輻輳ウインドウ上限算出部1192に通知する(ステップS68)。cwndmaxは、輻輳ウインドウ上限算出部1192において輻輳ウインドウサイズの上限値(cwndlimit)の算出に用いる送信パケットを決定するために用いる値である。cwndmaxの値の計算方法(更新方法)は実施例1と同様であり、輻輳ウインドウサイズの上限値(cwndlimit)の算出手順については後述する。
続いて、輻輳ウインドウ増加部1191は、輻輳ウインドウ上限算出部1192からcwndlimitを受信すると(ステップS69)、1計測期間を経過しているか否かを判定する(ステップS70)。この1計測期間が経過していた場合(ステップS70:Yes)、輻輳ウインドウ増加部1191は、スロースタートフェーズを終了するか否かの判定を行う(ステップS72)。この判定は式(16)によって行う。
if rttmin > rttbase + jitterave (16)
then スロースタートフェーズを終了、
else 式(3)によりスロースタートフェーズの終了判定へ移行。
式(3)によるスロースタートフェーズの終了判定は、現在の輻輳ウインドウサイズcwndと輻輳ウインドウサイズの上限値(cwndlimit)との比較によって行い(ステップS73)、スロースタートフェーズを終了する場合(ステップS72:Yes、又はステップS73:Yes)、実施例1と同様に、式(4)に示す処理を行う(ステップS75)。
一方、スロースタートフェーズを継続する場合(ステップS72:No、且つステップS73:No)、実施例1と同様に、式(5)に示す処理を行う(ステップS74)。
また、スロースタートフェーズを継続する場合(ステップS72:No、且つステップS73:No)、cwndmaxの更新も行い、rttminは直前の1計測期間で決定したrttの最小値で初期化する(ステップS74)。
そして、1計測期間が経過していないと判定した場合(ステップS70:No)、輻輳ウインドウ増加部1191は、式(5)に示す処理を行う(ステップS71)。
次に、図10を参照して、遅延変動量推定部1193による遅延変動量算出処理を説明する。
遅延変動量推定部1193は、輻輳ウインドウ増加部1191からACKパケットと、rtt,sndtimeを受信すると(ステップS81)、式(17)による最近時に受信したパケット群(ACKパケットのパケット列)と連続したパケットであるか否かの判定を行う(ステップS82)。
if sndtime−sndtimelast ≦ β (17)
then 連続したパケット、
else 連続していないパケット。
sndtimelastは、直前に受信したACKパケットに対応する送信パケットの送信時刻であり、βは定数である。βは、パケット送信装置11aが計測可能な最小時間の整数倍や、パケット送信装置11aが1MSSの長さを持つTCPパケットを1つ送信するために必要な時間の整数倍とすることができる。
連続したパケットと判定した場合(ステップS82:Yes)、式(18)により当該ACKパケットに関するパケット間のジッタ(jitter)を計算する(ステップS83)。rttlastは、前回受信したACKパケットで計測したrttである。
jitter = |rtt−rttlast| (18)
jitterの計算後、式(19)の処理を行い、1計測期間中の最大のjitterを表すjittermaxを更新する(ステップS84)。
if jittermax < jitter (19)
then jittermax = jitter
一方、連続していないパケットと判定した場合(ステップS82:No)や、1計測期間中の最大のjitterを表すjittermaxを更新しないとき(ステップS84:No)、ステップS86に移行する。
そして、jittermaxの値を確定後、1計測期間が経過しているか判定し(ステップS86)、1計測期間が経過している場合(ステップS86:Yes)、jittermaxの値が0より大きいとして算出されていたときは(ステップS89:Yes)、式(20)により平均ジッタ(jitterave)を更新し(ステップS90)、jittermaxの値を0にリセットする(ステップS91)。jittermaxの値を0にリセットしたとき(ステップS91)、及び、1計測期間が経過している場合でもjittermaxの値が0のときは(ステップS89:No)、ステップS87に移行する。jitteraveの初期値は0である。尚、αは1未満の重み付け定数であり、例えば0.5とするなど予め定めた値とすることができる。
jitterave = (1−α)×jitterave +α×jittermax (20)
次に、今回のACKパケットの受信時に1計測期間が経過していないと判定した場合(ステップS86:No)や、jittermaxの値を0にリセットしたとき(ステップS91)、或いは1計測期間が経過していると判定した場合でもjittermaxの値が0のときは(ステップS89:No)、rttlast, sndtimelastを式(21)により更新する(ステップS87)。
rttlast = rtt (21)
sndtimelast = sndtime
jitteraveの値を確定後、遅延変動量推定部1193は、輻輳ウインドウ増加部1191へ通知する(ステップS88)。
次に、図11を参照して、輻輳ウインドウ上限算出部1192による輻輳ウインドウ上限算出処理を説明する。
輻輳ウインドウ上限算出部1192は、輻輳ウインドウ増加部1191からACKパケットと、rttbase,jitterave,sndtime,rcvtime,cwndmaxを受信すると(ステップS101)、輻輳ウインドウサイズの上限値cwndlimitを下記の手順で計算する。cwndlimitは、スロースタートフェーズ中に輻輳ウインドウサイズを増加させる場合の上限値であり、ACKパケットから受信レートを算出し計算を行う。cwndlimitの初期値は、事前に想定した予め定めた最大値(取りうる最大の値)とすることができる。尚、実施例2は、式(6)の処理を式(22)に、式(7)の処理を式(23)に、式(8)の処理を式(24)に、式(9)の処理を式(25)とする以外は、実施例1と同一の処理である。
輻輳ウインドウサイズの上限値cwndlimitの算出動作は、ACKパケットを受信すると、まず、cwndmaxから求められる送信レートと、今回受信したACKパケットに対応する送信パケットの送信レートとの比較を行う(ステップS102)。
今回受信したACKパケットに対応する送信パケットの送信レートが、cwndmaxから求められる送信レート以上であるときに(ステップS102:Yes)、続いて、今回受信したACKパケットが最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなすACKパケット群)に含まれるか否かの判定を行う(ステップS103)。これにより、無線ネットワークのような遅延変動が起きやすい環境でスロースタートフェーズ時に生じうる輻輳及びジッタによる遅延変動を有して受信するACKパケットが一連の送信パケットに対応するものとして扱うか否かを判定する。この判定には、以下の二例の判定方法が有効である。
第1例の判定方法は、式(22)により行う。尚、sndtimelast及びcwndmaxは、実施例1と同様である。
if sndtime−sndtimelast ≦(MSS/cwndmax)×(rttbase+jitterave) (22)
then 最近時に受信したパケット群に含まれる。
else 最近時に受信したパケット群に含まれない。
第2例の判定方法は、式(23)により行う。尚、sndtimefirstは、実施例1と同様である。
if sndtime−sndtimefirst ≦
((rcvbyte+送達確認バイト数)/cwndmax)×(rttbase+jitterave) (23)
then 最近時に受信したパケット群に含まれる。
else 最近時に受信したパケット群に含まれない。
今回受信したACKパケットに対応する送信パケットの送信レートが、cwndmaxから求められる送信レート以上でないとき(ステップS102:No)、及び、今回受信したACKパケットが最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなすACKパケット群)に含まれないと判定したとき(ステップS103:No)、最近時に受信したパケット群の記録から式(24)により、その受信レートを満たす輻輳ウインドウサイズcwndestを算出する(ステップS105)。
cwndest=rcvbyte×(rttbase+jitterave)/(rcvtimelast−rcvtimefirst) (24)
また、1rtt以上に輻輳ウインドウサイズの算出に要する計測状態が継続することを防ぐことを意図して、1rtt未満で定期的に、輻輳ウインドウサイズの算出を行うようにするために、式(25)に示すように、今回受信したACKパケットに対応する送信パケットに対して連続した送信の期間(sndtime - sndtimefirst)が所定の閾値(本例では、(rttbase+jitterave)/2)を超える場合も、式(24)による輻輳ウインドウサイズcwndestを算出するようにする。
if sndtime−sndtimefirst > (rttbase+jitterave) /2 (25)
then 式(24)による輻輳ウインドウサイズの算出。
cwndestを算出すると、式(10)により1計測期間でのcwndestの最大値cwndlimit-tmpを更新する(ステップS106,S107)。
更に、次に受信するACKパケットに関するステップS44の判定や、輻輳ウインドウサイズの算出のために、式(11)のように各変数をリセットする(ステップS108)。
今回受信したACKパケットに対応する送信パケットの送信レートが、cwndmaxから求められる送信レート以上であり(ステップS102:Yes)、今回受信したACKパケットが最近時に受信したパケット群(即ち、一連の送信パケットに対応するものとしてみなすACKパケット群)に含まれると判定したとき(ステップS103:Yes)、即ち送信間隔に基づく判定で連続したパケット列とみなし、且つ連続したパケット列に関する送信パケットの所定の送信期間が予め定めた閾値を超えない場合、式(12)により、当該連続したパケット列の受信バイト数を更新する(ステップS104)。
次に、1計測期間を経過しているか否かを判定し(ステップS109)、1計測期間を経過していると判定したときは(ステップS109:Yes)、cwndlimit-tmpの更新が行われているか否かを判定する(ステップS110)。
cwndlimit-tmpの更新が行われている場合に(ステップS110:Yes)、式(13)によりcwndlimitを更新する(ステップS111)。
今回受信したACKパケットが1計測期間を経過していないとき(ステップS109:No)、及び、cwndlimit-tmpの更新が行われていないとき(ステップS110:No)、cwndlimitは前回値のままである。
ステップS110を経てcwndlimitの値が決定されると、式(14)によりsndtimelast, rcvtimelastを更新する(ステップS112)。
最後に、輻輳ウインドウ上限算出部1192は、cwndlimitを輻輳ウインドウ増加部1191へ通知する(ステップS113)。したがって、実施例2において、輻輳ウインドウ上限算出部1192は、輻輳とは無関係に生じるジッタをも考慮し、ステップS102及びステップS103の双方の判定を満たすときは当該最近時に受信したパケット群の受信バイト数に今回受信したACKパケットにより送達確認したバイト数を加えた受信バイト数を定め(ステップS104)、ステップS102及びステップS103のいずれか一方の判定を満たさないときには、該受信バイト数から求められる当該最近時に受信したパケット群の受信レートを基準にした輻輳ウインドウサイズ(cwndlimit-tmp)を算出して1計測期間毎に更新し、1計測期間毎に更新した該輻輳ウインドウサイズ(cwndlimit-tmp)を輻輳ウインドウサイズの上限値(cwndlimit)として決定する。そして、輻輳ウインドウ増加部1191は、ACKパケットを受信する度に1計測期間の経過時に決定されたcwndlimit以下で輻輳ウインドウサイズ(cwnd)を所定幅で拡大し、計測期間毎に、1計測期間の経過時に決定されたcwndlimitと当該拡大したcwndとを比較してスロースタートフェーズから輻輳回避フェーズへの遷移を判定する。
このように、輻輳ウインドウ増加部1191、輻輳ウインドウ上限算出部1192及び遅延変動量推定部1193を備える実施例2のスロースタート動作部119aを構成し、パケット送信装置11aに具備させることで、輻輳とは無関係に生じるジッタをも考慮してバースト的なパケットロスの発生を抑制し、これにより通信開始時のスロースタートフェーズにおける輻輳ウインドウサイズを拡大させる前の輻輳回避フェーズへの移行を効率よく抑制することができるので、高速な通信が可能となる。
以上、特定の実施例を挙げて本発明を説明したが、本発明は前述の実施形態及び各実施例に限定されるものではなく、その技術思想を逸脱しない範囲で種々変形可能である。例えば、送達確認に基づく遅延量を用いてパケット送信に関するスロースタート制御を行うパケット送信装置であれば、如何なる態様の装置でもよい。