以下、本発明の実施形態について説明する。
本実施形態では、ネットワークを介してデータを送る単位であるPDU(Protocol Data Unit)を、データリンク層ではフレーム、ネットワーク層ではパケット、トランスポート層ではセグメントまたはデータグラムと呼ぶ。また、TCPのSYNフラグのビットが1であるセグメントをSYNセグメント、SYNセグメントに対するACKセグメントであってSYNフラグとACKフラグが1のセグメントをSYN/ACKセグメントと呼ぶ。また、ACKフラグが1でSYNフラグが0のセグメントをACKセグメント、FINフラグが1のセグメントをFINセグメント、FINセグメントに対するACKセグメントであってFINフラグとACKフラグが1のセグメントをFIN/ACKセグメント、RSTフラグが1のセグメントをRSTセグメントと呼んで説明を行う。
本実施形態に係る通信装置は、コネクションの確立を行ってから、ネットワークを介して他の通信装置とデータ通信を行う。本実施形態に係る通信装置は、一例として、サーバである。以下、本実施形態に係る通信装置について図1を用いて説明する。図1は、本実施形態における情報処理装置100の構成を示す概略ブロック図である。図1に示すように、情報処理装置100は、通信部1、CPU2、メモリ3、チップセット4、及びディスク5を備える。図1に示すように、各構成部品はバスで接続されている。
通信部1は、CPU2と接続され、ネットワーク200を介して他の通信装置とデータの送受信を行う。本実施形態では、通信部1は、一例として、PCI(Peripheral Component Interconnect) Expressカードであり、情報処理装置100と抜き差し可能に接続されている。PCI Expressカード上に実装されたオフロードエンジンが、CPU2に代わって通信のプロトコル処理を行うことにより、高速なTCP/IPによる通信を実現する。PCI Expressカードは情報処理装置100のPCI Expressスロットに接続するためのコネクタを備えており、また、ネットワーク200と通信するためのポートを備えている。更に、このPCI Expressカードは、一例として、FPGA(Field Programmable Gate Array)とメモリを搭載する。
なお、通信部1は、図1に示すようにCPU2と直接接続されているが、これに限らず、チップセット4と接続されていてもよい。具体的には、PCI Expressバスは図1に示すようにCPU2に直接接続してもよいし、チップセット4を介して接続してもよい。
ディスク5は、チップセット4と接続されており、オペレーティングシステムや各種ライブラリ、その他のアプリケーションの実行ファイルが格納されている。ディスク5は一例としてハードディスクである。
メモリ3は、CPU2が読み書き可能なメモリで、一例として、ランダムアクセスメモリである。
CPU2は、通信部1、メモリ3、及びチップセット4と接続されている。CPU2は、通信部1、メモリ3、及びチップセット4を制御する。
続いて、図2を用いて、通信部1とCPU2の構成について説明する。図2は、本実施形態における通信部1とCPU2の構成を示す概略ブロック図である。図2に示すように、通信部1は、第1のプロトコル処理部11及びコネクション情報記憶部12を備える。またCPU2は、チップセット4を介してディスク5からプログラムをメモリ3に読み出し、プログラムを実行することにより第2のプロトコル処理部21として機能する。
第1のプロトコル処理部11は、ネットワーク200と接続され、送受信フレームのプロトコル処理を行う。具体的には、第1のプロトコル処理部11は、ネットワーク200を介して受信した受信フレームのプロトコルの解析を行う。第1のプロトコル処理部11は、この解析を行った結果、コネクション確立要求に対する応答を検出した場合、コネクションを確立する処理を実行する。一方、第1のプロトコル処理部11は、この解析を行った結果、コネクション切断要求を検出した場合、上記受信フレームに応じた情報を第2のプロトコル処理部21へ出力する。
第1のプロトコル処理部11は、一例として、通信部1として動作するPCI Expressカードに搭載されたFPGAで動作するようにプログラミングされている。
なお、FPGAには図示しない機能として、サーバと接続するためのPCI Expressのコントローラや、ネットワーク200と接続するためのEthernet(登録商標)コントローラ、メモリを制御するメモリコントローラなど、必要な機能が実装されている。
第1のプロトコル処理部11は図2に示すようにコネクション情報記憶部12と内部バスによって接続され、ネットワーク200から受信した受信フレームの処理とネットワーク200にフレームを送信する処理を行う。第1のプロトコル処理部11は、受信フレームを制御フレームとデータフレームに分別する機能を有する。第1のプロトコル処理部11は制御フレームと判断した場合、PCI Expressバスによって接続された第2のプロトコル処理部21にそのフレームを渡し、第2のプロトコル処理部21でそのフレームの処理を行う。一方、第1のプロトコル処理部11はデータフレームと判断した場合、取得したデータをコネクション情報により指定されたメモリ3の領域に書き込む。
また、第1のプロトコル処理部11は、送信側の処理として第2のプロトコル処理部21から送信を指示されたフレームにEthernet(登録商標)ヘッダの生成を行って送信する機能を有する。また、第1のプロトコル処理部11は、送信側の処理としてコネクション情報で指定されたメモリ3の領域からデータを読み出し、TCPのセグメントを生成してIPv4、Ethernet(登録商標)のヘッダ生成を行い、ネットワーク200に送信する機能を有する。
コネクション情報記憶部12には、第1のプロトコル処理部11と第2のプロトコル処理部21でプロトコル処理を行う際に共有するコネクション情報が記憶されている。コネクション情報記憶部12は、一例として、通信部1として動作するPCI Expressカード上のメモリ(図示せず)によって実現される。
第2のプロトコル処理部21は、第1のプロトコル処理部11とは異なるハードウェアで構成されている。第2のプロトコル処理部21は、第1のプロトコル処理部11が分別した制御フレームを取得し、取得した制御フレームのプロトコル処理を行う。例えば、第2のプロトコル処理部21はPCI Expressバスを介して、第1のプロトコル処理部11及びコネクション情報記憶部12にアクセスすることができる。
第1のプロトコル処理部11は、第1のヘッダ解析部(解析部)111、第1のコネクション情報探索部112、第1の状態遷移処理部113、受信データ処理部114、送信データ処理部115、及び第1のヘッダ生成部(送信処理部)116を備える。
第1のヘッダ解析部111は、ネットワーク200から受信した受信フレームの各層のプロトコルを解析する。具体的には、第1のヘッダ解析部111はEthernet(登録商標)と、IPv4と、TCPのプロトコルに対応しており、受信フレームがこれらのプロトコルであった場合にヘッダの解析を行う。例えば、第1のヘッダ解析部111は、ネットワーク200から受信した受信フレームを解析し、コネクション(接続)確立要求に対する接続受諾応答を検出する。ここで、トランスポート層のプロトコルは、例えばTCPであり、コネクション確立要求に対する接続受諾応答は、例えば、TCPのSYNフラグとACKフラグが1であるSYN/ACKセグメントである。
また、第1のヘッダ解析部111は、第1のヘッダ解析部111で処理できない、例えば、ARP(Address Resolution Protocol)やICMP(Internet Control Message Protocol)パケット、TCPのFINセグメントやRSTセグメントなどを制御フレームとして、第2のプロトコル処理部21へ渡す。これにより、第2のプロトコル処理部21がこの制御フレームについて所定のプロトコル処理を行う。
第1のコネクション情報探索部112は、第1のヘッダ解析部111によって解析された情報に基づいて、コネクション情報記憶部12から対応するコネクション情報を探索する。例えば、第1のコネクション情報探索部112は、第1のヘッダ解析部111がコネクション確立要求に対する接続受諾応答を検出した場合、第1のヘッダ解析部111が解析した結果に基づいて、コネクション情報記憶部12から受信フレームに対応するコネクション情報を探索する。ここで、第1のヘッダ解析部111が解析した結果は、例えば、始点IPアドレス、終点IPアドレス、TCPの始点ポート番号、TCPの終点ポート番号である。
第1の状態遷移処理部113は、第1のコネクション情報探索部が探索して得たコネクション情報に含まれるコネクション状態を遷移させる処理を行う。より詳細には、第1の状態遷移処理部113は、第1のヘッダ解析部111の解析の結果として、接続確立要求の送信後に相手装置からの接続受諾応答を検出した場合、または接続受諾応答の送信後に接続受諾応答に対する相手装置からの受諾応答あるいは相手装置からの接続受諾応答を検出した場合、所定のプロトコルの処理を行うために外部のCPUと共有して用いるコネクション情報に含まれるコネクション状態を、所定のプロトコルの接続が確立されたことを表す接続確立状態に遷移させる。その一例として、第1の状態遷移処理部113は、第1のコネクション情報探索部112が探索して得たコネクション情報に含まれるコネクション状態を、コネクション確立要求に対する接続受諾応答を待っている状態からコネクション確立状態に遷移させる。
受信データ処理部114は、コネクション状態が接続確立状態(ESTABLISHED)にある場合にコネクション情報で指定されたデータ領域に受信したデータを書き込む。
送信データ処理部115は、コネクション情報で指定されたデータ領域からデータを読み出す。
また、送信データ処理部115は、所定のプロトコルの接続確立要求、または所定のプロトコルの接続確立要求を受諾する接続受諾応答を、ネットワーク200を介して相手装置に送信する。
第1のヘッダ生成部116は、送信データ処理部115からのデータをTCPセグメントにしてIPv4、Ethernet(登録商標)の処理を行って送信する。例えば、第1のヘッダ生成部116は、第2のプロトコルから渡されたフレームにEthernet(登録商標)だけの処理だけをして送信することも可能である。
なお、第1のヘッダ解析部111、第1のコネクション情報探索部112、第1の状態遷移処理部113、第1のヘッダ生成部116、受信データ処理部114、送信データ処理部115はどれも内部バスによりコネクション情報記憶部12にアクセスすることができる。
第2のプロトコル処理部21は、第2のヘッダ解析部211、第2のコネクション情報探索部212、第2の状態遷移処理部213、及び第2のヘッダ生成部214を備える。
第2のヘッダ解析部211は、第1のプロトコル処理部11から受信した制御フレームの各層のプロトコルの解析などの処理を行う。
第2のコネクション情報探索部212は、第2のヘッダ解析部211による解析結果に基づいて、コネクション情報記憶部12において上記制御フレームに対応するコネクション情報を探索する。例えば、第2のコネクション情報探索部212は、第2のヘッダ解析部211により制御フレームがコネクション確立要求であることが検出された場合、コネクション確立要求待ち状態のコネクション情報を探索する。
第2の状態遷移処理部213は、第2のコネクション情報探索部212が探索して得たコネクション情報に含まれるコネクション状態を遷移させる。
第2のヘッダ生成部214は、受信フレームに応答する送信フレームを作成し、第1のプロトコル処理部11にこの送信フレームの送信を指示する。例えば、第2のヘッダ生成部214は、第2のコネクション情報探索部212がコネクション確立要求待ち状態のコネクション情報を探索により見つけた場合、コネクション確立要求に応答する送信フレームを生成し、該生成した送信フレームを第1のプロトコル処理部11から送信させる。
続いて、図3を用いて、コネクション情報記憶部12に記憶されるコネクション情報について説明する。図3は、コネクション情報記憶部12に記憶されるコネクション情報の一例である。コネクション情報記憶部12に記憶されるコネクション情報はそれぞれ図3に示すような要素から成り立っている。各コネクション情報は、コネクションを決定するための自身のIPアドレス、相手のIPアドレス、自身のポート番号、相手のポート番号の他に、コネクション状態、前のコネクション情報へのポインタ(PREV)と次のコネクション情報へのポインタ(NEXT)、RCV.NXT(次に受信が期待されるシーケンス番号)、RCV.WND(受信ウィンドウサイズ)、SND.UNA(まだ確認応答されていないシーケンス番号)、SND.NXT(次に送信するときに使用するシーケンス番号)、SND.WND(送信ウィンドウサイズ)、SND.WL1(最後のウィンドウアップデートのシーケンス番号)、SND.WL2(最後のウィンドウアップデートの確認応答番号)、受信データの書き込み領域のアドレス、受信データの書き込み領域の長さ、送信データの読み出し領域のアドレス、送信データの読み出し領域の長さなどを有する。
もちろんこれに限定される必要はなく、例えばRFC793で定義されるその他の情報を含んでもよいし、SACK(Selective ACKnowledgement:選択的確認応答)等のオプションとして定義される情報や、相手のMAC(Media Access Control)アドレスやTOS(Type Of Service)値、TTL(Time To Live)値等を含んでもよい。ここでRFC793は、転送制御プロトコルDARPAインターネットプログラムプロトコル仕様書である。
第1のプロトコル処理部11が初期化のため、書き込む情報としては、受信フレームから取り出した自身のIPアドレス、相手のIPアドレス、自身のポート番号、相手のポート番号、コネクション状態、相手のシーケンス番号、相手のウィンドウサイズである。もちろん第1のプロトコル処理部11は、これ以外のTCPオプションであるウィンドウスケーリング値やタイムスタンプなどの情報を書き込んでもよい。
続いて、図4A〜図4Eを用いて、第1のプロトコル処理部11の処理の流れを説明する。図4A〜図4Eは、第1のプロトコル処理部11の処理の流れの一例を示すフローチャートである。
(ステップS101)まず、第1のプロトコル処理部11は、フレームを受信する。このフレームを以下受信フレームという。
(ステップS102)次に、第1のヘッダ解析部111は、Ethernet(登録商標)の解析処理を行う。具体的には、第1のヘッダ解析部111は、受信フレームの先頭検出を行い、FCS(Frame Check Sequence)の検算をして、終点MACアドレスが自装置宛のものであることやタイプフィールドから上位層のプロトコルを示すIDの検出などを行う。FCSの検算の結果、フレームが破損しているか否かが検出される。
(ステップS103)次に、第1のヘッダ解析部111は、終点MACアドレスが自装置宛で且つフレームが破損していないか否か判定する。終点MACアドレスが自装置宛で且つフレームが破損していない場合、第1のヘッダ解析部111はステップS104へ進む。一方、終点MACアドレスが自装置宛でのものでない場合、または受信フレームが破損している場合(NO)、受信フレームは第1のヘッダ解析部111によって破棄される。
(ステップS104)ステップS103で終点MACアドレスが自装置宛で且つフレームが破損していないと判定された場合、ネットワーク層プロトコルがIPであるか否か判定する。ネットワーク層プロトコルがIPである場合(YES)、第1のヘッダ解析部111はステップS105へ進む。一方、ネットワーク層プロトコルがIPでない場合(NO)、受信フレームは第1のヘッダ解析部111によって第2のプロトコル処理部21に伝達される(図4E:ステップS136)。
(ステップS105)ステップS104でネットワーク層プロトコルがIPであると判定された場合、第1のヘッダ解析部111は、IPv4のヘッダ解析処理を行う。具体的には、第1のヘッダ解析部111は、ヘッダチェックサムの検算、バージョンフィールドのチェック、ヘッダ長の検出、パケット長のチェック、フラグメントの検出とリアセンブル処理、上位層のプロトコル番号の検出、終点IPアドレスが自装置宛であるかの確認を行う。ヘッダ長とパケット長の検証の結果やヘッダチェックサムの検算により、パケットが破損しているか否かが検出される。
(ステップS106)第1のヘッダ解析部111はパケットの破損を検出したか否か判定する。第1のヘッダ解析部111は、パケットの破損を検出した場合(YES)、そのパケットを破棄する。例えば、ヘッダ長とパケット長の検証の結果やヘッダチェックサムの検算により、パケットの破損が検出されればそのパケットは破棄される。一方、第1のヘッダ解析部111は、パケットの破損を検出しなかった場合(NO)、ステップS107に進む。
(ステップS107)第1のヘッダ解析部111はバージョンフィールドの検証の結果、ネットワーク層プロトコルがIPv4で、且つ終点IPアドレスが自装置のIPアドレス、すなわち自装置宛てのパケットであるか否か判定する。ネットワーク層プロトコルがIPv4で、且つ終点IPアドレスが自装置のIPアドレスである場合、第1のヘッダ解析部111は、ステップS108へ進む。一方、ネットワーク層プロトコルがIPv4以外である場合、または終点IPアドレスが自装置宛でない場合(NO)、受信フレームは制御フレームとして第1のヘッダ解析部111により第2のプロトコル処理部21に渡される。
(ステップS108)その上位層であるトランスポート層プロトコルがTCPであれば、第1のヘッダ解析部111はTCPヘッダ解析処理を行う。第1のヘッダ解析部111は、チェックサムの検算を行い、始点ポート番号、終点ポート番号、シーケンス番号、確認応答番号、オフセット、コントロールフラグ、ウィンドウサイズを取得する。また、チェックサムの検算の結果、セグメントの破損の有無が検出される。
(ステップS109)次に、第1のヘッダ解析部111は、オフセット値が正常で、且つセグメントが破損していないか否か判定する。オフセット値が正常で、且つセグメントが破損していない場合(YES)、第1のヘッダ解析部111はステップS110へ進む。一方、オフセットの異常、またはセグメントの破損が検出されれば(NO)、そのセグメントは第1のヘッダ解析部111によって破棄される。
(ステップS110)ステップS109でチェックサムの検算の結果、オフセット値が正常で、且つセグメントが破損していないと判定された場合、第1のヘッダ解析部111は、取得したTCPセグメントのコントロールフラグの解析を行う。第1のヘッダ解析部111は、コントロールフラグのSYNフラグのみが1であるか否か判定する。SYNフラグのみが1で他のフラグが0である場合(YES)、第1のヘッダ解析部111は、そのセグメントをコネクション確立要求と判定し、ステップS111に進む。一方、SYNフラグが0及び/または他のフラグが1である場合(NO)、第1のヘッダ解析部111は、ステップS113へ進む。
(ステップS111)ステップS110でコントロールフラグのSYNフラグのみが1であると判定された場合、第1のヘッダ解析部111は、コネクション情報の確保を行い、ステップS112へ進む。例えば、コネクション情報記憶部12において、未使用のコネクション情報の識別子をキューに蓄えるようにして、コネクション情報の確保時に第1のコネクション情報探索部112は、キューから取り出し、解放時にキューに追加するようにしてもよい。
(ステップS112)次に、第1のヘッダ解析部111は、コネクション情報の初期化を行う。このコネクション情報の初期化は、受信したフレームの解析結果からIPアドレス、ポート番号、及びコネクション状態などをコネクション情報に書き込むことである。第1のヘッダ解析部111は、このコネクション情報の先頭アドレスをフレームの付随情報としてメモリ3に格納し、受信フレームを第2のプロトコル処理部21に伝達する。
(ステップS113)また、第1のヘッダ解析部111は、TCPのコントロールフラグのFINフラグ、またはRSTフラグが1であるか否か判定する。TCPのコントロールフラグのFINフラグ、またはRSTフラグが1である場合(YES)、第1のヘッダ解析部111は、そのTCPセグメントを制御フレームとして第2のプロトコル処理部21に渡す。一方、TCPのコントロールフラグのFINフラグ、またはRSTフラグがいずれも1でない(NO)、第1のヘッダ解析部111はステップS114に進む。
(ステップS114)次に、第1のコネクション情報探索部112は、上述したTCPセグメント以外のTCPセグメントについてコネクション情報記憶部12からコネクション情報の探索を行う。合致するコネクション情報がある場合、第1のコネクション情報探索部112はステップS115へ進む。一方、合致するコネクション情報がない場合(YES)、その受信フレームは第1のコネクション情報探索部112により破棄される。このように、合致するコネクション情報が見つからなければそのセグメントの処理は行われない。
コネクション情報の探索の際、第1のコネクション情報探索部112は、始点IPアドレスと終点IPアドレス、TCPの始点ポート番号と終点ポート番号の全てが合致するコネクション情報を探索する。その際、処理を高速化するため、第1のコネクション情報探索部112は例えば、IPアドレスやポート番号をキーとして、コネクション情報記憶部12に記憶されているハッシュテーブルを用いて探索の高速化を行う。
(ステップS115)ステップS114で合致するコネクションが見つかった場合、そのコネクション状態により、処理が分岐する。まず、コネクション状態が閉じている(CLOSED)状態である場合、第1のコネクション情報探索部112は、そのセグメントの処理を行わず処理を終了する。
(ステップS116)一方、コネクションの状態が、コネクション確立要求に対する接続受諾応答を待っている(SYN_SENT)状態であれば、SYNフラグとACKフラグのみが1のセグメントであるか否かを判定する。SYNフラグとACKフラグのみが1のセグメントである場合(YES)、第1のコネクション情報探索部112はステップS117へ進む。一方、SYNフラグが0、ACKフラグが0、及びSYNフラグとACKフラグ以外のフラグが1の少なくともいずれかに該当するセグメントの場合(NO)、受信フレームは破棄される。
(ステップS117)ステップS116でSYNフラグとACKフラグのみが1のセグメントであると判定された場合、第1のコネクション情報探索部112は、TCPセグメントの確認応答番号(SEG.ACK)がコネクション情報のSND.NXTと一致するか否か判定する。TCPセグメントの確認応答番号(SEG.ACK)がコネクション情報のSND.NXTと一致する場合(YES)、第1のコネクション情報探索部112は、ステップS118へ進む。一方、TCPセグメントの確認応答番号(SEG.ACK)がコネクション情報のSND.NXTと一致しない場合(NO)、ステップS121へ進む。
(ステップS118)ステップS117でTCPセグメントの確認応答番号(SEG.ACK)がコネクション情報のSND.NXTと一致すると判定された場合、第1のコネクション情報探索部112は、コネクション状態をESTABLISHEDに設定する。
(ステップS119)次に、コネクション情報のSND.UNAやRCV.WNDなどの値を更新する。
(ステップS120)次に、第1の状態遷移処理部113は、第2のプロトコル処理部21にコネクション状態がコネクション確立(ESTABLISHED)状態になったことを通知するESTABLISHEDイベント通知を行う。
(ステップS121)ステップS117でTCPセグメントの確認応答番号(SEG.ACK)がコネクション情報のSND.NXTと一致しないと判定された場合、第1のヘッダ生成部116は、RSTセグメントを、ネットワーク200を介して、上記受信フレームの相手装置へ送信する。
(ステップS122)コネクション状態がCLOSEDとSYN_SENT以外の場合、第1のコネクション情報探索部112は、受信したセグメントのシーケンス番号と終了シーケンス番号(フラグ等も考慮したセグメントが含む最大のシーケンス番号)が受信ウィンドウの範囲外か否か判定する。受信したセグメントのシーケンス番号と終了シーケンス番号が受信ウィンドウの範囲外である場合(YES)、第1のコネクション情報探索部112はステップS123へ進む。一方、受信したセグメントのシーケンス番号と終了シーケンス番号が受信ウィンドウの範囲外でない場合(NO)、第1のコネクション情報探索部112はステップS124へ進む。
(ステップS123)ステップS122で受信したセグメントのシーケンス番号と終了シーケンス番号が受信ウィンドウの範囲外であると判定された場合、第1のヘッダ生成部116は、ACKセグメントを送信して処理を終了する。
(ステップS124)第1のコネクション情報探索部112は、SYNフラグが1で且つ開始シーケンス番号がRCV.NXT以上であるか否か判定する。SYNフラグが1で且つ開始シーケンス番号がRCV.NXT以上である場合(YES)、第1のコネクション情報探索部112はステップS125へ進む。一方、SYNフラグが1でない、または開始シーケンス番号がRCV.NXT未満の少なくともいずれかの場合(NO)、ステップS126へ進む。
(ステップS125)ステップS124でSYNフラグが1で開始シーケンス番号がRCV.NXT以上であると判定された場合、第1のヘッダ生成部116は、RSTセグメントを送信して処理を終了する。
(ステップS126)第1のコネクション情報探索部112は、セグメントのACKフラグが0か否か判定する。ACKフラグが0である場合(YES)、第1のコネクション情報探索部112は処理を終了する。ACKフラグが0でない場合(NO)、第1のコネクション情報探索部112はステップS127へ進む。
(ステップS127)第1の状態遷移処理部113は、コネクション状態毎に別の処理を行う。
(ステップS128)コネクション状態がESTALISHEDかCLOSE_WAITである場合、受信データ処理部114は、コネクション情報の受信データの書き込み領域のアドレスと長さで指定される領域に、対応するデータを書き込み、コネクション情報を更新する。また、第1のヘッダ生成部116は、相手装置にデータを受信したことを示すACKセグメントを送信する。
(ステップS129)コネクション状態がその他の場合、第1の状態遷移処理部113は、SND.UNAなどのコネクション情報を更新する。
(ステップS130)次に、第1の状態遷移処理部113は、第2のプロトコル処理部21にコネクション状態が変化する可能性があることを示すCHANGEDイベント通知を行う。
(ステップS131)コネクション状態がSYN_RECEIVEDである場合、第1の状態遷移処理部113は、セグメントの確認応答番号(SEG.ACK)がSND.UNA以上且つSND.NXT以下であるかを判定する。セグメントの確認応答番号がSND.UNA以上且つSND.NXT以下である場合、第1の状態遷移処理部113はステップS132へ進む。一方、セグメントの確認応答番号がSND.UNA未満、またはSND.NXTを超える場合(NO)、第1の状態遷移処理部113はステップS135へ進む。
(ステップS132)ステップS131でセグメントの確認応答番号がSND.UNA以上且つSND.NXT以下であると判定された場合、第1の状態遷移処理部113はコネクション状態をESTABLISHEDに設定する。
(ステップS133)次に、第1の状態遷移処理部113はその他のSND.UNA等のコネクション状態を更新する。
(ステップS134)次に、第1の状態遷移処理部113は第2のプロトコル処理部21にESTABLISHEDイベント通知を行う。
(ステップS135)ステップS131でセグメントの確認応答番号がSND.UNA未満、またはSND.NXTを超えると判定された場合、第1のヘッダ生成部116は、RSTセグメントを相手装置へ送信して処理を終了する。
(ステップS136)第1のヘッダ解析部111は、受信フレームを第2のプロトコル処理部21に伝達する。
続いて、図5を用いて、ハッシュテーブルの実装方法について説明する。図5は、本実施形態におけるハッシュテーブルの実装方法を説明する図である。ハッシュテーブルの実装方法はいくつかあるが、図5に示すように連鎖法によりルート配列の領域を確保し、コネクション情報にはコネクション情報同士をリストにするため、前のコネクション情報と次のコネクション情報を指すポインタを持たせる。そして、ルート配列から、同じハッシュ値を持つコネクション情報が接続されている。これにより、第1のコネクション情報探索部112は、ルート配列から、同じハッシュ値を持つコネクション情報をたどることができる。
ハッシュテーブルへの接続と削除は、コネクション情報確保後に、第1のプロトコル処理部11、第2のプロトコル処理部21によりハッシュテーブルへの接続を行い、コネクション解放前に第2のプロトコル処理部21によりハッシュテーブルからの削除を行う。
なお、ハッシュテーブルはコネクションの状態毎に分けて使用してもよい。ハッシュテーブルは、コネクション情報記憶部12にその領域を設けてもよいし、第1のプロトコル処理部11は、別途ハッシュテーブルの記憶部を備えてもよい。
続いて、図6を用いて、第1のプロトコル処理部11と第2のプロトコル処理部21でフレームとそのフレームの付随情報を送受する方法、及び第1のプロトコル処理部11から第2のプロトコル処理部21へイベント通知とイベントの付随情報の伝達の方法を説明する。図6は、メモリ3に格納されている送信フレームデスクリプタリング、受信フレームデスクリプタリング、イベント通知デスクリプタリングの概念図である。
第1のプロトコル処理部11から第2のプロトコル処理部21へのフレームとその付随情報の伝達にはリングバッファで構成される受信フレームデスクリプタリングを用いる。一方、第2のプロトコル処理部21から第1のプロトコル処理部11へのフレームの伝達には同じくリングバッファで構成される送信フレームデスクリプタリングを用いる。
また、第1のプロトコル処理部11から第2のプロトコル処理部21へイベントを通知するためにイベント通知デスクリプタリングを用いる。これらのデスクリプタリングは、一例として情報処理装置100のメモリ3に配置される。ここではそれぞれ八つのデスクリプタを持つリングを図示しているが、実際には第1のプロトコル処理部11と第2のプロトコル処理部21の処理速度差を吸収するのに必要な数のデスクリプタを備える。各デスクリプタリングはそれぞれheadとtailという値を用いて制御される。
(受信したフレームとその付随情報を伝達する方法について)
まず、第1のプロトコル処理部11から第2のプロトコル処理部21に受信したフレームとその付随情報を伝達する方法について説明する。受信フレームデスクリプタリングに含まれ各デスクリプタは、フレームの書き込み先アドレス、フレームの長さ、フレームの付随情報、ステータス情報で構成される。ステータス情報には、第1のプロトコル処理部11で発生したエラーの情報を示すビットや第1のプロトコル処理部11が当該ステータス情報が含まれるデスクリプタの書き込みを完了したことを示すDONEビットが含まれる。
第1のプロトコル処理部11は、headとtailという2つの変数を用いてデスクリプタへの書き込みを管理する。例えば、第1のプロトコル処理部11はheadからtail−1までのデスクリプタの書き込みが可能というように定める。ただし、第1のプロトコル処理部11が書き込み可能なデスクリプタの数の最大値はデスクリプタの最大値−1でありこの例では7になる。headとtailが一致している状況では第1のプロトコル処理部11が書き込み可能なデスクリプタがないことを示す。
このheadとtailの値は第1のプロトコル処理部11と第2のプロトコル処理部21でそれぞれに管理されている。第1のプロトコル処理部11は、これらheadとtailの値を通知しあったり、デスクリプタリングの先頭アドレスやデスクリプタの長さを通知しあったりするためのレジスタインタフェース117を更に備える。また、第2のプロトコル処理部21に処理するデスクリプタがあることを通知するための割り込み通知インタフェース118を更に備える。
第2のプロトコル処理部21は初期化処理として、情報処理装置100のメモリ3に受信フレームデスクリプタリングを構成するために必要な領域を確保し、前述のレジスタインタフェース117を介して第1のプロトコル処理部11に受信フレームデスクリプタリングの先頭アドレスとデスクリプタの長さを設定する。
続いて、第2のプロトコル処理部21は、受信フレームデスクリプタリングに含まれる各デスクリプタの初期化処理として、情報処理装置100のメモリに受信したフレームを格納するための十分な領域をそれぞれ確保し、そのアドレスをフレームの書き込み先アドレスとして設定する。この際、第2のプロトコル処理部21はフレームの長さとフレームの付随情報とステータス情報を0にクリアしておく。受信フレームデスクリプタリングに含まれる全てのデスクリプタについて処理が終わったら、第2のプロトコル処理部21は自身の管理するheadを0にクリアし、tailに7を設定する。そして、第2のプロトコル処理部21は、第1のプロトコル処理部11に対して第1のプロトコル処理部11の管理するheadとtailの値を同じ値に設定するよう指示する。
第1のプロトコル処理部11は、これを契機に動作を開始し、受信した受信フレームが制御フレームとして第2のプロトコル処理部21に渡すと判定した場合、headの位置のデスクリプタに含まれる情報(以下、デスクリプタ情報という)を読み出す。そして第1のプロトコル処理部11は、読み出したデスクリプタ情報に含まれるフレームの書き込み先アドレスを取得する。第1のプロトコル処理部11は、情報処理装置100のメモリ内の、その書き込み先アドレスに対して制御フレームを書き込み、デスクリプタに含まれる「フレームの長さ」に、書き込んだ制御フレームの長さを設定する。
その際、この制御フレームに関連するコネクション情報があれば、第1のプロトコル処理部11は、フレームの付随情報の一部にあるコネクション情報の領域にコネクション情報の先頭アドレスを書き込む。特に関連するコネクション情報がなければ、第1のプロトコル処理部11は、0などの特別な値を書き込む。
制御フレームの書き込みと受信フレームデスクリプタリングに含まれるデスクリプタの他の部分の書き込みが終わったら、第1のプロトコル処理部11は、ステータス情報のDONEビットに1を書き込み、第1のプロトコル処理部11は、割り込み通知インタフェース118を介して第2のプロトコル処理部21に割り込み通知を行う。その後、第1のプロトコル処理部11は、第1のプロトコル処理部11で管理しているheadの値を1増加させ、headがtail−1の位置に追いつかない限り、次の制御フレームの処理を新しいheadの位置で行う。
第2のプロトコル処理部21は、割り込み通知インタフェース118を介して第1のプロトコル処理部11から割り込み通知を受けると、自身で管理しているtailの指すデスクリプタのステータス情報のDONEビットを読み出す。このときDONEビットが0であれば、第2のプロトコル処理部21は、何も処理を行わない。
一方、DONEビットが1であれば、それは第1のプロトコル処理部11がそのデスクリプタの処理を完了したことを示しているので、第2のプロトコル処理部21は、フレームの書き込み先アドレスが示すメモリ3の領域からフレームの長さが示す長さ分を受信フレームとして取得する。また、第2のプロトコル処理部21は、必要に応じてフレームの付随情報に含まれるコネクション情報を用いて処理を行う。ここで行う処理の詳細については後程動作例を示して説明する。
フレームの処理が完了すると、ステータスビットのDONEビットを0に設定し、自身で管理するtailの値を1増加させ、tailの値を第1のプロトコル処理部11のtailの値に反映させる。これにより、処理の完了したデスクリプタに第1のプロトコル処理部11が新たに書き込むことができるようになる。第2のプロトコル処理部21は、割り込みがあるたび、この動作を繰り返す。なお、書き込み先フレームアドレスは毎回新たに確保したメモリの領域を設定するようにしてもよい。
(送信したいフレームを伝達する方法について)
続いて、第2のプロトコル処理部21から第1のプロトコル処理部11に送信したいフレームを伝達する方法について説明する。送信デスクリプタリングに含まれる各デスクリプタはフレームの読み出し元アドレス、フレームの長さ、フレームの付随情報、及びステータス情報で構成される。ステータス情報には受信フレームデスクリプタリングと同様に、エラーの情報を示すビットやDONEビットが含まれる。headとtailの使用方法も受信側と同様であるのでここでは説明を省略する。
なお、図6では割り込み通知インタフェース118は一つとなっているが、デスクリプタリングの種別毎に適宜別々のインタフェースに分けてもよい。
第2のプロトコル処理部21の第2のヘッダ生成部214は、初期化処理として、情報処理装置100のメモリ3にデスクリプタリングを構成するために必要な領域を確保し、前述のレジスタインタフェース117を介して第1のプロトコル処理部11にデスクリプタリングの先頭アドレスとデスクリプタの長さを設定する。続いて、第2のヘッダ生成部214は、自身で管理するheadとtailの値を0に設定し、第1のプロトコル処理部11が管理するheadとtailの値も0に設定するよう第1のヘッダ生成部116へ指示する。
第2のヘッダ生成部214は、フレームを送信しようとすると、自身の管理するtailの位置のデスクリプタのフレームの読み出し元アドレス及びフレームの長さに、それぞれ送信しようとしているフレームのアドレス及び長さを設定する。またこのとき、フレームに付随する情報としてコネクション情報に格納したい値などがあれば、第2のヘッダ生成部214は、フレームの付随情報にそれを書き込む。そして、第2のヘッダ生成部214は、ステータス情報を全て0にクリアした後、tailの値を1増加させ、第1のプロトコル処理部11にそのtailの値を通知する。
これを受けた第1のプロトコル処理部11の第1のヘッダ生成部116はheadの指すデスクリプタからフレームの読み出し元アドレスとフレームの長さ、フレームの付随情報を取得し、フレームの付随情報に従って処理を行った後、そのフレームをネットワーク200に送信する。そして、第1のヘッダ生成部116は、デスクリプタのステータス情報のDONEビットを1に書き換え、自身の管理するheadの値を1増加させた後、割り込み通知インタフェース118を介して割り込み通知を行う。
割り込み通知を受けた第2のプロトコル処理部21の第2のヘッダ生成部214は、自身の管理しているheadの位置にあるデスクリプタのDONEビットをチェックし、これが0であれば処理を行わない。これが1であれば第1のプロトコル処理部11により処理が完了しているので第2のヘッダ生成部214は、送信し終わったフレームのメモリを解放する処理を行い、自身の管理するheadの値を1増加させる。
(イベント通知の方法について)
次に、第1のプロトコル処理部11から第2のプロトコル処理部21に対するイベント通知の方法について説明する。第1のプロトコル処理部11から第2のプロトコル処理部21に対するイベント通知はイベント通知デスクリプタリングを用いて行う。ここで、headとtailについては受信フレームデスクリプタリングと同様であるので説明は省略する。
第2のプロトコル処理部21の第2の状態遷移処理部213は、初期化処理として、情報処理装置100のメモリ3にイベント通知デスクリプタリングを構成するために必要な領域を確保する。そして、第2の状態遷移処理部213は、前述のレジスタインタフェース117を介して第1のプロトコル処理部11にイベント通知デスクリプタリングの先頭アドレスとデスクリプタの長さを設定させる。続いて、第2のプロトコル処理部21は、各デスクリプタの初期化処理として、全ての値を0にクリアしておく。イベント通知デスクリプタリングに含まれる全てのデスクリプタについて処理が終わったら、第2の状態遷移処理部213は、自身の管理するheadを0にクリアし、tailに7を設定し、第1のプロトコル処理部11に対して第1のプロトコル処理部11の管理するheadとtailの値を同じ値に設定するよう指示する。
第1のプロトコル処理部11の第1の状態遷移処理部113は、これを契機に動作を開始し、イベント通知を第2のプロトコル処理部21に行うと判定した場合、コネクション状態に応じてイベント通知デスクリプタリングに含まれるheadの位置のデスクリプタにイベント種別としてESTABLISHEDまたはCHANGEDのいずれかを設定する。具体的には、第1の状態遷移処理部113は、付随情報として与えられるコネクション情報のコネクション状態がESTABLISHEDになった場合、イベント種別をESTABLISHEDに設定する。一方、付随情報として与えられるコネクション情報のコネクション状態が変化する可能性がある場合、イベント種別をCHANGEDに設定する。
このとき、第1の状態遷移処理部113は、このイベント通知に関連するコネクション情報の先頭アドレスをイベント通知の付随情報に書き込む。これらの書き込みが終わったら、第1の状態遷移処理部113は、ステータス情報のDONEビットに1を書き込み、第2のプロトコル処理部21に割り込み通知を行う。その後、第1の状態遷移処理部113は、第1のプロトコル処理部11で管理しているheadの値を1増加させ、headがtail−1の位置に追いつかない限り、次の制御フレームの処理を新しいheadの位置で行う。
第2のプロトコル処理部21の第2の状態遷移処理部213は、割り込み通知インタフェース118により第1の状態遷移処理部113から割り込み通知を受けると、自身で管理しているtailの指すデスクリプタのステータス情報のDONEビットを読み出す。このとき、DONEビットが0であれば、第2のプロトコル処理部21は、何も処理を行わない。
一方、DONEビットが1であれば、それは第1のプロトコル処理部11がそのデスクリプタの処理を完了したことを示しているので、第2の状態遷移処理部213は、イベント種別とコネクション情報を取得する。イベント種別がESTABLISHEDであれば、第2の状態遷移処理部213は、コネクション確立を待つアプリケーションを起動するなどの処理を行う。
一方、イベント通知がCHANGEDである場合の第2の状態遷移処理部213の処理について、図7に示すフローチャートの処理を実行する。図7は、イベント通知がCHANGEDの場合の処理の流れの一例を示すフローチャートである。
(ステップS201)第2の状態遷移処理部213は、図7に示すようにコネクション状態がFIN_WAIT1、CLOSING、LAST_ACKのいずれかであるか判定する。コネクション状態がFIN_WAIT1、CLOSING、LAST_ACKのいずれかである場合、ステップS202へ進む。一方、コネクション状態がそれら以外の場合、第2のプロトコル処理部21はその処理を終了する。
(ステップS202)ステップS201でコネクション状態がFIN_WAIT1、CLOSING、LAST_ACKのいずれかであると判定された場合、第2の状態遷移処理部213は、コネクション情報のSND.NXTとSND.UNAが一致するかを判定する。コネクション情報のSND.NXTとSND.UNAが一致すれば(YES)、第2の状態遷移処理部213はステップS203へ進む。一方、コネクション情報のSND.NXTとSND.UNAが一致しなければ(NO)、第2の状態遷移処理部213はその処理を終了する。
(ステップS203)第2の状態遷移処理部213は、コネクション状態に応じた処理を分岐する。第2のプロトコル処理部21は、コネクション状態がFIN_WAIT1の場合、ステップS204に進み、コネクション状態がCLOSINGの場合、ステップS205へ進み、コネクション状態がLAST_ACKの場合、ステップS206へ進む。
(ステップS204)第2の状態遷移処理部213は、コネクション状態がCLOSINGの場合、FIN_WAIT2に状態を遷移させる。
(ステップS205)第2の状態遷移処理部213は、コネクション状態がCLOSINGの場合はTIME_WAITに状態を遷移させる。
(ステップS206)第2の状態遷移処理部213は、コネクション状態がLAST_ACKの場合はCLOSEDに状態を遷移させる。
なお、この際に第1のプロトコル処理部11は、イベント通知の付随情報として、本イベントの発生が新たなデータセグメントの受信であったか、シーケンス番号がRCV.NXTより小さな値であったかなどの情報を付加して、第2の状態遷移処理部213における状態遷移処理に用いてもよい。フレームの処理が完了すると、第2の状態遷移処理部213は、ステータスビットのDONEビットを0に設定し、自身で管理するtailの値を1増加させ、tailの値を第1のプロトコル処理部11のtailの値に反映させる。これにより、処理の完了したデスクリプタに第1のプロトコル処理部11が新たに書き込むことができるようになる。第2の状態遷移処理部213は、割り込みがあるたびこの動作を繰り返す。
第2のプロトコル処理部21が備える各構成要素はEthernet(登録商標)、IPv4、TCP以外にもARPやIPv6、ICMP、UDP(User Datagram Protocol)など様々なプロトコルに対応している。TCPについても第1のプロトコル処理部11はFINセグメントやRSTセグメントなどは処理できなかったが、第2のプロトコル処理部21は全てのセグメントを処理することができる。第2の状態遷移処理部213も第1の状態遷移処理部113で行うESTABLISHEDへの遷移以外の全ての状態遷移を行うことが可能である。
TCPにおけるコネクションの確立は、自装置からコネクション確立を行うアクティブオープンと、相手装置からコネクション確立を行うパッシブオープンと、同時に両方のホストがコネクション確立を行う同時オープンに分けられる。
図8を用いてパッシブオープンとアクティブオープンについて説明する。図8は、パッシブオープンとアクティブオープンの処理の流れを示すシーケンス図である。なお、この図8においては各TCPのセグメントに含まれるシーケンス番号と確認応答番号等については省略している。RFC793の規定と同様にSYNフラグを1バイトと数えて確認応答番号を送信するものとする。
(パッシブオープンの処理の流れ)
まず、パッシブオープンについて説明する。
(T21)自装置はまず、相手装置からのコネクション確立要求を待ち受けるため、コネクション状態がLISTENのコネクション情報を作成する。
(T11)相手装置は、通信を行うためのコネクション情報を作成し、コネクション状態をSYN_SENTに移行させる。
(T12)そして、相手装置は、SYNセグメントを送信する。
(T22)自装置は、このSYNセグメントを受信し、コネクション状態がSYN_RECEIVEDのコネクション情報を新たに作成する。
(T24)そして、自装置は、作成したSYN/ACKセグメントを相手装置へ送信する。
(T13)相手装置はこのセグメントを受信し、コネクション状態をESTABLISHEDに移行させる。
(T15)相手装置はACKセグメントを自装置に向けて送信する。
(T25)自装置は、このACKセグメントを受信し、コネクション状態をESTABLISHEDに遷移させ、両方のコネクションが確立する。
(パッシブオープンの処理の詳細)
以下では、まず本実施形態におけるコネクション確立のパッシブオープンの処理の流れの詳細について説明する。まず、第2のプロトコル処理部21は、アプリケーション等の要求により、コネクション確立要求の待ち受けを行うため、コネクション状態がLISTENのコネクション情報を作成する。このコネクション情報は必ずしもコネクション情報記憶部12に保存しなくてもよく、情報処理装置100のメモリ3に保存してもよい。
相手装置から、コネクション確立要求であるSYNセグメントが送信される。SYNセグメントはネットワーク200を介して第1のプロトコル処理部11に到達し、ここで各層のプロトコルの処理を行う。第1のヘッダ解析部111は、このセグメントがSYNフラグのみ1のセグメントであることを検出し、コネクション情報の識別子の確保と初期化を行ってコネクション状態がSYN_RECEIVEDのコネクション情報を作成する。そして、第1のヘッダ解析部111は、制御フレームとその付随情報として確保と初期化を行ったコネクション情報の先頭アドレスを含め、第2のプロトコル処理部21の第2のヘッダ解析部211に伝達する。これを受け取った第2のプロトコル処理部21は、まず第2のヘッダ解析部211により各層のプロトコルの解析を行う。
なお、このとき、制御フレームの付随情報として第1のヘッダ解析部111の処理結果を伝達し、第2のヘッダ解析部211では処理を省略してもよい。第2のヘッダ解析部211はこれがSYNセグメントであることを検出すると、第2のコネクション情報探索部212によりLISTENのコネクション状態が探索される。高速な探索のためには、コネクション情報はLISTENとTIME_WAIT、その他の状態に分けてハッシュテーブルにより管理されていることが望ましい。
具体的には、第2のコネクション情報探索部212は、SYNセグメントの終点IPアドレス、始点IPアドレス、終点TCPポート番号、始点TCPポート番号を用いて、それらが合致し且つコネクション状態がLISTENのコネクション情報を探索する。合致するLISTENのコネクション情報が見つかった場合、第2の状態遷移処理部213は、フレームの付随情報として伝達されたコネクション情報をハッシュテーブルに接続する。そして、第2の状態遷移処理部213は、コネクション状態をLISTENからSYN_RECEIVEDに遷移させる。これにより、第1のヘッダ生成部116は、SYN/ACKセグメントを、ネットワーク200を介して相手装置へ送信する。
そして、第2のヘッダ生成部214は、応答のSYN/ACKセグメントを生成し、第1のプロトコル処理部11の第1のヘッダ生成部116に制御フレームとして送信を指示する。なお、コネクション状態がLISTENのコネクション情報が見つからない場合や、パケットフィルタ等により受け入れられないSYNセグメントであれば、フレームの付随情報として伝達されたコネクション情報の解放を第1のプロトコル処理部11に指示する。
続いて、SYN/ACKセグメントが相手装置に届くと、その応答としてACKセグメントが送信される。これが第1のプロトコル処理部11で受信されると、まず第1のヘッダ解析部111で各層のプロトコル処理が行われた後、第1のコネクション情報探索部112は。ACKセグメントに対応するコネクション情報を探索する。これにより、先ほどハッシュテーブルにつないだSYN_RECEIVEDのコネクションが見つかる。
第1の状態遷移処理部113は、このコネクション情報とACKセグメントの情報を用いて判定が行われ、条件を満たせば、コネクション情報の更新とESTABLISHEDへコネクション状態の遷移を行う。そして、第1の状態遷移処理部113は、コネクション情報の先頭アドレスをイベントの付随情報に含め、第2のプロトコル処理部21に対し、ESTABLISHEDイベント通知を行う。第2のプロトコル処理部21はこれを受けて、アプリケーション等にESTABLISHEDに状態が変化したことを伝える。以上により、パッシブオープンが実現される。
このように、パッシブオープン側の場合、第1のヘッダ生成部(送信処理部)116は、第2の相手装置から接続確立要求を受けた場合、接続確立要求を受諾する接続受諾応答(SYN_ACKセグメント)を第2の相手装置へ送信する。そして、第1のコネクション情報探索部112は、解析部の解析の結果として、接続受諾応答(SYN_ACKセグメント)に対する前記相手装置からの受諾応答(ACKセグメント)を検出した場合、前記解析部が解析した結果に基づいて、コネクション情報が保存されているコネクション情報記憶部12から受諾応答に対応するコネクション情報を探索する。
第1の状態遷移処理部113は、第1のヘッダ解析部(解析部)111の解析の結果として、接続受諾応答に対する相手装置からの受諾応答を検出した場合、コネクション状態を、接続確立要求を受信した接続要求受信状態(SYN_RECEIVED)から、接続確立状態(ESTABLISHED)に遷移させる。具体的には、第1の状態遷移処理部113は、第1のコネクション情報探索部112が探索して得られたコネクション情報に含まれるコネクション状態を、接続要求受信状態(SYN_RECEIVED)から、接続確立状態(ESTABLISHED)に遷移させる。
(アクティブオープンの処理の詳細)
続いて、アクティブオープンのおいては、先ほどの相手装置の動きと同様となり、相手装置が、コネクション状態がLISTENのコネクション情報を作成し、コネクション確立要求を待ち受けているときに、自装置はコネクションを作成する。そして、自装置は、コネクション状態がSYN_SENTにし、SYNセグメントを送信する。そして、自装置は、SYN/ACKを受信して、コネクション状態をESTABLISHED状態に遷移させ、ACKセグメントを送信し、両方のコネクションが確立する。
(アクティブオープンの処理の詳細)
次に、本実施形態におけるアクティブオープンの処理の流れの詳細について説明する。アクティブオープンの場合、まず第2のプロトコル処理部21の第2のヘッダ生成部214は、コネクション確立を行うためのSYNセグメントの生成を行う。第2のヘッダ生成部214は、SYNセグメントを生成したら生成したセグメントのアドレスと長さをフレームの読み出し元アドレスとフレームの長さとして送信フレームデスクリプタリングのデスクリプタに書き込む。
このとき、フレームの付随情報として、後でコネクション情報を確保したときに初期設定される値としてSYNセグメントに含まれない情報である受信データの書き込み先アドレスと長さ、送信データの読み出し元アドレスと長さを含ませておく。ここで、書き込み先アドレスは、例えば、書き込み先の先頭アドレスで、読み出し元アドレスは、例えば、読み出し元の先頭アドレスである。
更に、第2のヘッダ生成部214は、第2のコネクション情報探索部212に指示し、ハッシュテーブルのリストにコネクション情報を接続するため、確保されるコネクション情報を挿入する位置の前後のコネクション情報のアドレスや値(コネクション情報接続情報)を取得してデスクリプタに書き込む。例えば、確保されるコネクション情報を挿入する位置の次のコネクション情報の先頭アドレスと、確保されるコネクション情報を挿入する位置の次のコネクション情報の「前のコネクション情報へのポインタ(PREV)」のアドレスと、確保されるコネクション情報を挿入する位置の前のコネクション情報の「次のコネクション情報へのポインタ(NEXT)」のアドレスを書き込む。
このとき、確保されるコネクション情報がリストの最後尾に位置するならば、確保されるコネクション情報を挿入する位置の次のコネクション情報の先頭アドレスとしてNULLなどの存在しないことを示す特別な値を書き込む。また、確保されるコネクション情報がリストの先頭に位置するならば、確保されるコネクション情報を書き込む位置の前のコネクション情報の「次のコネクション情報へのポインタ(NEXT)」のアドレスとしてルート配列の対応する要素のアドレスを書き込む。このとき、第2のヘッダ生成部214は、フレームの付随情報として明示的にこのフレームがコネクション確立要求であることを記して、第1のヘッダ生成部116はその情報からコネクション確立要求であると判定してもよい。
第2のヘッダ生成部214は、この送信フレームデスクリプタの送信を第1のプロトコル処理部11の第1のヘッダ生成部116に指示する。第1のヘッダ生成部116は、その指示を受けると、フレームの読み出しを行い、TCPのSYNセグメントであることをヘッダの解析により検出し、コネクション確立要求であると判定する。この判定が行われると、第1のヘッダ生成部116は、コネクション情報を確保し、確保されたコネクション情報に対してSYNセグメントに含まれる情報から自装置のIPアドレス、相手装置のIPアドレス、自装置のTCPポート番号、相手装置のTCPポート番号、送信シーケンス番号、自身のウィンドウサイズ等の情報を書き込む。このとき、コネクション状態もSYNセグメントを送信しているので、第1のヘッダ生成部116はコネクション状態をSYN_SENTに設定する。なお、第1のプロトコル処理部11は、SYNセグメントに含まれる終点MACアドレスやTTL値、TOS値等の情報を書き込んでもよい。また、第1のヘッダ生成部116は、デスクリプタの付随情報から受信データの書き込み先アドレスと長さ、及び送信データの読み出し元アドレスと長さを取得し、取得したものをコネクション情報に書き込む。
更に、第1のプロトコル処理部11は、コネクション情報の初期化が完了すると、デスクリプタから取得したコネクション情報接続情報を用いてハッシュテーブルのリストの接続処理を行う。まず、第1のプロトコル処理部11は、その確保したコネクション情報の「次のコネクション情報へのポインタ」にコネクション情報を挿入する位置の次のコネクション情報の先頭アドレスを書き込む。次に、第1のプロトコル処理部11は、確保されるコネクション情報を挿入する位置の次のコネクション情報がないことを示すNULL等の値でなければ、確保されるコネクション情報を挿入する位置の次のコネクション情報の「前のコネクション情報へのポインタ(PREV)」に確保したコネクション情報の先頭アドレスを書き込む。次に、第1のプロトコル処理部11は、確保されるコネクション情報を挿入する位置の前のコネクション情報の「次のコネクション情報へのポインタ(NEXT)」に確保したコネクション情報の先頭アドレスを書き込む。
このコネクション情報の確保と初期化、ハッシュテーブルへの接続が完了すると、第1のヘッダ生成部116により、SYNセグメントを、ネットワーク200を介して相手装置に送信する。なお、このハッシュテーブルへの接続を容易にするため、第2のプロトコル処理部21は、あらかじめSYNセグメントのハッシュ値を計算し、ハッシュテーブルの終端のエントリのアドレスを計算してもよい。
第1のヘッダ解析部111は、相手装置から応答であるSYN/ACKセグメントを受信すると、受信したSYN/ACKセグメントの各層のプロトコル処理を行う。その後、第1のコネクション情報探索部112は、コネクション情報の探索を行い、先ほど確保と初期化を行ったコネクション状態がSYN_SENTのコネクション情報が見つかる。これに対して、第1のコネクション情報探索部112は、シーケンス番号や確認応答番号などのチェックを行う。コネクション確立の条件を満たせば、第1の状態遷移処理部113は、コネクション状態をSYN_SENTからESTABLISHEDに遷移させる。そして、第1のヘッダ生成部116は、ACKセグメントを相手装置に送信する。そして、第1の状態遷移処理部113は、イベントの付随情報にコネクション情報の先頭アドレスを含ませ、ESTABLISHEDイベント通知を第2のプロトコル処理部21の第2の状態遷移処理部213に発行する。
第2の状態遷移処理部213は、このイベント通知を受け、ESTABLISHED状態のイベント通知を待つアプリケーション等があればそれに通知を行う。そして、相手装置で確認応答のセグメントが処理され両方でコネクションが確立し、データの送受信が行えるようになる。
このように、第1の状態遷移処理部113は、受信フレームがコネクション確立要求である場合、コネクション情報記憶部12からコネクション情報の識別子を確保する。第2のプロトコル処理部21は、第1の状態遷移処理部113が確保した識別子が示すコネクション情報を用いて、コネクション状態をコネクション確立要求受信状態(SYN_RECEIVED)に遷移させる。
上述したように、アクティブオープン側の場合、第1のヘッダ生成部(送信処理部)116は、外部のCPU2からの要求を受けて、所定のプロトコルの接続確立要求を、ネットワーク200を介して相手装置に送信する。
第1のコネクション情報探索部112は、第1のヘッダ解析部(解析部)111の解析の結果として、接続確立要求に対する相手装置からの接続受諾応答を検出した場合、第1のヘッダ解析部(解析部)111が解析した結果に基づいて、コネクション情報が保存されているコネクション情報記憶部12から接続受諾応答に対応するコネクション情報を探索する。第1の状態遷移処理部113は、第1のヘッダ解析部(解析部)111の解析の結果として、前記接続確立要求に対する前記相手装置からの接続受諾応答を検出した場合、コネクション情報に含まれるコネクション状態を、応答を待っている待機状態(SYN_SENT)から、接続確立状態(ESTABLISHED)に遷移させる。具体的には、第1の状態遷移処理部113は、第1のコネクション情報探索部112が探索して得られたコネクション情報に含まれるコネクション状態を、応答を待っている待機状態(SYN_SENT)から、接続確立状態(ESTABLISHED)に遷移させる。
(同時オープンの処理の流れ)
次に図9を用いて同時オープンについて説明する。図9は、本実施形態の同時オープンの処理の流れを示すシーケンス図である。同時オープンは自装置と相手装置が同時にコネクション確立要求を送信したときに発生する。
(T31、T41)まず自装置でコネクションを作成してSYN_SENTに遷移させる。
(T32、T42)そして、自装置はSYNセグメントを送信する。
(T33、T43)SYNセグメント送信後に、自装置は、相手装置からもSYNセグメントを受信する。
(T34、T44)相手装置からもSYNセグメントを受信すると、コネクション状態をSYN_SENTからSYN_RECEIVEDに遷移させる。
(T35、T45)そして、SYN/ACKを送信する。
(T36、T46)相手からも同様にSYN/ACKが送信されるので、自装置はこれを受信する。
(T37、T47)自装置はSYN/ACKを受信すると、コネクション状態をESTABLISHEDに遷移させ、コネクションが確立する。
(同時オープンの処理の詳細)
次に本実施形態における同時オープンの処理の流れの詳細について説明する。同時オープンの場合は、途中までアクティブオープンと同じシーケンスである。第2のプロトコル処理部21の第2のヘッダ生成部214でSYNセグメントが生成され送信されるのはアクティブオープンと同じ手順で行われる。次にその応答としてSYNセグメントが受信されるところから処理が異なる。第1のヘッダ解析部111は、受信フレームからSYNセグメントを検出した場合、各層のプロトコル処理を行い、コネクション確立要求と判定する。第1のヘッダ解析部111は、第1のコネクション情報探索部112へのコネクション情報確保の要求を行い、コネクション情報の初期化を行う。その後、第1の状態遷移処理部113は、コネクション情報と合わせて受信したSYNセグメントを第2のプロトコル処理部21の第2の状態遷移処理部213に渡す。
第2のプロトコル処理部21の第2のコネクション情報探索部212は、コネクション情報を探索し、同時オープンであることを検知する。そして、コネクション状態がSYN_SENTのコネクション情報とコネクション状態がSYN_RECEIVEDのコネクション情報の2つができてしまっているので、第2のコネクション情報探索部212は、コネクション状態がSYN_SENTのコネクション情報を削除するように第1のプロトコル処理部11の第1の状態遷移処理部113に解放要求を行う。そして、第1の状態遷移処理部113は、コネクション状態がSYN_SENTのコネクションを解放する。なお、このとき、第1の状態遷移処理部113は、コネクション状態がSYN_SENTのコネクションを解放するのではなく、コネクション状態がSYN_RECEIVEDのコネクション情報を解放して、コネクション状態がSYN_SENTのコネクション情報をSYN_RECEIVEDにしてもよい。
第2のプロトコル処理部21の第2のヘッダ生成部214は、コネクション状態がSYN_RECEIVEDのコネクションについて、SYN/ACKセグメントを生成して、第1のプロトコル処理部11の第1のヘッダ生成部116に送信を指示する。同様にして相手からSYN/ACKセグメントが送信されてくるので、第1のプロトコル処理部11の第1のヘッダ解析部111は、各層のプロトコル処理を行った後、第1のコネクション情報探索部112は、コネクション情報を探索する。このコネクション探索の結果、第1のコネクション情報探索部112は、コネクション状態がSYN_RECEIVEDのコネクション情報を見つける。第1の状態遷移処理部113は、コネクション確立判定の結果、コネクション状態をESTABLISHEDに設定する。これにより、以後データの送受信を行うことが可能となる。この後、第1の状態遷移処理部113は、第2のプロトコル処理部21の第2の状態遷移処理部213に対してESTABLISHEDイベント通知を行う。
このように、同時オープンの場合、第1のヘッダ生成部(送信処理部)116は、外部のCPU2からの要求を受けて、所定のプロトコルの接続確立要求を、ネットワーク200を介して相手装置に送信する。そして、第1のヘッダ解析部(解析部)111は、前記接続確立要求の送信後に受信した第1の受信フレームを解析する。
第1のヘッダ生成部(送信処理部)116は、第1のヘッダ解析部(解析部)111による第1の受信フレームの解析の結果として、相手装置からの所定のプロトコルの接続確立要求を検出した場合、接続確立要求を受諾する接続受諾応答(SYN/ACKセグメント)を、ネットワーク200を介して相手装置に送信する。
第1のヘッダ解析部(解析部)111は、接続受諾応答の送信後に受信した第2の受信フレームを解析する。そして、第1のコネクション情報探索部112は、第1のヘッダ解析部(解析部)111による第2の受信フレームの解析の結果として、接続確立要求に対する相手装置からの接続受諾応答(SYN/ACKセグメント)を検出した場合、第1のヘッダ解析部(解析部)111が解析した結果に基づいて、コネクション情報が保存されているコネクション情報記憶部12から接続受諾応答(SYN/ACKセグメント)に対応するコネクション情報を探索する。
第1の状態遷移処理部113は、第1のヘッダ解析部(解析部)111による第2の受信フレームの解析の結果として、接続確立要求に対する相手装置からの接続受諾応答(SYN/ACKセグメント)を検出した場合、コネクション情報に含まれるコネクション状態を、応答を待っている待機状態(SYN_RECEIVED)から、接続確立状態(ESTABLISED)に遷移させる。具体的には、第1の状態遷移処理部113は、第1のコネクション情報探索部112が探索して得られたコネクション情報に含まれるコネクション状態を、応答を待っている待機状態(SYN_RECEIVED)から、接続確立状態(ESTABLISED)に遷移させる。
なお、上記ではコネクション確立について、正常なシーケンスのみを示したが、例えばコネクション状態がSYN_SENTやSYN_RECEIVEDのときにRSTセグメントやFINセグメントが到着した場合、第1のプロトコル処理部11の第1のヘッダ解析部111は、制御フレームと判定する。そして、第1のプロトコル処理部11の第1のヘッダ解析部111は、このフレーム情報を第2のプロトコル処理部21の第2のヘッダ解析部211に伝達する。その後、第2のプロトコル処理部21によりヘッダ解析やコネクション探索、コネクション情報の更新、コネクション状態遷移処理が行われる。
一方、コネクション切断は、TCPのコントロールフラグのFINフラグに1を設定したFINセグメントによる切断と、TCPのコントロールフラグのRSTフラグに1を設定したRSTセグメントによる切断がある。FINセグメントを送信することによる切断として、自身からFINセグメントを送信するアクティブクローズと、相手からFINセグメントを受信するパッシブクローズ、FINセグメントの送信が同時となる同時クローズがある。
続いて、図10を用いてアクティブクローズとパッシブクローズの流れについて説明する。図10は、アクティブクローズとパッシブクローズの流れを示すシーケンス図である。
まず、アクティブクローズの場合について説明する。
(T51)アプリケーションなどからコネクションの切断が指示されると、第2のプロトコル処理部21はコネクション情報の更新を行い、コネクション状態をESTABLISHEDからFIN_WAIT1に遷移させる。
(T52)第2のプロトコル処理部21はFINセグメントを生成し、第1のプロトコル処理部11に制御フレームとして送信を指示する。このFINセグメントを受信した相手装置はFINセグメントに対する確認応答のセグメントであるFIN/ACKセグメントを送信する(T63)。
(T53)第1のプロトコル処理部11は、このFIN/ACKセグメントを受信する。
(T54)第1のプロトコル処理部11は、ヘッダ解析を行い、その後、コネクション探索を行う。コネクション状態がFIN_WAIT1であることが分かると、第1のプロトコル処理部11は、コネクション情報のSND.UNA等の更新を行い、フレームの受信処理が完了する。そして、第1のプロトコル処理部11は、CHANGEDイベント通知により、第2のプロトコル処理部21にコネクション情報を伝達する。第2の状態遷移処理部213は、コネクション状態がFIN_WAIT1であることを確認すると、コネクション情報からSND.UNAとSND.NXTの値を取得し、一致すればコネクション状態をFIN_WAIT1からFIN_WAIT2に遷移させる。相手装置は、データ送信が完了すると、FINセグメントを送信する(T65)。
(T55)第1のプロトコル処理部11は、このFINセグメントを受信する。
(T56)第1のプロトコル処理部11の第1のヘッダ解析部111はヘッダ解析結果により、TCPのコントロールフラグのFINフラグが1であるため、受信フレームを制御フレームとして第2のプロトコル処理部21へ伝達する。そして、第2のプロトコル処理部21において、第2のヘッダ解析部211はヘッダ解析処理を行う。その後、第2のコネクション情報探索部212は、第2のヘッダ解析部211による解析の結果に基づいて、コネクション情報の探索を行う。コネクション状態がFIN_WAIT2であると分かると、第2の状態遷移処理部213は、コネクション状態をFIN_WAIT2からTIME_WAITに遷移させる。
(T57)次に、第2のヘッダ生成部214は、FIN/ACKセグメントを生成し、第1のプロトコル処理部11にFIN/ACKセグメントの送信を指示する。
(T58)TIME_WAITに遷移したコネクション状態はCPU2でタイマ処理が行われ、一定時間後にCLOSEDに遷移する。このようにアクティブクローズは実現される。
続いて、図10を用いて、パッシブクローズについて説明する。
(T61)第1のプロトコル処理部11は、コネクション状態がESTABLISHEDのときに相手装置から送信されたFINセグメントを受信する。
(T62)第1のプロトコル処理部11の第1のヘッダ解析部111は、ヘッダ解析の結果、FINフラグが1のため、制御フレームとして第2のプロトコル処理部21に受信フレームを伝達する。第2のプロトコル処理部21の第2のヘッダ解析部211は、ヘッダ解析を行い、第2のコネクション情報探索部212は、コネクション情報を探索する。探索の結果、コネクション状態がESTALISHEDのコネクション情報が得られた場合、第2の状態遷移処理部213は、コネクション情報を更新した後、コネクション状態をESTALISHEDからCLOSE_WAITに遷移させる。
(T63)第2のヘッダ生成部214は、FIN/ACKセグメントを生成し、第1のプロトコル処理部11に、FIN/ACKセグメントに対応する制御フレームの送信を指示する。
(T64)自装置からのデータを送信しきるとアプリケーションなどから第2のプロトコル処理部21にコネクション切断の要求がある。これを受けた第2のプロトコル処理部21の第2の状態遷移処理部213は、コネクション情報を更新した後、コネクション状態をCLOSE_WAITからLAST_ACKに遷移させる。
(T65)第2のヘッダ生成部214は、FINセグメントを生成して、第1のプロトコル処理部11に、FINセグメントに対応するフレームの送信を指示する。相手装置はこのFINセグメントを受けるとそれに対応するFIN/ACKセグメントを送信する。
(T66)次に、第1のプロトコル処理部11は、相手装置が送信したFIN/ACKセグメントを受信する。そして、第1のプロトコル処理部11は、ヘッダ解析の後、コネクション情報を探索し、コネクション状態がLAST_ACKであると検知し、コネクション情報の更新を行い、フレームの受信処理を完了する。そして、第1のプロトコル処理部11は、第2のプロトコル処理部21にコネクション情報とともにCHANGEDイベント通知を行う。
(T67)第2のプロトコル処理部21の第2の状態遷移処理部213は、SND.UNAとSND.NXTの値により、LAST_ACKからCLOSEDにコネクション状態の遷移を行う。これによりパッシブクローズが実現される。
このように、接続確立後、第1のヘッダ解析部(解析部)は、受信フレームを制御フレームとデータフレームに分別し、制御フレームを、この制御フレームについて所定のプロトコルの処理を行うCPU2へ出力する。具体的には、第1のヘッダ解析部(解析部)111は、受信フレームを解析した結果、受信フレームがコネクション切断要求である場合、コネクション切断要求の受信フレームを制御フレームに分別し、この制御フレームをCPU2の第2のプロトコル処理部21へ出力する。そして、第2のプロトコル処理部21は、第1のプロトコル処理部11から出力された制御フレームに基づいて、コネクション状態の遷移を実行する。ここで、コネクション切断要求は、TCPのFINフラグのビットが1であるFINセグメント、またはTCPのRSTフラグのビットが1であるRSTセグメントである。
続いて、図11を用いて同時クローズについて説明する。図11は、本実施形態の同時クローズの処理の流れを示すシーケンス図である。
同時クローズはアクティブクローズと同様に自身からFINセグメントを送信するが、次に受信するのがFINセグメントであることがアクティブクローズの流れと異なる。
(T71、T81)アプリケーションなどからコネクションの切断が指示されると、第2のプロトコル処理部21はコネクション情報の更新を行い、コネクション状態をESTABLISHEDからFIN_WAIT1に遷移させる。
(T72、T82)第2のプロトコル処理部21はFINセグメントを生成し、第1のプロトコル処理部11に制御フレームとして送信を指示する。
(T73、T83)第1のプロトコル処理部11は、FINセグメントを受信すると、ヘッダ解析を行い、受信フレームを制御フレームとして第2のプロトコル処理部21へ伝達する。これにより、第2のプロトコル処理部21でその後の処理が行われる。
(T74、T84)第2のプロトコル処理部21の第2のヘッダ解析部211はヘッダ解析処理を行う。その後、第2のコネクション情報探索部212は、コネクション探索を行う。コネクション状態がFIN_WAIT1であると分かると、第2の状態遷移処理部213は、コネクション状態をFIN_WAIT1からCLOSINGに遷移させる。
(T75、T85)第2のヘッダ解析部211は、FIN/ACKセグメントを生成し、第1のプロトコル処理部11にFIN/ACKセグメントに対応する制御フレームの送信を指示する。その後、同様にして相手装置からもFIN/ACKセグメントが送信される。
(T76、T86)第1のプロトコル処理部11は、このFIN/ACKセグメントを受信する。
(T77、T87)第1のプロトコル処理部11は、ヘッダ解析の後、コネクション探索を行う。第1のプロトコル処理部11は、コネクション状態がCLOSINGであると分かると、コネクション状態の更新を行い、受信処理を完了する。そして、第1のプロトコル処理部11は、第2のプロトコル処理部21にコネクション情報とともにCHANGEDイベント通知を行う。これを受けた第2のプロトコル処理部21は、コネクション状態がCLOSINGであることを検知し、SND.UNAとSND.NXTの値を用いてCLOSEDに遷移させる。
(T78、T88)TIME_WAITに遷移したコネクション状態はCPU2でタイマ処理が行われ、一定時間後にCLOSEDに遷移する。これにより同時クローズが実現される。
続いて、図12を用いて、RSTセグメントによるコネクションの切断について説明する。図12は、本実施形態のコネクションの切断処理の流れを示すシーケンス図である。
(T91)第2のプロトコル処理部21は、コネクション状態をESTABLISHED状態からCLOSEDに遷移させる。
(T92)次に、第1のヘッダ生成部116は、RSTセグメントを相手装置へ送信する。
(T93)相手装置の第1のプロトコル処理部11は、RSTセグメントを受信する。
(T94)次に、相手装置の第1のプロトコル処理部11は、これを制御フレームとして、第2のプロトコル処理部21に伝達する。第2のプロトコル処理部21は、ヘッダ解析、コネクション探索を行う。RSTセグメントが受け入れ可能なものであれば、第2の状態遷移処理部213は、コネクション状態をESTABLISHEDからCLOSEDに遷移させる。これにより、コネクションの切断が実現される。
このように、第1のプロトコル処理部11は、FINセグメントとRSTセグメントを第2のプロトコル処理部21に制御フレームとして伝達する。更に、コネクション状態がFIN_WAIT1、CLOSING、LAST_ACKの場合に、第1のプロトコル処理部11は、CHANGEDイベント通知を第2のプロトコル処理部21に行う。これにより、コネクション切断に関する状態遷移を第2のプロトコル処理部21で実行することができる。
なお、上記では第1のプロトコル処理部11から第2のプロトコル処理部21にイベント通知を行う例を示したが、特に第2のプロトコル処理部21で状態遷移の検知が必要ない場合は省略することが可能である。また、第2のプロトコル処理部21は、ポーリングなどにより能動的にイベントを検知してもよい。
このように、本実施形態によれば、本実施形態に係る第1のプロトコル処理部11は、コネクション確立時に受信フレームとコネクション情報を用いて、コネクション確立判定とコネクション情報の状態遷移を行う。CPU2ではなく、FPGAなどで実装される第1のプロトコル処理部11がコネクション確立の状態遷移を行うことにより、多数のコネクション確立がされる情報処理装置100において、情報処理装置100のCPU2の負荷を低減させることができる。
また、第1のプロトコル処理部11をハードウェアで実装することにより、第1のプロトコル処理部11は、高速にコネクション確立判定を行うことができる。これにより、コネクション確立に要する時間を短縮することができる。
また、第1のプロトコル処理部11は、コネクション確立に係るフレームをCPU2へ伝達する必要がないため、CPU2と第1のプロトコル処理部11との間のバス帯域の使用率を低減させることができる。また、複雑なTCPのコネクション遷移を全て第1のプロトコル処理部11側に実装すると回路規模の増大により消費電力の増大や、実装面積の増大を招くが、このようにコネクション確立に係る状態遷移のみを第1のプロトコル処理部11側で行い、その他の状態遷移を情報処理装置100のCPU2で行う。これにより、第1のプロトコル処理部11の回路規模の増大を抑えながら、高速なコネクション確立を実現することができる。
(変形例)
なお、上述の実施形態では、ハッシュテーブルを用いてコネクション情報の探索を行う例を示したが、コネクション情報そのものに使用または未使用を表すビットを設けて全コネクション情報をこのビットをチェックしながら探索してもよいし、あらかじめ使用または未使用を管理するビットマップ領域を使って探索を行ってもよい。
また、上述の実施形態ではTCPを例にしたが、SCTP(Stream Control Transmission Protocol)など他のコネクション確立後にデータ通信を行うプロトコルにも使用できる。第1のプロトコル処理部11は、ASICなどのハードウェアによって実現してもよいし、ネットワークプロセッサや、DSP(Digital Signal Processor)、GPU(Graphics Processing Unit)、他の汎用プロセッサなどによって実現してもよい。
また、第1の状態遷移処理部113と第2の状態遷移処理部213は片方のコネクション状態遷移処理部が持つ機能についてもう片方の状態処理遷移部が機能をもたないようにし、相補的に機能を実現してもよい。
また、上記の例では、FIN_WAIT1、CLOSING、LAST_ACKへの状態遷移の判定を第2のプロトコル処理部21で行う例を示したが、これらの処理は第1のプロトコル処理部11で行ってもよい。この場合、FINセグメントとRSTセグメントによる状態遷移処理のみを第2の状態遷移処理部213で行い、それ以外のコネクション状態遷移処理を第1のプロトコル処理部11で行う。
また、上述の実施形態ではコネクション情報記憶部12を通信部1に備える例を示したが、コネクション情報記憶部12はメモリ3上に備えてもよい。この場合、バス帯域使用率の低減効果はないが、CPU負荷を軽減することができる。
なお、この通信部1は、例えば、コンピュータ装置(例えば、PCI Expressカード)に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、通信部1は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、CD−ROMなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。また、通信部1は、上記のコンピュータ装置に内蔵あるいは外付けされたメモリ、ハードディスクもしくはCD−R、CD−RW、DVD−RAM、DVD−Rなどの記憶媒体などを適宜利用して実現することができる。
以上、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。