ns-3上へのCSMA/CAの実装について

MACヘッダやプリアンブルを新たに定義した新しいMAC層を検証する目的で、csmacaモジュールを実装しました。 csmacaモジュールは、ns-3のwifiモジュールの必要最小限のソースコードを切り出した容易に拡張可能なモジュールです。 ns-3のwifiモジュールはIEEE 802.11の仕様に基づいて作成されているため、MACヘッダ・プリアンブルを変更するには、多くの部分を書き直す必要があります。

csmaca以下の5つの特徴を持ちます.

  • 独自のプリアンブルを定義可能
  • 独自のMACヘッダを定義可能
  • 伝送レートを細かく設定可能
  • 物理層はシャノン限界ベースで作成
  • MAC層はIEEE 802.11aをベースに作成

csmacaの使用方法

csmacaはns-3.20のみ動作が保証されています。ここではホームディレクトリにns-3.20がインストールされていると仮定してcsmacaの使用方法を記載します。ns-3.20のインストールは、↓を参考にして下さい。

ns-3.20のインストール

プログラムのダウンロード

まず、git(ns3-csmaca)からソースコードをダウンロードします。https://github.com/yusuke-sugiyama/ns-3-csmacaを開くと↓のページが表示されます。

intro01.png

右下の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のインストール

プログラムの実行方法

まず、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]のパケットを送信し続けます。

topology.png

以下のコマンドを実行することでノード間距離を100 [m]、物理層の伝送レート 1 [Mbps]に設定してシミュレーションを実行することが可能です。実行結果として単位時間あたりに伝送されたデータ量 [Mbps]が表示されます。

./waf --run "csmaca --distance=100 --rate=1000000"

↓の図に物理層の伝送レートを変更した場合の実行結果を示します。

result.png

引数として --streamを指定するとランダム値を生成するシードを変更することが可能です。 ただし、変更されるのはランダムバックオフのランダム値のみです。

./waf --run "csmaca --distance=100 --rate=1000000 --stream=100"

ランダム値を生成するシードを全て変更する場合は、環境変数「NS_GLOBAL_VALUE」に値を設定します。

export NS_GLOBAL_VALUE="RngRun=0"

上記の"0"の値を変更することでランダム値を生成するシードを全て変更することが可能です。

↓の図に環境変数NS_GLOBAL_VALUEの値を変更した場合の実行結果を示します。

result2.png

csmacaモジュールの詳細

クラス図全体像

↓の図にクラス図を示します。

class.png

csmacaモジュールは黄色で示した13個のクラスから構成されています。クラスは大きく分けてMac層の実装・Phy層の実装・その他の実装に分けることができます。

MAC層の実装

MAC層はCsmacaMacCsmacaMacQueueCsmacaMacHeaderCsmacaMacTrailerの3つのクラスで実装しています。それぞれのクラスの役割を説明していきます。

CsmacaMac

CsmacaMacはバックオフやNAV (Network Allocatoin Vector) などの時間の制御やDATA/ACK/RTS/CTS などのフレームの送受信をする役割を持ちます。


CsmacaMacQueue

CsmacaMacQueueはMAC層のキューの役割を持ちます。最大で400パケット格納することが可能です。キューにパケットが入りきらなかった場合、入りきらなかったパケットは破棄されます。


CsmacaMacHeader・CsmacaMacTrailer

CsmacaMacHeaderCsmacaMacTrailerはMAC層のヘッダを構成する役割を持ちます。

↓の図にDATA・RTSのフレームフォーマットを示します。

data.png

※ TypeはDATAの場合00・RTSの場合10が代入されます。

↓の図にACK・CTSのフレームフォーマットを示します。

ack.png

※ TypeはACKの場合01・CTSの場合11が代入されます。

※ FCSのみCsmacaMacTrailerで扱い、その他はCsmacaMacHeaderで扱います。

PHY層の実装

PHY層はCsmacaPhyCsmacaChannelCsmacaPhyListenerCsmacaPhyStateCsmacaPhyStateHelperCsmacaPreambleの6つのクラスで実装しています。それぞれのクラスの役割を説明していきます。

CsmacaPhy

CsmacaPhyは信号の送信と受信の開始や終了を制御する役割を持ちます。


CsmacaChannel

CsmacaChannlは全てのノードとの信号をやりとりして送信遅延や伝搬損失を 算出する機能を提供する役割を持ちます。送信遅延の算出にはConstantSpeedPropagationDelayModelを利用しています。伝搬損失の算出にはLogDistancePassLossModelを利用しています。


CsmacaPhyListener

CsmacaPhyListenerはPHY層で送受信したことをMAC層へ通知する役割を持ちます。具体的には、送信の開始・受信の開始・受信の成功・受信の失敗・キャリアセンス開始を通知します。


CsmacaPhyState

CsmacaPhyStateは物理インタフェースのIdle、Busy (Clear Channel Assessment)、TX (Transmission)、RX (Reception) の4 つの状態を持つクラスです。


CsmacaPhyStateHelper

CsmacaPhyStateHelperCsmacaPhyStateで管理している状態の状態遷移を管理する役割を持ちます。


CsmacaPreamble

CsmacaPreambleはプリアンブルとPHY層のヘッダを構成する役割を持ちます。

↓の図にプリアンブルとPHY層のヘッダのフレームフォーマットを示します。

preamble.png

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をベースに値を決定しています。

パラメータ
SIFS16 [us]
DIFS34 [us]
Slot Time9 [us]
CW MIN15
CW MAX1023
RTS/CTS送信スレッショルド1000 [Byte]
RTS再送回数7
DATA再送回数7
受信スレッショルド-96.0 [dBm]
キャリアセンススレッショルド-99.0 [dBm]
送信ゲイン0 [dB]
受信ゲイン0 [dB]
送信電力20 [dBm]

シミュレーション結果

↓のグラフにSNRを変更した場合のスループットの評価を示します。 SNRの値は、ノード間距離を調整した際の受信ノードのSNRの値です。 比較対象として、シャノン限界、物理層の伝送レートを20~100 [Mbps]に変化させた場合を載せました。

snr-vs-throughput.png

↑のグラフは横軸がSNR、縦軸がスループットのグラフです。 物理層の伝送レートが高くなってもシャノン限界との値の乖離があることが分かります。これは、DATA伝送以外のオーバヘッドが大きいからだと考えられます。

↓のグラフに物理層の伝送レートに対するオーバヘッドの評価を示します。 オーバヘッドの値はDATA伝送の全ての時間に対するDATA伝送以外の時間の比率です。オーバヘッドとして、Backoff時間・DIFS時間・RTS/CTS/ACKの伝送時間等が含まれます。

overhead.png

↑のグラフは横軸が物理層の伝送レート、縦軸がオーバヘッドのグラフです。物理層の伝送レートが高くなるとオーバヘッドも高くなることが分かります。これは、物理層の伝送レートが高くなると1パケットの伝送に占めるDATA伝送の時間が短くなるからだと考えられます。


添付ファイル: fileoverhead.png 7306件 [詳細] filesnr-vs-throughput.png 7374件 [詳細] filetopology.png 7245件 [詳細] fileclass.png 7288件 [詳細] fileresult2.png 7227件 [詳細] fileresult.png 7345件 [詳細] fileintro01.png 7339件 [詳細] filepreamble.png 7269件 [詳細] fileack.png 7129件 [詳細] filedata.png 7130件 [詳細]

  添付編集
Last-modified: 2014-12-08 (月) 14:09:24 (3637d)