ns-3上へのCSMA/CAの実装について †MACヘッダやプリアンブルを新たに定義した新しいMAC層を検証する目的で、csmacaモジュールを実装しました。 csmacaモジュールは、ns-3のwifiモジュールの必要最小限のソースコードを切り出した容易に拡張可能なモジュールです。 ns-3のwifiモジュールはIEEE 802.11の仕様に基づいて作成されているため、MACヘッダ・プリアンブルを変更するには、多くの部分を書き直す必要があります。 csmaca以下の5つの特徴を持ちます.
csmacaの使用方法 †csmacaはns-3.20のみ動作が保証されています。ここではホームディレクトリにns-3.20がインストールされていると仮定してcsmacaの使用方法を記載します。ns-3.20のインストールは、↓を参考にして下さい。 プログラムのダウンロード †まず、git(ns3-csmaca)からソースコードをダウンロードします。https://github.com/yusuke-sugiyama/ns-3-csmacaを開くと↓のページが表示されます。 右下のDownload ZIPをクリックすると「ns-3-csmaca-master.zip」がダウンロードできます。 プログラムの配置方法 †ダウンロードした「ns-3-csmaca-master.zip」をhomeディレクトリに置いたと仮定して話を進めます。まず、以下のコマンドを利用してzipを解凍します。 unzip ns-3-csmaca-master.zip すると、「ns-3-csmaca-master」ディレクトリが生成されるのでcdコマンドでそのディレクトリに移動します。 cd ns-3-csmaca-master 次に、「ns-3-csmaca-master/src」の中身をns-3.20の「src」に、「ns-3-csmaca-master/scratch」の中身ををns-3.20の「scratch」に追加します。 ns-3.20の「scratch」に「csmaca」フォルダが追加されます。 ns-3.20の「src」に「csmaca」フォルダが追加されます。 cp -r src/* ../ns-allinone-3.20/ns-3.20/src/ cp -r scratch/* ../ns-allinone-3.20/ns-3.20/scratch/ 最後にns-3.20のディレクトリに移動して、「waf」を用いてビルドします。 cd ~/ns-allinone-3.20/ns-3.20/ ./waf configure ./waf これで、プログラムの配置は完了です。 csmacaのチュートリアル †csmacaモジュールの ダウンロードからプログラムの配置 を行っていない場合はそちらを先にして下さい。チュートリアルでは、csmacaモジュールが使用可能であること、ホームディレクトリにns-3.20がインストールされていることとして話を進めていきます。 ns-3.20のインストールは、↓を参考にして下さい。 プログラムの実行方法 †まず、ns-3.20の「scratch/csmaca」ディレクトリに移動します。 cd ~/ns-allinone-3.20/ns-3.20/scratch/csmaca/ ↓の図にシミュレーションの環境を示します。ノード間距離を x [m]として、IPアドレスが192.168.0.1のノードからIPアドレスが192.168.0.2のノードへ1500 [Bytes]のパケットを送信し続けます。 以下のコマンドを実行することでノード間距離を100 [m]、物理層の伝送レート 1 [Mbps]に設定してシミュレーションを実行することが可能です。実行結果として単位時間あたりに伝送されたデータ量 [Mbps]が表示されます。 ./waf --run "csmaca --distance=100 --rate=1000000" ↓の図に物理層の伝送レートを変更した場合の実行結果を示します。 引数として --streamを指定するとランダム値を生成するシードを変更することが可能です。 ただし、変更されるのはランダムバックオフのランダム値のみです。 ./waf --run "csmaca --distance=100 --rate=1000000 --stream=100" ランダム値を生成するシードを全て変更する場合は、環境変数「NS_GLOBAL_VALUE」に値を設定します。 export NS_GLOBAL_VALUE="RngRun=0" 上記の"0"の値を変更することでランダム値を生成するシードを全て変更することが可能です。 ↓の図に環境変数NS_GLOBAL_VALUEの値を変更した場合の実行結果を示します。 csmacaモジュールの詳細 †クラス図全体像 †↓の図にクラス図を示します。 csmacaモジュールは黄色で示した13個のクラスから構成されています。クラスは大きく分けてMac層の実装・Phy層の実装・その他の実装に分けることができます。 MAC層の実装 †MAC層はCsmacaMac・CsmacaMacQueue・CsmacaMacHeader・CsmacaMacTrailerの3つのクラスで実装しています。それぞれのクラスの役割を説明していきます。 CsmacaMac †CsmacaMacはバックオフやNAV (Network Allocatoin Vector) などの時間の制御やDATA/ACK/RTS/CTS などのフレームの送受信をする役割を持ちます。 CsmacaMacQueue †CsmacaMacQueueはMAC層のキューの役割を持ちます。最大で400パケット格納することが可能です。キューにパケットが入りきらなかった場合、入りきらなかったパケットは破棄されます。 CsmacaMacHeader・CsmacaMacTrailer †CsmacaMacHeader・CsmacaMacTrailerはMAC層のヘッダを構成する役割を持ちます。 ↓の図にDATA・RTSのフレームフォーマットを示します。 ※ TypeはDATAの場合00・RTSの場合10が代入されます。 ↓の図にACK・CTSのフレームフォーマットを示します。 ※ TypeはACKの場合01・CTSの場合11が代入されます。 ※ FCSのみCsmacaMacTrailerで扱い、その他はCsmacaMacHeaderで扱います。 PHY層の実装 †PHY層はCsmacaPhy・CsmacaChannel・CsmacaPhyListener・CsmacaPhyState・CsmacaPhyStateHelper・CsmacaPreambleの6つのクラスで実装しています。それぞれのクラスの役割を説明していきます。 CsmacaPhy †CsmacaPhyは信号の送信と受信の開始や終了を制御する役割を持ちます。 CsmacaChannel †CsmacaChannlは全てのノードとの信号をやりとりして送信遅延や伝搬損失を 算出する機能を提供する役割を持ちます。送信遅延の算出にはConstantSpeedPropagationDelayModelを利用しています。伝搬損失の算出にはLogDistancePassLossModelを利用しています。 CsmacaPhyListener †CsmacaPhyListenerはPHY層で送受信したことをMAC層へ通知する役割を持ちます。具体的には、送信の開始・受信の開始・受信の成功・受信の失敗・キャリアセンス開始を通知します。 CsmacaPhyState †CsmacaPhyStateは物理インタフェースのIdle、Busy (Clear Channel Assessment)、TX (Transmission)、RX (Reception) の4 つの状態を持つクラスです。 CsmacaPhyStateHelper †CsmacaPhyStateHelperはCsmacaPhyStateで管理している状態の状態遷移を管理する役割を持ちます。 CsmacaPreamble †CsmacaPreambleはプリアンブルとPHY層のヘッダを構成する役割を持ちます。 ↓の図にプリアンブルとPHY層のヘッダのフレームフォーマットを示します。 Rateは物理層の伝送レートを格納します。現在の実装ですと符号なしの32 bitで値を保存しているため0~8,589,934,591までの伝送レートを指定できます。 SymbolsにはMACヘッダとペイロードの長さが格納されます。 Tailには0が格納されます。 その他の実装 †CsmacaNetDevice †CsmacaNetDeviceはL3のモジュールとcsmacaモジュールを接続するためのインタフェースの役割を担います。 CsmacaInterferenceHelper †CsmacaInterferenceHelperは、受信信号からSNR (Sginal to Noise Ratio) やPER (Packet Error Rate)を算出する役割を持ちます。PERはシャノン限界の式から受信できるかできないかを判定しています。 CsmacaRandomStream †CsmacaRandomStreamは乱数を管理する役割を持ちます。 パラメータ一覧 †↓にcsmacaモジュールの主要なパラメータを示します。IEEE 802.11aをベースに値を決定しています。
シミュレーション結果 †↓のグラフにSNRを変更した場合のスループットの評価を示します。 SNRの値は、ノード間距離を調整した際の受信ノードのSNRの値です。 比較対象として、シャノン限界、物理層の伝送レートを20~100 [Mbps]に変化させた場合を載せました。 ↑のグラフは横軸がSNR、縦軸がスループットのグラフです。 物理層の伝送レートが高くなってもシャノン限界との値の乖離があることが分かります。これは、DATA伝送以外のオーバヘッドが大きいからだと考えられます。 ↓のグラフに物理層の伝送レートに対するオーバヘッドの評価を示します。 オーバヘッドの値はDATA伝送の全ての時間に対するDATA伝送以外の時間の比率です。オーバヘッドとして、Backoff時間・DIFS時間・RTS/CTS/ACKの伝送時間等が含まれます。 ↑のグラフは横軸が物理層の伝送レート、縦軸がオーバヘッドのグラフです。物理層の伝送レートが高くなるとオーバヘッドも高くなることが分かります。これは、物理層の伝送レートが高くなると1パケットの伝送に占めるDATA伝送の時間が短くなるからだと考えられます。 |