以下、図面を参照しながら、本発明の実施形態について説明する。
(第1の実施形態)
図1は、第1の実施形態に係るデータ転送装置を備えた通信装置を示すブロック図である。図における矢印付きの実線は、ネットワークへ送信するデータの流れを示し、矢印付きの破線は制御、またはネットワークへ送信するデータ以外の情報の流れを示す。
図1に示す通信装置100は、ネットワーク201を介して、1つまたは複数の対向機器301と接続される。ネットワーク201は、無線ネットワーク、有線ネットワーク、またはこれらのハイブリッドのネットワークであり、一例として、インターネットである。
通信装置100は、各対向機器301に対し、TCP等の通信プロトコルに従ってセッションを生成し、生成したセッションに基づき通信する。この通信装置は、一例として、対向機器301の要求に応じて画像、音声、動画、テキストなどのデータを供給するサーバ装置である。通信装置の形態は、これに限定されず、対向機器301に対しセッションを生成して通信を行う装置であれば、スマートフォン、PC、タブレット、携帯端末などのユーザ端末でもよい。具体的な製品形態としては、これらのサーバ装置やPC等の他、専用LSI、またはFPGA(Field Programmable Gate Array)等の形態も可能であるが、これらに限定されるものではない。
各対向機器301は、スマートフォン、PC、タブレット、携帯端末、などのユーザ端末でもよいし、家庭内の家電装置などでもよい。通信装置100とセッションを生成して、通信装置からデータの供給を受ける装置であれば、どのような装置でもかまわない。
図1の通信装置は、データ転送装置101と、ホストCPU(プロセッサ)102と、記憶装置103と、送信バッファ104を備えている。ホストCPU102は、セッション毎に、送信するデータを記憶装置103から読み出して送信バッファ104へ書き込むよう制御する。また、ホストCPU102は、各セッションについて、対向機器とのコネクションの確立・切断を制御する。データ転送装置101は、ホストCPU102でコネクションが確立されている各セッションについて、各セッションを循環的に選択し、選択したセッションに対して送信処理を行うことを繰り返す。送信処理では、セッションを生成した対向機器に対してデータを送信する。データ転送装置101は、セッション間で、各回の送信処理で送信するデータ量のばらつきを抑制するようにデータを送信する。これにより、各セッションに均等に送信の機会を与え、ネットワークの帯域をできるだけ均等に使用させる。
記憶装置103には、送信用のデータを格納している。記憶装置103の具体的な実装形態は、例えばSSD(Solid State Drive)やHDD(Hard Disk Drive)、SDカード、SDRAM等が想定されるがその限りではない。
送信バッファ104は、一時的にデータを保持するための記憶領域である。送信バッファ104には、セッション毎に使用する領域が予め割り当てられていてもよい。送信バッファ104は、記憶装置103上に配置されてもよいし、メインメモリなど別の装置上に配置されてもよい。また、後述のデータ転送装置101内に配置してもよい。
ホストCPU102は、通信装置100全体の制御を行う。ホストCPU102は、ソフトウェアで実現される主な処理部として、アプリケーション部21と、コネクション処理部22と、書き込み制御部23とを備える。アプリケーション部21は、データ送信アプリケーションを実行する処理部である。
コネクション処理部22は、使用する通信プロトコル(ここではTCP/IPを想定)に応じて、対向機器301とのセッションを生成し、当該セッションで対向機器301と通信を行うためのコネクションを確立・切断する処理を行う。コネクション処理部22は、生成したセッションに固有のIDを割り振る。このIDをセッションIDと呼ぶ。コネクション処理部22は、コネクションを確立または切断するための制御パケットを、データ転送装置101の通信処理部14を介して、対向機器301と送受信する。制御パケットの例として、SYNパケットやFINパケット、これらのパケットに付随して送受信するパケット等がある。
コネクション処理部22は、コネクションを確立または切断すると、コネクションの確立または切断の通知を、データ転送装置101のセッション管理部11に行う。この際、確立または切断の対象となったセッションIDを通知する。コネクションの確立の通知は、当該コネクションで最初に送信するデータが発生した時、または当該データを後述のデータ書込制御部23の制御で送信バッファ104に書き込んだ時などに行うことがあり得る。
ここでTCP/IPにおけるセッションとは、宛先IPアドレス/発信元IPアドレス/宛先ポート番号/発信元ポート番号の4つの情報で管理するコネクションを指す。セッションを生成するとは、これら4つの情報の組を生成することに相当する。ある1つのセッションは、コネクションが確立された状態、または確立されていない(切断された)状態を有する。TCP/IPは、セッション毎に、セッションに関連する対向機器と、送信処理および受信処理を行うものである。本実施形態に係るデータ転送装置101も、セッション毎に、セッションに関連する対向機器301と、送信処理および受信処理を行う。
書き込み制御部23は、記憶装置103に格納されているデータを、送信バッファ104に書き込むための制御を行う。書き込み制御の方法は、装置構成に応じて、任意の方法を用いればよい。例えば、記憶装置103が内部にDMAC(ダイレクトメモリアクセスコントローラ)(図示せず)を内蔵し、書き込み制御部23が、DMACに指示信号を出力することで、DMACが送信バッファ104にデータ書き込みを行ってもよい。この場合、書き込み制御部23が、DMACに、送信バッファ104における書き込みアドレスを指示すればよい。または、ホストCPU102自身が、記憶装置103からデータを読み出して、送信バッファ104に書き込んでもよい。あるいは、専用のハードウェアを用いて書き込み処理を行ってもよい。
なお、ホストCPU102は、上述した処理外にも、種々の処理を行う事が可能である。
データ転送装置101は、ホストCPU102に代行し、TCP/IPに従って、データの送信処理、および受信処理を行う。データ転送装置101は、セッション毎に、送信バッファ104に書き込まれたデータを読み出して、TCP/IP等のプロトコル処理を行う。これにより、フレームを生成する。そして、生成したフレームをネットワーク201へ送出する。このようなデータ転送装置101は、セッション管理部11、セッション情報記憶部12、データ読み出し部13、通信処理部14を備える。データ転送装置101は、ハードウェアとソフトウェア(プログラム)のどちらで構成しても良く、これらの両方で構成されてもよい。
セッション管理部11は、コネクション処理部22からコネクション確立の通知を受けると、コネクション確立されたセッションのIDを登録する。また、コネクション切断の通知を受けると、コネクション切断されたセッションのIDを削除する。これにより、セッション管理部11は、コネクション確立状態にあるセッションを内部で把握する。以下では、セッションIDを登録または削除することを、セッションを登録または削除と表現ンすることがある。
セッション管理部11は、登録されているセッションIDに基づき、各セッションを循環的に順次選択し、選択したセッションについて、通信処理部14に送信処理を行うことを指示する指示情報を出力する。循環的にセッションを選択する方法として、例えば、登録されているセッションIDをキューに保持しておき、先頭から順次セッションIDを読み出し、読み出したセッションIDを再度、キューの末尾に格納する方式を用いてもよい。キューは、データ転送装置101の内部または外部のバッファに格納しておく。
または、コネクション処理部22で確立された各セッションのIDとコネクション状態(確立または切断)を保持したテーブルを、データ転送装置101の内部または外部のバッファに保持しておく。当該テーブルの各エントリを順次、循環的に確認して、コネクション確立状態にあるセッションを選択する方法などでもよい。この場合、セッション管理部11にセッションが登録されているとは、テーブルにおいてセッションIDが登録され、コネクション状態が「確立」の状態を意味する。なお、ここで述べた方法以外で、セッションを選択する方法でもかまわない。
セッション情報記憶部12は、セッション管理部11で登録されている各セッションのセッション情報を記憶する。セッション情報は、前述したセッション(宛先IPアドレス/発信元IPアドレス/宛先ポート番号/発信元ポート番号)の値、および、TCP/IPヘッダを生成するために必要なその他の情報(シーケンス番号、確認応答番号(ACKシーケンス番号)等)を含む。また、MSS(Maximum Segment Size)をセッション情報に含めてもよい。MSSがすべてのセッションで共通であれば、別に管理してもよい。
また、セッション情報は、送信バッファ104のどの位置に、当該セッション用のデータが書き込まれているかを特定するためのバッファ情報も含む。バッファ情報は、送信バッファ104において、まだ送信されていないデータを格納しているアドレスを特定する情報を含む。例えば、バッファ情報は、送信バッファ104において読み出し済みのデータの末尾のアドレス(またはまだ読み出されていないデータの先頭アドレス)を指す読み出しポインタ、書き込みが完了したデータの末尾のアドレスを指す書き込みポインタとの組でもよい。これ以外の表現方法でバッファ情報を構成してもよい。
セッション情報記憶部12は、データ転送装置101内に配置されてもよいし、データ転送装置101外(例えばメインメモリ等)に配置されてもよい。セッション情報は、セッション管理部11へのセッションの登録(すなわちセッションIDの登録)時に、セッション情報記憶部12に登録され、セッション管理部11からセッションが削除される時に削除されてもよい。また、セッション情報記憶部12内のセッション情報は、セッションに対応する送信処理が行われたとき、また、送信バッファ104にセッションに対応するデータが書き込まれたときになどに更新されてもよい。ここで述べたセッション情報の登録および削除、更新は、ホストCPU102またはデータ転送装置101が行い、どちらが行うように構成しても構わない。
例えばデータ転送装置101のセッション管理部11が、セッションIDの登録時にセッション情報を生成して、セッション情報記憶部12内にセッション情報を格納してもよい。セッション情報の生成に必要な情報は、ホストCPU102から取得すればよい。または、セッション管理部11へのセッションの登録時に、ホストCPU102のコネクション処理部22または別の処理部がセッション情報を生成して、セッション情報記憶部12に格納してもよい。
また、データ転送装置101のセッション管理部11が、セッションIDの削除時に、該当するセッション情報をセッション情報記憶部12内から削除してもよい。または、セッション管理部11からのセッションIDの削除時に、ホストCPU102のコネクション処理部22または別の処理部が、セッション情報記憶部12からセッション情報を削除してもよい。
また、ホストCPU102の書き込み制御部23の制御により、送信バッファ104にデータを書き込んだときに、ホストCPU102またはデータ転送装置101が、該当するセッション情報(例えばセッション情報内のバッファ情報等)を更新してもよい。また、データ転送装置101の通信処理部14が、送信処理を実行したときに、該当するセッション情報(バッファ情報、シーケンス番号等)を更新してもよい。
データ読み出し部13は、通信処理部14からデータの読み出し指示を受けて、送信バッファ104からデータを読み出す。データ読み出し部13は、読み出したデータを通信処理部14に送る。送信バッファ104における読み出しアドレスは、通信処理部14が、セッション情報内のバッファ情報から算出して、通信処理部14に通知する構成でもよいし、データ読み出し部13が、当該バッファ情報から算出してもよい。または、バッファ情報は、セッション情報から分離して、データ読み出し部13が管理するように構成してもよい。
通信処理部14は、セッション管理部11から循環的に指示される各セッションに対して、データの送信処理を行う。通信処理部14は、当該セッションに対応するバッファ情報を確認することで、送信バッファ104における未送信のデータの位置およびサイズ等の情報を知る事ができる。よって、バッファ情報を元に、送信バッファ104からデータを読み出して、送信を実行できる。
具体的には、通信処理部14は、セッション管理部11から次に送信処理を行うセッションを指定されると、該当するセッション情報を取得して、セッション情報に含まれるシーケンス番号や確認応答番号、ポート番号等からTCP/IPのヘッダを生成する。また、データ読み出し部13に、当該セッションに対応するデータの読み出しを指示する。この際、セッション情報内のバッファ情報から読み出しアドレスを算出して、データ読み出し部13へ通知してもよい。通信処理部14は、データ読み出し部13により読み出されたデータを取得し、取得したデータに、上述のヘッダや、別途計算したチェックサム等を結合してフレームを生成する。通信処理部14は、生成したフレームをネットワーク201へ送出する。
また、通信処理部14は、ここで述べたデータ送信以外にも、対向機器301からのデータ受信処理や、ACKパケット、FINパケット、RSTパケット等の送受信処理を行う。なお、通信処理部14は、前述した制御パケットをネットワーク201から受信した場合は、当該制御パケットの情報をホストCPU102に、メインメモリ等のメモリを介して渡す。また、通信処理部14は、ホストCPU102から渡された情報に基づき、制御パケットを生成してネットワーク201に送信してもよい。制御パケットの生成をホストCPU101が行ってもよい。
図2は、データ転送装置101におけるある1つのセッションの状態遷移図を表している。セッションの状態として、非オフロード処理状態A101とオフロード処理状態A102が存在する。
ある1つのセッションは、セッションがコネクション処理部22により生成された時点では、初期状態として、非オフロード処理状態A101にある。セッションに対しコネクションが確立され、セッションがセッション管理部11に登録されると、セッションの状態は、オフロード処理状態A102に遷移する(T101)。またセッションが、セッション管理部11から削除されると、非オフロード処理状態A101に遷移する(T102)。
オフロード処理状態A102では、当該セッションは、オフロード処理状態A102にある他のセッション群とともに、セッション管理部11により循環的に(均等に)、順次選択され、通信処理部14により、当該セッションに関する送信処理が行われる。すなわち、オフロード処理状態A102にある各セッションは、それぞれ均等に送信の機会を割り当てられ、データを送信できる。一方、非オフロード処理状態A101にある当該セッションは、セッション管理部11に登録されておらず、送信の機会は与えられない。
つまり、ホストCPU102は、セッション管理部11にセッションIDを登録する事で、任意のセッションの送信処理を、データ転送装置101に代行依頼する。データ転送装置101は、セッション管理部11に登録されたセッションに対して、均等に順番に送信処理を実施する。また、ホストCPU102は、コネクションの切断を通知することで、セッション管理部11に登録されているセッションIDを除外し、これにより、当該セッションについて、データ転送装置101による送信処理を停止できる。
図3は、データ転送装置101における送信処理のフローチャートである。
(ステップS101)まず、セッション管理部11は、自身が管理しているセッションから、1つのセッションを選択し、そのセッションに対して送信処理を開始するように通信処理部14に通知する。
(ステップS102)通信処理部14は、セッション管理部11から通知されたセッションに対応するセッション情報を、セッション情報記憶部12から読み出す。通信処理部14は、読み出したセッション情報から、データの読み出しに必要な情報を特定し、特定した情報を、読み出し指示とともに、データ読み出し部13に送る。データの読み出しに必要な情報は、例えば、送信バッファ104における読み出しアドレス(バッファ情報)や、MSS(Maximum Segment Size)などを含んでもよい。これらの情報をデータ読み出し部13が内部で管理している場合は、通信処理部14は読み出し指示のみを送る構成でもよい。
(ステップS103)データ読み出し部13は、通信処理部14の読み出し指示に従って、送信バッファ104からデータを読み出す。例えば、1フレームに格納する分のデータを読み出す。
例えば、MSSが1460Byteに設定されており、送信バッファ104には4KBのデータが存在した場合は、4KBのうち1460Byteだけデータを読み出す。または、MSSが1460Byteに設定されており、送信バッファ104に512Byteのデータが存在する場合は、512Byteのデータを読み出す。本実施形態では、各セッションについて、1回の送信処理で、1フレームの送信を想定しているが、所定の複数のフレームを送信する形態でもよい。この場合は、フレームの個数分、各フレームに格納するデータをそれぞれ読み出すことになる。当然ながら、フレームに格納するデータが存在しない場合は、送信するフレーム数は、上記所定の複数よりも小さくなる。つまり、各セッションおよび各回の送信処理で送信されるフレーム数の上限値は共通である。
(ステップS104)通信処理部14は、データ読み出し部13からデータを受け取ると、セッション情報を元にヘッダを生成し、ヘッダをデータと結合する。また、ヘッダとデータからチェックサムを計算し、その計算結果をデータにさらに付加することで、フレームを生成する。通信処理部14は、生成したフレームを、ネットワーク201に出力する。
(ステップS105)通信処理部14は、フレームを送信したセッションに対応するセッション情報を更新する。例えば、今回送信したデータのサイズに基づき、セッション情報におけるシーケンス番号(送信済みシーケンス番号)を更新する。また、今回、送信バッファ104から読み出しを行ったアドレス、または、今回送信したデータのサイズ等から、セッション情報におけるバッファ情報を更新する。その他、必要に応じて、セッション情報内の他の項目の値を更新する。ただし、バッファ情報の更新は、再送処理を考慮して、送信したデータに該当するACKパケットを受信したタイミングで行う構成でも良い。
(変形例)
第1の実施形態では、通信プロトコルとしてTCPを想定し、コネクションを確立しているセッションをセッション管理部で選択の対象としたが、UDPのようなコネクションレス型のプロトコルを使用する場合は、単純に、確立している各セッションを選択の対象にすることも可能である。このことは、後述する第2および第3の実施形態についても同様に適用される。
以上、第1の実施形態に係る通信装置によれば、各セッションに対して、それぞれ順番に(循環的に)送信処理を実行し、セッション間で各回の送信処理で送信するデータ量のばらつきを抑制する。例えば、各セッションおよび各送信処理で、それぞれ上限値以下の個数のフレームを送信する。これにより、各セッションに、それぞれ均等にネットワーク帯域を割り当てることができ、特定のセッションでバースト的にフレームが送信されることを防止できる。
(第2の実施形態)
本実施形態では、セッション管理部11で管理するセッションのうち、送信バッファ104にデータが存在するセッションのみを、送信処理を実行する対象として選択する。第1の実施形態では、セッション管理部11に登録されている限り、送信するデータが存在しないセッションも選択される。このため、当該セッションに対して送信処理の動作がとられると、結局、送信するデータは存在しないことから、データの送信は行われず、それまで行われたセッション情報の読み出し動作、およびその解析等の動作が無駄になる(空振り動作)。これは、データ転送装置にとって余分な負荷になるとともに、その動作の時間分、ネットワーク帯域の利用効率が低下する。そこで、本実施形態では、送信するデータがないセッションに対しては、送信処理に対するセッションの選択対象から除外することで、この問題を解決する。
図4は、第2の実施形態に係るデータ転送装置を備えた通信装置を示すブロック図である。図1と同一の名称の要素には同一の符号を付して、変更または拡張された処理を除き、重複する説明を省略する。
本実施形態の通信装置200におけるデータ転送装置101は、第1の実施形態の各処理部に加え、バッファ状態管理部17を備える。バッファ状態管理部17は、セッション管理部11に登録されている各セッションについて、送信バッファ104でのデータ格納状況に応じて、その状態の設定を管理する。
図5は、データ転送装置101におけるある1つのセッションの状態遷移図を表している。
第1の実施形態における非オフロード処理状態A101・オフロード処理状態A102に加え、オフロード処理状態(データ待ち)A103が設けられている。ここでは、第1の実施形態で説明したオフロード処理状態A102を、オフロード処理状態(送信可能)A102と表現して、オフロード処理状態(データ待ち)A103と区別している。オフロード処理状態(送信可能)A102は、セッションの第1の状態、オフロード処理状態(データ待ち)A103は、セッションの第2の状態に相当する。
オフロード処理状態(データ待ち)A103は、あるセッションについて、コネクションが確立していてセッション管理部11に登録されているが、送信用のデータが送信バッファ104に存在しない状態である。この状態では、セッション管理部11は、当該セッションを、送信処理に対する選択対象から除外する。
バッファ状態管理部17は、オフロード処理状態(送信可能)A102とオフロード処理状態(データ待ち)A103の設定を、セッション管理部11で管理されている各セッションに対して管理する。
例えば、オフロード処理状態(送信可能)A102において、送信バッファ104にデータが存在しないことが検知された場合は、通信処理部14が、その旨をバッファ状態管理部17に通知する。通知を受けたバッファ状態管理部17は、セッション管理部11における当該セッションの状態を、オフロード処理状態(データ待ち)A103に設定する(T103)。
ここで、非オフロード処理状態A101ではなく、オフロード処理状態(データ待ち)A103に設定するのは、データ転送装置101は、送信バッファ104からのデータ転送は行わないが、データ受信処理や、ACKパケットやFINパケット、RSTパケット等の制御関連の送受信処理を、対向機器301と行う必要があるためである。つまり、セッション管理部11でセッションが登録されている限り、データの送信処理は行わなくとも、上記制御関連の送受信処理は行われるよう、データ転送装置は動作する。
また、書き込み制御部23が、その制御により、送信バッファ104にデータを書き込んだ時に、その旨をバッファ状態管理部17に通知する。通知を受けたバッファ状態管理部17は、セッション管理部11における当該セッションの状態を、オフロード処理状態(データ待ち)A103から、オフロード処理状態(送信可能)A102に変える(T104)。なお、当該セッションが、元々オフロード処理状態(送信可能)A102であれば、その状態を維持する。
また、オフロード処理状態(データ待ち)A103において、コネクション処理部22からコネクションの切断の通知を受けると、セッション管理部11は、当該セッションの登録を削除する。すなわち、当該セッションのセッションIDを削除する。これにより、当該セッションは、非オフロード処理状態A101に遷移する(T105)。
セッション管理部11は、オフロード処理状態(送信可能)A102にあるセッションのみを循環的に選択して、通信処理部14に送信処理を実行させる。これにより、コネクションは確立しているが、送信バッファ104にデータが存在しないセッションに対しては、送信処理の動作を開始させずに済む。
図6は、本実施形態に係るデータ転送装置101における送信処理のフローチャートである。より詳細には、このフローチャートは、セッション管理部11に登録されている、オフロード処理状態(送信可能)A102にあるセッションに対して行う処理の流れを示している。
(ステップS201)セッション管理部11は、自身が管理しているセッションから、オフロード処理状態(送信可能)A102にあるセッションを1つ選択し、そのセッションに対して送信処理を開始するように、通信処理部14に通知する。
(ステップS202)通信処理部14は、通知されたセッションに該当するセッション情報をセッション情報記憶部12から読み出す。通信処理部14は、セッション情報から、送信バッファ104からのデータの読み出しに必要な情報(例えばバッファ情報、MSSなど)を特定する。
(ステップS203)通信処理部14は、特定した情報から、送信バッファ104に送信用のデータが存在するかを判断する。例えば、バッファ情報が、読み出すべきアドレスが存在しないことを示す場合(例えば読み出しポインタと書き込みポインタが一致している場合)は、送信バッファ104にデータが存在しないと判断する。それ以外の場合は、データが存在すると判断できる。
(ステップS207)通信処理部14は、送信バッファ104にデータが存在しないと判断したときは、その旨をバッファ状態管理部17に通知する。バッファ状態管理部17は、そのセッションの状態を、オフロード処理状態(データ待ち)A103に設定する。この後、ステップS201に戻る。
(ステップS204)一方、通信処理部14は、送信バッファ104にデータが存在すると判断したときは、通信処理部14は、データ読み出し部13に、読み出し指示、および、必要に応じてバッファ情報等を送る。データ読み出し部13は、読み出し指示に従って、例えば1フレームに格納する分だけのデータを、送信バッファ104から読み出す。第1の実施形態と同様、各セッションについて、1回の送信処理毎に、1フレーム分の送信を想定しているが、1回の送信処理で、複数のフレームを送信する形態でもよい。
(ステップS205)通信処理部14は、データ読み出し部13からデータを受け取ると、セッション情報を元にヘッダを生成し、生成したヘッダをデータと結合する。また、ヘッダとデータからチェックサムを計算し、その計算結果を、データにさらに付加することで、フレームを生成する。通信処理部14は、生成したフレームをネットワーク201に出力する。
(ステップS206)通信処理部14は、フレームの送信後、セッション情報記憶部12における当該セッションのセッション情報を更新する。例えば今回送信したデータのサイズに応じて、セッション情報におけるシーケンス番号(送信済みシーケンス番号)を更新する。また、今回送信したデータを読み出したアドレスに応じて、セッション情報におけるバッファ情報を更新する。バッファ情報の更新は、再送処理を考慮して、送信したフレームに該当するACKパケットを受信したタイミングで行う構成でも良い。
上述した処理では、通信処理部14は、送信バッファ104にデータが存在するかの判断を、送信処理の開始時に行ったが、送信処理の完了後に、送信バッファ104にデータが存在するかの判断を行ってもよい。つまり、図6のステップS203、S206の処理を、ステップS205またはS206の後に行ってもよい。
また、上述した実施形態では、送信バッファ104にデータが存在するかの判断を通信処理部14が行ったが、この判断をバッファ状態管理部17が行うようにしてもよい。この場合、バッファ状態管理部17は、書き込み制御部23から、セッション毎に、新たに送信バッファ104に書き込まれたデータのアドレスの通知を受け、また通信処理部14からは、送信バッファ104から読み出したデータのアドレス(あるいは、送信済みでACKパケットを受信したデータのアドレス)の通知を受ける。バッファ状態管理部17は、例えば書き込まれたデータの末尾のアドレスを書き込みポインタ、読み出し済みのデータの末尾のアドレスを読み出しポインタとし、データ転送装置101の内部または外部のバッファ(メモリ)で管理する。バッファ状態管理部17は、これらのポインタを比較することで、まだ読み出されていないデータが存在するか判断できる。まだ読み出されていないデータが存在することを検知した場合は、当該セッションの状態を、オフロード状態(データ待ち)A103に遷移させる。
以上、第2の実施形態に係る通信装置によれば、コネクションを確立していて、かつ、送信バッファ104にデータが存在するセッションに対してのみ、順次、フレーム送信処理を実行する。これにより、セッション間で均等に帯域を利用しつつ、効率よく転送をすることが可能となる。
(第3の実施形態)
TCPでは、受信側の通信装置は、現在、自身が受信可能なデータサイズをウィンドウサイズ(受信ウィンドウサイズ)として、送信側の通信装置に通知している。このウィンドウサイズは、データパケットやACKパケットのヘッダに含められる。一般的に、この受信ウィンドウサイズは、自身の受信バッファの空き領域のサイズなどが、設定される。
送信側の通信装置は、この受信側の通信装置の受信ウィンドウサイズを、自身の送信ウィンドウサイズとして用い、この送信ウィンドウサイズ以上のデータ送信を行わないように、送信を制御(フロー制御)する。これは、受信側の通信装置でのバッファのオーバーフローを防ぐためである。もし受信側の通信装置の受信バッファにオーバーフローが発生すると、TCP/IPの再送処理が発生して、通常より多くのパケットを、ネットワークに送信してしまう。
また、ネットワークの通信経路上の通信機器(例えばルータ等の中継機器)内にもバッファが存在し、これらのバッファがオーバーフローを起こす可能性も考えられる。このため、TCPでは、送信側は輻輳制御によって、送信するデータサイズを制限しながら、輻輳を起こさないように送信処理を行う。このとき、送信するデータサイズは、送信側の輻輳ウィンドウによって定められる。TCPの輻輳制御では、はじめは輻輳ウィンドウサイズを小さな値から開始し、受信側からACKパケットを受ける(受信側へデータが到達する)度に、輻輳ウィンドウサイズを増やしていく。輻輳ウィンドウサイズを増やしていき、重複ACKや再送タイムアウト等が発生した場合には、通信経路上でバッファオーバーフロー等の理由により、パケットロス(輻輳)が発生したと判断して、輻輳ウィンドウサイズを減少させる。このようにTCPでは、送信するデータサイズを制限しながら送信処理を行う事で、ネットワークの輻輳を、なるべく発生させないようにしている。輻輳制御アルゴリズムには、様々なものがあるが、本実施形態は、輻輳制御のアルゴリズムの種類によらないため、これ以上の説明は割愛する。
送信側の通信装置は、送信ウィンドウサイズ(対向装置の受信ウィンドウサイズ)と輻輳ウィンドウサイズのどちらかが、ある閾値以下になった場合は、送信処理を中断する。
つまり、少なくともどちらかのウィンドウサイズが、閾値以下になった場合は、そのセッションについては、送信が中断される。この閾値には、例えばMSSなどの値が使われる。この送信が中断されたセッションは、対向機器からのACKパケットを受信して、送信ウィンドウサイズ(対向の受信ウィンドウサイズ)と輻輳ウィンドウサイズが更新され、いずれのウィドウサイズも閾値を上回れば、送信が再開される。
上記のようにTCPでは、送信ウィンドウおよび輻輳ウィンドウを用いてフロー制御および輻輳制御を行っているため、コネクション確立状態にあり、かつ、送信バッファにデータが存在する場合においても、送信を行わない場合がある。仮に、フロー制御および輻輳制御を無視して、送信処理を行うと、転送効率が低下する可能性が存在する。例えば、受信側(対向機器側)の受信バッファ等が極端に小さな状況で、送信ウィンドウの上記閾値以下のサイズのデータを送信すると、転送効率が低下し、最大速度での転送ができなくなる可能性がある。また、セッションの通信経路が輻輳を起こしているに場合に、輻輳ウィンドウの上記閾値以下のサイズのデータを送信しても、同様に、転送効率が低下し、最大速度での転送ができなくなる可能性が存在する。また、フロー制御及び輻輳制御を行っている状態で、仮に第1または第2の実施形態のフローチャートで示した送信処理を行うと、フロー制御および輻輳制御によって送信が制限されているセッションに対して送信処理の動作がとられると、結局、データの送信は行われず、それまで行われたセッション情報の読み出し動作、およびその解析等の動作が無駄になる(空振り動作)。これは、データ転送装置にとって余分な負荷になるとともに、その動作の時間分、ネットワーク帯域の利用効率が低下する。そこで、第3の実施形態では、フロー制御および輻輳制御の状態も考慮して、送信処理を行うセッションを決定する。
図7は、第3の実施形態に係るデータ転送装置を備えた通信装置を示すブロック図である。図1と同一の名称の要素には同一の符号を付して、変更または拡張された処理を除き、重複する説明を省略する。
通信装置300の通信処理部14は、送信処理を行う送信処理部16と、受信処理を行う受信処理部15を備える。通信処理部14は、TCPの輻輳制御アルゴリズムを実行する機能を備えている。なお、第1および第2の実施形態でも、通信処理部14は、送信処理を行う処理部と受信処理を行う部を備えているが、本実施形態では、これらを明示的に記載している。
本実施形態のデータ転送装置101は、第1の実施形態の各処理部に加え、ウィンドウ状態管理部18を備える。ウィンドウ状態管理部18は、送信ウィンドウ及び輻輳ウィンドウの状態(すなわち、フロー制御および輻輳制御の状態)に応じて、セッション管理部11で管理しているセッションの状態の設定を制御する。
図8は、データ転送装置101におけるある1つのセッションの状態遷移図を表している。
第1の実施形態における非オフロード処理状態A101・オフロード処理状態A102に加え、オフロード処理状態(ウィンドウ更新待ち)104が設けられている。第1の実施形態で説明したオフロード処理状態を、オフロード処理状態(ウィンドウ更新待ち)104と区別するため、オフロード状態(送信可能)A102と表現している。オフロード処理状態(送信可能)A102は、セッションの第1の状態、オフロード処理状態(ウィンドウ更新待ち)A104は、セッションの第2の状態に相当する。
オフロード処理状態(ウィンドウ更新待ち)104は、コネクションが確立していてセッション管理部11に登録はされているが、送信ウィンドウおよび輻輳ウィンドウの各ウィンドウサイズの少なくとも一方が閾値以下の状態である。送信ウィンドウのウィンドウサイズが閾値以下の状態を“送信ウィンドウが閉じている”、閾値より大きい状態を“送信ウィンドウが開いている”と表現することがある。輻輳ウィンドウのウィンドウサイズが閾値以下の状態を“輻輳ウィンドウが閉じている”、閾値より大きい状態を“輻輳ウィンドウが開いている”と表現することがある。送信ウィンドウの閾値と輻輳ウィンドウの閾値は同じであっても、異なってもよい。例えば両閾値ともMSSを用いてもよい。ウィンドウが閉じた状態にあるセッションは、セッション管理部11の選択対象から除外され、送信処理は行われない。
ウィンドウ状態管理部18は、オフロード処理状態(送信可能)A102とオフロード処理状態(ウィンドウ更新待ち)A104の設定を、セッション管理部11に登録されている各セッションに対して管理する。
例えば、オフロード処理状態(送信可能)A102にあるセッションについて、送信処理部16が、送信処理の開始時にウィンドウが閉じている事を検知した場合は、ウィンドウ状態管理部18にこの旨を通知する。通知を受けたウィンドウ状態管理部18が、当該セッションの状態を、オフロード処理状態(ウィンドウ更新待ち)A104に遷移させる(T106)。非オフロード処理状態A101ではなく、オフロード処理状態(ウィンドウ更新待ち)A104にするのは、送信バッファ104からのデータ送信は行わないが、対向機器301からのデータ受信処理やACKパケットやFINパケット、RSTパケットの送受信処理は行う必要があるためである。つまり、セッション管理部11でセッションが登録されている限り、データの送信処理は行わなくとも、上記制御関連の送受信処理は行われるよう、データ転送装置は動作する。
一方、オフロード処理状態(ウィンドウ更新待ち)A104において、受信処理部15が、対向機器301からのACKパケットを受け、TCPパケット内のウィンドウサイズおよびTCPの輻輳アルゴリズムに従って、送信および輻輳の各ウィンドウサイズが更新(同じ値に維持される場合もあり得る)されると、各ウィンドウサイズを、各々閾値と比較する。両方とも閾値よりも大きくなった場合は、受信処理部15が、ウィンドウ状態管理部18にこの旨を通知する。通知を受けたウィンドウ状態管理部18は、当該セッションの状態を、オフロード処理状態(送信可能)A102に遷移させる(T107)。あるいは、各ウィンドウサイズが閾値よりも大きくなったかを確認せずに、ACKパケットを受信したら、即座に、オフロード処理状態(送信可能)A102へ遷移させるように構成してもよい。これは、ACKパケットの受信時には、各ウィンドウサイズが更新される可能性が高いと考える事ができるためであり、仮にいずれか一方のウィンドウサイズが閾値以下のまま、オフロード処理状態(送信可能)A102に遷移させたとしても、次の送信処理時に再度、オフロード処理状態(ウィンドウ更新待ち)A104に遷移させることができるためである。
また、オフロード処理状態(ウィンドウ更新待ち)A104において、コネクション処理部22からコネクションの切断の通知を受けると、セッション管理部11は、当該セッションの登録を削除する。すなわち、当該セッションのセッションIDを削除する。これにより、当該セッションは、非オフロード処理状態A101に遷移する(T108)。
送信ウィンドウサイズおよび輻輳ウィンドウサイズの値は、各セッションのセッション情報に含めて管理してもよい。例えば受信処理部15におけるACKパケットの受信等により、送信ウィンドウサイズおよび輻輳ウィンドウサイズの新たな値が取得されると、該当するセッションのセッション情報に、更新後の値を書き込んで(上書きして)もよい。
また、ウィンドウ状態管理部18が、定期的または任意のイベント発生時に、セッション情報内の各ウィンドウサイズと、各々の閾値とを比較し、上述した判断方法に従って、セッションの状態の設定を制御してもよい。任意のイベントとしては、例えばセッション情報における各ウィンドウサイズの少なくとも一方が更新されたときに、通信処理部がウィンドウ状態管理部18にその旨を通知し、これをトリガーとすることが考えられるが、これに限定されない。
図9は、本実施形態に係るデータ転送装置101における送信処理のフローチャートである。より詳細には、このフローチャートは、セッション管理部11に登録されている、オフロード処理状態(送信可能)A102にあるセッションに対して行う処理の流れを示している。
(ステップS301)セッション管理部11は、自身が管理しているセッションから、オフロード処理状態(送信可能)A102にあるセッションを1つ選択し、そのセッションに対して送信処理を開始するように、通信処理部14に通知する。
(ステップS302)通信処理部14の送信処理部16は、通知されたセッションに該当するセッション情報をセッション情報記憶部12から読み出す。
(ステップS303)送信処理部16は、セッション情報に含まれる送信ウィンドウおよび輻輳ウィンドウの各ウィンドウサイズの値から、送信ウィンドウおよび輻輳ウィンドウが開いているかを判断する。すなわち、各ウィンドウサイズの値が両方とも閾値より大きいかを判断する。
(ステップS307)送信処理部16は、少なくともいずれか一方のウィンドウが閉じていれば、すなわち、少なくとも一方のウィンドウサイズの値が閾値以下であれば、その旨をウィンドウ状態管理部18に通知する。ウィンドウ状態管理部18は、当該セッションの状態を、オフロード処理状態(ウィンドウ更新待ち)A104に設定する。この後、ステップS301に戻る。
(ステップS304)一方、送信処理部16は、両ウィンドウとも開いていれば、データ読み出し部13に、読み出し指示、および必要に応じてバッファ情報等を送る。データ読み出し部13は、読み出し指示に従って、例えば1フレームに格納する分のデータを、送信バッファ104から読み出す。第1の実施形態と同様、1回の送信処理で、複数のフレームを送信する形態でもよい。ただし、読み出すデータサイズの上限値は、送信ウィンドウサイズまたは輻輳ウィンドウサイズの最小値となる。
(ステップS305)送信処理部16は、データ読み出し部13からデータを受け取ると、セッション情報を元にヘッダを生成し、生成したヘッダをデータに結合する。また、ヘッダとデータからチェックサムを計算し、その計算結果を、データにさらに結合することで、フレームを生成する。送信処理部16は、生成したフレームをネットワーク201に出力する。
(ステップS306)送信処理部16は、フレームの送信後、セッション情報記憶部12における当該セッションのセッション情報を更新する。例えば今回送信したデータのサイズに応じて、セッション情報におけるシーケンス番号(送信済みシーケンス番号)を更新する。また、今回送信したデータの読み出しアドレス等から、セッション情報におけるバッファ情報を更新する。
なお、受信処理部15は、対向機器からACKパケット等を受信した場合は、セッション情報における送信ウィンドウサイズおよび輻輳ウィンドウサイズを更新する。更新により両ウィンドウサイズの値が閾値以下の状態から閾値を上回った場合は、ウィンドウ状態管理部18にその旨を通知する。ウィンドウ状態管理部18は、当該通知を受けて、該当するセッションの状態を、オフロード処理状態(送信可能)に更新する。
上述した実施形態では、送信ウィンドウと輻輳ウィンドウの両方のウィンドウを用いて送信処理を制御したが、いずれか一方のウィンドウのみを用いて制御を行ってもよい。例えば、送信ウィンドウの方を用いる場合、送信ウィンドウサイズが閾値より大きければ、そのセッションの状態をオフロード処理状態(送信可能)として、そのセッションを送信処理の対象とする。閾値以下であれば、オフロード処理状態(ウィンドウ更新待ち)として、そのセッションを送信処理の対象としない。同様に、輻輳ウィンドウの方を用いる場合も、輻輳ウィンドウサイズが閾値より大きければ、そのセッションの状態をオフロード処理状態(送信可能)として、そのセッションを送信処理の対象とする。閾値以下であれば、オフロード処理状態(ウィンドウ更新待ち)として、そのセッションを送信処理の対象としない。
以上、第3の実施形態に係る通信装置によれば、コネクションを確立しているセッションの内、ウィンドウが開いているセッションに対してのみ、順次、循環的に送信処理を実行するため、セッション間で均等に帯域を利用しつつ、効率よく転送をすることが可能となる。
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。