Analyse des Prozesses zur Konfiguration einer einfachen Netzwerkumgebung basierend auf der Sprache Tcl

Analyse des Prozesses zur Konfiguration einer einfachen Netzwerkumgebung basierend auf der Sprache Tcl

1. Tcl-Skriptdatei circle.tcl Codekommentare

#Legen Sie einige für die Simulation benötigte Eigenschaften fest set val(chan) Channel/WirelessChannel
setze Wert(Eigenschaft) Ausbreitung/TwoRayGround
Wert festlegen (netif) Phy/WirelessPhy
Wert festlegen (mac) Mac/802_11
#Nachdem Sie das Protokoll auf DSR eingestellt haben, stellen Sie die Warteschlange auf CMUPriQueue ein
Wert festlegen (ifq) CMUPriQueue
setze Wert(ll) LL
Wert festlegen Antenne/Rundfunkantenne
setze Wert(ifqlen) 50
#Setzen Sie die Anzahl der Knoten vorab auf 0 und warten Sie auf die Benutzereingabe. Dieses Element erfordert eine Benutzereingabe, andernfalls wird die Simulation nicht durchgeführt.
setze Wert(nn) 0
Wert einstellen(rp) DSR
#Der Standardwert der Szenengröße beträgt 1000*1000
setze Wert(x) 1000
setze Wert(y) 1000
#Der Standardradius des Kreises beträgt 400
Wert einstellen(r) 400
#Dieses Verfahren wird zum Drucken auf dem Bildschirm verwendet. Geben Sie ns circle.tcl im Terminal ein und fügen Sie dann den Parameter format proc usage {} { hinzu.
  global argv0
  setzt "\nusage: $argv0 \[-nn nodes\] \[-rr\] \[-xx\] \[-yy\]\n"
  fügt „Hinweis: \[-nn Knoten\] ist wichtig, die anderen sind optional.\n“ ein.
}
#Dieses Verfahren wird verwendet, um die Werte einiger voreingestellter Parameter entsprechend der Benutzereingabe zu ändern. proc getval {argc argv} {
  globaler Wert
  lappend vallist nn rxyz
  #argc ist die Anzahl der Parameter, argv ist der String, der aus den gesamten Parametern für {set i 0} {$i < $argc} {incr i} { besteht.
    #Die Variable arg ist der i-te Teil von argv, getrennt durch Leerzeichen. setze arg [lindex $argv $i]
    #Überspringe die Zeichenfolge ohne das Zeichen "-", das normalerweise eine vom Benutzer eingegebene Zahl ist. #Zeichenfolgenbereich $arg mn bedeutet, das m-te Zeichen bis zum n-ten Zeichen der Zeichenfolge $arg zu nehmen, wenn {[Zeichenfolgenbereich $arg 0 0] != "-"} weiter
    Name festlegen [Zeichenfolgebereich $arg 1 Ende]
    #Voreingestellte Variablen ändern (Anzahl der Knoten, Radius, Szenengröße)
    setze Wert($name) [lindex $argv [Ausdruck $i+1]]
  }
}
#Rufen Sie die getval-Prozedur auf getval $argc $argv
#Der Benutzer hat keine Parameter eingegeben, sondern nur ns circle.Tcl eingegeben, daher wird angenommen, dass die Anzahl der Knoten 0 ist
wenn { $val(nn) == 0 } {
  #Drucknutzung
  Ausfahrt
}

#Erstellen Sie einen Simulationsinstanzsatz ns [neuer Simulator]

#Setzen Sie die Aufzeichnungsdatei set tracefd [open circle.tr w]
$ns alles verfolgen $tracefd
setze namtracefd [öffne Kreis.nam w]
$ns namtrace-alles-drahtlos $namtracefd $val(x) $val(y)

#Schließen Sie die Trace-Datei und rufen Sie das Programm nam auf, um die Animation zu demonstrieren. proc finish { } {
	global ns tracefd namtracefd
	$ ns Flush-Trace
	schließen $tracefd
	schließen $namtracefd
	ausführen nam kreis.nam &
	Ausfahrt 0
}

Topo setzen [neue Topographie]
$topo load_flatgrid $val(x) $val(y)

Gott erschaffen $val(nn)
#Knotenkonfiguration. Aus Versionsgründen ist addressType auf def gesetzt
$ns Knotenkonfiguration -addressType def\
-adhocRouting $val(rp) \
    -llTyp $val(ll) \
    -macTyp $val(mac)\
    -ifqTyp $val(ifq) \
    -ifqLen $val(ifqlen) \
    -antType $val(ant) \
    -propTyp $val(prop) \
    -phyType $val(netif) \
    -channelType $val(chan) \
    -topoInstance $topo \
    -agenttrace EIN \
    -routertrace EIN \
    -mactrace AUS \
    -Bewegungstrace AUS

# Initialisiere den Knoten für {set i 0} {$i < $val(nn)} {incr i} {
#Erstellen Sie einen Knotensatz node_($i) [$ns node]
$node_($i) Zufallsbewegung 0
#Berechnen Sie die Knotenposition und legen Sie sie mithilfe trigonometrischer Funktionen fest: $node_($i) set X_ [expr $val(r) * cos($i * 2 * 3.14159 / $val(nn))]
  $node_($i) setze Y_ [Ausdruck $val(r) * sin($i * 2 * 3,14159 / $val(nn))]
$node_($i) setze Z_ 0
#Stellen Sie die Anzeigegröße des mobilen Knotens in nam ein, andernfalls kann der Knoten nicht in nam angezeigt werden $ns initial_node_pos $node_($i) [expr $val(x) / 10]
}

#Erstellen Sie einen UDP-Agenten auf node_(0) set tcp [new Agent/UDP]
$ns Anhänge-Agent $node_(0) $tcp
#Erstellen Sie einen Datenempfänger auf dem Knoten gegenüber dem Knoten (0) entlang des Durchmessersatzes null [neuer Agent/Null].
$ns Attach-Agent $node_([Ausdruck $val(nn)/2]) $null
#Erstellen Sie einen neuen CBR-Verkehrsgenerator mit einer Paketgröße von 500B und einem Intervall von 0,05 s
setze cbr [neue Anwendung/Verkehr/CBR]
$cbr setze Paketgröße_ 5000
$cbr Intervall_ 0,05 festlegen
#Verbinden Sie UDP und Null
$cbr Anhänge-Agent $tcp
$ns verbinden $tcp $null
#Daten nach 0,1 s senden, Daten nach 3,0 s beenden und den Abschlussprozess nach 5,0 s aufrufen $ns bei 0,1 „$cbr start“
$ns bei 3.0 „$cbr Stopp“
$ns bei 5.0 „fertig“
$ns laufen

2. Gawk-Skriptcodeanalyse.awk-Kommentare

BEGINNEN {
#Anfangsvariablen festlegen num_D = 0; #Anzahl verlorener Pakete num_s = 0; #Anzahl gesendeter Pakete num_r = 0; #Anzahl empfangener Pakete rate_drop = 0; #Paketverlustrate sum_delay = 0; #Gesamtverzögerungszeit average_delay = 0; #Durchschnittliche Verzögerungszeit}
{
	#Lesen Sie den Trace-Dateidatensatz event = $1; #Die erste Spalte ist der Paketvorgang (s ist das gesendete Paket, r ist das empfangene Paket)
	Zeit = $2; #Die zweite Spalte ist die Operationszeit Knoten = $3; #Die dritte Spalte ist die Knotennummer Trace_Type = $4; #Die vierte Spalte ist die Operationsebene Flag = $5; #Die fünfte Spalte ist die Flagge UID = $6; #Die sechste Spalte ist die Knotenkennung Pkt_Type = $7; #Die siebte Spalte ist der Pakettyp Pkt_Size = $8; #Die achte Spalte ist die Paketgröße #Operation if (event == "s" && Trace_Type == "AGT" && Pkt_Type == "cbr")
	{ send_time[uid] = time; #Erstellen Sie ein Array, um die Zeit des Sendens von Paketen aufzuzeichnen num_s++; #Zeichnen Sie die Gesamtzahl der gesendeten Pakete auf }
	wenn (Ereignis == "r" && Trace-Typ == "AGT" && Pkt-Typ == "cbr")
	{ delay[uid] = time - send_time[uid]; #Erstellen Sie ein Array, um die Verzögerungszeit aufzuzeichnen num_r++; #Zeichnen Sie die Gesamtzahl der empfangenen Pakete auf }
	wenn (Ereignis == "D" und pkt_Typ == "cbr")
		delay[uid] = -1; #-1 bedeutet, dass das Paket verloren gegangen ist und das Paket in der Verzögerungszeit nicht aufgezeichnet wird}

ENDE {
	#Berechnen Sie die Anzahl der Paketverluste und die Paketverlustrate num_D = num_s-num_r; #Gesamtzahl der Paketverluste rate_drop = num_D / num_s * 100,0; #Berechnen Sie die Paketverlustrate	
	#Verzögerung für (i = 0; i < num_s; i++) berechnen
		{wenn (Verzögerung[i] >= 0)
			Summe_Verzögerung += Verzögerung[i];
		}#Gesamtverzögerungszeit average_delay = sum_delay / num_r; #Durchschnittliche Verzögerungszeit #Ergebnisse drucken printf("Anzahl der verlorenen Pakete: %d \n",num_D);
	printf("Anzahl der gesendeten Pakete: %d \n",num_s);
	printf("Abwurfrate: %.3f%% \n",rate_drop);
	printf("durchschnittliche Verzögerungszeit: %.9f \n",average_delay);
}

3. Experimentelle Ergebnisse

(1)

Die Anzahl der Netzwerkknoten ist auf 12 eingestellt. Die laufenden Ergebnisse sind wie folgt und es werden zwei Datensatzdateien, eine NAM-Datei und eine Trace-Datei, generiert.


Derzeit beträgt die Größe der Trace-Datei 91,8 KB und die Größe der NAM-Datei 76,0 KB.



Verwenden Sie als Nächstes das Gawk-Tool, um die generierte Trace-Datei zu analysieren. Wenn das Gawk-Tool nicht installiert ist, führen Sie den Befehl sudo apt-get install gawk aus, um es zu installieren.
Die erhaltenen Ergebnisse sind die Anzahl der Paketverluste, die Anzahl der gesendeten Pakete, die Paketverlustrate und die durchschnittliche Verzögerung während des Netzwerksimulationsprozesses.


(2) Ändern Sie die Anzahl der Knoten erneut auf 8. Die laufenden Ergebnisse sind wie folgt. Dem Ordner werden jedoch keine zusätzlichen Dateien circle.nam und circle.tr hinzugefügt.


Beim Überprüfen der Eigenschaften der beiden Dateien stellten wir fest, dass sich ihre Größen geändert hatten, was darauf hindeutet, dass die Datensatzdateien der neu erstellten Netzwerksimulationsumgebung überschrieben worden waren.



Mit Gawk können auch die generierten Trace-Dateien analysiert werden. Es wurde festgestellt, dass mit der Anzahl der Netzwerkknoten die Paketverlustrate und die durchschnittliche Verzögerung zunahmen.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • CentOS7-Netzwerkkonfiguration unter virtueller VMware-Maschine (Host für drahtlosen Internetzugang)
  • Tutorial zum Ändern der IP-Adresse einer virtuellen Linux-Maschine, Überprüfen des Gateways und Konfigurieren der Netzwerkumgebung
  • Implementierung der CentOS8.0-Netzwerkkonfiguration
  • Tutorial-Diagramm zur LAN-Netzwerkkonfiguration für virtuelle Maschinen von VMWare 15.X
  • Detaillierte Erläuterung der Schritte zur Konfiguration des Centos7-Bridge-Netzwerks unter VMware
  • Linux-Anfänger konfigurieren in virtuellen Maschinen IP und starten das Netzwerk neu
  • Detaillierte Erklärung der NAT-Konfiguration im Linux-Netzwerk
  • So konfigurieren Sie DNS im Standard-Bridge-Netzwerk von Docker

<<:  Grafisches Tutorial zur Konfigurationsmethode für die kostenlose Installationsversion von MySQL 8.0.21

>>:  Zusammenfassung der domänenübergreifenden Problembehandlung und -lösungen von Vue

Artikel empfehlen

Seitenlayout für Bootstrap 3.0-Lernnotizen

Dieses Mal werden wir hauptsächlich etwas über da...

So fügen Sie Div-Elementen abgerundete Ränder hinzu

Wie unten dargestellt: CSS- CodeInhalt in die Zwi...

MySQL Router implementiert MySQL Lese-/Schreibtrennung

Inhaltsverzeichnis 1. Einleitung 2. MySQL-Router ...

Eine einfache Möglichkeit, Desktop-Exe-Programme auf einer Webseite aufzurufen

Dieser Artikel stellt hauptsächlich vor, wie Deskt...

Funktionsüberladung in TypeScript

Inhaltsverzeichnis 1. Funktionssignatur 2. Funkti...

JavaScript Dom implementiert das Prinzip und Beispiel eines Karussells

Wenn wir ein Karussell bauen wollen, müssen wir z...

ElementUI implementiert kaskadierenden Selektor

In diesem Artikelbeispiel wird der spezifische Co...