GoGPT Best VPN GoSearch

OnWorks favicon'u

ns-3-eğitici - Bulutta Çevrimiçi

Ubuntu Online, Fedora Online, Windows çevrimiçi öykünücüsü veya MAC OS çevrimiçi öykünücüsü üzerinden OnWorks ücretsiz barındırma sağlayıcısında ns-3 öğreticisini çalıştırın

Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen komut ns-3-eğiticisidir.

Program:

ADI


ns-3-eğitici - ns-3 Eğitimi

Bu ns-3 Klavuz. ns-3 projesi için birincil belgeler beş dosyada mevcuttur
formlar:

· ns-3 Doxygen: Simülatörün genel API'lerinin dokümantasyonu

· Öğretici (bu belge)için , Kılavuz ve Model Kitaplığı son serbest ve
geliştirme ağaç

· ns-3 wiki

Bu belgede yazılı reStructuredText için Sfenks ve içinde tutulur
belge/eğitici ns-3'ün kaynak kodunun dizini.

TANITIM


The ns-3 simülatör, öncelikle araştırma için hedeflenen ayrık olaylı bir ağ simülatörüdür.
ve eğitim amaçlı kullanım. NS ns-3 proje, 2006 yılında başlayan açık kaynaklı bir projedir
gelişen ns-3.

Bu öğreticinin amacı, yeni ns-3 kullanıcıların sisteme yapılandırılmış
yol. Yeni kullanıcıların ayrıntılı bilgilerden temel bilgileri toplaması bazen zordur.
kılavuzları ve bu bilgileri çalışma simülasyonlarına dönüştürmek için. Bu eğitimde, biz
temel kavramları tanıtan ve açıklayan birkaç örnek simülasyon oluşturacak ve
gittiğimiz gibi özellikler.

Öğretici ilerledikçe, tam olarak tanıtacağız ns-3 belgelemek ve sağlamak
işleyişini daha derinlemesine incelemek isteyenler için kaynak koduna işaretçiler
sistem.

Başlangıçta birkaç önemli noktaya dikkat çekmeye değer:

· ns-3 açık kaynaklıdır ve proje için açık bir ortam sağlamaya çalışır.
araştırmacıların yazılımlarına katkıda bulunmaları ve paylaşmaları.

· ns-3 geriye dönük uyumlu bir uzantısı değil ns-2; yeni bir simülatördür. İki
simülatörlerin her ikisi de C++ ile yazılmıştır, ancak ns-3 desteklemeyen yeni bir simülatördür.
ns-2 API'ler. Bazı modeller ns-2 zaten taşınmış ns-2 için ns-3.
proje devam edecek ns-2 süre ns-3 inşa ediliyor ve çalışacak
geçiş ve entegrasyon mekanizmaları.

Hakkımızda ns-3
ns-3 için açık, genişletilebilir bir ağ simülasyon platformu sağlamak üzere geliştirilmiştir.
ağ araştırma ve eğitim. Kısaca, ns-3 paket verilerin nasıl modellendiğini sağlar
ağlar çalışır ve çalışır ve kullanıcıların yürütmesi için bir simülasyon motoru sağlar.
simülasyon deneyleri. Kullanmak için bazı nedenler ns-3 çalışmalar yapmak dahil
sistem davranışını incelemek için gerçek sistemlerle gerçekleştirmek daha zor veya mümkün değil
son derece kontrollü, tekrarlanabilir bir ortamda ve ağların nasıl çalıştığını öğrenmek için.
Kullanıcılar, mevcut modelin ns-3 İnternetin nasıl modelleneceğine odaklanır
protokoller ve ağlar çalışır, ancak ns-3 İnternet sistemleri ile sınırlı değildir; birkaç kullanıcı
kullanıyorlar ns-3 İnternet tabanlı olmayan sistemleri modellemek için.

Ağ simülasyon çalışmaları için birçok simülasyon aracı bulunmaktadır. Aşağıda birkaç
ayırt edici özellikleri ns-3 diğer araçların aksine.

· ns-3 birlikte ve diğerleriyle birleştirilebilen bir dizi kitaplık olarak tasarlanmıştır.
harici yazılım kütüphaneleri. Bazı simülasyon platformları kullanıcılara bir
tüm görevlerin gerçekleştirildiği tek, entegre grafik kullanıcı arabirimi ortamı
dışarı, ns-3 Bu konuda daha modülerdir. Birkaç harici animatör ve veri analizi
ve görselleştirme araçları ile kullanılabilir ns-3. Ancak, kullanıcılar şurada çalışmayı beklemelidir:
komut satırı ve C++ ve/veya Python yazılım geliştirme araçlarıyla.

· ns-3 FreeBSD, Cygwin için destek mevcut olmasına rağmen, öncelikle Linux sistemlerinde kullanılır.
(Windows için) ve yerel Windows Visual Studio desteği olma sürecindedir.
gelişmiş.

· ns-3 herhangi bir şirketin resmi olarak desteklenen bir yazılım ürünü değildir. İçin destek ns-3
ns-3-kullanıcıları posta listesinde en iyi çaba temelinde yapılır.

Her Ticaretçi İçin Mükemmellik ns-2 Kullanıcılar
Aşina olanlar için ns-2 (önceki popüler bir araç ns-3), en görünür dışa doğru
taşınırken değiş ns-3 betik dili seçimidir. Programlar ns-2 vardır
OTcl'de kodlanmıştır ve simülasyonların sonuçları Network Animator kullanılarak görselleştirilebilir
ad. içinde bir simülasyon çalıştırmak mümkün değildir. ns-2 tamamen C++'dan (yani, main() olarak)
herhangi bir OTcl olmadan program). Ayrıca, bazı bileşenlerin ns-2 C++ ile yazılır ve
OTcl'deki diğerleri. İçinde ns-3simülatör, isteğe bağlı Python ile tamamen C++ ile yazılmıştır.
bağlamalar. Simülasyon komut dosyaları bu nedenle C++ veya Python'da yazılabilir. Yeni animatörler
ve görselleştiriciler mevcuttur ve şu an geliştirme aşamasındadır. Dan beri ns-3 pcap üretir
paket izleme dosyaları, diğer yardımcı programlar da izleri analiz etmek için kullanılabilir. Bunda
öğretici, ilk önce doğrudan C++'da komut dosyası oluşturmaya ve sonuçları yorumlamaya odaklanacağız.
izleme dosyaları aracılığıyla.

Ancak benzerlikler de vardır (örneğin her ikisi de C++ nesnelerine dayalıdır ve bazıları
kodu ns-2 zaten taşındı ns-3). Farklılıkları vurgulamaya çalışacağız
arasında ns-2 ve ns-3 Bu eğitimde ilerlerken.

Sıklıkla duyduğumuz bir soru "Hala kullanmalı mıyım? ns-2 ya da hareket ns-3?" Bunda
kullanıcı bir şekilde yetkilendirilmediği sürece yazarın görüşü ns-2 (ya mevcut dayalı
ile kişisel konfor ve bilgi ns-2veya belirli bir simülasyon modeline dayalı olarak
sadece mevcuttur ns-2), bir kullanıcı ile daha üretken olacak ns-3 takip etmek için
nedenler:

· ns-3 aktif, duyarlı bir kullanıcı posta listesi ile aktif olarak korunurken, ns-2 is
sadece hafif bakımlı ve ana kod ağacında önemli bir gelişme görmedi
On yıldan uzun bir süredir.

· ns-3 içinde bulunmayan özellikler sağlar ns-2, bir uygulama kodu yürütme gibi
ortam (kullanıcıların simülatörde gerçek uygulama kodunu çalıştırmalarına izin verir)

· ns-3 ile karşılaştırıldığında daha düşük bir temel soyutlama düzeyi sağlar. ns-2hizalamasına izin vererek
gerçek sistemlerin nasıl bir araya getirildiğiyle daha iyi. bulunan bazı sınırlamalar ns-2 (Örneğin
düğümlerde birden çok arabirim türünü doğru bir şekilde desteklemek) düzeltildi ns-3.

ns-2 olduğundan daha çeşitli katkıda bulunan modüllere sahiptir ns-3, uzun olması nedeniyle
Tarih. Yine de, ns-3 çeşitli popüler araştırma alanlarında daha ayrıntılı modellere sahiptir
(gelişmiş LTE ve WiFi modelleri dahil) ve uygulama kodu desteği
yüksek kaliteli modellerin çok geniş bir yelpazesini kabul eder. Kullanıcılar bunu öğrendiğinde şaşırabilir
tüm Linux ağ yığını bir ns-3 düğümü, Doğrudan
Kod Yürütme (DCE) çerçevesi. ns-2 modeller bazen taşınabilir ns-3, özellikle
C++ ile uygulanmışlarsa.

Şüpheniz varsa, her iki simülatöre de (diğerlerinin yanı sıra) bakmak iyi bir kılavuz olacaktır.
simülatörler) ve özellikle araştırmanız için mevcut modeller, ancak aklınızda bulundurun
aktif olarak geliştirilmekte olan aracı kullanma deneyiminizin daha iyi olabileceğini ve
bakımlı (ns-3).

Katkıda
ns-3 araştırma topluluğu tarafından ve araştırma topluluğu için bir araştırma ve eğitim simülatörüdür. O olacak
yeni modeller geliştirmek, hata ayıklamak veya
mevcut olanları koruyun ve sonuçları paylaşın. olacağını umduğumuz birkaç politika var.
insanları katkıda bulunmaya teşvik etmek ns-3 için sahip oldukları gibi ns-2:

· GNU GPLv2 uyumluluğuna dayalı açık kaynak lisanslama

· wiki

· Katkıda Kod sayfa, benzer ns-2'nin popüler Katkıda Bulunan Kodu Kanal

· Açık böcek takipçi

Bu belgeyi okuyorsanız, projeye katkıda bulunmanın
muhtemelen bu noktada en önemli endişeniz değil, ancak bilmenizi istiyoruz ki
katkıda bulunmak projenin ruhundadır ve bize bir not bırakma eylemi bile
ile erken deneyiminiz hakkında ns-3 (örneğin, "bu eğitim bölümü net değildi..."),
eski dokümantasyon raporları vb. çok takdir edilmektedir.

Klavuz organizasyon
Öğretici, yeni kullanıcıların başlangıçta aşağıdaki gibi bir yolu izleyebileceğini varsayar:

· Bir kopyasını indirip oluşturmaya çalışın;

· Birkaç örnek program çalıştırmayı deneyin;

· Simülasyon çıktısına bakın ve onu ayarlamaya çalışın.

Sonuç olarak, öğreticiyi yukarıdaki geniş diziler boyunca düzenlemeye çalıştık.
olaylar.

KAYNAKLAR


The Web
Birkaç önemli kaynak vardır ki bunlardan herhangi biri ns-3 kullanıcı farkında olmalıdır. ana ağ
sitesi şurada bulunuyor http://www.nsnam.org hakkında temel bilgilere erişim sağlar.
ns-3 sistem. Ayrıntılı belgeler adresindeki ana web sitesinde mevcuttur.
http://www.nsnam.org/documentation/. Ayrıca sistemle ilgili belgeleri de bulabilirsiniz.
bu sayfadan mimari.

Ana konuyu tamamlayan bir Wiki var ns-3 bulacağınız web sitesi
http://www.nsnam.org/wiki/. Orada kullanıcı ve geliştirici SSS'lerinin yanı sıra
sorun giderme kılavuzları, üçüncü taraf katkılı kodlar, belgeler vb.

Kaynak kodu şu adreste bulunabilir ve göz atılabilir: http://code.nsnam.org/. orada bulacaksın
adlı depodaki mevcut geliştirme ağacı ns-3-dev. Geçmiş yayınlar ve
çekirdek geliştiricilerin deneysel depoları da burada bulunabilir.

cıvalı
Karmaşık yazılım sistemleri, organizasyonu ve sistemdeki değişiklikleri yönetmek için bir yola ihtiyaç duyar.
temel kod ve belgeler. Bu başarıyı gerçekleştirmenin birçok yolu vardır ve
Şu anda bunu yapmak için kullanılan bazı sistemleri duymuşsunuzdur. eşzamanlı
Sürüm Sistemi (CVS) muhtemelen en iyi bilinenidir.

The ns-3 proje, kaynak kodu yönetim sistemi olarak Mercurial'ı kullanıyor. yapmasan da
Bu öğreticiyi tamamlamak için Mercurial hakkında çok şey bilmeniz gerekiyor, öneririz
Mercurial'ı tanımak ve kaynak koduna erişmek için kullanmak. Mercurial'ın bir
Adresindeki web sitesi http://www.selenic.com/mercurial/, hangi ikili veya kaynak alabilirsiniz
Bu Yazılım Konfigürasyon Yönetimi (SCM) sisteminin sürümleri. Selenic (geliştirici
of Mercurial) ayrıca şu adreste bir eğitim sağlar:
http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial/ve bir Hızlı Başlangıç ​​kılavuzu
http://www.selenic.com/mercurial/wiki/index.cgi/QuickStart/.

Ayrıca Mercurial'ın kullanımıyla ilgili önemli bilgileri ve ns-3 ana tarafta ns-3
site.

WAF
Yerel sisteminize kaynak kodunu indirdikten sonra, onu derlemeniz gerekecek.
Kullanılabilir programlar üretmek için kaynak. Tıpkı kaynak kod yönetiminde olduğu gibi, orada
Bu işlevi gerçekleştirmek için birçok araç mevcuttur. Muhtemelen bunlardan en bilineni
araçlar yapmak. En bilineni olmakla birlikte, yapmak muhtemelen en zoru
çok büyük ve son derece yapılandırılabilir bir sistemde kullanmak için. Bu sebeple birçok alternatif
geliştirildi. Son zamanlarda bu sistemler Python kullanılarak geliştirilmiştir.
dil.

Yapı sistemi Waf üzerinde kullanılır ns-3 proje. Yeni nesillerden biridir
Python tabanlı yapı sistemleri. oluşturmak için herhangi bir Python anlamanız gerekmeyecek.
mevcut ns-3 sistem.

Waf'ın kanlı detaylarıyla ilgilenenler için ana web sitesi şu adreste bulunabilir:
http://code.google.com/p/waf/.

gelişme çevre
Yukarıda belirtildiği gibi, komut dosyası ns-3 C++ veya Python ile yapılır. Çoğu ns-3 API
Python'da mevcuttur, ancak modeller her iki durumda da C++ ile yazılmıştır. Çalışmak
Bu belgede C++ ve nesne yönelimli kavramlar bilgisi olduğu varsayılmaktadır. Alacağız
bazı daha gelişmiş kavramları veya muhtemelen yabancı dilleri gözden geçirmek için biraz zaman
özellikler, deyimler ve tasarım kalıpları göründükleri gibi. Bu öğreticiyi istemiyoruz
Yine de bir C++ eğitimine geçiyoruz, bu yüzden dilin temel bir komutunu bekliyoruz.
C++ hakkında neredeyse hayal bile edilemeyecek sayıda bilgi kaynağı mevcuttur.
Web'de veya basılı olarak.

C++'da yeniyseniz, öğretici veya yemek kitabı tabanlı bir kitap veya web sitesi bulmak isteyebilirsiniz.
ve devam etmeden önce en azından dilin temel özelliklerini inceleyin. İçin
örnek Re-Tweet öğretici.

The ns-3 sistem, geliştirme için GNU "araç zincirinin" birkaç bileşenini kullanır. A
yazılım araç zinciri, verilen ortamda mevcut olan programlama araçları setidir. İçin
GNU araç zincirine nelerin dahil olduğuna dair hızlı bir inceleme, bkz.
http://en.wikipedia.org/wiki/GNU_toolchain. ns-3 gcc, GNU binutils ve gdb kullanır.
Ancak, GNU yapı sistemi araçlarını, ne make ne de otomatik araçları kullanmıyoruz. Waf kullanıyoruz
bu işlevler için.

Tipik olarak ns-3 yazar Linux'ta veya Linux benzeri bir ortamda çalışacaktır. Bunlar için
Windows altında çalışan, Linux ortamını simüle eden ortamlar var.
çeşitli dereceler. NS ns-3 proje geçmişte (ancak şu anda değil) desteklendi
bu kullanıcılar için Cygwin ortamında geliştirme. Görmek http://www.cygwin.com/ için
indirmeyle ilgili ayrıntılar ve şu adresi ziyaret edin: ns-3 Cygwin hakkında daha fazla bilgi için wiki ve
ns-3. MinGW şu anda resmi olarak desteklenmemektedir. Cygwin'e başka bir alternatif,
VMware sunucusu gibi bir sanal makine ortamı kurun ve bir Linux sanal ortamı kurun
makinesi.

Soket Programlama
Bu bölümde kullanılan örneklerde Berkeley Sockets API ile temel bir kolaylık sağlayacağız.
öğretici. Soketlerde yeniyseniz, API'yi ve bazı yaygın kullanımları incelemenizi öneririz.
vakalar. TCP/IP soketlerinin programlanmasına iyi bir genel bakış için tavsiye ediyoruz TCP / IP Yuva in
C, donahoo ve Calvert.

Kitaptaki örnekler için kaynak içeren ilgili bir web sitesi bulunmaktadır.
şurada bulabilirsiniz: http://cs.baylor.edu/~donahoo/practical/CSockets/.

Kitabın ilk dört bölümünü anlıyorsanız (veya erişimi olmayanlar için
kitabın bir kopyasına, yukarıdaki web sitesinde gösterilen yankı istemcilerine ve sunucularına)
öğretici anlamak için iyi durumda olun. Çok noktaya yayın hakkında benzer bir kitap var
Soketler, Multicast Soketler, Makofske ve Almeroth. ihtiyacınız olabilecek materyalleri kapsayan
dağıtımdaki çok noktaya yayın örneklerine bakarsanız anlayın.

BAŞLARKEN BAŞLADI


Bu bölüm, kullanıcıyı bir makine ile başlayan bir çalışma durumuna getirmeyi amaçlamaktadır.
hiç sahip olmamış olabilir ns-3 Kurulmuş. Desteklenen platformları, ön koşulları ve
elde etmek ns-3, inşa etme yolları ns-3, ve basit programları oluşturup çalıştırmanızı doğrulamanın yolları.

Genel Bakış
ns-3 birlikte çalışan bir yazılım kitaplıkları sistemi olarak inşa edilmiştir. Kullanıcı programları olabilir
bu kitaplıklarla bağlantı kuran (veya bunlardan içe aktaran) yazılır. Kullanıcı programları yazılır
C++ veya Python programlama dilleri.

ns-3 kaynak kodu olarak dağıtılır, yani hedef sistemin bir
önce kitaplıkları oluşturmak için yazılım geliştirme ortamı, ardından kullanıcıyı oluşturmak
programı. ns-3 Prensipte seçilenler için önceden oluşturulmuş kütüphaneler olarak dağıtılabilir
sistemleri ve gelecekte bu şekilde dağıtılabilir, ancak şu anda birçok kullanıcı
aslında işlerini düzenleyerek yapıyorlar ns-3 kendisi, bu yüzden yeniden inşa etmek için kaynak koduna sahip olmak
kütüphaneler faydalıdır. Birisi önceden inşa edilmiş yapma işini üstlenmek isterse
işletim sistemleri için kütüphaneler ve paketler, lütfen ns-developers mailing ile iletişime geçin
liste.

Aşağıda, indirme ve oluşturmanın iki yoluna bakacağız. ns-3. İlk olarak
ana web sitesinden resmi bir sürüm indirmek ve oluşturmak için. İkincisi getirmek
ve geliştirme kopyalarını oluşturmak ns-3. Araçlardan bu yana her iki örneği de inceleyeceğiz.
katılanlar biraz farklıdır.

İndirilmesi ns-3
The ns-3 bir bütün olarak sistem oldukça karmaşık bir sistemdir ve bir dizi bağımlılığa sahiptir.
diğer bileşenler. Muhtemelen her gün uğraşacağınız sistemlerle birlikte (
GNU araç zinciri, Mercurial, bir metin düzenleyici) bir dizi
Devam etmeden önce sisteminizde ek kitaplıklar bulunur. ns-3 wiki sağlar
birçok faydalı ipucu ve püf noktası içeren sayfalar içeren sayfa. Böyle bir sayfa,
"Kurulum" sayfası, http://www.nsnam.org/wiki/Installation.

Bu wiki sayfasının "Önkoşullar" bölümü, hangi paketlerin gerekli olduğunu açıklar.
ortak destek ns-3 seçenekleri ve ayrıca bunları yüklemek için kullanılan komutları sağlar.
ortak Linux çeşitleri. Cygwin kullanıcılarının Cygwin yükleyicisini kullanması gerekecek (eğer bir
Cygwin kullanıcısı, Cygwin'i kurmak için kullandınız).

keşfetmek için bu fırsatı değerlendirmek isteyebilirsiniz. ns-3 wiki gerçekten olduğundan beri biraz
orada bir bilgi hazinesi var.

Bu noktadan itibaren, okuyucunun Linux'ta veya başka bir bilgisayarda çalıştığını varsayacağız.
Linux öykünme ortamı (Linux, Cygwin, vb.) ve GNU araç zinciri kurulu ve
yukarıda belirtilen ön koşullarla birlikte doğrulanmıştır. Biz de bunu varsayacağız
Hedef sistemde Mercurial ve Waf kurulu ve çalışıyor.

The ns-3 kod, sunucudaki Mercurial depolarında bulunur http://code.nsnam.org.
Ayrıca bir tarball sürümünü şu adresten indirebilirsiniz: http://www.nsnam.org/release/veya çalışabilirsin
Mercurial kullanan depolarla. İyi bir şey olmadıkça Mercurial kullanmanızı öneririz.
etmeme sebebi. Tarball'ın nasıl elde edileceğine ilişkin talimatlar için bu bölümün sonuna bakın.
bırakın.

Mercurial depolarını kullanmaya başlamanın en basit yolu, ns-3-allinon
Çevre. Bu, indirme ve oluşturma işlemlerini yöneten bir dizi komut dosyasıdır.
çeşitli alt sistemleri ns-3 senin için. başlamanızı tavsiye ederiz. ns-3 bu işte çalışmak
ortamı.

Bir uygulama, adında bir dizin oluşturmaktır. çalışma alanı altında birinin ana dizininde
yerel Mercurial depoları tutulabilir. Herhangi bir dizin adı yapacaktır, ancak varsayacağız
o çalışma alanı burada kullanılmaktadır (not: repo olarak bazı belgelerde de kullanılabilir.
örnek dizin adı).

İndirilmesi ns-3 kullanma a tarball
Tarball, birden çok dosyanın bir araya getirildiği belirli bir yazılım arşivi biçimidir.
birlikte ve arşiv muhtemelen sıkıştırılmış. ns-3 yazılım sürümleri bir aracılığıyla sağlanır
indirilebilir tarball İndirme işlemi ns-3 tarball ile basittir; Sen sadece
bir sürüm seçmeli, indirmeli ve sıkıştırmasını açmalısınız.

Bir kullanıcı olarak oluşturmak istediğinizi varsayalım. ns-3 adlı yerel bir dizinde
çalışma alanı. benimsersen çalışma alanı dizin yaklaşımı, bir sürümün bir kopyasını alabilirsiniz
aşağıdakini Linux kabuğunuza yazarak (uygun sürüm numaralarını değiştirin,
elbette):

$cd
$ mkdir çalışma alanı
$ cd çalışma alanı
$wget http://www.nsnam.org/release/ns-allinone-3.22.tar.bz2
$ tar xjf ns-allinone-3.22.tar.bz2

dizine geçerseniz ns-allinon-3.22 bir dizi dosya görmelisiniz:

$ l
fırında sabitler.py ns-3.22 BENİ OKU
build.py netanim-3.105 pybindgen-0.16.0.886 util.py

Artık üssü oluşturmaya hazırsınız ns-3 dağılımı.

İndirilmesi ns-3 kullanma fırında pişirmek
Bake, dağıtılmış entegrasyon ve oluşturma için geliştirilmiş bir araçtır. ns-3 projesi.
Bake, geliştirme sürümlerini getirmek için kullanılabilir. ns-3 yazılım ve indirme ve
tabana uzantılar oluşturun ns-3 Doğrudan Kod Yürütme gibi dağıtım
ortam, Network Simulation Cradle, yeni Python bağlamaları oluşturma yeteneği ve diğerleri.

Son olarak ns-3 yayınlar, Bake yayın tarball'ına dahil edildi. yapılandırma
yayınlanan sürümde bulunan dosya, bir kişinin daha önce yapılmış herhangi bir yazılımı indirmesine izin verecektir.
yayınlandığı tarihte geçerli. Bu, örneğin, Bake'in şu versiyonudur:
ile dağıtılan ns-3.21 yayın bunun için bileşenleri getirmek için kullanılabilir ns-3 serbest
veya daha eskidir, ancak sonraki sürümler için bileşenleri getirmek için kullanılamaz (
bakconf.xml dosya güncellendi).

Ayrıca, en son kopyasını da alabilirsiniz. fırında Linux'unuza aşağıdakini yazarak
kabuk (Mercurial'ı kurduğunuzu varsayarak):

$cd
$ mkdir çalışma alanı
$ cd çalışma alanı
$ hg klonu http://code.nsnam.org/bake

hg (Mercurial) komutu yürütülürken aşağıdakine benzer bir şey görmelisiniz
görüntülenen,

Kendi ID’n ile mağazalarını oluştur
hedef dizin: fırında
tüm değişiklikleri istemek
değişiklik kümeleri ekleme
manifest ekleme
dosya değişiklikleri ekleme
339 dosyaya 796 değişiklikle 63 değişiklik kümesi eklendi
şube varsayılanına güncelleme
45 dosya güncellendi, 0 dosya birleştirildi, 0 dosya kaldırıldı, 0 dosya çözülmedi

Klon komutu tamamlandıktan sonra, adlı bir dizine sahip olmalısınız. fırında, içerikler
aşağıdaki gibi bir şey görünmelidir:

$ l
fırında bakeconf.xml doc create-binary.py YAPILACAKLAR
bake.py örnek testi

Gerçekten az önce bazı Python betiklerini ve adlı bir Python modülünü indirdiğinize dikkat edin.
fırında. Bir sonraki adım, bu komut dosyalarını indirmek ve oluşturmak için kullanmak olacaktır. ns-3
seçtiğiniz dağıtım.

Kullanılabilir birkaç yapılandırma hedefi vardır:

1. ns-3.22: sürüme karşılık gelen modül; benzer bileşenleri indirecek
serbest bırakma tarball'a.

2. ns-3-dev: benzer bir modül ancak geliştirme kodu ağacını kullanıyor

3. ns-allinon-3.22: tıklama gibi diğer isteğe bağlı özellikleri içeren modül
yönlendirme, için açık akış ns-3, ve Ağ Simülasyon Beşiği

4. ns-3-allinon: allinone modülünün yayınlanan sürümüne benzer, ancak
geliştirme kodu.

Şu anki geliştirme anlık görüntüsü (yayınlanmamış) ns-3 şurada bulunabilir:
http://code.nsnam.org/ns-3-dev/. Geliştiriciler bu depoyu
tutarlı, çalışma durumları ancak yayınlanmamış kod içeren bir geliştirme alanındalar
mevcut, bu nedenle ihtiyacınız yoksa resmi bir sürümle kalmayı düşünebilirsiniz.
yeni tanıtılan özellikler.

Kodun en son sürümünü depo listesini inceleyerek bulabilirsiniz.
veya adresine giderek "ns-3 Salıverme" web sayfası ve en son sürüm bağlantısına tıklayın.
Bu öğretici örnekte ile devam edeceğiz ns-3.22.

Şimdi fırının çeşitli parçalarını aşağı çekmek için fırında pişirme aracını kullanacağız. ns-3 Sen olacaksın
kullanarak. İlk olarak, fırında pişirmek hakkında bir şeyler söyleyeceğiz.

bake, kaynak paketleri bir kaynak dizine indirerek ve yükleyerek çalışır.
kitaplıkları bir derleme dizinine yerleştirin. bake ikili dosyaya başvurularak çalıştırılabilir, ancak
bake'i indirildiği dizinin dışından çalıştırmayı seçerse, tavsiye edilir
fırını yolunuza koymak için aşağıdaki gibi (Linux bash kabuğu örneği). İlk olarak, değiştir
'bake' dizinine girin ve ardından aşağıdaki ortam değişkenlerini ayarlayın

$ dışa aktar BAKE_HOME=`pwd`
$ dışa aktar YOL=$YOL:$BAKE_HOME:$BAKE_HOME/build/bin
$ dışa aktar PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Bu, bake.py programını kabuğun yoluna koyacak ve diğer programların
bake tarafından oluşturulan yürütülebilir dosyaları ve kitaplıkları bulun. Birkaç fırında kullanım durumu olmasa da
PATH ve PYTHONPATH'in yukarıdaki gibi ayarlanmasını gerektirir, tam ns-3-allinone yapıları (
isteğe bağlı paketler) genellikle yapar.

Çalışma alanı dizinine gidin ve aşağıdakini kabuğunuza yazın:

$ ./bake.py -e ns-3.22 yapılandır

Ardından, çeşitli bileşenleri indirmek için yeterli araca sahip olup olmadığımızı kontrol etmesini isteyeceğiz.
Tip:

$ ./bake.py kontrol

Aşağıdaki gibi bir şey görmelisiniz,

> Python - Tamam
> GNU C++ derleyicisi - Tamam
> Mercurial - Tamam
> CVS - Tamam
> GIT - Tamam
> Çarşı - Tamam
> Katran aracı - Tamam
> Sıkıştırılmış dosyayı açma aracı - Tamam
> Unrar aracı - eksik
> 7z veri sıkıştırma yardımcı programı - Tamam
> XZ veri sıkıştırma yardımcı programı - Tamam
> Yap - Tamam
> cYap - Tamam
> yama aracı - Tamam
> otomatik yeniden yapılandırma aracı - Tamam

> Araçlar için aranan yol: /usr/lib64/qt-3.3/bin /usr/lib64/ccache
/ Usr / local / bin /çöp Kutusu / Usr / bin / usr / local / sbin / usr / sbin / sbin
/home/tomh/bin çöp kutusu

Özellikle Mercurial, CVS, GIT, Bazaar gibi indirme araçları temel ilkemizdir.
bu noktada endişeleniyorlar, çünkü kodu getirmemize izin veriyorlar. Lütfen eksik yükleyin
araçları bu aşamada, sisteminiz için olağan şekilde (mümkünse) veya iletişim
bu araçları yüklemek için sistem yöneticinize

Ardından, yazılımı indirmeyi deneyin:

$ ./bake.py indir

şöyle bir şey vermelidir:

>> Sistem bağımlılığı pygoocanvas aranıyor - Tamam
>> Sistem bağımlılığı aranıyor python-dev - Tamam
>> Sistem bağımlılığı aranıyor pygraphviz - Tamam
>> pybindgen-0.16.0.886 indiriliyor - Tamam
>> Sistem bağımlılığı aranıyor g++ - Tamam
>> Sistem bağımlılığı aranıyor qt4 - Tamam
>> netanim-3.105 indiriliyor - Tamam
>> ns-3.22 indiriliyor - Tamam

Yukarıdakiler, üç kaynağın indirildiğini göstermektedir. kontrol edin kaynak rehber
şimdi ve yaz ls; biri görmeli:

$ l
netanim-3.105 ns-3.22 pybindgen-0.16.0.886

Şimdi inşa etmeye hazırsınız ns-3 dağılımı.

bina ns-3
bina ile build.py
Serbest bırakılan bir tarball'dan çalışırken, ns-3 yapabileceğin proje
içinde bulunan bir kolaylık programı kullanarak oluşturun. allinone dizin. Bu programın adı
build.py. Bu program, projeyi sizin için en yaygın şekilde yapılandıracaktır.
faydalı yol. Ancak, lütfen daha gelişmiş yapılandırma ve çalışma ns-3 irade
tipik olarak yerel kullanmayı içerir ns-3 yapı sistemi, Waf, daha sonra tanıtılacak
öğretici.

Tarball kullanarak indirdiyseniz, şöyle bir dizine sahip olmalısınız.
ns-allinon-3.22 altında senin ~/çalışma alanı dizin. Aşağıdakileri yazın:

$ ./build.py --enable-examples --enable-testler

Çünkü bu öğreticide örnekler ve testlerle çalışıyoruz ve bunlar
varsayılan olarak yerleşik ns-3, build.py argümanları bizim için onları inşa etmesini söyler. NS
program ayrıca varsayılan olarak mevcut tüm modülleri oluşturmaya başlar. Daha sonra inşa edebilirsiniz ns-3
Örnekler ve testler olmadan veya işiniz için gerekli olmayan modülleri ortadan kaldırın,
Eğer istersen.

Derleme betiği oluşturulurken görüntülenen çok sayıda tipik derleyici çıktı mesajı göreceksiniz.
indirdiğiniz çeşitli parçalar. Sonunda aşağıdakileri görmelisiniz:

Waf: `/path/to/workspace/ns-allinone-3.22/ns-3.22/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (6m25.032s)

Oluşturulan modüller:
anten aodv uygulamaları
köprü binaları yapılandırma mağazası
çekirdek csma csma düzeni
dsdv dsr enerji
fd-net-cihaz akış monitörü internet
lr-wpan lte ağ
hareketlilik mpi netanim (Python yok)
ağ nix-vektör yönlendirme olsr
noktadan noktaya noktadan noktaya yerleşim yayılımı
Sixlowpan spektrum istatistikleri
kademe köprüsü testi (Python yok) topoloji okuması
uan sanal ağ cihazı dalgası
kablosuz wimax

Modüller oluşturulmadı (açıklama için ns-3 öğreticisine bakın):
brite tıklama açık akışı
görselleştirici

`./ns-3.22' dizininden çıkılıyor

İnşa edilmemiş modüllerle ilgili kısımla ilgili olarak:

Modüller oluşturulmadı (açıklama için ns-3 öğreticisine bakın):
brite tıklama açık akışı
görselleştirici

Bu sadece demek oluyor ki bazı ns-3 dış kütüphanelere bağımlılığı olan modüller,
inşa edilmiş olması veya yapılandırmanın özellikle bunları oluşturmamasını istemesi. yapar
simülatörün başarılı bir şekilde oluşturulmadığı veya yanlış sağlayacağı anlamına gelmez
inşa ediliyor olarak listelenen modüller için sonuçlar.

bina ile fırında
Proje havuzlarından kaynak kodunu almak için yukarıdaki fırını kullandıysanız, devam edebilirsiniz.
inşa etmek için kullan ns-3. tip

$ ./bake.py yapı

ve şöyle bir şey görmelisiniz:

>> pybindgen-0.16.0.886 oluşturma - Tamam
>> Bina netanim-3.105 - Tamam
>> Bina ns-3.22 - Tamam

İpucu: sen yapabilmek Ayrıca yapmak her ikisi de adımlar indir ve inşa etmek by çağrı 'bake.py dağıtmak'.

Bir arıza olursa, lütfen aşağıdaki komutun ne söylediğine bir göz atın.
sen; eksik bir bağımlılığa ilişkin bir ipucu verebilir:

$ ./bake.py göster

Bu, oluşturmaya çalıştığınız paketlerin çeşitli bağımlılıklarını listeleyecektir.

bina ile WAF
Bu noktaya kadar, ikisinden birini kullandık. build.py komut dosyası veya fırında aracı, almak
bina ile başladı ns-3. Bu araçlar bina için kullanışlıdır. ns-3 ve destekleyici
kütüphaneler ve onlar ns-3 yapmak için Waf derleme aracını çağırmak için dizin
gerçek bina. Çoğu kullanıcı, yapılandırmak ve yapılandırmak için doğrudan Waf'ı kullanmaya hızla geçer.
inşa etmek ns-3. Bu nedenle, devam etmek için lütfen çalışma dizininizi şu şekilde değiştirin: ns-3 rehber
başlangıçta inşa ettiğiniz.

Bu noktada kesinlikle gerekli değil, ancak biraz dolambaçlı yoldan gitmek faydalı olacaktır.
ve projenin konfigürasyonunda nasıl değişiklik yapılacağına bakın. Muhtemelen en
yapabileceğiniz yararlı yapılandırma değişikliği, uygulamanın optimize edilmiş sürümünü oluşturmak olacaktır.
kod. Varsayılan olarak, projenizi hata ayıklama sürümünü oluşturacak şekilde yapılandırdınız. hadi söyleyelim
optimize edilmiş bir yapı oluşturmak için proje. Waf'a optimize etmesi gerektiğini açıklamak
örnekleri ve testleri içeren derlemeler için aşağıdakileri uygulamanız gerekir.
komutları:

$ ./waf temiz
$ ./waf --build-profile=optimize edilmiş --enable-examples --enable-tests configuration

Bu, Waf'ı yerel dizinin dışında çalıştırır (bu sizin için kolaylık olarak sağlanır).
Önceki yapıyı temizlemek için ilk komut genellikle kesinlikle gerekli değildir, ancak
iyi bir uygulamadır (ancak bkz. İnşa etmek Profiller, aşağıda); daha önce inşa edilmiş olanları kaldıracak
dizinde bulunan kitaplıklar ve nesne dosyaları inşa etmek/. Proje yeniden yapılandırıldığında
ve yapı sistemi çeşitli bağımlılıkları kontrol eder, görünen çıktıyı görmelisiniz
aşağıdakine benzer:

Üst ayarı : .
Ayarlamak: inşa etmek
'gcc' (c derleyicisi) denetleniyor: /usr/bin/gcc
cc sürümü kontrol ediliyor : 4.2.1
'g++' (c++ derleyicisi) denetleniyor: /usr/bin/g++
Kontrol artırma şunları içerir: 1_46_1
Yükseltme kitaplıklarını kontrol etme: tamam
Yükseltme bağlantısı kontrol ediliyor: tamam
Tıklama konumu kontrol ediliyor: bulunamadı
pkg-config programı kontrol ediliyor : /sw/bin/pkg-config
'gtk+-2.0' >= 2.12 kontrol ediliyor : evet
'libxml-2.0' >= 2.7 olup olmadığı kontrol ediliyor: evet
uint128_t türü kontrol ediliyor: bulunamadı
__uint128_t tipi kontrol ediliyor: evet
Yüksek hassasiyetli uygulamanın kontrol edilmesi: 128 bit tam sayı (varsayılan)
stdint.h başlığı kontrol ediliyor: evet
inttypes.h başlığı kontrol ediliyor : evet
sys/inttypes.h başlığı kontrol ediliyor: bulunamadı
sys/types.h başlığı kontrol ediliyor : evet
sys/stat.h başlığı kontrol ediliyor : evet
dirent.h başlığı kontrol ediliyor : evet
stdlib.h başlığı kontrol ediliyor: evet
Başlık sinyali kontrol ediliyor.h : evet
pthread.h başlığı kontrol ediliyor : evet
stdint.h başlığı kontrol ediliyor: evet
inttypes.h başlığı kontrol ediliyor : evet
sys/inttypes.h başlığı kontrol ediliyor: bulunamadı
rt kütüphanesi kontrol ediliyor: bulunamadı
netpacket/packet.h başlığı kontrol ediliyor: bulunamadı
sys/ioctl.h başlığı kontrol ediliyor : evet
net/if.h başlığı kontrol ediliyor: bulunamadı
net/ethernet.h başlığı kontrol ediliyor : evet
linux/if_tun.h başlığı kontrol ediliyor: bulunamadı
netpacket/packet.h başlığı kontrol ediliyor: bulunamadı
NSC konumu kontrol ediliyor: bulunamadı
'mpic++' denetleniyor: evet
'sqlite3' kontrol ediliyor: evet
linux/if_tun.h başlığı kontrol ediliyor: bulunamadı
Program sudo kontrol ediliyor: /usr/bin/sudo
valgrind programı kontrol ediliyor : /sw/bin/valgrind
'gsl' kontrolü: evet
Derleme bayrağı kontrol ediliyor -Wno-error=deprecated-d... destek : tamam
Derleme bayrağı kontrol ediliyor -Wno-error=deprecated-d... destek : tamam
Derleme bayrağı kontrol ediliyor -fstrict-aliasing... destek : tamam
Derleme bayrağı kontrol ediliyor -fstrict-aliasing... destek : tamam
Derleme bayrağı kontrol ediliyor -Wstrict-aliasing... destek : tamam
Derleme bayrağı kontrol ediliyor -Wstrict-aliasing... destek : tamam
Program doxygen'i kontrol ediliyor : /usr/local/bin/doxygen
---- İsteğe bağlı NS-3 özelliklerinin özeti:
Profil oluştur: hata ayıklama
İnşa dizini: inşa
Python Bağları: etkin
BRITE Entegrasyonu : etkinleştirilmedi (BRITE etkinleştirilmedi (--with-brite seçeneğine bakın))
NS-3 Click Entegrasyonu : etkinleştirilmedi (nsclick etkinleştirilmedi (--with-nsclick seçeneğine bakın))
GtkConfigStore: etkin
XmlIo: etkin
Threading Primitives : etkin
Gerçek Zamanlı Simülatör: etkin (librt mevcut değil)
Öykünülmüş Ağ Aygıtı: etkin ( dahil edilmedi)
Dosya tanımlayıcı NetDevice : etkin
FdNetDevice öğesine dokunun: etkin değil (linux/if_tun.h gerekir)
Öykünme FdNetDevice : etkinleştirilmedi (netpacket/packet.h gerekir)
PlanetLab FdNetDevice : etkinleştirilmedi (PlanetLab işletim sistemi algılanmadı (--force-planetlab seçeneğine bakın))
Ağ Simülasyonu Yuvası: etkinleştirilmedi (NSC bulunamadı (bkz. --with-nsc seçeneği))
MPI Desteği : etkin
NS-3 OpenFlow Entegrasyonu: etkin değil (Gerekli yükseltme kitaplıkları bulunamadı, eksik: sistem, sinyaller, dosya sistemi)
SQLite istatistik veri çıkışı: etkin
Köprü'ye dokunun: etkin değil ( dahil edilmedi)
PyViz görselleştiricisi: etkin
suid bitini ayarlamak için sudo kullanın: etkinleştirilmedi (seçenek --enable-sudo seçilmedi)
Derleme testleri: etkin
Derleme örnekleri: etkin
GNU Bilimsel Kitaplığı (GSL): etkin
'yapılandırma' başarıyla tamamlandı (1.944sn)

Yukarıdaki çıktının son kısmına dikkat edin. Biraz ns-3 seçenekler varsayılan olarak etkin değildir veya
düzgün çalışması için temel sistemden destek gerektirir. Örneğin, etkinleştirmek için
XmlTo, libxml-2.0 kütüphanesinin sistemde bulunması gerekir. Bu kütüphane olmasaydı
bulunan, karşılık gelen ns-3 özellik etkinleştirilmeyecek ve bir mesaj
görüntülenir. Programı kullanmak için bir özellik olduğunu da unutmayın. sudo davayı ayarlamak
belirli programların bir kısmı. Bu, varsayılan olarak etkin değildir ve bu nedenle bu özellik rapor edilir
"etkin değil" olarak.

Şimdi devam edin ve örnekleri ve testleri içeren hata ayıklama yapısına geri dönün.

$ ./waf temiz
$ ./waf --build-profile=debug --enable-examples --enable-tests configuration

Derleme sistemi şimdi yapılandırıldı ve hata ayıklama sürümlerini oluşturabilirsiniz. ns-3
programları basitçe yazarak

$ ./waf

Tamam, üzgünüm, seni inşa ettirdim. ns-3 sistemin bir parçası, ancak şimdi nasıl yapılacağını biliyorsunuz
yapılandırmayı değiştirin ve optimize edilmiş kod oluşturun.

Yukarıda tartışılan build.py betiği ayrıca şunları da destekler: --enable-örnekler ve etkinleştirme testleri
argümanlar, ancak genel olarak, diğer waf seçeneklerini doğrudan desteklemez; örneğin, bu
çalışmayacak:

$ ./build.py --python'u devre dışı bırak

sonuçlanacak

build.py: hata: böyle bir seçenek yok: --disable-python

Ancak özel operatör -- waf'a ek seçenekler iletmek için kullanılabilir, bu nedenle
yukarıdakiler yerine aşağıdakiler çalışacaktır:

$ ./build.py -- --disable-python

temel komutu oluşturduğundan ./waff yapılandırmak --python'u devre dışı bırak.

İşte Waf hakkında birkaç tanıtıcı ipucu.

yapılandırma vs İnşa etmek
Bazı Waf komutları yalnızca yapılandırma aşamasında anlamlıdır ve bazı komutlar
yapım aşamasında geçerlidir. Örneğin, öykünme özelliklerini kullanmak istiyorsanız
ns-3, yukarıda açıklandığı gibi sudo kullanarak suid bitinin ayarlanmasını etkinleştirmek isteyebilirsiniz. Bu
bir yapılandırma zamanı komutu olduğu ortaya çıktı ve böylece kullanarak yeniden yapılandırabilirsiniz.
Örnekleri ve testleri de içeren aşağıdaki komut.

$ ./wafconfig --enable-sudo --enable-examples --enable-tests

Bunu yaparsanız, Waf, Soket oluşturucu programlarını değiştirmek için Sudo'yu çalıştırmış olacaktır.
kök olarak çalıştırılacak öykünme kodu.

Waf'ta birçok başka yapılandırma ve oluşturma zamanı seçeneği vardır. Bunları keşfetmek için
seçenekler, şunu yazın:

$ ./waf --yardım

Bir sonraki bölümde testle ilgili bazı komutları kullanacağız.

İnşa etmek Profiller
Waf'ı nasıl yapılandırabileceğinizi zaten gördük. ayıklamak or optimize yapılar:

$ ./waf --build-profile=hata ayıklama

Ayrıca bir ara yapı profili vardır, serbest. -d ile eşanlamlıdır
--build-profil.

Varsayılan olarak Waf, yapı eserlerini inşa etmek dizin. bir belirtebilirsiniz
ile farklı çıktı dizini --dışarı seçenek, ör.

$ ./wafconfig --out=foo

Bunu derleme profilleriyle birleştirmek, farklı derleme seçenekleri arasında geçiş yapmanızı sağlar.
temiz bir şekilde:

$ ./wafconfig --build-profile=debug --out=build/debug
$ ./waf yapı
Kendi ID’n ile mağazalarını oluştur
$ ./wafconfig --build-profile=optimize edilmiş --out=build/optimize edilmiş
$ ./waf yapı
Kendi ID’n ile mağazalarını oluştur

Bu, her zaman sonuncunun üzerine yazmak yerine birden çok yapıyla çalışmanıza olanak tanır.
yapı. Geçiş yaptığınızda, Waf yeniden derlemek yerine yalnızca olması gerekeni derler.
herşey.

Bunun gibi yapı profilleri arasında geçiş yaptığınızda, aynısını vermeye dikkat etmelisiniz.
yapılandırma parametreleri her seferinde. Bazı ortamları tanımlamak uygun olabilir
hatalardan kaçınmanıza yardımcı olacak değişkenler:

$ export NS3CONFIG="--enable-examples --enable-tests"
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimize edilmiş --out=build/optimize edilmiş"

$ ./waf yapılandırmak $NS3CONFIG $NS3DEBUG
$ ./waf yapı
Kendi ID’n ile mağazalarını oluştur
$ ./waf yapılandırmak $NS3CONFIG $NS3OPT
$ ./waf yapı

Derleyiciler
Yukarıdaki örneklerde Waf, GCC C++ derleyicisini kullanır, g ++, İnşaat için ns-3. Bununla birlikte,
Waf tarafından kullanılan C++ derleyicisini aşağıdakileri tanımlayarak değiştirmek mümkündür. CXX çevre
değişken. Örneğin, Clang C++ derleyicisini kullanmak için, klan++,

$ CXX="clang++" ./waf yapılandırmak
$ ./waf yapı

Ayrıca Waf'ı dağıtılmış derleme yapmak için ayarlayabilirsiniz. bölge benzer bir yolla:

$ CXX="distcc g++" ./waf yapılandırmak
$ ./waf yapı

Daha fazla bilgi bölge ve dağıtılmış derleme bulunabilir proje Kanal altında
Belgeler bölümü.

kurmak
Waf, sistem üzerinde çeşitli yerlere kütüphane kurmak için kullanılabilir. Varsayılan
kitaplıkların ve yürütülebilir dosyaların oluşturulduğu konum inşa etmek dizin ve çünkü
Waf, bu kitaplıkların ve yürütülebilir dosyaların yerini bilir, yüklemeye gerek yoktur.
kütüphaneler başka yerde.

Kullanıcılar, derleme dizini dışında bir şeyler yüklemeyi seçerse, kullanıcılar
./waff kurmak emretmek. Varsayılan olarak, yükleme öneki / Yerel / usr, yani ./waff
kurmak programları kuracak / Usr / local / bin, kütüphaneler / Usr / local / lib, ve
başlıklar /usr/yerel/dahil. Yüklemek için genellikle süper kullanıcı ayrıcalıkları gerekir.
varsayılan önek, bu nedenle tipik komut sudo ./waff kurmak. koşarken
Waf, Waf içeren programlar öncelikle build dizininde paylaşılan kütüphaneleri kullanmayı tercih edecek,
ardından yerel ortamda yapılandırılan kitaplık yolundaki kitaplıkları arayacaktır. Yani
sisteme kitaplıkları kurarken, amaçlananın doğru olup olmadığını kontrol etmek iyi bir uygulamadır.
kütüphaneler kullanılıyor.

Kullanıcılar, aşağıdakileri geçerek farklı bir önek yüklemeyi seçebilirler. --önek seçeneği
zamanı yapılandırın, örneğin:

./wafconfig --prefix=/opt/local

Daha sonra derlemeden sonra kullanıcı verirse ./waff kurmak komut, önek /opt/yerel
kullanılacaktır.

The ./waff çamça Waf kullanılacaksa projeyi yeniden yapılandırmadan önce komut kullanılmalıdır.
şeyleri farklı bir önekte yüklemek için kullanılır.

Özetle aramanıza gerek yok. ./waff kurmak kullanmak ns-3. Çoğu kullanıcı
Waf mevcut kitaplıkları inşa etmek dizin,
ancak bazı kullanıcılar, kullanım durumları dışında programlarla çalışmayı içeriyorsa, bunu yararlı bulabilir.
arasında ns-3 dizin.

Bir WAF
En üst seviyede sadece bir Waf betiği var. ns-3 kaynak ağaç. Çalıştıkça, sen
kendinizi çok fazla zaman harcarken bulabilirsiniz kaşımak/veya derinlerde kaynak/..., ve ihtiyacı olan
Waf'ı çağırın. Sadece nerede olduğunuzu hatırlayabilir ve Waf'ı şu şekilde çağırabilirsiniz:

$ ../../../waf ...

ama bu sıkıcı ve hataya açık ve daha iyi çözümler var.

Eğer tam ns-3 depo bu küçük taş bir başlangıçtır:

$ cd $(hg kök) && ./waf ...

Daha da iyisi, bunu bir kabuk işlevi olarak tanımlamaktır:

$ function waff { cd $(hg root) && ./waf $* ; }

$ waff yapı

Yalnızca tarball'a sahipseniz, bir ortam değişkeni yardımcı olabilir:

$ dışa aktar NS3DIR="$PWD"
$ function waff { cd $NS3DIR && ./waf $* ; }

$ cd çizik
$ waff yapı

Bir modül dizininde önemsiz bir şey eklemek cazip gelebilir. WAF satırları boyunca komut dosyası
exec ../../waf. Lütfen yapma. Yeni gelenler için kafa karıştırıcı ve kötü yapıldığında
ince yapı hatalarına yol açar. Yukarıdaki çözümler gidilecek yoldur.

Test yapmak ns-3
birim testlerini çalıştırabilirsiniz. ns-3 çalıştırarak dağıtım ./test.py -c çekirdek
senaryo:

$ ./test.py -c çekirdeği

Bu testler Waf tarafından paralel olarak yürütülür. Sonunda şunu söyleyen bir rapor görmelisiniz.

92 testten 92'si geçti (92 geçti, 0 başarısız, 0 kilitlendi, 0 valgrind hatası)

Bu önemli mesajdır.

Ayrıca Waf'ın özet çıktısını ve her testi yürüten test çalıştırıcısını göreceksiniz,
hangi aslında bir şeye benzeyecek:

Waf: `/path/to/workspace/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/path/to/workspace/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (1.799s)

Oluşturulan modüller:
aodv uygulamaları köprüsü
config-store çekirdeğine tıklayın
csma csma düzeni dsdv
emu enerji akışı monitörü
internet lte ağı
hareketlilik mpi netanim
ağ nix-vektör yönlendirme ns3tcp
ns3wifi olsr açık akışı
noktadan noktaya noktadan noktaya yerleşim yayılımı
spektrum istatistikleri kademe köprüsü
şablon test araçları
topoloji okuma uan sanal ağ aygıtı
görselleştirici wifi wimax

BAŞARILI: TestSuite ns3-wifi-parazit
BAŞARILI: TestSuite histogramı

Kendi ID’n ile mağazalarını oluştur

GEÇİŞ: TestSuite nesnesi
PASS: TestSuite rastgele sayı üreteçleri
92 testten 92'si geçti (92 geçti, 0 başarısız, 0 kilitlendi, 0 valgrind hatası)

Bu komut, genellikle kullanıcılar tarafından, bir ns-3 dağıtım var
doğru inşa edilmiştir. (Sıralamayı not edin GEÇMEK: Kendi ID’n ile mağazalarını oluştur çizgiler değişebilir, ki bu sorun değil. ne
önemli olan, sondaki özet satırının tüm testlerin geçtiğini bildirmesidir; hiçbiri başarısız oldu veya
çöktü.)

Koşu a Senaryo
Komut dosyalarını genellikle Waf'ın kontrolü altında çalıştırırız. Bu, yapı sisteminin
paylaşılan kitaplık yollarının doğru ayarlandığından ve kitaplıkların şu adresten erişilebilir olduğundan emin olun:
Çalışma süresi. Bir programı çalıştırmak için, sadece --Çalıştırmak Waf'ta seçenek. hadi çalıştıralım ns-3
aşağıdakileri yazarak her yerde bulunan merhaba dünya programının eşdeğeri:

$ ./waf -- merhaba simülatörünü çalıştır

Waf önce programın doğru bir şekilde oluşturulduğundan emin olmak için kontrol eder ve eğer varsa bir yapıyı yürütür.
gereklidir. Waf daha sonra aşağıdaki çıktıyı üreten programı çalıştırır.

Merhaba Simülatörü

Tebrikler! Artık bir ns-3 kullanıcısısınız!

Ne do I do if I değil mi görmek the çıktı?

Derlemenin başarıyla tamamlandığını belirten Waf mesajları görüyorsanız ancak
"Merhaba Simülatör" çıktısına bakın, inşa modunuzu değiştirmiş olabilirsiniz.
optimize içinde bina ile WAF bölümü, ancak değişikliği geri kaçırdınız ayıklamak modu.
Bu öğreticide kullanılan tüm konsol çıktıları özel bir ns-3 günlüğe kaydetme bileşeni
kullanıcı mesajlarını konsola yazdırmak için kullanışlıdır. Bu bileşenin çıktısı
optimize edilmiş kodu derlediğinizde otomatik olarak devre dışı bırakılır -- "optimize edilir". Eğer sen
"Merhaba Simülatörü" çıktısını görmezseniz aşağıdakini yazın:

$ ./wafconfig --build-profile=debug --enable-examples --enable-tests

Waf'a hata ayıklama sürümlerini oluşturmasını söylemek için ns-3 örnekleri içeren programlar
ve testler. Yine de yazarak kodun gerçek hata ayıklama sürümünü oluşturmalısınız.

$ ./waf

Şimdi, eğer çalıştırırsanız merhaba simülatörü program, beklenen çıktıyı görmelisiniz.

Programı Argümanlar
Komut satırı argümanlarını bir ns-3 program bu kalıbı kullanır:

$ ./waf --run --command-template="%s "

Programınızın adını değiştirin ve argümanlar .
--komut şablonu Waf argümanı temel olarak gerçek olanı inşa etmek için bir reçetedir.
Komut satırı Waf, programı yürütmek için kullanmalıdır. Waf, yapının doğru olup olmadığını kontrol eder.
tamamlanır, paylaşılan kitaplık yollarını ayarlar, ardından sağlanan dosyayı kullanarak yürütülebilir dosyayı çağırır.
komut satırı şablonu, program adının eklenmesi %s Yer tutucu. (bunu kabul ediyorum
biraz garip ama durum bu. Yamalar hoş geldiniz!)

Bir başka özellikle yararlı örnek, bir test paketini kendi başına çalıştırmaktır. Diyelim ki bir
benim testim test paketi var (yok). Yukarıda, kullandığımız ./test.py bir bütün çalıştırmak için komut dosyası
gerçek test programını tekrar tekrar başlatarak paralel olarak bir dizi test, test koşucusu.
çağırmak için test koşucusu doğrudan tek bir test için:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Bu, argümanları test koşucusu program. Dan beri benim testim yok, bir
hata mesajı oluşturulacaktır. Mevcut olanı yazdırmak için test koşucusu seçenekleri:

$ ./waf --run test-runner --command-template="%s --help"

Hata ayıklama
Koşmak ns-3 hata ayıklayıcı gibi başka bir yardımcı programın kontrolü altındaki programlar (örneğin gdb)
veya bellek denetleyicisi (örneğin Valgrind), benzer bir kullanıyorsunuz --komut şablonu="..." Form.

Örneğin, çalıştırmak için ns-3 program merhaba simülatörü argümanlarla altında
gdb hata ayıklayıcı:

$ ./waf --run=hello-simulator --command-template="gdb %s --args "

Dikkat edin ns-3 program adı ile birlikte gider --Çalıştırmak argüman ve kontrol yardımcı programı
(buraya gdb) içindeki ilk belirteçtir --komut şablonu argüman. NS --args anlatır gdb
komut satırının geri kalanının "alt" programa ait olduğunu. (Biraz gdb's
anlamıyorum --args özellik. Bu durumda, program argümanlarını
--komut şablonukullanın ve gdb komuta set args.)

Hata ayıklayıcı altında bir test yapmak için bu tarifi ve öncekini birleştirebiliriz:

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

Çalışma rehber
Waf'ın tepenin üstündeki konumundan kaçması gerekiyor. ns-3 ağaç. Bu çalışma olur
çıktı dosyalarının yazılacağı dizin. Ama ya bunları uzak tutmak istiyorsan
the ns-3 kaynak ağaç? Kullan --cwd argüman:

$ ./waf --cwd=...

Çıktıyı istediğiniz yerde çalışma dizininizden başlamak daha uygun olabilir.
dosyalar, bu durumda küçük bir yönlendirme yardımcı olabilir:

$ fonksiyon waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}

Önceki sürümün bu süslemesi, mevcut çalışma dizinini kaydeder, cdiçin
Waf dizini, ardından Waf'a çalışma dizinini değiştirmesini söyler Arka kurtarılana
programı çalıştırmadan önce mevcut çalışma dizini.

KAVRAMSAL GENEL BAKIŞ


Aslında bakmaya veya yazmaya başlamadan önce yapmamız gereken ilk şey ns-3 kod
sistemdeki birkaç temel kavramı ve soyutlamayı açıklar. Bunların çoğu görünebilir
bazıları için şeffaf bir şekilde açıktır, ancak bunu okumak için zaman ayırmanızı öneririz
Sadece sağlam bir temel üzerinde başladığınızdan emin olmak için bölüm.

anahtar Soyutlamalar
Bu bölümde, ağ oluşturmada yaygın olarak kullanılan bazı terimleri gözden geçireceğiz.
özel anlam ns-3.

Düğüm
İnternet jargonunda, bir ağa bağlanan bir bilgi işlem aygıtına denir. ev sahibi or
bazen bir son sistem. çünkü ns-3 bir simülatör, özel olarak değil
Internet simülatör, yakından olduğu için kasıtlı olarak host terimini kullanmıyoruz.
İnternet ve protokolleri ile ilişkilidir. Bunun yerine, daha genel bir terim de kullanıyoruz.
Grafik Teorisinden kaynaklanan diğer simülatörler tarafından kullanılır --- düğüm.

In ns-3 temel bilgi işlem aygıtı soyutlamasına düğüm denir. Bu soyutlama
sınıf tarafından C++ ile temsil edilir Düğüm. Düğüm sınıfı yönetmek için yöntemler sağlar.
simülasyonlarda bilgi işlem cihazlarının temsilleri.

bir düşünmelisiniz Düğüm işlevsellik ekleyeceğiniz bir bilgisayar olarak. biri ekler
uygulamalar, protokol yığınları ve çevre kartları gibi şeyler, ilişkili oldukları
Bilgisayarın yararlı işler yapmasını sağlayan sürücüler. Aynı temel modeli kullanıyoruz ns-3.

Uygulama
Tipik olarak, bilgisayar yazılımı iki geniş sınıfa ayrılır. sistem Yazılım davranışlarıyla
bellek, işlemci döngüleri, disk, ağ vb. gibi çeşitli bilgisayar kaynakları,
bazı bilgi işlem modeline göre. Sistem yazılımı genellikle bu kaynakları kullanmaz
doğrudan bir kullanıcıya fayda sağlayan görevleri tamamlamak için. Bir kullanıcı genellikle bir uygulama
bazılarını gerçekleştirmek için sistem yazılımı tarafından kontrol edilen kaynakları elde eden ve kullanan
hedefi.

Çoğu zaman, sistem ve uygulama yazılımı arasındaki ayrım hattı,
işletim sistemi tuzaklarında gerçekleşen ayrıcalık düzeyi değişikliği. İçinde ns-3 gerçek yok
işletim sistemi kavramı ve özellikle ayrıcalık düzeyleri veya sistem çağrıları kavramı yoktur.
Ancak bir uygulama fikrimiz var. Tıpkı yazılım uygulamalarının çalıştığı gibi
"gerçek dünyada" görevleri gerçekleştirmek için bilgisayarlar, ns-3 uygulamalar çalışır ns-3 Nodes için
simüle edilmiş dünyada simülasyonları sürün.

In ns-3 olacak bir aktivite üreten bir kullanıcı programı için temel soyutlama
simüle edilmiş uygulamadır. Bu soyutlama, C++'da sınıf tarafından temsil edilir.
Uygulama. Uygulama sınıf, temsillerini yönetmek için yöntemler sağlar.
simülasyonlardaki kullanıcı seviyesi uygulamalarımız. Geliştiricilerin yapması bekleniyor
uzmanlaşmak Uygulama yeni oluşturmak için nesne yönelimli programlama anlamında sınıf
uygulamalar. Bu derste, sınıf uzmanlıklarını kullanacağız Uygulama denilen
UdpEchoClientUygulaması ve UdpEchoSunucu Uygulaması. Tahmin edebileceğiniz gibi, bunlar
uygulamalar, simülasyonu oluşturmak ve yankılamak için kullanılan bir istemci/sunucu uygulama seti oluşturur.
ağ paketleri

Telegram Kanal
Gerçek dünyada, bir bilgisayar bir ağa bağlanabilir. Çoğu zaman medyanın üzerinde
Bu ağlardaki veri akışlarına denir. kanallar. Ethernet kablonuzu bağladığınızda
duvardaki fiş, bilgisayarınızı bir Ethernet iletişimine bağlıyorsunuz
kanal. simüle edilmiş dünyasında ns-3, bir bağlanır Düğüm temsil eden bir nesneye
iletişim kanalı. Burada temel iletişim alt ağ soyutlamasına denir.
kanal ve sınıf tarafından C++ ile temsil edilir Telegram Kanal.

The Telegram Kanal sınıfı, iletişim alt ağ nesnelerini yönetmek için yöntemler sağlar ve
düğümleri onlara bağlar. Kanallar nesnede geliştiriciler tarafından da uzmanlaşabilir
odaklı programlama anlayışı. A Telegram Kanal uzmanlaşma, bir şey kadar basit bir şeyi modelleyebilir.
Tel. uzman Telegram Kanal büyük bir Ethernet kadar karmaşık şeyleri de modelleyebilir
anahtar veya kablosuz ağlar durumunda engellerle dolu üç boyutlu boşluk.

Özelleştirilmiş sürümlerini kullanacağız. Telegram Kanal denilen CsmaKanal, PointToPointKanal
ve WifiKanal bu eğitimde. NS CsmaKanalörneğin, bir
uygulayan bir iletişim alt ağı taşıyıcı duyu çoklu erişim iletişim
orta. Bu bize Ethernet benzeri işlevsellik sağlar.

cihaz
Eskiden bir bilgisayarı bir ağa bağlamak istiyorsanız, bunu yapmanız gerekiyordu.
belirli bir tür ağ kablosu ve (PC terminolojisinde) adı verilen bir donanım aygıtı satın alın
periferik kart bilgisayarınıza yüklenmesi gerekiyordu. Çevre kartı ise
bazı ağ işlevleri uyguladılar, bunlara Ağ Arayüz Kartları denildi veya NIC.
Bugün çoğu bilgisayar, yerleşik ağ arabirim donanımıyla birlikte gelir ve kullanıcılar bunu görmez.
bu yapı taşları.

Bir NIC, donanımı kontrol etmek için bir yazılım sürücüsü olmadan çalışmayacaktır. Unix'te (veya
Linux), bir çevresel donanım parçası olarak sınıflandırılır. cihaz. Cihazlar kontrol edilir
kullanma cihaz sürücüler, ve ağ cihazları (NIC'ler) kullanılarak kontrol edilir cihaz
sürücüler topluca olarak bilinir net cihazlar. Unix ve Linux'ta bu ağa başvurursunuz
gibi adlarla cihazlar eth0.

In ns-3 the net cihaz soyutlama, hem yazılım sürücüsünü hem de simülasyonu kapsar.
donanım. Bir ağ aygıtı, bir Düğüm etkinleştirmek için Düğüm için
diğerleriyle iletişim kurmak Nodes üzerinden simülasyonda Kanallar. Tıpkı gerçek bir bilgisayarda olduğu gibi,
a Düğüm birden fazla bağlanabilir Telegram Kanal çoklu yoluyla NetCihazlar.

Net cihaz soyutlaması, C++ 'da sınıf tarafından temsil edilir. NetCihaz. NetCihaz
sınıf, bağlantıların yönetilmesi için yöntemler sağlar. Düğüm ve Telegram Kanal nesneler; ve belki
geliştiriciler tarafından nesne yönelimli programlama anlamında uzmanlaşmıştır. kullanacağız
çeşitli özel versiyonları NetCihaz denilen CsmaNetDevice, PointToPointNetCihaz,
ve WifiNetCihazı bu eğitimde. Tıpkı bir Ethernet NIC'nin bir
Ethernet ağı, CsmaNetDevice ile çalışmak üzere tasarlanmıştır CsmaKanal;
PointToPointNetCihaz ile çalışmak üzere tasarlanmıştır PointToPointKanal ve WifiNetNevice
ile çalışmak üzere tasarlanmıştır WifiKanal.

Topoloji Yardımcılar
Gerçek bir ağda, eklenmiş (veya yerleşik) NIC'lere sahip ana bilgisayarları bulacaksınız. İçinde ns-3 we
bulacağını söylerdim Nodes ekli NetCihazlar. Büyük bir simüle edilmiş ağda
arasında birçok bağlantı ayarlamanız gerekecek. Nodes , NetCihazlar ve Kanallar.

bağlandığından beri NetCihazlar için Nodes , NetCihazlar için Kanallar, IP adresleri atama,
vb., bu tür ortak görevler ns-3, biz ne diyoruz sağlarız topoloji yardımcıları bunu yapmak için
mümkün olduğunca kolay. Örneğin, birçok farklı alabilir ns-3 temel operasyonlar
bir NetDevice oluşturun, bir MAC adresi ekleyin, o net cihazını bir Düğüm, yapılandır
düğümün protokol yığınını ve ardından NetCihaz a Telegram Kanal. Daha fazla operasyon
birden çok cihazı çok noktalı kanallara bağlamak ve ardından
bireysel ağları bir araya getirerek ağlar oluşturur. sağlayan topoloji yardımcı nesneleri sağlıyoruz.
Size kolaylık sağlamak için bu çok sayıda farklı işlemi kullanımı kolay bir modelde birleştirin.

A Ad ns-3 Senaryo
Sistemi yukarıda önerildiği gibi indirdiyseniz, bir sürümünüz olacaktır. ns-3 içinde
dizin aradı repo ev dizininizin altında. Bu sürüm dizinine geçin ve
aşağıdakine benzer bir dizin yapısı bulmalısınız:

YAZARLAR örnekleri çizik programları waf.bat*
bağlamalar LICENSE src utils.py waf-tools
inşa ns3 test.py* utils.pyc wscript
CHANGES.html BENİOKU testi-çıktı VERSİYONU wutils.py
doc RELEASE_NOTES testpy.supp waf* wutils.pyc

içinde değiştir örnekler/eğitici dizin. adlı bir dosya görmelisiniz. ilk.cc bulunan
orada. Bu, iki düğüm arasında basit bir noktadan noktaya bağlantı oluşturacak bir komut dosyasıdır.
ve düğümler arasında tek bir paketi yankılayın. Şu komut satırına bir göz atalım
hat, öyleyse devam et ve aç ilk.cc en sevdiğiniz düzenleyicide.

Ortak metin
Dosyadaki ilk satır bir emacs modu satırıdır. Bu, emac'lara biçimlendirme hakkında bilgi verir
kaynak kodumuzda kullandığımız kurallar (kodlama stili).

/* -*- Mod:C++; c-dosya-stili:"gnu"; girinti sekmeleri modu:nil; -*- */

Bu her zaman biraz tartışmalı bir konudur, bu yüzden yolumuzdan çekilsek iyi olur.
hemen. ns-3 proje, çoğu büyük proje gibi, bir kodlama stili benimsemiştir.
katkıda bulunan tüm kodların uyması gerekir. Kodunuzu katkıda bulunmak istiyorsanız
proje, sonunda uymanız gerekecek ns-3 açıklandığı gibi kodlama standardı
Dosya doc/codingstd.txt veya proje web sayfasında gösterilen okuyun.

Size sadece görünümüne ve hissine alışmanızı tavsiye ederiz. ns-3 kodla ve kabul et
kodumuzla her çalıştığınızda bu standart. Tüm geliştirme ekibi ve
katkıda bulunanlar bunu çeşitli miktarlarda homurdanarak yaptılar. Yukarıdaki emacs modu satırı
emacs düzenleyicisini kullanırsanız biçimlendirmenin doğru olmasını kolaylaştırır.

The ns-3 simülatör, GNU Genel Kamu Lisansı kullanılarak lisanslanmıştır. göreceksin
içindeki her dosyanın başında uygun GNU yasal dili ns-3 dağıtım. çoğu zaman sen
dahil olan kurumlardan biri için bir telif hakkı bildirimi görecektir. ns-3 yukarıdaki proje
GPL metni ve aşağıda listelenen bir yazar.

/*
* Bu program ücretsiz bir yazılımdır; yeniden dağıtabilir ve/veya değiştirebilirsiniz
* GNU Genel Kamu Lisansı sürüm 2 koşulları altında olduğu gibi
* Özgür Yazılım Vakfı tarafından yayınlanan;
*
* Bu program faydalı olması ümidiyle dağıtılmaktadır,
* ancak HİÇBİR GARANTİ YOKTUR; zımni garanti bile olmadan
* SATILABİLİRLİK veya BELİRLİ BİR AMACA UYGUNLUK. Bkz.
* Daha fazla ayrıntı için GNU Genel Kamu Lisansı.
*
* GNU Genel Kamu Lisansının bir kopyasını almış olmalısınız
* Bu programla birlikte; değilse, Özgür Yazılım'a yazın
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 ABD
*/

modül Kapsar
Uygun kod, bir dizi içerme ifadesiyle başlar.

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/noktadan noktaya-module.h"
#include "ns3/applications-module.h"

Üst düzey komut dosyası kullanıcılarımızın, içinde bulunan çok sayıda içerme dosyasıyla başa çıkmasına yardımcı olmak için
sistem, nispeten büyük modüllere göre gruplandırıyoruz. biz tek sağlamak
her modülde kullanılan tüm içerme dosyalarını yinelemeli olarak yükleyecek olan include dosyası.
Tam olarak hangi başlığa ihtiyacınız olduğunu aramak ve muhtemelen bir
bağımlılık sayısı doğruysa, size bir grup dosyayı çok sayıda yükleme olanağı veriyoruz.
taneciklilik. Bu en verimli yaklaşım değil ama kesinlikle yazı yazmayı sağlıyor.
scriptler çok daha kolay.

Her biri ns-3 include dosyaları adlı bir dizine yerleştirilir. ns3 (yapının altında
dizin) dosya adı çakışmalarını dahil etmekten kaçınmaya yardımcı olmak için derleme işlemi sırasında. NS
ns3/core-module.h dosya, dizinde bulacağınız ns-3 modülüne karşılık gelir.
kaynak/çekirdek indirdiğiniz sürüm dağıtımında. Bu dizini listelerseniz,
çok sayıda başlık dosyası bulun. Bir derleme yaptığınızda, Waf genel başlık yerleştirir
içindeki dosyalar ns3 uygun dizinin altındaki inşa/hata ayıklama or inşa/optimize edilmiş rehber
yapılandırmanıza bağlı olarak. Waf ayrıca otomatik olarak bir modül içerir:
tüm genel başlık dosyalarını yüklemek için dosya.

Elbette, bu öğreticiyi dini olarak takip ettiğiniz için, zaten yapmış olacaksınız.
a

$ ./waf -d hata ayıklama --enable-examples --enable-tests configuration

projeyi, örnekler ve testler içeren hata ayıklama yapılarını gerçekleştirecek şekilde yapılandırmak için.
Ayrıca bir yapmış olacaksın

$ ./waf

projeyi inşa etmek için. Yani şimdi dizine bakarsanız ../../build/debug/ns3 olur
yukarıda gösterilen dosyaları içeren dört modülü bulun. içeriğine göz atabilirsin
bu dosyaları bulun ve tüm genel içerme dosyalarını kendi dosyalarına dahil ettiklerini bulun.
ilgili modüller.

NS3 Ad alanı
Bir sonraki satırda ilk.cc komut dosyası bir ad alanı bildirimidir.

ns3 ad alanını kullanma;

The ns-3 proje adlı bir C++ ad alanında uygulanır. ns3. Bu, tüm grupları
ns-3- yardımcı olacağını umduğumuz küresel ad alanı dışındaki bir kapsamda ilgili bildirimler
diğer kodlarla entegrasyon ile. C++ kullanma açıklama tanıtır ns-3 ad
geçerli (küresel) bildirim bölgesine. Bu, bundan sonra söylemenin süslü bir yolu.
bu bildirimi yazmak zorunda kalmayacaksınız ns3:: hepsinden önce kapsam çözümleme operatörü
the ns-3 kodu kullanmak için. Ad alanlarına aşina değilseniz, lütfen danışın
hemen hemen her C++ öğreticisi ve karşılaştırın ns3 ad alanı ve burada kullanım örnekleri ile
std ad alanı ve kullanma ad standart; tartışmalarda sıklıkla bulacağınız ifadeler
of cout ve akışlar.

Günlüğü
Komut dosyasının bir sonraki satırı şudur,

NS_LOG_COMPONENT_DEFINE ("FirstScriptÖrneği");

Bu ifadeyi, Doxygen belgelerimiz hakkında konuşmak için uygun bir yer olarak kullanacağız.
sistem. Proje web sitesine bakarsanız, ns-3 proje, bir bağlantı bulacaksınız
Gezinme çubuğundaki "Belgeler". Bu bağlantıyı seçerseniz, sayfamıza yönlendirileceksiniz.
dokümantasyon sayfası. Sizi şuraya götürecek "Son Sürüm"e bir bağlantı var:
en son kararlı sürümü için belgeler ns-3. "API'yi seçerseniz
Dokümantasyon" bağlantısına yönlendirileceksiniz. ns-3 API dokümantasyon sayfası.

Sol tarafta, yapının grafiksel bir temsilini bulacaksınız.
belgeler. başlamak için iyi bir yer NS-3 Modüller içinde "kitap" ns-3 navigasyon
ağaç. genişletirseniz Modüller bir listesini göreceksiniz ns-3 modül belgeleri. bu
modül kavramı burada doğrudan modüle bağlanır, yukarıda tartışılan dosyaları içerir. bu
ns-3 günlüğe kaydetme alt sistemi tartışılmaktadır C + + İnşaatlar Kullanılmış by Tümü Modüller bölüm, yani
devam edin ve bu dokümantasyon düğümünü genişletin. Şimdi, genişletin Hata ayıklama kitap ve sonra
seçmek Günlüğü sayfamızı ziyaret edin.

Şimdi Logging modülü için Doxygen belgelerine bakıyor olmalısınız. İçinde
listesi #tanımlamak' girişini sayfanın üst kısmında göreceksiniz.
NS_LOG_COMPONENT_DEFINE. Atlamadan önce, muhtemelen aşağıdakileri aramak iyi olur.
Genel işlem hakkında fikir edinmek için günlük kaydı modülünün "Ayrıntılı Açıklaması". Sen
yapmak için aşağı kaydırabilir veya işbirliği şemasının altındaki "Diğer..." bağlantısını seçebilir
bu.

Neler olup bittiğine dair genel bir fikriniz olduğunda, devam edin ve belirli konulara bir göz atın.
NS_LOG_COMPONENT_DEFINE belgeler. Belgeleri burada çoğaltmayacağım, ancak
Özetle, bu satır adında bir günlük bileşeni bildirir FirstScriptÖrneği bu sağlar:
ada atıfta bulunarak konsol mesaj günlüğünü etkinleştirebilir ve devre dışı bırakabilirsiniz.

Ana İşlev
Bulacağınız betiğin sonraki satırları,

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

Bu, programınızın (komut dosyasının) ana işlevinin yalnızca bildirimidir. Tıpkı
Herhangi bir C++ programında, çalıştırılacak ilk işlev olacak bir ana işlev tanımlamanız gerekir.
Burada özel bir şey yok. Sizin ns-3 script sadece bir C++ programıdır.

Sonraki satır, zaman çözünürlüğünü bir nanosaniyeye ayarlar ve bu varsayılan değerdir.
değeri:

Zaman::SetResolution (Zaman::NS);

Çözünürlük, temsil edilebilecek en küçük zaman değeridir (en küçük
iki zaman değeri arasındaki temsil edilebilir fark). Çözünürlüğü tam olarak değiştirebilirsiniz
bir Zamanlar. Bu esnekliği sağlayan mekanizma biraz belleğe ihtiyaç duyar, bu nedenle bir kez
çözünürlük açıkça ayarlandığında, daha fazla güncellemeyi önleyerek belleği serbest bırakırız.
(Çözünürlüğü açıkça ayarlamazsanız, varsayılan olarak bir nanosaniye olacak ve
simülasyon başladığında bellek serbest bırakılacaktır.)

Komut dosyasının sonraki iki satırı, oluşturulan iki günlük bileşenini etkinleştirmek için kullanılır.
Yankı İstemcisi ve Yankı Sunucusu uygulamalarına:

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

Günlük bileşeni belgelerini okuduysanız, orada olduğunu görmüş olacaksınız.
her bileşende etkinleştirebileceğiniz bir dizi günlük ayrıntı düzeyi/ayrıntı düzeyidir.
Bu iki kod satırı, yankı istemcileri için INFO düzeyinde hata ayıklama günlüğünü etkinleştirir ve
sunucular. Bu, uygulamanın paketler gönderilirken mesajları yazdırmasına neden olur.
ve simülasyon sırasında alındı.

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

Topoloji Yardımcılar
DüğümKonteyner
Komut dosyamızdaki sonraki iki kod satırı aslında ns-3 Düğüm nesneler
simülasyondaki bilgisayarları temsil edecektir.

NodeContainer düğümleri;
düğümler.Oluştur (2);

için belgeleri bulalım. DüğümKonteyner devam etmeden önce sınıf. Diğer yol
belirli bir sınıfın belgelerine girmek için Sınıflar Doxygen sekmesi
sayfalar. Hala Doxygen'e sahipseniz, sayfanın en üstüne gidin ve
seçmek Sınıflar sekme. Yeni bir sekme kümesinin göründüğünü görmelisiniz, bunlardan biri Sınıf
Liste. Bu sekmenin altında tüm öğelerin bir listesini göreceksiniz. ns-3 sınıflar. Aşağı kaydır,
aramak ns3::DüğümKonteyner. Sınıfı bulduğunuzda, devam edin ve gitmek için onu seçin.
sınıf için belgeler.

Anahtar soyutlamalarımızdan birinin, Düğüm. Bu bir bilgisayarı temsil eder
protokol yığınları, uygulamalar ve çevre birimleri gibi şeyler ekleyeceğimiz
kartlar. bu DüğümKonteyner topoloji yardımcısı oluşturmak, yönetmek ve
herhangi birine erişim Düğüm bir simülasyonu çalıştırmak için yarattığımız nesneler. Yukarıdaki ilk satır
sadece bizim dediğimiz bir NodeContainer bildirir düğümler. İkinci satır, oluşturmak
yöntemi düğümler nesne ve kapsayıcıdan iki düğüm oluşturmasını ister. açıklandığı gibi
Doxygen, konteyner aşağı çağırıyor ns-3 iki tane oluşturmaya uygun sistem Düğüm
nesneler ve işaretçileri bu nesnelere dahili olarak depolar.

Komut dosyasındaki düğümler hiçbir şey yapmazlar. Bir yapı oluşturmanın bir sonraki adımı
topoloji, düğümlerimizi bir ağa bağlamaktır. En basit ağ şeklimiz
destek, iki düğüm arasındaki tek noktadan noktaya bağlantıdır. Bunlardan birini inşa edeceğiz
bağlantılar burada.

Noktadan NoktayaYardımcı
Noktadan noktaya bir bağlantı inşa ediyoruz ve oldukça olacak bir modelde
aşina olduğunuz, koymak için gereken düşük seviyeli işi yapmak için bir topoloji yardımcı nesnesi kullanıyoruz.
birlikte bağlantı. Anahtar soyutlamalarımızdan ikisinin, NetCihaz ve
Telegram Kanal. Gerçek dünyada, bu terimler kabaca çevresel kartlara karşılık gelir ve
ağ kabloları. Tipik olarak bu iki şey birbirine sıkı sıkıya bağlıdır ve kimse yapamaz.
örneğin, Ethernet aygıtları ve kablosuz kanallar arasında değiş tokuş yapmayı bekliyoruz. Topolojimiz
Yardımcılar bu yakın bağlantıyı takip eder ve bu nedenle tek bir
Noktadan NoktayaYardımcı yapılandırmak ve bağlanmak için ns-3 PointToPointNetCihaz ve
PointToPointKanal Bu komut dosyasındaki nesneler.

Komut dosyasındaki sonraki üç satır,

PointToPointYardımcı pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Gecikme", StringValue ("2ms"));

İlk satır,

PointToPointYardımcı pointToPoint;

a'yı başlatır Noktadan NoktayaYardımcı yığındaki nesne. Üst düzey bir bakış açısıyla,
Sonraki satır,

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

söyler Noktadan NoktayaYardımcı "5Mbps" (saniyede beş megabit) değerini şu şekilde kullanmak için nesne
oluşturduğunda "DataRate" PointToPointNetCihaz nesne.

Daha detaylı bir perspektiften bakıldığında, "DataRate" dizgisi dediğimiz şeye karşılık gelir.
özellik arasında PointToPointNetCihaz. Sınıf için Doxygen'e bakarsanız
ns3::PointToPointNetDevice ve için belgeleri bulun GetTypeId yöntem, yapacaksın
bir listesini bul Özellikler cihaz için tanımlanmıştır. Bunlar arasında "DataRate"
özellik. En çok kullanıcı tarafından görülebilen ns-3 nesnelerin benzer listeleri var Özellikler. bunu kullanıyoruz
içinde göreceğiniz gibi yeniden derlemeden simülasyonları kolayca yapılandırma mekanizması
aşağıdaki bölüm.

"DataRate" ile benzer PointToPointNetCihaz bir "Gecikme" bulacaksınız özellik
Ile ilişkili PointToPointKanal. son satır,

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

söyler Noktadan NoktayaYardımcı değeri olarak "2ms" (iki milisaniye) değerini kullanmak için
daha sonra oluşturduğu her noktadan noktaya kanalın iletim gecikmesi.

NetCihazKonteyner
Senaryonun bu noktasında, bir DüğümKonteyner iki düğüm içerir. biz bir
Noktadan NoktayaYardımcı bu astarlanmış ve yapmaya hazır PointToPointNetCihazlar ve tel
PointToPointKanal Aralarındaki nesneler. Tıpkı kullandığımız gibi DüğümKonteyner topoloji
oluşturmak için yardımcı nesne Nodes simülasyonumuz için soracağız Noktadan NoktayaYardımcı
cihazlarımızı bizim için yaratma, yapılandırma ve kurma ile ilgili işleri yapmak. Biz
oluşturulan tüm NetDevice nesnelerinin bir listesine sahip olmamız gerekecek, bu yüzden bir
NetDeviceContainer onları tutmak için, tıpkı bizim düğümleri tutmak için bir NodeContainer kullandığımız gibi
yaratıldı. Aşağıdaki iki kod satırı,

NetDeviceContainer cihazları;
cihazlar = pointToPoint.Install (düğümler);

cihazları ve kanalı yapılandırmayı bitirecektir. İlk satır cihazı bildirir
Yukarıda belirtilen konteyner ve ikincisi ağır kaldırmayı yapar. bu kurmak yöntemi
the Noktadan NoktayaYardımcı bir tane al DüğümKonteyner parametre olarak. Dahili olarak, bir
NetCihazKonteyner yaratıldı. içindeki her bir düğüm için DüğümKonteyner (tam olarak olmalı
iki noktadan noktaya bağlantı için) a PointToPointNetCihaz cihazda oluşturulur ve kaydedilir
konteyner. A PointToPointKanal oluşturulur ve iki PointToPointNetCihazlar vardır
ekli. Nesneler tarafından oluşturulduğunda Noktadan NoktayaYardımcı, Özellikler Önceden
yardımcıda ayarlananlar, karşılık gelen öğeleri başlatmak için kullanılır. Özellikler yaratılmış
nesneler.

yürüttükten sonra pointToPoint.Yükle (düğümler) çağrımız, her biri birer düğüme sahip iki düğümümüz olacak.
kurulu noktadan noktaya net cihaz ve aralarında tek bir noktadan noktaya kanal.
Her iki cihaz da veriyi saniyede beş megabit hızında iletecek şekilde yapılandırılacaktır.
iki milisaniyelik iletim gecikmesine sahip kanal.

İnternet Yığını Yardımcısı
Artık yapılandırılmış düğümlerimiz ve cihazlarımız var, ancak kurulu herhangi bir protokol yığınımız yok
düğümlerimizde. Sonraki iki kod satırı bununla ilgilenecektir.

InternetStackHelper yığını;
stack.Install (düğümler);

The İnternet Yığını Yardımcısı internet yığınları için bir topoloji yardımcısıdır.
Noktadan NoktayaYardımcı noktadan noktaya net cihazlardır. bu kurmak yöntem alır
DüğümKonteyner parametre olarak. Yürütüldüğünde, bir İnternet Yığını yükleyecektir.
(TCP, UDP, IP vb.) düğüm kapsayıcısındaki düğümlerin her birinde.

IPv4AdresiYardımcısı
Ardından, düğümlerimizdeki cihazları IP adresleriyle ilişkilendirmemiz gerekiyor. Biz bir
IP adreslerinin tahsisini yönetmek için topoloji yardımcısı. Kullanıcı tarafından görülebilen tek API,
gerçek adresi gerçekleştirirken kullanılacak temel IP adresini ve ağ maskesini ayarlayın
tahsis (yardımcının içinde daha düşük bir seviyede yapılır).

Örnek betiğimizdeki sonraki iki kod satırı, ilk.cc,

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

bir adres yardımcı nesnesi ilan edin ve ona IP adreslerini tahsis etmeye başlaması gerektiğini söyleyin
Ayrılabilir bitleri tanımlamak için 10.1.1.0 maskesini kullanarak ağ 255.255.255.0'dan. İle
varsayılan olarak tahsis edilen adresler birden başlayacak ve monoton olarak artacaktır, bu nedenle ilk
bu tabandan tahsis edilen adres 10.1.1.1, ardından 10.1.1.2 vb. olacaktır. Düşük
seviye ns-3 sistem aslında tahsis edilen tüm IP adreslerini hatırlar ve bir
yanlışlıkla aynı adresin iki kez oluşturulmasına neden olursanız (ki bu
bu arada hata ayıklamak çok zor).

Bir sonraki kod satırı,

Ipv4InterfaceContainer arayüzleri = address.Assign (cihazlar);

gerçek adres atamasını gerçekleştirir. İçinde ns-3 bir IP arasında ilişki kurarız
adres ve bir cihaz kullanan bir IPv4Arayüzü nesne. Tıpkı bazen bir listeye ihtiyacımız olduğu gibi
Gelecekte başvurmak üzere bir yardımcı tarafından oluşturulan net cihazları bazen bir listeye ihtiyacımız var.
IPv4Arayüzü nesneler. NS Ipv4InterfaceKonteyner bu işlevi sağlar.

Artık yığınlar kurulu ve IP adresleri ile oluşturulmuş noktadan noktaya bir ağımız var.
atandı. Bu noktada ihtiyacımız olan şey trafik oluşturacak uygulamalar.

Uygulamalar
ns-3 sisteminin temel soyutlamalarından bir diğeri, Uygulama. Bu
komut dosyası çekirdeğin iki uzmanlığını kullanıyoruz ns-3 sınıf Uygulama denilen
UdpEchoSunucu Uygulaması ve UdpEchoClientUygulaması. Tıpkı önceki çalışmalarımızda olduğu gibi
açıklamalar, temel nesneleri yapılandırmaya ve yönetmeye yardımcı olmak için yardımcı nesneleri kullanırız.
Burada, kullandığımız UdpEchoSunucu Yardımcısı ve UdpEchoClientYardımcısı hayatımızı kolaylaştıran nesneler.

UdpEchoSunucu Yardımcısı
Örnek betiğimizde aşağıdaki kod satırları, ilk.cc, bir UDP yankısı kurmak için kullanılır
Daha önce oluşturduğumuz düğümlerden birinde sunucu uygulaması.

UdpEchoServerHelper echoSunucu (9);

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

Yukarıdaki kod parçasındaki ilk kod satırı, UdpEchoSunucu Yardımcısı. Her zaman oldugu gibi,
bu uygulamanın kendisi değil, gerçek olanı yaratmamıza yardımcı olmak için kullanılan bir nesnedir.
uygulamalar. Sözleşmelerimizden biri, gereklidir Özellikler yardımcıda
yapıcı. Bu durumda yardımcı, kendisine sağlanmadıkça yararlı bir şey yapamaz.
istemcinin de bildiği bir bağlantı noktası numarası. Birini seçip umut etmektense
Her şey yolunda giderse, yapıcıya parametre olarak bağlantı noktası numarasına ihtiyacımız var. bu
yapıcı, sırayla, sadece bir Özniteliği Ayarla geçen değer ile istersen, sen
"Port" ayarlayabilir özellik kullanarak daha sonra başka bir değere Özniteliği Ayarla.

Diğer birçok yardımcı nesneye benzer şekilde, UdpEchoSunucu Yardımcısı nesnenin bir kurmak
yöntem. Altta yatan yankıya gerçekten neden olan bu yöntemin yürütülmesidir.
somutlaştırılacak ve bir düğüme eklenecek sunucu uygulaması. İlginç bir şekilde, kurmak
yöntem alır DüğümKonteyner tıpkı diğeri gibi bir parametre olarak kurmak sahip olduğumuz yöntemler
görülen. Bu aslında öyle görünmese de yönteme aktarılan şeydir.
bu durum. C++ var dolaylı olarak Dönüştürme sonucunu alan burada işte
düğümler.Al (1) (bir düğüm nesnesine akıllı bir işaretçi döndürür --- Ptr) ve bunu kullanır
isimsiz bir kurucuda DüğümKonteyner o zaman geçer kurmak. Eğer sen
derleyen ve çalışan C++ kodunda belirli bir yöntem imzası bulmak için hiçbir zaman kayıp
gayet iyi, bu tür örtük dönüşümleri arayın.

şimdi görüyoruz ki echoServer.Yükle bir yükleyecek UdpEchoSunucu Uygulaması üzerinde
bir numaralı indekste bulunan düğüm DüğümKonteyner düğümlerimizi yönetirdik. kurmak
tüm uygulamalara işaretçiler içeren bir kap döndürür (bu durumda bir
geçtiğimizden beri DüğümKonteyner bir düğüm içeren) yardımcı tarafından oluşturulur.

Uygulamalar, trafik oluşturmaya "başlamak" için bir süre gerektirir ve isteğe bağlı bir süre alabilir.
"Dur". Her ikisini de sağlıyoruz. Bu zamanlar, kullanılarak ayarlanır. UygulamaKonteyner yöntemleri
Ana Sayfa ve dur. Bu yöntemler Zaman parametreler. Bu durumda, bir kullanırız açık C + +
C++ double 1.0'ı almak ve onu bir ns-3 Zaman kullanarak nesne
a saniye döküm. Dönüştürme kurallarının model yazarı tarafından kontrol edilebileceğinin farkında olun,
ve C++'ın kendi kuralları vardır, bu nedenle parametrelerin her zaman mutlu olacağını varsayamazsınız
sizin için dönüştürüldü. iki satır,

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

yankı sunucusu uygulamasının Ana Sayfa (kendini etkinleştir) bir saniyede
simülasyon ve dur (kendini devre dışı bırakır) simülasyona on saniyede. sayesinde
bir simülasyon olayı (uygulama durdurma olayı) ilan ettiğimiz gerçeği
on saniyede yürütüldüğünde, simülasyon sürecek at en az on saniye.

UdpEchoClientYardımcısı
Eko istemci uygulaması, büyük ölçüde aşağıdakine benzer bir yöntemle kurulur:
sunucu. altta yatan var UdpEchoClientUygulaması tarafından yönetilen bir
UdpEchoClientYardımcısı.

UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Aralık", TimeValue (Saniye (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

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

Ancak yankı istemcisi için beş farklı Özellikler. İlk iki
Özellikler inşaatı sırasında belirlenir UdpEchoClientYardımcısı. Parametreleri geçiyoruz
"UzakAdres" ve "Uzak Bağlantı Noktası"nı ayarlamak için (dahili olarak yardımcıya) kullanılan
Özellikler sözleşmemize uygun olarak gerekli Özellikler parametreler
yardımcı kurucular

kullandığımızı hatırlayın. Ipv4InterfaceKonteyner IP adreslerini takip etmek için
cihazlarımıza atanmıştır. Sıfırıncı arayüz arayüzler konteyner gidiyor
içindeki sıfırıncı düğümün IP adresine karşılık gelir. düğümler konteyner. İlk
arayüzde arayüzler kapsayıcı, içindeki ilk düğümün IP adresine karşılık gelir.
the düğümler konteyner. Yani, kodun ilk satırında (yukarıdan),
yardımcı olur ve bunu söyler, bu nedenle istemcinin uzak adresini IP adresi olarak ayarlayın
sunucunun bulunduğu düğüme atanır. Ayrıca göndermesini ayarlamasını söyleriz.
dokuz numaralı bağlantı noktasına paketler.

"MaxPackets" özellik istemciye izin verdiğimiz maksimum paket sayısını söyler
simülasyon sırasında gönderir. "Aralık" özellik müşteriye ne kadar bekleyeceğini söyler
paketler ve "PacketSize" arasında özellik müşteriye paketinin ne kadar büyük olduğunu söyler
yükler olmalıdır. Bu özel kombinasyon ile Özellikler, biz söylüyoruz
1024 baytlık bir paket göndermek için istemci.

Yankı sunucusu durumunda olduğu gibi, yankı istemcisine şunu söyleriz: Ana Sayfa ve dur, fakat
burada, sunucu etkinleştirildikten bir saniye sonra istemciyi başlatıyoruz (iki saniye içinde
simülasyon).

Simülatör
Bu noktada yapmamız gereken aslında simülasyonu çalıştırmaktır. Bu kullanılarak yapılır
küresel işlev Simülatör::Çalıştır.

Simülatör::Çalıştır ();

Daha önce metotları çağırdığımızda,

serverApps.Start (Saniye (1.0));
serverApps.Stop (Saniye (10.0));
Kendi ID’n ile mağazalarını oluştur
clientApps.Start (Saniye (2.0));
clientApps.Stop (Saniye (10.0));

aslında simülatörde olayları 1.0 saniye, 2.0 saniye ve iki olay olarak planladık
10.0 saniyede. Ne zaman Simülatör::Çalıştır çağrılırsa, sistem aramaya başlayacaktır.
zamanlanmış olayların listesi ve bunların yürütülmesi. İlk önce olayı 1.0 saniyede çalıştıracak,
bu, yankı sunucusu uygulamasını etkinleştirir (bu olay, sırayla, birçok
diğer olaylar). Ardından, başlayacak olan t=2.0 saniye için programlanmış olayı çalıştıracaktır.
yankı istemci uygulaması. Yine, bu etkinlik daha birçok etkinlik planlayabilir. Başlangıç
yankı istemci uygulamasında olay uygulaması, veri aktarım aşamasına başlayacaktır.
sunucuya bir paket göndererek simülasyon.

Paketi sunucuya gönderme eylemi, gerçekleşecek bir olaylar zincirini tetikleyecektir.
perde arkasında otomatik olarak programlanan ve oyunun mekaniğini gerçekleştirecek olan
komut dosyasında ayarladığımız çeşitli zamanlama parametrelerine göre paket yankısı.

Sonunda, yalnızca bir paket gönderdiğimiz için (hatırlayın Maksimum Paketler özellik ayarlandı
bir), bu tek istemci yankı isteği tarafından tetiklenen olaylar zinciri azalacak ve
simülasyon boşta kalacaktır. Bu gerçekleştiğinde, kalan olaylar dur
sunucu ve istemci için olaylar. Bu olaylar yürütüldüğünde, hiçbir
işlenecek diğer olaylar ve Simülatör::Çalıştır İadeler. Simülasyon daha sonra tamamlanır.

Geriye sadece temizlemek kalıyor. Bu, global işlevi çağırarak yapılır.
Simülatör::Yok Et. Yardımcı işlevler olarak (veya düşük seviye ns-3 kod) yürütüldü, onlar
tüm nesneleri yok etmek için simülatöre kancalar yerleştirilecek şekilde düzenledi
bunlar oluşturuldu. Bu nesnelerin hiçbirini kendiniz takip etmek zorunda değildiniz ---
tek yapman gereken aramaktı Simülatör::Yok Et ve çıkış. bu ns-3 sistem halledildi
zor kısım senin için İlkimizin kalan satırları ns-3 senaryo, ilk.cc, sadece yap
ki:

Simülatör::Yok Et ();
0 dönmek;
}

Ne zaman the simülatör irade Dur?
ns-3 bir Ayrık Olay (DE) simülatörüdür. Böyle bir simülatörde, her olay ilişkilendirilir.
yürütme süresi ile ve simülasyon, zamansal olarak olayları yürüterek ilerler.
simülasyon zamanının sırası. Etkinlikler, gelecekteki etkinliklerin programlanmasına neden olabilir (örneğin, bir
zamanlayıcı, bir sonraki aralıkta sona ermek üzere kendisini yeniden planlayabilir).

İlk olaylar genellikle her nesne tarafından tetiklenir, örneğin IPv6 Yönlendiriciyi programlayacaktır.
Reklamlar, Komşu Talepleri, vb., bir Uygulama ilk paketi planlar
olay gönderme vb.

Bir olay işlendiğinde sıfır, bir veya daha fazla olay üretebilir. simülasyon olarak
yürütülür, olaylar tüketilir, ancak daha fazla olay oluşturulabilir (veya oluşturulmayabilir). bu
olay kuyruğunda başka olay olmadığında veya
özel bir Durdurma olayı bulunur. Stop olayı, aracılığıyla oluşturulur. Simülatör::Dur
(durma zamanı); fonksiyonu.

Tipik bir durum var Simülatör::Dur durdurmak için kesinlikle gereklidir.
simülasyon: kendi kendine devam eden bir olay olduğunda. Kendi kendini idame ettiren (veya yinelenen) olaylar
her zaman kendilerini yeniden planlayan olaylardır. Sonuç olarak, olayı her zaman saklarlar.
sıra boş değil.

Yinelenen olayları içeren birçok protokol ve modül vardır, örneğin:

· FlowMonitor - kayıp paketler için periyodik kontrol

· RIPng - yönlendirme tablolarının periyodik olarak güncellenmesi

· vesaire.

Bu durumlarda, Simülatör::Dur simülasyonu zarif bir şekilde durdurmak için gereklidir. İçinde
ek olarak, ne zaman ns-3 öykünme modunda, Gerçek Zamanlı Simülatör tutmak için kullanılır
makine saati ile uyumlu simülasyon saati ve Simülatör::Dur durdurmak gerekli
süreci.

Öğreticideki simülasyon programlarının çoğu açıkça çağırmaz. Simülatör::Dur,
olay kuyruğundaki olaylar otomatik olarak biteceğinden. Ancak bu programlar,
ayrıca bir aramayı kabul et Simülatör::Dur. Örneğin, aşağıdaki ek ifade
ilk örnek program, 11 saniyede açık bir durma planlayacaktır:

+ Simülatör::Dur (Saniye (11.0));
Simülatör::Çalıştır ();
Simülatör::Yok Et ();
0 dönmek;
}

Yukarıdakiler, bu programın davranışını gerçekten değiştirmeyecektir, çünkü bu özel
simülasyon doğal olarak 10 saniye sonra sona erer. Ama eğer durma zamanını değiştireceksen
Yukarıdaki ifadeyi 11 saniyeden 1 saniyeye çıkardığınızda simülasyonun
ekrana herhangi bir çıktı yazdırılmadan önce durur (çünkü çıktı 2. zaman civarında gerçekleşir)
saniye simülasyon süresi).

aramak önemlidir Simülatör::Dur önce çağrı Simülatör::Çalıştır; aksi takdirde,
Simülatör::Çalıştır durdurmayı yürütmek için kontrolü asla ana programa geri döndürmeyebilir!

bina kg Senaryo
Basit komut dosyalarınızı oluşturmayı önemsiz hale getirdik. tek yapman gereken şey bırakmak
sıfırdan dizinine komut dosyası yazın ve Waf'ı çalıştırırsanız otomatik olarak oluşturulacaktır.
Hadi deneyelim. kopyala örnekler/eğitim/first.cc içine çizik değiştirdikten sonra dizin
üst düzey dizine geri dönün.

$ cd../ ..
$ cp örnekleri/öğretici/first.cc kazı kazan/myfirst.cc

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

$ ./waf

olduğunu bildiren mesajlar görmelisiniz. benim ilk örnek başarıyla oluşturuldu.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
[614/708] cxx: çizik/myfirst.cc -> build/debug/scratch/myfirst_3.o
[706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (2.357s)

Şimdi örneği çalıştırabilirsiniz (programınızı kazıma dizininde oluşturursanız
sıfırdan dizininden çalıştırmalısınız):

$ ./waf --scratch/myfirst'i çalıştır

Bazı çıktılar görmelisiniz:

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.418s)
1024 bayt 10.1.1.2'ye gönderildi
1024'den 10.1.1.1 bayt alındı
1024'den 10.1.1.2 bayt alındı

Burada, derleme sisteminin dosyanın oluşturulduğundan emin olmak için kontrol ettiğini ve
sonra çalıştırır. Eko istemcisinde günlük kaydı bileşeninin gönderdiğini belirttiğini görürsünüz.
1024'de Echo Sunucusuna bir 10.1.1.2 baytlık paket. Ayrıca günlüğe kaydetme bileşenini de görürsünüz
yankı sunucusunda, 1024'den 10.1.1.1 baytı aldığını söyleyin. yankı sunucusu
paketi sessizce yankılar ve paketini aldığı yankı istemci günlüğünü görürsünüz
sunucudan geri

Ns-3 Kaynak Kod
Artık bazılarını kullandığınıza göre ns-3 yardımcılarından bazılarına göz atmak isteyebilirsiniz.
bu işlevi uygulayan kaynak kodu. En son koda göz atılabilir
web sunucumuz aşağıdaki linkte: http://code.nsnam.org/ns-3-dev. orada, göreceksin
bizim için Mercurial özet sayfası ns-3 geliştirme ağacı

Sayfanın üst kısmında bir dizi bağlantı göreceksiniz,

özet | kısa günlük | değişiklik günlüğü | grafik | etiketler | Dosyalar

Devam edin ve Dosyaları bağlantı. Çoğumuzun en üst seviyesi budur.
depoları bakacak:

drwxr-xr-x [yukarı]
drwxr-xr-x bağlamaları python dosyaları
drwxr-xr-x belge dosyaları
drwxr-xr-x örnek dosyalar
drwxr-xr-x ns3 dosyaları
drwxr-xr-x karalama dosyaları
drwxr-xr-x kaynak dosyaları
drwxr-xr-x utils dosyaları
-rw-r--r-- 2009-07-01 12:47 +0200 560 .hgignore dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 1886 .hgtags dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 1276 YAZAR dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 30961 CHANGES.html dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 17987 LİSANS dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 3742 BENİOKU dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 16171 RELEASE_NOTES dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 6 VERSION dosyası | revizyonlar | açıklama eklemek
-rwxr-xr-x 2009-07-01 12:47 +0200 88110 waf dosyası | revizyonlar | açıklama eklemek
-rwxr-xr-x 2009-07-01 12:47 +0200 28 waf.bat dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 35395 wscript dosyası | revizyonlar | açıklama eklemek
-rw-r--r-- 2009-07-01 12:47 +0200 7673 wutils.py dosyası | revizyonlar | açıklama eklemek

Örnek betiklerimiz şuradadır: örnekler dizin. üzerine tıklarsanız örnekler göreceksiniz
alt dizinlerin bir listesi. İçindeki dosyalardan biri öğretici alt dizin ilk.cc. Eğer
tıklayın ilk.cc az önce yürüdüğünüz kodu bulacaksınız.

Kaynak kodu esas olarak src dizin. Kaynak kodunu şu şekilde görüntüleyebilirsiniz:
dizin adına tıklayarak veya Dosyaları sağdaki link
dizin adı. üzerine tıklarsanız src dizini, listesine yönlendirileceksiniz
the src alt dizinler. Daha sonra üzerine tıklarsanız çekirdek alt dizini, bir listesini bulacaksınız
Dosyalar. Bulacağınız ilk dosya (bu yazı itibariyle) iptal. h. Tıklarsanız
iptal. h bağlantı, için kaynak dosyaya gönderileceksiniz iptal. h yararlı makrolar içeren
anormal koşullar algılanırsa komut dosyalarından çıkmak için.

Bu bölümde kullandığımız yardımcıların kaynak kodları şurada bulunabilir:
kaynak/uygulamalar/yardımcı dizin. almak için dizin ağacını kurcalamaktan çekinmeyin.
orada ne olduğu ve tarzı için bir his ns-3 programları.

GÜÇLENDİRME


kullanma the Günlüğü modül
Biz zaten kısa bir göz attık ns-3 üzerinden geçerken kayıt modülü
ilk.cc senaryo. Şimdi daha yakından inceleyeceğiz ve ne tür kullanım durumları olduğunu göreceğiz.
günlük kaydı alt sistemi kapsayacak şekilde tasarlanmıştır.

Günlüğü Genel Bakış
Pek çok büyük sistem, bir tür mesaj kaydetme olanağını destekler ve ns-3 bir değil
istisna. Bazı durumlarda, "operatör konsoluna" yalnızca hata mesajları kaydedilir (ki bu
tipik olarak Stderr Unix tabanlı sistemlerde). Diğer sistemlerde uyarı mesajları olabilir.
çıktının yanı sıra daha ayrıntılı bilgi mesajları. Bazı durumlarda, kayıt tesisleri
çıktıyı hızlı bir şekilde bulanıklaştırabilen hata ayıklama mesajlarının çıktısını almak için kullanılır.

ns-3 tüm bu ayrıntı düzeylerinin yararlı olduğu görüşündedir ve
mesaj günlüğü için seçilebilir, çok seviyeli yaklaşım. Loglama tamamen devre dışı bırakılabilir,
bileşen bazında etkinleştirilir veya genel olarak etkinleştirilir; ve seçilebilir sağlar
ayrıntı düzeyleri. bu ns-3 günlük modülü, basit, kullanımı nispeten kolay bir
simülasyonunuzdan faydalı bilgiler elde etmenin yolu.

Genel amaçlı bir mekanizma sağladığımızı anlamalısınız --- izleme --- için
simülasyon çıktısı için tercih edilmesi gereken modellerinizden veri alın (bkz.
izleme sistemimiz hakkında daha fazla ayrıntı için İzleme Sistemini Kullanma öğretici bölümü).
Hata ayıklama bilgileri, uyarılar, hata mesajları veya herhangi bir hata için günlük kaydı tercih edilmelidir.
komut dosyalarınızdan veya modellerinizden kolayca hızlı bir mesaj almak istediğinizde.

Şu anda, tanımlı artan ayrıntı düzeyine sahip yedi günlük mesajı düzeyi vardır.
sistem.

· LOG_ERROR --- Hata mesajlarını günlüğe kaydedin (ilişkili makro: NS_LOG_ERROR);

· LOG_WARN --- Uyarı mesajlarını günlüğe kaydet (ilişkili makro: NS_LOG_WARN);

· LOG_DEBUG --- Nispeten nadir, geçici hata ayıklama mesajlarını günlüğe kaydedin (ilişkili makro:
NS_LOG_DEBUG);

· LOG_INFO --- Program ilerlemesiyle ilgili bilgi mesajlarını günlüğe kaydedin (ilişkili makro:
NS_LOG_INFO);

· LOG_FUNCTION --- Çağrılan her işlevi açıklayan bir mesaj kaydedin (ilişkili iki makro:
Üye işlevleri için kullanılan NS_LOG_FUNCTION ve statik için kullanılan NS_LOG_FUNCTION_NOARGS
fonksiyonlar);

· LOG_LOGIC -- Bir fonksiyon içindeki mantıksal akışı açıklayan günlük mesajları (ilişkili makro:
NS_LOG_LOGIC);

· LOG_ALL --- Yukarıda bahsedilen her şeyi günlüğe kaydedin (ilişkili makro yok).

Her LOG_TYPE için ayrıca kullanılırsa tüm verilerin günlüğe kaydedilmesini sağlayan LOG_LEVEL_TYPE vardır.
Seviyesine ek olarak onun üzerindeki seviyeler. (Bunun bir sonucu olarak, LOG_ERROR ve
LOG_LEVEL_ERROR ve ayrıca LOG_ALL ve LOG_LEVEL_ALL işlevsel olarak eşdeğerdir.)
örneğin, LOG_INFO'nun etkinleştirilmesi yalnızca NS_LOG_INFO makrosu tarafından sağlanan iletileri etkinleştirir;
LOG_LEVEL_INFO'nun etkinleştirilmesi, NS_LOG_DEBUG, NS_LOG_WARN tarafından sağlanan mesajları da etkinleştirecektir.
ve NS_LOG_ERROR makroları.

Ayrıca, aşağıdakilerden bağımsız olarak her zaman görüntülenen koşulsuz bir günlük makrosu sağlıyoruz.
günlük seviyeleri veya bileşen seçimi.

· NS_LOG_UNCOND -- İlişkili mesajı koşulsuz olarak günlüğe kaydedin (ilişkili günlük düzeyi yok).

Her seviye tek tek veya toplu olarak talep edilebilir; ve günlük kaydı bir kullanılarak ayarlanabilir
kabuk ortam değişkeni (NS_LOG) veya sistem işlev çağrısını günlüğe kaydederek. görüldüğü gibi
öğreticide daha önce, kayıt sistemi Doxygen belgelerine sahiptir ve şimdi bir
Henüz yapmadıysanız, Kayıt Modülü belgelerini incelemek için iyi bir zaman.

Belgeleri ayrıntılı olarak okudunuz, şimdi bu bilgilerin bir kısmını kullanalım.
bazı ilginç bilgiler elde etmek için çizik/ilk.cc sahip olduğunuz örnek komut dosyası
zaten inşa edilmiş.

etkinleştirilmesi Günlüğü
Biraz daha günlük kaydı açmak için NS_LOG ortam değişkenini kullanalım, ancak önce
yerimizi alın, devam edin ve son komut dosyasını daha önce yaptığınız gibi çalıştırın,

$ ./waf --scratch/myfirst'i çalıştır

İlkinin şimdi tanıdık çıktısını görmelisiniz ns-3 örnek program

$ Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.413s)
1024 bayt 10.1.1.2'ye gönderildi
1024'den 10.1.1.1 bayt alındı
1024'den 10.1.1.2 bayt alındı

Yukarıda gördüğünüz "Gönderildi" ve "Alındı" iletilerinin aslında günlüğe kaydedildiği ortaya çıktı.
gelen mesajlar UdpEchoClientUygulaması ve UdpEchoSunucu Uygulaması. sorabiliriz
örneğin, günlük düzeyini ayarlayarak daha fazla bilgi yazdırmak için istemci uygulaması
NS_LOG ortam değişkeni aracılığıyla.

Buradan sh benzeri bir kabuk kullandığınızı varsayacağım.
"DEĞİŞKEN=değer" sözdizimi. csh benzeri bir kabuk kullanıyorsanız,
örneklerimi bu kabukların gerektirdiği "setenv VARIABLE value" sözdizimine dönüştürün.

Şu anda, UDP yankı istemci uygulaması aşağıdaki kod satırına yanıt veriyor:
çizik/ilk.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

Bu kod satırı, LOG_LEVEL_INFO günlüğe kaydetme düzeyi. Bir günlüğü geçtiğimizde
seviye bayrağı, aslında verilen seviyeyi ve tüm alt seviyeleri etkinleştiriyoruz. Bu durumda,
etkinleştirdik NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN ve NS_LOG_ERROR. artırabiliriz
günlüğe kaydetme düzeyi ve komut dosyasını değiştirmeden ve yeniden derlemeden daha fazla bilgi alın
NS_LOG ortam değişkenini şu şekilde ayarlamak:

$ dışa aktarma NS_LOG=UdpEchoClientApplication=level_all

Bu, kabuk ortam değişkenini ayarlar NS_LOG dizeye,

UdpEchoClientApplication=level_all

Atamanın sol tarafı, ayarlamak istediğimiz günlük kaydı bileşeninin adıdır,
ve sağ taraf kullanmak istediğimiz bayrak. Bu durumda, açacağız
uygulama için tüm hata ayıklama düzeyleri. Komut dosyasını NS_LOG setiyle çalıştırırsanız
bu şekilde, ns-3 kayıt sistemi değişikliği alacak ve aşağıdakileri görmelisiniz
çıktı:

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.404s)
UdpEchoClientUygulaması:UdpEchoClient()
UdpEchoClientUygulaması:VeriBoyutunu Ayarla(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientUygulaması:Gönder()
1024 bayt 10.1.1.2'ye gönderildi
1024'den 10.1.1.1 bayt alındı
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
1024'den 10.1.1.2 bayt alındı
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientUygulaması:~UdpEchoClient()

Uygulama tarafından sağlanan ek hata ayıklama bilgileri NS_LOG_FUNCTION'dandır.
seviye. Bu, komut dosyası sırasında uygulamadaki bir işlev her çağrıldığında gösterir.
uygulamak. Genel olarak, (en azından) NS_LOG_FUNCTION(this) öğesinin üye işlevlerde kullanımı şu şekildedir:
tercihli. NS_LOG_FUNCTION_NOARGS() işlevini yalnızca statik işlevlerde kullanın. Ancak şunu unutmayın:
içinde herhangi bir gereklilik yok ns-3 modellerin belirli herhangi bir özelliği desteklemesi gereken sistem
günlüğe kaydetme işlevi. Ne kadar bilginin günlüğe kaydedileceğine ilişkin karar,
bireysel model geliştiricisi. Eko uygulamaları durumunda, çok sayıda günlük
çıktı mevcuttur.

Artık uygulamaya yapılan işlev çağrılarının bir günlüğünü görebilirsiniz. Eğer sen
yakından bakın, dize arasında tek bir iki nokta üst üste işareti göreceksiniz UdpEchoClientUygulaması
ve bir C++ kapsam operatörü beklediğiniz yöntem adı (::). Bu
kasıtlı.

Ad aslında bir sınıf adı değil, bir günlük kaydı bileşeni adıdır. bir olduğunda
bir kaynak dosya ve bir sınıf arasında bire bir yazışma, bu genellikle
sınıf adı ama bunun aslında bir sınıf adı olmadığını anlamalısınız ve bir
size nispeten ince bir şekilde hatırlatmak için çift iki nokta üst üste yerine tek iki nokta üst üste
günlük bileşeni adını kavramsal olarak sınıf adından ayırın.

Bazı durumlarda, gerçekte hangi yöntemin belirlenmesinin zor olabileceği ortaya çıktı.
bir günlük mesajı oluşturur. Yukarıdaki metne bakarsanız, dizenin nerede olduğunu merak edebilirsiniz.
"Alınan 1024 bayt itibaren 10.1.1.2"den gelmektedir. Bunu OR' yaparak çözebilirsiniz.
önek_fonk seviye NS_LOG Çevre değişkeni. Aşağıdakileri yapmayı deneyin,

$ dışa aktar 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

Bir VEYA'yı belirtmek için kullandığımız dikey çubuk nedeniyle tırnak işaretleri gerekli olduğunu unutmayın.
işlem aynı zamanda bir Unix boru konektörüdür.

Şimdi, betiği çalıştırırsanız, kayıt sisteminin her
verilen günlük bileşeninden gelen mesajın önüne bileşen adı eklenir.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.417s)
UdpEchoClientUygulaması:UdpEchoClient()
UdpEchoClientUygulaması:VeriBoyutunu Ayarla(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientUygulaması:Gönder()
UdpEchoClientApplication:Send(): 1024'ye 10.1.1.2 bayt gönderildi
1024'den 10.1.1.1 bayt alındı
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
UdpEchoClientApplication:HandleRead(): 1024'den 10.1.1.2 bayt alındı
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientUygulaması:~UdpEchoClient()

Artık UDP yankı istemci uygulamasından gelen tüm mesajları görebilirsiniz.
olarak tanımlanmıştır. "1024'den 10.1.1.2 bayt alındı" mesajı artık açıkça görülüyor
yankı istemci uygulamasından geldiği belirlendi. Kalan mesaj şu şekilde olmalıdır:
UDP yankı sunucusu uygulamasından geliyor. Bir girerek bu bileşeni etkinleştirebiliriz.
NS_LOG ortam değişkenindeki bileşenlerin iki nokta üst üste ayrılmış listesi.

$ dışa aktar 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:
UdpEchoServerApplication=level_all|prefix_func'

Uyarı: Yeni satırı silme işleminden sonra kaldırmanız gerekir. : yukarıdaki örnek metinde
yalnızca belge biçimlendirme amacıyla oradadır.

Şimdi, betiği çalıştırırsanız, hem eko ​​istemcisinden gelen tüm günlük mesajlarını göreceksiniz.
ve sunucu uygulamaları. Bunun hata ayıklama problemlerinde çok faydalı olabileceğini görebilirsiniz.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.406s)
UdpEchoServerUygulaması:UdpEchoServer()
UdpEchoClientUygulaması:UdpEchoClient()
UdpEchoClientUygulaması:VeriBoyutunu Ayarla(1024)
UdpEchoServerApplication:StartApplication()
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientUygulaması:Gönder()
UdpEchoClientApplication:Send(): 1024'ye 10.1.1.2 bayt gönderildi
UdpEchoServerApplication:HandleRead(): 1024'den 10.1.1.1 bayt alındı
UdpEchoServerApplication:HandleRead(): Paket yankılanıyor
UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
UdpEchoClientApplication:HandleRead(): 1024'den 10.1.1.2 bayt alındı
UdpEchoServerApplication:StopApplication()
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientUygulaması:~UdpEchoClient()
UdpEchoServerUygulaması:~UdpEchoServer()

Aynı zamanda, bir günlük mesajının hangi simülasyon zamanının geldiğini görebilmek de bazen yararlıdır.
oluşturuldu. Bunu prefix_time bitinde ORing yaparak yapabilirsiniz.

$ dışa aktar 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time:
UdpEchoServerApplication=level_all|prefix_func|prefix_time'

Yine, yukarıdaki yeni satırı kaldırmanız gerekecek. Komut dosyasını şimdi çalıştırırsanız,
aşağıdaki çıktıya bakın:

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.418s)
0s UdpEchoServerUygulaması:UdpEchoServer()
0s UdpEchoClientUygulama:UdpEchoClient()
0s UdpEchoClientUygulaması:VeriBoyutunu Ayarla(1024)
1s UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2s UdpEchoClientApplication:Gönder()
2s UdpEchoClientApplication:Send(): 1024'ye 10.1.1.2 bayt gönderildi
2.00369s UdpEchoServerApplication:HandleRead(): 1024'den 10.1.1.1 bayt alındı
2.00369s UdpEchoServerApplication:HandleRead(): Paket yankılanıyor
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): 1024'den 10.1.1.2 bayt alındı
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientUygulaması:~UdpEchoClient()
UdpEchoServerUygulaması:~UdpEchoServer()

UdpEchoServer için yapıcının bir simülasyon zamanında çağrıldığını görebilirsiniz.
0 saniye. Bu aslında simülasyon başlamadan önce oluyor, ancak zaman
sıfır saniye olarak görüntülenir. Aynısı UdpEchoClient yapıcı mesajı için de geçerlidir.

Hatırlayın ki çizik/ilk.cc komut dosyası, yankı sunucusu uygulamasını bir saniyede başlattı
simülasyonun içine. Artık görebilirsiniz ki, Uygulamaya Başla sunucunun yöntemi,
aslında, bir saniyede aradı. Ayrıca yankı istemci uygulamasının olduğunu da görebilirsiniz.
komut dosyasında istediğimiz gibi iki saniyelik bir simülasyon süresinde başladı.

Simülasyonun ilerlemesini artık şuradan takip edebilirsiniz: Programİletimi aramak
arayan müşteri Gönder için TutamakOkuma yankı sunucusu uygulamasında geri arama. Not
paketin noktadan noktaya bağlantı üzerinden gönderilmesi için geçen süre 3.69
milisaniye. Yankı sunucusunun size yankılandığını bildiren bir mesaj kaydettiğini görüyorsunuz
paketi ve ardından, başka bir kanal gecikmesinden sonra, yankı istemcisinin
içinde yankılanan paket TutamakOkuma yöntemi.

Bu simülasyonda sizin olmadığınız örtülerin altında pek çok şey oluyor.
görmek de. Tüm işlemleri açarak tüm süreci çok kolay bir şekilde takip edebilirsiniz.
Sistemdeki bileşenlerin günlüğe kaydedilmesi. ayarlamayı deneyin NS_LOG aşağıdakine göre değişken,

$ dışa aktar 'NS_LOG=*=level_all|prefix_func|prefix_time'

Yukarıdaki yıldız işareti, günlük kaydı bileşeni joker karakteridir. Bu, tüm
simülasyonda kullanılan tüm bileşenlerin oturum açması. çıktıyı tekrarlamayacağım
burada (bu yazı itibariyle, tek paket yankısı için 1265 satır çıktı üretir) ancak
bu bilgiyi bir dosyaya yönlendirebilir ve en sevdiğiniz dosyaya göz atabilirsiniz.
istersen editör,

$ ./waf --run scrap/myfirst > log.out 2>&1

Bu son derece ayrıntılı günlük kaydını kişisel olarak kullandığımda,
sorun ve işlerin nerede yanlış gittiği hakkında hiçbir fikrim yok. gelişmeleri takip edebiliyorum
kesme noktaları ayarlamak ve bir hata ayıklayıcıda kodu adımlamak zorunda kalmadan kolayca kodlayın.
Çıktıyı en sevdiğim düzenleyicimde düzenleyebilir ve beklediğim şeyleri arayabilirim,
ve beklemediğim şeylerin gerçekleştiğini görüyorum. Ne olduğu hakkında genel bir fikrim olduğunda
yanlış gidiyorsa, sorunun ayrıntılı bir incelemesi için bir hata ayıklayıcıya geçiş yapıyorum.
Bu tür bir çıktı, özellikle betiğiniz tamamen bir şey yaptığında faydalı olabilir.
beklenmedik. Bir hata ayıklayıcı kullanarak adım atıyorsanız, beklenmedik bir gezintiyi kaçırabilirsiniz.
tamamen. Gezinin günlüğe kaydedilmesi, onu hızlı bir şekilde görünür hale getirir.

Ekleme Günlüğü için senin Kod
üzerinden log bileşenine çağrı yaparak simülasyonlarınıza yeni loglama ekleyebilirsiniz.
birkaç makro. içinde yapalım benim ilk.cc elimizdeki komut dosyası çizik dizin.

Bu komut dosyasında bir günlük kaydı bileşeni tanımladığımızı hatırlayın:

NS_LOG_COMPONENT_DEFINE ("FirstScriptÖrneği");

Artık, bu bileşen için tüm günlüğe kaydetmeyi etkinleştirebileceğinizi biliyorsunuz.
NS_LOG çeşitli düzeylerde ortam değişkeni. Devam edelim ve biraz günlük kaydı ekleyelim
senaryo. Bilgi düzeyi günlük mesajı eklemek için kullanılan makro, NS_LOG_INFO. Gitmek
ileriye ve komut dosyasının size bildiren bir tane ekleyin (düğümleri oluşturmaya başlamadan hemen önce)
"Topoloji Oluşturma"dır. Bu, bu kod parçacığında olduğu gibi yapılır,

Açılış çizik/ilk.cc favori düzenleyicinizde ve satırı ekleyin,

NS_LOG_INFO ("Topoloji Oluşturma");

satırlardan hemen önce,

NodeContainer düğümleri;
düğümler.Oluştur (2);

Şimdi komut dosyasını waf kullanarak oluşturun ve NS_LOG torrentini kapatmak için değişken
daha önce etkinleştirdiğimiz günlük kaydı:

$ ./waf
$ dışa aktarma NS_LOG=

Şimdi, betiği çalıştırırsanız,

$ ./waf --scratch/myfirst'i çalıştır

olur değil ilişkili günlük kaydı bileşeninden bu yana yeni mesajınızı görün
(FirstScriptÖrneği) etkinleştirilmedi. Mesajınızı görmek için yapmanız gerekenler
etkinleştirmek FirstScriptÖrneği düzeyine eşit veya daha büyük olan günlük kaydı bileşeni
NS_LOG_INFO. Yalnızca bu belirli günlük kaydını görmek istiyorsanız, etkinleştirebilirsiniz.
tarafından,

$ dışa aktar NS_LOG=FirstScriptExample=bilgi

Komut dosyasını şimdi çalıştırırsanız, yeni "Topoloji Oluşturma" günlük mesajınızı göreceksiniz,

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.404s)
Topoloji Oluşturma
1024 bayt 10.1.1.2'ye gönderildi
1024'den 10.1.1.1 bayt alındı
1024'den 10.1.1.2 bayt alındı

kullanma Komuta çizgi Argümanlar
ağır basan Varsayılan Özellikler
Nasıl değiştirebileceğiniz başka bir yol ns-3 komut dosyaları düzenlemeden davranır ve oluşturma yoluyla yapılır
komuta hat argümanlar. Komut satırı argümanlarını ayrıştırmak için bir mekanizma sağlıyoruz ve
bu argümanlara dayalı olarak yerel ve global değişkenleri otomatik olarak ayarlar.

Komut satırı argüman sistemini kullanmanın ilk adımı komut satırını bildirmektir.
ayrıştırıcı. Bu, aşağıdaki kodda olduğu gibi (ana programınızda) oldukça basit bir şekilde yapılır,

int
ana (int argc, char *argv[])
{
Kendi ID’n ile mağazalarını oluştur

Komut satırı cmd'si;
cmd.Ayrıştır (argc, argv);

Kendi ID’n ile mağazalarını oluştur
}

Bu basit iki satırlık pasaj aslında tek başına çok kullanışlıdır. Kapıyı açar
ns-3 küresel değişken ve özellik sistemler. Devam edin ve şu iki kod satırını ekleyin:
the çizik/ilk.cc başında komut dosyası ana. Devam edin ve komut dosyasını oluşturun ve çalıştırın
ancak komut dosyasından aşağıdaki şekilde yardım isteyin,

$ ./waf --run "scratch/myfirst --PrintHelp"

Bu, Waf'tan çizik/ilk komut dosyası ve komut satırı argümanını iletin
--Baskı Yardımı senaryoya. Hangi programın hangi programı alacağını belirlemek için tırnak işaretleri gereklidir.
argüman. Komut satırı ayrıştırıcısı şimdi --Baskı Yardımı tartış ve cevapla,

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.413s)
TcpL4Protokol:TcpStateMachine()
CommandLine:HandleArgument(): Handle arg name=PrintHelp değeri=
--PrintHelp: Bu yardım mesajını yazdırın.
--PrintGroups: Grup listesini yazdırın.
--PrintTypeIds: Tüm TypeId'leri yazdırın.
--PrintGroup=[grup]: Grubun tüm TypeId'lerini yazdırın.
--PrintAttributes=[typeid]: typeid'nin tüm özelliklerini yazdırın.
--PrintGlobals: Küresellerin listesini yazdırın.

Şuna odaklanalım --Print Öznitelikleri seçenek. Biz zaten ima ettik ns-3 özellik
Sistemin içinden geçerken ilk.cc senaryo. Aşağıdaki satırlara baktık
kod,

PointToPointYardımcı pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Gecikme", StringValue ("2ms"));

ve bundan bahsetti Veri hızı aslında bir özellik arasında PointToPointNetCihaz. Haydi
bir göz atmak için komut satırı argüman ayrıştırıcısını kullanın. Özellikler arasında
PointToPointNetDevice. Yardım listesi, bir TipKimliği. Bu
bulunduğu sınıfın sınıf adına karşılık gelir. Özellikler ait olmak. Bu durumda
olacak ns3::PointToPointNetDevice. Devam edelim ve yazalım,

$ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointNetDevice"

Sistem tüm bilgileri yazdıracaktır. Özellikler Bu tür bir ağ aygıtının Arasında
Özellikler listelendiğini göreceksiniz,

--ns3::PointToPointNetDevice::DataRate=[32768bps]:
Noktadan noktaya bağlantılar için varsayılan veri hızı

Bu, bir PointToPointNetCihaz içinde yaratıldı
sistem. ile bu varsayılanı geçersiz kıldık. özellik ayarı Noktadan NoktayaYardımcı
üstünde. Noktadan noktaya cihazlar ve kanallar için varsayılan değerleri şu şekilde kullanalım:
silme Cihaz Özniteliğini Ayarla çağrı ve SetChannelÖzelliği şuradan ara benim ilk.cc
sıfırdan dizininde var.

Komut dosyanız şimdi sadece Noktadan NoktayaYardımcı ve hiçbirini yapma set operasyonlar
aşağıdaki örnekte olduğu gibi,

Kendi ID’n ile mağazalarını oluştur

NodeContainer düğümleri;
düğümler.Oluştur (2);

PointToPointYardımcı pointToPoint;

NetDeviceContainer cihazları;
cihazlar = pointToPoint.Install (düğümler);

Kendi ID’n ile mağazalarını oluştur

Devam edin ve yeni komut dosyasını Waf (./waff) ve hadi geri dönelim ve bazılarını etkinleştirelim
UDP yankı sunucusu uygulamasından oturum açın ve zaman önekini açın.

$ dışa aktar 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

Komut dosyasını çalıştırırsanız, şimdi aşağıdaki çıktıyı görmelisiniz,

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.405s)
0s UdpEchoServerUygulaması:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
1024 bayt 10.1.1.2'ye gönderildi
2.25732s 1024'den 10.1.1.1 bayt alındı
2.25732s Yankı paketi
1024'den 10.1.1.2 bayt alındı
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerUygulaması:~UdpEchoServer()

Paketin olduğu simülasyon zamanına en son baktığımız zamanı hatırlayın.
yankı sunucusu tarafından alındı, 2.00369 saniyeydi.

2.00369s UdpEchoServerApplication:HandleRead(): 1024'den 10.1.1.1 bayt alındı

Şimdi paketi 2.25732 saniyede alıyor. Bunun nedeni, yeni düşürdük
veri hızı PointToPointNetCihaz Saniyede varsayılan 32768 bit'e kadar
saniyede beş megabit.

yenisini verecek olursak Veri hızı komut satırını kullanarak simülasyonumuzu hızlandırabiliriz
tekrar yukarı. Bunu, yardımın ima ettiği formüle göre aşağıdaki şekilde yapıyoruz.
öğe:

$ ./waf --run "scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps"

Bu, varsayılan değeri ayarlayacaktır. Veri hızı özellik başına beş megabite geri dön
ikinci. Sonuç sizi şaşırttı mı? Görünüşe göre orijinali elde etmek için
komut dosyasının davranışı geri, kanalın ışık hızı gecikmesini ayarlamamız gerekecek
ilave olarak. Komut satırı sisteminden çıktısını almasını isteyebiliriz. Özellikler kanalın
tıpkı net cihaz için yaptığımız gibi:

$ ./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointChannel"

keşfediyoruz gecikme özellik kanal aşağıdaki şekilde ayarlanır:

--ns3::PointToPointChannel::Delay=[0ns]:
Kanal üzerinden iletim gecikmesi

Daha sonra bu varsayılan değerlerin her ikisini de komut satırı sistemi aracılığıyla ayarlayabiliriz,

$ ./waf --run "scratch/myfirst"
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Gecikme=2ms"

bu durumda, zamanı açıkça belirlediğimizde sahip olduğumuz zamanlamayı kurtarırız. Veri hızı ve gecikme
senaryoda:

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.417s)
0s UdpEchoServerUygulaması:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
1024 bayt 10.1.1.2'ye gönderildi
2.00369s 1024'den 10.1.1.1 bayt alındı
2.00369s Yankı paketi
1024'den 10.1.1.2 bayt alındı
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerUygulaması:~UdpEchoServer()

Paketin sunucu tarafından yeniden 2.00369 saniyede alındığını unutmayın. Yapabiliriz
aslında herhangi birini ayarla Özellikler scriptte bu şekilde kullanılmıştır. Özellikle biz
ayarlayın UdpEchoClient özellik Maksimum Paketler birden başka bir değere.

Bu konuda nasıl hareket edersin? Bir şans ver. Yere yorum yapmanız gerektiğini unutmayın
varsayılanı geçersiz kılıyoruz özellik ve açıkça ayarlanmış Maksimum Paketler senaryoda. Sonra siz
senaryoyu yeniden inşa etmek zorunda. Ayrıca, gerçekten ayarlamak için sözdizimini bulmanız gerekecek.
komut satırı yardım özelliğini kullanarak yeni varsayılan öznitelik değeri. Buna sahip olduktan sonra
komuttan yankılanan paket sayısını kontrol edebilmeniz gerektiğini anladım
astar. İyi insanlar olduğumuz için, size komut satırınızın sonunda aramanız gerektiğini söyleyeceğiz.
gibi bir şey,

$ ./waf --run "scratch/myfirst"
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Gecikme=2ms
--ns3::UdpEchoClient::MaxPackets=2"

Kancalayan kg Kendi Değerler
Komut satırı sistemine kendi kancalarınızı da ekleyebilirsiniz. Bu oldukça basit bir şekilde yapılır
ile Değer katmak komut satırı ayrıştırıcısına yöntem.

Tamamen farklı bir şekilde yankılanacak paket sayısını belirtmek için bu özelliği kullanalım.
yol. adında bir yerel değişken ekleyelim. nPaketler için ana işlev. başlatacağız
önceki varsayılan davranışımızla eşleşmesi için bire. Komut satırı ayrıştırıcısına izin vermek için
bu değeri değiştirin, değeri ayrıştırıcıya bağlamamız gerekiyor. Bunu bir çağrı ekleyerek yapıyoruz
için Değer katmak. Devam et ve değiştir çizik/ilk.cc ile başlamak için komut dosyası
aşağıdaki kod,

int
ana (int argc, char *argv[])
{
uint32_t nPackets = 1;

Komut satırı cmd'si;
cmd.AddValue("nPackets", "Yankılanacak paket sayısı", nPackets);
cmd.Ayrıştır (argc, argv);

Kendi ID’n ile mağazalarını oluştur

Komut dosyasında ayarladığımız noktaya ilerleyin. Maksimum Paketler özellik ve değiştir
böylece değişkene ayarlanmış nPaketler sabit yerine 1 aşağıda gösterildiği gibi.

echoClient.SetAttribute ("MaxPackets", UintegerValue (nPackets));

Şimdi betiği çalıştırır ve sağlarsanız --Baskı Yardımı argüman, yeni görmelisin
kullanıcı Tartışma yardım ekranında listelenir.

Deneyin,

$ ./waf --run "scratch/myfirst --PrintHelp"

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.403s)
--PrintHelp: Bu yardım mesajını yazdırın.
--PrintGroups: Grup listesini yazdırın.
--PrintTypeIds: Tüm TypeId'leri yazdırın.
--PrintGroup=[grup]: Grubun tüm TypeId'lerini yazdırın.
--PrintAttributes=[typeid]: typeid'nin tüm özelliklerini yazdırın.
--PrintGlobals: Küresellerin listesini yazdırın.
Kullanıcı Argümanları:
--nPackets: Yankılanacak paket sayısı

Yankılanacak paket sayısını belirtmek istiyorsanız, şimdi bunu ayarlayarak yapabilirsiniz.
--nPaketler komut satırındaki argüman,

$ ./waf --run "scratch/myfirst --nPackets=2"

Şimdi görmelisin

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.404s)
0s UdpEchoServerUygulaması:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
1024 bayt 10.1.1.2'ye gönderildi
2.25732s 1024'den 10.1.1.1 bayt alındı
2.25732s Yankı paketi
1024'den 10.1.1.2 bayt alındı
1024 bayt 10.1.1.2'ye gönderildi
3.25732s 1024'den 10.1.1.1 bayt alındı
3.25732s Yankı paketi
1024'den 10.1.1.2 bayt alındı
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerUygulaması:~UdpEchoServer()

Şimdi iki paketi tekrarladınız. Oldukça kolay, değil mi?

olduğunu görebilirsin ns-3 kullanıcı, komut satırı argüman sistemini kullanabilirsiniz.
küresel değerleri kontrol etmek ve Özellikler. Model yazarsanız, yeni ekleyebilirsiniz
Özellikler sizin için nesneler ve bunlar sizin tarafınızdan ayarlanmak üzere otomatik olarak hazır olacaktır.
Kullanıcılar komut satırı sistemi aracılığıyla. Bir komut dosyası yazarıysanız, yeni ekleyebilirsiniz
değişkenleri komut dosyalarınıza ekleyin ve bunları komut satırı sistemine oldukça acısız bir şekilde bağlayın.

kullanma the İzleme sistem
Simülasyonun tüm amacı, daha fazla çalışma için çıktı üretmektir ve ns-3
izleme sistemi bunun için birincil mekanizmadır. Dan beri ns-3 bir C++ programıdır, standart
C++ programlarından çıktı üretme olanakları kullanılabilir:

#Dahil etmek
Kendi ID’n ile mağazalarını oluştur
int main ()
{
Kendi ID’n ile mağazalarını oluştur
std::cout << "x'in değeri " << x << std::endl;
Kendi ID’n ile mağazalarını oluştur
}

Çözümünüze küçük bir yapı eklemek için günlük modülünü bile kullanabilirsiniz. Orası
bu tür yaklaşımlar tarafından üretilen birçok iyi bilinen problemdir ve bu nedenle bir
önemli olduğunu düşündüğümüz sorunları ele almak için genel olay izleme alt sistemi.

Kuruluşun temel hedefleri ns-3 izleme sistemi şunlardır:

· Temel görevler için izleme sistemi, kullanıcının standart izleme oluşturmasına izin vermelidir.
popüler izleme kaynakları için ve izlemeyi hangi nesnelerin oluşturduğunu özelleştirmek için;

· Orta düzey kullanıcılar, çıktı biçimini değiştirmek için izleme sistemini genişletebilmelidir.
çekirdeğini değiştirmeden oluşturulan veya yeni izleme kaynakları eklemek için
simülatör;

· İleri düzey kullanıcılar, yeni izleme kaynakları ve havuzlar eklemek için simülatör çekirdeğini değiştirebilir.

The ns-3 izleme sistemi, bağımsız izleme kaynakları kavramları üzerine kurulmuştur ve
lavaboları izlemek ve kaynakları lavabolara bağlamak için tek tip bir mekanizma. İz kaynakları
Bir simülasyonda meydana gelen olayları işaret edebilen ve erişim sağlayan varlıklar
ilginç temel veriler. Örneğin, bir izleme kaynağı, bir paketin ne zaman olduğunu belirtebilir.
bir ağ cihazı tarafından alınır ve ilgili izleme için paket içeriğine erişim sağlar
lavabolar.

İz kaynakları kendi başlarına yararlı değildir, diğer kaynaklara "bağlantılı" olmalıdırlar.
havuz tarafından sağlanan bilgilerle gerçekten yararlı bir şey yapan kod. İz
havuzlar, izleme kaynakları tarafından sağlanan olayların ve verilerin tüketicileridir. Örneğin,
(izleme kaynağına bağlandığında) bir izleme havuzu oluşturulabilir.
önceki örnek) alınan paketin ilginç kısımlarını yazdırın.

Bu açık bölümün mantığı, kullanıcıların yeni tip lavabolar eklemesine izin vermektir.
çekirdeğin düzenlenmesini ve yeniden derlenmesini gerektirmeden mevcut izleme kaynakları
simülatör. Bu nedenle, yukarıdaki örnekte, bir kullanıcı kendi içinde yeni bir izleme havuzu tanımlayabilir.
komut dosyası oluşturun ve onu simülasyon çekirdeğinde tanımlanan mevcut bir izleme kaynağına ekleyin.
yalnızca kullanıcı komut dosyasını düzenleme.

Bu eğitimde, önceden tanımlanmış bazı kaynakları ve havuzları inceleyeceğiz ve nasıl yapılacağını göstereceğiz.
az kullanıcı çabasıyla özelleştirilebilirler. ns-3 kılavuzuna veya nasıl yapılır bölümlerine bakın
izlemeyi genişletme dahil gelişmiş izleme yapılandırması hakkında bilgi için
ad alanı ve yeni izleme kaynakları oluşturma.

ASCII İzleme
ns-3 size yardımcı olmak için düşük seviyeli izleme sistemini saran yardımcı işlevsellik sağlar
bazı kolayca anlaşılan paket izlerinin yapılandırılmasıyla ilgili ayrıntılarla. Eğer sen
bu işlevi etkinleştirin, bir ASCII dosyalarında çıktı göreceksiniz --- dolayısıyla adı. İçin
aşina olanlar ns-2 çıktı, bu tür izleme, çıkış.tr oluşturulan
birçok komut dosyası tarafından.

Hemen içeri atlayalım ve bir miktar ASCII izleme çıktısını dosyamıza ekleyelim. çizik/ilk.cc
senaryo. aramadan hemen önce Simülatör::Çalıştır (), aşağıdaki kod satırlarını ekleyin:

AsciiTraceHelper ascii;
pointToPoint.EnableAsciiAll (ascii.CreateFileStream ("myfirst.tr"));

Birçok diğerinde olduğu gibi ns-3 deyimler, bu kod ASCII oluşturmaya yardımcı olmak için bir yardımcı nesne kullanır
izler. İkinci satır, iki iç içe yöntem çağrısı içerir. "İç" yöntemi,
CreateFileStream() üzerinde bir dosya akışı nesnesi oluşturmak için adsız bir nesne deyimi kullanır.
yığın (nesne adı olmadan) ve çağrılan yönteme aktarın. buna gireceğiz
gelecekte daha fazla, ancak bu noktada bilmeniz gereken tek şey, bir
"myfirst.tr" adlı bir dosyayı temsil eden ve onu ileten nesne ns-3. sen anlatıyorsun
ns-3 yaratılan nesnenin yaşam boyu sorunları ile başa çıkmak ve aynı zamanda sorunlarla uğraşmak
kopyalamayla ilgili C++ ofstream nesnelerinin az bilinen (kasıtlı) bir sınırlamasından kaynaklanır
yapıcılar.

Dış çağrı, EnableAsciiAll(), yardımcıya ASCII'yi etkinleştirmek istediğinizi söyler
simülasyonunuzdaki tüm noktadan noktaya cihazlarda izleme; ve istediğiniz (sağlanan)
ASCII formatında paket hareketi hakkında bilgi yazmak için izleme havuzları.

Aşina olanlar için ns-2, izlenen olaylar popüler izleme noktalarına eşdeğerdir
"+", "-", "d" ve "r" olaylarını günlüğe kaydeden.

Artık betiği oluşturabilir ve komut satırından çalıştırabilirsiniz:

$ ./waf --scratch/myfirst'i çalıştır

Daha önce birçok kez gördüğünüz gibi, Waf'tan bazı mesajlar göreceksiniz ve ardından
Çalışan programdan bir dizi mesajla "'build' başarıyla tamamlandı".

Çalıştırıldığında, program adlı bir dosya oluşturmuş olacaktır. ilk.tr. yol yüzünden
Waf çalışıyorsa, dosya yerel dizinde oluşturulmaz,
varsayılan olarak havuzun üst düzey dizini. İzlerin nerede olduğunu kontrol etmek istiyorsanız
kaydedilir, kullanabilirsiniz --cwd Bunu belirtmek için Waf seçeneği. öyle yapmadık yani
repomuzun üst seviye dizinine geçmemiz ve ASCII'ye bir göz atmamız gerekiyor
izleme dosyası ilk.tr en sevdiğiniz düzenleyicide.

ayrıştırma ASCII İzler
Orada oldukça yoğun bir biçimde çok fazla bilgi var, ancak ilk dikkat çeken şey
bu dosyada bir dizi farklı satır olmasıdır. görmek zor olabilir
pencerenizi önemli ölçüde genişletmediğiniz sürece bu açıkça görülür.

Dosyadaki her satır bir iz olay. Bu durumda olayları takip ediyoruz
the iletmek kuyruk simülasyondaki her noktadan noktaya ağ cihazında bulunur. bu
iletim kuyruğu, her paketin noktadan noktaya bir kanala yönlendirildiği bir kuyruktur.
geçmek gerekir. İzleme dosyasındaki her satırın yalnız bir karakterle başladığını unutmayın (bir
ondan sonra boşluk). Bu karakter aşağıdaki anlama sahip olacaktır:

· +: Aygıt kuyruğunda bir kuyruğa alma işlemi gerçekleşti;

· -: Aygıt kuyruğunda kuyruktan çıkarma işlemi gerçekleşti;

· d: Tipik olarak sıra dolduğundan bir paket düşürüldü;

· r: Ağ cihazı tarafından bir paket alındı.

İzleme dosyasındaki ilk satırın daha ayrıntılı bir görünümünü ele alalım. onu kıracağım
sol tarafta bir referans numarası ile bölümlere (açıklık için girintili) ayırın:

+
2
/NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue
ns3::PppBaşlığı (
Noktadan Noktaya Protokol: IP (0x0021))
ns3::Ipv4Başlığı (
tos 0x0 ttl 64 id 0 protokolü 17 offset 0 flag [yok]
uzunluk: 1052 10.1.1.1 > 10.1.1.2)
ns3::UdpBaşlığı (
uzunluk: 1032 49153 > 9)
Yük (boyut=1024)

Bu genişletilmiş izleme olayının ilk bölümü (referans numarası 0) işlemdir. Biz
var bir + karakter, yani bu bir enqueue iletim kuyruğunda işlem.
İkinci bölüm (referans 1), saniye cinsinden ifade edilen simülasyon süresidir. Yapabilirsin
diye sorduğumuzu hatırlayın. UdpEchoClientUygulaması paketleri iki saniyede göndermeye başlamak için.
Burada bunun gerçekten de gerçekleştiğine dair onay görüyoruz.

Örnek izlemenin sonraki bölümü (referans 2) bize hangi izleme kaynağının kaynaklandığını söyler
bu olay (izleme ad alanında ifade edilir). İzleme ad alanını düşünebilirsiniz
bir dosya sistemi ad alanı gibi. Ad alanının kökü,
Düğüm Listesi. Bu, içinde yönetilen bir kapsayıcıya karşılık gelir. ns-3 hepsini içeren çekirdek kod
bir komut dosyasında oluşturulan düğümlerin. Tıpkı bir dosya sisteminin dizinleri olabileceği gibi
kök altında, düğüm numaralarımız olabilir Düğüm Listesi. dize /Düğüm Listesi/0
bu nedenle, içindeki sıfırıncı düğümü ifade eder. Düğüm Listesi genellikle "düğüm" olarak düşündüğümüz
0". Her düğümde kurulu cihazların bir listesi vardır. Bu liste görünür
ad alanında bir sonraki. Bu trace olayının geldiğini görebilirsiniz. Cihaz Listesi/0 hangi
düğümde kurulu sıfırıncı cihaz.

Bir sonraki dize, $ns3::PointToPointNetDevice içinde ne tür bir cihaz olduğunu söyler.
sıfır düğümü için aygıt listesinin sıfırıncı konumu. operasyon olduğunu hatırlayın. + bulundu
00 referansı, aygıtın iletim kuyruğunda bir kuyruğa alma işleminin gerçekleştiği anlamına geliyordu.
Bu, "iz yolunun" son bölümlerinde yansıtılır. TxQueue/Sıralama.

İzlemedeki kalan bölümler oldukça sezgisel olmalıdır. Referanslar 3-4 gösterir
paketin noktadan noktaya protokolde kapsüllenmiş olması. 5-7 numaralı referanslar şunu göstermektedir:
paketin bir IP sürüm dört başlığı vardır ve 10.1.1.1 IP adresinden kaynaklanır ve
10.1.1.2'ye yöneliktir. 8-9 referansları bu paketin bir UDP başlığına sahip olduğunu gösterir ve,
son olarak, referans 10, yükün beklenen 1024 bayt olduğunu gösterir.

İzleme dosyasındaki bir sonraki satır, iletimden çıkarılan aynı paketi gösterir.
aynı düğümde sıraya girin.

İzleme dosyasındaki üçüncü satır, ağ aygıtı tarafından alınan paketi gösterir.
yankı sunucusuyla düğüm. Aşağıda bu olayı tekrarladım.

r
2.25732
/NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
ns3::Ipv4Başlığı (
tos 0x0 ttl 64 id 0 protokolü 17 offset 0 flag [yok]
uzunluk: 1052 10.1.1.1 > 10.1.1.2)
ns3::UdpBaşlığı (
uzunluk: 1032 49153 > 9)
Yük (boyut=1024)

İzleme işleminin şimdi olduğuna dikkat edin. r ve simülasyon süresi 2.25732'ye yükseldi
saniye. Öğretici adımlarını yakından takip ediyorsanız, bu, sahip olduğunuz anlamına gelir.
sol Veri hızı ağ cihazlarının ve kanalın gecikme varsayılan değerlerine ayarlayın.
Bu sefer, daha önce bir önceki bölümde gördüğünüz için tanıdık gelecektir.

İzleme kaynağı ad alanı girişi (referans 02), bu olayın
düğüm 1'den geliyor (/Düğüm Listesi/1) ve paket alım izleme kaynağı (/MacRx). O
paketin ilerlemesini topoloji üzerinden takip etmeniz oldukça kolay olmalıdır.
dosyadaki izlerin geri kalanına bakarak.

PCAP İzleme
The ns-3 aygıt yardımcıları da izleme dosyaları oluşturmak için kullanılabilir. .pcap biçim.
kısaltma pcap (genellikle küçük harfle yazılır) paket yakalama anlamına gelir ve aslında bir
tanımını içeren API .pcap dosya formatı. En popüler program
Bu formatı okuyabilir ve görüntüleyebilir Wireshark (eski adıyla Ethereal). Ancak, orada
bu paket biçimini kullanan birçok trafik izi analizcisidir. Kullanıcıları teşvik ediyoruz
pcap izlerini analiz etmek için mevcut birçok araçtan yararlanın. Bu eğitimde, biz
tcpdump ile pcap izlerini görüntülemeye odaklanın.

pcap izlemeyi etkinleştirmek için kullanılan kod tek satırlıdır.

pointToPoint.EnablePcapAll ("benim ilkim");

Devam edin ve bu kod satırını az önce eklediğimiz ASCII izleme kodundan sonra ekleyin.
çizik/ilk.cc. Yalnızca "myfirst" dizesini geçtiğimize dikkat edin,
"myfirst.pcap" veya benzeri bir şey. Bunun nedeni parametrenin bir önek olması, bir
tam dosya adı. Yardımcı aslında her noktadan noktaya için bir izleme dosyası oluşturacaktır.
simülasyondaki cihaz. Dosya adları önek, düğüm numarası,
cihaz numarası ve bir ".pcap" son eki.

Örnek betiğimizde, sonunda "myfirst-0-0.pcap" adlı dosyaları göreceğiz ve
1-cihaz 0 düğümü ve düğüm 0-cihaz 0 için pcap izleri olan "myfirst-1-0.pcap",
respectivamente.

Pcap izlemeyi etkinleştirmek için kod satırını ekledikten sonra, komut dosyasını
olağan yol:

$ ./waf --scratch/myfirst'i çalıştır

Dağıtımınızın en üst düzey dizinine bakarsanız, şimdi üç günlük görmelisiniz.
dosyaları: ilk.tr daha önce incelediğimiz ASCII izleme dosyasıdır. benim ilk-0-0.pcap
ve benim ilk-1-0.pcap az önce oluşturduğumuz yeni pcap dosyalarıdır.

Okuma çıktı ile tcp dökümü
Bu noktada yapılacak en kolay şey kullanmak olacaktır. tcp dökümü bakmak için pkap dosyaları.

$ tcpdump -nn -tt -r ilk-0-0.pcap
myfirst-0-0.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, uzunluk 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, uzunluk 1024

tcpdump -nn -tt -r myfirst-1-0.pcap
myfirst-1-0.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, uzunluk 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, uzunluk 1024

çöplükte görebilirsin benim ilk-0-0.pcap (istemci cihaz) yankı paketinin
2 saniyede simülasyona gönderilir. İkinci çöplüğe bakarsanız (benim ilk-1-0.pcap)
paketin 2.257324 saniyede alındığını görebilirsiniz. paketin olduğunu görüyorsun
ikinci dökümde 2.257324 saniyede yankılandı ve sonunda paketin
2.514648 saniyede ilk dökümde istemciye geri alındı.

Okuma çıktı ile Wireshark
Wireshark'a aşina değilseniz, bulabileceğiniz bir web sitesi var.
programları ve belgeleri indirin: http://www.wireshark.org/.

Wireshark, bu izleri görüntülemek için kullanılabilecek bir grafik kullanıcı arayüzüdür.
Dosyalar. Wireshark'ınız varsa, izleme dosyalarının her birini açabilir ve görüntüleyebilirsiniz.
içindekiler, paketleri sanki bir paket sniffer.

BİNA TOPOLOJİLER


bina a Otobüs Topoloji
Bu bölümde ustalığımızı genişleteceğiz. ns-3 ağ cihazları ve kanalları
bir otobüs ağı örneğini kapsar. ns-3 CSMA dediğimiz bir net cihaz ve kanal sağlar
(Carrier Sense Çoklu Erişim).

The ns-3 CSMA cihazı, Ethernet ruhu içinde basit bir ağı modeller. Gerçek bir Ethernet
CSMA/CD (Çarpışma Algılamalı Taşıyıcı Sense Çoklu Erişim) şemasını kullanır
paylaşılan iletim ortamı için rekabet etmek için katlanarak artan geri çekilme. bu ns-3
CSMA cihazı ve kanal modelleri bunun yalnızca bir alt kümesidir.

Tıpkı inşa ederken noktadan noktaya topoloji yardımcı nesneleri gördüğümüz gibi
noktadan noktaya topolojiler, bu bölümde eşdeğer CSMA topoloji yardımcılarını göreceğiz.
Bu yardımcıların görünümü ve işleyişi size oldukça tanıdık gelmelidir.

Örnekler/öğretici} dizinimizde örnek bir komut dosyası sağlıyoruz. Bu komut dosyası üzerine kuruludur
the ilk.cc komut dosyası oluşturur ve halihazırda sahip olduğumuz noktadan noktaya simülasyona bir CSMA ağı ekler
düşünülen. Devam et ve aç örnekler/eğitim/saniye.cc en sevdiğiniz düzenleyicide. Sen
zaten yeterince görmüş olacak ns-3 bunda neler olup bittiğini anlamak için kod
örneğin, ancak betiğin tamamını gözden geçireceğiz ve çıktının bir kısmını inceleyeceğiz.

Tıpkı ilk.cc örnek (ve tüm ns-3 örneklerinde) dosya bir emacs ile başlar
mod satırı ve bazı GPL ortak özellikleri.

Gerçek kod, modül içerme dosyalarını yükleyerek başlar. ilk.cc
örnek.

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#include "ns3/noktadan noktaya-module.h"
#include "ns3/applications-module.h"
#include "ns3/ipv4-global-routing-helper.h"

Şaşırtıcı derecede yararlı olabilecek bir şey, bir çizgi film gösteren küçük bir ASCII resmidir.
örnekte oluşturulan ağ topolojisinin Benzer bir "çizim" bulacaksınız.
örneklerimizin çoğu.

Bu durumda, noktadan noktaya örneğimizi genişleteceğimizi görebilirsiniz (bağlantı
aşağıdaki n0 ve n1 düğümleri arasında) sağ taraftan bir veri yolu ağı asarak. Fark etme
düğüm sayısını değiştirebildiğiniz için bu varsayılan ağ topolojisidir.
LAN'da oluşturulur. nCsma'yı bire ayarlarsanız, üzerinde toplam iki düğüm olacaktır.
LAN (CSMA kanalı) --- bir gerekli düğüm ve bir "ekstra" düğüm. Varsayılan olarak üç tane vardır
aşağıda görüldüğü gibi "ekstra" düğümler:

// Varsayılan Ağ Topolojisi
//
/ / 10.1.1.0
// n0 -------------- n1 n2 n3 n4
// noktadan noktaya | | | |
// =================
// LAN 10.1.2.0

O zaman ns-3 ad alanı Kullanılmış ve bir günlük kaydı bileşeni tanımlanır. Hepsi bu kadar
içindeydi ilk.cc, yani henüz yeni bir şey yok.

ns3 ad alanını kullanma;

NS_LOG_COMPONENT_DEFINE ("SecondScriptÖrneği");

Ana program biraz farklı bir bükülme ile başlar. için ayrıntılı bir bayrak kullanıyoruz
olup olmadığını belirlemek UdpEchoClientUygulaması ve UdpEchoSunucu Uygulaması günlüğü
bileşenleri etkinleştirilir. Bu bayrak varsayılan olarak true (günlüğe kaydetme bileşenleri etkindir)
ancak bu örneğin regresyon testi sırasında günlüğe kaydetmeyi kapatmamıza izin verir.

Ekrandaki cihaz sayısını değiştirmenize izin verecek tanıdık bir kod göreceksiniz.
Komut satırı bağımsız değişkeni aracılığıyla CSMA ağı. İzin verdiğimizde benzer bir şey yaptık.
komut satırı argümanları bölümünde değiştirilmek üzere gönderilen paket sayısı. Son
satırı, en az bir "ekstra" düğümünüz olmasını sağlar.

Kod, daha önce kapsanan API'nin varyasyonlarından oluşur, bu nedenle tamamen
öğreticinin bu noktasında aşağıdaki kodla rahat olun.

bool ayrıntılı = doğru;
uint32_t nCsma = 3;

Komut satırı cmd'si;
cmd.AddValue ("nCsma", "\"ekstra\" CSMA düğümlerinin/cihazlarının sayısı", nCsma);
cmd.AddValue ("ayrıntılı", "Eko uygulamalarına doğruysa günlüğe kaydetmesini söyle", ayrıntılı);

cmd.Ayrıştır (argc, argv);

eğer (ayrıntılı)
{
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}

nCsma = nCsma == 0 ? 1: nCsma;

Bir sonraki adım, noktadan noktaya bağlantı yoluyla bağlanacağımız iki düğüm oluşturmaktır.
The DüğümKonteyner tıpkı yapıldığı gibi bunu yapmak için kullanılır ilk.cc.

NodeContainer p2pNode'lar;
p2pNodes.Create (2);

Sonra, başka bir ilan veriyoruz DüğümKonteyner otobüsün parçası olacak düğümleri tutmak için
(CSMA) ağı. İlk olarak, konteyner nesnesinin kendisini somutlaştırıyoruz.

NodeContainer csmaNodes;
csmaNodes.Add (p2pNodes.Get (1));
csmaNodes.Create (nCsma);

Bir sonraki kod satırı Alır ilk düğüm (bir indekse sahip olduğu gibi)
noktadan noktaya düğüm konteyneri ve onu CSMA alacak düğümlerin konteynerine ekler
cihazlar. Söz konusu düğüm, noktadan noktaya bir cihazla sonuçlanacak ve bir CSMA
cihaz. Ardından, CSMA'nın geri kalanını oluşturan bir dizi "ekstra" düğüm oluştururuz.
ağ. CSMA ağında zaten bir düğümümüz olduğu için --
hem bir noktadan noktaya hem de CSMA net cihazı, "ekstra" düğüm sayısı, sayı anlamına gelir
CSMA bölümünde arzu ettiğiniz düğümler eksi bir.

Bir sonraki kod parçası şimdiye kadar oldukça aşina olmalıdır. bir somutlaştırıyoruz Noktadan NoktayaYardımcı
ve ilişkili varsayılanı ayarlayın Özellikler böylece saniyede beş megabit oluşturuyoruz
yardımcı kullanılarak oluşturulan cihazlarda verici ve kanallarda iki milisaniye gecikme
yardımcı tarafından oluşturulur.

PointToPointYardımcı pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Gecikme", StringValue ("2ms"));

NetDeviceContainer p2pDevices;
p2pDevices = pointToPoint.Install (p2pNodes);

Daha sonra bir NetCihazKonteyner noktadan noktaya ağ cihazlarını takip etmek için
ve biz kurmak Noktadan noktaya düğümlerdeki cihazlar.

CSMA cihazları ve kanalları için bir yardımcı göreceğinizi yukarıda belirtmiştik ve
sonraki satırlar onları tanıtır. bu CsmaYardımcı tıpkı bir gibi çalışır Noktadan NoktayaYardımcı, fakat
CSMA cihazlarını ve kanallarını oluşturur ve birbirine bağlar. Bir CSMA cihazı olması durumunda ve
kanal çifti, veri hızının bir kanal özellik yerine
cihaz özellik. Bunun nedeni, gerçek bir CSMA ağının, birinin karıştırılmasına izin vermemesidir.
örneğin, belirli bir kanaldaki 10Base-T ve 100Base-T cihazları. İlk önce veri hızını
Saniyede 100 megabit ve ardından kanalın ışık hızı gecikmesini 6560 olarak ayarlayın
nano saniye (1 metrelik bir segmentte ayak başına 100 nanosaniye olarak keyfi olarak seçilir).
ayarlayabileceğinize dikkat edin. özellik yerel veri türünü kullanarak.

CsmaYardımcı csma;
csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
csma.SetChannelAttribute ("Gecikme", TimeValue (NanoSaniye (6560)));

NetDeviceContainer csmaDevices;
csmaDevices = csma.Install (csmaNodes);

Tıpkı bizim yarattığımız gibi NetCihazKonteyner tarafından oluşturulan cihazları tutmak için
Noktadan NoktayaYardımcı biz yaratırız NetCihazKonteyner bizim tarafımızdan oluşturulan cihazları tutmak için
CsmaYardımcı. diyoruz kurmak yöntem CsmaYardımcı cihazları içine kurmak için
düğümleri csmaNode'lar DüğümKonteyner.

Artık düğümlerimizi, cihazlarımızı ve kanallarımızı oluşturduk, ancak protokol yığınımız yok
sunmak. Tıpkı ilk.cc komut dosyasını kullanacağız İnternet Yığını Yardımcısı yüklemek
bu yığınlar.

InternetStackHelper yığını;
stack.Install (p2pNodes.Get (0));
stack.Install (csmaNodes);

Düğümlerden birini aldığımızı hatırlayın. p2pDüğümler konteyner ve onu ekledi
csmaNode'lar konteyner. Bu nedenle, yalnızca kalanlara yığınları yüklememiz gerekir. p2pDüğümler
düğüm ve içindeki tüm düğümler csmaNode'lar içindeki tüm düğümleri kapsayacak bir kapsayıcı
simülasyon.

Tıpkı ilk.cc örnek komut dosyası, kullanacağız IPv4AdresiYardımcısı için
cihaz arayüzlerimize IP adresleri atayın. İlk önce 10.1.1.0 ağını oluşturmak için kullanıyoruz
iki noktadan noktaya cihazımız için gereken iki adres.

Ipv4AddressHelper adresi;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer p2pArayüzler;
p2pInterfaces = adres.Ata (p2pDevices);

Çıkarmayı kolaylaştırmak için oluşturulan arayüzleri bir kapsayıcıya kaydettiğimizi hatırlayın.
daha sonra uygulamaların kurulumunda kullanılmak üzere adresleme bilgileri.

Artık CSMA cihaz arayüzlerimize IP adresleri atamamız gerekiyor. operasyon çalışır
tıpkı noktadan noktaya durumda olduğu gibi, ancak şu anda işlemi şu anda gerçekleştiriyoruz
değişken sayıda CSMA cihazına sahip bir kapsayıcı --- sayısını yaptığımızı unutmayın.
CSMA cihazları, komut satırı argümanıyla değiştirilebilir. CSMA cihazları ilişkilendirilecek
Bu durumda, aşağıda görüldüğü gibi, ağ numarası 10.1.2.0'dan gelen IP adresleri ile.

address.SetBase ("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer csmaArayüzler;
csmaInterfaces = adres.Ata (csmaDevices);

Şimdi inşa edilmiş bir topolojimiz var, ancak uygulamalara ihtiyacımız var. Bu bölüm olacak
uygulamalar bölümüne temelde benzer ilk.cc ama biz gidiyoruz
CSMA aygıtına sahip düğümlerden birinde sunucuyu ve üzerinde istemciyi örnekleyin.
yalnızca bir noktadan noktaya aygıta sahip düğüm.

İlk olarak, yankı sunucusunu kurduk. biz UdpEchoSunucu Yardımcısı ve gerekli sağlamak
özellik sunucu bağlantı noktası numarası olan yapıcıya değer. Bu limanı hatırlayın
kullanılarak daha sonra değiştirilebilir. Özniteliği Ayarla istenirse yöntem, ancak olmasını istiyoruz
yapıcıya verilir.

UdpEchoServerHelper echoSunucu (9);

ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
serverApps.Start (Saniye (1.0));
serverApps.Stop (Saniye (10.0));

Hatırlayın ki csmaNode'lar DüğümKonteyner için oluşturulan düğümlerden birini içerir.
noktadan noktaya ağ ve nCsma "ekstra" düğümler. Varmak istediğimiz son nokta
"ekstra" düğümler. sıfırıncı girişi csmaNode'lar konteyner noktadan noktaya olacak
düğüm. Bunu düşünmenin kolay yolu, eğer bir "ekstra" CSMA düğümü yaratırsak, o zaman
indekslerinden birinde olacak csmaNode'lar konteyner. Tümevarım yoluyla, eğer yaratırsak nCsma "ekstra"
düğümler sonuncusu dizinde olacak nCsma. Bunun sergilendiğini görüyorsunuz. Ön Onay ilk
kod satırı.

İstemci uygulaması, tam olarak bizim yaptığımız gibi kurulur. ilk.cc örnek komut dosyası. Yine,
gerekli olanı sağlıyoruz Özellikler için UdpEchoClientYardımcısı yapıcıda (bu durumda
uzak adres ve bağlantı noktası). İstemciye, az önce yaptığımız sunucuya paket göndermesini söyleriz.
"ekstra" CSMA düğümlerinin sonuncusuna yüklenir. İstemciyi en solda yüklüyoruz
topoloji resminde görülen noktadan noktaya düğüm.

UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Aralık", TimeValue (Saniye (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (p2pNodes.Get (0));
clientApps.Start (Saniye (2.0));
clientApps.Stop (Saniye (10.0));

Burada aslında bir ağlar arası oluşturduğumuz için, bir çeşit ağlar arası sisteme ihtiyacımız var.
yönlendirme. ns-3 size yardımcı olmak için küresel yönlendirme dediğimiz şeyi sağlar. Küresel yönlendirme
simülasyonda tüm ağlar arası erişilebilirliğin avantajı ve
simülasyon için oluşturulan tüm düğümlerden geçer --- zor işi yapar
Yönlendiricileri yapılandırmak zorunda kalmadan sizin için yönlendirmeyi ayarlama.

Temel olarak, her düğüm, bir OSPF yönlendiricisiymiş gibi davranır.
perde arkasındaki diğer tüm yönlendiricilerle anında ve sihirli bir şekilde iletişim kurar. her düğüm
bağlantı reklamları oluşturur ve bunları doğrudan global bir rota yöneticisine iletir
bu global bilgiyi her düğüm için yönlendirme tablolarını oluşturmak için kullanır. Ayar
bu yönlendirme biçimi tek satırlık bir yoldur:

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

Ardından pcap izlemeyi etkinleştiriyoruz. Pcap izlemeyi etkinleştiren ilk kod satırı
noktadan noktaya yardımcı şimdiye kadar size aşina olmalıdır. İkinci satır pcap'ı etkinleştirir
CSMA yardımcısında izleme ve henüz karşılaşmadığınız ekstra bir parametre var.

pointToPoint.EnablePcapAll ("ikinci");
csma.EnablePcap ("ikinci", csmaDevices.Get (1), true);

CSMA ağı, çok noktadan noktaya bir ağdır. Bu, olabileceği (ve
bu durumda) paylaşılan bir ortamda birden çok uç nokta. Bu uç noktaların her birinin bir ağı vardır.
onunla ilişkili cihaz. İz toplamanın iki temel alternatifi vardır
Böyle bir ağdan bilgi. Bunun bir yolu, her ağ cihazı için bir izleme dosyası oluşturmaktır.
ve yalnızca o ağ aygıtı tarafından yayılan veya tüketilen paketleri depolar. Diğer yol
cihazlardan birini seçip karışık moda yerleştirmektir. O zaman tek cihaz
tüm paketler için ağı "kokluyor" ve bunları tek bir pcap dosyasında saklar. Bu nasıl
tcp dökümüörneğin çalışır. Bu son parametre, CSMA yardımcısına bunu yapıp yapmayacağını söyler.
paketleri karışık modda yakalamak için düzenleyin.

Bu örnekte CSMA ağındaki cihazlardan birini seçip ona soracağız.
ağın rastgele bir şekilde koklanması, böylece neyin taklit edilmesi tcp dökümü yapardım.
Bir Linux makinesinde olsaydın, şöyle bir şey yapabilirsin tcp dökümü -i eth0 almak için
iz. Bu durumda cihazı kullanarak belirtiyoruz. csmaDevices.Get(1), hangisini seçer
kaptaki ilk cihaz. Son parametreyi true olarak ayarlamak, karışıklığı etkinleştirir
yakalar.

Kodun son bölümü, tıpkı aşağıdaki gibi simülasyonu çalıştırır ve temizler. ilk.cc
örnek.

Simülatör::Çalıştır ();
Simülatör::Yok Et ();
0 dönmek;
}

Bu örneği çalıştırmak için, kopyalayın saniye.cc sıfırdan dizine örnek komut dosyası
ve inşa etmek için waf'ı tıpkı ile yaptığınız gibi kullanın. ilk.cc örnek vermek. Eğer içindeyseniz
yazdığınız deponun üst düzey dizini,

$ cp örnekleri/eğitim/saniye.cc kazı kazan/mysecond.cc
$ ./waf

Uyarı: Dosyayı kullanıyoruz saniye.cc çalıştığını doğrulamak için regresyon testlerimizden biri olarak
tam olarak bizim eğitim deneyiminizi olumlu bir hale getirmek için olması gerektiğini düşündüğümüz gibi.
Bu, adlı bir yürütülebilir dosyanın ikinci projede zaten var. önlemek için
yürüttüğünüz şey hakkında kafa karışıklığı, lütfen yeniden adlandırmayı yapın ikinci.cc önerilen
yukarıdaki.

Öğreticiyi dini olarak takip ediyorsanız (öylesiniz, değil misiniz) yine de
NS_LOG değişkeni ayarlandı, bu yüzden devam edin ve bu değişkeni temizleyin ve programı çalıştırın.

$ dışa aktarma NS_LOG=
$ ./waf --çalıştır/saniyem

UDP yankı uygulamalarını, yaptığımız gibi oturum açacak şekilde ayarladığımızdan beri ilk.cc, olacaksın
betiği çalıştırdığınızda benzer çıktıyı görün.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.415s)
1024 bayt 10.1.2.4'ye gönderildi
1024'den 10.1.1.1 bayt alındı
1024'den 10.1.2.4 bayt alındı

Hatırlayın ki ilk mesaj, "Gönderilmiş 1024 bayt için 10.1.2.4," UDP yankı istemcisidir
sunucuya bir paket gönderme. Bu durumda sunucu farklı bir ağdadır.
(10.1.2.0). İkinci mesaj, "Alınan 1024 bayt itibaren 10.1.1.1," UDP yankısından
sunucu, yankı paketini aldığında oluşturulur. Son mesaj, "Alınan 1024
bayt itibaren 10.1.2.4," yankı istemcisinden geliyor ve yankısını aldığını gösteriyor
sunucudan geri

Şimdi gidip üst düzey dizine bakarsanız, üç izleme dosyası bulacaksınız:

second-0-0.pcap second-1-0.pcap second-2-0.pcap

Şimdi bu dosyaların isimlerine bir göz atalım. Hepsinin formu aynı
- - .pcap. Örneğin, listedeki ilk dosya
ikinci-0-0.pcap ki bu, sıfır düğümünden, cihaz sıfırından pcap izlemesidir. bu
sıfır düğümünde noktadan noktaya net cihaz. Dosya ikinci-1-0.pcap pcap izlemesi için mi
birinci düğümde cihaz sıfır, ayrıca bir noktadan noktaya ağ cihazı; ve dosya ikinci-2-0.pcap is
ikinci düğümdeki cihaz sıfırı için pcap izlemesi.

Bölümün başındaki topoloji resmine geri dönerseniz, şunu göreceksiniz:
bu düğüm sıfır, noktadan noktaya bağlantının en soldaki düğümüdür ve düğüm bir, düğümdür
hem noktadan noktaya hem de CSMA cihazına sahip. Düğümün iki olduğunu göreceksiniz
CSMA ağındaki ilk "ekstra" düğüm ve cihaz sıfırı cihaz olarak seçildi
karışık mod izini yakalamak için.

Şimdi yankı paketini ağlar üzerinden takip edelim. İlk önce, bir tcpdump yapın
en soldaki noktadan noktaya düğüm için izleme dosyası --- düğüm sıfır.

$ tcpdump -nn -tt -r saniye-0-0.pcap

Görüntülenen pcap dosyasının içeriğini görmelisiniz:

ikinci-0-0.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, uzunluk 1024
2.017607 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, uzunluk 1024

Dökümün ilk satırı, bağlantı türünün PPP (noktadan noktaya) olduğunu belirtir.
beklemek. Ardından, IP ile ilişkili cihaz aracılığıyla düğümü sıfırdan bırakan yankı paketini görürsünüz.
10.1.1.1 adresi, 10.1.2.4 IP adresine (en sağdaki CSMA düğümü) yönlendirilir. bu paket
noktadan noktaya bağlantı üzerinden hareket edecek ve üzerinde noktadan noktaya net cihaz tarafından alınacaktır.
düğüm bir. Hadi bir bakalım:

$ tcpdump -nn -tt -r saniye-1-0.pcap

Şimdi noktadan noktaya bağlantının diğer tarafının pcap izleme çıktısını görmelisiniz:

ikinci-1-0.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
2.003686 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, uzunluk 1024
2.013921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, uzunluk 1024

Burada beklediğimiz gibi bağlantı türünün de PPP olduğunu görüyoruz. Paketi IP'den görüyorsunuz
10.1.1.1 adresi (2.000000 saniyede gönderildi) 10.1.2.4 IP adresine yöneldi
bu arayüzde görünür. Şimdi, bu düğüme dahili olarak paket iletilecektir.
CSMA arayüzü ve nihai hedefine giden o cihazda ortaya çıktığını görmeliyiz
hedef.

CSMA ağı için rastgele sniffer düğümü olarak düğüm 2'yi seçtiğimizi unutmayın.
o zaman ikinci-2-0.pcap'a bakalım ve orada olup olmadığına bakalım.

$ tcpdump -nn -tt -r saniye-2-0.pcap

Şimdi, ikinci düğümün, cihaz sıfırının rastgele dökümünü görmelisiniz:

saniye-2-0.pcap dosyasından okuma, bağlantı tipi EN10MB (Ethernet)
2.007698 ARP, 10.1.2.4 (ff:ff:ff:ff:ff:ff) 10.1.2.1'e sahip olan talep, uzunluk 50
2.007710 ARP, Yanıt 10.1.2.4 saat 00:00:00:00:00:06, uzunluk 50
2.007803 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, uzunluk 1024
2.013815 ARP, 10.1.2.1 (ff:ff:ff:ff:ff:ff) 10.1.2.4'e sahip olan talep, uzunluk 50
2.013828 ARP, Yanıt 10.1.2.1 saat 00:00:00:00:00:03, uzunluk 50
2.013921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, uzunluk 1024

Gördüğünüz gibi bağlantı türü artık "Ethernet". Yine de yeni bir şey ortaya çıktı. bu
otobüs ağı ihtiyaçları ARP, Adres Çözümleme Protokolü. Düğüm bir göndermesi gerektiğini biliyor
paketi 10.1.2.4 IP adresine gönderir, ancak paketin MAC adresini bilmez.
karşılık gelen düğüm CSMA ağında yayın yapar (ff:ff:ff:ff:ff:ff)
IP adresi 10.1.2.4 olan cihaz. Bu durumda, en sağdaki düğüm bunu söyleyerek yanıt verir.
00:00:00:00:00:06 MAC adresindedir. İkinci düğümün buna doğrudan dahil olmadığını unutmayın.
ancak ağı kokluyor ve gördüğü tüm trafiği rapor ediyor.

Bu değişim aşağıdaki satırlarda görülmektedir,

2.007698 ARP, 10.1.2.4 (ff:ff:ff:ff:ff:ff) 10.1.2.1'e sahip olan talep, uzunluk 50
2.007710 ARP, Yanıt 10.1.2.4 saat 00:00:00:00:00:06, uzunluk 50

Ardından düğüm bir, cihaz bir devam eder ve yankı paketini şu adresteki UDP yankı sunucusuna gönderir.
IP adresi 10.1.2.4.

2.007803 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, uzunluk 1024

Sunucu yankı isteğini alır ve paketi geri göndermeye çalışarak döndürür.
kaynak. Sunucu bu adresin ulaştığı başka bir ağda olduğunu bilir.
IP adresi 10.1.2.1. Bunun nedeni, küresel yönlendirmeyi başlatmamız ve her şeyi hesaplamış olmamızdır.
bu bizim için çıktı. Ancak, yankı sunucusu düğümü, ilkinin MAC adresini bilmiyor
CSMA düğümü, bu yüzden tıpkı ilk CSMA düğümünün yapması gerektiği gibi ARP yapması gerekiyor.

2.013815 ARP, 10.1.2.1 (ff:ff:ff:ff:ff:ff) 10.1.2.4'e sahip olan talep, uzunluk 50
2.013828 ARP, Yanıt 10.1.2.1 saat 00:00:00:00:00:03, uzunluk 50

Sunucu daha sonra yankıyı iletme düğümüne geri gönderir.

2.013921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, uzunluk 1024

Noktadan noktaya bağlantının en sağındaki düğüme baktığımızda,

$ tcpdump -nn -tt -r saniye-1-0.pcap

Artık yankılanan paketin noktadan noktaya bağlantıya son olarak geri geldiğini görebilirsiniz.
iz dökümü hattı.

ikinci-1-0.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
2.003686 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, uzunluk 1024
2.013921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, uzunluk 1024

Son olarak, yankıyı oluşturan düğüme bakabilirsiniz.

$ tcpdump -nn -tt -r saniye-0-0.pcap

ve yankılanan paketin 2.007602 saniyede kaynağa geri geldiğini görün,

ikinci-0-0.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, uzunluk 1024
2.017607 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, uzunluk 1024

Son olarak, CSMA cihazlarının sayısını kontrol etme özelliğini eklediğimizi hatırlayın.
komut satırı argümanı ile simülasyon. Bu argümanı ne zaman olduğu gibi değiştirebilirsiniz.
yankılanan paketlerin sayısını değiştirmeye baktık. ilk.cc örnek vermek. koşmayı dene
"ekstra" cihaz sayısı dörde ayarlanmış program:

$ ./waf --run "scratch/saniyem --nCsma=4"

Şimdi görmelisin,

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.405s)
2s istemcisi, 1024 bağlantı noktası 10.1.2.5'a 9 bayt gönderdi
2.0118s sunucusu, 1024 bağlantı noktası 10.1.1.1'ten 49153 bayt aldı
2.0118s sunucusu zamanında 1024 bağlantı noktası 10.1.1.1'e 49153 bayt gönderdi
2.02461s istemcisi, 1024 bağlantı noktası 10.1.2.5'dan 9 bayt aldı

Yankı sunucusunun artık CSMA düğümlerinin sonuncusuna taşındığına dikkat edin.
Varsayılan durum yerine 10.1.2.5, 10.1.2.4.

Bir görgü tanığı tarafından oluşturulan bir izleme dosyasından memnun kalmamanız mümkündür.
CSMA ağı. Gerçekten tek bir cihazdan bir iz almak isteyebilirsiniz ve bunu yapamayabilirsiniz.
ağdaki diğer trafikle ilgilenin. Bunu oldukça kolay bir şekilde yapabilirsiniz.

Bir göz atalım çizik/saniye.cc ve daha fazla olmamızı sağlayan bu kodu ekleyin
özel. ns-3 yardımcılar, bir düğüm numarası ve cihaz numarası alan yöntemler sağlar.
parametreler. Devam edin ve değiştirin Pcap'ı Etkinleştir aşağıdaki aramalarla arama yapar.

pointToPoint.EnablePcap ("saniye", p2pNodes.Get (0)->GetId (), 0);
csma.EnablePcap ("ikinci", csmaNodes.Get (nCsma)->GetId (), 0, yanlış);
csma.EnablePcap ("ikinci", csmaNodes.Get (nCsma-1)->GetId (), 0, yanlış);

"İkinci" temel adıyla bir pcap dosyası oluşturmak istediğimizi biliyoruz ve ayrıca biliyoruz
her iki durumda da ilgilenilen cihaz sıfır olacak, bu yüzden bu parametreler
gerçekten ilginç.

Düğüm numarasını almak için iki seçeneğiniz vardır: birincisi, düğümler bir
oluşturduğunuz sırayla sıfırdan başlayarak monoton artan moda
onlara. Bir düğüm numarası almanın bir yolu, bu numarayı "manuel" olarak bulmaktır.
düğüm oluşturma sırasını düşünürken. Ağ topolojisine bir göz atarsanız
Dosyanın başındaki resimde, bunu sizin için yaptık ve görebilirsiniz
son CSMA düğümü, düğüm numarası olacak nCsma + 1. Bu yaklaşım can sıkıcı hale gelebilir
daha büyük simülasyonlarda zor.

Burada kullandığımız alternatif bir yol, DüğümKonteynerler içermek
işaretçiler ns-3 Düğüm nesneler. bu Düğüm Nesnenin adı verilen bir yöntemi var Kimliği Al hangisi
aradığımız düğüm numarası olan bu düğümün kimliğini döndür. hadi gidip şuna bir göz atalım
için Doksijen Düğüm ve daha aşağıda olan bu yöntemi bulun ns-3 çekirdek kod
şimdiye kadar gördüğümüzden; ama bazen yararlı şeyler için özenle aramanız gerekir.

Sürümünüz için Doxygen belgelerine gidin (onu şu adreste bulabileceğinizi unutmayın).
proje web sitesi). şu adrese gidebilirsin Düğüm belgeleri inceleyerek
"Sınıflar" sekmesine gidin ve "Sınıf Listesi"ni bulana kadar aşağı kaydırın. ns3::Düğüm. Seçmek
ns3::Düğüm ve belgelere yönlendirileceksiniz. Düğüm sınıf. eğer şimdi
aşağı kaydır Kimliği Al yöntemini seçin ve onu seçin, ayrıntılı
yöntem için belgeler. Kullanmak Kimliği Al yöntem, düğüm numaralarının belirlenmesini yapabilir
karmaşık topolojilerde çok daha kolaydır.

Kafa karışıklığını önlemek için eski izleme dosyalarını üst düzey dizinden temizleyelim.
ne oluyor,

$ rm *.pcap
$ rm *.tr

Yeni komut dosyasını oluşturur ve simülasyon ayarını çalıştırırsanız nCsma 100 için,

$ ./waf --run "scratch/saniyem --nCsma=100"

aşağıdaki çıktıyı göreceksiniz:

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.407s)
2s istemcisi, 1024 bağlantı noktası 10.1.2.101'a 9 bayt gönderdi
2.0068s sunucusu, 1024 bağlantı noktası 10.1.1.1'ten 49153 bayt aldı
2.0068s sunucusu zamanında 1024 bağlantı noktası 10.1.1.1'e 49153 bayt gönderdi
2.01761s istemcisi, 1024 bağlantı noktası 10.1.2.101'dan 9 bayt aldı

Yankı sunucusunun şimdi 10.1.2.101'e karşılık gelen 100'de bulunduğunu unutmayın.
sonuncusunda yankı sunucusuyla "ekstra" CSMA düğümleri. pcap dosyalarını listelerseniz
göreceğiniz en üst düzey dizin,

second-0-0.pcap second-100-0.pcap second-101-0.pcap

izleme dosyası ikinci-0-0.pcap yankı olan "en soldaki" noktadan noktaya cihazdır
paket kaynağı. Dosya ikinci-101-0.pcap en sağdaki CSMA aygıtına karşılık gelir.
yankı sunucusunun bulunduğu yerdir. Ekrandaki son parametrenin fark etmiş olabilirsiniz.
yankı sunucusu düğümünde pcap izlemeyi etkinleştirmek için yapılan çağrı yanlıştı. Bunun anlamı iz
bu düğümde toplanan, rastgele olmayan moddaydı.

Rastgele ve rastgele olmayan izler arasındaki farkı göstermek için, biz de
sondan bir önceki düğüm için rastgele olmayan bir izleme istedi. Devam et ve bir göz at
the tcp dökümü için ikinci-100-0.pcap.

$ tcpdump -nn -tt -r saniye-100-0.pcap

Artık 100 düğümünün yankı alışverişinde gerçekten bir seyirci olduğunu görebilirsiniz. Tek
aldığı paketler, tüm CSMA'ya yayınlanan ARP istekleridir.
ağ.

saniye-100-0.pcap dosyasından okuma, bağlantı tipi EN10MB (Ethernet)
2.006698 ARP, 10.1.2.101 (ff:ff:ff:ff:ff:ff) 10.1.2.1'e sahip olan talep, uzunluk 50
2.013815 ARP, 10.1.2.1 (ff:ff:ff:ff:ff:ff) 10.1.2.101'e sahip olan talep, uzunluk 50

Şimdi şuna bir göz atın tcp dökümü için ikinci-101-0.pcap.

$ tcpdump -nn -tt -r saniye-101-0.pcap

Artık, 101 düğümünün yankı alışverişinde gerçekten katılımcı olduğunu görebilirsiniz.

saniye-101-0.pcap dosyasından okuma, bağlantı tipi EN10MB (Ethernet)
2.006698 ARP, 10.1.2.101 (ff:ff:ff:ff:ff:ff) 10.1.2.1'e sahip olan talep, uzunluk 50
2.006698 ARP, Yanıt 10.1.2.101 saat 00:00:00:00:00:67, uzunluk 50
2.006803 IP 10.1.1.1.49153 > 10.1.2.101.9: UDP, uzunluk 1024
2.013803 ARP, 10.1.2.1 (ff:ff:ff:ff:ff:ff) 10.1.2.101'e sahip olan talep, uzunluk 50
2.013828 ARP, Yanıt 10.1.2.1 saat 00:00:00:00:00:03, uzunluk 50
2.013828 IP 10.1.2.101.9 > 10.1.1.1.49153: UDP, uzunluk 1024

Modeller, Özellikler ve Gerçeklik
Burası küçük bir gezi yapmak ve önemli bir noktaya değinmek için uygun bir yerdir. Olabilir
veya sizin için açık olmayabilir, ancak bir simülasyon kullanıldığında,
neyin modellenip neyin modellenmediğini tam olarak anlayın. Örneğin, caziptir
önceki bölümde kullanılan CSMA cihazlarını ve kanallarını gerçekmiş gibi düşünün
Ethernet cihazları; ve bir simülasyon sonucunun olacakları doğrudan yansıtmasını beklemek
gerçek bir Ethernet'te. Durum bu değil.

Model, tanımı gereği gerçekliğin bir soyutlamasıdır. sonuçta sorumluluktur
sözde "doğruluk aralığı" ve "etki alanı" belirlemek için simülasyon komut dosyası yazarının
bir bütün olarak simülasyonun uygulanabilirliği" ve dolayısıyla onu oluşturan parçalar.

Bazı durumlarda, örneğin Csmaolduğunu belirlemek oldukça kolay olabilir. değil modellenmiştir. İle
model açıklamasını okuma (csma.h) çarpışma algılama olmadığını görebilirsiniz
CSMA modelinde ve kullanımının simülasyonunuzda ne kadar uygulanabilir olacağına veya ne olacağına karar verin.
Sonuçlarınıza dahil etmek isteyebileceğiniz uyarılar. Diğer durumlarda, oldukça kolay olabilir
Dışarı çıkıp satın alabileceğiniz herhangi bir gerçekle uyuşmayabilecek davranışları yapılandırmak için. Bilişim Teknoloji
bu tür birkaç örneği araştırmak için biraz zaman harcamaya değecek ve nasıl
simülasyonlarınızda gerçekliğin sınırlarının dışına kolayca çıkabilirsiniz.

Gördüğün gibi, ns-3 sağlar Özellikler bir kullanıcının modeli değiştirmek için kolayca ayarlayabileceği
davranış. İki tanesini düşünün Özellikler arasında CsmaNetDevice: mtu ve
KapsüllemeModu. mtu özniteliği, Maksimum İletim Birimini gösterir.
cihaz. Bu, cihazın kullanabileceği en büyük Protokol Veri Biriminin (PDU) boyutudur.
gönderin.

MTU varsayılan olarak 1500 bayttır. CsmaNetDevice. Bu varsayılan bir sayıya karşılık gelir
RFC 894'te bulunan "IP Datagramlarının Ethernet Üzerinden İletimi için Bir Standart
Ağlar." Sayı aslında 10Base5 için maksimum paket boyutundan türetilmiştir.
(tam özellikli Ethernet) ağları -- 1518 bayt. DIX kapsüllemesini çıkarırsanız
Ethernet paketleri (18 bayt) için ek yük, olası maksimum veri boyutuna sahip olacaksınız
(MTU) 1500 bayt. Şunu da bulabilirsiniz: MTU IEEE 802.3 ağları için 1492'dir
bayt. Bunun nedeni, LLC/SNAP kapsüllemesinin sisteme fazladan sekiz bayt ek yük eklemesidir.
Paket. Her iki durumda da, temel donanım yalnızca 1518 bayt gönderebilir, ancak veriler
boyutu farklıdır.

Kapsülleme modunu ayarlamak için, CsmaNetDevice sağlar özellik denilen
KapsüllemeModu hangi değerleri alabilir Dix or LLC. Bunlar Ethernet'e karşılık gelir
ve sırasıyla LLC/SNAP çerçeveleme.

eğer biri bırakırsa mtu 1500 baytta ve kapsülleme modunu değiştirir LLC, sonuç
1500 baytlık PDU'ları LLC/SNAP çerçeveleme ile kapsülleyen bir ağ olacaktır.
1526 baytlık paketler, birçok ağda yasa dışı olacaktır, çünkü bir
paket başına maksimum 1518 bayt. Bu büyük olasılıkla bir simülasyonla sonuçlanacaktır.
oldukça kurnazca beklediğiniz gerçekliği yansıtmaz.

Sadece resmi karmaşıklaştırmak için, jumbo çerçeveler (1500 < MTU <= 9000 bayt) var ve
resmi olarak IEEE tarafından onaylanmayan ancak süper jumbo (MTU > 9000 bayt) çerçeveler
bazı yüksek hızlı (Gigabit) ağlarda ve NIC'lerde bulunur. biri bırakabilir
kapsülleme modu olarak ayarlandı Dixve ayarlayın mtu özellik Bir on CsmaNetDevice 64000 bayta kadar
-- ilişkili olsa bile CsmaKanal Veri hızı saniyede 10 megabit olarak ayarlandı. Bu
esasen 1980'lerin vampir vuruşlu 10Base5'inden yapılmış bir Ethernet anahtarını modelleyecekti
süper jumbo datagramları destekleyen ağlar. Bu kesinlikle olan bir şey değil
şimdiye kadar yapılmış ve muhtemelen yapılmayacaktır, ancak yapılandırmanız sizin için oldukça kolaydır.

Önceki örnekte, 100'lük bir simülasyon oluşturmak için komut satırını kullandınız.
Csma düğümler. 500 düğümlü bir simülasyonu kolayca oluşturabilirdiniz. Eğer sen
aslında tam bir spesifikasyonun maksimum uzunluğu olan 10Base5 vampire-tap ağını modelliyorlardı.
Ethernet kablosu 500 metredir ve minimum musluk aralığı 2.5 metredir. orada demek
gerçek bir ağda sadece 200 dokunuş olabilir. Oldukça kolay bir yasa dışı inşa edebilirdin
ağ da bu şekilde. Bu, anlamlı bir simülasyonla sonuçlanabilir veya gelmeyebilir.
Neyi modellemeye çalıştığınıza bağlı olarak.

Benzer durumlar Türkiye'nin birçok yerinde meydana gelebilir. ns-3 ve herhangi bir simülatörde. Örneğin,
düğümleri aynı alanı kaplayacak şekilde konumlandırabilirsiniz.
ya da amplifikatörleri veya gürültü seviyelerini yapılandırabilirsiniz.
fiziğin temel yasaları.

ns-3 genellikle esnekliği tercih eder ve birçok model serbestçe ayarlamaya izin verir Özellikler
herhangi bir keyfi tutarlılık veya belirli bir temel spesifikasyon zorlamaya çalışmadan.

Bundan eve götürülecek şey şu ki ns-3 süper esnek bir taban sağlayacak
denemeniz için. Sisteme ne sorduğunu anlamak sana kalmış
yapmak ve yarattığınız simülasyonların bir anlamı ve bazılarının olduğundan emin olmak için
sizin tarafınızdan tanımlanan bir gerçeklikle bağlantı.

bina a Kablosuz Topoloji
Bu bölümde bilgimizi daha da genişleteceğiz. ns-3 ağ cihazları ve
bir kablosuz ağ örneğini kapsayacak şekilde kanallar. ns-3 bir dizi 802.11 modeli sağlar
802.11 spesifikasyonunun MAC düzeyinde doğru bir uygulamasını sağlamaya çalışan
ve 802.11a belirtiminin "çok yavaş olmayan" bir PHY düzeyi modeli.

Hem noktadan noktaya hem de CSMA topoloji yardımcı nesnelerini gördüğümüz gibi
noktadan noktaya topolojiler inşa ederek, eşdeğerini göreceğiz Wifi topoloji yardımcıları
bu bölüm. Bu yardımcıların görünümü ve çalışması oldukça tanıdık gelmelidir.
sen.

Örnek bir komut dosyası sunuyoruz örnekler/eğitici dizin. Bu komut dosyası üzerine kuruludur
the saniye.cc komut dosyası ve bir Wifi ağı ekler. Devam et ve aç
örnekler/eğitim/üçüncü.cc en sevdiğiniz düzenleyicide. zaten yeterince görmüş olacaksın
ns-3 Bu örnekte olup bitenlerin çoğunu anlamak için kod, ancak birkaç yeni
şeyler, bu yüzden tüm senaryoyu gözden geçireceğiz ve çıktının bir kısmını inceleyeceğiz.

Tıpkı saniye.cc örnek (ve hepsinde ns-3 örnekler) dosya bir emacs ile başlar
mod satırı ve bazı GPL ortak özellikleri.

Varsayılan ağ topolojisini gösteren ASCII resmine (aşağıda verilmiştir) bir göz atın
örnekte inşa edilmiştir. Örneğimizi daha da genişleteceğimizi görebilirsiniz.
bir kablosuz ağı sol taraftan asarak. Bunun varsayılan bir ağ olduğuna dikkat edin
topoloji, çünkü kablolu ve kablosuz üzerinde oluşturulan düğümlerin sayısını gerçekten değiştirebilirsiniz.
ağlar. Tıpkı saniye.cc komut dosyası, değiştirirseniz nCsma, size bir
"ekstra" CSMA düğümlerinin sayısı. Benzer şekilde, ayarlayabilirsiniz nWifi kaç tane kontrol etmek için STA
(istasyon) düğümleri simülasyonda oluşturulur. her zaman bir tane olacak AP (erişim noktası)
kablosuz ağdaki düğüm. Varsayılan olarak üç "ekstra" CSMA düğümü ve üç
kablosuz STA düğümleri.

Kod, modül içerme dosyalarını yükleyerek başlar. saniye.cc örnek.
Wifi modülüne ve mobiliteye karşılık gelen birkaç yeni içerik var
Aşağıda tartışacağımız modül.

#include "ns3/core-module.h"
#include "ns3/noktadan noktaya-module.h"
#include "ns3/network-module.h"
#include "ns3/applications-module.h"
#include "ns3/wifi-module.h"
#include "ns3/mobility-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"

Ağ topolojisi çizimi aşağıdaki gibidir:

// Varsayılan Ağ Topolojisi
//
// Kablosuz 10.1.3.0
// erişim noktası
// * * * *
// | | | | 10.1.1.0
// n5 n6 n7 n0 -------------- n1 n2 n3 n4
// noktadan noktaya | | | |
// =================
// LAN 10.1.2.0

Sol taraftaki düğüme yeni bir ağ cihazı eklediğimizi görebilirsiniz.
kablosuz ağ için erişim noktası haline gelen noktadan noktaya bağlantı. bir dizi
yeni 10.1.3.0 ağını doldurmak için kablosuz STA düğümleri, solda gösterildiği gibi oluşturulur.
resmin yan tarafı.

İllüstrasyondan sonra, ns-3 ad alanı Kullanılmış ve bir günlük kaydı bileşeni tanımlanır.
Bunların hepsi şimdiye kadar oldukça tanıdık olmalı.

ns3 ad alanını kullanma;

NS_LOG_COMPONENT_DEFINE ("ThirdScriptÖrneği");

Ana program aynen şöyle başlıyor saniye.cc için bazı komut satırı parametreleri ekleyerek
günlüğe kaydetme bileşenlerini etkinleştirmek veya devre dışı bırakmak ve oluşturulan cihaz sayısını değiştirmek için.

bool ayrıntılı = doğru;
uint32_t nCsma = 3;
uint32_t nWifi = 3;

Komut satırı cmd'si;
cmd.AddValue ("nCsma", "\"ekstra\" CSMA düğümlerinin/cihazlarının sayısı", nCsma);
cmd.AddValue ("nWifi", "Wifi STA cihazlarının sayısı", nWifi);
cmd.AddValue ("ayrıntılı", "Eko uygulamalarına doğruysa günlüğe kaydetmesini söyle", ayrıntılı);

cmd.Ayrıştır (argc,argv);

eğer (ayrıntılı)
{
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}

Önceki tüm örneklerde olduğu gibi, bir sonraki adım, yapacağımız iki düğüm oluşturmaktır.
noktadan noktaya bağlantı yoluyla bağlanın.

NodeContainer p2pNode'lar;
p2pNodes.Create (2);

Sonra eski bir arkadaşı görüyoruz. bir somutlaştırıyoruz Noktadan NoktayaYardımcı ve ilişkili olanı ayarlayın
varsayılan Özellikler böylece cihazlarda saniyede beş megabit bir verici oluşturuyoruz
yardımcı kullanılarak oluşturulur ve yardımcı tarafından oluşturulan kanallarda iki milisaniyelik bir gecikme olur.
Daha sonra düğümlerdeki cihazlar ve aralarındaki kanal.

PointToPointYardımcı pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Gecikme", StringValue ("2ms"));

NetDeviceContainer p2pDevices;
p2pDevices = pointToPoint.Install (p2pNodes);

Sonra, başka bir ilan veriyoruz DüğümKonteyner otobüsün parçası olacak düğümleri tutmak için
(CSMA) ağı.

NodeContainer csmaNodes;
csmaNodes.Add (p2pNodes.Get (1));
csmaNodes.Create (nCsma);

Bir sonraki kod satırı Alır ilk düğüm (bir indekse sahip olduğu gibi)
noktadan noktaya düğüm konteyneri ve onu CSMA alacak düğümlerin konteynerine ekler
cihazlar. Söz konusu düğüm, noktadan noktaya bir cihaz ve bir CSMA ile sonuçlanacak.
cihaz. Ardından, CSMA'nın geri kalanını oluşturan bir dizi "ekstra" düğüm oluştururuz.
ağ.

Daha sonra bir CsmaYardımcı ve ayarla Özellikler önceki örnekte yaptığımız gibi.
Bir yaratıyoruz NetCihazKonteyner oluşturulan CSMA net cihazlarını takip etmek ve ardından
kurmak Seçilen düğümlerdeki CSMA cihazları.

CsmaYardımcı csma;
csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
csma.SetChannelAttribute ("Gecikme", TimeValue (NanoSaniye (6560)));

NetDeviceContainer csmaDevices;
csmaDevices = csma.Install (csmaNodes);

Ardından, Wifi ağının parçası olacak düğümleri oluşturacağız. Biz
komut satırı argümanında belirtildiği gibi bir dizi "istasyon" düğümü oluşturacak ve
için düğüm olarak noktadan noktaya bağlantının "en soldaki" düğümünü kullanacağız.
erişim noktası.

NodeContainer wifiStaNodes;
wifiStaNodes.Create (nWifi);
NodeContainer wifiApNode = p2pNodes.Get (0);

Bir sonraki kod parçası, wifi cihazlarını ve aralarındaki ara bağlantı kanalını oluşturur.
bu wifi düğümleri. İlk olarak, PHY ve kanal yardımcılarını yapılandırıyoruz:

YansWifiChannelHelper kanalı = YansWifiChannelHelper::Default ();
YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();

Basit olması için bu kod, varsayılan PHY katman yapılandırmasını ve kanal modellerini kullanır.
için API doxygen belgelerinde belgelenen
YansWifiChannelHelper::Varsayılan ve YansWifiPhyHelper::Varsayılan yöntemler. Bu nesneler bir kez
oluşturulduğunda, bir kanal nesnesi yaratır ve onu PHY katman nesne yöneticimizle ilişkilendiririz.
tarafından oluşturulan tüm PHY katmanı nesnelerinin YansWifiPhyYardımcı paylaş
aynı temel kanal, yani aynı kablosuz ortamı paylaşırlar ve
iletişim ve müdahale:

phy.SetChannel (channel.Create());

PHY yardımcısı yapılandırıldıktan sonra MAC katmanına odaklanabiliriz. Burada çalışmayı seçiyoruz
Qos olmayan MAC'lerle bu nedenle MAC parametrelerini ayarlamak için bir NqosWifiMacHelper nesnesi kullanırız.

WifiHelper wifi = WifiHelper::Varsayılan ();
wifi.SetRemoteStationManager ("ns3::AarfWifiManager");

NqosWifiMacHelper mac = NqosWifiMacHelper::Varsayılan ();

The SetRemoteStationManager yöntem, yardımcıya hız kontrol algoritmasının türünü söyler.
kullanmak. Burada yardımcıdan AARF algoritmasını kullanması isteniyor --- detaylar tabii ki,
Doxygen'de mevcuttur.

Ardından, yapmak istediğimiz altyapı ağının SSID'si olan MAC türünü yapılandırıyoruz.
kurun ve istasyonlarımızın aktif problama yapmadığından emin olun:

Ssid ssid = Ssid ("ns-3-ssid");
mac.SetType ("ns3::StaWifiMac",
"Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (yanlış));

Bu kod önce kullanılacak bir 802.11 hizmet kümesi tanımlayıcısı (SSID) nesnesi oluşturur.
"Ssid" değerini ayarlamak için özellik MAC katmanı uygulamasının Özel
yardımcı tarafından oluşturulacak MAC katmanı türü ile belirtilir. özellik olarak
"ns3::StaWifiMac" türü. Kullanımı NqosWifiMacYardımcı emin olacak
"QosDesteklendi" özellik oluşturulan MAC nesneleri için false olarak ayarlanır. Bunların kombinasyonu
iki yapılandırma, bir sonraki oluşturulan MAC örneğinin QoS olmayan AP olmayan bir olacağı anlamına gelir
istasyon (STA) bir altyapı BSS'sinde (yani, bir AP'li bir BSS). Son olarak,
"Aktif Sondalama" özellik false olarak ayarlanır. Bu, araştırma isteklerinin
bu yardımcı tarafından oluşturulan MAC'ler tarafından gönderilir.

İstasyona özgü tüm parametreler hem MAC hem de PHY'de tamamen yapılandırıldıktan sonra
katmanlar, artık tanıdıklarımızı çağırabiliriz kurmak bunların wifi cihazlarını oluşturma yöntemi
istasyonları:

NetDeviceContainer staDevices;
staDevices = wifi.Install (phy, mac, wifiStaNodes);

Tüm STA düğümlerimiz için Wifi yapılandırdık ve şimdi AP'yi yapılandırmamız gerekiyor
(erişim noktası) düğümü. Varsayılanı değiştirerek bu işleme başlıyoruz Özellikler arasında
NqosWifiMacYardımcı AP'nin gereksinimlerini yansıtmak için.

mac.SetType ("ns3::ApWifiMac",
"Ssid", SsidValue (ssid));

Bu durumda, NqosWifiMacYardımcı "ns3::ApWifiMac" MAC katmanlarını oluşturacak,
ikincisi, AP olarak yapılandırılmış bir MAC örneğinin oluşturulması gerektiğini belirtir.
"QosSupported" olduğunu ima eden yardımcı tür özellik false olarak ayarlanmalıdır - devre dışı bırakılıyor
Oluşturulan AP'lerde 802.11e/WMM tarzı QoS desteği.

Sonraki satırlar, aynı PHY düzeyi kümesini paylaşan tek AP'yi oluşturur. Özellikler (Ve
kanal) istasyonlar olarak:

NetDeviceContainer apDevices;
apDevices = wifi.Install (phy, mac, wifiApNode);

Şimdi, hareketlilik modelleri ekleyeceğiz. STA düğümlerinin hareketli olmasını, dolaşmasını istiyoruz.
sınırlayıcı bir kutunun içinde ve AP düğümünü durağan hale getirmek istiyoruz. kullanıyoruz
HareketlilikYardımcısı bunu bizim için kolaylaştırmak için. İlk önce, bir HareketlilikYardımcısı nesne
ve biraz ayarla Özellikler "pozisyon ayırıcı" işlevselliğini kontrol etme.

MobiliteYardımcı mobilite;

hareketlilik.SetPositionAllocator ("ns3::GridPositionAllocator",
"MinX", DoubleValue (0.0),
"MinY", DoubleValue (0.0),
"DeltaX", DoubleValue (5.0),
"DeltaY", DoubleValue (10.0),
"GridWidth", UintegerValue (3),
"LayoutType", StringValue ("RowFirst"));

Bu kod, mobilite yardımcısına, ilk olarak aracı yerleştirmek için iki boyutlu bir ızgara kullanmasını söyler.
STA düğümleri. Ders için Doxygen'i keşfetmekten çekinmeyin ns3::GridPositionAyırıcı görmek
tam olarak ne yapılıyor.

Düğümlerimizi bir başlangıç ​​ızgarası üzerinde düzenledik, ancak şimdi onlara nasıl hareket edeceklerini söylememiz gerekiyor.
Biz seçiyoruz RandomWalk2dMobiliteModeli düğümlerin rastgele bir yönde hareket ettiği
sınırlayıcı bir kutunun içinde rastgele bir hız.

hareketlilik.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
"Sınırlar", RectangleValue (Dikdörtgen (-50, 50, -50, 50));

şimdi anlatıyoruz HareketlilikYardımcısı hareketlilik modellerini STA düğümlerine kurmak için.

mobilite.Install (wifiStaNodes);

Simülasyon sırasında erişim noktasının sabit bir konumda kalmasını istiyoruz. Biz
bu düğüm için hareketlilik modelini ayarlayarak bunu gerçekleştirin.
ns3::SabitPozisyonMobilityModel:

hareketlilik.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
mobilite.Install (wifiApNode);

Artık düğümlerimizi, cihazlarımızı ve kanallarımızı oluşturduk ve mobilite modellerini seçtik.
Wifi düğümleri, ancak elimizde protokol yığını yok. Daha önce birçok kez yaptığımız gibi
kez kullanacağız. İnternet Yığını Yardımcısı Bu yığınları yüklemek için.

InternetStackHelper yığını;
stack.Install (csmaNodes);
stack.Install (wifiApNode);
stack.Install (wifiStaNodes);

Tıpkı saniye.cc örnek komut dosyası, kullanacağız IPv4AdresiYardımcısı için
cihaz arayüzlerimize IP adresleri atayın. İlk önce 10.1.1.0 ağını oluşturmak için kullanıyoruz
iki noktadan noktaya cihazımız için gereken iki adres. Sonra ağ 10.1.2.0 kullanıyoruz
CSMA ağına adres atamak ve ardından ağ 10.1.3.0'dan adres atamak için
hem STA cihazlarına hem de kablosuz ağdaki AP'ye.

Ipv4AddressHelper adresi;

address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer p2pArayüzler;
p2pInterfaces = adres.Ata (p2pDevices);

address.SetBase ("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer csmaArayüzler;
csmaInterfaces = adres.Ata (csmaDevices);

address.SetBase ("10.1.3.0", "255.255.255.0");
adres.Assign (staDevices);
adres.Assign (apDevices);

Eko sunucusunu çizimin başındaki "en sağdaki" düğüme yerleştirdik.
dosya. Bunu daha önce yaptık.

UdpEchoServerHelper echoSunucu (9);

ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
serverApps.Start (Saniye (1.0));
serverApps.Stop (Saniye (10.0));

Ve yankı istemcisini, oluşturduğumuz son STA düğümüne yerleştirdik ve onu sunucuya işaret ettik.
CSMA ağı. Benzer operasyonları daha önce de gördük.

UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Aralık", TimeValue (Saniye (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps =
echoClient.Install (wifiStaNodes.Get (nWifi - 1));
clientApps.Start (Saniye (2.0));
clientApps.Stop (Saniye (10.0));

Burada bir ağlar arası oluşturduğumuz için, ağlar arası yönlendirmeyi aynı şekilde etkinleştirmemiz gerekiyor.
içinde yaptık saniye.cc örnek komut dosyası.

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

Bazı kullanıcıları şaşırtabilecek bir şey, az önce yarattığımız simülasyonun
asla "doğal olarak" durmayacak. Bunun nedeni, kablosuz erişim noktasından
işaretler oluşturun. Sonsuza kadar işaret üretecek ve bu, simülatörle sonuçlanacak
olaylar süresiz olarak geleceğe planlanıyor, bu yüzden simülatöre durmasını söylemeliyiz
planlanmış işaret oluşturma olayları olsa bile. Aşağıdaki kod satırı
simülatöre, işaretçileri sonsuza kadar simüle etmememiz ve ne olduğunu girmememiz için durmasını söyler.
aslında sonsuz bir döngü.

Simülatör::Dur (Saniye (10.0));

Üç ağı da kapsayacak kadar izleme oluşturuyoruz:

pointToPoint.EnablePcapAll ("üçüncü");
phy.EnablePcap ("üçüncü", apDevices.Get (0));
csma.EnablePcap ("üçüncü", csmaDevices.Get (0), true);

Bu üç kod satırı, noktadan noktaya düğümlerin her ikisinde de pcap izlemeyi başlatacaktır.
omurgamız olarak hizmet eder, Wifi ağında karışık (izleme) modu izlemesi başlatır,
ve CSMA ağında rastgele bir izleme başlatacaktır. Bu, tüm
minimum sayıda izleme dosyası içeren trafik.

Son olarak, simülasyonu çalıştırıyoruz, temizliyoruz ve programdan çıkıyoruz.

Simülatör::Çalıştır ();
Simülatör::Yok Et ();
0 dönmek;
}

Bu örneği çalıştırmak için, kopyalamanız gerekir. üçüncü.cc örnek komut dosyası
dizini sıfırlayın ve oluşturmak için Waf'ı kullanın. saniye.cc örnek. Eğer sen
yazacağınız havuzun en üst düzey dizinindedir,

$ cp örnekleri/eğitim/üçüncü.cc kazı kazan/myüçüncü.cc
$ ./waf
$ ./waf --sıralamayı çalıştır/üçüncüm

Yine, UDP yankı uygulamalarını tıpkı bizim yaptığımız gibi kurduğumuz için saniye.cc
komut dosyası, benzer çıktı göreceksiniz.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.407s)
2s istemcisi, 1024 bağlantı noktası 10.1.2.4'a 9 bayt gönderdi
2.01796s sunucusu, 1024 bağlantı noktası 10.1.3.3'ten 49153 bayt aldı
2.01796s sunucusu zamanında 1024 bağlantı noktası 10.1.3.3'e 49153 bayt gönderdi
2.03364s istemcisi, 1024 bağlantı noktası 10.1.2.4'dan 9 bayt aldı

Hatırlayın ki ilk mesaj, Gönderilmiş 1024 bayt için 10.1.2.4," UDP yankı istemcisidir
sunucuya bir paket gönderme. Bu durumda, istemci kablosuz ağdadır.
(10.1.3.0). İkinci mesaj, "Alınan 1024 bayt itibaren 10.1.3.3," UDP yankısından
sunucu, yankı paketini aldığında oluşturulur. Son mesaj, "Alınan 1024
bayt itibaren 10.1.2.4," yankı istemcisinden geliyor ve yankısını aldığını gösteriyor
sunucudan geri

Şimdi gidip üst düzey dizine bakarsanız, dört izleme dosyası bulacaksınız.
bu simülasyon, ikisi sıfır düğümünden ve ikisi de birinci düğümden:

third-0-0.pcap third-0-1.pcap third-1-0.pcap third-1-1.pcap

"üçüncü-0-0.pcap" dosyası, sıfır düğümündeki noktadan noktaya aygıta karşılık gelir --
"omurganın" sol tarafı. "üçüncü-1-0.pcap" dosyası noktadan noktaya karşılık gelir
birinci düğümdeki cihaz -- "omurganın" sağ tarafı. "üçüncü-0-1.pcap" dosyası
Wifi ağından ve "üçüncü-1-1.pcap" dosyasından rastgele (monitör modu) izleme
CSMA ağından gelen rastgele iz olacaktır. Bunu inceleyerek doğrulayabilir misiniz?
kod?

Eko istemcisi Wifi ağında olduğundan, oradan başlayalım. Şuna bir göz atalım
bu ağda yakaladığımız karışık (izleme modu) izleme.

$ tcpdump -nn -tt -r üçüncü-0-1.pcap

Burada daha önce görmediğiniz bazı wifi görünümlü içerikler görmelisiniz:

üçüncü-0-1.pcap dosyasından okuma, bağlantı tipi IEEE802_11 (802.11)
0.000025 İşaret (ns-3-ssid) [6.0* 9.0 12.0 18.0 24.0 36.0 48.0 54.0 Mbit] IBSS
0.000308 Doçent İsteği (ns-3-ssid) [6.0 9.0 12.0 18.0 24.0 36.0 48.0 54.0 Mbit]
0.000324 Acknowledgment RA:00:00:00:00:00:08
0.000402 Doçent Yanıtı Yener Kılıç(0) :: Başarılı
0.000546 Acknowledgment RA:00:00:00:00:00:0a
0.000721 Doçent İsteği (ns-3-ssid) [6.0 9.0 12.0 18.0 24.0 36.0 48.0 54.0 Mbit]
0.000737 Acknowledgment RA:00:00:00:00:00:07
0.000824 Doçent Yanıtı Yener Kılıç(0) :: Başarılı
0.000968 Acknowledgment RA:00:00:00:00:00:0a
0.001134 Doçent İsteği (ns-3-ssid) [6.0 9.0 12.0 18.0 24.0 36.0 48.0 54.0 Mbit]
0.001150 Acknowledgment RA:00:00:00:00:00:09
0.001273 Doçent Yanıtı Yener Kılıç(0) :: Başarılı
0.001417 Acknowledgment RA:00:00:00:00:00:0a
0.102400 İşaret (ns-3-ssid) [6.0* 9.0 12.0 18.0 24.0 36.0 48.0 54.0 Mbit] IBSS
0.204800 İşaret (ns-3-ssid) [6.0* 9.0 12.0 18.0 24.0 36.0 48.0 54.0 Mbit] IBSS
0.307200 İşaret (ns-3-ssid) [6.0* 9.0 12.0 18.0 24.0 36.0 48.0 54.0 Mbit] IBSS

Bağlantı türünün beklediğiniz gibi artık 802.11 olduğunu görebilirsiniz. muhtemelen yapabilirsin
neler olduğunu anlayın ve IP yankı isteğini ve yanıt paketlerini bu
iz. İz dökümünü tamamen ayrıştırmak için bir alıştırma olarak bırakıyoruz.

Şimdi noktadan noktaya bağlantının sağ tarafındaki pcap dosyasına bakın,

$ tcpdump -nn -tt -r üçüncü-0-0.pcap

Yine, tanıdık görünen bazı içerikler görmelisiniz:

üçüncü-0-0.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
2.008151 IP 10.1.3.3.49153 > 10.1.2.4.9: UDP, uzunluk 1024
2.026758 IP 10.1.2.4.9 > 10.1.3.3.49153: UDP, uzunluk 1024

Bu, soldan sağa (Wifi'den CSMA'ya) giden ve tekrar karşıdan gelen yankı paketidir.
noktadan noktaya bağlantı.

Şimdi noktadan noktaya bağlantının sağ tarafındaki pcap dosyasına bakın,

$ tcpdump -nn -tt -r üçüncü-1-0.pcap

Yine, tanıdık görünen bazı içerikler görmelisiniz:

üçüncü-1-0.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
2.011837 IP 10.1.3.3.49153 > 10.1.2.4.9: UDP, uzunluk 1024
2.023072 IP 10.1.2.4.9 > 10.1.3.3.49153: UDP, uzunluk 1024

Bu aynı zamanda soldan sağa (Wifi'den CSMA'ya) giden ve tekrar geri dönen yankı paketidir.
beklediğiniz gibi biraz farklı zamanlamalarla noktadan noktaya bağlantı boyunca.

Yankı sunucusu CSMA ağında, oradaki rastgele ize bakalım:

$ tcpdump -nn -tt -r üçüncü-1-1.pcap

Tanıdık görünen bazı içerikler görmelisiniz:

üçüncü-1-1.pcap dosyasından okuma, bağlantı tipi EN10MB (Ethernet)
2.017837 ARP, 10.1.2.4 (ff:ff:ff:ff:ff:ff) 10.1.2.1'e sahip olan talep, uzunluk 50
2.017861 ARP, Yanıt 10.1.2.4 saat 00:00:00:00:00:06, uzunluk 50
2.017861 IP 10.1.3.3.49153 > 10.1.2.4.9: UDP, uzunluk 1024
2.022966 ARP, 10.1.2.1 (ff:ff:ff:ff:ff:ff) 10.1.2.4'e sahip olan talep, uzunluk 50
2.022966 ARP, Yanıt 10.1.2.1 saat 00:00:00:00:00:03, uzunluk 50
2.023072 IP 10.1.2.4.9 > 10.1.3.3.49153: UDP, uzunluk 1024

Bu kolayca anlaşılmalıdır. Unuttuysanız, geri dönün ve tartışmaya bakın.
in saniye.cc. Bu aynı sıra.

Şimdi, kablosuz ağ için mobilite modelleri kurmak için çok zaman harcadık ve bu yüzden
STA düğümlerinin gerçekten hareket ettiğini bile göstermeden bitirmek utanç verici olurdu
simülasyon sırasında etrafında. Bunu, içine çengel yaparak yapalım. MobiliteModeli kursa
izleme kaynağını değiştir. Bu, ayrıntılı izleme bölümüne yalnızca bir göz atmaktır.
geliyor, ama burası örnek almak için çok güzel bir yer gibi görünüyor.

"Tweaking ns-3" bölümünde belirtildiği gibi, ns-3 izleme sistemi izleme ayrılmıştır
kaynaklar ve izleme havuzları ve ikisini birbirine bağlamak için işlevler sağlıyoruz. kullanacağız
hareketlilik modeli önceden tanımlanmış kurs, izleme olaylarını başlatmak için izleme kaynağını değiştirir. Biz
bu kaynağa bağlanmak için bazı güzel görüntüler gösterecek bir izleme havuzu yazmanız gerekecek
bizim için bilgi. Zor olarak ününe rağmen, gerçekten oldukça basittir.
Ana programdan hemen önce çizik/üçüncüm.cc komut dosyası (yani,
NS_LOG_COMPONENT_DEFINE ifadesi), aşağıdaki işlevi ekleyin:

geçersiz
CourseChange (std::string bağlamı, Ptr modeli)
{
Vektör konumu = model->GetPosition ();
NS_LOG_UNCOND (bağlam <
" x = " << konum.x << ", y = " << konum.y);
}

Bu kod, sadece konum bilgisini hareketlilik modelinden alır ve koşulsuz olarak
düğümün x ve y konumunu günlüğe kaydeder. Bu işlevin olmasını ayarlayacağız
yankı istemcisi ile kablosuz düğüm konumunu her değiştirdiğinde çağrılır. Biz bunu yaparız
ile Yapılandır::Bağlan işlev. Komut dosyasına aşağıdaki kod satırlarını ekleyin
önce Simülatör::Çalıştır aramak.

std::ostringstream işletim sistemi;
oss <
"/NodeList/" << wifiStaNodes.Get (nWifi - 1)->GetId () <
"/$ns3::MobilityModel/CourseChange";

Config::Connect (oss.str (), MakeCallback (&CourseChange));

Burada yaptığımız, olayın izlenen ad alanı yolunu içeren bir dize oluşturmaktır.
bağlanmak istediğimiz şey. İlk olarak, hangi düğümü kullanmak istediğimizi bulmalıyız.
the Kimliği Al yöntem daha önce açıklandığı gibi. Varsayılan CSMA sayısı ve
kablosuz düğümler, bu düğüm yedi ve izleme ad alanı yolu olarak ortaya çıkıyor.
hareketlilik modeli şöyle görünürdü,

/NodeList/7/$ns3::MobilityModel/CourseChange

İzleme bölümündeki tartışmaya dayanarak, bu izleme yolunun
global NodeList'teki yedinci düğüme başvurur. Ne denir belirtir
toplu nesne türü ns3::MobiliteModeli. Dolar işareti öneki,
MobilityModel, yedinci düğümde toplanır. Yolun son bileşeni, biz
o modelin "CourseChange" olayına bağlanıyorlar.

Yedinci düğümdeki izleme kaynağı ile izleme havuzumuz arasında çağrı yaparak bağlantı kuruyoruz.
Yapılandır::Bağlan ve bu ad alanı yolunu geçmek. Bu yapıldıktan sonra, her rota değişikliği
Yedinci düğümdeki olay, izleme havuzumuza bağlanacak ve bu da sırayla
yeni pozisyon.

Simülasyonu şimdi çalıştırırsanız, rota değişikliklerinin gerçekleştikçe görüntülendiğini göreceksiniz.

'inşa' başarıyla tamamlandı (5.989s)
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10, y = 0
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.3841, y = 0.923277
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.2049, y = 1.90708
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.8136, y = 1.11368
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.8452, y = 2.11318
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.9797, y = 3.10409
2s istemcisi, 1024 bağlantı noktası 10.1.2.4'a 9 bayt gönderdi
2.01796s sunucusu, 1024 bağlantı noktası 10.1.3.3'ten 49153 bayt aldı
2.01796s sunucusu zamanında 1024 bağlantı noktası 10.1.3.3'e 49153 bayt gönderdi
2.03364s istemcisi, 1024 bağlantı noktası 10.1.2.4'dan 9 bayt aldı
/NodeList/7/$ns3::MobilityModel/CourseChange x = 11.3273, y = 4.04175
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.013, y = 4.76955
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.4317, y = 5.67771
/NodeList/7/$ns3::MobilityModel/CourseChange x = 11.4607, y = 5.91681
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.0155, y = 6.74878
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.0076, y = 6.62336
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.6285, y = 5.698
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.32, y = 4.97559
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.1134, y = 3.99715
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.8359, y = 4.68851
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.5953, y = 3.71789
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.7595, y = 4.26688
/NodeList/7/$ns3::MobilityModel/CourseChange x = 11.7629, y = 4.34913
/NodeList/7/$ns3::MobilityModel/CourseChange x = 11.2292, y = 5.19485
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.2344, y = 5.09394
/NodeList/7/$ns3::MobilityModel/CourseChange x = 9.3601, y = 4.60846
/NodeList/7/$ns3::MobilityModel/CourseChange x = 8.40025, y = 4.32795
/NodeList/7/$ns3::MobilityModel/CourseChange x = 9.14292, y = 4.99761
/NodeList/7/$ns3::MobilityModel/CourseChange x = 9.08299, y = 5.99581
/NodeList/7/$ns3::MobilityModel/CourseChange x = 8.26068, y = 5.42677
/NodeList/7/$ns3::MobilityModel/CourseChange x = 8.35917, y = 6.42191
/NodeList/7/$ns3::MobilityModel/CourseChange x = 7.66805, y = 7.14466
/NodeList/7/$ns3::MobilityModel/CourseChange x = 6.71414, y = 6.84456
/NodeList/7/$ns3::MobilityModel/CourseChange x = 6.42489, y = 7.80181

İZLEME


Olayın Arka Planı
UseTracingSystem'da belirtildiği gibi, bir çalıştırmanın tüm amacı ns-3 simülasyon
çalışma için çıktı üretir. Çıktı elde etmek için iki temel stratejiniz var. ns-3:
jenerik önceden tanımlanmış toplu çıktı mekanizmalarını kullanmak ve içeriklerini ayıklamak için ayrıştırmak
ilginç bilgi; veya bir şekilde tam olarak ileten bir çıktı mekanizması geliştirmek
(ve belki de sadece) istenen bilgi.

Önceden tanımlanmış toplu çıktı mekanizmalarının kullanılması, herhangi bir değişiklik gerektirmeme avantajına sahiptir.
ns-3, ancak ilgilenilen verileri ayrıştırmak ve filtrelemek için komut dosyaları yazmayı gerektirebilir. Sıklıkla,
PCAP veya NS_LOG çıktı mesajları simülasyon çalıştırmaları sırasında toplanır ve ayrı olarak çalıştırılır
kullanan komut dosyaları aracılığıyla grep, susuzluk or awk mesajları ayrıştırmak ve azaltmak ve dönüştürmek için
veriler yönetilebilir bir forma dönüştürülür. Dönüşümü yapmak için programlar yazılmalıdır, bu yüzden bu
bedava gelmiyor. NS_LOG çıktının bir parçası olarak kabul edilmez. ns-3 API ve
sürümler arasında uyarı vermeden değiştirin. Ek olarak, NS_LOG çıktı yalnızca şurada mevcuttur:
hata ayıklama oluşturur, bu nedenle buna güvenmek bir performans cezası uygular. Tabii ki, eğer
ilgilenilen bilgi önceden tanımlanmış çıktı mekanizmalarının hiçbirinde mevcut değildir, bu
yaklaşım başarısız olur.

Önceden tanımlanmış toplu mekanizmalara biraz bilgi eklemeniz gerekirse, bu
mutlaka yapılır; ve bunlardan birini kullanırsanız ns-3 mekanizmalar, kodunuzu ekleyebilirsiniz
katkı olarak.

ns-3 doğasında var olan bazı sorunlardan kaçınan İzleme adı verilen başka bir mekanizma sağlar.
toplu çıktı mekanizmalarında. Birkaç önemli avantajı vardır. İlk olarak, yapabilirsiniz
Yalnızca sizi ilgilendiren olayları izleyerek yönetmeniz gereken veri miktarını azaltın
(büyük simülasyonlar için, her şeyi son işlem için diske atmak, G/Ç oluşturabilir.
darboğazlar). İkincisi, bu yöntemi kullanırsanız, çıktının biçimini kontrol edebilirsiniz.
doğrudan, böylece son işleme adımından kaçınırsınız. susuzluk, awk, perl or piton Kodlar. Eğer
Arzu ederseniz, çıktınız doğrudan gnuplot tarafından kabul edilebilir bir forma biçimlendirilebilir,
örnek (ayrıca bkz. GnuplotHelper). Çekirdeğe kancalar ekleyebilirsiniz, bunlar daha sonra olabilir
diğer kullanıcılar tarafından erişilen, ancak açıkça istenmedikçe hiçbir bilgi üretmeyecek
böyle yap. Bu nedenlerle, inanıyoruz ki, ns-3 izleme sistemi almanın en iyi yoludur
simülasyondan elde edilen bilgidir ve bu nedenle en önemli mekanizmalardan biridir.
içinde anlamak ns-3.

kör Araçlar
Bir programdan bilgi almanın birçok yolu vardır. En basit yol
bilgileri doğrudan aşağıdaki gibi standart çıktıya yazdırmak için:

#Dahil etmek
Kendi ID’n ile mağazalarını oluştur
geçersiz
SomeFunction (boş)
{
uint32_t x = BAZI_INTERESTING_VALUE;
Kendi ID’n ile mağazalarını oluştur
std::cout << "x'in değeri " << x << std::endl;
Kendi ID’n ile mağazalarını oluştur
}

Hiç kimse sizin derinlere inmenizi engelleyemez. ns-3 ve baskı ekleme
ifadeler. Bunu yapmak delicesine kolaydır ve sonuçta, tüm kontrolünüz sizdedir.
kendi ns-3 dal. Bu muhtemelen uzun vadede çok tatmin edici olmayacak.
terim ama.

Programlarınızda print deyimlerinin sayısı arttıkça, bunlarla uğraşma görevi
çok sayıda çıktı giderek daha karmaşık hale gelecektir. Sonunda, hissedebilirsin
hangi bilgilerin yazdırıldığını bir şekilde kontrol etme ihtiyacı, belki de açarak
ve belirli baskı kategorilerini kapatmak veya baskı miktarını artırmak veya azaltmak
istediğiniz bilgi. Bu yolda devam ederseniz, sahip olduğunuzu keşfedebilirsiniz.
yeniden uyguladı NS_LOG mekanizması (bkz. Günlüğü Kullanma). Bunu önlemek için, bir
düşünebileceğiniz ilk şeyler kullanmaktır NS_LOG kendisi.

Yukarıda bilgi almanın bir yolunun olduğundan bahsetmiştik. ns-3 var olanı ayrıştırmaktır NS_LOG
ilginç bilgiler için çıktı. bir bilgi kırıntısı olduğunu keşfederseniz,
ihtiyaç mevcut günlük çıktısında mevcut değil, çekirdeğini düzenleyebilirsiniz. ns-3 ve basitçe ekleyin
ilginç bilgilerinizi çıktı akışına. Şimdi, bu kesinlikle daha iyi
takip ettiğinden beri kendi print ifadelerinizi eklemek ns-3 kodlama kuralları ve
mevcut çekirdeğe bir yama olarak diğer insanlar için potansiyel olarak yararlı olabilir.

Rastgele bir örnek seçelim. Daha fazla günlük kaydı eklemek istiyorsanız ns-3 TCP soketi
(tcp-socket-base.cc) uygulamada aşağıya yeni bir mesaj ekleyebilirsiniz. Fark etme
içinde TcpSocketBase::AlınanAck() ACK durumu yok için günlük mesajı yoktur. Sen
kodu değiştirerek basitçe bir tane ekleyebilir. İşte orijinal:

/** Yeni alınan ACK'yi işle */
geçersiz
TcpSocketBase::AlınanAck (Ptr paket, const TcpHeader& tcpHeader)
{
NS_LOG_FUNCTION (bu << tcpHeader);

// ACK alındı. ACK numarasını, onaylanmamış en yüksek sıra numarasıyla karşılaştırın
if (0 == (tcpHeader.GetFlags () & TcpHeader::ACK))
{ // ACK bayrağı yoksa yoksay
}
Kendi ID’n ile mağazalarını oluştur

ACK'siz vakayı günlüğe kaydetmek için yeni bir ACK ekleyebilirsiniz. NS_LOG_LOGIC içinde if açıklama gövdesi:

/** Yeni alınan ACK'yi işle */
geçersiz
TcpSocketBase::AlınanAck (Ptr paket, const TcpHeader& tcpHeader)
{
NS_LOG_FUNCTION (bu << tcpHeader);

// ACK alındı. ACK numarasını, onaylanmamış en yüksek sıra numarasıyla karşılaştırın
if (0 == (tcpHeader.GetFlags () & TcpHeader::ACK))
{ // ACK bayrağı yoksa yoksay
NS_LOG_LOGIC ("TcpSocketBase " << bu << " ACK bayrağı yok");
}
Kendi ID’n ile mağazalarını oluştur

Bu, ilk bakışta oldukça basit ve tatmin edici görünebilir, ancak dikkate alınması gereken bir şey var.
eklemek için kod yazacağınızı NS_LOG ifadeler ve ayrıca yazmanız gerekecek
kodu (olduğu gibi grep, susuzluk or awk komut dosyaları) yalıtmak için günlük çıktısını ayrıştırmak için
bilgi. Bunun nedeni, çıktının ne olduğu üzerinde bir miktar kontrolünüz olsa bile,
kayıt sistemi, yalnızca tipik olarak günlük bileşeni düzeyine kadar kontrole sahipsiniz.
tam bir kaynak kod dosyası.

Mevcut bir modüle kod ekliyorsanız, çıktıyla da yaşamak zorunda kalacaksınız.
diğer tüm geliştiricilerin ilginç bulduğu. Bunu elde etmek için bulabilirsin
ihtiyacınız olan az miktarda bilgi, büyük miktarlarda gezinmeniz gerekebilir.
sizi ilgilendirmeyen yabancı mesajlar. Büyük bir günlük kaydetmek zorunda kalabilirsiniz
dosyaları diske aktarın ve herhangi bir şey yapmak istediğinizde bunları birkaç satıra kadar işleyin.

garantisi olmadığı için ns-3 istikrarı hakkında NS_LOG çıktı, ayrıca
bağlı olduğunuz günlük çıktısı parçalarının kaybolduğunu veya aralarında değiştiğini keşfedin
Salıverme. Çıktının yapısına bağlıysanız, başka iletiler de bulabilirsiniz.
ayrıştırma kodunuzu etkileyebilecek şekilde eklendi veya silindi.

En sonunda, NS_LOG çıktı yalnızca hata ayıklama yapılarında mevcuttur, günlük çıktısı alamazsınız
yaklaşık iki kat daha hızlı çalışan optimize edilmiş yapılar. Güvenen NS_LOG bir performans empoze eder
ceza.

Bu nedenlerle, baskıları standart::cout ve NS_LOG hızlı olmak için mesajlar ve
daha fazla bilgi almanın kirli yolları ns-3, ancak ciddi işler için uygun değildir.

Birinin erişmesine izin veren kararlı API'leri kullanan kararlı bir tesise sahip olmak arzu edilir.
çekirdek sistem ve yalnızca gerekli bilgileri alın. Yapabilmek arzu edilir
bu, çekirdek sistemi değiştirmek ve yeniden derlemek zorunda kalmadan. Daha da iyisi bir
ilgilenilen bir öğe değiştiğinde veya ilginç bir olay olduğunda kullanıcı kodunu bildiren sistem
kullanıcının sistemde aktif olarak dolaşmak zorunda kalmaması için oldu
eşyalar.

The ns-3 izleme sistemi bu hatlar boyunca çalışmak üzere tasarlanmıştır ve aşağıdakilerle iyi bir şekilde entegre edilmiştir:
Özellik ve Yapılandırma nispeten basit kullanım senaryolarına izin veren alt sistemler.

Genel Bakış
The ns-3 izleme sistemi, bağımsız izleme kaynakları kavramları üzerine kurulmuştur ve
kaynakları lavabolara bağlamak için tek tip bir mekanizma ile birlikte izleme lavaboları.

İz kaynakları, bir simülasyonda meydana gelen olayları işaret edebilen ve
ilginç temel verilere erişim. Örneğin, bir izleme kaynağı, bir
paket bir ağ cihazı tarafından alınır ve paket içeriğine erişim sağlar.
ilgilenen iz lavabolar. Bir izleme kaynağı, ilginç bir durumun ne zaman olduğunu da gösterebilir.
değişim bir modelde olur. Örneğin, bir TCP modelinin tıkanıklık penceresi bir asaldır.
iz kaynağı adayı. Tıkanıklık penceresi bağlı izi her değiştirdiğinde
lavabolara eski ve yeni değer bildirilir.

İz kaynakları kendi başlarına yararlı değildir; diğer kod parçalarına bağlanmaları gerekir
aslında kaynak tarafından sağlanan bilgilerle yararlı bir şeyler yapan. bu
izleme bilgilerini tüketen varlıklara izleme havuzları denir. İz kaynakları
veri üreticileri ve izleme havuzları tüketicilerdir. Bu açık bölünme, büyük
Model yazarlarının bulunduğu yerlerde sistem etrafına dağılacak iz kaynaklarının sayısı
faydalı olabileceğine inanıyoruz. İzleme kaynakları eklemek çok küçük bir yürütme sağlar
havai.

Bir izleme kaynağı tarafından oluşturulan izleme olaylarının sıfır veya daha fazla tüketicisi olabilir. Bir kutu
Bir izleme kaynağını bir tür noktadan çok noktaya bilgi bağlantısı olarak düşünün. Senin kodun
belirli bir çekirdek kod parçasından izleme olayları aramak, mutlu bir şekilde bir arada var olabilir.
diğer kod aynı bilgilerden tamamen farklı bir şey yapıyor.

Bir kullanıcı bu kaynaklardan birine bir izleme havuzu bağlamadıkça, hiçbir şey çıktısı alınmaz. Kullanarak
izleme sistemi, hem siz hem de aynı iz kaynağına bağlı diğer insanlar
tam olarak ne istediklerini ve yalnızca sistemden ne istediklerini. ikiniz de değilsiniz
sistem tarafından hangi bilgilerin çıktısını değiştirerek başka bir kullanıcıyı etkilemek. Eğer sen
Bir izleme kaynağı eklediğinizde, iyi bir açık kaynak vatandaşı olarak çalışmanız diğerlerine izin verebilir.
kullanıcılar, herhangi bir şey yapmadan, genel olarak çok yararlı olan yeni yardımcı programlar sağlamak için
değişiklikler ns-3 Çekirdek.

Basit Örnek E-posta
Birkaç dakika ayıralım ve basit bir izleme örneğinden geçelim. ihtiyacımız olacak
Örnekte neler olduğunu anlamak için Geri Aramalar hakkında biraz arka plan, bu yüzden
hemen küçük bir gezinti yapmalısın.

Geri aramalar
Geri Çağırma sisteminin amacı ns-3 bir kod parçasının bir işlevi çağırmasına izin vermektir
(veya C++'daki yöntem) herhangi bir modüller arası belirli bir bağımlılık olmadan. Bu nihayetinde şu anlama gelir
bir tür dolaylı yönlendirmeye ihtiyacınız var - çağrılan işlevin adresini bir
değişken. Bu değişkene işaretçiden işleve değişken denir. İlişki
işlev ve işaretçiden işleve arasındaki fark, nesne ve işlevden gerçekten farklı değildir.
işaretçiden nesneye.

C'de, bir işaretçiden işleve kurallı örnek,
işaretçiden işleve dönen tamsayı (PFI). Bir PFI almak için int parametre, bu
gibi ilan edilebilir,

int (*pfi)(int arg) = 0;

(Ama okuyun C++-SSS Bölüm 33 böyle bir kod yazmadan önce!) Bundan ne elde edersiniz?
basitçe adlandırılmış bir değişkendir pfi bu 0 değerine başlatılır.
bu işaretçiyi anlamlı bir şeye başlatırsanız, bir işleve sahip olmanız gerekir.
eşleşen imza Bu durumda, şuna benzeyen bir işlev sağlayabilirsiniz:

int MyFunction (int değişken) {}

Bu hedefe sahipseniz, değişkeni işlevinize işaret edecek şekilde başlatabilirsiniz:

pfi = İşlevim;

Ardından, çağrının daha anlamlı biçimini kullanarak MyFunction'ı dolaylı olarak arayabilirsiniz:

int sonuç = (*pfi) (1234);

Bu, yalnızca işlev işaretçisinin referansını kaldırıyormuşsunuz gibi göründüğü için anlamlıdır.
herhangi bir işaretçiyi iptal edeceğiniz gibi. Bununla birlikte, tipik olarak, insanlar bundan yararlanır.
derleyicinin neler olduğunu bildiği ve sadece daha kısa bir form kullanacağı gerçeği:

int sonuç = pfi (1234);

Bu, adında bir işlevi çağırıyor gibi görünüyor pfi, ancak derleyici yeterince akıllı
değişken aracılığıyla aramayı bilmek pfi dolaylı olarak fonksiyona İşlevim.

Kavramsal olarak, izleme sistemi neredeyse tam olarak böyle çalışır. Temel olarak, bir iz
lavabo is bir geri arama. Bir izleme havuzu, izleme olaylarını almakla ilgilendiğini ifade ettiğinde,
izleme kaynağı tarafından dahili olarak tutulan Geri Aramalar listesine kendisini Geri Arama olarak ekler.
İlginç bir olay meydana geldiğinde, izleme kaynağı kendi bilgisini çağırır. Şebeke(...) sağlama
sıfır veya daha fazla argüman. bu Şebeke(...) sonunda sisteme girer ve
sıfır veya daha fazlasını sağlayarak az önce gördüğünüz dolaylı çağrıya oldukça benzer bir şey yapıyorsa
parametreler, tıpkı çağrıda olduğu gibi pfi yukarıda hedef fonksiyona bir parametre iletildi
İşlevim.

İzleme sisteminin eklediği önemli fark, oradaki her izleme kaynağı için
dahili bir Geri Arama listesidir. Sadece bir dolaylı arama yapmak yerine, bir izleme
kaynak birden fazla Geri Arama başlatabilir. Bir izleme havuzu ilgi gösterdiğinde
bir izleme kaynağından gelen bildirimler, temelde sadece kendi işlevini eklemeyi düzenler.
geri arama listesi.

Bunun gerçekte nasıl düzenlendiği hakkında daha fazla ayrıntıyla ilgileniyorsanız ns-3hisset
geri arama bölümünü incelemek için ücretsiz ns-3 Manuel.

İzlenecek yol: dördüncü.cc
Gerçekten en basit izleme örneğini uygulamak için bazı kodlar sağladık.
bu monte edilebilir. Bu kodu eğitim dizininde şu şekilde bulabilirsiniz: dördüncü.cc.
Onun üzerinden geçelim:

/* -*- Mod:C++; c-dosya-stili:"gnu"; girinti sekmeleri modu:nil; -*- */
/*
* Bu program ücretsiz bir yazılımdır; yeniden dağıtabilir ve/veya değiştirebilirsiniz
* GNU Genel Kamu Lisansı sürüm 2 koşulları altında olduğu gibi
* Özgür Yazılım Vakfı tarafından yayınlanan;
*
* Bu program faydalı olması ümidiyle dağıtılmaktadır,
* ancak HİÇBİR GARANTİ YOKTUR; zımni garanti bile olmadan
* SATILABİLİRLİK veya BELİRLİ BİR AMACA UYGUNLUK. Bkz.
* Daha fazla ayrıntı için GNU Genel Kamu Lisansı.
*
* GNU Genel Kamu Lisansının bir kopyasını almış olmalısınız
* Bu programla birlikte; değilse, Özgür Yazılım'a yazın
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 ABD
*/

#include "ns3/object.h"
#include "ns3/uinteger.h"
#include "ns3/traced-value.h"
#include "ns3/trace-source-accessor.h"

#Dahil etmek

ns3 ad alanını kullanma;

Bu kodun çoğu size oldukça aşina olmalıdır. Yukarıda belirtildiği gibi, izleme sistemi
Nesne ve Nitelik sistemlerini yoğun bir şekilde kullanır, bu nedenle bunları dahil etmeniz gerekir.
İlk ikisi, bu sistemler için bildirimleri açıkça getirmeyi içerir. Sen
her şeyi bir kerede almak için çekirdek modül başlığını kullanabiliriz, ancak şunları yaparız
tüm bunların gerçekte ne kadar basit olduğunu göstermek için açıkça burada.

Dosya, izlenen değer.h verilerin izlenmesi için gerekli beyanları getirir.
değer semantiğine uyar. Genel olarak, değer semantiği, yalnızca
nesnenin adresini iletmek yerine nesnenin kendisini çevreler. Bütün bunlar gerçekten ne
Bunun anlamı, bir TracedValue'da yapılan tüm değişiklikleri gerçekten
basit yol.

İzleme sistemi Nitelikler ile entegre olduğundan ve Nitelikler Nesneler ile çalıştığından,
bir olmalı ns-3 nesne izleme kaynağının içinde yaşaması için. Sonraki kod parçacığı
birlikte çalışabileceğimiz basit bir Nesne bildirir ve tanımlar.

sınıf MyObject : genel Nesne
{
kamu:
statik TypeId GetTypeId (geçersiz)
{
statik TypeId tid = TypeId ("MyObject")
.SetParent (Nesne::GetTypeId ())
.Yapıcı Ekle ()
.AddTraceSource ("MyInteger",
"İzlenecek bir tamsayı değeri.",
MakeTraceSourceAccessor (&MyObject::m_myInt),
"ns3::Traced::Value::Int32Callback")
;
dönüş tid;
}

Nesnem () {}
İzlenen Değer m_myInt;
};

İzleme ile ilgili olarak yukarıdaki iki önemli kod satırı şunlardır: .AddTraceSource
ve izlenen değer ilan etmek m_myInt.

The .AddTraceSource izleme kaynağına bağlanmak için kullanılan "kancaları" sağlar.
Yapılandırma sistemi aracılığıyla dış dünya. İlk argüman bu iz için bir isimdir.
Config sisteminde görünmesini sağlayan kaynak. İkinci argüman bir yardım dizesidir.
Şimdi üçüncü argümana bakın, aslında tartışma üçüncü argümanın:
&MyObject::m_myInt. Bu, sınıfa eklenen TracedValue'dur; bu
her zaman bir sınıf veri üyesi. (Son argüman, bir typedef için
Bir dize olarak TracedValue türü. Bu, doğru bilgi için belgeler oluşturmak için kullanılır.
Özellikle daha genel türler için yararlı olan geri arama işlevi imzası
Geri aramalar.)

The TracedValue<> bildirim, geri aramayı yönlendiren altyapıyı sağlar
işlem. Temel değer her değiştirildiğinde, TracedValue mekanizması şunları sağlar:
bu değişkenin hem eski hem de yeni değeri, bu durumda bir int32_t değer. iz
bu TracedValue için havuz işlevi imzaya ihtiyaç duyacaktır

void (* TracedValueCallback)(const int32_t eskiValue, const int32_t yeniValue);

Bu izleme kaynağına bağlanan tüm izleme havuzları bu imzaya sahip olmalıdır. Aşağıda tartışacağız
diğer durumlarda gerekli geri arama imzasını nasıl belirleyebilirsiniz.

Tabii ki, devam ederek dördüncü.cc görürüz:

geçersiz
IntTrace (int32_t eskiDeğer, int32_t yeniDeğer)
{
std::cout << "İzlendi" << oldValue << " ile " << newValue << std::endl;
}

Bu, eşleşen bir izleme havuzunun tanımıdır. Doğrudan geri aramaya karşılık gelir
işlev imzası. Bir kez bağlandıktan sonra, bu fonksiyon ne zaman çağrılırsa
izlenen değer değişir.

Artık iz kaynağını ve iz havuzunu gördük. Geriye kalan, bağlanmak için koddur.
içinde gerçekleşen lavabonun kaynağı ana:

int
ana (int argc, char *argv[])
{
Ptr myObject = CreateObject ();
myObject->TraceConnectWithoutContext ("MyInteger", MakeCallback(&IntTrace));

myObject->m_myInt = 1234;
}

Burada önce izleme kaynağının yaşadığı MyObject örneğini oluşturuyoruz.

Bir sonraki adım, TraceConnectWithoutContext, iz arasındaki bağlantıyı oluşturur
kaynak ve izleme havuzu. İlk argüman sadece "MyInteger" izleme kaynağı adıdır.
yukarıda gördük. dikkat edin Geri Arama Yap şablon işlevi. Bu işlev sihir yapar
temel oluşturmak için gerekli ns-3 Geri arama nesnesi ve işlevle ilişkilendirin
IntTrace. TraceConnect sağladığınız işlev ve
aşırı Şebeke() "MyInteger" Özniteliği tarafından atıfta bulunulan izlenen değişkende.
Bu ilişkilendirme yapıldıktan sonra, izleme kaynağı sağlanan geri aramanızı "ateşleyecektir"
fonksiyonu.

Tüm bunları gerçekleştirecek kod elbette önemsiz değildir, ancak özü şudur:
tıpkı şuna benzeyen bir şey düzenliyorsun pfi() yukarıdaki örnek çağrılacak
iz kaynağı tarafından. beyannamesi İzlenen Değer m_myInt; Nesnede
aşırı yüklenmiş atama operatörlerini sağlamak için gereken sihri kendisi gerçekleştirir.
kullan Şebeke() İstenen parametrelerle Geri Aramayı gerçekten çağırmak için. bu
.AddTraceSource Geri Aramayı Yapılandırma sistemine bağlamak için sihri gerçekleştirir ve
TraceConnectWithoutContext işlevinizi ize bağlamak için sihri gerçekleştirir
Öznitelik adıyla belirtilen kaynak.

Şimdilik bağlamla ilgili kısmı görmezden gelelim.

Son olarak, değer atayan satır m_myInt:

myObject->m_myInt = 1234;

çağırması olarak yorumlanmalıdır. operatör= üye değişkeninde m_myInt ile
tam sayı 1234 parametre olarak geçti.

Dan beri m_myInt bir izlenen değer, bu operatör bir geri arama yürütmek için tanımlanmıştır.
void döndürür ve parametre olarak iki tamsayı değeri alır --- eski bir değer ve yeni bir değer
söz konusu tamsayı için. Bu tam olarak geri arama için işlev imzasıdır.
sağladığımız fonksiyon --- IntTrace.

Özetlemek gerekirse, izleme kaynağı özünde bir geri arama listesini tutan bir değişkendir. A
izleme havuzu, geri aramanın hedefi olarak kullanılan bir işlevdir. Öznitelik ve nesne türü
bilgi sistemleri, izleme kaynaklarını izleme havuzlarına bağlamanın bir yolunu sağlamak için kullanılır.
Bir izleme kaynağına "vurma" eylemi, izleme kaynağı üzerinde bir operatörü yürütmektir.
geri aramaları tetikler. Bu, ilgi alanlarını kaydeden izleme havuzu geri aramalarıyla sonuçlanır.
kaynak tarafından sağlanan parametrelerle çağrılan kaynak.

Şimdi bu örneği oluşturup çalıştırırsanız,

$ ./waf --dördüncü çalıştırın

çıktısını göreceksiniz IntTrace işlev, izleme kaynağı olur olmaz yürütülür
hit:

0'dan 1234'e kadar izlendi

Kodu çalıştırdığımızda, myObject->m_myInt = 1234;, izleme kaynağı ateşlendi ve
izleme havuzuna önceki ve sonraki değerleri otomatik olarak sağladı. İşlev
IntTrace sonra bunu standart çıktıya yazdırın.

Bağlantı Kurun ile Yapılandırma
The TraceConnectWithoutContext basit örnekte yukarıda gösterilen çağrı aslında çok
Sistemde nadiren kullanılır. Daha tipik olarak, Yapılandırma bir iz seçmek için alt sistem kullanılır
olarak adlandırılan şeyi kullanarak sistemdeki kaynak Yapılandırma yol. Bunun bir örneğini şurada gördük.
ile denemeler yaparken "CourseChange" olayını bağladığımız önceki bölüm
üçüncü.cc.

Hareketlilikten kurs değişikliği bilgilerini yazdırmak için bir izleme havuzu tanımladığımızı hatırlayın.
simülasyonumuzun modelleri. Bu fonksiyonun ne olduğu artık sizin için çok daha açık olmalıdır.
yapıyor:

geçersiz
CourseChange (std::string bağlamı, Ptr modeli)
{
Vektör konumu = model->GetPosition ();
NS_LOG_UNCOND (bağlam <
" x = " << konum.x << ", y = " << konum.y);
}

"CourseChange" izleme kaynağını yukarıdaki izleme havuzuna bağladığımızda, bir
Önceden tanımlanmış arasında bir bağlantı düzenlediğimizde kaynağı belirtmek için yapılandırma yolu
izleme kaynağı ve yeni izleme havuzu:

std::ostringstream işletim sistemi;
oss << "/NodeList/"
<< wifiStaNodes.Get (nWifi - 1)->GetId ()
<< "/$ns3::MobilityModel/CourseChange";

Config::Connect (oss.str (), MakeCallback (&CourseChange));

Bazen görece gizemli kod olarak kabul edilen şeyi biraz anlamaya çalışalım.
Tartışma amacıyla, tarafından döndürülen Düğüm numarasının GetId() is
"7". Bu durumda, yukarıdaki yol ortaya çıkıyor

"/NodeList/7/$ns3::MobilityModel/CourseChange"

Bir yapılandırma yolunun son bölümü bir özellik Bir of nesne. Aslında, eğer olsaydın
için bir işaretçi nesne "CourseChange" özelliğine sahip özellik kullanışlı, bunu yazabilirsin
tıpkı önceki örnekte yaptığımız gibi. Artık biliyorsunuz ki biz genellikle
bizim için işaretçiler Nodes bir NodeContainer'da. İçinde üçüncü.cc örneğin, ilgilenilen düğümler
içinde saklanır wifiStaDüğümleri DüğümKonteyner. Aslında, yolu bir araya getirirken,
almak için bu kabı kullandık Ptr hangimiz derdik GetId(). Sahip olabilirdik
bunu kullandı Ptr bir Connect yöntemini doğrudan çağırmak için:

Ptr theObject = wifiStaNodes.Get (nWifi - 1);
theObject->TraceConnectWithoutContext ("CourseChange", MakeCallback (&CourseChange));

içinde üçüncü.cc örneğin, aslında birlikte teslim edilecek ek bir "bağlam" istedik
Geri arama parametreleriyle (aşağıda açıklanacaktır), böylece
aşağıdaki eşdeğer kod:

Ptr theObject = wifiStaNodes.Get (nWifi - 1);
theObject->TraceConnect ("CourseChange", MakeCallback (&CourseChange));

Görünüşe göre dahili kod Yapılandırma::ConnectWithoutContext ve Yapılandır::Bağlan
aslında bir bul Ptr ve uygun olanı arayın TraceConnect en düşük yöntem
seviye.

The Yapılandırma fonksiyonlar zincirini temsil eden bir yol alır. nesne işaretçiler. Her segment
bir yolun bir Object Niteliğine karşılık gelir. Son bölüm, Niteliğidir.
İlgi alanı ve önceki segmentler, Nesneleri içerecek veya bulacak şekilde yazılmalıdır. bu Yapılandırma kod
yolun son bölümüne ulaşana kadar bu yolu ayrıştırır ve "yürür". o zaman
son bölümü bir olarak yorumlar özellik yürürken bulduğu son Nesnede
yolu. Yapılandırma işlevler daha sonra uygun olanı arayın TraceConnect or
TraceConnectWithoutContext son Nesne üzerindeki yöntem. bakalım ne olacak birazdan
yukarıdaki yol yürüdüğünde daha fazla ayrıntı.

Yoldaki baştaki "/" karakteri, sözde bir ad alanına atıfta bulunur. Biri
yapılandırma sistemindeki önceden tanımlanmış ad alanları, tüm öğelerin bir listesi olan "NodeList" dir.
simülasyondaki düğümler. Listedeki öğeler, listeye endekslerle yönlendirilir, bu nedenle
"/NodeList/7", simülasyon sırasında oluşturulan düğümler listesindeki sekizinci Düğüm anlamına gelir.
(hatırlama endeksleri 0'). Bu referans is aslında a ``Ptr ` ve öyle bir
bir alt sınıfı ns3::Nesne.

Nesne Modeli bölümünde açıklandığı gibi ns-3 Manuel, yaygın olarak kullanıyoruz
nesne toplama. Bu, farklı Nesneler arasında bir ilişki kurmamızı sağlar.
karmaşık bir miras ağacı oluşturmadan veya hangi nesnelerin parçası olacağına karar vermeden
bir Düğümün. Bir Toplamadaki her Nesneye diğer Nesnelerden erişilebilir.

Örneğimizde yürünecek bir sonraki yol parçası "$" karakteriyle başlar. Bu
yapılandırma sistemine segmentin bir nesne türünün adı olduğunu gösterir, bu nedenle
Nesne Al arama bu tip aranmalıdır. Görünüşe göre HareketlilikYardımcısı
kullanılan üçüncü.cc her biri için bir hareketlilik modeli toplamayı veya ilişkilendirmeyi düzenler.
kablosuz Nodes . "$" eklediğinizde, sahip olan başka bir Nesneyi soruyorsunuz.
muhtemelen daha önce toplanmıştır. Bunu, geçiş işaretçileri olarak düşünebilirsiniz.
orijinal Ptr "/NodeList/7" tarafından ilişkili hareketlilik modeline göre belirtildiği gibi ---
hangi tip ns3::MobiliteModeli. aşina iseniz Nesne Al, biz sorduk
sistem aşağıdakileri yapmak için:

Ptr hareketlilikModel = düğüm->GetObject ()

Artık yoldaki son Nesnedeyiz, bu yüzden dikkatimizi Özniteliklere çeviriyoruz.
o Nesne. bu MobiliteModeli class "CourseChange" adlı bir Özniteliği tanımlar. Yapabilirsiniz
kaynak koduna bakarak bunu görün src/mobility/model/mobility-model.cc ve
favori düzenleyicinizde "CourseChange" araması yapın. bulmalısın

.AddTraceSource ("Ders Değiştirme",
"Konum ve/veya hız vektörünün değeri değişti",
MakeTraceSourceAccessor (&MobilityModel::m_courseChangeTrace),
"ns3::MobilityModel::CourseChangeCallback")

ki bu noktada çok tanıdık gelmeli.

Altta yatan izlenen değişkenin ilgili bildirimini ararsanız,
hareketlilik-modeli.h bulacaksın

TracedCallback > m_courseChangeTrace;

tip bildirimi İzlenen Geri Arama tanımlar m_courseDeğiştirmeİzleme özel bir liste olarak
Yukarıda açıklanan Yapılandırma işlevleri kullanılarak bağlanabilen geri aramalar. bu typedef için
geri arama işlevi imzası da başlık dosyasında tanımlanır:

typedef void (* CourseChangeCallback)(Ptr * modeli);

The MobiliteModeli sınıf için ortak bir arayüz sağlayan bir temel sınıf olarak tasarlanmıştır.
tüm özel alt sınıflar. Dosyanın sonuna kadar arama yaparsanız, bir
olarak adlandırılan tanımlı yöntem NotifyCourseChange():

geçersiz
MobilityModel::NotifyCourseChange (geçersiz) const
{
m_courseChangeTrace(bu);
}

Türetilmiş sınıflar, desteklemek için bir kurs değişikliği yaptıklarında bu yöntemi çağıracaktır.
izleme. Bu yöntem çağırır Şebeke() temelde m_courseDeğiştirmeİzleme, Hangi
sırayla, kayıtlı tüm Geri Aramaları çağıracak ve tüm izleme havuzlarını çağıracaktır.
bir Yapılandırma işlevi çağırarak izleme kaynağına ilgi kaydettiniz.

Yani, üçüncü.cc Örneklerden birinde bir rota değişikliği yapıldığında baktığımız
RandomWalk2dMobiliteModeli yüklü örnekler, bir olacak NotifyCourseChange() çağrı
hangi içine çağırır MobiliteModeli temel sınıf. Yukarıda görüldüğü gibi, bu çağrı Şebeke()
on m_courseDeğiştirmeİzleme, bu da kayıtlı izleme havuzlarını çağırır. Örnekte,
ilgi alanlarını kaydeden tek kod, Yapılandırma yolunu sağlayan koddu.
bu yüzden Kurs Değişikliği Yedi numaralı düğümden bağlanan işlev,
sadece Geri arama denir.

Bulmacanın son parçası "bağlam" dır. Bir çıkışa bakarak gördüğümüzü hatırlayın.
aşağıdaki gibi bir şey üçüncü.cc:

/NodeList/7/$ns3::MobilityModel/CourseChange x = 7.27897, y =
2.22677

Çıktının ilk kısmı bağlamdır. Bu, basitçe,
config kodu izleme kaynağını buldu. Baktığımız durumda olabilir
sistemdeki herhangi bir sayıda düğüme karşılık gelen herhangi bir sayıda izleme kaynağı
hareketlilik modelleri. Hangi izleme kaynağının gerçekte olduğunu belirlemenin bir yolu olmalı
Geri Aramayı başlatan kişi. Kolay yol, bağlantı kurmaktır Yapılandır::Bağlan, yerine
of Yapılandırma::ConnectWithoutContext.

Bulma kaynaklar
İzleme sisteminin yeni kullanıcıları için kaçınılmaz olarak akla gelen ilk soru şudur: "Peki,
I bilmek o Orada , eğer mülteci statüleri sona erdirilmemişse Amerika'ya geldikten bir yıl sonra be iz kaynaklar in the simülasyon çekirdek, fakat Nasıl do I bulmak dışarı ne
iz kaynaklar vardır mevcut için ben?"

İkinci soru ise, "Peki, I bulundu a iz kaynak, Nasıl do I anlamaya dışarı the Yapılandırma yol
için kullanım ne zaman I bağlamak için o?"

Üçüncü soru ise, "Peki, I bulundu a iz kaynak ve the Yapılandırma yol, yörünge, Nasıl do I anlamaya
dışarı ne the dönüş tip ve resmi argümanlar of my geri aramak işlev gerek için olmak?"

Dördüncü soru ise, "Peki, I yazılan o herşey in ve var Re-Tweet inanılmaz tuhaf hata
mesaj ne in the Dünya yok it anlamına gelmek?"

Bunların her birine sırasıyla değineceğiz.

Mevcut kaynaklar
Tamam, I bilmek o Orada , eğer mülteci statüleri sona erdirilmemişse Amerika'ya geldikten bir yıl sonra be iz kaynaklar in the simülasyon çekirdek, fakat Nasıl do I bulmak
dışarı ne iz kaynaklar vardır mevcut için ben?

İlk sorunun cevabı haberde ns-3 API belgeleri. eğer gidersen
proje web sitesi, ns-3 proje, navigasyonda "Belgeler" için bir bağlantı bulacaksınız
çubuk. Bu bağlantıyı seçerseniz, dokümantasyon sayfamıza yönlendirileceksiniz. Var
sizi en son kararlılığın belgelerine götürecek olan "En Son Sürüm" bağlantısı
serbest bırakılması ns-3. "API Dokümantasyonu" bağlantısını seçerseniz, şuraya yönlendirileceksiniz:
ns-3 API dokümantasyon sayfası.

Kenar çubuğunda başlayan bir hiyerarşi görmelisiniz

· ns-3

· ns-3 Dokümantasyon

· Tüm İzleme Kaynakları

· Tüm Nitelikler

· Tüm GlobalDeğerler

Burada bizi ilgilendiren liste "Tüm TraceSources". Devam edin ve o bağlantıyı seçin.
Belki de çok şaşırtıcı olmayan bir şekilde, mevcut tüm izleme kaynaklarının bir listesini göreceksiniz.
in ns-3.

Örnek olarak, aşağı kaydırın ns3::MobiliteModeli. için bir giriş bulacaksınız

CourseChange: Konum ve/veya hız vektörünün değeri değişti

Bunu, uygulamada kullandığımız izleme kaynağı olarak tanımalısınız. üçüncü.cc örnek. İncelemek
bu liste yardımcı olacaktır.

Yapılandırma Yollar
Tamam, I bulundu a iz kaynak, Nasıl do I anlamaya dışarı the Yapılandırma yol için kullanım ne zaman I bağlamak için
bunu?

Hangi nesneyle ilgilendiğinizi biliyorsanız, "Ayrıntılı Açıklama" bölümü
class, mevcut tüm izleme kaynaklarını listeler. Örneğin, "Tümü" listesinden başlayarak
TraceSources" seçeneğine tıklayın. ns3::MobiliteModeli sizi şu adrese götürecek olan bağlantı
için belgeler MobiliteModeli sınıf. Neredeyse sayfanın en üstünde bir satır var
"Diğer..." bağlantısıyla biten sınıfın kısa açıklaması. Atlamak için bu bağlantıya tıklayın
API özetine gidin ve sınıfın "Ayrıntılı Açıklaması"na gidin. Sonunda
açıklama (en fazla) üç liste olacaktır:

· Yapılandırma Yollar: bu sınıf için tipik Yapılandırma yollarının listesi.

· Özellikler: bu sınıf tarafından sağlanan tüm özelliklerin listesi.

· İz Kaynakları: bu sınıfta bulunan tüm TraceSource'ların listesi.

İlk önce Yapılandırma yollarını tartışacağız.

Diyelim ki "Tümü" bölümünde "CourseChange" izleme kaynağını buldunuz.
TraceSources" listesi ve ona nasıl bağlanacağınızı öğrenmek istiyorsunuz.
kullanarak (yine üçüncü.cc örnek) bir ns3::RandomWalk2dMobilityModel. Bu yüzden ya
"Tüm TraceSources" listesindeki sınıf adına tıklayın veya
ns3::RandomWalk2dMobilityModel "Sınıf Listesi"nde. Her iki şekilde de şimdi bakmalısın
"ns3::RandomWalk2dMobilityModel Sınıf Referansı" sayfasında.

Şimdi, özet listesinden sonra "Ayrıntılı Açıklama" bölümüne ilerlerseniz,
sınıf yöntemleri ve nitelikleri (veya sınıfın sonundaki "Diğer ..." bağlantısını tıklamanız yeterlidir)
sayfanın üst kısmındaki kısa açıklama) için genel belgeleri göreceksiniz.
sınıf. Aşağı kaydırmaya devam ederek "Yapılandırma Yolları" listesini bulun:
Yapılandırma Yollar

ns3::RandomWalk2dMobilityModel ile aşağıdaki yollardan erişilebilir
Yapılandırma::Ayarla ve Yapılandır::Bağlan:

· "/NodeList/[i]/$ns3::MobilityModel/$ns3::RandomWalk2dMobilityModel"

Belgeler size nasıl ulaşacağınızı anlatır. RandomWalk2dMobiliteModeli Nesne. Karşılaştırmak
yukarıdaki dize ile örnek kodda gerçekten kullandığımız dize:

"/NodeList/7/$ns3::MobilityModel"

Aradaki fark, iki Nesne Al aramalar bulunan dizede ima edilir
belgelerde. için ilk $ns3::MobilityModel için toplamayı sorgulayacak
temel sınıf. ikinci ima Nesne Al aramak, için $ns3::RandomWalk2dMobilityModel,
temel sınıfı somut uygulama sınıfına dönüştürmek için kullanılır. Dökümantasyon
sizin için bu işlemlerin her ikisini de gösterir. Gerçek iz kaynağının sen olduğun ortaya çıktı.
aranıyor temel sınıfta bulunur.

İzleme kaynaklarının listesi için "Ayrıntılı Açıklama" bölümüne bakın.
Bulacaksın
Bu tür için TraceSources tanımlı değil.

İz Kaynakları tanımlı in ebeveyn sınıf ``ns3::MobilityModel``

· Kurs Değişikliği: Konum ve/veya hız vektörünün değeri değişti.

Geri arama imzası: ns3::MobilityModel::CourseChangeCallback

Bu tam olarak bilmeniz gereken şey. İlgilenilen iz kaynağı şurada bulunur:
ns3::MobiliteModeli (ki zaten biliyordun). Bu API'nin ilginç yanı
Belgeler size, yukarıdaki yapılandırma yolunda fazladan oyuncu kadrosuna ihtiyacınız olmadığını söyler.
izleme kaynağı aslında temel sınıfta olduğundan, somut sınıfa gidin.
Bu nedenle ek Nesne Al gerekli değildir ve sadece yolu kullanırsınız:

"/NodeList/[i]/$ns3::MobilityModel"

örnek yolla mükemmel bir şekilde eşleşen:

"/NodeList/7/$ns3::MobilityModel"

Bir kenara, Yapılandırma yolunu bulmanın başka bir yolu da grep etrafında ns-3 codebase
zaten çözmüş biri için. Her zaman bir başkasınınkini kopyalamaya çalışmalısın.
Kendi kodunuzu yazmaya başlamadan önce çalışma kodu. Şunun gibi bir şey deneyin:

$ bulun. -ad '*.cc' | xargs grep Kurs Değiştirme | grep Bağlan

ve cevabınızı çalışma koduyla birlikte bulabilirsiniz. Örneğin, bu durumda,
src/mobility/examples/main-random-topology.cc kullanmanı bekleyen bir şey var:

Config::Connect ("/NodeList/*/$ns3::MobilityModel/CourseChange",
MakeCallback (&CourseChange));

Bu örneğe birazdan döneceğiz.

Geri Arama İmzalar
Tamam, I bulundu a iz kaynak ve the Yapılandırma yol, yörünge, Nasıl do I anlamaya dışarı ne the dönüş tip
ve resmi argümanlar of my geri aramak işlev gerek için olabilir mi?

En kolay yol, geri arama imzasını incelemektir. typedef, verilen
Sınıf için "Ayrıntılı Açıklama" bölümündeki izleme kaynağının "geri arama imzası"
Yukarıda verilen.

"CourseChange" izleme kaynağı girişinin tekrarlanması ns3::RandomWalk2dMobilityModel we
var:

· Kurs Değişikliği: Konum ve/veya hız vektörünün değeri değişti.

Geri arama imzası: ns3::MobilityModel::CourseChangeCallback

Geri arama imzası, ilgili bağlantıya bağlantı olarak verilir. typedef, nerede buluruz
typedef geçersiz (* CourseChangeCallback)(const standart::dize bağlam, Ptr
MobiliteModeli> * modeli);

İzlenen Geri Arama kurs değişikliği bildirimleri için imza.

Geri arama kullanılarak bağlanırsa Bağlam Olmadan Bağlan atlamak bağlam gelen argüman
imza.

Parametreler:
[içinde] bağlam İzleme kaynağı tarafından sağlanan bağlam dizesi.
[içinde] model Rotayı değiştiren MobilityModel.

Yukarıdaki gibi, bunu kullanımda görmek için grep etrafında ns-3 bir örnek için kod tabanı. Örnek
yukarıdan, src/mobility/examples/main-random-topology.cc, "CourseChange" i bağlar
iz kaynağı Kurs Değişikliği aynı dosyada işlev:

Statik boşluk
CourseChange (std::string bağlamı, Ptr modeli)
{
Kendi ID’n ile mağazalarını oluştur
}

Bu işlevin şuna dikkat edin:

· Birazdan açıklayacağımız bir "bağlam" dize argümanı alır. (Eğer geri arama
kullanılarak bağlanır Bağlam Olmadan Bağlan işlev bağlam argüman olacak
atlanmıştır.)

· Var MobiliteModeli son argüman olarak sağlanır (veya yalnızca argüman
Bağlam Olmadan Bağlan kullanıldı).

· İadeler geçersiz.

Şans eseri, geri arama imzası belgelenmemişse ve buna örnek yoksa
doğru geri arama işlevi imzasını belirlemek, iyi, zor olabilir
aslında kaynak kodundan anlayın.

Kodu gözden geçirmeye başlamadan önce, kibar olacağım ve size basit bir yol söyleyeceğim
bunu anlamak için: Geri aramanızın dönüş değeri her zaman geçersiz. Resmi
için parametre listesi İzlenen Geri Arama içindeki şablon parametre listesinden bulunabilir.
beyan. Şu anki örneğimiz için şunu hatırlayın: hareketlilik-modeli.h, nerede
daha önce bulundu:

TracedCallback > m_courseChangeTrace;

Şablon parametre listesi arasında bire bir yazışma vardır.
bildirim ve geri arama işlevinin resmi argümanları. Burada, bir tane var
şablon parametresi, Ptr MobiliteModeli>. Bu size bir
void döndüren ve bir alan alan işlev Ptr MobiliteModeli>. Örneğin:

geçersiz
Kurs Değişimi (Ptr modeli)
{
Kendi ID’n ile mağazalarını oluştur
}

Eğer istersen tek ihtiyacın olan bu Yapılandırma::ConnectWithoutContext. Bir bağlam istiyorsanız,
gerek Yapılandır::Bağlan ve bir dize bağlamı alan bir Geri Arama işlevi kullanın, ardından
şablon argümanları:

geçersiz
CourseChange (const std::string bağlamı, Ptr modeli)
{
Kendi ID’n ile mağazalarını oluştur
}

olmasını sağlamak istiyorsanız, Kurs DeğişimiGeri arama işlev yalnızca sizin
yerel dosya, anahtar kelimeyi ekleyebilirsiniz statik ve şunu bul:

Statik boşluk
CourseChange (const std::string yolu, Ptr modeli)
{
Kendi ID’n ile mağazalarını oluştur
}

tam olarak kullandığımız şey bu üçüncü.cc örnek.

Uygulama
Bu bölüm tamamen isteğe bağlıdır. Özellikle onlar için inişli çıkışlı bir yolculuk olacak.
şablonların ayrıntılarına aşina değil. Ancak, bunu aşarsanız,
birçoğunda çok iyi bir ele ns-3 düşük seviyeli deyimler.

Öyleyse, tekrar, geri çağırma işlevinin hangi imzasının gerekli olduğunu bulalım.
"CourseChange" izleme kaynağı. Bu acı verici olacak, ama sadece bunu yapman gerekiyor.
bir Zamanlar. Bunu geçtikten sonra, sadece bir şeye bakabileceksiniz. İzlenen Geri Arama ve
anla onu.

Bakmamız gereken ilk şey, iz kaynağının beyanıdır. Hatırlamak
bu var hareketlilik-modeli.h, daha önce bulduğumuz yer:

TracedCallback > m_courseChangeTrace;

Bu beyan bir şablon içindir. Şablon parametresi köşeli parantezlerin içindedir,
bu yüzden bunun ne olduğunu bulmakla gerçekten ilgileniyoruz TracedCallback<> dır-dir. eğer varsa
bunun nerede bulunabileceği hakkında kesinlikle hiçbir fikrim yok, grep senin arkadaşın.

Muhtemelen bir tür deklarasyonla ilgileneceğiz. ns-3 kaynak, yani
ilk değişiklik src dizin. O zaman biliyoruz ki bu deklarasyon
bir tür başlık dosyasında olun, bu yüzden sadece grep bunun için kullanarak:

$ bulun. -ad '*.h' | xargs grep TracedCallback

303 satırın uçtuğunu göreceksiniz (bunu aktardım wc ne kadar kötü olduğunu görmek için). Rağmen
bu çok gibi görünebilir, aslında çok değil. Sadece çıkışı boruya aktarın Daha ve
üzerinden taramaya başlayın. İlk sayfada, çok şüpheli bir şekilde bazılarını göreceksiniz.
şablon görünümlü şeyler.

TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::TracedCallback ()
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::ConnectWithoutContext (c ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::Connect (const CallbackB ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::DisconnectWithoutContext ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::Disconnect (const Callba ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (void) const ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1) const ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2 ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2 ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2 ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2 ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2 ...
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::operator() (T1 a1, T2 a2 ...

Tüm bunların başlık dosyasından geldiği ortaya çıktı. izlenen-callback.h hangi sesler
çok umut verici. Daha sonra bir göz atabilirsiniz hareketlilik-modeli.h ve bir çizgi olduğunu görün
bu önseziyi doğrulayan:

#include "ns3/traced-callback.h"

Tabii ki, buna diğer yönden gidebilir ve şuna bakarak başlayabilirdiniz.
şunları içerir hareketlilik-modeli.h ve içerdiğini fark ederek izlenen-callback.h ve
Bunun istediğiniz dosya olması gerektiğini çıkararak.

Her iki durumda da, bir sonraki adım, src/core/model/traced-callback.h in
Neler olduğunu görmek için favori editörünüz.

Dosyanın üst kısmında rahatlatıcı olması gereken bir yorum göreceksiniz:
Bir ns3::TracedCallback, normal bir ns3::Callback ile neredeyse tamamen aynı API'ye sahiptir, ancak
çağrıları tek bir işleve yönlendirmek yerine (normalde ns3::Callback'in yaptığı gibi),
çağrıları bir ns3::Callback zincirine iletir.

Bu çok tanıdık gelmeli ve doğru yolda olduğunuzu size bildirmelidir.

Bu yorumdan hemen sonra

şablon
typename T3 = boş, typename T4 = boş,
typename T5 = boş, typename T6 = boş,
typename T7 = boş, typename T8 = boş>
sınıf TracedCallback
{
Kendi ID’n ile mağazalarını oluştur

Bu size TracedCallback'in şablonlu bir sınıf olduğunu söyler. Sekiz olası türü vardır
varsayılan değerlere sahip parametreler. Geri dönün ve bunu bulunduğunuz beyanla karşılaştırın.
anlamaya çalışmak:

TracedCallback > m_courseChangeTrace;

The tür adı T1 şablonlu sınıf bildiriminde şuna karşılık gelir: Ptr
MobiliteModeli> yukarıdaki beyannamede. Diğer tüm tür parametreleri olduğu gibi bırakılır
varsayılanlar. Yapıcıya bakmak gerçekten size pek bir şey söylemez. Tek yer
Geri Arama işleviniz ile izleme sistemi arasında bir bağlantı kurulduğunu gördünüz
içinde Bağlantı Kurun ve Bağlam Olmadan Bağlan fonksiyonlar. Aşağı kaydırırsanız, bir
Bağlam Olmadan Bağlan buradaki yöntem:

şablon
tür adı T3, tür adı T4,
tür adı T5, tür adı T6,
tür adı T7, tür adı T8>
geçersiz
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::ConnectWithoutContext ...
{
Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> cb;
cb.Assign (geri arama);
m_callbackList.push_back (cb);
}

Artık canavarın karnındasın. Şablon için örnek oluşturulduğunda
yukarıdaki beyan, derleyici yerini alacak T1 ile Ptr MobiliteModeli>.

geçersiz
TracedCallback ::ConnectWithoutContext ... cb
{
Geri aramak > cb;
cb.Assign (geri arama);
m_callbackList.push_back (cb);
}

Artık bahsettiğimiz her şeyin uygulamasını görebilirsiniz. kod
doğru türde bir Geri Arama oluşturur ve işlevinizi buna atar. bu
eşdeğeri pfi = İşlevim Bu bölümün başında tartışmıştık. kod
ardından Geri Aramayı bu kaynak için Geri Aramalar listesine ekler. geriye kalan tek şey
Geri arama tanımına bakmak için. Aynısını kullanmak grep eskiden bulduğumuz hile
İzlenen Geri Arama, dosyayı bulabileceksiniz ./core/geri arama.h biz mi
bakmak lazım.

Dosyaya bakarsanız, muhtemelen neredeyse anlaşılmaz olan birçok şey göreceksiniz.
şablon kodu. Sonunda Geri Arama için bazı API Belgelerine geleceksiniz.
Yine de şablon sınıfı. Neyse ki, biraz İngilizce var:
Geri Arama şablon sınıfı.

Bu sınıf şablonu, Functor Tasarım Modelini uygular. beyan etmek için kullanılır
bir tür Geri Arama:

· isteğe bağlı olmayan ilk şablon argümanı, geri aramanın dönüş türünü temsil eder.

· kalan (isteğe bağlı) şablon argümanları, sonraki
geri arama için argümanlar.

· dokuz adede kadar argüman desteklenir.

ne olduğunu anlamaya çalışıyoruz

Geri aramak > cb;

beyan anlamına gelir. Şimdi ilkinin (isteğe bağlı olmayan) olduğunu anlayacak durumdayız.
şablon argümanı, geçersiz, Geri Aramanın dönüş türünü temsil eder. İkinci
(isteğe bağlı) şablon argümanı, Ptr MobiliteModeli> ilk türünü temsil eder
geri arama için argüman.

Söz konusu Geri Arama, izleme olaylarını alma işlevinizdir. Bundan yapabilirsiniz
döndüren bir işleve ihtiyacınız olduğunu çıkarın geçersiz ve alır Ptr MobiliteModeli>.
Örneğin,

geçersiz
CourseChangeCallback (Ptr modeli)
{
Kendi ID’n ile mağazalarını oluştur
}

Eğer istersen tek ihtiyacın olan bu Yapılandırma::ConnectWithoutContext. Bir bağlam istiyorsanız,
gerek Yapılandır::Bağlan ve bir dize bağlamı alan bir Geri Çağırma işlevi kullanın. Bu
çünkü Bağlantı Kurun işlevi sizin için bağlam sağlayacaktır. İhtiyacın olacak:

geçersiz
CourseChangeCallback (std::string bağlamı, Ptr modeli)
{
Kendi ID’n ile mağazalarını oluştur
}

olmasını sağlamak istiyorsanız, Kurs DeğişimiGeri arama yalnızca yerel dosyanızda görünür,
anahtar kelimeyi ekleyebilirsiniz statik ve şunu bul:

Statik boşluk
CourseChangeCallback (std::string yolu, Ptr modeli)
{
Kendi ID’n ile mağazalarını oluştur
}

tam olarak kullandığımız şey bu üçüncü.cc örnek. Belki şimdi geri dönmelisin ve
önceki bölümü tekrar okuyun (Bunun için Sözümü Alın).

Geri Aramaların uygulanmasıyla ilgili daha fazla ayrıntıyla ilgileniyorsanız, çekinmeyin
bir göz atmak için ns-3 Manuel. en sık kullanılan yapılardan biridir.
düşük seviyeli kısımlar ns-3. Bana göre oldukça şık bir şey.

İzlenen Değerler
Bu bölümün başlarında, bir kod kullanan basit bir kod parçası sunduk.
İzlenen Değer izleme kodunun temellerini göstermek için. sadece parlattık
TracedValue'nin gerçekte ne olduğu ve dönüş türü ile biçimsel argümanların nasıl bulunacağı
geri arama.

Bahsettiğimiz gibi, dosya, izlenen değer.h izleme için gerekli bildirimleri getirir
değer semantiğine uyan verilerin Genel olarak, değer semantiği sadece şu anlama gelir:
nesnenin adresini geçmek yerine nesnenin kendisini iletin. uzatıyoruz
olan atama stili operatörlerinin tam setini içerme gereksinimi
düz eski veri (POD) türleri için önceden tanımlanmış:

┌───────────────────────────────────────────┐
operatör= (görev) │ │
├───────────────────────────────────────────┤
operatör*=operatör/=
├───────────────────────────────────────────┤
operatör+=operatör-=
├───────────────────────────────────────────┤
operatör++ (hem önek hem de │ │
│son düzeltme) │ │
├───────────────────────────────────────────┤
Şebeke-- (hem önek hem de │ │
│son düzeltme) │ │
├───────────────────────────────────────────┤
operatör<<=operatör>>=
├───────────────────────────────────────────┤
operatör&=operatör|=
├───────────────────────────────────────────┤
operatör%=operatör^=
└───────────────────────────────────────────┘

Tüm bunların gerçekten anlamı, bunları kullanarak yapılan tüm değişiklikleri izleyebileceğinizdir.
değer semantiğine sahip bir C++ nesnesine işleçler.

The TracedValue<> yukarıda gördüğümüz beyan, sistemi aşırı yükleyen altyapıyı sağlar.
yukarıda bahsedilen operatörler ve geri arama sürecini yürütür. Operatörlerden herhangi birinin kullanımında
yukarıda bir ile izlenen değer o değişkenin hem eski hem de yeni değerini sağlayacaktır,
bu durumda bir int32_t değer. Muayene ile izlenen değer beyannamesini biliyoruz
izleme havuzu işlevinin argümanları olacak (sabit int32_t eskiDeğer, const int32_t yeni değer).
için dönüş türü izlenen değer geri arama işlevi her zaman geçersiz, yani beklenen
geri arama imzası şöyle olacaktır:

void (* TracedValueCallback)(const int32_t eskiValue, const int32_t yeniValue);

The .AddTraceSource içinde GetTypeId yöntem, bağlantı için kullanılan "kancaları" sağlar.
Config sistemi aracılığıyla dış dünyaya kaynak izleyin. zaten tartışmıştık
ilk üç anlaşma İzleme Kaynağı Ekle: Yapılandırma sistemi için Özellik adı, bir yardım
dize ve TracedValue sınıfı veri üyesinin adresi.

Örnekteki son dize argümanı, "ns3::Traced::Value::Int32", bir
typedef geri arama işlevi imzası için. Bu imzaların tanımlanmasını istiyoruz,
ve tam nitelikli tür adını verin İzleme Kaynağı Ekle, böylece API belgeleri
bir izleme kaynağını işlev imzasına bağlayın. TracedValue için imza
basit; TracedCallbacks için API belgelerinin gerçekten yardımcı olduğunu gördük.

Gerçek Örnek E-posta
TCP hakkında en çok bilinen kitaplardan birinden alınmış bir örnek yapalım. "TCP/IP
Illustrated, Cilt 1: W. Richard Stevens'ın "Protokoller" bir klasik.
kitap açıldı ve hem tıkanıklık penceresinin hem de sıranın güzel bir planına rastladı
sayılara karşı zamana karşı sayfa 366. Stevens buna "Şekil 21.10. Değeri cwnd ve
veri aktarılırken sıra numarası gönder." cwnd kısmını yeniden oluşturalım
o arsanın içindeki ns-3 izleme sistemini kullanarak ve gnuplot.

Mevcut kaynaklar
Düşünülmesi gereken ilk şey, verileri nasıl dışarı çıkarmak istediğimizdir. biz ne ki
iz sürmeye gerek var mı? Öyleyse ne yapmamız gerektiğini görmek için "Tüm İz Kaynakları" listesine başvuralım.
ile birlikte. içinde bulunduğunu hatırlayın. ns-3 API Belgeleri. arasında kaydırırsanız
liste, sonunda bulacaksınız:
ns3::TcpNewReno

· TıkanıklıkPenceresi: TCP bağlantısının tıkanıklık penceresi

· YavaşBaşlangıç ​​Eşiği: TCP yavaş başlatma eşiği (bayt)

Görünüşe göre ns-3 TCP uygulaması (çoğunlukla) dosyada yaşar
src/internet/model/tcp-socket-base.cc tıkanıklık kontrol varyantları gibi dosyalarda iken
as kaynak/internet/model/tcp-newreno.cc. bunu bilmiyorsan a önselkullanabilir,
özyineli grep hile:

$ bulun. -ad '*.cc' | xargs grep -i tcp

Sizi o dosyaya yönlendiren tcp örneklerinin sayfalarını bulacaksınız.

için sınıf belgelerini getirmek TcpYeniReno ve listeye atlayarak
bulacağınız TraceSources
İz Kaynakları

· TıkanıklıkPenceresi: TCP bağlantısının tıkanıklık penceresi

Geri arama imzası: ns3::Traced::Value::Uint322Geri Arama

Geri aramayı tıklayarak typedef bağlantı, artık beklediğinizi bildiğiniz imzayı görüyoruz:

typedef void(* ns3::Traced::Value::Int32Callback)(const int32_t eskiValue, const int32_t yeniValue)

Şimdi bu kodu tamamen anlamalısınız. için bir işaretçimiz varsa TcpYeniReno,
yapabiliriz TraceConnect uygun bir bilgi sağlarsak "CongestionWindow" izleme kaynağına
geri arama hedefi Bu, basit örnekte gördüğümüzle aynı türden bir iz kaynağı.
bahsettiğimiz dışında, bu bölümün başında uint32_t yerine
int32_t. Ve bu imza ile bir geri arama işlevi sağlamamız gerektiğini biliyoruz.

Bulma Örnekler
Bunun yerine, değiştirebileceğiniz çalışma kodunu bulmaya çalışmak her zaman en iyisidir.
sıfırdan başlamaktansa. Bu yüzden şimdiki ilk iş, şu kodu bulabilecek bir kod bulmaktır.
zaten "CongestionWindow" izleme kaynağını bağlar ve onu değiştirip değiştiremeyeceğimize bakarız. Her zaman oldugu gibi,
grep senin arkadaşın:

$ bulun. -ad '*.cc' | xargs grep CongestionWindow

Bu, birkaç umut verici adaya işaret edecektir: örnekler/tcp/tcp-large-transfer.cc
ve src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc.

Henüz hiçbir test kodunu ziyaret etmedik, o yüzden oraya bir göz atalım. Olacaksın
genellikle test kodunun oldukça az olduğunu görürsünüz, bu nedenle bu muhtemelen çok iyi bir bahistir.
Açılış src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc en sevdiğiniz düzenleyicide ve arayın
"Tıkanıklık Penceresi". Bulacaksın,

ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindow",
MakeCallback (&Ns3TcpCwndTestCase1::CwndChange, bu));

Bu size çok tanıdık gelmeli. Bir işaretçimiz olsaydı yukarıda bahsetmiştik.
TcpYeniReno, yapabiliriz TraceConnect "CongestionWindow" izleme kaynağına. tam olarak bu
burada ne var; bu kod satırının tam olarak istediğimizi yaptığı ortaya çıktı.
Devam edelim ve ihtiyacımız olan kodu bu fonksiyondan çıkaralım (Ns3TcpCwndTestCase1::DoRun
(geçersiz)). Bu fonksiyona bakarsanız, tıpkı bir ns-3
senaryo. Bunun tam olarak ne olduğu ortaya çıkıyor. Test tarafından çalıştırılan bir komut dosyasıdır
çerçeve, böylece onu dışarı çekip sarabiliriz ana yerine Çalıştır. Yerine
Bunun üzerinden geçmek yerine, adım adım taşıma işleminden kaynaklanan dosyayı sağladık.
bu test bir yerliye geri döndü ns-3 senaryo -- örnekler/eğitici/fifth.cc.

Hareketlilik Iz kaynaklar
The beşinci.cc örnek, anlamanız gereken son derece önemli bir kuralı gösterir
herhangi bir izleme kaynağı kullanmadan önce:
Yapılandır::Bağlan komut, kullanmaya çalışmadan önce var. söylemekten farkı yok
bir nesne, onu çağırmaya çalışmadan önce somutlaştırılmalıdır. Bu açık görünse de
bu şekilde ifade edildiğinde, sistemi ilk kez kullanmaya çalışan birçok insanı tetikler.
Zaman.

Bir an için temellere dönelim. İçinde var olan üç temel yürütme aşaması vardır.
herhangi ns-3 senaryo. İlk aşama bazen "Yapılandırma Süresi" veya "Kurulum" olarak adlandırılır.
Zaman" ve süre boyunca var olur. ana betiğinizin işlevi çalışıyor, ancak
önce Simülatör::Çalıştır denir. İkinci aşama bazen "Simülasyon Süresi" olarak adlandırılır.
ve zaman periyodunda var olur Simülatör::Çalıştır etkinliklerini aktif olarak yürütmektedir.
Simülasyonu çalıştırmayı tamamladıktan sonra, Simülatör::Çalıştır kontrolü geri getirecek
the ana işlev. Bu olduğunda, komut dosyası "Teardown" olarak adlandırılabilecek şeye girer.
Kurulum sırasında oluşturulan yapıların ve nesnelerin parçalara ayrıldığı ve
yayınlandı.

İzleme sistemini kullanmaya çalışırken yapılan belki de en yaygın hata,
dinamik olarak oluşturulmuş varlıklar sırasında simülasyon zaman yapılandırma sırasında kullanılabilir
zaman. Özellikle, bir ns-3 Soket tarafından oluşturulan dinamik bir nesnedir. Uygulamalar için
arasında iletişim kurmak Nodes . Bir ns-3 Uygulama her zaman bir "Başlangıç ​​Zamanı" ve bir "Durdur"
Bununla ilişkili zaman". Vakaların büyük çoğunluğunda, bir Uygulama teşebbüs etmeyecek
kadar dinamik bir nesne oluşturmak için Uygulamaya Başla yöntem bazı "Başlat
Zaman". Bu, simülasyonun uygulamadan önce tamamen yapılandırıldığından emin olmak içindir.
herhangi bir şey yapmaya çalışır (var olmayan bir Düğüme bağlanmaya çalışırsa ne olur)
henüz yapılandırma süresi sırasında?). Sonuç olarak, yapılandırma aşamasında yapamazsınız
sırasında biri dinamik olarak oluşturulmuşsa, bir izleme kaynağını bir izleme havuzuna bağlayın.
simülasyon.

Bu bilmecenin iki çözümü

1. Dinamik nesne oluşturulduktan sonra çalıştırılan bir simülatör olayı oluşturun ve
bu olay yürütüldüğünde iz; veya

2. Dinamik nesneyi yapılandırma zamanında oluşturun, ardından bağlayın ve nesneyi
simülasyon süresi boyunca kullanılacak sistem.

İkinci yaklaşımı kullandık beşinci.cc örnek. Bu karar oluşturmamızı gerektirdi.
the Uygulamam Uygulama, tüm amacı bir Soket parametre olarak.

İzlenecek yol: beşinci.cc
Şimdi sıkışıklığı inceleyerek oluşturduğumuz örnek programa bir göz atalım.
pencere testi. Açık örnekler/eğitici/fifth.cc en sevdiğiniz düzenleyicide. Görmelisin
bazı tanıdık görünen kod:

/* -*- Mod:C++; c-dosya-stili:"gnu"; girinti sekmeleri modu:nil; -*- */
/*
* Bu program ücretsiz bir yazılımdır; yeniden dağıtabilir ve/veya değiştirebilirsiniz
* GNU Genel Kamu Lisansı sürüm 2 koşulları altında olduğu gibi
* Özgür Yazılım Vakfı tarafından yayınlanan;
*
* Bu program faydalı olması ümidiyle dağıtılmaktadır,
* ancak HİÇBİR GARANTİ YOKTUR; zımni garanti bile olmadan
* SATILABİLİRLİK veya BELİRLİ BİR AMACA UYGUNLUK. Bkz.
* Daha fazla ayrıntı için GNU Genel Kamu Lisansı.
*
* GNU Genel Kamu Lisansının bir kopyasını almış olmalısınız
* Bu programla birlikte; değilse, Özgür Yazılım'a yazın
* Foundation, Include., 59 Temple Place, Suite 330, Boston, MA 02111-1307 ABD
*/

#Dahil etmek
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/noktadan noktaya-module.h"
#include "ns3/applications-module.h"

ns3 ad alanını kullanma;

NS_LOG_COMPONENT_DEFINE ("FifthScriptÖrneği");

Bunların hepsi ele alındı, bu yüzden tekrarlamayacağız. Sonraki kaynak satırları,
ağ çizimi ve yukarıda açıklanan sorunu ele alan bir yorum Soket.

// ============================================== ===========================
//
// düğüm 0 düğüm 1
// ++++++++++
// | ns-3 TCP | | ns-3 TCP |
// ++++++++++
// | 10.1.1.1 | | 10.1.1.2 |
// ++++++++++
// | noktadan noktaya | | noktadan noktaya |
// ++++++++++
// | |
// +----------------------+
// 5 Mb/sn, 2 ms
//
//
// ns-3 TCP tıkanıklık penceresindeki değişikliklere bakmak istiyoruz. İhtiyacımız var
// akışı hızlandırmak ve CongestionWindow özniteliğini sokete bağlamak için
// gönderenin. Normalde bir açma-kapama uygulaması, bir
// akış, ancak bunun birkaç sorunu var. İlk olarak, açma-kapama soketi
// Uygulama Başlangıç ​​zamanına kadar uygulama oluşturulmaz, bu nedenle
// konfigürasyon zamanında soketi (şimdi) bağlayabilir. İkincisi, biz olsak bile
// başlangıç ​​saatinden sonra bir çağrı ayarlayabiliriz, soket herkese açık değil, bu yüzden
// ona ulaşamadık.
//
// Böylece, on-off uygulamasının ne yaptığını yapan basit bir versiyonunu hazırlayabiliriz.
// istiyoruz. Artı tarafta, on-off'un tüm karmaşıklığına ihtiyacımız yok
// başvuru. Eksi tarafında, bir yardımcımız yok, bu yüzden almalıyız.
// ayrıntılarla biraz daha ilgileniyoruz ama bu önemsiz.
//
// İlk önce bir soket oluşturuyoruz ve üzerinde trace connect'i yapıyoruz; sonra geçeriz
// bu soketi, daha sonra yapacağımız basit uygulamamızın yapıcısına
// kaynak düğüme kurun.
// ============================================== ===========================
//

Bu aynı zamanda kendi kendini açıklayıcı olmalıdır.

Bir sonraki bölüm, beyannamedir. Uygulamam Uygulama izin vermek için bir araya getirdiğimiz
the Soket yapılandırma zamanında oluşturulacak.

sınıf MyApp : genel Uygulama
{
kamu:

Uygulamam ();
sanal ~Uygulamam();

geçersiz Kurulum (Ptr soket, Adres adresi, uint32_t packageSize,
uint32_t nPackets, DataRate dataRate);

özel:
sanal geçersiz StartApplication (geçersiz);
sanal geçersiz StopApplication (geçersiz);

geçersiz ScheduleTx (geçersiz);
geçersiz SendPacket (geçersiz);

Ptr m_socket;
Adres m_peer;
uint32_t m_packetSize;
uint32_t m_nPackets;
VeriOranı m_dataRate;
Olay Kimliği m_sendEvent;
bool m_running;
uint32_t m_packetsGönderildi;
};

Bu sınıfın miras aldığını görebilirsiniz. ns-3 Uygulama sınıf. Şuna baksana
kaynak/ağ/model/application.h Miras alınan şeyle ilgileniyorsanız. bu Uygulamam
sınıf geçersiz kılmak zorundadır Uygulamaya Başla ve Uygulamayı Durdur yöntemler. Bunlar
yöntemler otomatik olarak çağrıldığında Uygulamam veri göndermeyi başlatmak ve durdurmak için gereklidir
simülasyon sırasında.

Başlatma/Durdurma Uygulamalar
Olayların gerçekte nasıl başladığını açıklamak için biraz zaman harcamaya değer.
sistem. Bu, oldukça derin bir başka açıklamadır ve bilmiyorsanız göz ardı edilebilir.
sistemin bağırsaklarına inmeyi planlıyor. Ancak bu konuda faydalı
tartışma, bazı çok önemli kısımların ne kadar önemli olduğuna değiniyor. ns-3 çalışır ve bazılarını ortaya çıkarır
önemli deyimler Yeni modeller uygulamayı planlıyorsanız, muhtemelen
bu bölümü anlayın.

Pompalama olaylarını başlatmanın en yaygın yolu, bir Uygulama. Bu şu şekilde yapılır
aşağıdaki (umarım) tanıdık satırların sonucu ns-3 senaryo:

ApplicationContainer uygulamaları = ...
apps.Start (Saniye (1.0));
apps.Stop (Saniye (10.0));

Uygulama kapsayıcı kodu (bkz. src/ağ/yardımcı/application-container.h Eğer sen
ilgilenen) içerdiği uygulamalar ve çağrılar arasında döngüler,

app->SetStartTime (startTime);

bir sonucu olarak uygulamalar.Başlat ara ve

app->SetStopTime (stopTime);

bir sonucu olarak uygulamalar.Durdur aramak.

Bu çağrıların nihai sonucu, simülatörün otomatik olarak olmasını istememizdir.
arama yapmak Uygulamalar onlara ne zaman başlayıp ne zaman duracaklarını söylemek için. Bu durumuda
Uygulamam, sınıftan miras alır Uygulama ve geçersiz kılar Uygulamaya Başla, ve
Uygulamayı Durdur. Bunlar, simülatör tarafından çağrılacak fonksiyonlardır.
uygun zaman. Bu durumuda Uygulamam bunu bulacaksın Uygulamam::BaşlatUygulama yok
İlk bağlamak, ve Bağlantı Kurun sokette ve ardından arayarak veri akışını başlatır
Uygulamam::SendPacket. Uygulamam::Uygulamayı Durdur herhangi birini iptal ederek paket oluşturmayı durdurur.
bekleyen send olayları daha sonra soketi kapatır.

hakkında güzel şeylerden biri ns-3 uygulamayı tamamen görmezden gelebilmenizdir
nasıl olduğuna dair detaylar Uygulama simülatör tarafından doğru olarak "otomatik olarak" çağrılır
zaman. Ama zaten derinlere indiğimiz için ns-3 şimdiden geçelim.

Bakarsanız kaynak/ağ/model/application.cc olduğunu göreceksin Başlangıç ​​Zamanını Ayarla yöntem
Bir of Uygulama sadece üye değişkenini ayarlar m_startTime ve Durma Süresini Ayarla yöntem
sadece ayarlar m_stopTime. Oradan, bazı ipuçları olmadan, iz muhtemelen sona erecek.

İzi tekrar yakalamanın anahtarı, tüm bunların küresel bir listesinin olduğunu bilmektir.
sistemdeki düğümler. Bir simülasyonda bir düğüm oluşturduğunuzda, o Düğüme bir işaretçi
küresel eklendi Düğüm Listesi.

Bakmak kaynak/ağ/model/düğüm listesi.cc ve arama Düğüm Listesi::Ekle. Kamu
statik uygulama adlı özel bir uygulamaya çağrılar NodeListPriv::Ekle. Bu
nispeten yaygın bir deyimdir ns-3. Yani, bir göz atın NodeListPriv::Ekle. Burdasın
bulacak,

Simulator::ScheduleWithContext (index, TimeStep (0), &Node::Initialize, node);

Bu size, bir simülasyonda bir Düğüm oluşturulduğunda, yan etki olarak, bir çağrının
o düğüme başlat sıfır zamanında gerçekleşen yöntem sizin için planlanmıştır. yapma
henüz bu isme çok fazla şey okuyun. Bu, Düğümün yapmaya başlayacağı anlamına gelmez
herhangi bir şey, Düğüme yapılan bir bilgilendirme çağrısı olarak yorumlanabilir.
simülasyon başladı, Düğüme bir şeyler yapmaya başlamasını söyleyen bir eylem çağrısı değil.

Yani, Düğüm Listesi::Ekle dolaylı olarak bir aramayı planlar Düğüm::Başlat tavsiye etmek için sıfır zamanında
simülasyonun başladığı yeni Düğüm. eğer bakarsan kaynak/ağ/model/düğüm.h sen
ancak, denilen bir yöntem bulamaz Düğüm::Başlat. Görünen o ki
başlat yöntem sınıftan miras alınır nesne. Sistemdeki tüm nesneler olabilir
simülasyon başladığında bildirilir ve Node sınıfının nesneleri bunlardan yalnızca bir tanesidir.
nesneler.

Bakmak kaynak/çekirdek/model/object.cc sonraki ve ara Nesne::Başlat. bu kod
beri beklediğiniz kadar basit değil ns-3 nesneler destek
toplama. içindeki kod Nesne::Başlat sonra tüm nesneler arasında döngüler
bir araya toplanmış ve onları çağırır Başlatma yöntem. Bu başka bir deyim
bu çok yaygın ns-3, bazen "şablon tasarım deseni" olarak adlandırılır.
uygulamalar arasında sabit kalan ve bir
alt sınıflar tarafından devralınan ve uygulanan özel sanal uygulama yöntemi.
İsimler tipik olarak şöyle bir şeydir YöntemAdı genel API için ve Yapılacak YöntemAdı için
özel API.

Bu bize bir arama yapmamız gerektiğini söylüyor. Düğüm::DoInitialize yöntem
kaynak/ağ/model/node.cc izimizi sürdürecek yöntem için. bulursanız
kodu, Düğümdeki tüm aygıtlar arasında dolaşan bir yöntem bulacaksınız ve ardından
Düğüm çağrısındaki tüm uygulamalar cihaz->Başlat ve uygulama->Başlat
respectivamente.

Bu sınıfları zaten biliyor olabilirsiniz cihaz ve Uygulama her ikisi de sınıftan miras alır nesne
ve bir sonraki adım, ne zaman ne olacağına bakmak olacaktır. Uygulama::DoInitialize is
aranan. Şuna baksana kaynak/ağ/model/application.cc ve bulacaksınız:

geçersiz
Uygulama::DoInitialize (geçersiz)
{
m_startEvent = Simulator::Schedule (m_startTime, &Application::StartApplication, this);
eğer (m_stopTime != TimeStep (0)) ise
{
m_stopEvent = Simulator::Schedule (m_stopTime, &Application::StopApplication, this);
}
Object::DoInitialize();
}

İşte sonunda parkurun sonuna geliyoruz. Her şeyi düz tuttuysan,
uygulamak ns-3 Uygulama, yeni uygulamanız sınıftan miras alır Uygulama. Sen
geçersiz kıl Uygulamaya Başla ve Uygulamayı Durdur yöntemler ve mekanizmalar sağlar.
yeni cihazınızdan veri akışını başlatmak ve durdurmak Uygulama. Bir Düğüm olduğunda
simülasyonda oluşturulan, global bir Düğüm Listesi. Düğüm ekleme eylemi
Re-Tweet Düğüm Listesi çağıran sıfır zaman için bir simülatör olayının programlanmasına neden olur.
Düğüm::Başlat simülasyon başladığında çağrılacak yeni eklenen Düğümün yöntemi.
Bir Düğüm miras aldığından nesne, bu çağırır Nesne::Başlat düğümdeki yöntem
hangi sırayla çağırır Başlatma yöntemlerin tamamında nesneler toplanmış
Düğüm (hareketlilik modellerini düşünün). Düğümden beri nesne geçersiz kılındı BaşlatmaBu
simülasyon başladığında yöntem çağrılır. bu Düğüm::DoInitialize yöntem çağırır
başlat tüm yöntemlerin Uygulamalar düğüm üzerinde. Dan beri Uygulamalar de vardır
nesneler, bu neden olur Uygulama::DoInitialize çağrılacak. Ne zaman
Uygulama::DoInitialize çağrılır, olaylar için programlar planlar. Uygulamaya Başla ve
Uygulamayı Durdur çağrılar Uygulama. Bu çağrılar, aramayı başlatmak ve durdurmak için tasarlanmıştır.
gelen veri akışı Uygulama

Bu oldukça uzun bir başka yolculuk oldu, ancak yalnızca bir kez yapılması gerekiyor ve şimdi
başka bir çok derin parçayı anla ns-3.

The Uygulamam Uygulama
The Uygulamam Uygulama elbette bir yapıcıya ve bir yıkıcıya ihtiyaç duyar:

Uygulamam::Uygulamam ()
: m_soket (0),
m_peer(),
m_packetSize (0),
m_nPaketler (0),
m_dataOran (0),
m_sendEvent(),
m_running (yanlış),
m_packetsGönderildi (0)
{
}

Uygulamam::~Uygulamam()
{
m_soket = 0;
}

Bir sonraki kod parçasının varlığı, bunu yazmamızın tek nedenidir. Uygulama in
ilk etapta.

geçersiz
Uygulamam::Kurulum (Ptr soket, Adres adresi, uint32_t packageSize,
uint32_t nPackets, DataRate dataRate)
{
m_socket = soket;
m_peer = adres;
m_packetSize = paketSize;
m_nPackets = nPackets;
m_dataRate = veriRate;
}

Bu kod oldukça açıklayıcı olmalıdır. Sadece üye değişkenleri başlatıyoruz.
İzleme açısından önemli olan, Ptr soket hangimiz
yapılandırma süresi sırasında uygulamaya sağlamak için gereklidir. gittiğimizi hatırla
oluşturmak için Soket bir şekilde TcpSocket (tarafından uygulanan TcpYeniReno) ve kancasını
"CongestionWindow" izleme kaynağına geçirmeden önce Kurmak yöntemi.

geçersiz
Uygulamam::Uygulamayı Başlat (geçersiz)
{
m_running = doğru;
m_packetsGönderildi = 0;
m_socket->Bağla();
m_socket->Bağlan (m_peer);
SendPacket();
}

Yukarıdaki kod geçersiz kılınan uygulamadır Uygulama::BaşlatUygulama Bu olacak
başlatmak için simülatör tarafından otomatik olarak çağrılır. Uygulama uygun koşuda
zaman. bir yaptığını görebilirsiniz Soket bağlamak operasyon. aşina iseniz
Berkeley Soketleri bu bir sürpriz olmamalı. Yerelde gerekli çalışmaları yapar.
bağlantının tarafı tam da beklediğiniz gibi. Aşağıdaki Bağlantı Kurun olanı yapacak
TCP ile bağlantı kurmak için gerekli Adres m_peer. Artık net olmalı
neden bunun çoğunu simülasyon zamanına ertelememiz gerekiyor, çünkü Bağlantı Kurun ihtiyacı olacak
tamamlamak için tam olarak işleyen bir ağ. Sonra Bağlantı Kurun, Uygulama sonra başlar
arayarak simülasyon olayları oluşturma Paket Gönder.

Bir sonraki kod biti, Uygulama simülasyon olayları oluşturmayı nasıl durdurabilirim.

geçersiz
Uygulamam::Uygulamayı Durdur (geçersiz)
{
m_running = yanlış;

eğer (m_sendEvent.IsRunning ())
{
Simülatör::İptal (m_sendEvent);
}

eğer (m_socket)
{
m_socket->Kapat ();
}
}

Her simülasyon olayı planlandığında, bir Etkinlikler yaratıldı. Eğer Etkinlikler beklemede
yürütme veya yürütme, yöntemi Çalışıyor geri dönücek gerçek. Bu kodda ise
Çalışıyor() true döner, biz İptal etmek onu simülatör olayından çıkaran olay
sıra. Bunu yaparak, olayların zincirini kırıyoruz. Uygulama tutmak için kullanıyor
onun gönderilmesi paketler ve Uygulama sessiz gider. biz sessize aldıktan sonra Uygulama we
Kapat TCP bağlantısını koparan soket.

Soket, yıkıcıda gerçekte silinir. m_socket = 0 Idam edildi. Bu
temel alınan Ptr'ye yapılan son referansı kaldırır yıkımına neden olan
o Nesne çağrılacak.

Hatırlamak Uygulamaya Başla denilen Paket Gönder tanımlayan olaylar zincirini başlatmak için
the Uygulama davranışı.

geçersiz
Uygulamam::SendPacket (geçersiz)
{
Ptr paket = Oluştur (m_packetSize);
m_socket->Gönder (paket);

if (++m_packetsSent < m_nPackets)
{
ÇizelgeTx ();
}
}

İşte, görüyorsun Paket Gönder sadece bunu yapar. bir Paket ve sonra bir yapar Gönder
ki, eğer Berkeley Sockets'i biliyorsanız, muhtemelen tam da görmeyi beklediğiniz şeydir.

sorumluluğundadır. Uygulama olaylar zincirini planlamaya devam etmek için
sonraki hatlar çağrı ProgramTx başka bir iletim olayı programlamak için (bir Paket Gönder) e kadar
Uygulama yeterince gönderdiğine karar verir.

geçersiz
Uygulamam::ScheduleTx (geçersiz)
{
eğer (m_running)
{
Zaman tSonraki (Saniye (m_packetSize * 8 / static_cast) (m_dataRate.GetBitRate ())));
m_sendEvent = Simulator::Schedule (tNext, &MyApp::SendPacket, this);
}
}

İşte, görüyorsun ProgramTx tam olarak bunu yapar. Eğer Uygulama çalışıyor (eğer
Uygulamayı Durdur aranmadı) yeni bir etkinlik planlayacak ve Paket Gönder
Yeniden. Uyarı okuyucu, yeni kullanıcıları da tetikleyen bir şeyi tespit edecektir. veri hızı
Bir of Uygulama sadece bu. Altta yatan bir veri hızı ile ilgisi yoktur.
Telegram Kanal. Bu oran, Uygulama bit üretir. içine almıyor
taşımak için kullandığı çeşitli protokoller veya kanallar için herhangi bir ek yükü hesaba katar.
veri. Bir veri hızını ayarlarsanız Uygulama temelinizle aynı veri hızına
Telegram Kanal sonunda bir arabellek taşması elde edeceksiniz.

Iz Lavabo
Bu alıştırmanın tüm amacı, TCP'den aşağıdakileri gösteren izleme geri aramalarını almaktır.
tıkanıklık penceresi güncellendi. Bir sonraki kod parçası, karşılık gelen kodu uygular.
iz lavabo:

Statik boşluk
CwndChange (uint32_t eskiCwnd, uint32_t yeniCwnd)
{
NS_LOG_UNCOND (Simulator::Now ().GetSeconds () << "\t" << newCwnd);
}

Bu şimdi size çok tanıdık geliyor, bu yüzden ayrıntılar üzerinde durmayacağız. Bu işlev
her seferinde mevcut simülasyon zamanını ve tıkanıklık penceresinin yeni değerini kaydeder.
zaman değiştirilir. Muhtemelen ortaya çıkan çıktıyı yükleyebileceğinizi hayal edebilirsiniz.
bir grafik programına (gnuplot veya Excel) girin ve hemen
zaman içinde tıkanıklık penceresi davranışı.

Paketlerin nereye bırakıldığını göstermek için yeni bir izleme havuzu ekledik. Bir hata ekleyeceğiz
bu kodu da modelledik, bu yüzden bu çalışmayı göstermek istedik.

Statik boşluk
RxDrop (Ptr p)
{
NS_LOG_UNCOND ("RxDrop at " << Simulator::Now ().GetSeconds ());
}

Bu izleme havuzu, noktadan noktaya "PhyRxDrop" izleme kaynağına bağlanacaktır.
NetCihaz. Bu izleme kaynağı, bir paketin fiziksel katmanı tarafından bir paket bırakıldığında tetiklenir.
NetCihaz. Kaynağa doğru küçük bir sapma yaparsanız
(src/noktadan noktaya/model/noktadan noktaya-net-device.cc) göreceksiniz ki bu iz
kaynak atıfta bulunur PointToPointNetDevice::m_phyRxDropTrace. o zaman içeri bakarsan
kaynak/noktadan noktaya/model/noktadan noktaya-net-device.h bu üye değişkeni için
olarak ilan edildiğini bulun TracedCallback paket> >. Bu sana söylemeli
geri arama hedefinin, void döndüren ve tek bir
parametre olan bir Ptr paket> (kullandığımızı varsayarsak Bağlam Olmadan Bağlan) -- sadece
yukarıda ne var.

Ana Programı
Aşağıdaki kod şimdiye kadar size çok aşina olmalıdır:

int
ana (int argc, char *argv[])
{
NodeContainer düğümleri;
düğümler.Oluştur (2);

PointToPointYardımcı pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Gecikme", StringValue ("2ms"));

NetDeviceContainer cihazları;
cihazlar = pointToPoint.Install (düğümler);

Bu, tıpkı şekilde gösterildiği gibi, aralarında noktadan noktaya bir kanal olan iki düğüm oluşturur.
Dosyanın başındaki resim.

Sonraki birkaç kod satırı yeni bir şey gösteriyor. davranan bir bağlantı izlersek
mükemmel bir şekilde, monoton olarak artan bir tıkanıklık penceresi ile karşılaşacağız. herhangi birini görmek için
ilginç davranış, paketleri bırakacak bağlantı hatalarını gerçekten tanıtmak istiyoruz,
yinelenen ACK'lere neden olur ve tıkanıklık penceresinin daha ilginç davranışlarını tetikler.

ns-3 sağlar HataModeli eklenebilir nesneler Kanallar. kullanıyoruz
OranHataModeli bu da bize hataları tanıtmamızı sağlar. Telegram Kanal belli bir oranları.

Ptr em = CreateObject ();
em->SetAttribute ("Hata Oranı", DoubleValue (0.00001));
device.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em));

Yukarıdaki kod, bir OranHataModeli Nesne ve "ErrorRate" ayarını yapıyoruz özellik
istenilen değere Daha sonra ortaya çıkan örneği ayarladık OranHataModeli hata olarak
noktadan noktaya tarafından kullanılan model NetCihaz. Bu bize bazı yeniden aktarımlar verecek ve
arsamızı biraz daha ilginç hale getirin.

InternetStackHelper yığını;
stack.Install (düğümler);

Ipv4AddressHelper adresi;
address.SetBase ("10.1.1.0", "255.255.255.252");
Ipv4InterfaceContainer arayüzleri = address.Assign (cihazlar);

Yukarıdaki kod aşina olmalıdır. İki düğümümüze internet yığınları kurar ve
arabirimler oluşturur ve noktadan noktaya cihazlar için IP adresleri atar.

TCP kullandığımız için, TCP'yi almak için hedef Düğümde bir şeye ihtiyacımız var.
bağlantılar ve veriler. bu PaketSink Uygulama yaygın olarak kullanılır ns-3 Bunun için
amaç.

uint16_t lavaboPort = 8080;
Adres lavaboAdresi (InetSocketAddress(interfaces.GetAddress (1), lavaboPort));
PacketSinkHelper packageSinkHelper ("ns3::TcpSocketFactory",
InetSocketAddress (Ipv4Address::GetAny (), sinkPort));
ApplicationContainer lavaboApps = packageSinkHelper.Install (nodes.Get (1));
sinkApps.Start (Saniye (0.));
sinkApps.Stop (Saniye (20.));

Şunlar dışında, bunların hepsi aşina olmalıdır:

PacketSinkHelper packageSinkHelper ("ns3::TcpSocketFactory",
InetSocketAddress (Ipv4Address::GetAny (), sinkPort));

Bu kod, bir PacketSinkYardımcısı ve sınıfı kullanarak yuvalar oluşturmasını söyler
ns3::TcpSocketFactory. Bu sınıf, "nesne fabrikası" adı verilen bir tasarım deseni uygular.
bir sistemde nesneler oluşturmak için kullanılan bir sınıfı belirtmek için yaygın olarak kullanılan bir mekanizmadır.
soyut yol. Burada, nesneleri kendileri oluşturmak yerine,
PacketSinkYardımcısı belirten bir dize TipKimliği bir nesne oluşturmak için kullanılan dize
daha sonra sırayla fabrika tarafından oluşturulan Nesnelerin örneklerini oluşturmak için kullanılabilir.

Kalan parametre şunları söyler: Uygulama hangi adres ve port olmalı bağlamak için.

Sonraki iki kod satırı soketi oluşturacak ve izleme kaynağını bağlayacaktır.

Ptr ns3TcpSocket = Socket::CreateSocket (nodes.Get (0),
TcpSocketFactory::GetTypeId());
ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindow",
MakeCallback (&CwndChange));

İlk ifade statik üye işlevini çağırır Soket::CreateSocket ve bir sağlar
Düğüm ve açık TipKimliği soketi oluşturmak için kullanılan nesne fabrikası için. Bu bir
aramadan biraz daha düşük seviyeli arama PacketSinkYardımcısı yukarıda arayın ve açık bir C++ kullanır
bir dize tarafından atıfta bulunulan yerine yazın. Aksi takdirde, kavramsal olarak aynıdır
şey.

bir kere TcpSocket Düğüme oluşturulur ve eklenir, kullanabiliriz
TraceConnectWithoutContext CongestionWindow izleme kaynağını izleme havuzumuza bağlamak için.

kodladığımızı hatırlayın. Uygulama yani bunu alabiliriz Soket az önce yaptık (sırasında
yapılandırma zamanı) ve simülasyon zamanında kullanın. Şimdi bunu somutlaştırmalıyız
Uygulama. Yönetmek için bir yardımcı oluşturmak için herhangi bir zahmete girmedik. Uygulama so
"manuel" olarak oluşturup kurmamız gerekecek. Bu aslında oldukça kolaydır:

Ptr uygulama = CreateObject ();
app->Kurulum (ns3TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps"));
nodes.Get (0)->AddApplication (uygulama);
app->Başlat (Saniye (1.));
app->Dur (Saniye (20.));

İlk satır bir nesne türü Uygulamam -- bizim Uygulama. İkinci satır anlatıyor
the Uygulama ne Soket kullanılacak, hangi adrese bağlanılacak, ne kadar veri gönderilecek
her bir gönderme olayı, kaç tane gönderme olayının oluşturulacağı ve verinin üretilme hızı
bu olaylardan.

Ardından, manuel olarak ekliyoruz Uygulamam Uygulama kaynak Düğüme ve açıkça çağırın
Ana Sayfa ve dur üzerindeki yöntemler Uygulama ne zaman başlayacağını ve ne zaman duracağını söylemek için
şey.

Bağlantıyı aslında alıcıdan noktadan noktaya yapmamız gerekiyor. NetCihaz olay düşürme
için bizim RxBırak şimdi geri ara.

cihazlar. Get (1)->TraceConnectWithoutContext("PhyRxDrop", MakeCallback (&RxDrop));

Şimdi alıcıya bir referans aldığımız açık olmalıdır. Düğüm NetCihaz
kabından ve üzerinde "PhyRxDrop" özniteliği tarafından tanımlanan izleme kaynağının bağlanması
o cihaz iz havuzuna RxBırak.

Son olarak, simülatöre herhangi bir şeyi geçersiz kılmasını söyleriz. Uygulamalar ve sadece işlemeyi durdur
Simülasyona 20 saniyede olaylar.

Simülatör::Dur (saniye(20));
Simülatör::Çalıştır ();
Simülatör::Yok Et ();

0 dönmek;
}

Bir an önce hatırla Simülatör::Çalıştır çağrılır, yapılandırma süresi biter ve simülasyon
zaman başlar. Oluşturarak düzenlediğimiz tüm çalışmalar Uygulama ve onu öğretmek
nasıl bağlanılacağı ve verilerin nasıl gönderileceği bu işlev çağrısı sırasında gerçekleşir.

En kısa sürede Simülatör::Çalıştır döner, simülasyon tamamlandı ve sökme işlemine giriyoruz
evre. Bu durumda, Simülatör::Yok Et kanlı ayrıntılarla ilgilenir ve biz sadece geri döneriz
tamamlandıktan sonra bir başarı kodu.

Koşu beşinci.cc
Dosyayı sağladığımız için beşinci.cc sizin için, eğer dağıtımınızı kurduysanız (içinde
kullandığından beri hata ayıklama modu NS_LOG -- optimize edilmiş yapıların optimize edildiğini hatırlayın NS_LOG) o
koşmanızı bekliyor olacak.

$ ./waf --beşinci çalıştırın
Waf: `/home/craigdo/repos/ns-3-allinone-dev/ns-3-dev/build' dizinine giriliyor
Waf: `/home/craigdo/repos/ns-3-allinone-dev/ns-3-dev/build' dizininden çıkılıyor
'inşa' başarıyla tamamlandı (0.684s)
1 536
1.0093 1072
1.01528 1608
1.02167 2144
Kendi ID’n ile mağazalarını oluştur
1.11319 8040
1.12151 8576
1.12983 9112
1.13696'da RxDrop
Kendi ID’n ile mağazalarını oluştur

İzlerinizde herhangi bir türde baskı kullanmanın bir dezavantajını hemen görebilirsiniz.
Tüm ilginç bilgilerimizin üzerine basılmış bu gereksiz waf mesajlarını alıyoruz.
bu RxDrop mesajlarıyla. Bunu yakında çözeceğiz, ama eminim görmek için sabırsızlanıyorsunuz.
tüm bu çalışmaların sonuçları. Bu çıktıyı adlı bir dosyaya yönlendirelim. cwnd.dat:

$ ./waf --beşinci çalıştırın > cwnd.dat 2>&1

Şimdi favori düzenleyicinizde "cwnd.dat" dosyasını düzenleyin ve waf yapı durumunu kaldırın ve bırakın
satırlar, yalnızca izlenen verileri bırakarak (ayrıca
TraceConnectWithoutContext("PhyRxDrop", Geri Arama Yap (&RxDrop)); kurtulmak için komut dosyasında
damla baskılar kadar kolay.

Artık gnuplot'u çalıştırabilir (eğer yüklediyseniz) ve ona güzel şeyler üretmesini söyleyebilirsiniz.
resimler:

$ gnuplot
gnuplot> terminali ayarla png boyutu 640,480
gnuplot> "cwnd.png" çıktısını ayarla
gnuplot> "cwnd.dat" dosyasını 1:2 başlığını 'Congestion Window' çizgi noktalarıyla kullanarak çizin
gnuplot> çıkış

Artık, dosyada oturma süresine karşı tıkanıklık penceresinin bir grafiğine sahip olmalısınız.
"cwnd.png" yükleme = "tembel" şuna benzer:
[resim]

kullanma Orta seviye Yardımcılar
Bir önceki bölümde, bir iz kaynağının nasıl bağlanacağını ve umut verici bir şekilde nasıl elde edileceğini gösterdik.
bir simülasyondan ilginç bilgiler. belki aradığımızı hatırlarsın
kullanarak standart çıktıya giriş standart::cout bundan çok daha önce bir "kör alet"
bölüm. Günlük çıktısını sırayla ayrıştırmanın nasıl bir sorun olduğunu da yazdık.
ilginç bilgileri izole etmek için. Çok fazla harcadığımız aklına gelmiş olabilir.
Düzeltmeyi iddia ettiğimiz tüm sorunları sergileyen bir örnek uygulama zamanı
the ns-3 takip sistemi! Doğru olurdun. Ama bize katlan. Henüz işimiz bitmedi.

Yapmak istediğimiz en önemli şeylerden biri, kolayca yapabilme yeteneğine sahip olmaktır.
simülasyondan çıkan çıktı miktarını kontrol etmek; ve biz de onları kurtarmak istiyoruz
verileri bir dosyaya aktarır, böylece daha sonra tekrar başvurabiliriz. Orta seviye izleme yardımcılarını kullanabiliriz
Sağlanan ns-3 sadece bunu yapmak ve resmi tamamlamak için.

Örnekte geliştirilen cwnd change ve drop olaylarını yazan bir komut dosyası sağlıyoruz
beşinci.cc ayrı dosyalarda diske. cwnd değişiklikleri sekmeyle ayrılmış bir ASCII olarak saklanır
dosyası ve bırakma olayları bir PCAP dosyasında saklanır. Bunu sağlamak için yapılan değişiklikler
oldukça küçük.

İzlenecek yol: altıncı.cc
Şimdi gitmek için gerekli değişikliklere bir göz atalım beşinci.cc için altıncı.cc. Açık
örnekler/öğretici/sixth.cc en sevdiğiniz düzenleyicide. İlk değişikliği şuradan görebilirsiniz:
CwndChange aranıyor. İz için imzaları değiştirdiğimizi göreceksiniz.
havuzlar ve izlenen bilgileri bir havuza yazan her havuza tek bir satır ekledik
bir dosyayı temsil eden akış.

Statik boşluk
CwndChange (Ptr akış, uint32_t eskiCwnd, uint32_t yeniCwnd)
{
NS_LOG_UNCOND (Simulator::Now ().GetSeconds () << "\t" << newCwnd);
*stream->GetStream () << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;
}

Statik boşluk
RxDrop (Ptr dosya, Ptr p)
{
NS_LOG_UNCOND ("RxDrop at " << Simulator::Now ().GetSeconds ());
dosya->Yaz(Simulator::Now(), p);
}

Bir "stream" parametresi ekledik. CwndDeğiştir iz lavabosu. Bu bir nesne ki
bir C++ çıktı akışını tutar (güvenli bir şekilde canlı tutar). Görünüşe göre bu çok basit
nesne, ancak akış için yaşam boyu sorunları yöneten ve hatta bir sorunu çözen bir
deneyimli C++ kullanıcıları karşılaşır. Görünüşe göre kopya yapıcısı için standart::ostream
özel olarak işaretlenir. Bunun anlamı şudur ki standart::ostreams değer semantiğine uyma ve yapamam
akışın kopyalanmasını gerektiren herhangi bir mekanizmada kullanılabilir. Bu şunları içerir: ns-3
Hatırlayabileceğiniz gibi, değer semantiğine uyan nesneler gerektiren geri arama sistemi.
Ek olarak, aşağıdaki satırı eklediğimize dikkat edin: CwndDeğiştir iz havuzu
uygulama:

*stream->GetStream () << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;

Değiştirirseniz bu çok tanıdık bir kod olurdu *stream->GetStream () ile standart::cout, gibi
içinde:

std::cout << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;

Bu göstermektedir ki, Ptr gerçekten sadece bir
standart::akış sizin için ve burada diğer çıktı akışları gibi kullanabilirsiniz.

Benzer bir durum şurada da oluyor RxBırak etrafta dolaşan nesnenin (a
Ptr) bir PCAP dosyasını temsil eder. İz havuzunda tek bir astar var.
PCAP dosyasına bırakılan paketin içeriğini ve zaman damgasını yazın:

dosya->Yaz(Simulator::Now(), p);

Elbette, iki dosyayı temsil eden nesnelerimiz varsa, onları bir yerde oluşturmamız gerekir.
ve ayrıca iz havuzlarına geçmesine neden olur. içinde bakarsanız ana fonksiyonu,
sadece bunu yapmak için yeni kod bulacaksınız:

AsciiTraceHelper asciiTraceHelper;
Ptr akış = asciiTraceHelper.CreateFileStream ("sixth.cwnd");
ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindow", MakeBoundCallback (&CwndChange, akış));

Kendi ID’n ile mağazalarını oluştur

PcapHelper pcapHelper;
Ptr dosya = pcapHelper.CreateFile ("sixth.pcap", std::ios::out, PcapHelper::DLT_PPP);
cihazlar. Get (1)->TraceConnectWithoutContext("PhyRxDrop", MakeBoundCallback (&RxDrop, dosya));

Yukarıdaki kod parçacığının ilk bölümünde ASCII izleme dosyasını oluşturuyoruz,
onu yönetmekten ve geri aramanın bir varyantını kullanmaktan sorumlu bir nesne oluşturmak
lavaboya geçirilecek nesneyi düzenlemek için oluşturma işlevi. ASCII izimiz
yardımcılar, metin (ASCII) dosyalarının kullanımını kolaylaştırmak için zengin bir dizi işlev sağlar. Biz
sadece burada dosya akışı oluşturma işlevinin kullanımını göstereceğim.

The Dosya Akışı Oluştur işlev temelde bir örneği başlatacak standart::akış nesne ve
yeni bir dosya oluşturun (veya mevcut bir dosyayı kısaltın). Bu standart::akış bir paket içinde
ns-3 ömür boyu yönetim için nesne ve kopya oluşturucu sorunu çözümü.

sonra bunu alıyoruz ns-3 dosyayı temsil eden nesne ve onu iletin MakeBoundCallback().
Bu işlev tıpkı aşağıdaki gibi bir geri arama oluşturur. Geri Arama Yap(), ancak yeni bir değeri "bağlar"
geri arama. Bu değer, geri çağırmadan önce ilk argüman olarak eklenir.
aranan.

Esasen, MakeBoundCallback(&CwndChange, aktarım) izleme kaynağının eklemesine neden olur
çağırmadan önce resmi parametre listesinin önüne ek "akım" parametresi
geri arama. Bu, gerekli imzayı değiştirir CwndDeğiştir biriyle eşleştirmek için lavabo
"ekstra" parametreyi içeren yukarıda gösterilen Ptr dere.

Yukarıdaki snippet'teki kodun ikinci bölümünde, bir PcapYardımcısı yapmak için
ile yaptığımız PCAP izleme dosyamız için aynı şey AsciiTraceHelper. çizgi
kod,

Ptr dosya = pcapHelper.CreateFile ("altıncı.pcap",
"w", PcapHelper::DLT_PPP);

"w" dosya moduyla "sixth.pcap" adlı bir PCAP dosyası oluşturur. Bu, yeni dosyanın
bu ada sahip mevcut bir dosya bulunursa kesilir (içerik silinir). Son
parametre, yeni PCAP dosyasının "veri bağlantı türü"dür. Bunlar PCAP ile aynı
içinde tanımlanan kitaplık veri bağlantısı türleri bpf.h PCAP ile aşina iseniz. Bu durumda,
DLT_PPP PCAP dosyasının point to ile ön ekli paketleri içereceğini gösterir.
nokta başlıkları. Paketler noktadan noktaya cihazımızdan geldiği için bu doğrudur.
sürücü. Diğer yaygın veri bağlantısı türleri, csma için uygun DLT_EN10MB (10 MB Ethernet)'dir.
cihazlar ve wifi cihazları için uygun DLT_IEEE802_11 (IEEE 802.11). Bunlar tanımlanmış
in src/ağ/yardımcı/trace-helper.h listeyi görmekle ilgileniyorsanız. bu
listedeki girişler, içindekilerle eşleşir bpf.h ancak bir PCAP kaynağından kaçınmak için onları çoğaltıyoruz
bağımlılık.

A ns-3 PCAP dosyasını temsil eden nesne, Dosya oluştur ve bir sınırda kullanılır
tam olarak ASCII durumunda olduğu gibi geri arama.

Önemli bir sapma: Bu nesnelerin her ikisi de
çok benzer şekillerde ilan

Ptr dosya ...
Ptr aktarım ...

Altta yatan nesneler tamamen farklıdır. Örneğin, Ptr bir
akıllı işaretçi ns-3 Destekleyen oldukça ağır bir şey olan nesne
Nitelikler ve Config sistemine entegre edilmiştir. bu Ptr, Üzerinde
diğer yandan, çok hafif bir referans sayılan nesneye akıllı bir işaretçidir.
şey. Herhangi bir varsayımda bulunmadan önce atıfta bulunduğunuz nesneye bakmayı unutmayın.
o nesnenin sahip olabileceği "güçler" hakkında.

Örneğin, bir göz atın src/ağ/utils/pcap-file-wrapper.h dağıtımda ve
fark etme,

sınıf PcapFileWrapper: genel Nesne

o sınıf PcapFileWrapper bir ns-3 Mirası nedeniyle nesne. sonra bak
src/ağ/model/output-stream-wrapper.h ve dikkat,

class OutputStreamWrapper : genel
SimpleRefCount

bu nesnenin bir ns-3 Nesne, "sadece" bir C++ nesnesidir.
müdahaleci referans sayımını destekler.

Buradaki nokta, sadece okuduğun için Ptr mutlaka anlamına gelmez
o bir şey bir ns-3 Üzerine asabileceğiniz nesne ns-3 Nitelikler, örneğin.

Şimdi örneğe dönelim. Bu örneği oluşturup çalıştırırsanız,

$ ./waf -- altıncı çalıştırma

"beşinci" koştuğunuzdakiyle aynı mesajları göreceksiniz, ancak iki yeni dosya
cihazınızın en üst düzey dizininde görünün ns-3 dağılımı.

altıncı.cwnd altıncı.pcap

"sixth.cwnd" bir ASCII metin dosyası olduğundan, onu kedi veya en sevdiğiniz dosya
görüntüleyici.

+1 0 536
+1.0093 536 1072
+1.01528 1072 1608
+1.02167 1608 2144
Kendi ID’n ile mağazalarını oluştur
+9.69256 5149 5204
+9.89311 5204 5259

Zaman damgalı, sekmeyle ayrılmış bir dosyanız, eski bir tıkanıklık pencereniz ve yeni bir
doğrudan arsa programınıza aktarmaya uygun tıkanıklık penceresi. yok
dosyada gereksiz baskılar, ayrıştırma veya düzenleme gerekmez.

"sixth.pcap" bir PCAP dosyası olduğundan, onu tcp dökümü.

altıncı.pcap dosyasından okuma, bağlantı tipi PPP (PPP)
1.136956 IP 10.1.1.1.49153 > 10.1.1.2.8080: Bayraklar [.], seq 17177:17681, ack 1, win 32768, seçenekler [TS val 1133 ecr 1127,eol], uzunluk 504
1.403196 IP 10.1.1.1.49153 > 10.1.1.2.8080: Bayraklar [.], seq 33280:33784, ack 1, win 32768, seçenekler [TS val 1399 ecr 1394,eol], uzunluk 504
Kendi ID’n ile mağazalarını oluştur
7.426220 IP 10.1.1.1.49153 > 10.1.1.2.8080: Bayraklar [.], seq 785704:786240, ack 1, win 32768, seçenekler [TS val 7423 ecr 7421,eol], uzunluk 536
9.630693 IP 10.1.1.1.49153 > 10.1.1.2.8080: Bayraklar [.], seq 882688:883224, ack 1, win 32768, seçenekler [TS val 9620 ecr 9618,eol], uzunluk 536

Simülasyonda bırakılan paketleri içeren bir PCAP dosyanız var. yok
dosyada bulunan diğer paketler ve hayat oluşturacak başka hiçbir şey yok
zor.

Uzun bir yolculuk oldu ama artık kıymetini bilebildiğimiz bir noktadayız. ns-3
izleme sistemi. Önemli olayları bir TCP uygulamasının ortasından çıkardık
ve bir aygıt sürücüsü. Bu olayları doğrudan yaygın olarak bilinen dosyalarda kullanılabilecek dosyalarda sakladık.
aletler. Bunu, ilgili çekirdek kodlardan herhangi birini değiştirmeden yaptık ve bunu
sadece 18 satır kod:

Statik boşluk
CwndChange (Ptr akış, uint32_t eskiCwnd, uint32_t yeniCwnd)
{
NS_LOG_UNCOND (Simulator::Now ().GetSeconds () << "\t" << newCwnd);
*stream->GetStream () << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;
}

Kendi ID’n ile mağazalarını oluştur

AsciiTraceHelper asciiTraceHelper;
Ptr akış = asciiTraceHelper.CreateFileStream ("sixth.cwnd");
ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindow", MakeBoundCallback (&CwndChange, akış));

Kendi ID’n ile mağazalarını oluştur

Statik boşluk
RxDrop (Ptr dosya, Ptr p)
{
NS_LOG_UNCOND ("RxDrop at " << Simulator::Now ().GetSeconds ());
dosya->Yaz(Simulator::Now(), p);
}

Kendi ID’n ile mağazalarını oluştur

PcapHelper pcapHelper;
Ptr dosya = pcapHelper.CreateFile ("sixth.pcap", "w", PcapHelper::DLT_PPP);
cihazlar. Get (1)->TraceConnectWithoutContext("PhyRxDrop", MakeBoundCallback (&RxDrop, dosya));

Iz Yardımcılar
The ns-3 izleme yardımcıları, farklı yapılandırma ve seçim için zengin bir ortam sağlar.
olayları izleme ve bunları dosyalara yazma. Daha önceki bölümlerde, öncelikle
BuildingTopology'de, tasarlanan iz yardımcı yöntemlerinin birkaç çeşidini gördük.
diğer (aygıt) yardımcılarının içinde kullanım için.

Belki bu varyasyonlardan bazılarını gördüğünüzü hatırlayacaksınız:

pointToPoint.EnablePcapAll ("ikinci");
pointToPoint.EnablePcap ("saniye", p2pNodes.Get (0)->GetId (), 0);
csma.EnablePcap ("üçüncü", csmaDevices.Get (0), true);
pointToPoint.EnableAsciiAll (ascii.CreateFileStream ("myfirst.tr"));

Yine de bariz olmayan şey, tüm bunlar için tutarlı bir model olduğudur.
sistemde bulunan iz ile ilgili yöntemler. Şimdi biraz zaman ayırıp bir göz atacağız
"büyük resimde".

Şu anda izleme yardımcılarının iki birincil kullanım durumu vardır: ns-3: cihaz yardımcıları
ve protokol yardımcıları. Cihaz yardımcıları, hangi izlerin belirlenmesi sorununa bakar
(düğüm, cihaz) çifti aracılığıyla etkinleştirilmelidir. Örneğin, belirtmek isteyebilirsiniz
PCAP izlemenin belirli bir düğümdeki belirli bir cihazda etkinleştirilmesi gerekir. Bu
şuradan takip eder ns-3 cihaz kavramsal modeli ve ayrıca kavramsal modeller
çeşitli cihaz yardımcıları. Doğal olarak bundan sonra, oluşturulan dosyalar bir
- - adlandırma kuralı.

Protokol yardımcıları, hangi izlemelerin etkinleştirilmesi gerektiğini belirleme sorununa bakar.
bir protokol ve arayüz çifti. Bu, aşağıdakilerden ns-3 protokol yığını kavramsal
modeli ve ayrıca internet yığın yardımcılarının kavramsal modelleri. Doğal olarak iz
dosyalar bir takip etmelidir - - adlandırma kuralı.

İz yardımcıları bu nedenle doğal olarak iki boyutlu bir sınıflandırmaya girer. Var
dört sınıfın hepsinin aynı şekilde davranmasını engelleyen incelikler, ancak biz
hepsinin mümkün olduğunca benzer şekilde çalışmasını sağlayın; ve mümkün olduğunda analogları vardır
tüm sınıflardaki tüm yöntemler.

┌─────────────────────┬───────┐
│ │ PCAP │ ASCII │
└─────────────────────────────┘

│Aygıt Yardımcısı │ │ │
├─────────────────────────────┤
│Protokol Yardımcısı │ │ │
└─────────────────────────────┘

adı verilen bir yaklaşım kullanıyoruz. mixin yardımcı sınıflarımıza izleme işlevi eklemek için. A
mixin bir alt sınıf tarafından miras alındığında işlevsellik sağlayan bir sınıftır.
Bir karışımdan miras almak bir uzmanlık biçimi olarak kabul edilmez, ancak gerçekten bir
işlevselliği toplayın.

Bu dört vakanın tümüne ve bunların ilgililerine hızlıca bir göz atalım. Katmalar.

cihaz Yardımcılar
PCAP
Bu yardımcıların amacı, tutarlı bir PCAP izleme tesisi eklemeyi kolaylaştırmaktır.
ns-3 cihaz. PCAP izlemenin çeşitli özelliklerinin hepsinin aynı şekilde çalışmasını istiyoruz.
tüm cihazlar, bu nedenle bu yardımcıların yöntemleri, cihaz yardımcıları tarafından devralınır. Bir göz at
at src/ağ/yardımcı/trace-helper.h bakarken tartışmayı takip etmek istiyorsanız
gerçek kod.

Sınıf PcapHelperForDevice bir mixin kullanmak için üst düzey işlevsellik sağlar
PCAP izleme bir ns-3 cihaz. Her cihaz tek bir sanal yöntem uygulamalıdır
bu sınıftan miras alınır.

sanal boşluk EnablePcapInternal (std::string öneki, Ptr nd, bool karışık, bool açıkDosyaadı) = 0;

Bu yöntemin imzası, bu durumda durumun cihaz merkezli görünümünü yansıtır.
seviye. Sınıftan miras alınan tüm genel yöntemler PcapUserHelperForDevice azaltmak
bu tek cihaza bağlı uygulama yöntemini çağırmak. Örneğin, en düşük seviye
PCAP yöntemi,

void EnablePcap (std::string öneki, Ptr nd, bool karışık = yanlış, bool açıkDosyaadı = yanlış);

cihaz uygulamasını arayacak EnablePcapDahili direkt olarak. Diğer tüm genel PCAP
ek kullanıcı düzeyi sağlamak için bu uygulama üzerine inşa edilen izleme yöntemleri
işlevsellik. Bunun kullanıcı için anlamı, sistemdeki tüm cihaz yardımcılarının
tüm PCAP izleme yöntemlerine sahip olmak; ve bu yöntemlerin hepsi aynı şekilde çalışacak
cihaz uygularsa cihazlar arasında yol EnablePcapDahili doğru şekilde.

Yöntemler
void EnablePcap (std::string öneki, Ptr nd, bool karışık = yanlış, bool açıkDosyaadı = yanlış);
void EnablePcap (std::string öneki, std::string ndName, bool karışık = false, bool exclusiveFilename = false);
void EnablePcap (std::string öneki, NetDeviceContainer d, bool karışık = yanlış);
void EnablePcap (std::string öneki, NodeContainer n, bool karışık = yanlış);
void EnablePcap (std::string öneki, uint32_t nodeid, uint32_t deviceid, bool karışık = yanlış);
void EnablePcapAll (std::string öneki, bool karışık = yanlış);

Yukarıda gösterilen yöntemlerin her birinde, adında bir varsayılan parametre vardır. karışık o
varsayılan yanlış. Bu parametre, izlemenin içinde toplanmaması gerektiğini gösterir.
karışık mod. İzlerinizin cihaz tarafından görülen tüm trafiği içermesini istiyorsanız
(ve cihaz karışık modu destekliyorsa) herhangi birine gerçek bir parametre eklemeniz yeterlidir.
yukarıda aramalar. Örneğin,

Ptr nd;
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcap ("ön ek", nd, doğru);

üzerinde rastgele mod yakalamalarını etkinleştirecek NetCihaz tarafından belirtilen nd.

İlk iki yöntem ayrıca açıkDosyaadı olur mu
aşağıda tartışılacaktır.

Sınıf için API Belgelerini incelemeniz önerilir. PcapHelperForDevice bulmak için
bu yöntemlerin detayları; ama özetlemek gerekirse...

· Belirli bir düğüm/ağ-aygıtı çiftinde PCAP izlemeyi etkinleştirebilirsiniz.
Ptr Bir için Pcap'ı Etkinleştir yöntem. Ptr net cihazdan beri örtük
tam olarak bir Düğüme ait olmalıdır. Örneğin,

Ptr nd;
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcap ("ön ek", nd);

· Belirli bir düğüm/ağ-aygıtı çiftinde PCAP izlemeyi etkinleştirebilirsiniz.
standart::dize bir nesne adı hizmet dizesini temsil eden bir Pcap'ı Etkinleştir yöntem.
Ptr isim dizgisinden aranır. Yine, beri örtük
adlandırılmış ağ aygıtı tam olarak bir Node.js'ye ait olmalıdır. Örneğin,

İsimler::Add ("sunucu" ...);
İsimler::Add ("sunucu/eth0" ...);
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcap ("ön ek", "sunucu/ath0");

· Bir düğüm/ağ-cihaz çiftleri koleksiyonunda PCAP izlemeyi etkinleştirebilirsiniz.
NetCihazKonteyner. Her biri için NetCihaz kapta tür kontrol edilir. Her biri için
uygun türde aygıt (aygıt yardımcısı tarafından yönetilenle aynı tür), izleme
etkinleştirilmiş. Yine, bulunan ağ aygıtının ait olması gerektiğinden örtüktür.
tam olarak bir Düğüm. Örneğin,

NetDeviceContainer d = ...;
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcap ("ön ek", d);

· Bir düğüm/ağ-cihaz çiftleri koleksiyonunda PCAP izlemeyi etkinleştirebilirsiniz.
DüğümKonteyner. içindeki her bir Düğüm için DüğümKonteyner bağlı NetCihazlar yinelenir.
Her biri için NetCihaz kapsayıcıdaki her Düğüme bağlıysa, o aygıtın türü
kontrol. Uygun tipteki her cihaz için (cihaz tarafından yönetilenle aynı tip
yardımcı), izleme etkinleştirilir.

NodeContainer n;
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcap ("ön ek", n);

· PCAP izlemeyi Düğüm Kimliği ve cihaz kimliği bazında ve ayrıca aşağıdakilerle etkinleştirebilirsiniz:
açık ptr. Sistemdeki her Düğümün bir tamsayı Düğüm Kimliği vardır ve bağlı her cihaz
bir Düğüme bir tamsayı cihaz kimliğine sahiptir.

helper.EnablePcap ("ön ek", 21, 1);

· Son olarak, sistemdeki tüm cihazlar için aynı tipte PCAP izlemeyi etkinleştirebilirsiniz.
aygıt yardımcısı tarafından yönetilen gibi.

helper.EnablePcapAll ("ön ek");

Dosya adları
Yukarıdaki yöntem açıklamalarında örtük olarak, tam bir dosya adının oluşturulmasıdır.
uygulama yöntemi. Konvansiyonel olarak, PCAP ns-3 sistem şeklindedir
- kimlik>- id>.pcap

Daha önce belirtildiği gibi, sistemdeki her Düğüm, sistem tarafından atanan bir Düğüm kimliğine sahip olacaktır; ve
her cihazın kendi düğümüne göre bir arayüz indeksi (aynı zamanda cihaz kimliği olarak da adlandırılır) olacaktır.
Varsayılan olarak, o zaman, ilkinde izlemeyi etkinleştirmenin bir sonucu olarak oluşturulan bir PCAP izleme dosyası
"Önek" önekini kullanan Düğüm 21'in aygıtı önek-21-1.pcap.

her zaman kullanabilirsiniz ns-3 Bunu daha net hale getirmek için nesne adı hizmeti. örneğin, eğer
"sunucu" adını Düğüm 21'e atamak için nesne adı hizmetini kullanırsınız, sonuçta ortaya çıkan PCAP
izleme dosyası adı otomatik olarak olur, önek-sunucu-1.pcap ve ayrıca atarsanız
cihaza "eth0" adını verirseniz, PCAP dosya adınız bunu otomatik olarak alır ve
denilen önek-sunucu-eth0.pcap.

Son olarak, yukarıda gösterilen yöntemlerden ikisi,

void EnablePcap (std::string öneki, Ptr nd, bool karışık = yanlış, bool açıkDosyaadı = yanlış);
void EnablePcap (std::string öneki, std::string ndName, bool karışık = false, bool exclusiveFilename = false);

adında varsayılan bir parametre var açıkDosyaadı. true olarak ayarlandığında, bu parametre
otomatik dosya adı tamamlama mekanizmasını devre dışı bırakır ve açık bir dosya adı oluşturmanıza izin verir.
dosya adı. Bu seçenek, yalnızca bir bilgisayarda PCAP izlemeyi etkinleştiren yöntemlerde mevcuttur.
tek cihaz.

Örneğin, bir aygıt yardımcısının tek bir rastgele PCAP oluşturmasını sağlamak için
belirli bir ismin yakalama dosyası benim-pcap-dosyam.pcap belirli bir cihazda şunlar yapılabilir:

Ptr nd;
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcap ("my-pcap-file.pcap", nd, true, true);

İlk gerçek parametre rastgele mod izlerini etkinleştirir ve ikincisi yardımcıya söyler
yorumlamak önek parametreyi tam bir dosya adı olarak değiştirin.

ASCII
ASCII izleme yardımcısı davranışı mixin PCAP sürümüne büyük ölçüde benzer.
Bakmak src/ağ/yardımcı/trace-helper.h tartışmayı takip etmek istersen
gerçek koda bakarken.

Sınıf AsciiTraceHelperForDevice ASCII kullanımı için üst düzey işlevsellik ekler
bir cihaz yardımcı sınıfına kadar izleme. PCAP durumunda olduğu gibi, her cihaz bir uygulama yapmalıdır.
ASCII izinden devralınan tek sanal yöntem mixin.

sanal boşluk EnableAsciiInternal (Ptr aktarım,
std::string öneki,
Ptr nd,
bool açıkDosyaadı) = 0;

Bu yöntemin imzası, bu durumda durumun cihaz merkezli görünümünü yansıtır.
seviye; ve ayrıca yardımcının paylaşılan bir çıktı akışına yazıyor olabileceği gerçeği. Hepsi
sınıftan miras alınan genel ASCII izlemeyle ilgili yöntemler AsciiTraceHelperForDevice
bu tek cihaza bağlı uygulama yöntemini çağırmayı azaltın. Örneğin,
en düşük seviye ascii izleme yöntemleri,

void EnableAscii (std::string öneki, Ptr nd, bool açıkDosyaadı = yanlış);
void EnableAscii (Ptr akış, Ptr nd);

cihaz uygulamasını arayacak AsciiInternal'ı Etkinleştir doğrudan, ya bir
geçerli önek veya akış. Diğer tüm genel ASCII izleme yöntemleri bunlar üzerine inşa edilecektir.
ek kullanıcı düzeyinde işlevsellik sağlamak için düşük düzeyli işlevler. Bu ne anlama geliyor
kullanıcı, sistemdeki tüm cihaz yardımcılarının tüm ASCII izleme yöntemlerine sahip olacağıdır.
mevcut; ve bu yöntemlerin tümü, cihazlar arasında aynı şekilde çalışır.
uygulamak EnableAsciiInternal doğru şekilde.

Yöntemler
void EnableAscii (std::string öneki, Ptr nd, bool açıkDosyaadı = yanlış);
void EnableAscii (Ptr akış, Ptr nd);

void EnableAscii (std::string öneki, std::string ndName, bool exclusiveFilename = false);
void EnableAscii (Ptr akış, std::string ndName);

void EnableAscii (std::string öneki, NetDeviceContainer d);
void EnableAscii (Ptr akış, NetDeviceContainer d);

void EnableAscii (std::string öneki, NodeContainer n);
void EnableAscii (Ptr akış, NodeContainer n);

void EnableAsciiAll (std::string öneki);
void EnableAsciiAll (Ptr aktarım);

void EnableAscii (std::string öneki, uint32_t düğüm kimliği, uint32_t aygıt kimliği, bool açıkDosyaadı);
void EnableAscii (Ptr akış, uint32_t düğüm kimliği, uint32_t aygıt kimliği);

Sınıf için API Belgelerini incelemeniz önerilir. AsciiTraceHelperForDevice için
bu yöntemlerin ayrıntılarını bulun; ama özetlemek gerekirse...

· ASCII izleme için PCAP için kullanılan yöntemlerden iki kat daha fazla yöntem vardır
izleme. Bunun nedeni, her birinden izlerin olduğu PCAP tarzı modele ek olarak,
benzersiz düğüm/aygıt çifti benzersiz bir dosyaya yazılırsa, izlemenin izlendiği bir modeli destekliyoruz.
birçok düğüm/aygıt çifti için bilgiler ortak bir dosyaya yazılır. Bunun anlamı şudur:
- - dosya adı oluşturma mekanizması bir mekanizma ile değiştirilir
ortak bir dosyaya bakın; ve tüm API yöntemlerine izin vermek için API yöntemlerinin sayısı iki katına çıkar.
kombinasyonları.

· PCAP izlemede olduğu gibi, belirli bir (düğüm, ağ aygıtı) üzerinde ASCII izlemeyi etkinleştirebilirsiniz.
sağlayarak eşleştirin Ptr Bir için Ascii'yi Etkinleştir yöntem. Ptr örtük
çünkü net cihaz tam olarak bir Node.js'ye ait olmalıdır. Örneğin,

Ptr nd;
Kendi ID’n ile mağazalarını oluştur
helper.EnableAscii ("ön ek", nd);

· İlk dört yöntem aynı zamanda açıkDosyaadı o
PCAP durumundaki eşdeğer parametrelere benzer şekilde çalışır.

Bu durumda, ASCII izleme dosyasına hiçbir izleme bağlamı yazılmaz çünkü bunlar
gereksiz. Sistem, aynı kurallar kullanılarak oluşturulacak dosya adını seçecektir.
Dosyanın son ekine sahip olması dışında, PCAP bölümünde açıklanan tr yerine
.pcap.

· Birden fazla ağ cihazında ASCII izlemeyi etkinleştirmek ve tüm izlemelerin gönderilmesini istiyorsanız
tek bir dosyaya, bunu tek bir dosyaya atıfta bulunmak için bir nesne kullanarak da yapabilirsiniz.
Bunu yukarıdaki "cwnd" örneğinde zaten görmüştük:

Ptr nd1;
Ptr nd2;
Kendi ID’n ile mağazalarını oluştur
Ptr stream = asciiTraceHelper.CreateFileStream ("izleme-dosya-adı.tr");
Kendi ID’n ile mağazalarını oluştur
helper.EnableAscii (akış, nd1);
helper.EnableAscii (akış, nd2);

Bu durumda, izleme bağlamları vardır gerektiğinden ASCII izleme dosyasına yazılır
izleri iki cihazdan ayırmak için. Kullanıcı tamamen
dosya adını belirterek, dize şunları içermelidir tr tutarlılık için son ek.

· Belirli bir (düğüm, ağ aygıtı) çifti üzerinde ASCII izlemeyi etkinleştirebilirsiniz.
standart::dize bir nesne adı hizmet dizesini temsil eden bir Pcap'ı Etkinleştir yöntem.
Ptr isim dizgisinden aranır. Yine, beri örtük
adlandırılmış ağ aygıtı tam olarak bir Node.js'ye ait olmalıdır. Örneğin,

İsimler::Add ("istemci" ...);
İsimler::Add ("istemci/eth0" ...);
İsimler::Add ("sunucu" ...);
İsimler::Add ("sunucu/eth0" ...);
Kendi ID’n ile mağazalarını oluştur
helper.EnableAscii ("ön ek", "istemci/eth0");
helper.EnableAscii ("ön ek", "sunucu/eth0");

Bu, ``prefix-client-eth0.tr`` adlı iki dosyayla sonuçlanır ve
``prefix-server-eth0.tr`` içindeki her cihaz için izlemeler
ilgili izleme dosyası. ``EnableAscii`` işlevlerinin tümü
bir akış sarmalayıcı almak için aşırı yüklenmişse, bu formu şu şekilde kullanabilirsiniz:
kuyu::

İsimler::Add ("istemci" ...);
İsimler::Add ("istemci/eth0" ...);
İsimler::Add ("sunucu" ...);
İsimler::Add ("sunucu/eth0" ...);
Kendi ID’n ile mağazalarını oluştur
Ptr stream = asciiTraceHelper.CreateFileStream ("izleme-dosya-adı.tr");
Kendi ID’n ile mağazalarını oluştur
helper.EnableAscii (akış, "istemci/eth0");
helper.EnableAscii (akış, "sunucu/eth0");

Bu, adı verilen tek bir izleme dosyasıyla sonuçlanır. iz-dosya-adı.tr hepsini içeren
her iki cihaz için izleme olayları. Olaylar, izleme bağlamı tarafından belirsizleştirilecektir.
Teller.

· Bir (düğüm, ağ aygıtı) çiftleri koleksiyonunda ASCII izlemeyi etkinleştirebilirsiniz.
NetCihazKonteyner. Her biri için NetCihaz kapta tür kontrol edilir. Her biri için
uygun türde aygıt (aygıt yardımcısı tarafından yönetilenle aynı tür), izleme
etkinleştirilmiş. Yine, bulunan ağ aygıtının ait olması gerektiğinden örtüktür.
tam olarak bir Düğüm. Örneğin,

NetDeviceContainer d = ...;
Kendi ID’n ile mağazalarını oluştur
helper.EnableAscii ("ön ek", d);

Bu, bir dizi ASCII izleme dosyasının oluşturulmasına neden olur,
her biri `` - - .tr``
Kongre.

Tüm izleri tek bir dosyada birleştirmek, örneklere benzer şekilde gerçekleştirilir.
yukarıda:

NetDeviceContainer d = ...;
Kendi ID’n ile mağazalarını oluştur
Ptr stream = asciiTraceHelper.CreateFileStream ("izleme-dosya-adı.tr");
Kendi ID’n ile mağazalarını oluştur
helper.EnableAscii (akış, d);

· Bir (düğüm, ağ aygıtı) çiftleri koleksiyonunda ASCII izlemeyi etkinleştirebilirsiniz.
DüğümKonteyner. içindeki her bir Düğüm için DüğümKonteyner bağlı NetCihazlar yinelenir.
Her biri için NetCihaz kapsayıcıdaki her Düğüme bağlıysa, o aygıtın türü
kontrol. Uygun tipteki her cihaz için (cihaz tarafından yönetilenle aynı tip
yardımcı), izleme etkinleştirilir.

NodeContainer n;
Kendi ID’n ile mağazalarını oluştur
helper.EnableAscii ("ön ek", n);

Bu, her biri aşağıdakileri izleyen bir dizi ASCII izleme dosyasının oluşturulmasına neden olur.
the - kimlik>- id>.tr ortak düşünce. Tüm izleri bir araya getirmek
tek dosya, yukarıdaki örneklere benzer şekilde gerçekleştirilir.

· PCAP izlemeyi Düğüm Kimliği ve cihaz kimliği bazında ve ayrıca aşağıdakilerle etkinleştirebilirsiniz:
açık ptr. Sistemdeki her Düğümün bir tamsayı Düğüm Kimliği vardır ve bağlı her cihaz
bir Düğüme bir tamsayı cihaz kimliğine sahiptir.

helper.EnableAscii ("ön ek", 21, 1);

Tabii ki, izler yukarıda gösterildiği gibi tek bir dosyada birleştirilebilir.

· Son olarak, sistemdeki tüm cihazlar için aynı tipte PCAP izlemeyi etkinleştirebilirsiniz.
aygıt yardımcısı tarafından yönetilen gibi.

helper.EnableAsciiAll ("ön ek");

Bu, her cihaz için bir tane olmak üzere bir dizi ASCII izleme dosyasının oluşturulmasına neden olur.
yardımcı tarafından yönetilen türdeki sistemde. Bu dosyaların tümü aşağıdakileri izleyecektir:
- kimlik>- id>.tr ortak düşünce. Tüm izleri tek bir yerde birleştirmek
dosyası, yukarıdaki örneklere benzer şekilde gerçekleştirilir.

Dosya adları
Yukarıdaki önek tarzı yöntem açıklamalarında örtük olarak, tam yapının inşası vardır.
uygulama yöntemine göre dosya adları. Konvansiyonel olarak, ASCII izler ns-3 sistem
formdalar - kimlik>- id>.tr

Daha önce belirtildiği gibi, sistemdeki her Düğüm, sistem tarafından atanan bir Düğüm kimliğine sahip olacaktır; ve
her cihazın kendi düğümüne göre bir arayüz indeksi (aynı zamanda cihaz kimliği olarak da adlandırılır) olacaktır.
Varsayılan olarak, ilk izlemede izlemeyi etkinleştirmenin bir sonucu olarak oluşturulan bir ASCII izleme dosyası
"Önek" önekini kullanan Düğüm 21'in aygıtı önek-21-1.tr.

her zaman kullanabilirsiniz ns-3 Bunu daha net hale getirmek için nesne adı hizmeti. örneğin, eğer
"sunucu" adını Düğüm 21'e atamak için nesne adı hizmetini kullanırsınız, sonuçta
ASCII izleme dosyası adı otomatik olarak, önek-sunucu-1.tr ve eğer sen de atarsan
cihaza "eth0" adını verirseniz, ASCII izleme dosya adınız bunu otomatik olarak alır
ve çağrılmak önek-sunucu-eth0.tr.

Yöntemlerin birçoğunun adı verilen varsayılan bir parametresi vardır. açıkDosyaadı. Olarak ayarlandığında
true, bu parametre otomatik dosya adı tamamlama mekanizmasını devre dışı bırakır ve
açık bir dosya adı oluşturmak için. Bu seçenek yalnızca bir
önek ve tek bir cihazda izlemeyi etkinleştirin.

Protokol Yardımcılar
PCAP
Bunların amacı Katmalar tutarlı bir PCAP izleme tesisi eklemeyi kolaylaştırmaktır.
protokoller. PCAP izlemenin çeşitli özelliklerinin hepsinin aynı şekilde çalışmasını istiyoruz.
protokoller, bu nedenle bu yardımcıların yöntemleri yığın yardımcıları tarafından miras alınır. Şuna baksana
src/ağ/yardımcı/trace-helper.h bakarken tartışmayı takip etmek istiyorsanız
gerçek kod.

Bu bölümde, protokole uygulanan yöntemleri göstereceğiz. iPv4. Karşı
benzer protokollerdeki izleri belirtin, sadece uygun türü değiştirin. Örneğin,
kullanın Ptr yerine Ptr ve Çağrı yap PcapIpv6'yı Etkinleştir yerine PcapIpv4'yı Etkinleştir.

Sınıf PcapHelperForIpv4 PCAP izlemeyi kullanmak için yüksek düzeyde işlevsellik sağlar
içinde iPv4 protokol. Bu yöntemleri etkinleştiren her protokol yardımcısı, tek bir
bu sınıftan miras alınan sanal yöntem. için ayrı bir uygulama yapılacaktır.
iPv6, örneğin, ancak tek fark yöntem adlarında ve imzalarda olacaktır.
Sınıfın belirsizliğini gidermek için farklı yöntem adları gerekir iPv4 itibaren iPv6 ikisi de
sınıftan türetilmiş nesne, ve aynı imzayı paylaşan yöntemler.

sanal boşluk EnablePcapIpv4Internal (std::string öneki,
Ptr ipv4,
uint32_t arayüzü,
bool açıkDosyaadı) = 0;

Bu yöntemin imzası, protokol ve arayüz merkezli görünümü yansıtır.
durum bu seviyede. Sınıftan miras alınan tüm genel yöntemler PcapHelperForIpv4
bu tek cihaza bağlı uygulama yöntemini çağırmayı azaltın. Örneğin,
en düşük seviye PCAP yöntemi,

void EnablePcapIpv4 (std::string öneki, Ptr ipv4, uint4_t arabirimi, bool açıkDosyaadı = yanlış);

cihaz uygulamasını arayacak EnablePcapIpv4Dahili direkt olarak. Diğer tüm kamu
PCAP izleme yöntemleri, ek kullanıcı düzeyi sağlamak için bu uygulama üzerine kuruludur.
işlevsellik. Bunun kullanıcı için anlamı, sistemdeki tüm protokol yardımcılarının
mevcut tüm PCAP izleme yöntemlerine sahip olacak; ve bu yöntemlerin tümü
yardımcı uygularsa protokoller arasında aynı şekilde EnablePcapIpv4Dahili doğru şekilde.

Yöntemler
Bu yöntemler, Düğüm ile bire bir yazışmada olacak şekilde tasarlanmıştır.
NetCihaz- cihaz versiyonlarının merkezi versiyonları. Düğüm yerine ve NetCihaz çift
kısıtlamalar, protokol ve arayüz kısıtlamaları kullanıyoruz.

Cihaz versiyonunda olduğu gibi altı yöntem olduğunu unutmayın:

void EnablePcapIpv4 (std::string öneki, Ptr ipv4, uint4_t arabirimi, bool açıkDosyaadı = yanlış);
void EnablePcapIpv4 (std::string öneki, std::string ipv4Name, uint32_t arabirimi, bool exclusiveFilename = false);
void EnablePcapIpv4 (std::string öneki, Ipv4InterfaceContainer c);
void EnablePcapIpv4 (std::string öneki, NodeContainer n);
void EnablePcapIpv4 (std::string öneki, uint32_t düğüm kimliği, uint32_t arabirimi, bool açıkDosyaadı);
void EnablePcapIpv4All (std::string öneki);

Sınıf için API Belgelerini incelemeniz önerilir. PcapHelperForIpv4 bulmak için
bu yöntemlerin detayları; ama özetlemek gerekirse...

· Belirli bir protokol/arayüz çifti üzerinde PCAP izlemeyi etkinleştirebilirsiniz.
Ptr ve arayüzey Bir için Pcap'ı Etkinleştir yöntem. Örneğin,

Ptr ipv4 = düğüm->GetObject ();
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcapIpv4 ("ön ek", ipv4, 0);

· Belirli bir düğüm/ağ-aygıtı çiftinde PCAP izlemeyi etkinleştirebilirsiniz.
standart::dize bir nesne adı hizmet dizesini temsil eden bir Pcap'ı Etkinleştir yöntem.
Ptr isim dizgisinden aranır. Örneğin,

İsimler::Add ("serverIPv4" ...);
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcapIpv4 ("ön ek", "serverIpv4", 1);

· Bir protokol/arayüz çiftleri koleksiyonunda PCAP izlemeyi etkinleştirebilirsiniz.
Ipv4InterfaceKonteyner. Her biri için iPv4 / protokol kapsayıcısında arabirim çifti
tipi kontrol edilir. Uygun türdeki her protokol için (tarafından yönetilenle aynı tür
aygıt yardımcısı), ilgili arabirim için izleme etkinleştirilir. Örneğin,

NodeContainer düğümleri;
Kendi ID’n ile mağazalarını oluştur
NetDeviceContainer cihazları = deviceHelper.Install (düğümler);
Kendi ID’n ile mağazalarını oluştur
Ipv4AddressHelper ipv4;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer arayüzleri = ipv4.Assign (cihazlar);
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcapIpv4 ("ön ek", arabirimler);

· Bir protokol/arayüz çiftleri koleksiyonunda PCAP izlemeyi etkinleştirebilirsiniz.
DüğümKonteyner. içindeki her bir Düğüm için DüğümKonteyner uygun protokol bulunur.
Her protokol için, arayüzleri numaralandırılır ve sonuçta izleme etkinleştirilir.
çiftler. Örneğin,

NodeContainer n;
Kendi ID’n ile mağazalarını oluştur
helper.EnablePcapIpv4 ("ön ek", n);

· PCAP izlemeyi Düğüm Kimliği ve arayüz bazında da etkinleştirebilirsiniz. Bunda
durumda, düğüm kimliği bir Ptr ve uygun protokol aranır
düğümde. Ortaya çıkan protokol ve arayüz, sonucu belirtmek için kullanılır.
iz kaynağı.

helper.EnablePcapIpv4 ("ön ek", 21, 1);

· Son olarak, sistemdeki tüm arabirimler için PCAP izlemeyi, ilişkili
protokol, aygıt yardımcısı tarafından yönetilenle aynı türdedir.

helper.EnablePcapIpv4All ("ön ek");

Dosya adları
Yukarıdaki tüm yöntem açıklamalarında örtük olarak, komple yapının inşası vardır.
uygulama yöntemine göre dosya adları. Konvansiyonel olarak, cihazlar için alınan PCAP izleri
the ns-3 sistem" şeklindedir. - - .pcap".
protokol izleri, protokoller ve protokoller arasında bire bir yazışma vardır. Nodes . Bu
çünkü protokol nesneler toplanır Düğüm nesneler. küresel olmadığı için
sistemdeki protokol kimliği, dosya adlandırmada ilgili Düğüm kimliğini kullanırız. Öyleyse
otomatik olarak seçilen izleme dosyası adlarında dosya adı çakışmaları olasılığı vardır.
Bu nedenle, protokol izleri için dosya adı kuralı değiştirilir.

Daha önce belirtildiği gibi, sistemdeki her Düğüm, sistem tarafından atanan bir Düğüm kimliğine sahip olacaktır.
Protokol örnekleri ve Düğüm örnekleri arasında bire bir yazışma olduğu için
düğüm kimliğini kullanıyoruz. Her arayüzün protokolüne göre bir arayüz kimliği vardır. Kullanırız
kongre" -n -ben içinde izleme dosyası adlandırma için .pcap"
protokol yardımcıları

Bu nedenle, varsayılan olarak, izlemenin etkinleştirilmesinin bir sonucu olarak oluşturulan bir PCAP izleme dosyası
"Önek" önekini kullanan Düğüm 1'in Ipv4 protokolünün 21. arabirimi
"ön ek-n21-i1.pcap".

her zaman kullanabilirsiniz ns-3 Bunu daha net hale getirmek için nesne adı hizmeti. örneğin, eğer
Ptr'ye "serverIpv4" adını atamak için nesne adı hizmetini kullanırsınız düğümde
21, elde edilen PCAP izleme dosyası adı otomatik olarak,
"prefix-nserverIpv4-i1.pcap".

Yöntemlerin birçoğunun adı verilen varsayılan bir parametresi vardır. açıkDosyaadı. Olarak ayarlandığında
true, bu parametre otomatik dosya adı tamamlama mekanizmasını devre dışı bırakır ve
açık bir dosya adı oluşturmak için. Bu seçenek yalnızca bir
önek ve tek bir cihazda izlemeyi etkinleştirin.

ASCII
ASCII izleme yardımcılarının davranışı, PCAP durumuna büyük ölçüde benzer. al
bakmak src/ağ/yardımcı/trace-helper.h tartışmayı takip etmek istiyorsanız
gerçek koda bakıyor.

Bu bölümde, protokole uygulanan yöntemleri göstereceğiz. iPv4. Karşı
benzer protokollerdeki izleri belirtin, sadece uygun türü değiştirin. Örneğin,
kullanın Ptr yerine Ptr ve Çağrı yap AsciiIpv6'yı Etkinleştir yerine
AsciiIpv4'yı Etkinleştir.

Sınıf AsciiTraceHelperForIpv4 ASCII kullanımı için üst düzey işlevsellik ekler
bir protokol yardımcısı için izleme. Bu yöntemleri etkinleştiren her protokol, bir
bu sınıftan miras alınan tek bir sanal yöntem.

sanal boşluk EnableAsciiIpv4Internal (Ptr aktarım,
std::string öneki,
Ptr ipv4,
uint32_t arayüzü,
bool açıkDosyaadı) = 0;

Bu yöntemin imzası, protokolün protokol ve arayüz merkezli görünümünü yansıtır.
bu seviyedeki durum; ve ayrıca yardımcının paylaşılan bir yere yazıyor olabileceği gerçeği
çıkış akışı Sınıftan miras alınan tüm genel yöntemler
PcapAndAsciiTraceHelperForIpv4 bu tek cihaza bağlı aramayı azaltın
uygulama yöntemi. Örneğin, en düşük seviyeli ASCII izleme yöntemleri,

void EnableAsciiIpv4 (std::string öneki, Ptr ipv4, uint4_t arabirimi, bool açıkDosyaadı = yanlış);
void EnableAsciiIpv4 (Ptr akış, Ptr ipv4, uint4_t arayüzü);

cihaz uygulamasını arayacak AsciiIpv4Internal'ı Etkinleştir doğrudan, ya
önek veya akış. Diğer tüm genel ASCII izleme yöntemleri bunlar üzerine inşa edilecektir.
ek kullanıcı düzeyinde işlevsellik sağlamak için düşük düzeyli işlevler. Bu ne anlama geliyor
kullanıcı, sistemdeki tüm cihaz yardımcılarının tüm ASCII izleme yöntemlerine sahip olacağıdır.
mevcut; ve bu yöntemlerin tümü, protokoller arasında aynı şekilde çalışacaktır.
protokoller uygulamak EnablAsciiIpv4Dahili doğru şekilde.

Yöntemler
void EnableAsciiIpv4 (std::string öneki, Ptr ipv4, uint4_t arabirimi, bool açıkDosyaadı = yanlış);
void EnableAsciiIpv4 (Ptr akış, Ptr ipv4, uint4_t arayüzü);

void EnableAsciiIpv4 (std::string öneki, std::string ipv4Name, uint32_t arabirimi, bool exclusiveFilename = false);
void EnableAsciiIpv4 (Ptr akış, std::string ipv4Name, uint32_t arabirimi);

void EnableAsciiIpv4 (std::string öneki, Ipv4InterfaceContainer c);
void EnableAsciiIpv4 (Ptr akış, Ipv4InterfaceContainer c);

void EnableAsciiIpv4 (std::string öneki, NodeContainer n);
void EnableAsciiIpv4 (Ptr akış, NodeContainer n);

void EnableAsciiIpv4All (std::string öneki);
void EnableAsciiIpv4All (Ptr aktarım);

void EnableAsciiIpv4 (std::string öneki, uint32_t düğüm kimliği, uint32_t aygıt kimliği, bool açıkDosyaadı);
void EnableAsciiIpv4 (Ptr akış, uint32_t düğüm kimliği, uint32_t arabirimi);

Sınıf için API Belgelerini incelemeniz önerilir. PcapAndAsciiHelperForIpv4 için
bu yöntemlerin ayrıntılarını bulun; ama özetlemek gerekirse...

· ASCII izleme için PCAP için kullanılan yöntemlerden iki kat daha fazla yöntem vardır
izleme. Bunun nedeni, her birinden izlerin olduğu PCAP tarzı modele ek olarak,
benzersiz protokol/arayüz çifti benzersiz bir dosyaya yazılırsa, bir modeli destekliyoruz.
birçok protokol/arayüz çifti için izleme bilgisi ortak bir dosyaya yazılır. Bu
anlamına gelir -n - dosya adı oluşturma mekanizması
ortak bir dosyaya atıfta bulunmak için bir mekanizma ile değiştirilir; ve API yöntemlerinin sayısı
tüm kombinasyonlara izin vermek için iki katına çıktı.

· PCAP izlemede olduğu gibi, belirli bir protokol/arayüz üzerinde ASCII izlemeyi etkinleştirebilirsiniz
sağlayarak eşleştirin Ptr ve bir arayüzey Bir için Ascii'yi Etkinleştir yöntem. Örneğin,

Ptr ipv4;
Kendi ID’n ile mağazalarını oluştur
helper.EnableAsciiIpv4 ("ön ek", ipv4, 1);

Bu durumda, ASCII izleme dosyasına hiçbir izleme bağlamı yazılmaz çünkü bunlar
gereksiz. Sistem, aynı kurallar kullanılarak oluşturulacak dosya adını seçecektir.
Dosyanın bunun yerine ".tr" ekine sahip olması dışında, PCAP bölümünde açıklanmıştır.
".pcap".

· Birden fazla arabirimde ASCII izlemeyi etkinleştirmek ve tüm izlemelerin gönderilmesini istiyorsanız
tek bir dosyaya, bunu tek bir dosyaya atıfta bulunmak için bir nesne kullanarak da yapabilirsiniz.
Yukarıdaki "cwnd" örneğinde buna benzer bir şeye zaten sahibiz:

Ptr protokol4 = düğüm1->GetObject ();
Ptr protokol4 = düğüm2->GetObject ();
Kendi ID’n ile mağazalarını oluştur
Ptr stream = asciiTraceHelper.CreateFileStream ("izleme-dosya-adı.tr");
Kendi ID’n ile mağazalarını oluştur
helper.EnableAsciiIpv4 (akış, protokol1, 1);
helper.EnableAsciiIpv4 (akış, protokol2, 1);

Bu durumda, gerekli oldukları için izleme bağlamları ASCII izleme dosyasına yazılır.
iki arabirimden gelen izleri belirsizleştirmek için. Kullanıcı tamamen
dosya adını belirtirken, dize tutarlılık için ",tr" içermelidir.

· Belirli bir protokolde ASCII izlemeyi etkinleştirebilirsiniz. standart::dize
bir nesne adı hizmet dizesini temsil eden bir Pcap'ı Etkinleştir yöntem. Ptr is
isim dizgisinden baktı. bu sonuçtaki dosya adlarında örtük olduğundan
protokol örnekleri ve düğümler arasında bire bir yazışma vardır, Örneğin,

İsimler::Add ("node1Ipv4" ...);
İsimler::Add ("node2Ipv4" ...);
Kendi ID’n ile mağazalarını oluştur
helper.EnableAsciiIpv4 ("ön ek", "node1Ipv4", 1);
helper.EnableAsciiIpv4 ("ön ek", "node2Ipv4", 1);

Bu, "prefix-nnode1Ipv4-i1.tr" adlı iki dosyayla sonuçlanır ve
"prefix-nnode2Ipv4-i1.tr" ile ilgili izleme dosyasındaki her arabirim için izlemeler.
Tüm EnableAscii işlevleri bir akış sarmalayıcısı almak için aşırı yüklendiğinden,
bu formu da kullanın:

İsimler::Add ("node1Ipv4" ...);
İsimler::Add ("node2Ipv4" ...);
Kendi ID’n ile mağazalarını oluştur
Ptr stream = asciiTraceHelper.CreateFileStream ("izleme-dosya-adı.tr");
Kendi ID’n ile mağazalarını oluştur
helper.EnableAsciiIpv4 (akış, "node1Ipv4", 1);
helper.EnableAsciiIpv4 (akış, "node2Ipv4", 1);

Bu, "izleme-dosya-adı.tr" adlı tüm izleme dosyalarını içeren tek bir izleme dosyasıyla sonuçlanır.
her iki arabirim için izleme olaylarının sayısı. Olaylar iz ile belirsizleştirilecektir
bağlam dizeleri.

· Bir protokol/arayüz çiftleri koleksiyonunda ASCII izlemeyi etkinleştirebilirsiniz.
Ipv4InterfaceKonteyner. Uygun tipteki her protokol için (olduğu gibi aynı tip
cihaz yardımcısı tarafından yönetilir), ilgili arayüz için izleme etkinleştirilir.
Yine, arasında bire bir yazışma olduğu için örtüktür.
protokol ve düğümü. Örneğin,

NodeContainer düğümleri;
Kendi ID’n ile mağazalarını oluştur
NetDeviceContainer cihazları = deviceHelper.Install (düğümler);
Kendi ID’n ile mağazalarını oluştur
Ipv4AddressHelper ipv4;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer arayüzleri = ipv4.Assign (cihazlar);
Kendi ID’n ile mağazalarını oluştur
Kendi ID’n ile mağazalarını oluştur
helper.EnableAsciiIpv4 ("ön ek", arabirimler);

Bu, her biri aşağıdakileri izleyen bir dizi ASCII izleme dosyasının oluşturulmasına neden olur.
en -n -ben .tr kongresi. Tüm izleri bir araya getirmek
tek dosya, yukarıdaki örneklere benzer şekilde gerçekleştirilir:

NodeContainer düğümleri;
Kendi ID’n ile mağazalarını oluştur
NetDeviceContainer cihazları = deviceHelper.Install (düğümler);
Kendi ID’n ile mağazalarını oluştur
Ipv4AddressHelper ipv4;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer arayüzleri = ipv4.Assign (cihazlar);
Kendi ID’n ile mağazalarını oluştur
Ptr stream = asciiTraceHelper.CreateFileStream ("izleme-dosya-adı.tr");
Kendi ID’n ile mağazalarını oluştur
helper.EnableAsciiIpv4 (akış, arayüzler);

· Bir protokol/arayüz çiftleri koleksiyonunda ASCII izlemeyi etkinleştirebilirsiniz.
DüğümKonteyner. içindeki her bir Düğüm için DüğümKonteyner uygun protokol bulunur.
Her protokol için, arayüzleri numaralandırılır ve sonuçta izleme etkinleştirilir.
çiftler. Örneğin,

NodeContainer n;
Kendi ID’n ile mağazalarını oluştur
helper.EnableAsciiIpv4 ("ön ek", n);

Bu, her biri aşağıdakileri izleyen bir dizi ASCII izleme dosyasının oluşturulmasına neden olur.
en - - .tr kongresi. Tüm izleri bir araya getirmek
tek dosya, yukarıdaki örneklere benzer şekilde gerçekleştirilir.

· PCAP izlemeyi Düğüm Kimliği ve cihaz kimliği bazında da etkinleştirebilirsiniz. Bunda
durumda, düğüm kimliği bir Ptr ve uygun protokol aranır
düğümde. Ortaya çıkan protokol ve arayüz, sonucu belirtmek için kullanılır.
iz kaynağı.

helper.EnableAsciiIpv4 ("ön ek", 21, 1);

Tabii ki, izler yukarıda gösterildiği gibi tek bir dosyada birleştirilebilir.

· Son olarak, sistemdeki tüm arabirimler için ASCII izlemeyi, ilişkili
protokol, aygıt yardımcısı tarafından yönetilenle aynı türdedir.

helper.EnableAsciiIpv4All ("ön ek");

Bu, her biri için bir tane olmak üzere bir dizi ASCII izleme dosyasının oluşturulmasına neden olur.
yardımcı tarafından yönetilen türden bir protokolle ilgili sistemdeki arabirim. Hepsi
bu dosyalar takip edecek -n -i
tüm izleri tek bir dosyada, yukarıdaki örneklere benzer şekilde gerçekleştirilir.

Dosya adları
Yukarıdaki önek tarzı yöntem açıklamalarında örtük olarak, tam yapının inşası vardır.
uygulama yöntemine göre dosya adları. Konvansiyonel olarak, ASCII izler ns-3 sistem
şeklindedir" - - .tr"

Daha önce belirtildiği gibi, sistemdeki her Düğüm, sistem tarafından atanan bir Düğüm kimliğine sahip olacaktır.
Node-id için kullandığımız protokoller ve düğümler arasında bire bir yazışma olduğu için
protokol kimliğini tanımlamak için. Belirli bir protokoldeki her arabirimin bir
protokolüne göre arayüz indeksi (basitçe bir arayüz olarak da adlandırılır). Varsayılan olarak,
ardından, ilk cihazda izlemenin etkinleştirilmesinin bir sonucu olarak oluşturulan bir ASCII izleme dosyası
"Önek" önekini kullanan Düğüm 21, "önek-n21-i1.tr" olacaktır. için ön eki kullanın
düğüm başına birden çok protokolün belirsizliğini ortadan kaldırın.

her zaman kullanabilirsiniz ns-3 Bunu daha net hale getirmek için nesne adı hizmeti. örneğin, eğer
Düğüm üzerindeki protokole "serverIpv4" adını atamak için nesne adı hizmetini kullanırsınız
21 ve ayrıca bir arabirimi belirtin, sonuçta ortaya çıkan ASCII izleme dosyası adı otomatik olarak
"prefix-nserverIpv4-1.tr" olur.

Yöntemlerin birçoğunun adı verilen varsayılan bir parametresi vardır. açıkDosyaadı. Olarak ayarlandığında
true, bu parametre otomatik dosya adı tamamlama mekanizmasını devre dışı bırakır ve
açık bir dosya adı oluşturmak için. Bu seçenek yalnızca bir
önek ve tek bir cihazda izlemeyi etkinleştirin.

ÖZET
ns-3 kullanıcıların çeşitli seviyelerde özelleştirmesine izin veren son derece zengin bir ortam içerir
simülasyonlardan çıkarılabilecek bilgi türleri.

Kullanıcıların sadece koleksiyonlarını kontrol etmelerini sağlayan üst düzey yardımcı işlevler vardır.
ince bir ayrıntı düzeyine önceden tanımlanmış çıktılar. İzin vermek için orta seviye yardımcı işlevler vardır.
bilgilerin nasıl ayıklandığını ve kaydedildiğini özelleştirmek için daha karmaşık kullanıcılar; ve orada
uzman kullanıcıların sistemi yeni ve
Daha önce dışa aktarılmamış bilgileri, kullanıcıların anında erişebilecekleri şekilde
yüksek seviyeler.

Bu çok kapsamlı bir sistem ve özellikle sindirilmesi gereken çok şey olduğunun farkındayız.
yeni kullanıcılar veya C++ ve deyimlerini yakından tanımayanlar için. dikkate alıyoruz
izleme sisteminin çok önemli bir parçası ns-3 ve bu yüzden tanıdık olmanızı öneririz
onunla mümkün. Geri kalanını anlamak muhtemelen böyledir. ns-3 sistem
izleme sistemine hakim olduktan sonra oldukça basit olacak

VERİ KOLEKSİYON


Son eğitim bölümümüz, eklenmiş bazı bileşenleri tanıtır. ns-3 sürümde
3.18 ve bu hala geliştirme aşamasındadır. Bu eğitim bölümü aynı zamanda bir
devam eden çalışma.

Motivasyon
Simülasyon çalıştırmanın ana noktalarından biri, çıktı verilerinin üretilmesidir.
araştırma amaçlı veya sadece sistem hakkında bilgi edinmek için. Bir önceki bölümde, biz
izleme alt sistemini ve örneğini tanıttı altıncı.cc. hangi PCAP veya ASCII izlemesinden
dosyalar oluşturulur. Bu izler, çeşitli yöntemler kullanılarak veri analizi için değerlidir.
harici araçlar ve birçok kullanıcı için bu tür çıktı verileri, toplamanın tercih edilen bir yoludur.
veriler (harici araçlarla analiz için).

Ancak, aşağıdakiler de dahil olmak üzere, izleme dosyası oluşturmadan daha fazlası için kullanım durumları da vardır.
Aşağıdaki:

· Paket olmayanlar gibi PCAP veya ASCII izleriyle iyi eşleşmeyen verilerin oluşturulması
veriler (örneğin protokol durumu makine geçişleri),

· izleme dosyaları oluşturmak için disk G/Ç gereksinimlerinin belirlendiği büyük simülasyonlar
yasaklayıcı veya hantal ve

· ihtiyaç Online simülasyon sırasında veri azaltma veya hesaplama.
Buna iyi bir örnek, simülasyon için bir sonlandırma koşulu tanımlamaktır.
yeterince dar bir güven oluşturmak için yeterli veriyi aldığında ne zaman duracağını
Bazı parametrelerin tahmini etrafındaki aralık.

The ns-3 veri toplama çerçevesi, bu ek yetenekleri sağlamak için tasarlanmıştır.
izleme tabanlı çıktının ötesinde. Bu konuyla ilgilenen okuyucunun danışmasını tavsiye ederiz.
the ns-3 Bu çerçevenin daha ayrıntılı bir şekilde ele alınması için kılavuz; burada özetliyoruz
örnek bir program geliştirme yeteneklerinden bazıları.

Örnek E-posta Kod
öğretici örnek örnekler/öğretici/seventh.cc benzer altıncı.cc örnek biz
birkaç değişiklik dışında daha önce gözden geçirilmiştir. İlk olarak, IPv6 için etkinleştirildi
komut satırı seçeneğiyle destek:

Komut satırı cmd'si;
cmd.AddValue ("useIpv6", "Ipv6 Kullan", useV6);
cmd.Ayrıştır (argc, argv);

Kullanıcı belirtirse kullanımIpv6seçeneği, program IPv6 yerine IPv4 kullanılarak çalıştırılacaktır.
The yardım et seçeneği, hepsinde mevcut ns-3 olarak CommandLine nesnesini destekleyen programlar
yukarıda gösterilen, aşağıdaki gibi çağrılabilir (lütfen çift tırnak kullanımına dikkat edin):

./waf --run "yedinci --help"

hangi üretir:

ns3-dev-seventh-debug [Program Argümanları] [Genel Argümanlar]

Program Argümanları:
--useIpv6: Ipv6 kullan [yanlış]

Genel Argümanlar:
--PrintGlobals: Küresellerin listesini yazdırın.
--PrintGroups: Grup listesini yazdırın.
--PrintGroup=[grup]: Grubun tüm TypeId'lerini yazdırın.
--PrintTypeIds: Tüm TypeId'leri yazdırın.
--PrintAttributes=[typeid]: typeid'nin tüm özelliklerini yazdırın.
--PrintHelp: Bu yardım mesajını yazdırın.

Bu varsayılan (useIpv4 yanlış olduğundan IPv6 kullanımı) boole değiştirilerek değiştirilebilir
aşağıdaki gibi değer:

./waf --run "yedinci --useIpv6=1"

ve oluşturulan pcap'a bir göz atın, örneğin tcp dökümü:

tcpdump -r yedinci.pcap -nn -tt

Bu, IPv6 desteğine ve aynı zamanda komut satırına kısa bir giriş oldu.
Bu eğitimde daha önce tanıtılmıştır. Komut satırı kullanımına özel bir örnek için,
bakınız kaynak/çekirdek/örnekler/komut satırı-örnek.cc.

Şimdi veri toplamaya dönelim. İçinde örnekler/eğitici/ dizine aşağıdakini yazın
komut: fark -u altıncı.cc yedinci.ccve bu farkın yeni satırlarından bazılarını inceleyin:

+ std::string probType;
+ std::string tracePath;
+ if (useV6 == yanlış)
+ {
Kendi ID’n ile mağazalarını oluştur
+ probeType = "ns3::Ipv4PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv4L3Protocol/Tx";
+ }
+ başka
+ {
Kendi ID’n ile mağazalarını oluştur
+ probeType = "ns3::Ipv6PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv6L3Protocol/Tx";
+ }
Kendi ID’n ile mağazalarını oluştur
+ // Paket bayt sayısını zaman içinde çizmek için GnuplotHelper'ı kullanın
+ GnuplotHelper arsaHelper;
+
+ // Çizimi yapılandırın. İlk argüman dosya adı önekidir
+ // oluşturulan çıktı dosyaları için. İkinci, üçüncü ve dördüncü
+ // argümanlar sırasıyla çizim başlığı, x ekseni ve y ekseni etiketleridir
+ plotHelper.ConfigurePlot ("yedinci paket bayt sayısı",
+ "Paket Bayt Sayısı ve Zaman",
+ "Zaman (Saniye)",
+ "Paket Bayt Sayısı");
+
+ // Araştırma türünü, izleme kaynağı yolunu (yapılandırma ad alanında) belirtin ve
+ // çizim için çıktı izleme kaynağı ("OutputBytes") araştırın. dördüncü argüman
+ // grafikteki veri serisi etiketinin adını belirtir. Son
+ // argüman, anahtarın nereye yerleştirilmesi gerektiğini belirterek çizimi biçimlendirir.
+ arsaHelper.PlotProbe (probeType,
+ izlemeYolu,
+ "Çıktı Baytları",
+ "Paket Bayt Sayısı",
+ GnuplotAggregator::KEY_BELOW);
+
+ // Zaman içinde paket bayt sayısını yazmak için FileHelper'ı kullanın
+ DosyaYardımcısı dosyaYardımcısı;
+
+ // Yazılacak dosyayı ve çıktı verilerinin formatını yapılandırın.
+ fileHelper.ConfigureFile ("yedinci paket bayt sayısı",
+ FileAggregator::FORMATTED);
+
+ // Bu biçimlendirilmiş çıktı dosyası için etiketleri ayarlayın.
+ fileHelper.Set2dFormat ("Zaman (Saniye) = %.3e\tPacket Bayt Sayısı = %.0f");
+
+ // Araştırma tipini, araştırma yolunu (yapılandırma ad alanında) ve
+ // yazmak için çıktı izleme kaynağı ("OutputBytes") araştırması.
+ fileHelper.WriteProbe (probeType,
+ izlemeYolu,
+ "Çıkış Baytları");
+
Simülatör::Dur (Saniye (20));
Simülatör::Çalıştır ();
Simülatör::Yok Et ();

Dikkatli okuyucu, yukarıdaki IPv6 komut satırı özniteliğini test ederken şunu fark etmiş olacaktır:
o yedinci.cc bir dizi yeni çıktı dosyası oluşturmuştu:

yedinci paket bayt sayısı-0.txt
yedinci paket bayt sayısı-1.txt
yedinci-paket-byte-count.dat
yedinci-paket-byte-count.plt
yedinci-paket-byte-count.png
yedinci-paket-byte-count.sh

Bunlar, yukarıda tanıtılan ek ifadelerle oluşturulmuştur; özellikle, bir
GnuplotHelper ve bir FileHelper. Bu veriler, veri toplama kancası takılarak üretildi.
Bileşenler ns-3 kaynakları izleme ve verileri biçimlendirilmiş bir gnuplot ve
biçimlendirilmiş bir metin dosyasına dönüştürün. Sonraki bölümlerde bunların her birini inceleyeceğiz.

GnuplotYardımcısı
GnuplotHelper bir ns-3 üretimini amaçlayan yardımcı nesne gnuplot ile arsalar
yaygın durumlar için mümkün olduğunca az ifade. kancalar ns-3 verilerle kaynakları izleme
veri toplama sistemi tarafından desteklenen türler. Hepsi değil ns-3 izleme kaynakları veri türleri
desteklenir, ancak düz eski TracedValues ​​dahil olmak üzere yaygın izleme türlerinin çoğu
veri (POD) türleri.

Bu yardımcı tarafından üretilen çıktıya bakalım:

yedinci-paket-byte-count.dat
yedinci-paket-byte-count.plt
yedinci-paket-byte-count.sh

Birincisi, bir dizi boşlukla sınırlandırılmış zaman damgası ve paket içeren bir gnuplot veri dosyasıdır.
bayt sayıları. Bu belirli veri çıktısının nasıl yapılandırıldığını aşağıda ele alacağız, ancak hadi
çıktı dosyalarıyla devam edin. Dosya yedinci-paket-byte-count.plt bir gnuplot arsadır
gnuplot içinden açılabilen dosya. Gnuplot sözdizimini anlayan okuyucular şunları yapabilir:
bunun biçimlendirilmiş bir çıktı PNG dosyası üreteceğini görün
yedinci-paket-byte-count.png. Son olarak, küçük bir kabuk betiği
yedinci-paket-byte-count.sh istenen sonucu üretmek için bu çizim dosyasını gnuplot aracılığıyla çalıştırır
PNG (bir resim düzenleyicide görüntülenebilir); yani komut:

sh yedinci-paket-byte-count.sh

verecek yedinci-paket-byte-count.png. Bu PNG neden ilkinde üretilmedi?
yer? Cevap, plt dosyasını sağlayarak kullanıcının elle yapılandırabilmesidir.
istenirse PNG'yi üretmeden önce sonuç.

PNG resim başlığı, bu grafiğin "Paket Bayt Sayısına Karşı Zaman" grafiği olduğunu belirtir ve
izleme kaynağı yoluna karşılık gelen incelenen verileri çizdiğini:

/NodeList/*/$ns3::Ipv6L3Protocol/Tx

İzleme yolundaki joker karakteri not edin. Özetle, bu arsanın yakaladığı arsadır.
Ipv6L3Protocol nesnesinin iletim izleme kaynağında gözlemlenen paket baytlarının sayısı;
büyük ölçüde bir yönde 596 baytlık TCP segmentleri ve diğer yönde 60 baytlık TCP ack'leri (iki
düğüm izleme kaynakları bu izleme kaynağıyla eşleştirildi).

Bu nasıl yapılandırıldı? Birkaç ifade verilmesi gerekiyor. İlk olarak, GnuplotHelper
nesne bildirilmeli ve yapılandırılmalıdır:

+ // Paket bayt sayısını zaman içinde çizmek için GnuplotHelper'ı kullanın
+ GnuplotHelper arsaHelper;
+
+ // Çizimi yapılandırın. İlk argüman dosya adı önekidir
+ // oluşturulan çıktı dosyaları için. İkinci, üçüncü ve dördüncü
+ // argümanlar sırasıyla çizim başlığı, x ekseni ve y ekseni etiketleridir
+ plotHelper.ConfigurePlot ("yedinci paket bayt sayısı",
+ "Paket Bayt Sayısı ve Zaman",
+ "Zaman (Saniye)",
+ "Paket Bayt Sayısı");

Bu noktaya kadar boş bir arsa yapılandırılmıştır. Dosya adı öneki ilk
argüman, arsa başlığı ikinci, x ekseni etiketi üçüncü ve y ekseni etiketidir.
dördüncü argüman.

Sonraki adım, verileri yapılandırmaktır ve izleme kaynağının bağlı olduğu yer burasıdır.
İlk olarak, programda daha sonra kullanmak üzere birkaç değişken tanımladığımıza dikkat edin:

+ std::string probType;
+ std::string tracePath;
+ probeType = "ns3::Ipv6PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv6L3Protocol/Tx";

Onları burada kullanıyoruz:

+ // Araştırma türünü, izleme kaynağı yolunu (yapılandırma ad alanında) belirtin ve
+ // çizim için çıktı izleme kaynağı ("OutputBytes") araştırın. dördüncü argüman
+ // grafikteki veri serisi etiketinin adını belirtir. Son
+ // argüman, anahtarın nereye yerleştirilmesi gerektiğini belirterek çizimi biçimlendirir.
+ arsaHelper.PlotProbe (probeType,
+ izlemeYolu,
+ "Çıktı Baytları",
+ "Paket Bayt Sayısı",
+ GnuplotAggregator::KEY_BELOW);

İlk iki argüman, araştırma tipinin adı ve izleme kaynağı yoludur. Bunlar
diğerlerini planlamak için bu çerçeveyi ne zaman kullanmaya çalıştığınızı belirlemek muhtemelen en zor olanıdır.
izler. Buradaki sonda izi, Tx sınıfın izleme kaynağı Ipv6L3Protokol. Biz ne zaman
bu sınıf uygulamasını inceleyin (kaynak/internet/model/ipv6-l3-protocol.cc) gözlemleyebiliriz:

.AddTraceSource ("Tx", "IPv6 paketini giden arabirime gönder.",
MakeTraceSourceAccessor (&Ipv6L3Protocol::m_txTrace))

Bu diyor ki Tx değişken için bir isimdir m_txTrace, bir beyanı olan:

/ **
* \brief TX (iletim) paketlerini izlemek için geri arama.
*/
TracedCallback , Ptr , uint6_t> m_txTrace;

Bu özel izleme kaynağı imzasının bir Probe sınıfı tarafından desteklendiği ortaya çıktı (ne
burada ihtiyacımız var) Ipv6PacketProbe sınıfı. Dosyalara bakın
kaynak/internet/model/ipv6-paket-probe.{h,cc}.

Yani, yukarıdaki PlotProbe ifadesinde, ifadenin izi yakaladığını görüyoruz.
eşleşen bir kaynak (yol dizesi ile tanımlanır) ns-3 Prob tipi Ipv6PacketProbe. Eğer
bu prob tipini desteklemiyorduk (eşleşen izleme kaynağı imzası), destekleyemezdik
bu ifadeyi kullandı (her ne kadar bazı daha karmaşık alt düzey ifadeler olabilirse de)
kullanım kılavuzunda açıklandığı gibi).

Ipv6PacketProbe'un kendisi, verileri sistemden çıkaran bazı izleme kaynaklarını dışa aktarır.
incelenen Paket nesnesi:

TipKimliği
Ipv6PacketProbe::GetTypeId ()
{
statik TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
.SetParent ()
.Yapıcı Ekle ()
.AddTraceSource ("Çıktı",
"Paket artı IPv6 nesnesi ve bu araştırma için çıktı görevi gören arabirimi",
MakeTraceSourceAccessor (&Ipv6PacketProbe::m_output))
.AddTraceSource ("OutputBytes",
"Paketteki bayt sayısı",
MakeTraceSourceAccessor (&Ipv6PacketProbe::m_outputBytes))
;
dönüş tid;
}

PlotProbe deyimimizin üçüncü argümanı, aşağıdakilerle ilgilendiğimizi belirtir.
bu paketteki bayt sayısı; özellikle, "OutputBytes" izleme kaynağı
Ipv6PacketProbe. Son olarak, ifadenin son iki argümanı olay örgüsü efsanesini sağlar.
bu veri dizisi ("Paket Bayt Sayısı") ve isteğe bağlı bir gnuplot biçimlendirme ifadesi için
(GnuplotAggregator::KEY_BELOW) arsa anahtarının arsanın altına eklenmesini istiyoruz.
Diğer seçenekler arasında NO_KEY, KEY_INSIDE ve KEY_ABOVE bulunur.

destekli Iz Türleri
Aşağıdaki izlenen değerler, bu yazıdan itibaren Problar ile desteklenmektedir:

┌──────────────────────────────────────────── ──────────────────┐
│TracedValue tipi │ Prob tipi │ Dosya │
├──────────────────────────────────────────── ──────────────────┤
│double │ DoubleProbe │ istatistikler/model/double-probe.h │
├──────────────────────────────────────────── ──────────────────┤
│uint8_t │ Uinteger8Probe │ istatistikler/model/uinteger-8-probe.h │
├──────────────────────────────────────────── ──────────────────┤
│uint16_t │ Uinteger16Probe │ istatistikler/model/uinteger-16-probe.h │
├──────────────────────────────────────────── ──────────────────┤
│uint32_t │ Uinteger32Probe │ istatistikler/model/uinteger-32-probe.h │
├──────────────────────────────────────────── ──────────────────┤
│bool │ BooleanProbe │ istatistikler/model/uinteger-16-probe.h │
├──────────────────────────────────────────── ──────────────────┤
│ns3::Time │ TimeProbe │ istatistikler/model/time-probe.h │
└──────────────────────────────────────────── ──────────────────┘

Aşağıdaki TraceSource türleri, bu yazıdan itibaren Problar tarafından desteklenmektedir:

┌──────────────────────────────────────────── ──────────────────────────────────────────── ──────────┐
├──────────────────────────────────────────── ──────────────────────────────────────────── ──────────┤
├──────────────────────────────────────────── ──────────────────────────────────────────── ──────────┤
├──────────────────────────────────────────── ──────────────────────────────────────────── ──────────┤
├──────────────────────────────────────────── ──────────────────────────────────────────── ──────────┤
├──────────────────────────────────────────── ──────────────────────────────────────────── ──────────┤
└──────────────────────────────────────────── ──────────────────────────────────────────── ──────────┘

Görülebileceği gibi, yalnızca birkaç izleme kaynağı desteklenmektedir ve hepsi şuraya yöneliktir:
Paket boyutunun çıktısı (bayt olarak). Ancak, temel veri türlerinin çoğu
TracedValues ​​olarak kullanılabilir, bu yardımcılarla desteklenebilir.

Dosya Yardımcısı
FileHelper sınıfı, önceki GnuplotHelper örneğinin yalnızca bir varyasyonudur. bu
örnek program, aşağıdaki gibi aynı zaman damgalı verilerin biçimlendirilmiş çıktısını sağlar:

Zaman (Saniye) = 9.312e+00 Paket Bayt Sayısı = 596
Zaman (Saniye) = 9.312e+00 Paket Bayt Sayısı = 564

İki dosya sağlanır, biri "0" düğümü için, diğeri de "1" düğümü için.
dosya adları. Kodu parça parça inceleyelim:

+ // Zaman içinde paket bayt sayısını yazmak için FileHelper'ı kullanın
+ DosyaYardımcısı dosyaYardımcısı;
+
+ // Yazılacak dosyayı ve çıktı verilerinin formatını yapılandırın.
+ fileHelper.ConfigureFile ("yedinci paket bayt sayısı",
+ FileAggregator::FORMATTED);

Dosya yardımcı dosyası öneki ilk bağımsız değişkendir ve ardından bir biçim belirteci gelir. Bazı
diğer biçimlendirme seçenekleri arasında SPACE_SEPARATED, COMMA_SEPARATED ve TAB_SEPARATED bulunur.
Kullanıcılar biçimlendirmeyi (FORMATTED belirtilmişse) bir biçim dizesiyle değiştirebilir
aşağıdaki gibi:

+
+ // Bu biçimlendirilmiş çıktı dosyası için etiketleri ayarlayın.
+ fileHelper.Set2dFormat ("Zaman (Saniye) = %.3e\tPacket Bayt Sayısı = %.0f");

Son olarak, ilginin iz kaynağı bağlanmalıdır. Yine, probeType ve tracePath
bu örnekteki değişkenler kullanılır ve probun çıkış izleme kaynağı "OutputBytes"
bağlanmış:

+
+ // Araştırma türünü, izleme kaynağı yolunu (yapılandırma ad alanında) belirtin ve
+ // yazmak için çıktı izleme kaynağı ("OutputBytes") araştırması.
+ fileHelper.WriteProbe (probeType,
+ izlemeYolu,
+ "Çıkış Baytları");
+

Bu izleme kaynağı belirticisindeki joker karakterler, iki izleme kaynağıyla eşleşir. aksine
GnuplotHelper örneği, iki veri serisinin aynı arsa üzerine bindirildiği örnek, burada iki
ayrı dosyalar diske yazılır.

ÖZET
Veri toplama desteği ns-3.18'den itibaren yenidir ve zaman serileri sağlamak için temel destek
çıktı eklendi. Yukarıda açıklanan temel model,
mevcut probların ve izleme kaynaklarının destek kapsamı. Dahil olmak üzere daha fazla yetenek
istatistik işleme gelecek sürümlerde eklenecektir.

SONUÇ


Vadeli İşlemler
Bu belge, yaşayan bir belge olarak tasarlanmıştır. Zamanla büyümesini umuyor ve bekliyoruz
giderek daha fazla somun ve cıvatayı kapatmak için ns-3.

Kılavuz ve eğitim bölümleri yazmak, hepimizi heyecanlandıran bir şey değil, ama
proje için çok önemli. Bu alanlardan birinde uzmansanız, lütfen
katkıda bulunmayı düşünmek ns-3 bu bölümlerden birini sağlayarak; ya da başka bir bölüm sen
önemli olduğunu düşünebilir.

Kapanış
ns-3 büyük ve karmaşık bir sistemdir. Her şeyi örtmek imkansız
küçük bir öğreticide bilmeniz gerekecek. Daha fazlasını öğrenmek isteyen okuyucular,
aşağıdaki ek belgeleri okuyun:

· ns-3 Manuel

· ns-3 model kitaplığı belgeleri

· ns-3 Doxygen (API belgeleri)

· ns-3 wiki

-- NS ns-3 Geliştirme Takımı.

onworks.net hizmetlerini kullanarak ns-3-öğreticiyi çevrimiçi kullanın


Ücretsiz Sunucular ve İş İstasyonları

Windows ve Linux uygulamalarını indirin

Linux komutları

Ad




×
reklâm
❤️Buradan alışveriş yapın, rezervasyon yapın veya satın alın; ücretsizdir, hizmetlerin ücretsiz kalmasına yardımcı olur.