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. (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:
|
>>: Zusammenfassung der domänenübergreifenden Problembehandlung und -lösungen von Vue
Inhaltsverzeichnis Vorwort 1. Binärer Baum 1.1. D...
Dieses Mal werden wir hauptsächlich etwas über da...
Der erste Schritt beim Design ist immer die Optimi...
Wie unten dargestellt: CSS- CodeInhalt in die Zwi...
Inhaltsverzeichnis 1. Einleitung 2. MySQL-Router ...
In diesem Artikel werden hauptsächlich 6 Lösungen...
1. Unterabfrage MySQL 4.1 und höher unterstützen ...
Dieser Artikel stellt hauptsächlich vor, wie Deskt...
Inhaltsverzeichnis 1. Funktionssignatur 2. Funkti...
Wenn wir ein Karussell bauen wollen, müssen wir z...
1 Frage Der Server des Unternehmens verwendet Apa...
In diesem Artikel wird der spezifische Code von j...
Der Originalcode lautet: <div Klasse = "K...
In diesem Artikelbeispiel wird der spezifische Co...
Vorwort Um den Unterschied zwischen dem Hinzufüge...