ns-3上へのspc-macの実装について †重畳符号化をする際にL2バッファのデータ量に基づき適切に電力割りあてをすることで高効率にデータ伝送をするSPC-MAC (Superposition Coding Medium Access Control)をspc-macモジュールとして実装しました。 実装はcsmaca (ns-3上へのCSMA/CAの実装について)モジュールをベースに実装しました。 spc-macの使用方法 †spc-macはns-3.20のみ動作が保証されています。ここではホームディレクトリにns-3.20がインストールされていると仮定してspc-macの使用方法を記載します。ns-3.20のインストールは、↓を参考にして下さい。 プログラムのダウンロード †まず、git(ns3-spc)からソースコードをダウンロードします。https://github.com/yusuke-sugiyama/ns-3-spcを開くと↓のページが表示されます。 右下のDownload ZIPをクリックすると「ns-3-spc-master.zip」がダウンロードできます。 プログラムの配置方法 †ダウンロードした「ns-3-spc-master.zip」をhomeディレクトリに置いたと仮定して話を進めます。まず、以下のコマンドを利用してzipを解凍します。 unzip ns-3-spc-master.zip すると、「ns-3-spc-master」ディレクトリが生成されるのでcdコマンドでそのディレクトリに移動します。 cd ns-3-spc-master 次に、「ns-3-spc-master/src」の中身をns-3.20の「src」に、「ns-3-spc-master/scratch」の中身ををns-3.20の「scratch」に追加します。 ns-3.20の「scratch」に「spc-mac」フォルダが追加されます。 ns-3.20の「src」に「spc-mac」フォルダが追加されます。 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 これで、プログラムの配置は完了です。 spc-macのチュートリアル †spc-macモジュールの ダウンロードからプログラムの配置 を行っていない場合はそちらを先にして下さい。チュートリアルでは、spc-macモジュールが使用可能であること、ホームディレクトリにns-3.20がインストールされていることとして話を進めていきます。 ns-3.20のインストールは、↓を参考にして下さい。 プログラムの実行方法 †まず、ns-3.20の「scratch/spc-mac」ディレクトリに移動します。 cd ~/ns-allinone-3.20/ns-3.20/scratch/spc-mac/ 以下のコマンドを実行することでシミュレーションを開始します。 ./waf --run "spc-mac" ↓の図に実行結果を示します。 #ref(): File not found: "result.png" at page "ns-3上へのSPC-MACの実装について" 引数として --streamを指定するとランダム値を生成するシードを変更することが可能です。 ただし、変更されるのはランダムバックオフのランダム値のみです。 ./waf --run "spc-mac --stream=100" ランダム値を生成するシードを全て変更する場合は、環境変数「NS_GLOBAL_VALUE」に値を設定します。 export NS_GLOBAL_VALUE="RngRun=0" 上記の"0"の値を変更することでランダム値を生成するシードを全て変更することが可能です。 ↓の図に環境変数NS_GLOBAL_VALUEの値を変更した場合の実行結果を示します。 #ref(): File not found: "result2.png" at page "ns-3上へのSPC-MACの実装について" spc-macモジュールの詳細 †論文 †↓の論文は実装したSPC-MACに関するものです。 青木 勇太, 猿渡 俊介, 渡辺 尚, 重畳符号化を用いた無線通信における転送量に基づく電力割当方式, 情報処理学会研究報告, モバイルコンピューティングとユビキタス通信研究会, 2012年11月 クラス図全体像 †↓の図にクラス図を示します。 spc-macモジュールは黄色で示した15個のクラスから構成されています。クラスは大きく分けてMac層の実装・Phy層の実装・その他の実装に分けることができます。 MAC層の実装 †MAC層はSpcMacMac・SpcMacQueue・SpcMacHeader・SpcMacTrailer・NodeInformationTable(Item)の5つのクラスで実装しています。それぞれのクラスの役割を説明していきます。 SpcMac †SpcMacはバックオフやNAV (Network Allocatoin Vector) などの時間の制御やDATA/ACK/RTS/CTS などのフレームの送受信、重畳符号化、電力の割り当てなどの役割を持ちます。 SpcMacQueue †SpcMacMacQueueはMAC層のキューの役割を持ちます。最大で400パケット格納することが可能です。キューにパケットが入りきらなかった場合、入りきらなかったパケットは破棄されます。 SpcMacHeader・SpcMacTrailer †SpcMacHeader・SpcMacTrailerはMAC層のヘッダを構成する役割を持ちます。 ↓の図に重畳符号化DATAのフレームフォーマットを示します。 ↓の図にユニキャストDATA・ユニキャストRTS・重畳符号化RTSのフレームフォーマットを示します。 ※ TypeはユニキャストDATAの場合000、ユニキャストRTSの場合001、重畳符号化RTSの場合100が代入されます。 ↓の図にユニキャストCTS・重畳符号化CTSのフレームフォーマットを示します。 ※ ユニキャストCTSの場合010、重畳符号化CTSの場合101が代入されます。 ↓の図にACKのフレームフォーマットを示します。 NodeInformationTable(Item) †NodeInformationTable (Item)はあるノードから各ノードに対するトラヒックと、あるノードから各ノードにフレームを送信する際に生じる伝搬損失を保存する役割を持ちます。 PHY層の実装 †PHY層はSpcPhy・SpcChannel・SpcPhyListener・SpcPhyState・SpcPhyStateHelper・SpcPreambleの6つのクラスで実装しています。それぞれのクラスの役割を説明していきます。 SpcPhy †SpcPhyは信号の送信と受信の開始や終了を制御する役割をもちます。 SpcChannel †SpcChannlは全てのノードとの信号をやりとりして送信遅延や伝搬損失を 算出する機能を提供する役割を持ちます。送信遅延の算出にはConstantSpeedPropagationDelayModelを利用しています。伝搬損失の算出にはLogDistancePassLossModelを利用しています。 SpcPhyListener †SpcPhyListenerはPHY層で送受信したことをMAC層へ通知する役割を持ちます。具体的には、送信の開始・受信の開始・受信の成功・受信の失敗・キャリアセンス開始を通知します。 SpcPhyState †SpcPhyStateは物理インタフェースのIdle、Busy (Clear Channel Assessment)、TX (Transmission)、RX (Reception) の4 つの状態を持つクラスです。 SpcPhyStateHelper †SpcPhyStateHelperはSpcPhyStateで管理している状態の状態遷移を管理する役割を持ちます。 SpcPreamble †SpcPreambleはプリアンブルとPHY層のヘッダを構成する役割を持ちます。 ↓の図にプリアンブルとPHY層のヘッダのフレームフォーマットを示します。 POWERにはアドレス1宛てのノードに割り当てた電力を格納します。 SYMBOLSにはMACヘッダとペイロードの長さが格納されます。 N-LENGTHにはアドレス1宛てのノードのMACヘッダとペイロードの長さが格納されます。 F-LENGTHにはアドレス2宛てのノードのMACヘッダとペイロードの長さが格納されます。 Tailには0が格納されます。 その他の実装 †SpcNetDevice †SpcNetDeviceはL3のモジュールとspc-macモジュールを接続するためのインタフェースの役割を担います。 SpcInterferenceHelper †SpcInterferenceHelperは、受信信号からSNR (Sginal to Noise Ratio) やPER (Packet Error Rate)を算出する役割を持ちます。PERはシャノン限界の式から受信できるかできないかを判定しています。 SpcRandomStream †SpcRandomStreamは乱数を管理する役割を持ちます。 PacketInfo †PacketInfoはパケットの構造を格納する役割を持ちます。 重畳符号パケットを生成する際のアグリゲーション時に利用します。 パラメータ一覧 †↓にspc-macモジュールの主要なパラメータを示します。IEEE 802.11aをベースに値を決定しています。
|