以下、本発明の具体的な内容について実施例を用いて説明する。本実施例においては、本発明によって実現される機能を「TCPシェーパー」と称す。また、一つのパケットの中に含まれるデータ全体のことをパケットデータと称し、特にTCPセグメントを内包するパケットのことをTCPパケットと称す。TCPセグメントおよびACKの定義については前記背景技術にて定義したものと同じである。
またTCPによる通信は一組のサーバ・クライアントから成り、クライアントは接続要求をサーバに対して送信する。サーバでクライアントからの接続要求が受理された場合、データ通信のためのチャンネルがサーバ・クライアント間で作られる。このチャンネルは同一のサーバ・クライアント間で複数作ることができ、それぞれクライアントIPアドレス・サーバのIPアドレス(例えば図28の送信元IPアドレスフィールド502および宛先IPアドレスフィールド503に格納されたデータ)・クライアントの送信元ポート番号(例えば図19の114に格納されたデータ)・サーバへの宛先ポート番号(例えば図19の115に格納されたデータ)によりチャンネルを識別することができる。以下ではこのチャンネルのことを「セッション」と呼ぶ。
(実施の形態1)本実施の形態1においては以下の順序で話を進める。まず図1を用いて本発明の基本的な動作概念について述べる。次に図3〜図5を用いて基本型TCPシェーパーの構成を説明し、図6〜図9を用いて基本型TCPシェーパーを構成する各モジュールの処理フローについて述べる。最後に「輻輳回避モード」における基本型TCPシェーパーの動作例について図10および図11を用いて説明し、「スロースタートモード」における基本型TCPシェーパーの動作例について図12および図13を用いて述べる。
図1は本発明の基本的な動作概念を説明したものである。図1におけるLAN側クライアント301とWAN側サーバ302は、互いにTCPを用いて通信を行う。LAN側クライアント301とWAN側サーバ302間の通信経路の途中にTCPシェーパーを搭載した中継装置303が存在するものとする。ここで上り方向はTCPシェーパーを搭載した中継装置303からWAN側サーバへの向きである。さらに、TCPシェーパーを搭載した中継装置303とWAN側サーバ302との間の伝送路は、LAN側クライアント301とTCPシェーパーを搭載した中継装置303との間の伝送路に対して「上位の伝送路」と呼ばれる。
LAN側クライアント301がWAN側サーバ302に送信するTCPセグメントG3を、TCPシェーパーを搭載した中継装置303が転送する際、TCPシェーパーを搭載した中継装置303はACK番号フィールドの値(以後、「ACK番号」と称す)bを、nを引いた値b−nに更新しTCPセグメントG4として転送する。このようにTCPシェーパーを搭載した中継装置303によって上り方向TCPセグメントのACK番号がより小さい値に書き換えられることで、TCPセグメントG4はTCPセグメントG2に対するACKではなく、TCPセグメントG2より以前にWAN側サーバ302からLAN側クライアント301に対して送られたTCPセグメントに対するACKとなる。よってG2に対するACKは、図1よりも後の図示されていないシーケンスにおいてTCPシェーパーを搭載した中継装置303から送信されることになる。
するとTCPセグメントの送受信に関するWAN側サーバ302のRTTの値は大きくなり、RTOの値を容易にオーバーしやすくなる。その結果としてTCPセグメントの送受信の輻輳状態が仮想的に引き起こされ、WAN側サーバ302からLAN側クライアント301への下り方向TCPセグメントのスループットが抑えられ、他の種類の通信帯域が確保されやすくなる。
次に図3〜図5を用いて基本型TCPシェーパーの構成を説明する。図3は基本型TCPシェーパーの全体構成の例である。基本型TCPシェーパーA12は例えば図1における中継装置303における拡張機能の一つとして実装される。
通常の中継装置は図3のパケット入力部A1、パケット転送部A2、パケット出力部A9のみを有するが、基本型TCPシェーパーを有する中継装置303はこれらに加えてTCPシェ−パー本体A12をも有する。
TCPシェ−パー本体A12は、パケット転送部A2においてTCPパケット(TCPセグメントを持つパケット)を、経路B1を介してインターセプトし、インターセプトしたTCPパケットのACK番号の変更を行った後、もしくはシーケンス番号を取得した後に経路B2を介して再度パケット転送部A2に戻す。TCPパケット以外のパケットについては、TCPシェ−パー本体A12はインターセプトしない。従って、TCPパケット以外のパケットについてはパケット転送部A2が経路B21を介してパケット入力部A1から受け取った後、そのまま経路B22を介してパケット出力部へ転送する。
図3に示すように、本実施の形態1におけるTCPシェーパー本体A12はパケット傍受部A3、ACK番号変更部A4、シーケンス番号変更部A5、セッション管理部A6、セッション情報保持手段A7、パケット数保持手段A8の各モジュールで構成されている。
パケット傍受部A3は、パケット転送部A2からTCPパケットをインターセプトし他のモジュールへ転送したり、他のモジュールで処理の済んだTCPパケットをパケット転送部A2へ戻したりする役割を持つ。また、パケット傍受部A3は、パケットに含まれる発信元IPアドレス(例えば図28の送信元IPアドレスフィールド502に格納されたデータ)・宛先IPアドレス(例えば図28の宛先IPアドレスフィールド503に格納されたデータ)によりパケットが上り方向に向かっているのかどうかの判定も行う。
ACK番号変更部A4は、パケット傍受部A3がインターセプトしたTCPパケットのうち、例えば後に述べるルールに基づいて抽出した上り方向ACKのACK番号(例えば図19における111)を、セッション情報保持手段A7からセッション管理部A6を介して取得した新たなACK番号へ変更する。
シーケンス番号取得部A5は、パケット傍受部A3がインターセプトした下り方向TCPパケットから、シーケンス番号(例えば図19における110)とTCPデータ(例えば図19における104)のデータ長を抽出する。抽出されたシーケンス番号とTCPデータのデータ長は加算され、その加算された値がセッション管理部A6を介してセッション情報保持手段A7に書き込まれる。
セッション管理部A6は、ACK番号変更部A4またはシーケンス番号取得部A5と、セッション情報保持手段A7またはパケット数保持手段A8との各種データ受け渡しの仲介を行う。
セッション情報保持手段A7またはパケット数保持手段A8に保持されるセッションの数が複数存在する場合、セッション管理部A6はさらに、セッション情報保持手段A7またはパケット数保持手段A8と受け渡しする各種データが、セッション情報保持手段A7またはパケット数保持手段A8のどのセッションに属するかの判定を行う。例えばパケットの発信元IPアドレス(例えば図28の送信元IPアドレスフィールド502に格納されたデータ)・宛先IPアドレス(例えば図28の宛先IPアドレスフィールド503に格納されたデータ)およびTCPの発信元ポート番号(例えば図19の114に格納されたデータ)・宛先ポート番号(例えば図19の115に格納されたデータ)等、そのTCPパケットが属するセッションを特定する情報を他の情報と併せてACK番号変更部A4またはシーケンス番号取得部A5から取得し、それらの情報から例えばセッション情報保持手段A7またはパケット数保持手段A8におけるメモリ空間を特定して、該当するセッションのメモリ空間に保持する。
図4はセッション情報保持手段A7の内部構造の例である。セッション情報保持手段A7はセッション毎にメモリ空間を確保してセッション情報を保持する。例えばセッション1に割り当てられたメモリ空間には、パケットの発信元IPアドレス(例えば図28の送信元IPアドレスフィールド502に格納されたデータ)・宛先IPアドレス(例えば図28の宛先IPアドレスフィールド503に格納されたデータ)およびTCPの発信元ポート番号(例えば図19の114に格納されたデータ)・宛先ポート番号(例えば図19の115に格納されたデータ)を格納するC2、セッションのモード情報C3(詳細は後述)、ACK番号をアドレスS0〜Sn−1へ格納するためのセッションリストC4が保持されている。
セッション情報保持手段A7の内部で管理される各セッションのACK番号を保持するセッションリスト(例えば図4のセッション1におけるC4)はFIFO型の構造を有している。例えば図4のセッション1において、セッション管理部A6がそのセッションリストC4に新規のACK番号を登録する場合には常に一番上のアドレスSn−1へ格納され、セッションリストC4からACK番号を取り出す場合には常に一番下のアドレスS0に格納されているACK番号から取り出されるようになっている。アドレスS0にあるACK番号が取り出されたら、その上のアドレスS1〜Sn−1に格納されているACK番号のデータはそれぞれ1つ下のアドレスへと移動するようになっている。つまり、ある時点でのセッションリストC4において、アドレスS0に登録されているACK番号はその時点で常にもっとも古い時刻に登録されたACK番号であるため最初に取り出され、アドレスSn−1に登録されているACK番号はその時点のセッションリストC4が保持しているACK番号の中でもっとも新しい時刻に登録されたACK番号であるため最後に取り出されることになる。このようにして、セッション情報保持手段A7からは、該当するセッションリストが保持しているものの中で登録された時刻の最も古いACK番号が常に取り出されるようになっている。
セッションリストはセッション毎に保持されるが、通常保持できるセッションの数は有限である。セッション管理部A6がセッション情報保持手段A7に新しいセッションリストを作成しようとした時、もしセッション情報保持手段A7に空いているセッションリストのメモリ空間が無かった場合には、例えばセッション管理部A6はもっとも長時間にわたり更新されていないセッションリストをセッション情報保持手段A7から削除して新しいセッションリストの作成に充てる等のことを行う。
セッションのモード情報(例えば図4のセッション1におけるC3)には、該当するセッションのモードの状態、つまりスロースタートモードであるか、輻輳回避モードであるかの情報が格納される。本実施の形態1においてはスロースタートモードを1、輻輳回避モードを0とする。いずれのモードにおいても、後述するある一定のルールに基づいて抽出された上り方向ACKはそのACK番号(例えば図19・BR>ノおける111)が書き換えられた後にWAN側サーバ302へと転送されるが、それ以外の上り方向ACKはWAN側サーバ302へは転送されない。
本実施の形態1においては以下のような一定のルールにより上り方向ACKの抽出を行うものとする。すなわち、スロースタートモードにおいては上り方向のTCPパケットを必ず1つ置きに抽出してそのACK番号を書き換えるものとし、輻輳回避モードにおいては上り方向のTCPパケットのACK番号を常に書き換えるものとする。本発明における上り方向ACKの抽出ルールはこれに限らずどのように定義しても良いが、その抽出頻度についてはスロースタートモードのそれが輻輳回避モードのそれと同等か、もしくはそれよりも低く設定しなければならない。
パケット数保持手段A8は、上り方向に送信したTCPパケットの数をセッション毎に保持する。図5はパケット数保持手段A8の内部構造の例である。各パケットカウンターJ1、J3、J5には、各セッションの上り方向へ転送したTCPパケットの数が格納される。これらのパケットカウンターJ1、J3、J5は、スロースタートモードにおいて、上り方向ACKを2つに1つの割合でドロップさせるための処理に用いる。
前記セッション情報保持手段A7と同じくパケットカウンターもセッション毎に設けられている。通常保持できるセッション数は有限である。セッション管理部A6がパケット数保持手段A8に新しいセッションに用いるパケットカウンターを作成しようとした時、もしパケット数保持手段A8に空いているパケットカウンターのメモリ空間が無かった場合には、例えばセッション管理部A6はもっとも長時間にわたり更新されていないパケットカウンターをパケット数保持手段A8から削除して新しいセッションに用いるパケットカウンターの作成に充てる等のことを行う。
以上のモジュールを用いて以下のような処理を行うことにより、各セッションに流れるTCPセグメントのスループットを抑える。
これより、図6〜図9を用いて基本型TCPシェーパーを構成する各モジュールの処理フローについて述べる。なお、前述のようにパケット転送部A2以外のモジュールにおいてはTCPパケットのみが取り扱われる。
図6はパケット転送部A2の処理フローの例である。パケットの入力は、パケット入力部A1からのものとパケット傍受部A3からのものとがある。
パケット転送部A2はまずステップf11において、入力されたパケットがどこのモジュールからのものなのかを調べる。入力されたパケットがパケット入力部A1からの入力であれば、パケット転送部A2はステップf12の処理を行う。入力されたパケットがパケット傍受部A3からの入力であれば、そのパケットはTCPシェーパーの処理が終了したパケットであることを意味する。従ってパケット転送部A2はパケット出力部A9へパケットを渡す。
ステップf12において、パケット転送部A2は入力されたパケットがTCPパケットか否かを判定する。例えば背景技術における図28のIPヘッダ113内のプロトコル番号フィールド501に記載している番号が6であればそのパケットはTCPパケットであると判定できる。その場合、パケット転送部A2はパケット傍受部A3にパケットデータを渡し、TCPシェーパーの処理を開始する。入力されたパケットがTCPパケットでない場合、パケット転送部A2は通常の転送処理と同様にパケット出力部A9へパケットを渡す。
図7はパケット転送部A2からの入力パケットに対するパケット傍受部A3の処理フローの例である。
ステップf21において、パケット傍受部A3は入力されたパケットデータから発信元IPアドレス(例えば図28の送信元IPアドレスフィールド502に格納されたデータ)および宛先IPアドレス(例えば図28の宛先IPアドレスフィールド503に格納されたデータ)を取り出す。次にステップf22において、パケット傍受部A3はステップf21で取り出したパケットの発信元IPアドレス(例えば図28の送信元IPアドレスフィールド502に格納されたデータ)・宛先IPアドレスから、上り方向のTCPパケットなのか下り方向のTCPパケットなのかを判別する。
入力されたパケットが上り方向の場合、パケット傍受部A3は図3の経路B3を介してパケットデータをACK番号変更部A4に渡し、下り方向の場合は図3の経路B5を介してパケットデータをシーケンス番号取得部A5に渡す。
ちなみに、ACK番号変更部A4またはシーケンス番号取得部A5からパケット傍受部A3に入力されたパケットデータに対してパケット傍受部A3は何の処理も行わず、パケット転送部A2にパケットデータを渡す。
図8は上り方向TCPパケットに対するACK番号変更部A4の処理フローの例である。
ACK番号変更部A4へ入力されるものはパケット傍受部A3から渡される上り方向のTCPパケットのみである(図3の経路B3)。また、セッション管理部A6との間において、ACK番号変更部A4はTCPパケットそのものでなく、パケットの属しているセッションに関する情報のみでのやり取りを行う。
ACK番号変更部A4は、ステップf401において、パケット傍受部A3から入力された上り方向TCPパケットのTCPデータ部に実データが存在するかどうかを判定する(背景技術の図19におけるTCPパケット102の中にはTCPデータ104の部分に実データが存在しないものがある。以下、このような状態を「TCPデータ無し」と表す。逆にTCPデータ104の部分に実データが存在する状態を「TCPデータ有り」と表す)。上り方向TCPパケットがTCPデータ無しの場合そのTCPパケットはACKなので、ACK番号変更部A4はステップf402の処理を行う。
上り方向TCPパケットがTCPデータ有りの場合、本実施の形態1におけるACK番号変更部A4はその上り方向TCPパケットをドロップする。つまり、図1におけるLAN側クライアント301からのTCPデータ有り上りTCPパケットをWAN側サーバ302へ送らないようにする。その理由としてはTCPデータ有りパケットに対するACKをWAN側サーバ302へ送らないことでTCPのRTTをより大きくし、輻輳状態を発生しやすくすることが挙げられる。TCPデータ有りの上り方向TCPパケットがそれほど多くないことが明らかまたは予測可能な場合、ACK番号変更部A4はそれらのパケットをドロップする代わりに、再びパケット転送部A2へ戻した後、パケット出力部A9を介して中継装置A11より出力するようにしても構わない。しかしながら本実施の形態1においては、ACK番号変更部A4がTCPデータ有りの上り方向TCPパケットをドロップするという前提で話を進める。
ステップf402において、ACK番号変更部A4はセッション管理部A6を経由し、セッション情報保持手段A7から処理中のパケットが属しているセッションのモード情報(例えば図4のセッション1においてはC3)を取得する。ステップf403において、ACK番号変更部A4はステップf402にて取得したモード情報を元に、現在のセッションの動作モードがスロースタートモードか輻輳回避モードかを判定する。
セッションの動作モードが輻輳回避モードである場合、ACK番号変更部A4はステップf404においてセッション情報保持手段A7よりセッション管理部A6経由にて現在処理しているパケットが属するセッションリスト(例えば図4のセッション1であればC4)からその時点でもっとも古いACK番号(例えば図4のセッション1であればアドレスS0に格納されているデータ)を取得し、ステップf405においてパケット傍受部A3が一時的に保持するTCPパケットのACK番号を、先ほど取得したACK番号(例えば図4のセッション1であればS0)に書き換える。その後、ACK番号変更部A4はACK番号の書き換えが完了したTCPパケットをパケット傍受部A3へ渡す。もしセッションリストが空の場合は、ACK番号変更部A4はそこで一時的に保持するTCPパケットのACK番号の書き換えを行わずに、TCPパケットをパケット傍受部A3へ渡す。
セッションの動作モードがスロースタートモードである場合、ACK番号変更部A4はステップf406においてセッション管理部A6経由にてパケット数保持手段A8から現在処理中のパケットの属するセッションのパケットカウンター(例えば図4のセッション1であればJ1)の値を取り出し、ステップf407においてそのパケットカウンターの値が偶数であるか否かを判定する。パケットカウンターの値が偶数の場合にはACK番号変更部A4はステップf408の処理を行い、奇数の場合にはステップf411の処理を行う。(なお、ステップf407の分岐は本実施の形態1と逆に設定しても良い。すなわち、奇数の場合にステップf408の処理を行うという設定でもよい。)
ステップf411において、ACK番号変更部A4はセッション管理部A6経由にてパケット数保持手段A8内の該当するパケットカウンター(例えば図4のセッション1であればJ1)を1インクリメントした後、TCPパケットをドロップする。これにより、「上り方向のTCPパケットを必ず1つ置きに抽出してそのACK番号を書き換える」という、本実施の形態1におけるスロースタートモードが実現する。
ステップf408においてACK番号変更部A4は、セッション管理部A6経由にてセッション情報保持手段A7のうちACK番号変更部A4が一時的に保持しているTCPパケットが属するセッションリスト(例えば図4のセッション1であればC4)からその時点でもっとも古いACK番号(例えば図4のセッション1であればアドレスS0に格納されているデータ)を取得し、ステップf409にてパケットのACK番号を更新する。(ただし、ステップf409において該当するセッションリスト、例えば図4のセッション1であればC4が空の場合、ACK番号変更部A4はACK番号の更新を行わない。)
その後ステップf410において、ACK番号変更部A4はパケット数保持手段A8に該当するセッションのパケットカウンター(例えば図4のセッション1であればJ1)を1インクリメントした後、経路B4を介しパケット傍受部A3に処理が終了したTCPパケットを渡す。
図9はシーケンス番号取得部A5の処理フローの例である。シーケンス番号取得部A5へ入力されるものはパケット傍受部A3から渡される下り方向のTCPパケットのみである(図3の経路B5)。また、セッション管理部A6との間において、シーケンス番号取得部A5はTCPパケットそのものでなく、パケットの属しているセッションに関する情報のみでのやり取りを行う。
ステップf31において、シーケンス番号取得部A5は入力された下り方向TCPパケットのTCPデータ部に実データが存在するかどうかを判定する。すなわち、TCPデータ有りなのかTCPデータ無しなのかを判定する。TCPデータ無しの場合、シーケンス番号取得部A5はその下り方向TCPパケットに対して何も処理を行わずにパケット傍受部A3へパケットデータを渡す。TCPデータ有りの場合、シーケンス番号取得部A5は、ステップf32の処理を実行する。
ステップf32において、シーケンス番号取得部A5は処理中の下り方向TCPパケットからTCPデータ(例えば背景技術の図19においてはTCPパケット102の中のTCPデータ104)のデータ長とシーケンス番号を取得する。ステップf33において、シーケンス番号取得部A5はセッション管理部A6経由でパケットが属しているセッションのリストC4を、セッション情報保持手段A7から取得する。
ステップf34において、シーケンス番号取得部A5は処理中の下り方向TCPパケットに該当するセッションリスト(例えば図4のセッション1であればC4)から最新のACK番号(例えば図4のセッション1であればアドレスSn−1に格納されているデータ)をセッション情報保持手段A7よりセッション管理部A6経由にて取得する。次に、シーケンス番号取得部A5は先ほどのステップf32において取得したTCPデータ長とシーケンス番号との加算値を算出する。そして、その算出値と、先ほど取得した最新のACK番号(例えば図4のセッション1であればアドレスSn−1に格納されているデータ)とを比較する。
ここで最新のACK番号(例えば図4のセッション1であればアドレスSn−1に格納されているデータ)がTCPデータ長とシーケンス番号との加算値より大きい場合、シーケンス番号取得部A5は処理中の下り方向TCPパケットが再送パケットでないと判定する。その後ステップf35において、シーケンス番号取得部A5は先ほどのステップf32において取得した処理中の下り方向TCPパケットのシーケンス番号とTCPデータ長との加算値をセッション情報保持手段A7に保持された該当するセッションリストに追加登録する。
最新のACK番号(例えば図4のセッション1であればSn−1)がTCPデータ長とシーケンス番号との加算値より小さい場合、シーケンス番号取得部A5は処理中の下り方向TCPパケットが再送パケットであると判定する。この状態は輻輳が発生した(パケットロス、RTOオーバー)とみなされるので、シーケンス番号取得部A5はステップf36において、セッション情報保持手段A7中に保持された該当セッションのモード情報(例えば図4のセッション1であればC3)を輻輳回避モードに設定する。
その後ステップf37にて、シーケンス番号取得部A5はセッション情報保持手段A7からその時点でもっとも古いACK番号(例えば図4のセッション1であればアドレスS0に格納されているデータ)を取り出し、そのACK番号を持つTCPデータ無しの上り方向TCPパケットを、セッション情報保持手段A7のC2に格納されている送信元IPアドレス(例えば図28の宛先IPアドレスフィールド502に格納されたデータ)・宛先IPアドレス(例えば図28の宛先IPアドレスフィールド503に格納されたデータ)・送信元ポート番号(例えば図19の114に格納されたデータ)・宛先ポート番号(例えば図19の115に格納されたデータ)を元に新たに構築し、その上り方向TCPパケットと、処理済みの下り方向TCPパケットとをB6にてパケット傍受部A3に渡す。もし処理中の下り方向TCPパケットに該当するセッションリストがセッション情報保持手段A7に存在しない場合、つまり新規セッションの場合、シーケンス番号取得部A5はセッション管理部A6を介してセッション情報保持手段A7内に新規のセッションリストを作成する。
以上の構成および処理フローを有する基本型TCPシェーパーの動作例を説明する。まず、図10・図11を用いて輻輳回避モード時の基本型TCPシェーパーの動作例について述べる。図10はサーバ401・クライアント402・TCPシェーパーを搭載した中継装置(以下、「TCPシェーパー中継装置」と称す)403間での輻輳回避モード時のTCPによる通信の例である。サーバ401・クライアント402間の通信経路途中にはTCPシェーパー中継装置403がある。このTCPシェーパー中継装置403の内部構成は図3〜図5に示すものと同一とする。さらに、TCPシェーパー中継装置403がサーバ401・クライアント402間の通信経路途中で取り扱うパケットは、前述の図6〜図9に示すフロー処理がなされるものとする。サーバ401はクライアント402に対してTCPで毎回1000バイトずつTCPデータを含むパケット(K10、K30、K40、K60、K70、K90)を送信する。クライアント402はサーバ401に対しTCPデータを含まないパケット(M2、M5、M8)、つまりサーバ401から送信されたTCPデータを含むパケット(K10、K30、K40、K60、K70)に対するACKを送信する。
図11は、図10の通信時におけるセッション情報保持手段A7でのセッションリストの遷移例である。それらのセッションリストの遷移は図4のセッション保持手段A7におけるセッション1上で行われるものとする。すなわち、TCPシェーパー中継装置403のセッション情報保持手段A7のセッションリストC4は図11の状態L1から開始され、値11001と値10001がそれぞれ状態L1におけるセッションリストC4のアドレスS0およびS1にあらかじめ格納されている。値10001は値11001より古い時刻に登録されたものである。この時点において輻輳はまだ発生していないものとする
また、図10・図11の通信は輻輳回避モードなので、状態L1時のセッション1のモード情報C3には、輻輳回避モードであることを示す値0が格納されているものとする。
最初に、サーバ401がパケットK10を、クライアント402に対して送信する。次に、サーバ401・クライアント402間の通信経路途中にあるTCPシェーパー中継装置403が一旦そのパケットK10を受信する。パケットK10は下り方向なので、シーケンス番号取得部A5は前述図9に示すf31からのフローに従い、後述するフローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
f31においてパケットK10はTCPデータを含むので、TCPシェーパー中継装置403のシーケンス番号取得部A5はパケットK10のシーケンス番号とTCPデータ長を取得し(図9のf32)、パケットK10が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、セッション情報保持手段A7に保持されているパケットK10のセッションリストがどれなのかを特定する(図9のf33)。本実施の形態1においては、パケットK10のIPアドレス情報およびポート番号情報が図4に示すセッション情報保持手段A7におけるセッション1のIPアドレス情報およびポート番号情報C2と一致し、その結果パケットK10のセッションリストがセッション1のセッションリストC4であると特定されるものとする。
その後、シーケンス番号取得部A5はパケットK10が再送TCPパケットか否かを例えば以下のようにして判断する(図9のf34)。
図10においてパケットK10はシーケンス番号=11001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置403のシーケンス番号取得部A5は図9の処理フローf32において取得したパケットK10のシーケンス番号とTCPデータ長を加算する。すなわち、11001 + 1000 = 12001と加算する。
次にTCPシェーパー中継装置403のシーケンス番号取得部A5は、このシーケンス番号とTCPデータ長とを加算した値12001と、セッション情報保持手段A7のセッションリストC4の状態L1におけるS1に格納された、この時点で最も登録された時刻が新しいACK番号の値11001とを比較する。シーケンス番号とTCPデータ長とを加算した値12001のほうが大きいので、シーケンス番号取得部A5はパケットK10が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値をセッション情報保持手段A7のセッションリストC4に追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値12001をセッション情報保持手段A7のセッションリストC4のS2に格納する。
その後、シーケンス番号取得部A5はパケットK10をパケットM1としてパケット傍受部A3へ渡す(図9のf38)。パケットM1はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりクライアント402へと転送される。このとき、セッションリストC4は図11に示すように状態L1から状態L2へと遷移する。
パケットM1を受信したクライアント402は、パケットM1のACKとして、ACK番号12001を持ち、かつTCPデータを含まないパケットM2をサーバ401へ送信する。その途中でサーバ401とクライアント402間の通信経路途中にあるTCPシェーパー中継装置403が一旦そのパケットM2を受信する。パケットM2は上り方向なので、ACK番号変更部A4は図8に示すf401からのフローに従ってクライアント402から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ401へ渡すことによりサーバ401からクライアント402へのデータ送信の帯域を抑えるための処理を行う。
f401においてパケットM2はTCPデータを含まないので、TCPシェーパー中継装置403のACK番号変更部A4は、パケットM2が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、セッション情報保持手段A7に保持されているパケットM2のセッションリストがどれなのかを特定する(図8のf402)。本実施の形態1においては、パケットM2のIPアドレス情報およびポート番号情報が図4に示すセッション情報保持手段A7におけるセッション1のIPアドレス情報およびポート番号情報C2と一致し、その結果パケットM2のセッションリストがセッション1のセッションリストC4であると特定されるものとする。
その後、ACK番号変更部A4は、パケットM2のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、ACK番号保持手段A7のセッション1のモード情報C3に格納された値を元に判断する(図8のf403)。セッション1のモード情報C3には値0(輻輳回避モードを表す)が格納されているので、ACK番号変更部A4はパケットM2に対し、図8に示すf404からのフローに従って輻輳回避モードにおける処理を行う。
f404においてTCPシェーパー中継装置403のACK番号変更部A4はその時点でセッション情報保持手段A7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態L2におけるS0に格納された値10001を取得し(図8のf404。その結果、セッションリストC4のS0の値10001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移る)、その値10001をパケットM2のACK番号に上書きする(図8のf405)。パケットM2のACK番号が書き換えられたパケットK20はパケット傍受部A3へと渡され(図8のf412)、そしてパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりサーバ401へと転送される(図8のf412)。このとき、セッションリストC4は図11に示すように状態L2から状態L3へと遷移する。
この時点においてサーバ401にとっては既にクライアント402へ送信したパケットK10に対するACKがまだ返信されていないことになるが、本実施の形態1におけるパケットK20を受信したサーバ401はまだ輻輳が起きていないと判断し、引き続き次のデータが格納された2つのパケットK30、K40を連続してクライアント402に送信するものとする。その途中でサーバ401・クライアント402間の通信経路途中にあるTCPシェーパー中継装置403が一旦そのパケットK30およびK40を受信する。パケットK30およびK40は下り方向なので、シーケンス番号取得部A5は前述のパケットK10の場合と同様に図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
すなわちパケットK30は前述のパケットK10の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。その後、シーケンス番号取得部A5はパケットK30が再送TCPパケットか否かを、前述のパケットK10の場合と同様に以下のようにして判断する(図9のf34)。
図10においてパケットK30はシーケンス番号=12001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置403のシーケンス番号取得部A5は図9の処理フローf32において取得したパケットK30のシーケンス番号とTCPデータ長を加算する。すなわち、12001 + 1000 = 13001と加算する。次にTCPシェーパー中継装置403のシーケンス番号取得部A5は、このシーケンス番号とTCPデータ長とを加算した値13001と、セッション情報保持手段A7のセッションリストC4の状態L3におけるS1に格納された、この時点で最も登録された時刻が新しいACK番号の値12001とを比較する。シーケンス番号とTCPデータ長とを加算した値13001のほうが大きいので、シーケンス番号取得部A5はパケットK30が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値13001をセッション情報保持手段A7のセッションリストC4のS2に格納する。その後、シーケンス番号取得部A5はパケットK30をパケットM3としてパケット傍受部A3へ渡す(図9のf38)。パケットM3はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりクライアント402へと転送される。このとき、セッションリストC4は図11に示すように状態L3から状態L4へと遷移する。
パケットK40に対しても前述のパケットK30の場合と同様な処理が行われる。すなわち、パケットK40がTCPデータを含み、そのセッションリストがセッション1のセッションリストC4であると特定されるので(図9のf31〜f33)、シーケンスTCPシェーパー中継装置403のシーケンス番号取得部A5は、パケットK40のシーケンス番号13001とTCPデータ長1000とを加算した値14001と、セッション情報保持手段A7のセッションリストC4の状態L4におけるS2に格納された、この時点で最も登録された時刻が新しいACK番号の値13001とを比較する(図9のf34)。シーケンス番号とTCPデータ長とを加算した値14001のほうが大きいので、シーケンス番号取得部A5はK40が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値13001をセッション情報保持手段A7のセッションリストC4のS3に格納する。その後、シーケンス番号取得部A5はパケットK40をパケットM4としてパケット傍受部A3へ渡す(図9のf38)。パケットM4はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりクライアント402へと転送される。このとき、セッションリストC4は図11に示すように状態L4から状態L5へと遷移する。
パケットM3・M4を受信したクライアント402は、このようにパケットM3、M4を短い間隔で受信した場合には、パケットM3、M4に対するACKをパケットM5に一つにまとめてサーバ401に送信するものとする。パケットM5は、ACK番号14001を持ち、かつTCPデータを含まない。その途中でサーバ401とクライアント402間の通信経路途中にあるTCPシェーパー中継装置403が一旦そのパケットM5を受信する。パケットM5は上り方向なので、ACK番号変更部A4は前述のACKパケットM2の場合と同様に、再び図8に示すf401からのフローに従ってクライアント402から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ401へ渡すことによりサーバ401からクライアント402へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットM5は前述のパケットM2の場合と同様にして、TCPデータを含まないパケットであると判定され(図8のf401)、そのセッションリストがセッション1のセッションリストC4であると特定される(図8のf402)。
その後、ACK番号変更部A4は、パケットM5のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、ACK番号保持手段A7のセッション1のモード情報C3に格納された値を元に判断する(図8のf403)。セッション1のモード情報C3には値0(輻輳回避モードを表す)が格納されているので、ACK番号変更部A4はパケットM5に対し、図8に示すf404からのフローに従って輻輳回避モードにおける処理を行う。
f404においてTCPシェーパー中継装置403のACK番号変更部A4はその時点でセッション情報保持手段A7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態L5におけるS0に格納された値11001を取得し(図8のf404。その結果、セッションリストC4のS0の値11001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移る)、その値11001をパケットM5のACK番号に上書きする(図8のf405)。パケットM5のACK番号が書き換えられたパケットK50はパケット傍受部A3へと渡され(図8のf412)、そしてパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりサーバ401へと転送される。このとき、セッションリストC4は図11に示すように状態L5から状態L6へと遷移する。
この時点においてもサーバ401にとっては既にクライアント402へ送信したパケットK10・K30・K40に対するACKがまだ返信されていないことになるが、本実施の形態1におけるパケットK50を受信したサーバ401は未だ輻輳が起きていないと判断し、引き続き次のデータが格納された2つのパケットK60、K70を連続してクライアント402に送信するものとする。その途中でサーバ401・クライアント402間の通信経路途中にあるTCPシェーパー中継装置403が一旦そのパケットK60およびK70を受信する。パケットK60およびK70は下り方向なので、シーケンス番号取得部A5は前述のパケットK10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
すなわちまずパケットK60は前述のパケットK10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。その後、TCPシェーパー中継装置403のシーケンス番号取得部A5は、パケットK60のシーケンス番号14001とTCPデータ長1000とを加算した値15001と、セッション情報保持手段A7のセッションリストC4の状態L6におけるS2に格納された、この時点で最も登録された時刻が新しいACK番号の値14001とを比較する。シーケンス番号とTCPデータ長とを加算した値15001のほうが大きいので、シーケンス番号取得部A5はパケットK60が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値15001をセッション情報保持手段A7のセッションリストC4のS3に格納する。その後、シーケンス番号取得部A5はパケットK60をパケットM6としてパケット傍受部A3へ渡す(図9のf38)。パケットM7はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりクライアント402へと転送される。このとき、セッションリストC4は図11に示すように状態L6から状態L7へと遷移する。
パケットK70に対しても前述のパケットK60の場合と同様な処理が行われる。すなわち、パケットK70がTCPデータを含み、そのセッションリストがセッション1のセッションリストC4であると特定されるので(図9のf31〜f33)、TCPシェーパー中継装置403のシーケンス番号取得部A5は、パケットK70のシーケンス番号15001とTCPデータ長1000とを加算した値16001と、セッション情報保持手段A7のセッションリストC4の状態L7におけるS3に格納された、この時点で最も登録された時刻が新しいACK番号の値15001とを比較する(図9のf34)。シーケンス番号とTCPデータ長とを加算した値16001のほうが大きいので、シーケンス番号取得部A5はK40が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値16001をセッション情報保持手段A7のセッションリストC4のS4に格納する。その後、シーケンス番号取得部A5はパケットK70をパケットM7としてパケット傍受部A3へ渡す(図9のf38)。パケットM7はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりクライアント402へと転送される。このとき、セッションリストC4は図11に示すように状態L7から状態L8へと遷移する。
パケットM6・M7を受信したクライアント402は、前述のパケットM3およびM4の場合と同様にパケットM6、M7を短い間隔で受信したので、パケットM6、M7に対するACKをパケットM8に一つにまとめてサーバ401に送信する。パケットM8は、ACK番号16001を持ち、かつTCPデータを含まない。その途中でサーバ401とクライアント402間の通信経路途中にあるTCPシェーパー中継装置403が一旦そのパケットM8を受信する。パケットM8は上り方向なので、ACK番号変更部A4は図8に示すf401からのフローに従ってクライアント402から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ401へ渡すことによりサーバ401からクライアント402へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットM8は前述のACKパケットM2等の場合と同様にして、TCPデータを含まないパケットであると判定され(図8のf401)、そのセッションリストがセッション1のセッションリストC4であると特定される(図8のf402)。
その後、ACK番号変更部A4は、パケットM8のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、ACK番号保持手段A7のセッション1のモード情報C3に格納された値を元に判断する(図8のf403)。セッション1のモード情報C3には値0(輻輳回避モードを表す)が格納されているので、ACK番号変更部A4はパケットM8に対し、図8に示すf404からのフローに従って輻輳回避モードにおける処理を行う。
f404においてTCPシェーパー中継装置403のACK番号変更部A4はその時点でセッション情報保持手段A7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態L8におけるS0に格納された値12001を取得し(図8のf404。その結果、セッションリストC4のS0の値12001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移り、S4に格納された値がS3に移る)、その値12001をパケットM8のACK番号に上書きする(図8のf405)。パケットM8のACK番号が書き換えられたパケットK80はパケット傍受部A3へと渡され(図8のf412)、そしてパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりサーバ401へと転送される。このとき、セッションリストC4は図11に示すように状態L8から状態L9へと遷移する。なお、このときのパケットK80は、サーバ401にとって結果的にパケットK10に対するACKとなっている。
この時点においてサーバ401にとっては既にクライアント402へ送信したパケットK10・K30・K40・K60・K70のうちパケットK10に対するACKは返信されてきているが、残りの送信パケットK30・K40・K60・K70に対するACKがまだ返信されていないことになる。ここに至り本実施の形態1におけるACKパケットK80を受信したサーバ401はパケットK30に対するACK(ACK番号13001を持つパケット)をクライアント402から受け取っていないために、サーバ401においてパケットK30に対するRTOがオーバーしたものとする。
そこでサーバ401はパケットK30以降の送信パケットにおいて輻輳が発生したと判断し、クライアント402に対してパケットK30と同様の内容を持つパケットK90を再送する。その途中でサーバ401とクライアント402間の通信経路途中にあるTCPシェーパー中継装置403が一旦そのパケットK90を受信する。パケットK90は下り方向なので、シーケンス番号取得部A5は前述のパケットK10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
すなわちまずパケットK90は前述のパケットK10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。その後、シーケンス番号取得部A5はパケットK90が再送TCPパケットか否かを例えば以下のように
して判断する(図9のf34)。
図10においてパケットK90はシーケンス番号=15001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置403のシーケンス番号取得部A5は図9の処理フローf32において取得したパケットK90のシーケンス番号とTCPデータ長を加算する。すなわち、12001 + 1000 = 13001と加算する。次にTCPシェーパー中継装置403のシーケンス番号取得部A5は、このシーケンス番号とTCPデータ長とを加算した値13001と、セッション情報保持手段A7のセッションリストC4の状態L9におけるS3に格納された、この時点で最も登録された時刻が新しいACK番号の値16001とを比較する。シーケンス番号とTCPデータ長とを加算した値13001のほうが小さいので、シーケンス番号取得部A5はパケットK90が再送TCPパケットであると判断し、再送パケット用の処理を行う(図9のf36〜f37)。この場合シーケンス番号取得部A5は、セッション情報保持手段A7におけるセッション1のモード情報C3を、輻輳回避モードであることを示す値0に更新する(図9のf36、しかしもともと輻輳回避モードであるためモード情報C3の値は変化しない。)。
サーバ401は輻輳状態の間、TCPデータを含むパケットをクライアント402へ再送のみ行い、新たなTCPデータをクライアント402に送信しないため、輻輳状態が長く続くと転送効率が悪くなる。そこでサーバ403を輻輳状態からなるべく早く復帰させるために、TCPシェーパー中継装置403は例えばサーバ401へのACKを生成し、送信する。
すなわちTCPシェーパー中継装置403のシーケンス番号取得部A5は、セッション情報保持手段A7のC2に格納されている送信元IPアドレス(例えば図28の502)・宛先IPアドレス(例えば図28の503)・送信元ポート番号(例えば図19の114)・宛先ポート番号(例えば図19の115)を元に、サーバ401を輻輳状態から復帰させるために上り方向のTCPデータ無しパケットK91を生成し、パケット傍受部A3へ渡す。
その次に、TCPシェーパー中継装置403のACK番号変更部A4は、先ほどシーケンス番号取得部A5に置いて生成されたパケットK91をパケット傍受部A3から入力し、その時点でセッション情報保持手段A7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態L9にてS0に格納されている値13001を取得し(その結果、セッションリストC4のS0の値13001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移る。)、その値13001をパケットK91のACK番号に書き込む(図9のf37)。ACK番号13001が書き込まれたパケットK91はパケット傍受部A3へと渡され(図9のf38)、そしてパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりサーバ401へと送信される。
その後、TCPシェーパー中継装置403はセッション情報保持手段A7にACK番号を格納せず、パケットK90をパケットM9としてパケット傍受部A3へ渡す(図9のf38)。パケットM9はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置403よりクライアント402へと転送される。このとき、セッションリストC4は状態L9から状態L10へと遷移する。
次に、図12・図13を用いてスロースタートモード時の基本型TCPシェーパーの動作例について述べる。図12はサーバ404・クライアント405・TCPシェーパー中継装置406間でのスロースタートモード時のTCPによる通信の例である。サーバ404・クライアント405間の通信経路途中にはTCPシェーパー中継装置406がある。このTCPシェーパー中継装置406の内部構成は図3〜図5に示すものと同一とする。さらに、TCPシェーパー中継装置406がサーバ404・クライアント405間の通信経路途中で取り扱うパケットは、前述の図6〜図9に示すフロー処理がなされるものとする。サーバ404はクライアント405に対してTCPで毎回1000バイトずつTCPデータを含むパケット(P10、P30、P50、P70、P80、P100、P120)を送信する。クライアント405はサーバ404に対しTCPデータを含まないパケット(R2、R4、R6、R9、R11)、つまりサーバ404から送信されたTCPデータを含むパケット(P10、P30、P50、P70、P80、P100)に対するACKを送信する。
図13は、図12の通信時におけるセッション情報保持手段A7でのセッションリストの遷移例である。それらのセッションリストの遷移は図4のセッション保持手段A7におけるセッション1上で行われるものとする。すなわち、TCPシェーパー中継装置406のセッション情報保持手段A7のセッションリストC4は図13の状態Q1から開始され、値11001と値10001がそれぞれ状態Q1におけるセッションリストC4のアドレスS0およびS1にあらかじめ格納されている。値10001は値11001より古い時刻に登録されたものである。この時点において輻輳はまだ発生していないものとする
また、図12・図13の通信はスロースタートモードなので、状態Q1時のセッション1のモード情報C3には、スロースタートモードであることを示す値1が格納されているものとする。さらにパケット数保持手段A8内のセッション1のパケットカウンターJ1には偶数の値が格納されているものとする。サーバ404がスロースタートモードの場合、TCPシェーパー中継装置406は、このパケット数保持手段A8内のパケットカウンターを後述するような形で用いることにより、なるべく早く輻輳状態を引き起こして輻輳回避モードへと切り替えさせる。こうすることによって、TCPシェーパー中継装置406はスロースタートモードにおけるサーバ404からクライアント405への通信帯域の急激な増大を抑えることが出来る。
最初に、サーバ404がパケットP10を、クライアント405に対して送信する。次に、サーバ404・クライアント405間の通信経路途中にあるTCPシェーパー中継装置406はパケットP10を受信する。パケットP10は下り方向なので、シーケンス番号取得部A5は前述の輻輳回避モードにおける基本型TCPシェーパーの動作例の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
パケットP10は前述の輻輳回避モードにおける基本型TCPシェーパーの動作例の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。その後、シーケンス番号取得部A5はパケットP10が再送TCPパケットか否かを例えば以下のようにして判断する(図9のf34)。
図10においてパケットP10はシーケンス番号=11001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置406のシーケンス番号取得部A5は図9の処理フローf32において取得したパケットP10のシーケンス番号とTCPデータ長を加算する。すなわち、11001 + 1000 = 12001と加算する。次にTCPシェーパー中継装置406のシーケンス番号取得部A5は、このシーケンス番号とTCPデータ長とを加算した値12001と、セッション情報保持手段A7のセッションリストC4の状態Q1におけるS1に格納された、この時点で最も登録された時刻が新しいACK番号の値11001とを比較する。シーケンス番号とTCPデータ長とを加算した値12001のほうが大きいので、シーケンス番号取得部A5はパケットP10が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値をセッション情報保持手段A7のセッションリストC4に追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値12001をセッション情報保持手段A7のセッションリストC4のS2に格納する。その後、シーケンス番号取得部A5はパケットP10をパケットR1としてパケット傍受部A3へ渡す(図9のf38)。パケットR1はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりクライアント405へと転送される(図9のf38)。このとき、セッションリストC4は図13に示すように状態Q1から状態Q2へと遷移する。
パケットR1を受信したクライアント405は、パケットR1のACKとして、ACK番号12001を持ち、かつTCPデータを含まないパケットR2をサーバ404へ送信する。その途中でサーバ404とクライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットR2を受信する。パケットR2は上り方向なので、ACK番号変更部A4は前述の輻輳回避モードにおける基本型TCPシェーパーの動作例の場合と同様に、図8に示すf401からのフローに従ってクライアント405から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ404へ渡すかあるいはサーバ404に対するACKパケットをドロップすることによりサーバ404からクライアント405へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットR2は前述の輻輳回避モードにおける基本型TCPシェーパーの動作例の場合と同様にして、TCPデータを含まないパケットであると判定され(図8のf401)、そのセッションリストがセッション1のセッションリストC4であると特定される(図8のf402)。
その後、ACK番号変更部A4は、パケットR2のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、ACK番号保持手段A7のセッション1のモード情報C3に格納された値を元に判断する(図8のf403)。セッション1のモード情報C3には値1(スロースタートモードを表す)が格納されているので、ACK番号変更部A4はパケットR2に対し、図8に示すf406からのフローに従ってスロースタートモードにおける処理を行う。
f406においてTCPシェーパー中継装置406のACK番号変更部A4は、パケットR2が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、パケット数保持手段A8に保持されているパケットR2のパケットカウンタがどれなのかを特定し、パケットカウンタの値を取得する。本実施の形態1においては、パケットR2のIPアドレス情報およびポート番号情報が図5に示すパケット数保持手段A8におけるセッション1のIPアドレス情報およびポート番号情報J2と一致し、その結果パケットR2のパケットカウンタがセッション1のパケットカウンタJ1であると特定されるものとする。すなわちf406ではTCPシェーパー中継装置406のACK番号変更部A4は、パケットカウンタJ1の値を取得する。
f407においてパケットカウンタJ1には偶数の値が格納されているので、ACK番号変更部A4はクライアント405から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ404へ渡す処理を実行する。つまり、TCPシェーパー中継装置406のACK番号変更部A4はセッション情報保持手段A7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態Q2におけるS0に格納された値10001を取得し(図8のf408。その結果、セッションリストC4のS0の値10001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移る)、その値10001をパケットR2のACK番号に上書きし(図8のf409)、パケットカウンタJ1の値を1インクリメントして更新する(図8のf410。その結果、パケットカウンタJ1の値は奇数になる。)。パケットR2のACK番号が書き換えられたパケットP20はパケット傍受部A3へと渡され(図8のf412)、そしてパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりサーバ404に転送へと転送される(図8のf412)。このとき、セッションリストC4は図13に示すように状態Q2から状態Q3へと遷移する。
この時点においてサーバ404にとっては既にクライアント405へ送信したパケットP10に対するACKが返信されていないことになるが、本実施の形態1におけるパケットP20を受信したサーバ404はまだ輻輳が起きていないと判断し、引き続き次のデータが格納されたパケットP30を、クライアント405に送信するものとする。その途中でサーバ404・クライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットP30を受信する。パケットP30は下り方向なので、シーケンス番号取得部A5は前述のパケットP10の場合と同様に、再び図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
すなわちパケットP30は前述のパケットP10の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。その後、シーケンス番号取得部A5はパケットP30が再送TCPパケットか否かを、前述のパケットP10の場合と同様に以下のようにして判断する(図9のf34)。
図10においてパケットP30はシーケンス番号=12001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置406のシーケンス番号取得部A5は図9の処理フローf32において取得したパケットP30のシーケンス番号とTCPデータ長を加算する。すなわち、12001 + 1000 = 13001と加算する。次にTCPシェーパー中継装置406のシーケンス番号取得部A5は、このシーケンス番号とTCPデータ長とを加算した値13001と、セッション情報保持手段A7のセッションリストC4の状態Q3におけるS1に格納された、この時点で最も登録された時刻が新しいACK番号の値12001とを比較する。シーケンス番号とTCPデータ長とを加算した値13001のほうが大きいので、シーケンス番号取得部A5はパケットP30が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値13001をセッション情報保持手段A7のセッションリストC4のS2に格納する。その後、シーケンス番号取得部A5はパケットP30をパケットR3としてパケット傍受部A3へ渡す(図9のf38)。パケットR3はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりクライアント405へと転送される。このとき、セッションリストC4は図13に示すように状態Q3から状態Q4へと遷移する。
パケットR3を受信したクライアント405は、パケットR3のACKとして、ACK番号13001を持ち、かつTCPデータを含まないパケットR4をサーバ404に送信する。その途中でサーバ404とクライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットR4を受信する。パケットR4は上り方向なので、ACK番号変更部A4は前述のACKパケットR2の場合と同様に、再び図8に示すf401からのフローに従ってクライアント405から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ404へ渡すかあるいはサーバ404に対するACKパケットをドロップすることによりサーバ404からクライアント405へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットR4は前述のパケットR2の場合と同様にして、TCPデータを含まないパケットであると判定され(図8のf401)、そのセッションリストがセッション1のセッションリストC4であると特定される(図8のf402)。
その後、ACK番号変更部A4は、パケットR4のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、ACK番号保持手段A7のセッション1のモード情報C3に格納された値を元に判断する(図8のf403)。セッション1のモード情報C3には値1(スロースタートモードを表す)が格納されているので、ACK番号変更部A4はパケットR4に対し、図8に示すf406からのフローに従ってスロースタートモードにおける処理を行う。
f406においてTCPシェーパー中継装置406のACK番号変更部A4は、前述のACKパケットR2の場合と同様にして、パケットR4のパケットカウンタがセッション1のパケットカウンタJ1であると特定し、そこに格納されている値を取得する。
f407においてパケットカウンタJ1には奇数の値が格納されているので、ACK番号変更部A4はサーバ404に対するACKパケットをドロップする処理を実行する。つまり、TCPシェーパー中継装置406のACK番号変更部A4はパケットカウンタJ1の値を1インクリメントして更新し(図8のf411。その結果、パケットカウンタJ1の値は偶数になる。)、パケットR4をドロップする(図8のf413)。このとき、セッションリストC4は図13に示すように状態Q4から状態Q5へと遷移する。
この時点においてサーバ404にとっては既にクライアント405へ送信したパケットP10およびP30に対するACKが未だ返信されていないことになるが、本実施の形態1におけるサーバ404は輻輳が起きていないと判断し、引き続き次のデータが格納されたパケットP50を、クライアント405に送信するものとする。その途中でサーバ404・クライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットP50を受信する。パケットP50は下り方向なので、シーケンス番号取得部A5は前述のパケットP10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
すなわちまずパケットP50は前述のパケットP10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。次にTCPシェーパー中継装置406のシーケンス番号取得部A5は、パケットP50のシーケンス番号13001とTCPデータ長1000とを加算した値14001と、セッション情報保持手段A7のセッションリストC4の状態Q5におけるS2に格納された、この時点で最も登録された時刻が新しいACK番号の値13001とを比較する。シーケンス番号とTCPデータ長とを加算した値14001のほうが大きいので、シーケンス番号取得部A5はパケットP50が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値14001をセッション情報保持手段A7のセッションリストC4のS3に格納する。その後、シーケンス番号取得部A5はパケットP50をパケットR5としてパケット傍受部A3へ渡す(図9のf38)。パケットR5はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりクライアント405へと転送される。このとき、セッションリストC4は図13に示すように状態Q5から状態Q6へと遷移する。
パケットR5を受信したクライアント405は、パケットR5のACKとして、ACK番号14001を持ち、かつTCPデータを含まないパケットR6をサーバ404に送信する。その途中でサーバ404とクライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットR6を受信する。パケットR6は上り方向なので、ACK番号変更部A4は図8に示すf401からのフローに従ってクライアント405から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ404へ渡すかあるいはサーバ404に対するACKパケットをドロップすることによりサーバ404からクライアント405へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットR6は前述のパケットR2等の場合と同様にして、TCPデータを含まないパケットであると判定され(図8のf401)、そのセッションリストがセッション1のセッションリストC4であると特定される(図8のf402)。
その後、ACK番号変更部A4は、パケットR6のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、ACK番号保持手段A7のセッション1のモード情報C3に格納された値を元に判断する(図8のf403)。セッション1のモード情報C3には値1(スロースタートモードを表す)が格納されているので、ACK番号変更部A4はパケットR6に対し、図8に示すf406からのフローに従ってスロースタートモードにおける処理を行う。
f406においてTCPシェーパー中継装置406のACK番号変更部A4は、前述のパケットR2等の場合と同様にして、パケットR6のパケットカウンタがセッション1のパケットカウンタJ1であると特定し、そこに格納されている値を取得する。
f407においてパケットカウンタJ1には偶数の値が格納されているので、ACK番号変更部A4はクライアント405から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ404へ渡す処理を実行する。つまり、TCPシェーパー中継装置406のACK番号変更部A4はセッション情報保持手段A7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態Q6におけるS0に格納された値11001を取得し(図8のf408。その結果、セッションリストC4のS0の値11001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移る。)、その値11001をパケットR6のACK番号に上書きし(図8のf409)、パケットカウンタJ1の値を1インクリメントして更新する(図8のf410。その結果、パケットカウンタJ1の値は奇数になる。)。パケットR6のACK番号が書き換えられたパケットP60はパケット傍受部A3へと渡され(図8のf412)、そしてパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりサーバ404へと転送される。このとき、セッションリストC4は図13に示すように状態Q6から状態Q7へと遷移する。
この時点においてサーバ404にとっては既にクライアント405へ送信したパケットP10・P30・P50に対するACKがまだ返信されていないことになるが、本実施の形態1におけるパケットP60を受信したサーバ404はやはりまだ輻輳が起きていないと判断し、引き続き次のデータが格納された2つのパケットP70・P80を連続してクライアント405に送信ものとする。その途中でサーバ404・クライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットP70およびP80を受信する。パケットP70およびP80は下り方向なので、シーケンス番号取得部A5は前述のパケットP10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
すなわちまずパケットP70は前述のパケットP10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。次にTCPシェーパー中継装置406のシーケンス番号取得部A5は、パケットP70のシーケンス番号14001とTCPデータ長1000とを加算した値15001と、セッション情報保持手段A7のセッションリストC4の状態Q7におけるS2に格納された、この時点で最も登録された時刻が新しいACK番号の値14001とを比較する(図9のf34)。シーケンス番号とTCPデータ長とを加算した値15001のほうが大きいので、シーケンス番号取得部A5はパケットP70が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値15001をセッション情報保持手段A7のセッションリストC4のS3に格納する。その後、シーケンス番号取得部A5はパケットP70をパケットR7としてパケット傍受部A3へ渡す(図9のf38)。パケットR7はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりクライアント405へと転送される。このとき、セッションリストC4は図13に示すように状態Q7から状態Q8へと遷移する。
パケットP80についても前述のパケットP70の場合と同様な処理が行われる。すなわち、パケットP80がTCPデータを含み、そのセッションリストがセッション1のセッションリストC4であると特定されるので(図9のf31〜f33)、TCPシェーパー中継装置406のシーケンス番号取得部A5は、パケットP80のシーケンス番号15001とTCPデータ長1000とを加算した値16001と、セッション情報保持手段A7のセッションリストC4の状態Q8におけるS3に格納された、この時点で最も登録された時刻が新しいACK番号の値15001とを比較する(図9のf34)。シーケンス番号とTCPデータ長とを加算した値16001のほうが大きいので、シーケンス番号取得部A5はパケットP80が再送TCPパケットではないと判断し、パケットP80のシーケンス番号16001とTCPデータ長1000とを加算した値16001をセッション情報保持手段A7のセッションリストC4のS4に格納する(図9のf35)。その後、シーケンス番号取得部A5はパケットP80をパケットR8としてパケット傍受部A3へ渡す(図9のf38)。パケットR8はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりクライアント405へと転送される。このとき、セッションリストC4は図13に示すように状態Q8から状態Q9へと遷移する。
パケットP70・P80を受信したクライアント405は、このようにパケットP70、P80を短い間隔で受信した場合には、パケットP70、P80に対するACKとして、ACK番号16001を持ち、かつTCPデータを含まないパケットR9をサーバ404に送信するものとする。その途中でサーバ404とクライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットR9を受信する。パケットR9は上り方向なので、ACK番号変更部A4は前述のACKパケットR2等の場合と同様に、再び図8に示すf401からのフローに従ってクライアント405から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ404へ渡すかあるいはサーバ404に対するACKパケットをドロップすることによりサーバ404からクライアント405へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットR9はパケットR2等の時と同様にして、TCPデータを含まないパケットであると判定され(図8のf401)、そのセッションリストがセッション1のセッションリストC4であると特定される(図8のf402)。
その後、ACK番号変更部A4は、パケットR9のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、ACK番号保持手段A7のセッション1のモード情報C3に格納された値を元に判断する(図8のf403)。セッション1のモード情報C3には値1(スロースタートモードを表す)が格納されているので、ACK番号変更部A4はパケットR9に対し、図8に示すf406からのフロー従ってスロースタートモードにおける処理を行う。
f406においてTCPシェーパー中継装置406のACK番号変更部A4は、パケットR2等の場合と同様にして、パケットR9のパケットカウンタがセッション1のパケットカウンタJ1であると特定し、そこに格納されている値を取得する。
f407においてパケットカウンタJ1には奇数の値が格納されているので、ACK番号変更部A4はサーバ404に対するACKパケットをドロップする処理を実行する。つまり、TCPシェーパー中継装置406のACK番号変更部A4はパケットカウンタJ1の値を1インクリメントして更新し(図8のf411。その結果、パケットカウンタJ1の値は偶数になる。)、パケットR9をドロップする(図8のf413)。このとき、セッションリストC4は図13に示すように状態Q9から状態Q10へと遷移する。
この時点においてもサーバ404にとっては既にクライアント405へ送信したパケットP10・P30・P50・P70・P80に対するACKが未だ返信されていないことになるが、本実施の形態1におけるサーバ404はやはり未だ輻輳が起きていないと判断し、引き続き次のデータが格納されたパケットP100を、クライアント405に送信するものとする。その途中でサーバ404・クライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットP100を受信する。パケットP100は下り方向なので、シーケンス番号取得部A5は前述のパケットP10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
すなわちまずパケットP100は前述のパケットP10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。次にTCPシェーパー中継装置406のシーケンス番号取得部A5は、パケットP100のシーケンス番号16001とTCPデータ長1000とを加算した値17001と、セッション情報保持手段A7のセッションリストC4の状態Q10におけるS4に格納された、この時点で最も登録された時刻が新しいACK番号の値16001とを比較する。シーケンス番号とTCPデータ長とを加算した値17001のほうが大きいので、シーケンス番号取得部A5はパケットP100が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部A5はシーケンス番号とTCPデータ長とを加算した値17001をセッション情報保持手段A7のセッションリストC4のS5に格納する。その後、シーケンス番号取得部A5はパケットP100をパケットR10としてパケット傍受部A3へ渡す(図9のf38)。パケットR10はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりクライアント405へと転送される。このとき、セッションリストC4は図13に示すように状態Q10から状態Q11へと遷移する。
パケットR10を受信したクライアント405は、パケットR10のACKとして、ACK番号17001を持ち、かつTCPデータを含まないパケットR11をサーバ404に送信する。その途中でサーバ404とクライアント405間の通信経路途中にあるTCPシェーパー中継装置406が一旦そのパケットR11を受信する。パケットR11は上り方向なので、ACK番号変更部A4は図8に示すf401からのフローに従ってクライアント405から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ404へ渡すかあるいはサーバ404に対するACKパケットをドロップすることによりサーバ404からクライアント405へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットR11は前述のACKパケットR2等の場合と同様にして、TCPデータを含まないパケットであると判定され(図8のf401)、そのセッションリストがセッション1のセッションリストC4であると特定される(図8のf402)。
その後、ACK番号変更部A4は、パケットR11のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、ACK番号保持手段A7のセッション1のモード情報C3に格納された値を元に判断する(図8のf403)。セッション1のモード情報C3には値1(スロースタートモードを表す)が格納されているので、ACK番号変更部A4はパケットR11に対し、図8に示すf406からのフローに従ってスロースタートモードにおける処理を行う。
f406においてTCPシェーパー中継装置406のACK番号変更部A4は、前述のACKパケットR2等の場合と同様にして、パケットR11のパケットカウンタがセッション1のパケットカウンタJ1であると特定し、そこに格納されている値を取得する。
f407においてパケットカウンタJ1には偶数の値が格納されているので、ACK番号変更部A4はクライアント405から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ404へ渡す処理を実行する。つまり、TCPシェーパー中継装置406のACK番号変更部A4はセッション情報保持手段A7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態Q11におけるS0に格納された値12001を取得し(図8のf408。その結果、セッションリストC4のS0の値12001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移り、S4に格納された値がS3に移り、S5に格納された値がS4に移る。)、その値12001をパケットR11のACK番号に上書きし(図8のf409)、パケットカウンタJ1の値を1インクリメントして更新する(図8のf410。その結果、パケットカウンタJ1の値は奇数になる。)。パケットR11のACK番号が書き換えられたパケットP110はパケット傍受部A3へと渡され(図8のf412)、そしてパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406より404へと転送される。このとき、セッションリストC4は図13に示すように状態Q11から状態Q12へと遷移する。なお、このときのパケットP110は、サーバ404にとって結果的にパケットP10に対するACKとなっている。
この時点においてサーバ404にとっては既にクライアント405へ送信したパケットP10・P30・P50・P70・P80・P100のうちパケットP10に対するACKは返信されてきているが、残りの送信パケットP30・P50・P70・P80・P100に対するACKがまだ返信されていないことになる。ここに至り本実施の形態1におけるACKパケットP110を受信したサーバ404はパケットP30に対するACK(ACK番号13001を持つパケット)をクライアント405から受け取っていないために、サーバ404においてパケットP30に対するRTOがオーバーしたものとする。
そこでサーバ404はパケットP30以降の送信パケットにおいて輻輳が発生したと判断し、クライアント405に対してパケットP30と同様の内容を持つパケットP120を再送する。その途中でサーバ404・クライアント405間の通信経路途中にあるTCPシェーパー中継装置406がそのパケットP120を一旦受信する。パケットP120は下り方向なので、シーケンス番号取得部A5は前述のパケットP10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。
すなわちまずパケットP120は前述のパケットP10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。その後、シーケンス番号取得部A5はパケットP120が再送TCPパケットか否かを例えば以下のようにして判断する(図9のf34)。
図10においてパケットP120はシーケンス番号=12001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置406のシーケンス番号取得部A5は図9の処理フローf32において取得したパケットP120のシーケンス番号とTCPデータ長を加算する。すなわち、12001 + 1000 = 13001と加算する。次にTCPシェーパー中継装置406のシーケンス番号取得部A5は、このシーケンス番号とTCPデータ長とを加算した値13001と、セッション情報保持手段A7のセッションリストC4の状態Q12におけるS4に格納された、この時点で最も登録された時刻が新しいACK番号の値17001とを比較する。シーケンス番号とTCPデータ長とを加算した値13001のほうが小さいので、シーケンス番号取得部A5はパケットK90が再送TCPパケットであると判断し、再送パケット用の処理を行う(図9のf36〜f37)。この場合シーケンス番号取得部A5は、セッション情報保持手段A7にお
けるセッション1のモード情報C3を、輻輳回避モードであることを示す値0に更新する(図9のf36)。
サーバ404は輻輳状態の間、TCPデータを含むパケットをクライアント405へ再送のみ行い、新たなTCPデータをクライアント405に送信しないため、輻輳状態が長く続くと転送効率が悪くなる。そこでサーバ404を輻輳状態からなるべく早く復帰させるために、TCPシェーパー中継装置406は例えばサーバ404へのACKを生成し、送信する。
すなわちTCPシェーパー中継装置406のシーケンス番号取得部A5は、セッション情報保持手段A7のC2に格納されている送信元IPアドレス(例えば図28の502)・宛先IPアドレス(例えば図28の503)・送信元ポート番号(例えば図19の114)・宛先ポート番号(例えば図19の115)を元に、輻輳状態から復帰させるために上り方向のTCPデータ無しパケットP121を生成し、パケット傍受部A3へ渡す。
その次に、TCPシェーパー中継装置406のACK番号変更部A4は、先ほどシーケンス番号取得部A5に置いて生成されたパケットP121をパケット傍受部A3から入力し、その時点でセッション情報保持手段A7に格納されている最も登録時刻の古いACK番号、すなわちこの場合のセッションリストC4の状態Q12にてS0に格納されている値13001を取得し(その結果、セッションリストC4のS0の値13001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移り、S4に格納された値がS3に移る。)、その値13001をパケットP121のACK番号に書き込む(図9のf37)。ACK番号13001が書き込まれたパケットP121はパケット傍受部A3へと渡され(図9のf38)、そしてパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりサーバ404へと送信される。
その後、TCPシェーパー中継装置406はセッション情報保持手段A7にACK番号を格納せず、パケットP120をパケットR12としてパケット傍受部A3へ渡す(図9のf38)。パケットR12はパケット転送部A2・パケット出力部A9へと順次渡されて、TCPシェーパー中継装置406よりクライアント405へと転送される。このとき、セッションリストC4は状態Q12から状態Q13へと遷移する。
以上のように本発明によれば、少なくとも1つ以上のサーバと1つ以上のクライアントの間の通信をネットワーク上で中継するネットワーク中継装置であって、接続されたネットワーク上より受信したパケットが上り方向の場合、前記パケットのACK番号を元の番号より小さい値へ書き換えた後前記ネットワーク上へ送信するネットワーク中継装置およびネットワーク中継制御方法によれば、元の番号より小さな値へ書き換えられたACK番号を有するACKパケットを受け取ったサーバは、自分がそれより前にクライアントに送ったパケットが全て届いているわけでないと判断し、クライアントへ送ったパケットの全てが届くことを示すACK番号を有するACKパケットをクライアントから受け取るまでクライアントへの新たなパケット送信を行わなくなるので、下り方向のTCPスループットがネットワークの許容範囲を超えず、その結果同時に流した音声通信パケットなどのパケットロスを低減することができる。またウインドウサイズを使わないので、ウインドウサイズを処理しない端末を用いた通信でスループットが下がらない等の問題を解決するという効果が得られる。
(実施の形態2)
本実施の形態2においては以下の順序で話を進める。まず実施の形態1との違いを述べる。次に図14、図15を用いて拡張版TCPシェーパーの構成を説明し、更に図16を用いて拡張版TCPシェーパーを構成する各モジュールの処理フローについて述べる。最後に拡張版TCPシェーパーの動作例について図17および図18用いて述べる。
実施の形態1では、例えば図12においてサーバ404・クライアント405間のTCPによる通信において、TCPデータを含むパケットの中継はサーバ404からクライアント405への方向(下り方向)のみ対応していた。仮にクライアント405からサーバ404へTCPデータを含むパケットを送信した場合は、TCPデータを含むパケットはTCPシェーパー中継装置406によってドロップされ、サーバへ中継されない。
近年のインターネットでは、TCPセッションにおいてサーバ・クライアントが双方向にTCPデータをやり取りすることがある。例えばユーザPC等の情報機器の上のウェブブラウザを用いてウェブサーバ上のコンテンツを見る場合、ウェブサーバはウェブサーバ上のコンテンツがTCPデータに内包されたパケットを、ユーザが利用しているPC等の情報機器へ送信する。ユーザがPC等の情報機器上のブラウザを用いてネットショッピングを行う場合は、PC等の情報機器はウェブサーバへクレジットカード番号等の情報がTCPデータに内包されたパケットを送信する。この時ウェブサーバを図12におけるサーバ404と見立て、またPC等の情報機器を図12におけるクライアント405と見立てると、サーバ・クライアント間でTCPデータを双方向に送受信していることがわかる。実施の形態1を上記の環境で用いると、PC等の情報機器からウェブサーバへ向けたTCPパケットがドロップされてしまうため、ユーザはオンラインショッピング等の利用ができなくなる。以上より、実施の形態1のようにTCPデータを含むパケットを片方向のみ中継するという方式は利便性を損なう場合がある。一方本実施の形態2である拡張版TCPシェーパーはその動作原理自体は実施の形態1と同じであるが、双方向にTCPデータを含むパケットを中継可能にし、尚かつ下り方向のTCPのスループットを下げることができる。
図14・図15を用いて拡張版TCPシェーパーの構成を説明する。図14は拡張版TCPシェーパーの全体構成の例である。拡張版TCPシェーパーT12は実施の形態1と同じく、例えば図1における中継装置303における拡張機能の一つとして実装される。
通常の中継装置は図14のパケット入力部T1、パケット転送部T2、パケット出力部T9のみを有するが、拡張版TCPシェーパーを有する中継装置303はこれらに加えてTCPシェ−パー本体T12を有する。TCPシェーパー本体T12内の大部分のモジュールは、実施の形態1の時と同じ動作をする。
パケット入力部T1、パケット転送部T2、パケット出力部T9のパケットに対する処理は、実施の形態1におけるパケット入力部A1、パケット転送部A2、パケット出力部A9の処理と同じである。
またTCPシェーパー本体T12内のパケット傍受部T3・ACK番号変更部T4・シーケンス番号取得部T5・セッション情報保持手段T7は、実施の形態1におけるパケット傍受部T3・ACK番号変更部T4・シーケンス番号取得部T5・セッション情報保持手段T7と同じ動作をする。
ACK番号データベースT8は、上り方向に送信すべきTCPパケットのACK番号を一時的に保持する。図15はACK番号データベースT8の内部構造の例である。各ACK番号キャッシュY1、Y3、Y5には、各セッションの上り方向へ転送したTCPパケットのACK番号の値が格納される。これらのACK番号キャッシュY1、Y3、Y5は、スロースタートモードにおいて、上り方向ACKの値を2つに1つの割合で増加させるための処理に用いる。前記セッション情報保持手段T7と同じくACK番号キャッシュもセッション毎に設けられている。通常保持できるセッション数は有限である。セッション管理部T6がACK番号データベースT8にあいているACK番号キャッシュのメモリ空間がなかった場合には、例えばセッション管理部T6は最も長時間にわたり更新されていないACK番号キャッシュをACK番号データベースT8から削除して新しいセッションに用いるACK番号キャッシュの作成に充てる等のことを行う。
セッション管理部T6は、ACK番号変更部T4またはシーケンス番号取得部T5と、セッション情報保持手段T7またはACK番号データベースT8との各種データ受け渡しの仲介を行う。実施の形態1ではセッション管理部A6はACK番号変更部A4またはシーケンス番号取得部A5と、セッション情報保持手段A7またはパケット数保持手段A8との各種データ受け渡しの仲介を行うが、本実施の形態2ではパケット数保持手段A8の代わりにACK番号データベースT8のデータ受け渡しの仲介を行う。
セッション情報保持手段T7またはACK番号データベースT8に保持されるセッションの数が複数存在する場合、セッション管理部T6はさらに、セッション情報保持手段T7またはACK番号データベースT8と受け渡しする各種データが、セッション情報保持手段T7またはACK番号データベースT8のどのセッションに属するかの判定を行う。例えばパケットの発信元IPアドレス(例えば図28の送信元IPアドレスフィールド502に格納されたデータ)・宛先IPアドレス(例えば図28の宛先IPアドレスフィールド503に格納されたデータ)およびTCPの発信元ポート番号(例えば図19の114に格納されたデータ)・宛先ポート番号(例えば図19の115に格納されたデータ)等、そのTCPパケットが属するセッションを特定する情報を他の情報と併せてACK番号変更部T4またはシーケンス番号取得部T5から取得し、それらの情報から例えばセッション情報保持手段T7またはACK番号データベースT8におけるメモリ空間を特定して、該当するセッションのメモリ空間に保持する。
セッション情報保持手段T7の内部構造は、実施の形態1のセッション情報保持手段A7の内部構造を表す図4において、A7をT7としたものと同じである。以下では図4を、A7をT7としたものとして扱う。
本実施の形態2においては以下のような一定のルールにより上り方向ACKの抽出を行うものとする。すなわち、輻輳回避モードにおいては上り方向のTCPパケットのACK番号を元の値より小さい値に書き換え、必ず新しい時間に送信する上りTCPパケットのACK番号はそれ以前に送ったTCPパケットのACK番号より大きな値にするものとする。一方スロースタートモードにおいては上り方向のTCPパケットのACK番号を書き換え、新しい時間に送信する上りTCPパケットのACK番号はそれ以前に送られたTCPパケットのACK番号と同じか大きい値にするものとする。すなわち上り方向のTCPパケットは必ず、その前後どちらかの上りTCPパケットと同じ値を取り、そのACK番号は2つの上りTCPパケット毎に増加する。
以上のモジュールを用いて以下のような処理を行うことにより、各セッションに流れるTCPセグメントのスループットを抑える。
これより、拡張版TCPシェーパーを構成する各モジュールの処理フローについて述べる。なおT12内部のモジュールのうち、パケット傍受部T3以外のものにおいてはTCPパケットのみが取り扱われる。
パケット転送部T2の処理フローは、実施の形態1のパケット転送部A2のフローを表す図6において、パケット入力部A1の代わりにパケット入力部T1、パケット傍受部A3の代わりにパケット傍受部T3、パケット転送部A3の代わりにパケット転送部T3としたものである。以下では図6を、パケット入力部A1をパケット入力部T1、パケット傍受部A3をパケット傍受部T3、パケット転送部A3をパケット転送部T3としたものとして扱う。
パケット傍受部T3の処理フローは、実施の形態1のパケット傍受部A3のフローを表す図7において、パケット転送部A2の代わりにパケット転送部T2、ACK番号変更部A4の代わりにACK番号変更部T4、シーケンス番号取得部A5の代わりにシーケンス番号取得部T5としたものである。以下では図7を、パケット転送部A2をパケット転送部T2、ACK番号変更部A4をACK番号変更部T4、シーケンス番号取得部A5をシーケンス番号取得部T5にしたものとして扱う。
図16は上り方向TCPパケットに対するACK番号変更部T4の処理フローの例である。
ACK番号変更部T4へ入力されるものはパケット傍受部T3から渡される上り方向のTCPパケットのみである(図14の経路U3)。また、セッション管理部T6との間において、ACK番号変更部T4はTCPパケットそのものでなく、パケットの属しているセッションに関する情報のみのやり取りを行う。実施の形態1のACK番号変更部A4ではTCPデータを含むパケットを図8のステップf401において判定し、ステップf413においてドロップしていたが、本実施の形態2ではTCPデータ有りパケットとTCPデータ無しパケットを同等に扱う。
ACK番号変更部T4は、ステップf1001において、セッション情報保持手段T7から処理中のパケットが属しているセッションのモード情報(例えば図4のセッション1においてはC3)を取得する。ステップf1002において、ACK番号変更部T4はf1001で取得したセッションのモード情報を元に、現在のセッションの動作モードがスロースタートか輻輳回避モードかを判定する。
セッションの動作モードが輻輳回避モードである場合、ACK番号変更部T4はステップf1003においてセッション情報保持手段T7よりセッション管理部T6経由において現在処理しているパケットが属するセッションリスト(例えば図4のセッション1であればC4)からその時点でもっとも古いACK番号(例えば図4のセッション1であればアドレスS0に格納されているデータ)を取得し、ステップf1004においてACK番号変更部T4は現在処理中のパケットのACK番号フィールド(例えば図19の111)を先ほど取得したACK番号に書き換える。その後、ACK番号変更部T4はACK番号の書き換えが完了したTCPパケットを、経路U4を介しパケット傍受部T3へ渡す。もしセッションリストが空の場合は、ACK番号変更部T4はそこで一時的に保持するTCPパケットのACK番号の書き換えを行わずに、経路U4を介しパケットをパケット傍受部T3へ渡す。
セッションの動作モードがスロースタートモードである場合、ACK番号変更部T4はステップf1005においてACK番号データベースT8の現在処理しているパケットが属するACK番号キャッシュ(例えば図15のセッション1であればY1)に値が格納されているか否かを調べる。値が格納されていない場合、ACK番号変更部T4はステップf1006において、セッション情報保持手段T7よりセッション管理部T6経由において現在処理しているパケットが属するセッションリスト(例えば図4のセッション1であればC4)からその時点でもっとも古いACK番号(例えば図4のセッション1であればアドレスS0に格納されているデータ)を取得し、ステップf1007において、先程取得したACK番号を現在処理中のパケットのACK番号フィールドに上書きする。更にACK番号変更部T4はステップf1008において、ステップf1006で取得したACK番号をACK番号データベースT8の現在処理中のパケットが属するACK番号キャッシュ(例えば図15のセッション1であればY1)に書き込む。その後、ACK番号変更部T4はACK番号の書き換えが完了したパケットを、経路U4を介しパケット傍受部T3へ渡す。もしセッションリストが空の場合は、ACK番号変更部T4はそこで一時的に保持するTCPパケットのACK番号の書き換えを行わずに、経路U4を介しTCPパケットをパケット傍受部T3へ渡す。
ステップf1005においてACK番号データベースT8の現在処理しているパケットが属するACK番号キャッシュに値が格納されている場合、ACK番号変更部T4はステップf1009において、ACK番号データベースT8のACK番号キャッシュ(例えば図15のセッション1であればY1)からACK番号を取得し、ステップf1010においてACK番号変更部T4は先に取得したACK番号(例えば図15のセッション1であればY1)を現在処理中のパケットのACK番号フィールドに上書きする。次にステップf1011においてACK番号変更部T4は、先の処理f1009において値を取得したACK番号キャッシュ(例えば図15のセッション1であればY1)の値を削除し、ACK番号キャッシュを空にする。その後、ACK番号変更部T4は経路U4を介しパケットをパケット傍受部T3へ渡す。
最後にACK番号変更部T4はステップf1012において、パケットデータをパケット傍受部T3に渡す。
以上の構成および処理フローを有する基本型TCPシェーパーの動作例を説明する。輻輳回避モード時の拡張版TCPシェーパーの動作は、実施の形態1で示した基本型TCPシェーパーと同じである。
図17・図18を用いてスロースタートモード時の拡張版TCPシェーパーの動作例について述べる。図17はサーバ407・クライアント408・TCPシェーパーを搭載した中継装置(以下、「TCPシェーパー中継装置」と称す)409間でのスロースタートモード時のTCPによる通信の例である。サーバ407・クライアント408間の通信経路途中にはTCPシェーパー中継装置409がある。このTCPシェーパー中継装置409の内部構成は図4、図14、図15に示すものと同一とする。さらに、TCPシェーパー中継装置409がサーバ407・クライアント408間の通信経路途中で取り扱うパケットは、前述の図6、図7、図9、図16に示すフロー処理がなされるものとする。サーバ407はクライアント408に対してTCPで毎回1000バイトずつTCPデータを含むパケット(v10、v30、v50、v70、v80、v100、v120)を送信する。クライアント408はサーバ407に対しパケット(e2、e4、e6、e9、e11)、つまりサーバ407から送信されたTCPデータを含むパケット(v10、v30、v50、v70、v80、v100)に対するACKを送信する。クライアント408がサーバ407に対して送信するパケット(e2、e4、e6、e9、e11)は、TCPデータ有りであってもTCPデータ無しであってもよい。
図18は、図17の通信時におけるセッション情報保持手段T7でのセッションリストの遷移例である。それらのセッションリストの遷移は図4のセッション保持手段T7におけるセッション1上で行われるものとする。すなわち、TCPシェーパー中継装置409のセッション情報保持手段T7のセッションリストC4は図18の状態z1から開始され、値11001と値10001がそれぞれ状態z1におけるセッションリストC4のアドレスS0およびS1にあらかじめ格納されている。値10001は値11001より古い時刻に登録されたものである。この時点において輻輳はまだ発生していないものとする
また、図17・図18の通信はスロースタートモードなので、状態z1時のセッション1のモード情報C3には、スロースタートモードであることを示す値1が格納されているものとする。さらに状態z1時のACK番号データベースT8のACK番号キャッシュY1は空であるとする。サーバ407がスロースタートモードの場合、TCPシェーパー中継装置409は、ACK番号データベースT8内のACK番号キャッシュを後述するような形で用いることにより、なるべく早く輻輳状態を引き起こして輻輳回避モードへと切り替えさせる。こうすることによって、TCPシェーパー中継装置409はスロースタートモードにおけるサーバ407からクライアント408への通信帯域の急激な増大を抑えることが出来る。
最初に、サーバ407がパケットv10を、クライアント408に対して送信する。次に、サーバ407・クライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットv10を受信する。パケットv10は下り方向なので、シーケンス番号取得部T5は前述図9に示すf31からのフローに従い、後述するフローf1002以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。シーケンス番号を取得・保持するための処理は実施の形態1のときと同じである。
すなわち、f31においてパケットv10はTCPデータを含むので、TCPシェーパー中継装置409のシーケンス番号取得部T5はパケットv10のシーケンス番号とTCPデータ長を取得し(図9のf32)、パケットv10が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、セッション情報保持手段T7に保持されているパケットv10のセッションリストがどれなのかを特定する(図9のf33)。本実施の形態2においては、パケットv10のIPアドレス情報およびポート番号情報が図4に示すセッション情報保持手段T7におけるセッション1のIPアドレス情報およびポート番号情報C2と一致し、その結果パケットv10のセッションリストがセッション1のセッションリストC4であると特定されるものとする。
その後、シーケンス番号取得部T5はパケットv10が再送TCPパケットか否かを例えば以下のようにして判断する(図9のf34)。
図10においてパケットv10はシーケンス番号=11001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置409のシーケンス番号取得部T5は図9の処理フローf32において取得したパケットv10のシーケンス番号とTCPデータ長を加算する。すなわち、11001 + 1000 = 12001と加算する。
次にTCPシェーパー中継装置409のシーケンス番号取得部T5は、このシーケンス番号とTCPデータ長とを加算した値12001と、セッション情報保持手段T7のセッションリストC4の状態z1におけるS1に格納された、この時点で最も登録された時刻が新しいACK番号の値11001とを比較する。シーケンス番号とTCPデータ長とを加算した値12001のほうが大きいので、シーケンス番号取得部T5はパケットv10が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値をセッション情報保持手段T7のセッションリストC4に追加登録する(図9のf35)。この場合シーケンス番号取得部T5はシーケンス番号とTCPデータ長とを加算した値12001をセッション情報保持手段T7のセッションリストC4のS2に格納する。
その後、シーケンス番号取得部T5はパケットv10をパケットe1としてパケット傍受部T3へ渡す(図9のf38)。パケットe1はパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりクライアント408へと転送される。このとき、セッションリストC4は図18に示すように状態z1から状態z2へと遷移する。
パケットe1を受信したクライアント408は、パケットe1のACKとして、ACK番号12001を持つパケットe2をサーバ407へ送信する。その途中でサーバ407とクライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットe2を受信する。パケットe2は上り方向なので、ACK番号変更部T4は図16に示すf1001からのフローに従ってクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡すことによりサーバ407からクライアント408へのデータ送信の帯域を抑えるための処理を行う。
f1001においてTCPシェーパー中継装置409のACK番号変更部T4は、パケットe2が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、セッション情報保持手段T7に保持されているパケットe2のセッションリストがどれなのかを特定する。本実施の形態2においては、パケットe2のIPアドレス情報およびポート番号情報が図4に示すセッション情報保持手段T7におけるセッション1のIPアドレス情報およびポート番号情報C2と一致し、その結果パケットe2のセッションリストがセッション1のセッションリストC4であると特定されるものとする。
その後、ACK番号変更部T4は、パケットe2のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、セッション情報保持手段T7のセッション1のモード情報C3に格納された値を元に判断する(図16のf1002)。セッション1のモード情報C3には値1(スロースタートモードを表す)が格納されているので、ACK番号変更部T4はパケットe2に対し、図16に示すf1005からのフローに従ってスロースタートモードにおける処理を行う。
すなわちf1005においてTCPシェーパー中継装置409のACK番号変更部T4は、パケットe2が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、ACK番号データベースT8に保持されているパケットe2に属するACK番号キャッシュがどれなのかを特定し、ACK番号キャッシュの値を取得する。本実施の形態2においては、パケットe2のIPアドレス情報およびポート番号情報が図15に示すACK番号データベースT8におけるセッション1のIPアドレス情報およびポート番号情報Y2と一致し、その結果パケットe2のACK番号キャッシュがセッション1のACK番号キャッシュY1であると特定されるものとする。状態z2の時ACK番号キャッシュY1は空なので、TCPシェーパー中継装置409は続いてf1006の処理を行う。
f1006においてACK番号変更部T4はクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡す処理を実行する。つまり、TCPシェーパー中継装置409のACK番号変更部T4はセッション情報保持手段T7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態z2におけるS0に格納された値10001を取得し(図16のf1006)。その結果、セッションリストC4のS0の値10001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移る)、その値10001をパケットe2のACK番号に上書きし(図16のf1007)、先のf1006で取得したACK番号をACK番号キャッシュY1書きこむ(図16のf1008。その結果、ACK番号キャッシュY1は空でなくなる)。パケットe2のACK番号が書き換えられたパケットv20はパケット傍受部T3へと渡され(図16のf1012)、そしてパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりサーバ407に転送へと転送される。このとき、セッションリストC4は図18に示すように状態z2から状態z3へと遷移する。
この時点においてサーバ407にとっては既にクライアント408へ送信したパケットv10に対するACKが返信されていないことになるが、本実施の形態2におけるパケットv20を受信したサーバ407はまだ輻輳が起きていないと判断し、引き続き次のデータが格納されたパケットv30を、クライアント408に送信するものとする。その途中でサーバ407・クライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットv30を受信する。パケットv30は下り方向なので、シーケンス番号取得部T5は前述のパケットv10の場合と同様に、再び図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理を行う。シーケンス番号を取得・保持するための処理は実施の形態1のときと同じである。
すなわちパケットv30は前述のパケットv10の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。その後、シーケンス番号取得部T5はパケットv30が再送TCPパケットか否かを、前述のパケットv10の場合と同様に以下のようにして判断する(図9のf34)。
図17においてパケットv30はシーケンス番号=12001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置409のシーケンス番号取得部T5は図9の処理フローf32において取得したパケットv30のシーケンス番号とTCPデータ長を加算する。すなわち、12001 + 1000 = 13001と加算する。次にTCPシェーパー中継装置409のシーケンス番号取得部T5は、このシーケンス番号とTCPデータ長とを加算した値13001と、セッション情報保持手段T7のセッションリストC4の状態z3におけるS1に格納された、この時点で最も登録された時刻が新しいACK番号の値12001とを比較する。シーケンス番号とTCPデータ長とを加算した値13001のほうが大きいので、シーケンス番号取得部T5はパケットv30が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部T5はシーケンス番号とTCPデータ長とを加算した値13001をセッション情報保持手段T7のセッションリストC4のS2に格納する。その後、シーケンス番号取得部T5はパケットv30をパケットe3としてパケット傍受部T3へ渡す(図9のf38)。パケットe3はパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりクライアント408へと転送される。このとき、セッションリストC4は図13に示すように状態z3から状態z4へと遷移する。
パケットe3を受信したクライアント408は、パケットe3のACKとして、ACK番号13001を持つパケットe4をサーバ407に送信する。その途中でサーバ407とクライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットe4を受信する。パケットe4は上り方向なので、ACK番号変更部T4は前述のACKパケットe2の場合と同様に、再び図16に示すf1001からのフローに従ってクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡すことによりサーバ407からクライアント408へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットe4は前述のパケットe2の場合と同様にして、そのセッションリストがセッション1のセッションリストC4であると特定され(図16のf1001)、セッション1のモード情報C3に格納されていた値よりパケットe4のセッションがスロースタートモードであると特定される(図16のf1005)。その後、ACK番号変更部T4はパケットe4に対し、図16に示すf1005からのフローにしたがってスロースタートモードにおける処理を行う。
すなわちf1005においてTCPシェーパー中継装置409のACK番号変更部T4は、パケットe4が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、ACK番号データベースT8に保持されているパケットe4に属するACK番号キャッシュがどれなのかを特定し、ACK番号キャッシュの値を取得する。本実施の形態2においては、パケットe4のIPアドレス情報およびポート番号情報が図15に示すACK番号データベースT8におけるセッション1のIPアドレス情報およびポート番号情報Y2と一致し、その結果パケットe4のACK番号キャッシュがセッション1のACK番号キャッシュY1であると特定されるものとする。状態z4の時ACK番号キャッシュY1は空でないので、TCPシェーパー中継装置409は続いてf1009の処理を行う。
f1009においてACK番号変更部T4はクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡す処理を実行する。つまり、TCPシェーパー中継装置409のACK番号変更部T4はACK番号データベースT8のACK番号キャッシュY1に格納されている値10001を取得し(図16のf1009)、その値10001をパケットe4のACK番号に上書きし(図16のf1010)、 ACK番号キャッシュY1に格納されている値10001を削除する(図16のf1011。その結果、ACK番号キャッシュY1は空になる。)。パケットe4のACK番号が書き換えられたパケットv40はパケット傍受部T3へと渡され(図16のf1012)、そしてパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりサーバ407に転送へと転送される。このとき、セッションリストC4は図18に示すように状態z4から状態z5へと遷移する。
この時点においてサーバ407にとっては既にクライアント408へ送信したパケットv10およびv30に対するACKが未だ返信されていないことになるが、本実施の形態2におけるサーバ407は輻輳が起きていないと判断し、引き続き次のデータが格納されたパケットv50を、クライアント408に送信するものとする。その途中でサーバ407・クライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットv50を受信する。パケットv50は下り方向なので、シーケンス番号取得部T5は前述のパケットv10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理を行う。シーケンス番号を取得・保持するための処理は実施の形態1のときと同じである。
すなわちまずパケットv50は前述のパケットv10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。次にTCPシェーパー中継装置409のシーケンス番号取得部T5は、パケットv50のシーケンス番号13001とTCPデータ長1000とを加算した値14001と、セッション情報保持手段T7のセッションリストC4の状態z5におけるS2に格納された、この時点で最も登録された時刻が新しいACK番号の値13001とを比較する。シーケンス番号とTCPデータ長とを加算した値14001のほうが大きいので、シーケンス番号取得部T5はパケットv50が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部T5はシーケンス番号とTCPデータ長とを加算した値14001をセッション情報保持手段T7のセッションリストC4のS3に格納する。その後、シーケンス番号取得部T5はパケットv50をパケットe5としてパケット傍受部T3へ渡す(図9のf38)。パケットe5はパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりクライアント408へと転送される。このとき、セッションリストC4は図18に示すように状態z5から状態z6へと遷移する。
パケットe5を受信したクライアント408は、パケットe5のACKとして、ACK番号14001を持つパケットe6をサーバ407へ送信する。その途中でサーバ407とクライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットe6を受信する。パケットe6は上り方向なので、ACK番号変更部T4はパケットe2と同じく、図16に示すf1001からのフローに従ってクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡すことによりサーバ407からクライアント408へのデータ送信の帯域を抑えるための処理を行う。
f1001においてTCPシェーパー中継装置409のACK番号変更部T4は、パケットe6が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、セッション情報保持手段T7に保持されているパケットe6のセッションリストがどれなのかを特定する。本実施の形態2においては、パケットe6のIPアドレス情報およびポート番号情報が図4に示すセッション情報保持手段T7におけるセッション1のIPアドレス情報およびポート番号情報C2と一致し、その結果パケットe6のセッションリストがセッション1のセッションリストC4であると特定されるものとする。
その後、ACK番号変更部T4は、パケットe6のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、セッション情報保持手段T7のセッション1のモード情報C3に格納された値を元に判断する(図16のf1002)。セッション1のモード情報C3には値1(スロースタートモードを表す)が格納されているので、ACK番号変更部T4はパケットe6に対し、図16に示すf1005からのフローに従ってスロースタートモードにおける処理を行う。
すなわちf1005においてTCPシェーパー中継装置409のACK番号変更部T4は、パケットe6が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、ACK番号データベースT8に保持されているパケットe6に属するACK番号キャッシュがどれなのかを特定し、ACK番号キャッシュの値を取得する。本実施の形態2においては、パケットe6のIPアドレス情報およびポート番号情報が図15に示すACK番号データベースT8におけるセッション1のIPアドレス情報およびポート番号情報Y2と一致し、その結果パケットe6のACK番号キャッシュがセッション1のACK番号キャッシュY1であると特定されるものとする。状態z6の時ACK番号キャッシュY1は空なので、TCPシェーパー中継装置409はパケットe1の処理と同じく、f1006の処理を行う。
f1006においてACK番号変更部T4はクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407
へ渡す処理を実行する。つまり、TCPシェーパー中継装置409のACK番号変更部T4はセッション情報保持手段T7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態z6におけるS0に格納された値11001を取得し(図16のf1006)。その結果、セッションリストC4のS0の値11001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移る)、その値11001をパケットe6のACK番号に上書きし(図16のf1007)、先のf1006で取得したACK番号をACK番号キャッシュY1書きこむ(図16のf1008。その結果、ACK番号キャッシュY1は空でなくなる。)。パケットe6のACK番号が書き換えられたパケットv60はパケット傍受部T3へと渡され(図16のf1012)、そしてパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりサーバ407に転送へと転送される。このとき、セッションリストC4は図18に示すように状態z6から状態z7へと遷移する。
この時点においてサーバ407にとっては既にクライアント408へ送信したパケットv10・v30・v50に対するACKがまだ返信されていないことになるが、本実施の形態2におけるパケッvP60を受信したサーバ407はやはりまだ輻輳が起きていないと判断し、引き続き次のデータが格納された2つのパケットv70・v80を連続してクライアント408に送信するものとする。その途中でサーバ407・クライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットv70およびv80を受信する。パケットv70およびv80は下り方向なので、シーケンス番号取得部T5は前述のパケットv10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。シーケンス番号を取得・保持するための処理は実施の形態1のときと同じである。
すなわちまずパケットv70は前述のパケットv10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。次にTCPシェーパー中継装置409のシーケンス番号取得部T5は、パケットv70のシーケンス番号14001とTCPデータ長1000とを加算した値15001と、セッション情報保持手段T7のセッションリストC4の状態z7におけるS2に格納された、この時点で最も登録された時刻が新しいACK番号の値14001とを比較する(図9のf34)。シーケンス番号とTCPデータ長とを加算した値15001のほうが大きいので、シーケンス番号取得部T5はパケットv30が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部T5はシーケンス番号とTCPデータ長とを加算した値15001をセッション情報保持手段T7のセッションリストC4のS3に格納する。その後、シーケンス番号取得部T5はパケットv70をパケットe7としてパケット傍受部T3へ渡す(図9のf38)。パケットe7はパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりクライアント408へと転送される。このとき、セッションリストC4は図18に示すように状態z7から状態z8へと遷移する。
パケットv80についても前述のパケットv70の場合と同様な処理が行われる。すなわち、パケットv80がTCPデータを含み、そのセッションリストがセッション1のセッションリストC4であると特定されるので(図9のf31〜f33)、TCPシェーパー中継装置409のシーケンス番号取得部T5は、パケットv80のシーケンス番号15001とTCPデータ長1000とを加算した値16001と、セッション情報保持手段T7のセッションリストC4の状態z8におけるS3に格納された、この時点で最も登録された時刻が新しいACK番号の値15001とを比較する(図9のf34)。シーケンス番号とTCPデータ長とを加算した値16001のほうが大きいので、シーケンス番号取得部T5はパケットv80が再送TCPパケットではないと判断し、パケットv80のシーケンス番号16001とTCPデータ長1000とを加算した値16001をセッション情報保持手段T7のセッションリストC4のS4に格納する(図9のf35)。その後、シーケンス番号取得部T5はパケットv80をパケットe8としてパケット傍受部T3へ渡す(図9のf38)。パケットe8はパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりクライアント408へと転送される。このとき、セッションリストC4は図18に示すように状態z8から状態z9へと遷移する。
パケットe7・e8を受信したクライアント408は、このようにパケットe7、e8を短い間隔で受信した場合には、パケットe7、e8に対して一つのACKにまとめて、ACK番号16001を持つパケットe9をサーバ407に送信するものとする。その途中でサーバ407とクライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットe9を受信する。パケットe9は上り方向なので、ACK番号変更部T4は前述のACKパケットe2等の場合と同様に、再び図16に示すf1001からのフローに従ってクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡すことによりサーバ407からクライアント408へのデータ送信の帯域を抑えるための処理を行う。
すなわちパケットe9は前述のパケットe2の場合と同様にして、そのセッションリストがセッション1のセッションリストC4であると特定され(図16のf1001)、セッション1のモード情報C3に格納されていた値よりパケットe9のセッションがスロースタートモードであると特定される(図16のf1005)。その後、ACK番号変更部T4はパケットe9に対し、図16に示すf1005からのフローにしたがってスロースタートモードにおける処理を行う。
すなわちf1005においてTCPシェーパー中継装置409のACK番号変更部T4は、パケットe9が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、ACK番号データベースT8に保持されているパケットe9に属するACK番号キャッシュがどれなのかを特定し、ACK番号キャッシュの値を取得する。本実施の形態2においては、パケットe9のIPアドレス情報およびポート番号情報が図15に示すACK番号データベースT8におけるセッション1のIPアドレス情報およびポート番号情報Y2と一致し、その結果パケットe9のACK番号キャッシュがセッション1のACK番号キャッシュY1であると特定されるものとする。状態z9の時ACK番号キャッシュY1は空でないので、TCPシェーパー中継装置409は続いてf1009の処理を行う。
f1009においてACK番号変更部T4はクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡す処理を実行する。つまり、TCPシェーパー中継装置409のACK番号変更部T4はACK番号データベースT8のACK番号キャッシュY1に格納されている値11001を取得し(図16のf1009)、その値11001をパケットe9のACK番号に上書きし(図16のf1010)、 ACK番号キャッシュY1に格納されている値10001を削除する(図16のf1011。その結果、ACK番号キャッシュY1は空になる。)。パケットe9のACK番号が書き換えられたパケットv90はパケット傍受部T3へと渡され(図16のf1012)、そしてパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりサーバ407に転送へと転送される。このとき、セッションリストC4は図18に示すように状態z9から状態z10へと遷移する。
この時点においてもサーバ407にとっては既にクライアント408へ送信したパケットv10・v30・v50・v70・v80に対するACKが未だ返信されていないことになるが、本実施の形態2におけるサーバ407はやはり未だ輻輳が起きていないと判断し、引き続き次のデータが格納されたパケットv100を、クライアント408に送信するものとする。その途中でサーバ407・クライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットv100を受信する。パケットv100は下り方向なので、シーケンス番号取得部T5は前述のパケットv10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。シーケンス番号を取得・保持するための処理は実施の形態1のときと同じである。
すなわちまずパケットv100は前述のパケットv10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。次にTCPシェーパー中継装置409のシーケンス番号取得部T5は、パケットv100のシーケンス番号16001とTCPデータ長1000とを加算した値17001と、セッション情報保持手段T7のセッションリストC4の状態z10におけるS4に格納された、この時点で最も登録された時刻が新しいACK番号の値16001とを比較する。シーケンス番号とTCPデータ長とを加算した値17001のほうが大きいので、シーケンス番号取得部T5はパケットv100が再送TCPパケットではないと判断し、シーケンス番号とTCPデータ長とを加算した値を追加登録する(図9のf35)。この場合シーケンス番号取得部T5はシーケンス番号とTCPデータ長とを加算した値17001をセッション情報保持手段T7のセッションリストC4のS5に格納する。その後、シーケンス番号取得部T5はパケットv100をパケットe10としてパケット傍受部T3へ渡す(図9のf38)。パケットe10はパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりクライアント408へと転送される。このとき、セッションリストC4は図13に示すように状態z10から状態z11へと遷移する。
パケットe10を受信したクライアント408は、パケットe10のACKとして、ACK番号17001を持つパケットe11をサーバ407に送信する。その途中でサーバ407とクライアント408間の通信経路途中にあるTCPシェーパー中継装置409が一旦そのパケットe11を受信する。パケットe11は上り方向なので、ACK番号変更部T4は図8に示すf401からのフローに従ってクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡すかあるいはサーバ407に対するACKパケットをドロップすることによりサーバ407からクライアント408へのデータ送信の帯域を抑えるための処理を行う。すなわちパケットe11は前述のACKパケットe2等の場合と同様にして、図16に示すf1001からのフローに従ってクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡すことによりサーバ407からクライアント408へのデータ送信の帯域を抑えるための処理を行う。
f1001においてTCPシェーパー中継装置409のACK番号変更部T4は、パケットe11が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、セッション情報保持手段T7に保持されているパケットe11のセッションリストがどれなのかを特定する。本実施の形態2においては、パケットe11のIPアドレス情報およびポート番号情報が図4に示すセッション情報保持手段T7におけるセッション1のIPアドレス情報およびポート番号情報C2と一致し、その結果パケットe11のセッションリストがセッション1のセッションリストC4であると特定されるものとする。
その後、ACK番号変更部T4は、パケットe11のセッションが輻輳回避モード・スロースタートモードのいずれなのかを、セッション情報保持手段T7のセッション1のモード情報C3に格納された値を元に判断する(図16のf1002)。セッション1のモード情報C3には値1(スロースタートモードを表す)が格納されているので、ACK番号変更部T4はパケットe11に対し、図16に示すf1005からのフローに従ってスロースタートモードにおける処理を行う。
すなわちf1005においてTCPシェーパー中継装置409のACK番号変更部T4は、パケットe11が有しているIPアドレス情報(例えば図28の502および503)およびポート番号情報(例えば図19の114および115)により、ACK番号データベースT8に保持されているパケットe11に属するACK番号キャッシュがどれなのかを特定し、ACK番号キャッシュの値を取得する。本実施の形態2においては、パケットe11のIPアドレス情報およびポート番号情報が図15に示すACK番号データベースT8におけるセッション1のIPアドレス情報およびポート番号情報Y2と一致し、その結果パケットe11のACK番号キャッシュがセッション1のACK番号キャッシュY1であると特定されるものとする。状態z11の時ACK番号キャッシュY1は空なので、TCPシェーパー中継装置409はパケットe2の処理と同じく、f1006の処理を行う。
f1006においてACK番号変更部T4はクライアント408から受け取ったACK番号よりも小さな値のACK番号へ書き換えてからサーバ407へ渡す処理を実行する。つまり、TCPシェーパー中継装置409のACK番号変更部T4はセッション情報保持手段T7のセッションリストC4に格納されている最も登録時刻の古いACK番号、すなわちこの場合の状態z11におけるS0に格納された値12001を取得し(図16のf1006)。その結果、セッションリストC4のS0の値12001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移り、S4に格納された値がS3に移り、S5に格納された値がS4に移る)、その値12001をパケットe11のACK番号に上書きし(図16のf1007)、先のf1006で取得したACK番号をACK番号キャッシュY1書きこむ(図16のf1008。その結果、ACK番号キャッシュY1は空でなくなる。)。パケットe11のACK番号が書き換えられたパケットv110はパケット傍受部T3へと渡され(図16のf1012)、そしてパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりサーバ407に転送へと転送される。このとき、セッションリストC4は図18に示すように状態z11から状態z12へと遷移する。なお、このときのパケットv110は、サーバ407にとって結果的にパケットv10に対するACKとなっている。
この時点においてサーバ407にとっては既にクライアント408へ送信したパケットv10・v30・v50・v70・v80・v100のうちパケットv10に対するACKは返信されてきているが、残りの送信パケットv30・v50・v70・v80・v100に対するACKがまだ返信されていないことになる。ここに至り本実施の形態2におけるACKパケットv110を受信したサーバ407はパケットv30に対するACK(ACK番号13001を持つパケット)をクライアント408から受け取っていないために、サーバ407においてパケットv30に対するRTOがオーバーしたものとする。
そこでサーバ407はパケットv30以降の送信パケットにおいて輻輳が発生したと判断し、クライアント408に対してパケットv30と同様の内容を持つパケットv120を再送する。その途中でサーバ407・クライアント408間の通信経路途中にあるTCPシェーパー中継装置409がそのパケットv120を一旦受信する。パケットv120は下り方向なので、シーケンス番号取得部T5は前述のパケットv10等の場合と同様に、図9に示すf31からのフローに従い、フローf401以降で上り方向のパケットのACK番号を書き換えるのに必要となるシーケンス番号を、取得・保持するための処理が行われる。シーケンス番号を取得・保持するための処理は実施の形態1のときと同じである。
すなわちまずパケットv120は前述のパケットv10等の場合と同様にして、TCPデータを含むパケットであると判定され(図9のf31)、そのセッションリストがセッション1のセッションリストC4であると特定される(図9のf32〜f33)。その後、シーケンス番号取得部T5はパケットv120が再送TCPパケットか否かを例えば以下のようにして判断する(図9のf34)。
図10においてパケットv120はシーケンス番号=12001、TCPデータ長=1000バイトであるので、TCPシェーパー中継装置409のシーケンス番号取得部T5は図9の処理フローf32において取得したパケットv120のシーケンス番号とTCPデータ長を加算する。すなわち、12001 + 1000 = 13001と加算する。次にTCPシェーパー中継装置409のシーケンス番号取得部T5は、このシーケンス番号とTCPデータ長とを加算した値13001と、セッション情報保持手段T7のセッションリストC4の状態z12におけるS4に格納された、この時点で最も登録された時刻が新しいACK番号の値17001とを比較する。シーケンス番号とTCPデータ長とを加算した値13001のほうが小さいので、シーケンス番号取得部T5はパケットv120が再送TCPパケットであると判断し、再送パケット用の処理を行う(図9のf36〜f37)。この場合シーケンス番号取得部T5は、セッション情報保持手段T7におけるセッション1のモード情報C3を、輻輳回避モードであることを示す値0に更新する(図9のf36)。
サーバ407は輻輳状態の間、TCPデータを含むパケットをクライアント408へ再送のみ行い、新たなTCPデータをクライアント408に送信しないため、輻輳状態が長く続くと転送効率が悪くなる。そこでサーバ407を輻輳状態からなるべく早く復帰させるために、TCPシェーパー中継装置409は例えばサーバ407へのACKを生成し、送信する。
すなわちTCPシェーパー中継装置409のシーケンス番号取得部T5は、セッション情報保持手段T7のC2に格納されている送信元IPアドレス(例えば図28の502)・宛先IPアドレス(例えば図28の503)・送信元ポート番号(例えば図19の114)・宛先ポート番号(例えば図19の115)を元に、輻輳状態から復帰させるために上り方向のTCPデータ無しパケットv121を生成し、パケット傍受部T3へ渡す。
その次に、TCPシェーパー中継装置409のACK番号変更部T4は、先ほどシーケンス番号取得部T5において生成されたパケットv121をパケット傍受部T3から入力し、その時点でセッション情報保持手段T7に格納されている最も登録時刻の古いACK番号、すなわちこの場合のセッションリストC4の状態z12においてS0に格納されている値13001を取得し(その結果、セッションリストC4のS0の値13001が削除され、S1に格納された値がS0に移り、S2に格納された値がS1に移り、S3に格納された値がS2に移り、S4に格納された値がS3に移る。)、その値13001をパケットv121のACK番号に書き込む(図9のf37)。ACK番号13001が書き込まれたパケットv121はパケット傍受部T3へと渡され(図9のf38)、そしてパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりサーバ407へと送信される。
その後、TCPシェーパー中継装置409はセッション情報保持手段T7にACK番号を格納せず、パケットv120をパケットe12としてパケット傍受部T3へ渡す(図9のf38)。パケットe12はパケット転送部T2・パケット出力部T9へと順次渡されて、TCPシェーパー中継装置409よりクライアント408へと転送される。このとき、セッションリストC4は状態z12から状態z13へと遷移する。
以上のように本発明によれば、少なくとも1つ以上のサーバと1つ以上のクライアントの間の通信をネットワーク上で中継するネットワーク中継装置であって、接続されたネットワーク上より受信したパケットが上り方向の場合、前記パケットのACK番号を元の番号より小さい値へ書き換えた後前記ネットワーク上へ送信するネットワーク中継装置およびネットワーク中継制御方法によれば、元の番号より小さな値へ書き換えられたACK番号を有するACKパケットを受け取ったサーバは、自分がそれより前にクライアントに送ったパケットが全て届いているわけでないと判断し、クライアントへ送ったパケットの全てが届くことを示すACK番号を有するACKパケットをクライアントから受け取るまでクライアントへの新たなパケット送信を行わなくなるので、下り方向のTCPスループットがネットワークの許容範囲を超えず、その結果同時に流した音声通信パケットなどのパケットロスを低減することができる。またウインドウサイズを使わないので、ウインドウサイズを処理しない端末を用いた通信でスループットが下がらない等の問題を解決するという効果が得られる。
(実施の形態3)
図2は、TCPシェ−パーがアクセスルータの一機能として動作する場合の実施例である。
図2におけるクライアントD1は一般家庭内のパソコン等の情報機器を表す。本発明が適用されるアクセスルータD2はパケット中継装置であり、クライアントD1が送信したパケットを後述する上位の中継装置D6へ中継し、また上位の中継装置D6が送信したパケットをクライアントD1へ中継する。さらにアクセスルータD2はIP電話機能を持ち、音声データを内包するパケット(以下、「音声パケット」と称す)の送受信を行う。アクセスルータD2の物理的な設置場所は一般家庭内である。またアクセスルータD2はクライアントD1に対して、DHCP(Dynamic Host Configuration Protocol)を用いてアドレス割り当てを行う。また、DHCPで割り当てたIPアドレスはアクセスルータD2内で保持されるものとする。そのためアクセスルータD2はクライアントD1が持つIPアドレスを常に把握できる。
クライアントD1とアクセスルータD2は伝送路D9によって接続されている。伝送路D9の伝送許容量は100Mbpsである。
上位の中継装置D6は、アクセスルータD2から送信されたパケットをインターネット網へと中継する。またインターネット網から中継されてきたパケットをアクセスルータD2へと中継する。上位の中継装置D6の物理的な設置場所は、一般家庭にインターネット接続のサービスを行うインターネットサービスプロバイダの内部である。
上位の中継装置D6とアクセスルータD2は伝送路D3によって接続されている。伝送路D3の伝送許容量は1Mbpsである。伝送路D3において、アクセスルータD2から上位の中継装置D6への方向を「上り方向」とし、上位の中継装置D6からアクセスルータD2への方向を「下り方向」とする。
また上位の中継装置D6とインターネット網は伝送路D10によって接続されている。伝送路D10の伝送許容量は1000Mbpsである。
インターネット網にはサーバD7が接続される。クライアントD1とサーバD7は経路D5においてパケットの送受信が可能である。またインターネット網とサーバD7間は十分大きな伝送許容量を持つものとする。具体的には伝送路D10よりも大きな伝送許容量を持つ。
またインターネット網にはIP電話D8が接続される。アクセスルータD2とIP電話D8は経路D4においてパケットの送受信が可能である。またインターネット網とIP電話D8間は十分大きな伝送許容量を持つものとする。
ここでまず本発明をアクセスルータD2に適用しない場合における挙動を説明する。例えばクライアントD1がサーバD7にTCPで接続し、その後サーバD7からクライアントD1へ900kbpsの帯域でデータの送信を行う。次にIP電話D8とアクセスルータD2が互いに200kbpsの帯域で音声パケットの送受信を開始すると、伝送路D3に必要な帯域は200kbps+900kbps=1.1Mbpsになる。しかしながら伝送路D3の下り方向の伝送許容量は1Mbpsであり、これは下り方向のTCPデータと音声パケットの合計必要帯域である1.1Mbpsより小さい。よって伝送路D3の下り方向の伝送容量が足りなくなり、上位の中継装置D6にて音声パケットもしくはTCPパケットを送信できず伝送路D3に送信できなくなり、その結果TCPパケットと音声パケットの一部にパケットロスが発生する。したがってアクセスルータD2のIP電話機能において、音声パケットが内包している音声データを再生できないパケットが存在することになり、音質の低下が発生する。
一方、例えば本発明の実施の形態1もしくは実施の形態2であるTCPシェーパー機能をアクセスルータD2に適用した場合における音質を説明する。この場合、伝送路D3の下り方向はアクセスルータD2のTCPシェーパー機能により帯域制御される。アクセスルータD2にて中継するパケットの上り・下り方向を判別する方法は例えば以下のように行う。すなわち、アクセスルータD2で中継すべきパケットの宛先IPアドレス(例えば図28の503)がクライアントD1のIPアドレスと等しい場合は下り方向と判別し、宛先IPアドレスがクライアントD1のIPアドレスと等しくなければ上り方向と判別する。クライアントD1のIPアドレスは例えばアクセスルータD2内部のDHCP機能によって保持することが可能である。その保持されているIPアドレスを参照することで、パケットの宛先IPアドレスがクライアントD1のIPアドレスと等しいかを判定する。
最初にアクセスルータD2のTCPシェーパー機能を無効にし、アクセスルータD2を経由する通信を開始する。例えばクライアントD1がサーバD7にTCPで接続し、その後サーバD7からクライアントD1へ900kbpsの帯域でデータ送信を行う。その後IP電話D8とアクセスルータD2が音声パケットを送受信開始する前に、いずれかからのIP電話の接続要求をトリガーとして、TCPシェーパー機能を有効にする。するとサーバD7からクライアントD1へ向かうTCPデータの帯域は、アクセスルータD2のTCPシェーパー機能によって低く押さえられる。その結果、例えばサーバD7からクライアントD1へのTCPデータの消費帯域が900kbpsから100kbpsに押さえられたとする。そうすると、IP電話D8とアクセスルータD2が互いに200kbpsの帯域で音声パケットを送受信しても、伝送路D3における下り方向のTCPデータと音声パケットの合計帯域は200kbps+100kbps=300kbpsになり、伝送路D3の下り方向の伝送許容量である1Mbpsはそれより十分に大きいため、伝送路D3の下り方向の伝送容量が足りなくなることはなくなり、上位の中継装置D6でパケットロスは発生しない。また伝送路D3の下り方向において伝送許容量の半分以下しか利用していないため、下り方向の音声パケットのジッタも悪化しない。したがってアクセスルータD2のIP電話機能において音声の低下が発生しない。
以上のように本発明によれば、少なくとも1つ以上のサーバと1つ以上のクライアントの間の通信をネットワーク上で中継するネットワーク中継装置であって、接続されたネットワーク上より受信したパケットが上り方向の場合、前記パケットのACK番号を元の番号より小さい値へ書き換えた後前記ネットワーク上へ送信するネットワーク中継装置およびネットワーク中継制御方法によれば、元の番号より小さな値へ書き換えられたACK番号を有するACKパケットを受け取ったサーバは、自分がそれより前にクライアントに送ったパケットが全て届いているわけでないと判断し、クライアントへ送ったパケットの全てが届くことを示すACK番号を有するACKパケットをクライアントから受け取るまでクライアントへの新たなパケット送信を行わなくなるので、下り方向のTCPスループットがネットワークの許容範囲を超えず、その結果同時に流した音声通信パケットなどのパケットロスを低減することができる。またウインドウサイズを使わないので、ウインドウサイズを処理しない端末を用いた通信でスループットが下がらない等の問題を解決するという効果が得られる。
なお、本実施の形態3は音声のみのIP電話を用いて説明したが、例えば音声に加え動画情報も同時に送受信するIP−TV電話であっても同様である。