|
(1) Preccsの全体構成
図 1にPreccsを用いた通信プロトコルの実装の流れを示す.
図
1 Preccsを用いた実装の流れ
プログラマーはRFC(Requst for Comment)など自然言語で記述された通信プロトコル仕様にもとづいて,メッセージ形式や送受信手順をPreccsのソースとして記述する.PreccsコンパイラはPreccsソースから,パタンマッチに用いる状態遷移表やプロセス動作を実現するための処理をC
のコードとして出力する.ここで出力されたコードはPreccs実行時ライブラリと協調しながら,プロトコルの中核的な処理をインタプリティブに実行するものである.Preccs実行時ライブラリは,パタンマッチやチャネル通信,プロセス管理などを実現するためのルーチンから構成される.
(2) 仕様記述言語Preccs
(2-1) メッセージ形式の記述例
Preccsでは正規表現を用いることが可能である.例えば,通信プロトコルによく見られるメッセージ形式の例を図 2に示す.
図
2 メッセージ形式の例
ここに示したメッセージは1オクテットと4オクテットの二つの固定長フィールドの後に0個以上のオプションが続き,最後は0xFFで終わるという形式である.また,オプションも構造を持ち,オプション種別を表すフィールドtagとオプションのデータ長を表すフィールドlen,さらにオプションデータのフィールドdataからなる.これをPreccsで記述すると図
3のようになる.
図
3 Preccsによるメッセージ形式の定義例
ここで,Message
::= ・・・;の部分でメッセージ形式Messageを定義している.Messageの各フィールドにはラベル名を付与することができる.例えば,type,
idはラベル名であり,それぞれ,octet, octet[4]というフィールドが対応している.フィールドの間を区切るコンマ「,」は,正規表現の連接に相当し,各フィールドが連続していることを意味している.optsラベルで指定されるフィールドOption*はメッセージ形式Optionが0個以上連続することを意味しており,アスタリスク「*」は正規表現における閉包である.Preccsではこのほかにも選択「|」,1回以上の繰り返し「+」,0回か1回のパタン「?」といった正規表現の記法を使用することができる.
(2-2) 送受信手順の記述
ここでは,一般的なコネクション確立の手法である3ウェイハンドシェイクを例にとって説明する.図 4は,3ウェイハンドシェイクにおけるコネクションのサーバー側の状態遷移を示したものである.これをPreccsで記述したものが図
5である.
図 5のInit() ::= ・・・;ではInitプロセスを定義している.Initプロセスではsockinチャネルからメッセージを受信し,rpkt変数に代入する.rpkt変数の内容について,次にメッセージ形式によるパタンマッチを行い,Synパケットとマッチした場合にはSynAckパケットを生成し(それをspkt変数に代入したのちに)sockoutチャネルに出力する.sockoutチャネルに出力されるとパケットの内容がネットワークに送信される.
図
4 3ウェイハンドシェイクにおけるサーバーの状態遷移

図 5 3ウェイハンドシェイクにおけるサーバ側の動作記述例
図 5にあるSynやSynAckなどのパタンは,先に説明したPreccsのメッセージ形式の記述方法に従って定義されているものとする.また,timerチャネルはタイムアウトのための特別なチャネルで,引数で指定した秒数だけ待つという意味である.Waitプロセスでは,ソケットから入力があるとパタンマッチを試み,10秒間入力がなければ,タイムアウトして初期状態(Init)に戻るという選択的な動作を行う.
(2-3) Preccsコンパイラ
Preccsコンパイラは,仕様記述言語Preccsで記述されたソースコードからC言語のコードを自動的に生成する.Preccsのメッセージ形式の記述部分から,メッセージ解析用のNFAが参照するための状態遷移表とメッセージ組み立てに使用するデータ定義が生成される.また,送受信手順の記述部分からは,プロセスのディスパッチコードが生成される.ディスパッチコードは一つの巨大なswitch〜case文として実現され,各case文単位でプロセスの切り替えが行われる.
(3) 性能評価
実際の通信プロトコルの適用例として,Preccsを用いてDHCPクライアントの実装を行った.また,比較対象としてC言語で同等の機能を有するDHDPクライアントをスクラッチから実装した.
(3-1) 記述量の評価
図6に,DHCPクライアントの記述量の比較結果を示す.グラフの縦軸は記述に要した行数である.
図
6 DHCPクライアントの記述量の比較
これを見ると,Preccsによる記述はCに比較して,約3分の1に短くなっている.特に送受信処理とメッセージ組み立て,解析処理の記述量が大幅に削減されている.このことから,Preccsにおけるメッセージ形式と送受信手順の記述方式は非常に有効であることがわかる.
(3-2) オーバーヘッドの評価
Preccsによる実行時のオーバーヘッドを見るために,DHCPクライアントの実行時間の比較を行った.ここでは,プログラムの起動からIPアドレスを取得,設定するまでの時間を計測した.評価のために,同一のLANセグメント内に接続されたクライアントとサーバーの計2台のマシンを用意した.ここで使用した各マシンの諸元を表1に示す.
表1 評価に用いた各マシン

図7にDHCPクライアントの実行時間の比較結果を示す.実行時間はtimeコマンドを用いて測定し,10回の平均値を算出した.グラフの縦軸の単位はミリ秒である.
図7 DHCPクライアントの実行時間比較
結果を見ると,DHCPクライアントにおいては,Preccsによる実行時間のオーバーヘッドは高々25%程度に過ぎないことがわかる.DHCPのようにシビアな処理性能を求めないプロトコルに関しては,このオーバーヘッドは十分に許容範囲内に収まっている.また,待ち時間(Idle)を除く,CPU使用時間(Sys+User)のオーバーヘッドでも2倍程度に抑えられている.
|