Tcl言語に基づくシンプルなネットワーク環境を構成するプロセスの分析

Tcl言語に基づくシンプルなネットワーク環境を構成するプロセスの分析

1. Tclスクリプトファイルcircle.tclコードコメント

#シミュレーションに必要なプロパティをいくつか設定します。set val(chan) Channel/WirelessChannel
set val(prop) 伝播/TwoRayGround
val(netif) Phy/WirelessPhy を設定する
val(mac) を設定する Mac/802_11
#プロトコルをDSRに設定した後、キューをCMUPriQueueに設定します
val(ifq) CMUPriQueue を設定する
val(ll) LLを設定する
set val(ant) アンテナ/オムニアンテナ
val(ifqlen) を 50 に設定する
#ノード数を 0 にプリセットし、ユーザー入力を待ちます。この項目にはユーザー入力が必要です。入力しないとシミュレーションは実行されません。
val(nn)を0に設定する
val(rp) DSR を設定する
#シーンサイズのデフォルト値は1000*1000です
val(x)を1000に設定する
値を1000に設定する
#円のデフォルトの半径は400です
val(r)を400に設定する
#この手順は画面に印刷するために使用されます。ターミナルに ns circle.tcl と入力し、パラメータ format proc usage {} { を追加します。
  グローバル argv0
  "\nusage: $argv0 \[-nn ノード\] \[-rr\] \[-xx\] \[-yy\]\n" を配置します
  「注意: \[-nn ノード\] は必須で、その他はオプションです。\n」
}
#この手順は、ユーザー入力に応じていくつかのプリセットパラメータの値を変更するために使用されます。 proc getval {argc argv} {
  グローバル値
  ラップ ヴァリスト nn rxyz
  #argcはパラメータの数、argvはパラメータ全体からなる文字列です。{set i 0} {$i < $argc} {incr i} {
    #変数argはargvのi番目の部分で、スペースで区切られています。set arg [lindex $argv $i]
    # 文字 "-" のない文字列をスキップします。これは通常、ユーザーが入力した数字です。# 文字列範囲 $arg mn は、文字列 $arg の m 番目の文字から n 番目の文字を取得することを意味します if {[文字列範囲 $arg 0 0] != "-"} 続行
    名前を設定する [文字列範囲 $arg 1 終了]
    #プリセット変数を変更する(ノード数、半径、シーンサイズ)
    val($name) [lindex $argv [expr $i+1]] を設定します。
  }
}
#getval プロシージャを呼び出す getval $argc $argv
#ユーザーはパラメータを入力せず、nscircle.Tclと入力しただけなので、ノード数は0とみなされます
{ $val(nn) == 0 } の場合 {
  #印刷の使用法
  出口
}

#シミュレーションインスタンスセット ns を作成する [新しいシミュレータ]

#記録ファイルを設定する set tracefd [open circle.tr w]
$ns トレース-すべて $tracefd
namtracefd を設定する [open circle.nam w]
$ns namtrace-all-wireless $namtracefd $val(x) $val(y)

#トレースファイルを閉じて、アニメーションをデモンストレーションするためにnamプログラムを呼び出します。procfinish{}{
	グローバル ns tracefd namtracefd
	$ ns フラッシュトレース
	$tracefdを閉じる
	$namtracefdを閉じる
	実行namcircle.nam &
	終了 0
}

set topo [新しい地形]
$topo ロードフラットグリッド $val(x) $val(y)

神を作成する $val(nn)
#ノード構成。バージョン上の理由により、addressTypeはdefに設定されています
$ns ノード構成 -addressType def\
-adhocRouting $val(rp) \
    -llType $val(ll) \
    -macType $val(mac)\
    -ifqType $val(ifq) \
    -ifqLen $val(ifqlen) \
    -antType $val(ant) \
    -propType $val(prop) \
    -phyType $val(netif) \
    -channelType $val(chan) \
    -topoインスタンス $topo \
    -エージェントトレースオン\
    -ルータトレースオン\
    -mactrace オフ \
    -移動トレースOFF

# ノードを初期化する for {set i 0} {$i < $val(nn)} {incr i} {
#ノードセット node_($i) [$ns node] を作成します
$node_($i) ランダムモーション 0
#三角関数を使用してノードの位置を計算して設定します $node_($i) set X_ [expr $val(r) * cos($i * 2 * 3.14159 / $val(nn))]
  $node_($i) は Y_ [式 $val(r) * sin($i * 2 * 3.14159 / $val(nn))] を設定します
$node_($i) を Z_ 0 に設定
# nam のモバイル ノードの表示サイズを設定します。そうしないと、ノードは nam に表示されません。$ns initial_node_pos $node_($i) [expr $val(x) / 10]
}

#node_(0) にUDPエージェントを作成する set tcp [new Agent/UDP]
$ns アタッチエージェント $node_(0) $tcp
# 直径に沿ってノード(0)の反対側のノードにデータ受信機を作成し、nullを設定します[新しいエージェント/Null]
$ns アタッチエージェント $node_([expr $val(nn)/2]) $null
#パケットサイズが500B、間隔が0.05秒の新しいCBRトラフィックジェネレータを作成します
cbrの設定 [新しいアプリケーション/トラフィック/CBR]
$cbr パケットサイズを 5000 に設定
$cbr 間隔設定_ 0.05
#UDPとNullを接続する
$cbr アタッチエージェント $tcp
$ns は $tcp $null に接続します
# 0.1 秒でデータを送信し、3.0 秒でデータの送信を停止し、5.0 秒で終了プロセスを呼び出します $ns at 0.1 "$cbr start"
$ns 3.0 "$cbr 停止"
$ns 5.0「終了」
$ns 実行

2. gawk スクリプトコード分析.awk コメント

始める {
#初期変数を設定 num_D = 0; #失われたパケットの数 num_s = 0; #送信パケットの数 num_r = 0; #受信パケットの数 rate_drop = 0; #パケット損失率 sum_delay = 0; #合計遅延時間 average_delay = 0; #平均遅延時間}
{
	#トレースファイルレコードを読み取ります。イベント = $1; #最初の列はパケット操作です (s は送信パケット、r は受信パケット)
	time = $2; #2 列目は操作時間です node = $3; #3 列目はノード番号です trace_type = $4; #4 列目は操作レイヤーです flag = $5; #5 列目はフラグです uid = $6; #6 列目はノード識別子です pkt_type = $7; #7 列目はパケット タイプです pkt_size = $8; #8 列目はパケット サイズです #操作 if (event == "s" && trace_type == "AGT" && pkt_type == "cbr")
	{ send_time[uid] = time; #パケットの送信時間を記録する配列を作成します num_s++; #送信されたパケットの合計数を記録します }
	if (イベント == "r" && トレースタイプ == "AGT" && パケットタイプ == "cbr")
	{ delay[uid] = time - send_time[uid]; #遅延時間を記録する配列を作成する num_r++; #受信したパケットの合計数を記録する }
	if (イベント == "D" && pkt_type == "cbr")
		delay[uid] = -1; #-1はパケットが失われ、遅延時間内にパケットが記録されないことを意味します}

終わり {
	#パケット損失数とパケット損失率を計算します num_D = num_s-num_r; #パケット損失の合計数 rate_drop = num_D / num_s * 100.0; #パケット損失率を計算します	
	#遅延を計算します ( i = 0; i < num_s; i++)
		{if (遅延[i] >= 0)
			合計遅延 += 遅延[i];
		}#合計遅延時間 average_delay = sum_delay / num_r; #平均遅延時間 #結果を表示 printf("ドロップされたパケットの数: %d \n",num_D);
	printf("送信されたパケット数: %d \n",num_s);
	printf("ドロップ率: %.3f%% \n",rate_drop);
	printf("平均遅延時間: %.9f \n",average_delay);
}

3. 実験結果

(1)

ネットワークノードの数は 12 に設定されています。実行結果は次のようになり、nam ファイルと trace ファイルの 2 つの記録ファイルが生成されます。


この時点で、トレース ファイルのサイズは 91.8kb、nam ファイルのサイズは 76.0kb です。



次に、gawk ツールを使用して、生成されたトレース ファイルを分析します。 gawk ツールがインストールされていない場合は、sudo apt-get install gawk コマンドを実行してインストールします。
得られる結果は、ネットワーク シミュレーション プロセス中のパケット損失数、送信パケット数、パケット損失率、および平均遅延です。


(2)ノード数を再度8に変更します。実行結果は以下のようになります。ただし、フォルダにcircle.namファイルとcircle.trファイルは追加されません。


2 つのファイルのプロパティを確認すると、サイズが変更されており、新しく作成されたネットワーク シミュレーション環境の記録ファイルが上書きされたことがわかりました。



Gawk は生成されたトレース ファイルを分析するためにも使用できます。ネットワーク ノードの数が増えると、パケット損失率と平均遅延が増加することがわかりました。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • VMware 仮想マシンでの CentOS7 ネットワーク構成 (ホストのワイヤレス インターネット アクセス)
  • Linux 仮想マシンの IP アドレスを変更し、ゲートウェイを確認し、ネットワーク環境を構成する方法に関するチュートリアル
  • CentOS8.0ネットワーク設定の実装
  • VMWare 仮想マシン 15.X LAN ネットワーク構成チュートリアル図
  • VMware で Centos7 ブリッジ ネットワークを構成する手順の詳細な説明
  • 仮想マシンのLinux初心者がIPを設定し、ネットワークを再起動する
  • LinuxネットワークにおけるNAT構成の詳細な説明
  • Docker のデフォルト ブリッジ ネットワークで DNS を構成する方法

<<:  MySQL 8.0.21 無料インストール版 設定方法 グラフィックチュートリアル

>>:  Vue のクロスドメイン問題の処理と解決策の概要

推薦する

JSは単純なフィルタリングから複数条件のフィルタリングまで配列フィルタリングを実装します

目次単一条件単一データフィルタリング単一条件複数データフィルタリング複数の条件付きデータフィルタリン...

ページの下部にHTMLフッターを配置する簡単な方法

要件:ページ コンテンツが短く、ブラウザーの高さをサポートできない場合でも、フッターをウィンドウの下...

VUE + OPENLAYERSがリアルタイムポジショニング機能を実現

目次序文1. ラベルスタイルを定義する2. GeoJSONデータのシミュレーション3. Vercto...

ヘッダーのチェックボックスをテキスト実装コードに変更するための選択テーブルを持つ要素

方法1: テーブル属性を使用する: header-cell-class-name テーブルインターフ...

JavaScriptは、ユーザーがチェックボックスをオンにする必要があるプロトコルの例を実装します。

js では、ログインまたは登録を確認する前に、ユーザーが特定の契約書を読むように設定します (使用...

jQueryはアコーディオン効果を実装します

この記事では、アコーディオンを実装するためのjQueryの具体的なコードを参考までに紹介します。具体...

JavaScript ECharts の使用方法の説明

以前、プロジェクトを行う際に ECharts を使用しました。今日はそれをメモとして整理し、より多く...

Ubuntu 16.4 で完全に分散された Hadoop 環境を構築するための実践的なチュートリアル

序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...

JS の精度外数値問題の解決

精度の問題に対する最もわかりやすい説明たとえば、1÷3=0.33333333...という数字は、3が...

WeChatアプレットはシンプルな計算機を実装する

参考までにWeChatアプレットで書かれた簡単な計算機です。具体的な内容は次のとおりです。 jisa...

カタツムリ映画システムのDocker展開の詳細なプロセス分析

環境に関する声明ホストOS: Cetnos7.9 最小インストールdocker バージョン: 20....

Vue が値を返してフォームを動的に生成し、データを送信する仕組みの詳細な説明

目次解決された主な問題1. バックエンドから返され、バックエンドに送信されるデータは、次の形式になり...

js キャンバスは検証コードを実装し、検証コード機能を取得します

この記事の例では、検証コードを作成して取得するためのjsキャンバスの具体的なコードを共有しています。...

Angular構造ディレクティブモジュールとスタイルの詳細な説明

目次1. 構造指示モジュールforRoot()を書く3. スタイルの定義ドラッグ時の順序を調整するに...

inline-blockプロパティとの互換性

<br />1年前、インターネット上にはinline-blockプロパティに関する記事は...