17 情報工学講義第3 木5限 for 学生0620 - Keio University...2017/04/17  · 282...

43
Science and Technology 279 11回目 NS3入門

Transcript of 17 情報工学講義第3 木5限 for 学生0620 - Keio University...2017/04/17  · 282...

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