Science and Technology 279 11回目 NS3入門
Science and Technology279
11回目
NS3入門
Science and Technology
札幌
仙台
東京
金沢
名古屋
大阪
福岡
札幌
0
仙台
0
東京
0
金沢
0
名古屋
0
大阪
0
福岡
0
GLPKで解きたい問題の例
都市間のトラヒックを最大限収容可能にするには経路割当をどう行う?
トラヒック量は人口比例
280
福岡
大阪
金沢
名古屋東京
仙台
札幌 交流トラヒック行列
Science and Technology
トラヒック理論でどんなことを予想できるか
ルータ1台通過する毎の特性を近似して、足していく
東京:遅延時間 平均 10 ms、分散 5 ms2
大阪:遅延時間 平均 8 ms、分散 4.5 ms2
東京-大阪 550 km ~ 3 ms (+ 処理時間)
281
福岡
大阪
金沢
名古屋東京
仙台
札幌
Science and Technology
東京のルータの例
282
入力回線
回線終端
データリンク処理
テーブル参照等
スイッチ基盤 回線終端
データリンク処理
バッファ管理
出力回線
出力ポート入力ポート
単一窓口の待ち行列モデル
待ち行列
Science and Technology
NS3でのシミュレーション
実際にパケットを流して追跡する
パケットに発出時刻を記録
全パケットを単位時間毎にノード、リンクを移動させていく
TCP/IP で動作するアプリケーション (ファイル転送~ ftp: file transfer protocol)
UDP/IP で動作するアプリケーション (CBR: Continuous Bit Rate)
同じ宛先のパケットはノードでバッファリング
宛先ノードに到着した時の到着時刻をパケットに記録
283
Science and Technology
NS3サンプル ノード(ホスト、ルータ)、リンク、トラヒック等を与える。
実際にパケットを発生させて、ノードから送る。
バッファの待ち合わせでパケットが溢れるとこぼれ落ちる。
受信したパケットの数や、遅延時間を解析して特性評価。
284
1個1個がパケット
Science and Technology
シナリオに沿ったパケット発生 0-10 : #1⇒#5 100 Mbps、#3⇒#4 200 Mbps 5-15 : #1⇒#4 300 Mbps、#4⇒#1 150 Mbps
NS3でのシミュレーションの例
285
福岡
大阪
金沢
名古屋
東京
仙台
札幌
#1
#2#3
#4#5
#6#7
#1 #2
#3
#6
#4
#5
#7
容量 500 Mbps長さ 10 ms
容量 800 Mbps長さ 12 ms
容量 400 Mbps長さ 15 ms
容量 1000 Mbps長さ 8 ms
容量 1000 Mbps長さ 9 ms
容量 1500 Mbps長さ 13 ms
容量 400 Mbps長さ 10 ms 容量 800 Mbps
長さ 5 ms
容量 500 Mbps長さ 11 ms
容量 700 Mbps長さ 4 ms
Science and Technology
NS3におけるネットワークの表現
現実のネットワーク (プロトコルスタック表現)
NS3内部のネットワーク
286
FTP, CBRHTTP, SMTP
TCP UDPIP
Ethernet
FTP, CBRHTTP, SMTP
TCP UDPIP
Ethernet
IP
Ethernet
ルータ
送信端末 受信端末
FTP, CBRHTTP, SMTP
TCP UDP
IP
Ethernet NetDevice
Routing
Application
NetDevice NetDevice
Routing
受信端末送信端末
ルータ
Channel Channel
Queue
QueueQueue
QueueRouting
Application
Science and Technology
TCPとUDP(1)
Transport Control Protocol アプリケーション間でデータ転送に先立ち接続
(connection)を確立する。 送信元IPアドレス、送信元TCPポート番号、宛先IPアドレス、宛先
TCPポート番号の4情報でTCP connection を識別する。
全二重サービス (Full-Duplex) 送信側と受信側が同時にデータを送受信できる。
End-to-Endサービス 信頼性の高いサービスを提供する。
受信データの到達確認、損失データの確認 と必要に応じて再送する。
287
Science and Technology
TCPとUDP(2)
User Datagram Protocol Connectionを作成せずに、いきなりデータを送信先に送りつける。
受信確認はしない。
信頼性よりも即時性を優先。
送信元IPアドレス、送信元UDPポート番号、宛先IPアドレス、宛先UDPポートの4情報でUDP stream を識別する。
288
Science and Technology
What is NS-3
オープンソースのネットワークシミュレーター
http://www.nsnam.org/ 実態は C++のライブラリです
シミュレーションも C++で記述します
Python も一部使用可能なようです
289
Science and Technology
NS-3の特徴
オブジェクト指向 ネットワーク機器の各構成要素に対応するクラス
新規ネットワーク機器を C++ で書ける
実環境とリンクできる
Click Modular Router とも連携できる http://read.cs.ucla.edu/click/click
イベントドリブン型のシミュレーター イベントの発生を事前にスケジュール
事前定義されたイベントが原因となりイベント生成
生成されたイベントを再スケジュール
290
Science and Technology
NS-2との違い
NS-3の前身である、NS-2 (http://www.isi.edu/nsnam/ns/)は、大変広く研究者の間で使われていたが、2009年に開発停止
NS-3は、NS-2との互換性を完全に捨てることから開発開始
現在も精力的に開発中
NS-2で評判だったシミュレーションのアニメーション表示を、NS-3に付属するNetAnimで継承
291
Science and Technology
シミュレータの主要構成要素
チャネル
ノード
NetDevice
MAC
PHY
L3L4アプリケーション
ルーティング
ノード
NetDevice
MAC
PHY
L3L4アプリケーション
ルーティング
292
Science and Technology
Application
ノードの上で動くアプリケーション
NS-3には、OSとユーザランドのアプリケーションの区別はない
C++の Application というクラスに相当する UdpEchoClient UdpEchoServer PacketSink OnOff
293
Science and Technology
Channel
コンピュータをネットワークに接続したときに、データが流れるメディア 単純な例
1本のケーブル
複雑な例 大きなイーサネットのスイッチ
障害物を含む3次元空間(無線ネットワーク用)
C++の Channel というクラスに相当する PointToPointChannel: 1本のケーブルでの接続
CsmaChannel: Ethernet用 WifiChannel: 無線LAN用
294
Science and Technology
NetDevice
PCのNIC (Network Interface Card)のようなもの 通常、デバイスドライバによって駆動される
NS-3のNetDeviceは、デバイスドライバ + ハードウェア
Nodeにインストールされることで、Channelに接続し、他のNodeと通信できるようになる 1つのNodeに複数のNetDeviceをインストールし、複数の
Channelに接続できる ルータ
C++の NetDevice というクラスに相当する PointToPointNetDevice, CsmaNetDevice,
WifiNetDevice 等
295
Science and Technology
Helper
NetDeviceとChannelの接続等を隠蔽してくれる便利なもの
シミュレーションスクリプトを書くときに楽ができるように提供されている マクロみたいなもの
例:ネットワークトポロジを作るためのHelper NetDevice作成→MACアドレス付与→Nodeへインストー
ル→MAC層のプロトコルスタックを設定→Channelへ接続
複数のNetDeviceをマルチポイントChannelへ接続
みたいなことを裏でやってくれている
296
Science and Technology
NS3インストール
https://www.nsnam.org/releases/ からソースを入手
Latest release (NS-3.26) の tarball をダウンロード
ns-allinone-3.26.tar.bz2 tar jxvf で展開すると ns-allinone-3.26 ができる
NS-3のビルドには waf を使う
$ cd ns-allinone-3.26/ns-3.26$ ./waf configure --enable-examples --enable-tests$ ./waf build
2600個以上のコンパイルが行われる (5分~30分以上)※ns-3.26からg++ 4.8 以上を要求するようになった
examples と tests をコンパイルして登録
297
Science and Technology
Configure の結果(3.26の場合)
BRITE: Network Topology 作成Click: Modular RouterOpenFlow: 最近流行り
298
Science and Technology
ビルドの結果(3.26の場合)
299
Science and Technology
ビルドのチェック
テストを実行して確認$ ./test.pyしばらくして、
397 of 400 tests passed (397 passed, 3 skipped, 0 failed, 0 crashed, 0 valgrind errors)のように failed, crashed, errors が 0 なら OK
パッケージやモジュールが足りなそうなら https://www.nsnam.org/wiki/Installationを参考にして追加することが必要になる。
300
Science and Technology
NS3のディレクトリ構成
サンプルコード集既存のコンポーネントを使ったシミュレーションについて参考になる。
自分で作ったシミュレーションのコードはここ配置する。
既存のコンポーネントのコードはこの中に入っている。
ビルド中にはここに一旦コードが集められてコンパイルされる。
301
Science and Technology
build 以下の構成
自分で作ったコードはここに一旦コピーされ
てビルドされる。
ヘッダファイルはここに集められる
ヘッダファイル
302
Science and Technology
srcの構成
NS3でモデル化された構成要素は全てC++のクラスとして表現
modelとhelper クラスAbcDef abc-def.h クラス定義、メソッド宣言
abc-def.cc メソッド定義
クラスAbcDefHelper あるコンポーネントを別のコンポーネント群全てに次々とインストールするためのクラス
303
Science and Technology
シミュレーションの流れ
シナリオ作成:C++, Eclipse, Emacs ビルドと実行:make, waf ログ解析
定義済みログ
ユーザー定義ログ
PCAP出力, tcpdump, wireshark 可視化
XMLログ, NetAnim
304
Science and Technology
シミュレーションの実行
./waf --run シナリオ名(拡張子.cc除く) $ ./waf configure --enable-examples --enable-tests とやっているので、example 以下は実行可能になっている
例)examples/tcp/star.ccの実行
305
Science and Technology
.pcap libpcap互換フォーマット : packet capture
tcpdump や wireshark でパケットのやりとりを見ることができる
306
Science and Technology
はじめての NS-3
一番簡単な2ノードのネットワーク
0 1
UDP Echo Client10.1.1.1
UDP Echo Server10.1.1.2
10.1.1.0/24
Point to Point Link
• Full Duplex (全二重)• Delay: 2 ms• Throughput: 1 Mbps
• Simulation time: 10 sec• At 2 sec, send UDP Echo Packet to the Echo
Server• Simulation time resolution: 1 ns
307
Science and Technology
ns-3の抽象化
Node Application Channel Net device
308
Science and Technology
scratch/test1.cc
001: /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */002: 003: #include "ns3/core-module.h"004: #include "ns3/network-module.h"005: #include "ns3/internet-module.h"006: #include "ns3/point-to-point-module.h"007: #include "ns3/applications-module.h"008:009: using namespace ns3;010: 011: NS_LOG_COMPONENT_DEFINE ("Test1");012: 013: int014: main (int argc, char *argv[])015: {016: Time::SetResolution (Time::NS);017: LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);018: LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
Emacs用のおまじない
本来は必要なヘッダだけ書けば良いが、とりあえず。
C++ のおまじない
おまじない。Test1 と書くことで、test1.cc のログであることが分かるようになる。
UDPの場合のおまじない。
時間の解像度を nsに
309
Science and Technology
test1.cc の続きその1
019: NodeContainer nodes;020: nodes.Create (2);021: 022: PointToPointHelper pointToPoint;024: pointToPoint.SetDeviceAttribute ( “DataRate”, StringValue ( “1Mbps”));025: pointToPoint.SetChannelAttribute ( “Delay”, StringValue ( “2ms”));026:027: NetDeviceContainer devices;028: devices = pointToPoint.Install ( nodes );029:030: InternetStackHelper stack;031: stack.Install ( nodes );032: 033: Ipv4AddressHelper address;034: address.SetBase ( “10.1.1.0”, “255.255.255.0”, “0.0.0.1” );035: Ipv4InterfaceContainer interfaces = address.Assign ( devices );
ノードの定義、作成
リンクの定義
全ノード間にリンクを作成特定ノード間なら device = pointToPoint.Install (nodes.Get(0), nodes.Get(1));
Internet protocol stack をノードにインストール
IPアドレスをノードに割り当て
10.1.1.0/24 であることを設定
チャネル
ヘルパー デバイス
310
Science and Technology
test1.cc の続きその2
036: UdpEchoServerHelper echoServer ( 9 );037:038: ApplicationContainer serverApps;039: serverApps=echoServer.Install (nodes.Get ( 1 ));040: serverApps.Start (Seconds ( 1.0 ));041: serverApps.Stop (Seconds ( 10.0 ));042:043: UdpEchoClientHelper echoClient (interfaces.GetAddress ( 1 ), 9);044: 045: echoClient.SetAttribute ( "MaxPackets", UintegerValue ( 1 ));046: echoClient.SetAttribute ( "Interval", TimeValue ( Seconds ( 1.0 )));047: echoClient.SetAttribute ( "PacketSize", UintegerValue ( 1024 ));048:049: ApplicationContainer clientApps;050: clientApps = echoClient.Install (nodes.Get ( 0 ));
UDP Echo Serverの作成 (待ち受けポート番号=9)
UDP Echo ServerをNode 1 にインストール
UDP Echo Serverの動作時間を設定
UDP Echo Clientの作成
宛先アドレス (Node 1) のIPアドレスを取得↓
宛先ポート番号↑
UDP Echo Clientの設定
送信数、再送インターバル、パケットサイズ
UDP Echo ClientをNode 0 にインストール
311
Science and Technology
test1.cc の続きの終わり
051: clientApps.Start (Seconds ( 2.0 ));052: clientApps.Stop (Seconds ( 10.0 ));053: 054: Simulator::Run ();055: Simulator::Destroy ();056: return 0;053: }
実行は
$ ./waf -- run test1
UDP Echo Clientの動作時間を設定
.ccはつけません
312
10.43 ms1 Mbps, 1024B
→ 8.192 ms+ リンク 2 ms
Science and Technology
ノードを追加してみる
NodeContainer network1_nodes, network2_nodes;network1_nodes.Create (2); ⇐ Network1 の 0 と 1 ができる。 n0 と n1
network2_nodes.Add ( network1_nodes.Get (1) ); network2_nodes.Create (1); ⇐ Network2 に1個ノードを追加 つまり 1 = n2
PointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute ( “DataRate”, StringValue ( “1Mbps”));pointToPoint.SetChannelAttribute ( “Delay”, StringValue ( “2ms”));NetDeviceContainer dev1 = pointToPoint.Install ( network1_nodes );NetDeviceContainer dev2 = pointToPoint.Install ( network2_nodes );
InternetStackHelper stack;stack.InstallAll ( );
313
n0 n1
Network110.1.1.0/24
Point to Point Link n2Point to Point Link
Network210.2.2.0/24
Netwrok1の1 = n1 をNetwork2の 0 として追加
NodeContainerに一括して設定
Science and Technology
examples/tcp/star.cc#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/netanim-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/point-to-point-layout-module.h"
// Network topology (default)
//
// n2 n3 n4 .
// ¥ | / .
// ¥|/ .
// n1--- n0---n5 .
// /|¥ .
// / | ¥ .
// n8 n7 n6 .
//
using namespace ns3;
NS_LOG_COMPONENT_DEFINE ("Star");
ヘッダ読み込みtest1.cc より2個多いです。
C++のおまじない
ログの名称を Star に設定
全部で 9 ノード(IPルータ)n0がhub
n1~n8がspoke
314
Science and Technology
star.cc の続きその1int
main (int argc, char *argv[])
{
//
// Set up some default values for the simulation.
//
Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (137));
// ??? try and stick 15kb/s into the data rate
Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("14kb/s"));
//
// Default number of nodes in the star. Overridable by command line argument.
//
uint32_t nSpokes = 8;
CommandLine cmd;
cmd.AddValue ("nSpokes", "Number of nodes to place in the star", nSpokes);
cmd.Parse (argc, argv);
コメントは、15kb/s?
Unsigned Integer
文字指定
普通に変数定義
Ns3はコマンドラインの処理ができる
コマンドラインでnSpokesの値を与えられる
315
Science and Technology
star.cc の続きその2NS_LOG_INFO ("Build star topology.");
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
PointToPointStarHelper star (nSpokes, pointToPoint);
NS_LOG_INFO ("Install internet stack on all nodes.");
InternetStackHelper internet;
star.InstallStack (internet);
NS_LOG_INFO ("Assign IP Addresses.");
star.AssignIpv4Addresses (Ipv4AddressHelper ("10.1.1.0", "255.255.255.0"));
NS_LOG_INFO ("Create applications.");
//
// Create a packet sink on the star "hub" to receive packets.
//
uint16_t port = 50000;
Address hubLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", hubLocalAddress);
ApplicationContainer hubApp = packetSinkHelper.Install (star.GetHub ());
hubApp.Start (Seconds (1.0));
hubApp.Stop (Seconds (10.0));
チャネル
ヘルパーデバイス
プロトコルスタックの組み込み
アドレスの割当
受信ソケット
1秒から10秒まで動く
TCP
0.0.0.0
316
Science and Technology
star.cc の続きその3
//
// Create OnOff applications to send TCP to the hub, one on each spoke node.
//
OnOffHelper onOffHelper ("ns3::TcpSocketFactory", Address ());
onOffHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
onOffHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
ApplicationContainer spokeApps;
for (uint32_t i = 0; i < star.SpokeCount (); ++i)
{
AddressValue remoteAddress (InetSocketAddress (star.GetHubIpv4Address (i), port));
onOffHelper.SetAttribute ("Remote", remoteAddress);
spokeApps.Add (onOffHelper.Install (star.GetSpokeNode (i)));
}
spokeApps.Start (Seconds (1.0));
spokeApps.Stop (Seconds (10.0));
tOn Time On TimeOff Time
一定値の乱数を返す
送信アプリケーション
317
Science and Technology
star.cc の続きの終わり
NS_LOG_INFO ("Enable static global routing.");
//
// Turn on global static routing so we can actually be routed across the star.
//
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
NS_LOG_INFO ("Enable pcap tracing.");
//
// Do pcap tracing on all point-to-point devices on all nodes.
//
pointToPoint.EnablePcapAll ("star");
NS_LOG_INFO ("Run Simulation.");
Simulator::Run ();
Simulator::Destroy ();
NS_LOG_INFO ("Done.");
return 0;
}
全リンクのpcapファイルが生成されるファイル名は star-[n1]-[n2].pcap
何故か0-0, 0-1, 0-2, ..., 0-71-0, 2-0, 3-0, ..., 8-0
ルーティングテーブル組み込みを自動でやってくれる
318
Science and Technology
NetAnim で見える化してみた
319
Science and Technology320
演習11
• Test1.cc の続きその1、その2、続きの終わりを書き換えて、以下のシミュレータを記述せよ
0 1
UDP Echo Client10.1.1.1
UDP Echo Server10.2.2.2
10.1.1.0/24Point to Point Link 2Point to Point Link
10.2.2.0/24
UDP Echo Client10.2.2.110.1.1.2
• Full Duplex• Delay: 2 ms• Throughput: 1 Mbps
• Full Duplex• Delay: 10 ms• Throughput: 2 Mbps
• Simulation time: 10 sec• At 2 sec, send UDP Echo Packet from 0 to the Echo Server 2• At 4 sec, send UDP Echo Packet from 1 to the Echo Server 2
Science and Technology
次回は7月6日(木) 場所は12-107 Workstation室
321