ns-3 ağ simülatörü eğitimi. Bölüm 4

ns-3 ağ simülatörü eğitimi. Bölüm 4
1,2. bölüm
3. bölüm

4 Konsepte genel bakış
4.1 Temel soyutlamalar
4.1.1 Düğüm
4.1.2 Uygulama
4.1.3 Kanal
4.1.4 Ağ Cihazı
4.1.5 Topolojik asistanlar
4.2 İlk ns-3 betiği
4.2.1 Standart kod
4.2.2 Eklentiler
4.2.3 ns3 ad alanı
4.2.4 Günlük kaydı
4.2.5 Ana fonksiyon
4.2.6 Topoloji asistanlarını kullanma
4.2.7 Uygulamayı Kullanma
4.2.8 Simülatör
4.2.9 Komut dosyanızı oluşturma
4.3 ns-3 Kaynak kodu

Bölüm 4

Konsepte genel bakış

Ns-3 kodunu öğrenmeye veya yazmaya başlamadan önce yapmamız gereken ilk şey sistemdeki birkaç temel kavramı ve soyutlamayı açıklamaktır. Bunların çoğu bazılarına açık görünebilir, ancak sağlam bir temelle başladığınızdan emin olmak için bu bölümü okumaya zaman ayırmanızı öneririz.

4.1 Temel soyutlamalar

Bu bölümde web'de yaygın olarak kullanılan ancak ns-3'te belirli bir anlamı olan bazı terimlere bakacağız.

4.1.1 Düğüm

İnternet jargonunda, bir ağa bağlanan bir bilgisayar cihazına ana bilgisayar veya bazen de uç sistem adı verilir. Ns-3 bir İnternet simülatörü değil de bir ağ simülatörü olduğundan, bu İnternet ve protokolleriyle yakından ilişkili olduğundan, ana bilgisayar terimini bilinçli olarak kullanmıyoruz. Bunun yerine, diğer simülatörler tarafından da kullanılan, grafik teorisinden kaynaklanan daha genel bir terim kullanıyoruz: düğüm (düğüm).

Ns-3'te, bir bilgi işlem cihazının temel soyutlamasına düğüm adı verilir. Bu soyutlama C++'da Node sınıfı tarafından temsil edilir. Sınıf DüğümDüğüm (düğüm), simülasyonlardaki bilgi işlem cihazlarının temsillerini değiştirmek için yöntemler sağlar.

Anlamak zorundasın Düğüm işlevsellik eklediğiniz bir bilgisayar gibi. Bilgisayarın yararlı işler yapmasına olanak tanıyan sürücülere sahip uygulamalar, protokol yığınları ve çevre birimi kartları gibi şeyleri ekleyeceksiniz. Ns-3'te de aynı temel modeli kullanıyoruz.

4.1.2 Uygulama

Genel olarak bilgisayar yazılımı iki geniş sınıfa ayrılır. Sistem yazılımı, bellek, işlemci döngüleri, disk, ağ vb. gibi çeşitli bilgisayar kaynaklarını bazı hesaplama modellerine göre düzenler. Sistem yazılımı genellikle bu kaynakları doğrudan kullanıcıya fayda sağlayan görevleri gerçekleştirmek için kullanmaz. Bir kullanıcı genellikle belirli bir hedefe ulaşmak için sistem yazılımı tarafından kontrol edilen kaynakları elde eden ve kullanan bir uygulamayı çalıştırır.

Genellikle sistem ile uygulama yazılımı arasındaki ayrım çizgisi, işletim sistemi tuzaklarında meydana gelen ayrıcalık düzeyindeki değişikliklerde çizilir. ns-3'ün gerçek bir işletim sistemi kavramı yoktur ve dolayısıyla ayrıcalık düzeyleri veya sistem çağrıları kavramı da yoktur. Ancak bir uygulama fikrimiz var. Tıpkı "gerçek dünyadaki" yazılım uygulamalarının görevleri gerçekleştirmek için bilgisayarlarda çalıştırılması gibi, ns-3 uygulamaları da simüle edilmiş dünyadaki simülasyonları kontrol etmek için ns-3 düğümleri üzerinde çalışır.

Ns-3'te modelleme için bazı aktiviteler üreten bir kullanıcı programının temel soyutlaması bir uygulamadır. Bu soyutlama C++'da Application sınıfı tarafından temsil edilir. Uygulama sınıfı, simülasyonlardaki uygulamaların kullanıcı düzeyindeki versiyonlarının görünümlerini değiştirmek için yöntemler sağlar. Geliştiricilerin yeni uygulamalar oluşturmak için Uygulama sınıfını nesne yönelimli programlama anlamında uzmanlaştırmaları bekleniyor. Bu derste, Application sınıfının uzmanlıklarını kullanacağız. UdpEchoClientUygulaması и UdpEchoSunucu Uygulaması. Tahmin edebileceğiniz gibi bu uygulamalar, ağ paketlerini oluşturmak ve yankılamak için kullanılan bir dizi istemci/sunucu uygulamasını oluşturur.

4.1.3 Kanal

Gerçek dünyada bir bilgisayarı bir ağa bağlayabilirsiniz. Genellikle bu ağlarda verilerin iletildiği ortamlara kanal adı verilir. Ethernet kablosunu duvar prizine taktığınızda bilgisayarınızı bir Ethernet bağlantısına bağlarsınız. Simüle edilmiş ns-3 dünyasında, bir iletişim kanalını temsil eden bir nesneye bir düğüm bağlanır. Burada iletişim alt ağının temel soyutlamasına kanal adı verilir ve C++'da Channel sınıfı tarafından temsil edilir.

sınıf KanalKanal alt ağ nesnelerinin etkileşimini yönetmek ve düğümleri bunlara bağlamak için yöntemler sağlar. Kanallar geliştiriciler tarafından nesne yönelimli programlama anlamında da özelleştirilebilir. Kanal uzmanlığı tel kadar basit bir şeyi modelleyebilir. Özel bir kanal aynı zamanda büyük bir Ethernet anahtarı veya kablosuz ağlarda engellerle dolu üç boyutlu bir alan gibi karmaşık şeyleri de modelleyebilir.

adlı bu eğitimde kanalın özel sürümlerini kullanacağız. CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiKanalWifiKanal. CsmaKanalörneğin, taşıyıcı algılamalı çoklu erişim iletişim ortamını uygulayan bir iletişim alt ağının bir versiyonunu modeller. Bu bize Ethernet benzeri işlevsellik sağlar.

4.1.4 Ağ Cihazı

Eskiden bir bilgisayarı bir ağa bağlamak istiyorsanız, belirli bir ağ kablosu ve bilgisayara takılması gereken (PC terminolojisinde) çevresel kart adı verilen bir donanım aygıtı satın almanız gerekiyordu. Bir çevre birimi kartı bazı ağ işlevlerini uyguluyorsa, bunlara ağ arayüz kartları veya ağ kartları adı veriliyordu. Günümüzde çoğu bilgisayar entegre ağ arayüzü donanımıyla birlikte gelir ve kullanıcılar tarafından ayrı cihazlar olarak görülmez.

Bir ağ kartı, donanımını kontrol eden bir yazılım sürücüsü olmadan çalışmaz. Unix'te (veya Linux'ta), bir çevre birimi ekipmanı cihaz olarak sınıflandırılır. Cihazlar, cihaz sürücüleri kullanılarak yönetilir ve ağ cihazları (NIC'ler), ağ cihazı sürücüleri (ağ aygıtı sürücüleri) ve toplu olarak ağ cihazları (ağ cihazları). Unix ve Linux'ta ağ aygıtlarını aşağıdaki gibi adlarla adlandırırsınız: eth0.

Ns-3'te ağ cihazı soyutlaması hem yazılım sürücüsünü hem de modellenen donanımı kapsar. Simülasyonda, bir ağ cihazı, bir düğümün kanallar aracılığıyla diğer düğümlerle iletişim kurmasına olanak sağlamak için "kurulmuştur". Tıpkı gerçek bir bilgisayar gibi, bir düğüm birden fazla cihaz aracılığıyla birden fazla kanala bağlanabilir NetCihazlar.

Bir aygıtın ağ soyutlaması C++'da sınıf tarafından temsil edilir NetCihaz... Sınıf NetCihaz Düğüm ve Kanal nesnelerine olan bağlantıları yönetmek için yöntemler sağlar; ve geliştiriciler tarafından nesne yönelimli programlama anlamında uzmanlaşılabilir. Bu derste NetDevice'in birkaç özel sürümünü kullanacağız. CsmaNetDevice, PointToPointNetCihaz и WifiNetCihazı. Tıpkı Ethernet ağ bağdaştırıcısının bir ağla çalışmak üzere tasarlandığı gibi Ethernet, CsmaNetDevice çalışmak üzere tasarlandı CsmaKanal, PointToPointNetCihaz çalışmak üzere tasarlandı PointToPointKanalVe WifiNetCihazı - çalışmak üzere tasarlandı WifiKanal.

4.1.5 Topolojik asistanlar

Gerçek bir ağda, ağ kartları eklenmiş (veya yerleşik) ana bilgisayarları bulacaksınız. Ns-3'te NetDevices'ın eklendiği düğümleri göreceğinizi söyleyebiliriz. Büyük bir simüle edilmiş ağda, birçok nesne arasındaki bağlantıları düzenlemeniz gerekecektir. Düğüm, NetCihaz и Telegram Kanal.

NetDevices'ı düğümlere bağladığınızdan beri, NetDevices'i bağlantılara bağladığınız, IP adreslerini atadığınız vb. ns-3'te ortak bir görev vardır; bunu mümkün olduğunca kolaylaştırmak için topoloji yardımcıları adı verilen yardımcılar sağlıyoruz. Örneğin, bir NetDevice oluşturmak için birçok ns-3 çekirdek işlemi gerçekleştirmeniz, bir MAC adresi eklemeniz, ağ cihazını Node'a kurmanız, düğümün protokol yığınını yapılandırmanız ve ardından NetDevice'i Kanala bağlamanız gerekir. Birden fazla cihazı çok noktalı bağlantılara bağlamak ve ardından bireysel ağları bir Internetworks ağına bağlamak için daha da fazla çalışma gerekecektir. Size kolaylık sağlamak için bu birçok işlemi kullanımı kolay bir modelde birleştiren topoloji yardımcı nesneleri sağlıyoruz.

4.2 İlk ns-3 betiği

Sistemi yukarıda önerildiği gibi kurduysanız, ns-3 sürümünü ana dizininizde repos adı verilen bir dizinde bulacaksınız. Dizine git serbest

Böyle bir dizininiz yoksa, bu, ns-3'ün yayın sürümünü oluştururken çıktı dizinini belirtmediğiniz anlamına gelir; şu şekilde oluşturun:
$ ./waf yapılandırma —build-profile=release —out=build/release,
$ ./waf yapı

orada aşağıdakine benzer bir dizin yapısı görmelisiniz:

AUTHORS       examples      scratch       utils       waf.bat*
bindings      LICENSE       src           utils.py    waf-tools
build         ns3           test.py*      utils.pyc   wscript
CHANGES.html  README        testpy-output VERSION     wutils.py
doc           RELEASE_NOTES testpy.supp   waf*        wutils.pyc

Dizine git örnekler/eğitici. Orada bulunan bir dosyayı görmelisiniz. ilk.cc. Bu, iki düğüm arasında noktadan noktaya basit bir bağlantı oluşturacak ve düğümler arasında bir paket iletecek bir komut dosyasıdır. Bu scripte satır satır bakalım; bunun için favori editörünüzde First.cc dosyasını açın.

4.2.1 Standart kod
Dosyadaki ilk satır editör modu satırıdır emacs. Emacs'a kaynak kodumuzda kullandığımız biçimlendirme kuralları (kodlama stili) hakkında bilgi verir.

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */

Bu her zaman oldukça tartışmalı bir konudur, bu yüzden bunu bir an önce ortadan kaldırmak için rekoru doğrudan ayarlamamız gerekiyor. Ns-3 projesi, çoğu büyük proje gibi, katkıda bulunulan tüm kodların uyması gereken bir kodlama stilini benimsemiştir. Kodunuzu projeye katkıda bulunmak istiyorsanız, dosyada açıklandığı gibi eninde sonunda ns-3 kodlama standardına uymanız gerekecektir. doc/codingstd.txt veya proje web sayfasında gösterilir: https://www.nsnam.org/develop/contributing-code/coding-style/.

Ns-3 kodunun görünümüne ve yapısına alışmanızı ve kodumuzla çalıştığınızda bu standardı uygulamanızı öneririz. Tüm geliştirme ekibi ve katkıda bulunanlar, biraz homurdandıktan sonra bunu kabul etti. Yukarıdaki emacs mod satırı, eğer emacs editörünü kullanıyorsanız doğru biçimlendirmeyi kolaylaştırır.

Ns-3 simülatörü kullanılarak lisanslanır GNU Genel Kamu Lisansı. Her ns-3 dağıtım dosyasında uygun GNU yasal başlığını göreceksiniz. Çoğunlukla, aşağıda gösterilen GPL metninin ve yazarının üzerinde, ns-3 projesine katılan kurumlardan birine ait bir telif hakkı bildirimi göreceksiniz.

/* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License version 2 as 
* published by the Free Software Foundation; 
*
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
*/

4.2.2 Eklentiler

Kodun kendisi bir dizi dahil etme ifadesiyle başlar (dahil).

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"

Üst düzey komut dosyası kullanıcılarımızın sistemde bulunan çok sayıda başlık dosyasıyla başa çıkmalarına yardımcı olmak için bunları kullanımlarına göre büyük modüller halinde gruplandırıyoruz. Belirli bir modülde kullanılan tüm başlık dosyalarını yinelemeli olarak yükleyecek tek bir başlık dosyası sağlıyoruz. Tam olarak ihtiyacınız olan başlığı aramanız ve muhtemelen doğru bağımlılık listesini elde etmeniz yerine, size bir grup dosyayı büyük ayrıntı düzeyinde indirme olanağı sunuyoruz. Bu en etkili yaklaşım olmasa da senaryo yazmayı kesinlikle çok daha kolay hale getiriyor.

Ns-3 içerme dosyalarının her biri, adlı bir dizine yerleştirilir. ns3 (derleme alt dizini) derleme işlemi sırasında dosya adı çakışmalarını önlemek için. Dosya ns3/core-module.h dizinde bulacağınız ns-3 modülüne karşılık gelir kaynak/çekirdek yüklediğiniz sürümde. Bu dizinin listesinde çok sayıda başlık dosyası bulacaksınız. Montajı yaptığınızda, WAF genel başlık dosyalarını bir alt dizindeki ns3 dizinine yerleştirir inşa/hata ayıklama

Böyle bir dizininiz yoksa, bu, ns-3'ün yayın sürümünü oluştururken çıktı dizinini belirtmediğiniz anlamına gelir; şu şekilde oluşturun:
$ ./waf yapılandırma --build-profile=debug --out=build/debug
$ ./waf yapı
veya
$ ./waf yapılandırma --build-profile=optimized --out=build/optimized
$ ./waf yapı

veya inşa/optimize edilmişyapılandırmanıza bağlı olarak. WAF ayrıca tüm genel başlık dosyalarını yüklemek için otomatik olarak bir modül içerme dosyası oluşturacaktır. Elbette bu kılavuzu dini olarak takip ettiğiniz için zaten bunu yapmışsınızdır.

$ ./waf -d debug --enable-examples --enable-tests configure

projeyi örnekler ve testler içeren hata ayıklama yapılarını çalıştıracak şekilde yapılandırmak için. Sen de yaptın

$ ./waf

projeyi bir araya getirmek için. Şimdi dizine baktığınızda ../../build/debug/ns3, orada diğerlerinin yanı sıra yukarıda gösterilen dört modülün başlık dosyalarını bulacaksınız. Bu dosyaların içeriğine bakabilir ve bunların ilgili modüller tarafından kullanılan tüm genel dosyaları içerdiğini görebilirsiniz.

4.2.3 ns3 ad alanı

Komut dosyasındaki sonraki satır ilk.cc bir ad alanı bildirimidir.

using namespace ns3;

Ns-3 projesi, ns3 adı verilen bir C++ ad alanında uygulanır. Bu, ns-3 ile ilgili tüm bildirimleri genel ad alanı dışındaki bir kapsamda gruplandırır ve bunun diğer kodlarla entegrasyona yardımcı olacağını umarız. C++ operatörünün kullanılması, ns-3 ad alanını geçerli (genel) bildirimsel bölgeye tanıtır. Bu, bu bildirimden sonra, onu kullanmak için tüm ns-3 kodunuzdan önce ns3::scope izin operatörünü yazmanıza gerek kalmayacağını söylemenin süslü bir yoludur. Ad alanlarına aşina değilseniz hemen hemen tüm C++ eğitimlerine bakın ve std ad alanını ve bildirimini kullanarak ns3 ad alanını karşılaştırın. using namespace std; çıkış operatörüyle çalışma örnekleri cout ve akışlar.

4.2.4 Günlük kaydı

Komut dosyasının bir sonraki satırı:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Bu beyanı dokümantasyon sistemimizi tartışmak için uygun bir yer olarak kullanacağız Doxygen. ns-3 proje web sitesine bakarsanız, gezinme çubuğunda bir Belgeler bağlantısı bulacaksınız. Bu bağlantıya tıklarsanız dokümantasyon sayfamıza yönlendirileceksiniz. Sizi ns-3'ün en son kararlı sürümünün belgelerine götürecek bir "En Son Sürüm" bağlantısı bulunmaktadır. "API Dokümantasyonu" bağlantısını seçerseniz ns-3 API dokümantasyonu sayfasına yönlendirileceksiniz.

Sayfanın sol tarafında dokümantasyon yapısının grafiksel bir temsilini bulacaksınız. Başlamak için iyi bir yer, ns-3 gezinme ağacındaki Modüller ns-3 "kitabıdır". eğer ifşa edersen Modüllerns-3 modül belgelerinin bir listesini göreceksiniz. Yukarıda tartışıldığı gibi buradaki modül kavramı doğrudan yukarıdaki modülde yer alan dosyalarla ilgilidir. Ns-3 günlük kaydı alt sistemi bölümde tartışılmaktadır. Günlük Modülünü Kullanma, bu eğitimin ilerleyen kısımlarında buna geri döneceğiz, ancak yukarıdaki ifadeyi modüle bakarak öğrenebilirsiniz. çekirdekve sonra kitabı açıyorum Hata ayıklama araçlarıve ardından sayfayı seçiyoruz Günlüğü. Tıklamak Günlüğü.

Şimdi belgeleri incelemelisiniz Doxygen modül için Günlüğü. Sayfanın üst kısmındaki makrolar listesinde NS_LOG_COMPONENT_DEFINE için bir giriş göreceksiniz. Bağlantıya tıklamadan önce genel olarak nasıl çalıştığını anlamak için kayıt modülünün “Ayrıntılı Açıklama” kısmına mutlaka bakın. Bunu yapmak için aşağı kaydırabilir veya grafiğin altındaki "Diğer..." seçeneğini seçebilirsiniz.

Neler olup bittiğine dair genel bir fikriniz olduğunda, devam edin ve spesifik NS_LOG_COMPONENT_DEFINE için belgelere bakın. Belgeleri burada çoğaltmayacağım, ancak özetlemek gerekirse, bu satır, adı verilen bir kayıt bileşenini bildirir. FirstScriptÖrneği, bir ada referansla mesajların konsolda günlüğe kaydedilmesini etkinleştirmenize veya devre dışı bırakmanıza olanak tanır.

4.2.5 Ana fonksiyon

Komut dosyasının aşağıdaki satırlarında göreceksiniz,

int 
main (int argc, char *argv[])
{ 

Bu sadece programınızın (komut dosyası) ana işlevinin bir beyanıdır. Herhangi bir C++ programında olduğu gibi, bir ana fonksiyon tanımlamanız gerekir, önce bu çalıştırılır. Burada özel bir şey yok. Ns-3 betiğiniz yalnızca bir C++ programıdır. Aşağıdaki satır, zaman çözünürlüğünü varsayılan olan 1 nanosaniyeye ayarlar:

Time::SetResolution (Time::NS);

Zaman çözünürlüğü veya basitçe çözünürlük, kullanılabilecek en küçük zaman değeridir (iki zaman arasındaki temsil edilebilir en küçük fark). Çözünürlüğü tam olarak bir kez değiştirebilirsiniz. Bu esnekliği sağlayan mekanizma hafızayı tüketir, dolayısıyla çözünürlük açıkça ayarlandıktan sonra hafızayı serbest bırakarak daha fazla güncelleme yapılmasını engelleriz. (Çözünürlüğü açıkça ayarlamazsanız, varsayılan olarak bir nanosaniyeye ayarlanır ve simülasyon başladığında bellek serbest bırakılır.)

Aşağıdaki iki komut dosyası satırı, uygulamalarda yerleşik olan iki günlük kaydı bileşenini etkinleştirmek için kullanılır EchoClient и EchoSunucu:

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

Günlük kaydı bileşeninin belgelerini okursanız, her bileşende etkinleştirebileceğiniz çeşitli düzeyde günlük kaydı/ayrıntı düzeyi olduğunu göreceksiniz. Bu iki kod satırı, yankı istemcileri ve sunucuları için INFO düzeyinde hata ayıklama günlüğünü etkinleştirir. Bu seviyede uygulama, simülasyon sırasında paket gönderip alırken mesajları yazdıracaktır.

Şimdi topolojiyi oluşturma ve simülasyonu çalıştırma işine geçeceğiz. Bu işi olabildiğince kolaylaştırmak için topoloji yardımcı nesnelerini kullanıyoruz.

4.2.6 Topoloji asistanlarını kullanma

Komut dosyamızdaki sonraki iki kod satırı aslında simülasyondaki bilgisayarları temsil edecek Node ns-3 nesnelerini oluşturacaktır.

NodeContainer nodes;
nodes.Create (2);

Devam etmeden önce sınıfın belgelerini bulalım DüğümKonteyner. Belirli bir sınıfın belgelerine ulaşmanın başka bir yolu da sekmeyi kullanmaktır Sınıflar sayfalarda Doxygen. Doxygen'iniz zaten açıksa sayfanın en üstüne gidip Sınıflar sekmesini seçmeniz yeterlidir. Biri sınıf listesi olan yeni bir sekme kümesi görmelisiniz. Bu sekmenin altında tüm ns-3 sınıflarının bir listesini göreceksiniz. Aşağıya doğru kaydır ns3::NodeContainer. Bir sınıf bulduğunuzda sınıfın belgelerine gitmek için onu seçin.

Hatırladığımız gibi, temel soyutlamalarımızdan biri düğümdür. Protokol yığınları, uygulamalar ve çevre birimleri kartları gibi şeyleri ekleyeceğimiz bilgisayarı temsil eder. Topoloji asistanı DüğümKonteyner herhangi bir nesneyi oluşturmak, yönetmek ve erişmek için uygun bir yol sağlar DüğümSimülasyonu çalıştırmak için oluşturduğumuz . Yukarıdaki ilk satır basitçe şunu beyan eder: DüğümKonteyner, biz buna düğümler diyoruz. İkinci satır, düğümler nesnesindeki Create yöntemini çağırır ve kapsayıcıdan iki düğüm oluşturmasını ister. Açıklandığı gibi Doxygen, konteyner ns-3 sisteminden iki nesne oluşturmasını ister Düğüm ve bu nesnelere yönelik işaretçileri dahili olarak saklar.

Komut dosyasında oluşturulan düğümler henüz hiçbir şey yapmıyor. Topolojiyi oluşturmanın bir sonraki adımı düğümlerimizi ağa bağlamaktır. Desteklediğimiz en basit ağ biçimi, iki düğüm arasındaki noktadan noktaya bağlantıdır. Şimdi böyle bir bağlantı oluşturacağız.

Noktadan NoktayaYardımcı

Bağlantı için gereken düşük seviyeli işi yapmak için bir topoloji yardımcı nesnesi kullanarak tanıdık bir model kullanarak noktadan noktaya bir bağlantı oluşturuyoruz. İki temel soyutlamamızın olduğunu hatırlayın NetCihaz и Telegram Kanal. Gerçek dünyada bu terimler kabaca çevresel kartlara ve ağ kablolarına karşılık gelir. Genellikle bu iki şey birbiriyle yakından ilişkilidir ve hiç kimse örneğin cihazlar gibi paylaşıma güvenemez. Ethernet kablosuz bir kanal üzerinden. Topoloji yardımcılarımız bu yakın ilişkiyi takip eder ve dolayısıyla bu senaryoda tek bir nesne kullanacaksınız. Noktadan NoktayaYardımcı ns-3 nesnelerini kurmak ve bağlamak için PointToPointNetCihaz и PointToPointKanal. Komut dosyasındaki sonraki üç satır:

PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); 
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

İlk satır,

PointToPointHelper pointToPoint;

yığında bir nesnenin örneğini oluşturur Noktadan NoktayaYardımcı. Üst düzey bir bakış açısından aşağıdaki satır,

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

nesneyi söyler Noktadan NoktayaYardımcı "5 Mbit/s" (saniyede beş megabit) değerini " olarak kullanınVeri hızı'.

Daha spesifik bir bakış açısından "DataRate" dizisi, nitelik dediğimiz şeye karşılık gelir. PointToPointNetCihaz. Eğer bakarsanız Doxygen sınıf için ns3::PointToPointNetDevice ve yöntemin belgelerinde GetTypeId cihaz için tanımlanan özelliklerin bir listesini bulacaksınız. Bunlar arasında “özellik” yer alacakVeri hızı" Kullanıcıların görebildiği çoğu ns-3 nesnesi benzer nitelik listelerine sahiptir. Bir sonraki bölümde göreceğiniz gibi simülasyonu yeniden derlemeye gerek kalmadan kolayca kurmak için bu mekanizmayı kullanıyoruz.

Benzer "Veri hızı" PointToPointNetDevice'de PointToPointChannel ile ilişkili "Gecikme" özelliğini bulacaksınız. Son satır

pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

diyor Noktadan NoktayaYardımcı sonradan oluşturduğu noktadan noktaya bağlantı için yayılma gecikme değeri olarak "2 ms" (iki milisaniye) değerini kullanın.

NetCihazKonteyner

Şu anda elimizde senaryo var DüğümKonteyner, iki düğüm içerir. Sahibiz Noktadan NoktayaYardımcınesneler oluşturmak için hazırlanan PointToPointNetCihazlar ve onları bir PointToPointChannel nesnesi kullanarak bağlamak. Tıpkı NodeContainer topolojisi yardımcı nesnesini düğüm oluşturmak için kullandığımız gibi, şunu soracağız: Noktadan NoktayaYardımcı cihazlarımızın oluşturulması, yapılandırılması ve kurulumuyla ilgili çalışmaları bizim için gerçekleştirmek. Oluşturulan tüm nesnelerin bir listesine ihtiyacımız var NetCihaz, yani kullanıyoruz NetCihazKonteyner onları kullandığımız şekilde saklamak için DüğümKonteyner oluşturduğumuz düğümleri depolamak için. Sonraki iki kod satırı,

NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);

cihaz ve kanal kurulumunu tamamlayın. İlk satır yukarıda bahsedilen cihaz konteynerini bildirir, ikincisi ise ana işi yapar. Yöntem kurmak nesne Noktadan NoktayaYardımcı alır DüğümKonteyner parametre olarak. İçeri NetCihazKonteyner bulunan her düğüm için DüğümKonteyner oluşturulur (noktadan noktaya iletişim için bunlardan tam olarak iki tane olmalıdır) PointToPointNetCihaz cihaz kapsayıcısında oluşturulur ve kaydedilir. PointToPointKanal yaratılır ve ona iki tanesi eklenir PointToPointNetCihazlar. Nesneler oluşturulduktan sonra, içinde saklanan nitelikler Noktadan NoktayaYardımcı, oluşturulan nesnelerde karşılık gelen nitelikleri başlatmak için kullanılır.

Bir arama yaptıktan sonra pointToPoint.Install (düğümler) her birinde noktadan noktaya ağ aygıtı kurulu olan ve aralarında bir noktadan noktaya bağlantı bulunan iki düğümümüz olacak. Her iki cihaz da, kanal üzerinden iki milisaniyelik iletim gecikmesiyle saniyede beş megabit hızında veri iletecek şekilde yapılandırılacak.

İnternet Yığını Yardımcısı

Artık yapılandırılmış düğümlerimiz ve cihazlarımız var, ancak düğümlerimizde kurulu protokol yığınları yok. Sonraki iki kod satırı bununla ilgilenecek.

InternetStackHelper stack;
stack.Install (nodes);

İnternet Yığını Yardımcısı - noktadan noktaya ağ aygıtları için PointToPointHelper'a benzer şekilde İnternet yığınları için bir topoloji yardımcısıdır. Yöntem kurmak NodeContainer'ı parametre olarak alır. Yürütüldüğünde, her bir konteyner düğümüne İnternet yığınını (TCP, UDP, IP vb.) yükleyecektir.

IPv4AdresiYardımcısı

Daha sonra cihazlarımızı IP adresleriyle ilişkilendirmemiz gerekiyor. IP adresi tahsisini yönetmek için bir topoloji asistanı sağlıyoruz. Kullanıcının görebildiği tek API, gerçek adres dağıtımını yaparken kullanılacak temel IP adresini ve ağ maskesini ayarlamaktır (bu, yardımcı içinde daha düşük bir düzeyde yapılır). Örnek betiğimizdeki sonraki iki kod satırı ilk.cc,

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");

adres yardımcı nesnesini bildirin ve ona, belirlemek için 10.1.1.0 bit maskesini kullanarak ağ 255.255.255.0'dan IP adresleri tahsis etmeye başlaması gerektiğini söyleyin. Varsayılan olarak, tahsis edilen adresler birden başlayacak ve monoton bir şekilde artacaktır, dolayısıyla bu tabandan tahsis edilen ilk adres 10.1.1.1, ardından 10.1.1.2 vb. olacaktır. Gerçekte, düşük düzeyde, ns-3 sistemi tahsis edilen tüm IP adreslerini hatırlar ve yanlışlıkla aynı adresin iki kez oluşturulduğu bir durum yaratırsanız önemli bir hata üretir (bu arada, bu hatanın hatalarını ayıklamak zordur).

Aşağıdaki kod satırı,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

gerçek adres atamasını gerçekleştirir. Ns-3'te nesneyi kullanarak bir IP adresi ile bir cihaz arasında bağlantı kurarız. IPv4Arayüzü. Bazen asistan tarafından daha sonra kullanmak üzere oluşturulan bir ağ cihazları listesine ihtiyaç duyduğumuz gibi, bazen de bir nesne listesine ihtiyaç duyarız. IPv4Arayüzü. Ipv4InterfaceKonteyner bu işlevselliği sağlar.

Yığınların kurulu olduğu ve IP adreslerinin atandığı noktadan noktaya bir ağ kurduk. Artık trafik oluşturmak için her düğümde uygulamalara ihtiyacımız var.

4.2.7 Uygulamayı Kullanma

Ns-3 sisteminin ana soyutlamalarından bir diğeri de Uygulama (başvuru). Bu senaryoda iki temel sınıf uzmanlığı kullanıyoruz Uygulama ns-3 çağrıldı UdpEchoSunucu Uygulaması и UdpEchoClientUygulaması. Önceki durumlarda olduğu gibi, temel nesneleri yapılandırmak ve yönetmek için yardımcı nesneleri kullanıyoruz. Burada kullanıyoruz UdpEchoSunucu Yardımcısı и UdpEchoClientYardımHayatımızı kolaylaştıracak nesneler.

UdpEchoSunucu Yardımcısı

First.cc örnek betiğimizdeki aşağıdaki kod satırları, daha önce oluşturduğumuz düğümlerden birinde bir UDP yankı sunucusu uygulamasını yapılandırmak için kullanılır.

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

Yukarıdaki kod parçasındaki ilk kod satırı şunu oluşturur: UdpEchoSunucu Yardımcısı. Her zamanki gibi bu bir uygulamanın kendisi değil, gerçek uygulamalar oluşturmamıza yardımcı olan bir nesnedir. Kurallarımızdan biri, gerekli nitelikleri yardımcı nesnenin yapıcısına iletmektir. Bu durumda yardımcıya, sunucunun paketleri dinleyeceği port numarası verilmediği sürece yararlı bir şey yapamaz, bu numaranın istemci tarafından da bilinmesi gerekir. Bu durumda port numarasını yardımcı yapıcıya iletiriz. Yapıcı da basitçe şunu yapar: Özniteliği Ayarla geçirilen değerle. Daha sonra istenirse SetAttribute'u kullanarak Port niteliği için farklı bir değer ayarlayabilirsiniz.

Diğer birçok yardımcı nesne gibi nesne de UdpEchoSunucu Yardımcısı bir yöntemi var kurmak. Bu yöntemin etkili bir şekilde yürütülmesi, temel bir yankı sunucusu uygulaması oluşturur ve onu ana bilgisayara bağlar. İlginç bir şekilde, yöntem kurmak alır DüğümKonteyner tıpkı diğerleri gibi bir parametre olarak kurmak yöntemleri gördük.

Burada çalışan C++ örtülü dönüştürme yöntemin sonucunu alır node.Get(1) (düğüm nesnesine akıllı bir işaretçi döndürür - Ptr ) ve onu anonim nesne için yapıcıda kullanır DüğümKonteynerdaha sonra yönteme aktarılır kurmak. C++ kodunda hangi yöntem imzasının derlendiğini ve yürütüldüğünü belirleyemiyorsanız örtülü dönüşümlere bakın.

Şimdi şunu görüyoruz echoServer.Yükle uygulamayı yüklemek üzere UdpEchoSunucu Uygulaması Bulunduğu yerde DüğümKonteynerDüğümlerimizi yönetmek için kullandığımız, indeksi 1 olan düğüm. Yöntem kurmak tüm uygulamalara yönelik işaretçiler içeren bir kapsayıcı döndürecektir (bu durumda bir tane, çünkü anonim bir geçiş yaptık) DüğümKonteyner, bir düğüm içeren) yardımcı tarafından oluşturulmuştur.

Uygulamaların ne zaman trafik oluşturmaya başlayacağını belirtmesi gerekir "başlangıç" ve ayrıca ne zaman durdurulacağını da belirtmeniz gerekebilir "durmak". Her iki seçeneği de sunuyoruz. Bu zamanlar yöntemler kullanılarak ayarlanır UygulamaKonteyner Başlama и dur. Bu yöntemler tür parametrelerini kabul eder Zaman. Bu durumda, C++'ı almak için açık bir C++ dönüşüm dizisi kullanırız. çift 1.0 ve onu saniyelere dönüştürmek için Seconds nesnesini kullanan bir tns-3 Time nesnesine dönüştürün. Dönüştürme kurallarının model yazarı tarafından kontrol edilebileceğini ve C++'ın kendi kurallarına sahip olduğunu, dolayısıyla parametrelerin her zaman beklediğiniz şekilde dönüştürüleceğine güvenemeyeceğinizi unutmayın. İki çizgi

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

echo sunucusu uygulamasının simülasyon başladıktan bir saniye sonra başlamasına (otomatik olarak açılmasına) ve simülasyonun on saniyesinden sonra durmasına (kapanmasına) neden olacaktır. On saniye içinde gerçekleştirilecek bir simülasyon olayı (uygulama durdurma olayı) bildirdiğimiz için en az on saniyelik ağ çalışması simüle edilecektir.

UdpEchoClientYardımcısı

Müşteri Başvurusu kaçırmak sunucuya neredeyse benzer bir şekilde yapılandırılmıştır. Bir temel nesne var UdpEchoClientUygulamasıkontrol edilen
UdpEchoClientYardımcısı.

UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));;

Ancak echo istemcisi için beş farklı özellik ayarlamamız gerekiyor. İlk iki özellik oluşturma sırasında ayarlanır UdpEchoClientYardımcısı. Nitelikleri ayarlamak için kullanılan parametreleri (yardımcının içinde) iletiriz "UzakAdres" и "Uzaktan Bağlantı Noktası" anlaşmamıza uygun olarak gerekli parametreleri yardımcı kurucuya iletmek.

kullandığımızı hatırlayalım. Ipv4InterfaceKonteyner Cihazlarımıza atadığımız IP adreslerini takip etmek için. Arayüzler kapsayıcısındaki boş arabirim, düğümler kapsayıcısındaki boş düğümün IP adresine karşılık gelecektir. Arayüzler konteynerindeki ilk arayüz, düğümler konteynerindeki ilk düğümün IP adresine karşılık gelir. Yani kodun ilk satırında (yukarıda) bir yardımcı oluşturuyoruz ve ona istemcinin uzak adresinin, sunucunun bulunduğu ana makineye atanan IP adresi olacağını söylüyoruz. Ayrıca paketlerin dokuzuncu bağlantı noktasına gönderilmesini ayarlamamız gerektiğini de söylüyoruz.

"MaxPackets" özelliği, istemciye simülasyon sırasında gönderebileceğimiz maksimum paket sayısını bildirir. "Interval" özelliği müşteriye paketler arasında ne kadar süre bekleyeceğini söyler ve "PacketSize" özelliği müşteriye paketin yükünün ne kadar büyük olması gerektiğini söyler. Bu öznitelik kombinasyonuyla istemciye 1024 baytlık tek bir paket göndermesini söyleriz.

Echo sunucusunda olduğu gibi echo istemcisinin niteliklerini ayarlıyoruz. Başlama и dur, ancak burada istemciyi sunucu açıldıktan bir saniye sonra başlatıyoruz (simülasyonun başlamasından iki saniye sonra).

4.2.8 Simülatör

Bu noktada simülasyonu çalıştırmamız gerekiyor. Bu global fonksiyon kullanılarak yapılır. Simülatör::Çalıştır.

Simulator::Run ();

Daha önce yöntemleri çağırdığımızda,

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
... 
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

aslında simülatördeki etkinlikleri 1,0 saniyede, 2,0 saniyede ve iki olayı da 10,0 saniyede planladık. Aramadan sonra Simülatör::Çalıştır, sistem zamanlanmış olayların listesini görüntülemeye ve bunları yürütmeye başlayacaktır. İlk olarak 1,0 saniye sonra bir olayı tetikleyecek ve bu da yankı sunucusu uygulamasını tetikleyecektir (bu olay daha sonra birçok başka olayı planlayabilir). Daha sonra t=2,0 saniyede programlanan ve echo istemci uygulamasını başlatacak olan bir olayı tetikleyecektir. Yine bu etkinlik için daha birçok etkinlik planlanmış olabilir. Echo istemcisindeki start olayı uygulaması, sunucuya bir paket göndererek simülasyonun veri aktarım aşamasını başlatacaktır.

Sunucuya bir paket gönderme eylemi, sahne arkasında otomatik olarak programlanacak ve komut dosyasında belirlediğimiz zamanlama parametrelerine göre bir yankı paketi gönderme mekaniğini uygulayacak bir olaylar zincirini tetikleyecektir.

Sonuç olarak, yalnızca bir paket gönderdiğimiz için (özelliği unutmayın) Maksimum Paketler bir olarak ayarlandığında), bu tek istemci pingiyle başlatılan olaylar zinciri sona erecek ve simülasyon bekleme moduna geçecektir. Bu gerçekleştiğinde, kalan planlanmış etkinlikler etkinlikler olacaktır. dur sunucu ve istemci için. Bu olaylar yürütüldüğünde, daha fazla işlenecek olay kalmayacak ve Simülatör::Çalıştır kontrolü geri getirecek. Simülasyon tamamlandı.

Geriye kalan tek şey arkanızı temizlemek. Bu, global işlevi çağırarak yapılır. Simülatör::Yok Et. Çünkü, oluşturulan tüm nesneleri yok etmek için simülatöre kancalar yerleştirilecek şekilde düzenlenen yardımcı işlevler (veya düşük seviyeli ns-3 kodu) çağrıldı. Bu nesnelerin hiçbirini kendi başınıza takip etmenize gerek yoktu; tek yapmanız gereken aramaktı Simülatör::Yok Et ve dışarı çık. Ns-3 sistemi bu zor işi sizin için yapacak. İlk ns-3 betiğimizin (first.cc) geri kalan satırları tam da bunu yapar:

Simulator::Destroy ();
return 0;
}

Simülatör ne zaman duracak?

ns-3 bir ayrık olay (DE) simülatörüdür. Böyle bir simülatörde, her olay kendi yürütme süresiyle ilişkilendirilir ve simülasyon ilerledikçe olayları meydana gelme sırasına göre işleyerek simülasyon devam eder. Olaylar gelecekteki olayların planlanmasına neden olabilir (örneğin, bir zamanlayıcı bir sonraki aralıkta sayımı bitirmek için kendisini yeniden programlayabilir).

İlk olaylar genellikle varlık tarafından başlatılır; örneğin IPv6, ağdaki hizmetlerin, komşu isteklerinin vb. keşfedilmesini planlayacaktır. Uygulama ilk paket gönderme olayını zamanlar ve bu şekilde devam eder. Bir olay işlendiğinde sıfır, bir veya daha fazla olay üretebilir. Simülasyon ilerledikçe, biten veya yenilerini yaratan olaylar meydana gelir. Olay kuyruğu boşsa veya özel bir olay algılanırsa simülasyon otomatik olarak duracaktır. dur. Etkinlik dur fonksiyon tarafından oluşturulan Simülatör::Dur (durma zamanı).

Simülasyonu durdurmak için Simulator::Stop'un kesinlikle gerekli olduğu tipik bir durum vardır: kendi kendine devam eden olaylar olduğunda. Kendi kendine devam eden (veya tekrarlanan) olaylar, her zaman yeniden planlanan olaylardır. Sonuç olarak olay kuyruğunu her zaman boş tutmazlar. Tekrarlanan olayları içeren birçok protokol ve modül vardır, örneğin:

• FlowMonitor - kayıp paketlerin periyodik kontrolü;

• RIPng – yönlendirme tablosu güncellemelerinin periyodik yayını;

• vesaire.

Bu gibi durumlarda Simülatör::Dur Simülasyonu doğru şekilde durdurmak için gereklidir. Ek olarak, ns-3 emülasyon modundayken, RealtimeSimulator simülasyon saatini makine saatiyle senkronize etmek için kullanılır ve Simülatör::Dur Süreci durdurmak için gereklidir.

Ders kitabındaki simülasyon programlarının birçoğu Simülatör::Dur sıraya alınmış olaylar tükendiğinde otomatik olarak sona erdikleri için açıkça. Ancak bu programlar Simulator::Stop çağrısını da kabul edecektir. Örneğin, ilk örnek programdaki aşağıdaki ek ifade, 11 saniyede açık bir durma zamanlayacaktır:

+ Simulator::Stop (Seconds (11.0));
  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

Yukarıdakiler aslında bu programın davranışını değiştirmeyecektir çünkü bu özel simülasyon doğal olarak 10 saniye sonra sona erecektir. Ancak yukarıdaki ifadedeki durma süresini 11 saniyeden 1 saniyeye değiştirirseniz, herhangi bir çıktı ekrana gelmeden önce simülasyonun durduğunu fark edeceksiniz (çünkü çıktı, simülasyon süresinin yaklaşık 2 saniyesinden sonra meydana gelir).

Simulator::Run'u çağırmadan önce Simulator::Stop'u çağırmak önemlidir; aksi takdirde Simulator::Run, durdurmayı yürütmek için kontrolü asla ana programa geri vermeyebilir!

4.2.9 Komut dosyanızı oluşturma

Basit komut dosyalarınızı oluşturmayı önemsiz hale getirdik. Tek yapmanız gereken betiğinizi karalama dizinine koymak ve çalıştırırsanız otomatik olarak oluşturulacaktır. WAF. Hadi deneyelim. Üst düzey dizine geri dönün ve kopyalayın örnekler/eğitim/first.cc kataloğa git çizik

$ cd ../.. 
$ cp examples/tutorial/first.cc scratch/myfirst.cc

Şimdi kullanarak ilk örnek betiğinizi oluşturun. WAF:

$ ./waf

İlk örneğinizin başarıyla oluşturulduğunu belirten mesajları görmelisiniz.

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
[614/708] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
[706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (2.357s)

Artık örneği çalıştırabilirsiniz (programınızı karalama dizininde oluşturursanız, onu buradan çalıştırmanız gerektiğini unutmayın.) çizik):

$ ./waf --run scratch/myfirst

Benzer çıktıyı görmelisiniz:

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s) Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

Burada derleme sisteminin dosyanın oluşturulduğunu doğruladığını ve ardından onu çalıştırdığını görebilirsiniz. Echo istemcisindeki bileşen girişinin, echo sunucusu 1024'ye 10.1.1.2 baytlık tek bir paket gönderdiğini gösterdiğini görüyorsunuz. Siz de echo sunucusunda 1024'den 10.1.1.1 byte aldığını söyleyen loglama bileşenini görüyorsunuz. Yankı sunucusu paketi sessizce yeniden oynatır ve yankı istemcisinin günlüğünde paketini sunucudan geri aldığını görebilirsiniz.

4.3 ns-3 Kaynak kodu

Artık ns-3 yardımcılarından bazılarını kullandığınıza göre, bu işlevi uygulayan bazı kaynak kodlara göz atabilirsiniz. En son kodu web sunucumuzda aşağıdaki bağlantıdan görüntüleyebilirsiniz: https://gitlab.com/nsnam/ns-3-dev.git. Orada ns-3 geliştirme ağacımız için Mercurial özet sayfasını göreceksiniz. Sayfanın üst kısmında birkaç bağlantı göreceksiniz,

summary | shortlog | changelog | graph | tags | files

Devam edin ve dosyalar bağlantısını seçin. Depolarımızın çoğunun en üst seviyesi şu şekilde görünecektir:

drwxr-xr-x                               [up]
drwxr-xr-x                               bindings python  files
drwxr-xr-x                               doc              files
drwxr-xr-x                               examples         files
drwxr-xr-x                               ns3              files
drwxr-xr-x                               scratch          files
drwxr-xr-x                               src              files
drwxr-xr-x                               utils            files
-rw-r--r-- 2009-07-01 12:47 +0200 560    .hgignore        file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1886   .hgtags          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1276   AUTHORS          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 30961  CHANGES.html     file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 17987  LICENSE          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 3742   README           file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 16171  RELEASE_NOTES    file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 6      VERSION          file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 88110  waf              file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 28     waf.bat          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 35395  wscript          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 7673   wutils.py        file | revisions | annotate

Örnek scriptlerimiz dizinde bulunmaktadır. örnekler. Örneklere tıklarsanız alt dizinlerin bir listesini göreceksiniz. Alt dizindeki dosyalardan biri öğretici - ilk.cc. Eğer tıklarsan ilk.cc yeni öğrendiğiniz kodu göreceksiniz.

Kaynak kodu esas olarak dizinde bulunur src. Kaynak kodunu, dizin adına tıklayarak veya dizin adının sağındaki dosyalar bağlantısına tıklayarak görüntüleyebilirsiniz. Src dizinine tıklarsanız, src alt dizinlerinin bir listesini alırsınız. Daha sonra çekirdek alt dizine tıklarsanız, dosyaların bir listesini bulacaksınız. Göreceğiniz ilk dosya (bu kılavuzu yazarken) iptal. h. Bağlantıya tıklarsanız iptal. hiçin kaynak dosyaya gönderileceksiniz. iptal. hAnormal koşulların algılanması durumunda komut dosyalarından çıkmak için yararlı makrolar içeren. Bu bölümde kullandığımız yardımcıların kaynak kodu dizinde bulunabilir. src/Uygulamalar/yardımcı. Neyin nerede olduğunu bulmak ve ns-3 programlarının stilini anlamak için dizin ağacını araştırmaktan çekinmeyin.

Kaynak: habr.com

Yorum ekle