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

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

5 Ayar
5.1 Günlük modülünün kullanılması
5.1.1 Günlüğe kaydetmeye genel bakış
5.1.2 Günlüğe kaydetmeyi etkinleştir
5.1.3 Kodunuza günlük ekleme
5.2 Komut satırı bağımsız değişkenlerini kullanma
5.2.1 Varsayılan özellik değerlerinin geçersiz kılınması
5.2.2 Kendi komutlarınızı yakalamak
5.3 İzleme sisteminin kullanılması
5.3.1 ASCII İzleme
ASCII izlerini ayrıştırma
5.3.2 PCAP İzlemesi

Bölüm 5

Ayar

5.1 Günlük modülünün kullanılması

Zaten scripte bakarak ns-3 logging modülüne kısaca göz atmıştık. ilk.cc. Bu bölümde, günlük kaydı alt sisteminin olası kullanımlarına daha yakından bakacağız.

5.1.1 Günlüğe kaydetmeye genel bakış

Birçok büyük sistem bir tür mesaj kaydetme olanağını destekler ve ns-3 de bir istisna değildir. Bazı durumlarda "operatör konsoluna" (Unix tabanlı sistemlerde genellikle stderr'dir) yalnızca hata mesajları yazılır. Diğer sistemlerde daha ayrıntılı bilgilerin yanı sıra uyarı mesajları da görüntülenebilir. Bazı durumlarda, çıktıyı hızlı bir şekilde bulanıklaştırabilecek hata ayıklama mesajlarının çıktısını almak için günlük tutma araçları kullanılır.

Ns-3'te kullanılan subHRD, tüm bu bilgi içeriği seviyelerinin yararlı olduğunu varsayar ve mesaj günlüğüne seçici, katmanlı bir yaklaşım sağlar. Günlük kaydı tamamen devre dışı bırakılabilir, bileşen bazında veya genel olarak etkinleştirilebilir. Bu amaçla ayarlanabilir seviyelerde bilgi içeriği kullanılır. Ns-3 kayıt modülü, simülasyonunuzdan faydalı bilgiler elde etmek için nispeten basit bir yol sağlar.

Simülasyonlar için tercih edilen çıktı olması gereken, modellerinizden veri çıkarmak için genel amaçlı bir mekanizma (izleme) sağladığımızı anlamalısınız (izleme sistemimiz hakkında daha fazla bilgi için eğitim bölümü 5.3'e bakın). Günlüğe kaydetme, hata ayıklama bilgilerini, uyarıları, hata mesajlarını almak veya komut dosyalarınızdan veya modellerinizden herhangi bir zamanda hızlı bir şekilde mesaj çıktısı almak için tercih edilen yöntem olmalıdır.

Şu anda sistem, artan bilgi içeriği sırasına göre yedi düzey (tür) günlük mesajı tanımlamaktadır.

  • LOG_ERROR - hata mesajlarının günlüğe kaydedilmesi (ilgili makro: NS_LOG_ERROR);
  • LOG_WARN - Uyarı mesajlarını günlüğe kaydet (ilgili makro: NS_LOG_WARN);
  • LOG_DEBUG - Nispeten nadir özel hata ayıklama mesajlarını günlüğe kaydedin (ilgili makro: NS_LOG_DEBUG);
  • LOG_INFO - programın ilerleyişi hakkında bilgi mesajlarının kaydı (ilgili makro: NS_LOG_INFO);
  • LOG_FUNCTION - Çağrılan her işlevi açıklayan mesajları günlüğe kaydeder (ilgili iki makro: üye işlevleri için kullanılan NS_LOG_FUNCTION ve statik işlevler için kullanılan NS_LOG_FUNCTION_NOARGS);
  • LOG_LOGIC - bir fonksiyon içindeki mantıksal akışı açıklayan mesajların günlüğe kaydedilmesi (ilgili makro: NS_LOG_LOGIC);
  • LOG_ALL - Yukarıda belirtilen her şeyi günlüğe kaydeder (ilişkili makro yok).
    Her tür için (LOG_TYPE), aynı zamanda, eğer kullanılırsa, kendi seviyesine ek olarak üzerindeki tüm seviyelerin günlüğe kaydedilmesine izin veren bir LOG_LEVEL_TYPE vardır. (Sonuç olarak, LOG_ERROR ve LOG_LEVEL_ERROR ve 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 iletilere izin verirken, LOG_LEVEL_INFO'nun etkinleştirilmesi aynı zamanda NS_LOG_DEBUG, NS_LOG_WARN ve NS_LOG_ERROR makroları tarafından sağlanan iletileri de içerecektir.

Ayrıca, günlük kaydı düzeyi veya seçim bileşeni ne olursa olsun, her zaman görüntülenen koşulsuz bir günlük kaydı makrosu da sağlıyoruz.

  • NS_LOG_UNCOND - İlişkili mesajın koşulsuz günlüğe kaydedilmesi (ilişkili günlük kaydı düzeyi yok).

Her seviye ayrı ayrı veya toplu olarak sorgulanabilir. Günlüğe kaydetme, sh ortam değişkeni NS_LOG kullanılarak veya bir sistem işlev çağrısının günlüğe kaydedilmesiyle yapılandırılabilir. Daha önce de gösterildiği gibi, kayıt sistemi Doxygen belgelerine sahiptir ve henüz incelemediyseniz şimdi incelemenin tam zamanıdır.

Artık belgeleri çok ayrıntılı bir şekilde okuduğunuza göre, bu bilgiyi örnek komut dosyasından bazı ilginç bilgiler almak için kullanalım. çizik/ilk.cczaten derlediğiniz.

5.1.2 Günlüğe kaydetmeyi etkinleştir

Biraz daha günlük çalıştırmak için NS_LOG ortam değişkenini kullanalım, ancak önce yönünüzü anlamak için daha önce yaptığınız gibi son betiği çalıştırın.

$ ./waf --run scratch/myfirst

İlk ns-3 örnek programından tanıdık çıktıyı görmelisiniz

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

Yukarıda gördüğünüz "gönderildi" ve "alındı" mesajlarının aslında şu adresten günlüğe kaydedilen mesajlar olduğu ortaya çıktı: UdpEchoClientUygulaması и UdpEchoSunucu Uygulaması. Örneğin, istemci uygulamasından günlük tutma düzeyini NS_LOG ortam değişkeni aracılığıyla ayarlayarak ek bilgiler yazdırmasını isteyebiliriz.

Şu andan itibaren "VARIABLE=value" sözdizimini kullanan sh benzeri bir kabuk kullandığınızı varsayacağım. Eğer csh benzeri bir kabuk kullanıyorsanız, örneklerimi bu kabukların gerektirdiği "setenv değişken değeri" sözdizimine dönüştürmeniz gerekecektir.

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

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

LOG_LEVEL_INFO günlük kaydı düzeyini etkinleştirir. Bir kayıt seviyesi bayrağını geçtiğimizde, aslında o seviyeyi ve tüm alt seviyeleri etkinleştirmiş oluruz. Bu durumda NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN ve NS_LOG_ERROR'u etkinleştirdik. NS_LOG ortam değişkenini aşağıdaki gibi ayarlayarak, komut dosyası değişiklikleri ve yeniden derleme olmadan günlük tutma düzeyini artırabilir ve daha fazla bilgi alabiliriz:

$ export NS_LOG=UdpEchoClientApplication=level_all

Böylece sh kabuk değişkeni NS_LOG'u aşağıdaki değere ayarladık:

UdpEchoClientApplication=level_all

Atamanın sol tarafı yapılandırmak istediğimiz kayıtlı bileşenin adı, sağ tarafı ise uygulamak istediğimiz bayraktır. Bu durumda uygulamada tüm hata ayıklama düzeylerini etkinleştireceğiz. Komut dosyasını NS_LOG bu şekilde ayarlanmış şekilde çalıştırırsanız, ns-3 günlük kaydı sistemi değişiklikleri kabul edecek ve aşağıdaki çıktıyı görmelisiniz:

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.404s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
Received 1024 bytes from 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()

Uygulama tarafından sağlanan ek hata ayıklama bilgileri artık NS_LOG_FUNCTION düzeyindedir. Komut dosyasının yürütülmesi sırasında bir işlev çağrısının her örneğini gösterir. Genel bir kural olarak, yöntem fonksiyonlarında (en azından) kullanılması tercih edilir.NS_LOG_FUNCTION (this)... Kullanmak NS_LOG_FUNCTION_NOARGS ()
yalnızca statik işlevlerde. Ancak ns-3 sisteminin herhangi bir günlük kaydı işlevini desteklemesinin gerekli olmadığını unutmayın. Ne kadar bilginin kaydedileceğine ilişkin karar bireysel model geliştiricisine bırakılmıştır. Yankı uygulamaları durumunda, büyük miktarda günlük çıktısı mevcuttur.

Artık uygulama tarafından yapılan işlev çağrılarının günlüğünü görüntüleyebilirsiniz. Yakından bakarsanız çizgi arasında iki nokta üst üste göreceksiniz UdpEchoClientUygulaması ve C++ kapsam operatörünü (: :) görmeyi bekleyebileceğiniz yöntemin adı. Bu kasıtlıdır.

Bu aslında sınıfın adı değil, kayıt bileşeninin adıdır. Kaynak dosya ile sınıf arasında eşleşme olduğunda bu genellikle sınıfın adıdır ancak bunun aslında sınıfın adı olmadığını, çift iki nokta yerine tek iki nokta üst üste olduğunu anlamalısınız. Bu, günlük çekirdeği adını sınıf adından göreceli olarak incelikli bir şekilde kavramsal olarak ayırmanıza yardımcı olacak bir yoldur.

Ancak bazı durumlarda günlük mesajını gerçekte hangi yöntemin oluşturduğunu belirlemek zor olabilir. Yukarıdaki metne baktığınızda "" satırının nerede olduğunu merak ediyor olabilirsiniz.Received 1024 bytes from 10.1.1.2" Seviyeyi ayarlayarak bu sorunu çözebilirsiniz. önek_fonk NS_LOG ortam değişkenine. Takip etmeyi dene:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

VEYA işlemini temsil etmek için kullandığımız dikey çubuğun aynı zamanda bir Unix boru konnektörü olması nedeniyle tırnak işaretlerinin gerekli olduğunu unutmayın. Şimdi betiği çalıştırırsanız, kayıt sisteminin belirli bir günlükteki her mesajın önüne bileşen adının eklenmesini sağladığını göreceksiniz.

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.417s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()

Artık UDP echo istemci uygulamasından gelen tüm mesajların bu şekilde tanımlandığını görebilirsiniz. İleti "Received 1024 bytes from 10.1.1.2" artık açıkça echo client uygulamasından geldiği tanımlanıyor. Geri kalan mesaj UDP yankı sunucusu uygulamasından gelmelidir. Bu bileşeni, NS_LOG ortam değişkenine iki nokta üst üste ayraçlı bir bileşen listesi girerek etkinleştirebiliriz.

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:
               UdpEchoServerApplication=level_all|prefix_func'

Uyarı: Yukarıdaki örnek metinde, iki nokta üst üste (:) sonrasındaki yeni satır karakterini kaldırmanız gerekecektir; bu karakter, belgeyi biçimlendirmek için kullanılır. Şimdi betiği çalıştırırsanız, istemci ve sunucu yankı uygulamalarından gelen tüm günlük mesajlarını göreceksiniz. Hata ayıklama sırasında bunun çok yararlı olabileceğini görebilirsiniz.

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.406s)
UdpEchoServerApplication:UdpEchoServer()
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoServerApplication:StartApplication()
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
UdpEchoServerApplication:HandleRead(): Echoing packet
UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
UdpEchoServerApplication:StopApplication()
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Günlük mesajının oluşturulduğu simülasyon zamanını görebilmek de bazen yararlı olabilir. OR bitini ekleyerek bunu yapabilirsiniz. önek_zaman:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time: UdpEchoServerApplication=level_all|prefix_func|prefix_time'

Yine yukarıdaki yeni satır karakterini kaldırmanız gerekecek. Eğer betiği şimdi çalıştırırsanız aşağıdaki çıktıyı görmelisiniz:

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s)
0s UdpEchoServerApplication:UdpEchoServer()
0s UdpEchoClientApplication:UdpEchoClient()
0s UdpEchoClientApplication:SetDataSize(1024)
1s UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2s UdpEchoClientApplication:Send()
2s UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Lütfen şunu unutmayın: UdpEchoSunucusu Simülasyon sırasında 0 saniye çağrıldı. Bu aslında simülasyon başlamadan önce gerçekleşir, ancak süre sıfır saniye olarak gösterilir. Aynı şey yapıcı mesajı için de geçerlidir UdpEchoClient.

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s)
0s UdpEchoServerApplication:UdpEchoServer()
0s UdpEchoClientApplication:UdpEchoClient()
0s UdpEchoClientApplication:SetDataSize(1024)
1s UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2s UdpEchoClientApplication:Send()
2s UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

Senaryoyu hatırlayın çizik/ilk.cc simülasyonun başlamasından bir saniye önce echo sunucusu uygulamasını başlattı. Şimdi yöntemi görebilirsiniz Uygulamaya Başla sunucu aslında ilk saniyede çağrılır. Ayrıca scriptte istediğimiz gibi echo client'ın simülasyonun ikinci saniyesinde başladığını da fark edebilirsiniz.

Artık arama sırasında simülasyonun ilerlemesini takip edebilirsiniz Programİletimi echo sunucusu uygulamasında HandleRead geri aramasını gönderen istemcide. Noktadan noktaya bağlantı üzerinden paket göndermek için geçen sürenin 3,69 milisaniye olduğunu unutmayın. Yankı sunucusunun pakete yanıt verdiğini belirten bir mesajı günlüğe kaydettiğini ve ardından bir kanal gecikmesinden sonra yankı istemcisinin yankı paketini HandleRead yöntemiyle aldığını görebilirsiniz.

Bu simülasyonda siz farkına varmadan pek çok şey oluyor. Ancak sistemdeki tüm loglama bileşenlerini etkinleştirerek tüm süreci çok kolay bir şekilde takip edebilirsiniz. NS_LOG değişkenini aşağıdaki değere ayarlamayı deneyin,

$ export 'NS_LOG=*=level_all|prefix_func|prefix_time'

Yukarıdaki yıldız işareti, günlük kaydı bileşeni için bir joker karakterdir. Bu, simülasyonda kullanılan tüm bileşenlerdeki tüm girişleri içerecektir. Çıktıyı burada çoğaltmayacağım (yazma sırasında tek bir yankı paketi için 1265 satırlık çıktı üretir), ancak bu bilgiyi bir dosyaya yönlendirebilir ve favori düzenleyicinizde görüntüleyebilirsiniz.

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

Bir sorunum olduğunda ve işlerin nerede ters gittiğine dair hiçbir fikrim olmadığında, günlük kaydının bu son derece ayrıntılı sürümünü kişisel olarak kullanıyorum. Kesme noktalarını ayarlamadan ve hata ayıklayıcıdaki kodun üzerinden geçmeden kod yürütme işlemini oldukça kolay bir şekilde takip edebiliyorum. Çıktıyı en sevdiğim düzenleyicide düzenleyebilir ve beklediğim şeyi arayabilir ve beklemediğim bir şeyin gerçekleştiğini görebilirim. Neyin yanlış gittiğine dair genel bir fikrim olduğunda, sorunu derinlemesine incelemek için hata ayıklayıcıya atlarım. Bu tür bir çıktı, özellikle komut dosyanız tamamen beklenmedik bir şey yaptığında yararlı olabilir. Yalnızca hata ayıklayıcıyı kullanırsanız, bir değişikliği tamamen kaçırabilirsiniz. Kayıt, bu tür dönüşleri fark edilir hale getirir.

5.1.3 Kodunuza günlük ekleme

Log bileşenine birden fazla makrodan çağrı yaparak simülasyonlarınıza yeni girişler ekleyebilirsiniz. Bunu bir senaryoda yapalım benim ilk.cc"temiz" dizinde bulunan . Bu senaryoda bir günlük kaydı bileşeni tanımladığımızı hatırlayın:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

NS_LOG ortam değişkenini farklı düzeylerde ayarlayarak bu bileşenden gelen tüm mesajların günlüğe kaydedilmesini etkinleştirebileceğinizin farkındasınız. Devam edelim ve betiğe bazı girişler ekleyelim. Günlüğe bilgi düzeyi mesajları eklemek için kullanılan makro NS_LOG_INFO'dur. Betiğin "Topoloji Oluşturma" aşamasında olduğunu bildiren bir mesaj ekleyelim (düğüm oluşturmaya başlamadan hemen önce). Bu, aşağıdaki kod parçacığında yapılır,
çizik/ilk.cc favori düzenleyicinizde ve satırı ekleyin,
NS_LOG_INFO ("Creating Topology");
satırların hemen önünde,

NodeContainer nodes;
nodes.Create (2);

Şimdi betiği kullanarak derleyin WAF, ve daha önce etkinleştirdiğimiz günlük akışını devre dışı bırakmak için NS_LOG değişkenini temizleyin:

$ ./waf
$ export NS_LOG=
Теперь, если вы запустите скрипт,
$ ./waf --run scratch/myfirst

İlişkili günlük kaydı bileşeni (FirstScriptExample) etkinleştirilmediğinden yeni mesajı görmezsiniz. Mesajınızı görmek için günlük kaydı bileşenini etkinleştirmeniz gerekir FirstScriptÖrneği NS_LOG_INFO'dan düşük olmayan bir düzeyde. Yalnızca bu spesifik günlük kaydı düzeyini görmek istiyorsanız, bunu şu şekilde etkinleştirebilirsiniz:

$ export NS_LOG=FirstScriptExample=info

Komut dosyasını şimdi çalıştırırsanız, yeni bir "Topoloji Oluşturuluyor" mesajını göreceksiniz,

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

5.2 Komut satırı bağımsız değişkenlerini kullanma

5.2.1 Varsayılan özellik değerlerinin geçersiz kılınması

Ns-3 komut dosyalarının davranışını düzenlemeden veya oluşturmadan değiştirmenin başka bir yolu da komut satırı argümanlarını kullanmaktır. Komut satırı bağımsız değişkenlerini ayrıştırmak ve sonuçlara göre yerel ve genel değişkenleri otomatik olarak ayarlamak için bir mekanizma sağlıyoruz.

Komut satırı argüman sistemini kullanmanın ilk adımı bir komut satırı ayrıştırıcısı bildirmektir. Aşağıdaki kodda olduğu gibi bunu yapmak oldukça kolaydır (ana programınızda),

int
main (int argc, char *argv[])
{
...
CommandLine cmd;
cmd.Parse (argc, argv);
...
}

Bu basit iki satırlık kod parçası aslında kendi başına çok faydalıdır. ns-3 global değişken ve öznitelik sisteminin kapısını açar. Ana script fonksiyonunun başına iki satır kod ekleyelim çizik/ilk.cc. Devam edersek scripti derleyip çalıştırıyoruz, çalıştırırken aşağıdaki gibi yardım isteğinde bulunuyoruz,

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

Bu komut soracak WAF betiği çalıştır çizik/ilk ve ona bir komut satırı argümanı iletin —PrintHelp. Argümanın hangi programa yönelik olduğunu belirtmek için tırnak işaretleri gereklidir. Komut satırı ayrıştırıcısı argümanı algılayacaktır —PrintHelp ve cevabı gösterecek,

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.413s)
TcpL4Protocol:TcpStateMachine()
CommandLine:HandleArgument(): Handle arg name=PrintHelp value=
--PrintHelp: Print this help message.
--PrintGroups: Print the list of groups.
--PrintTypeIds: Print all TypeIds.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintGlobals: Print the list of globals.

Şimdi seçeneğe bakalım —PrintAttributes. First.cc betiğini incelerken ns-3 öznitelik sisteminden zaten bahsetmiştik. Aşağıdaki kod satırlarını gördük,

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

ve bunu söylediler Veri hızı aslında bir özellik PointToPointNetCihaz. Nitelikleri görüntülemek için komut satırı argüman ayrıştırıcısını kullanalım PointToPointNetCihaz. Yardım listesi ne sağlamamız gerektiğini söylüyor TipKimliği. Bu, ilgilenilen niteliklerin ait olduğu sınıfın adıdır. Bizim durumumuzda olacak ns3::PointToPointNetDevice. İlerlemeye devam edelim, girin,

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

Sistem bu ağ cihazı türünün tüm özelliklerini yazdıracaktır. Listedeki özellikler arasında şunları göreceksiniz:

--ns3::PointToPointNetDevice::DataRate=[32768bps]:
The default data rate for point to point links

Bu, nesneyi oluştururken sistem tarafından kullanılacak varsayılan değerdir. PointToPointNetCihaz. Parametreyi kullanarak bu varsayılan değeri geçersiz kılacağız özellik в Noktadan NoktayaYardımcı daha yüksek. Noktadan noktaya cihazlar ve kanallar için varsayılan değerleri kullanalım. Bunu yapmak için çağrıları sileceğiz Cihaz Özniteliğini Ayarla и SetChannelÖzelliği arasında benim ilk.cctemiz bir dizinde bulunan .

Komut dosyanız artık basitçe beyan etmelidir Noktadan NoktayaYardımcı ve aşağıdaki örnekte gösterildiği gibi herhangi bir kurulum işlemi yapmayın,

...
NodeContainer nodes;
nodes.Create (2);
PointToPointHelper pointToPoint;
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);
...

Devam edin ve şununla yeni bir komut dosyası oluşturun: WAF (./waff) ve geri dönüp UDP yankı sunucusu uygulamasından bazı girişleri ve zaman önekini ekleyelim.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

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

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.405s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.25732s Received 1024 bytes from 10.1.1.1
2.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Simülasyon zamanına en son baktığımızda, paketin echo sunucusuna ulaştığı andaki sürenin 2,00369 saniye olduğunu hatırlayın.

2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1

Artık paketi 2.25732 saniyede alıyor. Bunun nedeni, PointToPointNetDevice veri hızını saniyede beş megabitten varsayılan değer olan saniyede 32768 bit'e sıfırlamamızdır. Komut satırını kullanarak yeni bir DataRate koyarsak simülasyonumuzu yeniden hızlandırabiliriz. Bunu help öğesinin ima ettiği formüle göre şu şekilde yapacağız:

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

Bu, DataRate niteliğini varsayılan değeri olan saniyede beş megabite döndürecektir. Sonuç sizi şaşırttı mı? Komut dosyasının orijinal davranışını geri döndürmek için kanal gecikmesini de ışık hızına uyacak şekilde ayarlamamız gerektiği ortaya çıktı. Tıpkı ağ cihazında yaptığımız gibi, komut satırı sisteminden kanal niteliklerini yazdırmasını isteyebiliriz:

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

Kanal gecikme özelliğinin aşağıdaki gibi ayarlandığını göreceğiz:

--ns3::PointToPointChannel::Delay=[0ns]:
Transmission delay through the channel

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

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

bu durumda, komut dosyasında DataRate ve Delay'i açıkça ayarladığımızda sahip olduğumuz süreyi geri yükleriz:

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.417s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.00369s Received 1024 bytes from 10.1.1.1
2.00369s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Paketin sunucu tarafından 2,00369 saniye sonra tekrar alındığını unutmayın. Aslında komut dosyasında kullanılan niteliklerin herhangi birini bu şekilde ayarlayabiliriz. Özellikle MaxPackets niteliklerini tek olmayan değerlere ayarlayabiliriz UdpEchoClient.

Bunu nasıl kullanırdın? Bir şans ver. Varsayılan öznitelik değerini geçersiz kıldığımız ve açıkça ayarladığımız yeri açıklamanız gerektiğini unutmayın. Maksimum Paketler senaryoda. Daha sonra betiği yeniden oluşturmanız gerekir. Yeni bir varsayılan öznitelik değeri ayarlamak amacıyla sözdizimi yardımı almak için komut satırını da kullanabilirsiniz. Bunu anladıktan sonra komut satırında görüntülenen paket sayısını kontrol edebilirsiniz. Çalışkan insanlar olduğumuz için komut satırımız şöyle görünmeli:

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

Bu noktada ortaya çıkan doğal soru, tüm bu niteliklerin varlığının nasıl bilineceğidir. Yine komut satırı sisteminin bu konuda bir yardım fonksiyonu bulunmaktadır. Komut satırından yardım istersek şunları görmeliyiz:

$ ./waf --run "scratch/myfirst --PrintHelp"
myfirst [Program Arguments] [General Arguments]
General Arguments:
--PrintGlobals: Print the list of globals.
--PrintGroups: Print the list of groups.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintTypeIds: Print all TypeIds.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintHelp: Print this help message.

"Grupları Yazdır" bağımsız değişkenini seçerseniz tüm kayıtlı grupların bir listesini görmelisiniz TipKimliği. Grup adları, kaynak dizindeki modüllerin adlarıyla tutarlıdır (büyük harfle yazılmış olsa da). Tüm bilgilerin bir kerede yazdırılması çok hacimli olacağından, bilgileri gruba göre yazdırmak için ek bir filtre mevcuttur. Yani, yine noktadan noktaya modüle odaklanıyoruz:

./waf --run "scratch/myfirst --PrintGroup=PointToPoint"
TypeIds in group PointToPoint:
ns3::PointToPointChannel
ns3::PointToPointNetDevice
ns3::PointToPointRemoteChannel
ns3::PppHeader

Burada, öznitelik aramaları için kullanılabilir TypeId adlarını bulabilirsiniz; örneğin
--PrintAttributes = ns3 :: PointToPointChannelYukarıda gösterildiği gibi.

Nitelikler hakkında bilgi edinmenin başka bir yolu da Doxygen ns‑3'tür. Simülatörde kayıtlı tüm nitelikleri listeleyen bir sayfa vardır.

5.2.2 Kendi komutlarınızı yakalamak

Komut satırı sistemi aracılığıyla kendi kancalarınızı da ekleyebilirsiniz. Bu oldukça basit bir şekilde komut satırı ayrıştırıcı yöntemi kullanılarak yapılır. Değer katmak.
Görüntülenecek paket sayısını tamamen farklı bir şekilde belirtmek için bu özelliği kullanalım. adında yerel bir değişken ekleyelim. nPaketler bir fonksiyona ana. Önceki varsayılan davranışımıza uyacak şekilde bunu bire ayarlayacağız. Komut satırı ayrıştırıcısının bu değeri değiştirmesine izin vermek için bu değeri ayrıştırıcıda yakalamamız gerekir. Bunu bir çağrı ekleyerek yapıyoruz Değer katmak. Git ve senaryoyu değiştir çizik/ilk.cc aşağıdaki kodla başlamak için,

int
main (int argc, char *argv[])
{
uint32_t nPackets = 1;
CommandLine cmd;
cmd.AddValue("nPackets", "Number of packets to echo", nPackets);
cmd.Parse (argc, argv);
...

Betikte MaxPackets niteliğini ayarladığımız noktaya doğru aşağı kaydırın ve aşağıda gösterildiği gibi sabit 1 yerine nPackets değişkenine ayarlanacak şekilde değiştirin.

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

Şimdi betiği çalıştırırsanız ve -PrintHelp argümanını sağlarsanız, yeni kullanıcı argümanını görmelisiniz. yardım ekranında listelenir. Girmek,

$ ./waf --run "scratch/myfirst --PrintHelp"
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.403s)
--PrintHelp: Print this help message.
--PrintGroups: Print the list of groups.
--PrintTypeIds: Print all TypeIds.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintGlobals: Print the list of globals.
User Arguments:
--nPackets: Number of packets to echo

İletilen paketlerin sayısını değiştirmek istiyorsanız bunu komut satırı argümanını -- -nPackets ayarlayarak yapabilirsiniz.

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

Şimdi şimdi görmelisin

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.404s)
0s UdpEchoServerApplication:UdpEchoServer()
1s UdpEchoServerApplication:StartApplication()
Sent 1024 bytes to 10.1.1.2
2.25732s Received 1024 bytes from 10.1.1.1
2.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
Sent 1024 bytes to 10.1.1.2
3.25732s Received 1024 bytes from 10.1.1.1
3.25732s Echoing packet
Received 1024 bytes from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

Şimdi iki paket gönderdiniz. Oldukça basit, değil mi?
Bir ns-3 kullanıcısı olarak, global değerleri ve nitelikleri değiştirmek için komut satırı argüman sistemini kullanabileceğinizi görebilirsiniz. Model yazarıysanız, nesnelerinize yeni nitelikler ekleyebilirsiniz ve bunlar, komut satırı sistemi aracılığıyla kullanıcılarınız tarafından otomatik olarak yapılandırmaya hazır olacaktır. Bir komut dosyası yazarıysanız, komut dosyalarınıza yeni değişkenler ekleyebilir ve bunları komut satırı sisteminize sorunsuz bir şekilde bağlayabilirsiniz.

5.3 İzleme sisteminin kullanılması

Modellemenin tüm amacı daha ileri çalışmalar için çıktı üretmektir ve ns-3 izleme sistemi bunun ana mekanizmasıdır. ns-3 bir C++ programı olduğundan, bir C++ programından çıktı üretmenin standart yolları kullanılabilir:

#include <iostream>
...
int main ()
{
...
std::cout << "The value of x is " << x << std::endl;
...
}

Çözümünüze küçük bir yapı eklemek için bir kayıt modülünü bile kullanabilirsiniz. Bu yaklaşımın neden olduğu bilinen birçok sorun vardır ve bu nedenle bu sorunları çözmek için genel bir olay izleme alt sistemi sağladık.

ns-3 izleme sisteminin ana hedefleri şunlardır:

  • Temel görevler için izleme sistemi, kullanıcının popüler kaynaklar için standart bir izleme oluşturmasına ve izlemeyi oluşturan nesneleri seçmesine olanak sağlamalıdır;

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

  • İleri düzey kullanıcılar, yeni izleme kaynakları ve havuzlar eklemek için simülatör çekirdeğini değiştirebilir. Ns-3 izleme sistemi, bağımsız izleme kaynakları ve alıcılarının yanı sıra kaynakları tüketicilere bağlamak için birleşik bir mekanizma ilkeleri üzerine kurulmuştur.

ns-3 izleme sistemi, bağımsız izleme kaynakları ve alıcıların yanı sıra kaynakları alıcılara bağlamak için birleşik bir mekanizma ilkeleri üzerine kurulmuştur. İzleme kaynakları, simülasyonda meydana gelen olayları işaret edebilen ve ilgilenilen temel verilere erişim sağlayabilen nesnelerdir. Örneğin bir izleme kaynağı, bir ağ cihazının ne zaman bir paket aldığını gösterebilir ve paketin içeriğini ilgili izleme alıcılarının kullanımına sunabilir.

İzleme kaynakları, havuzun sağladığı bilgilerle gerçekten yararlı bir şeyler yapan kodun diğer bölümleriyle "bağlanmadıkları" sürece, kendi başlarına işe yaramazlar. İzleyiciler, izleme kaynakları tarafından sağlanan olayların ve verilerin tüketicileridir. Örneğin, alınan paketteki ilgilenilen kısımların çıktısını alacak (önceki örneğin izleme kaynağına bağlandığında) bir izleme havuzu oluşturabilirsiniz.

Bu açık ayrımın mantığı, kullanıcıların simülatör çekirdeğini düzenlemeye ve yeniden derlemeye gerek kalmadan yeni havuz türlerini mevcut izleme kaynaklarına bağlamasına olanak sağlamaktır. Yani yukarıdaki örnekte kullanıcı, kendi komut dosyasında yeni bir izleyici tanımlayabilir ve bunu yalnızca kullanıcı komut dosyasını düzenleyerek simülasyon çekirdeğinde tanımlanan mevcut bir izleme kaynağına bağlayabilir.

Bu eğitimde, önceden tanımlanmış bazı kaynakları ve havuzları inceleyeceğiz ve bunların kullanıcı açısından en az çabayla nasıl yapılandırılabileceğini göstereceğiz. İzleme ad alanını genişletme ve yeni izleme kaynakları oluşturma da dahil olmak üzere gelişmiş izleme yapılandırması hakkında bilgi için ns-3 Kılavuzuna veya nasıl yapılır bölümlerine bakın.

5.3.1 ASCII İzleme

ns-3, basit paket izlemeleri ayarlarken ayrıntılar konusunda size yardımcı olacak düşük düzeyli bir izleme sistemi sağlayan yardımcı işlevsellik sağlar. Bu özelliği etkinleştirirseniz çıktıyı ASCII dosyalarında göreceksiniz. Ns-2 çıktısına aşina olanlar için bu tür izleme şuna benzer: çıkış.tr, birçok komut dosyası tarafından oluşturulur.

Hadi işimize başlayalım ve Scratch/myfirst.cc betiğimize bazı ASCII izleme sonuçları ekleyelim. Çağrıdan hemen önce Simulator :: Run (), aşağıdaki kod satırlarını ekleyin:
AsciiTraceHelper ascii;

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

Diğer birçok ns-3 deyimi gibi bu kod da ASCII izleri oluşturmak için bir yardımcı nesne kullanır. İkinci satırda iç içe geçmiş iki yöntem çağrısı bulunur. "İçeride" yöntemi CreateFileStream() yığında (nesne adı olmadan) bir dosya akışı nesnesi oluşturmak için anonim nesne deyimini kullanır ve bunu çağrılan yönteme iletir. Gelecekte bu konuya daha derinlemesine gireceğiz, ancak bu noktada bilmeniz gereken tek şey, adı verilen bir dosyayı temsil eden bir nesne oluşturduğunuzdur. ilk.tr ve onu ns-3'e aktarın. ns-3'e, oluşturulan nesnenin tüm kullanım ömrü boyunca bakımını yapmasını emanet ediyoruz; bu süre zarfında, C++ akış nesnesi kopyalama oluşturucularıyla ilişkili az bilinen (kasıtlı) bir sınırlamanın neden olduğu sorunları çözüyor.

Harici arama EnableAsciiAll() Asistana, tüm noktadan noktaya cihaz bağlantıları için simülasyonunuza ASCII izlemeyi dahil etmek istediğinizi ve (belirtilen) izleme alıcılarının paket hareket bilgilerini ASCII formatında kaydetmesini istediğinizi söyler.

Ns-2'ye aşina olanlar için izlenen olaylar, "+", "-", "d" ve "r" olaylarını günlüğe kaydeden bilinen izleme noktalarına eşdeğerdir.
Artık betiği oluşturabilir ve komut satırından çalıştırabilirsiniz:

$ ./waf --run scratch/myfirst

Daha önce birçok kez olduğu gibi, Waf'tan birkaç mesaj göreceksiniz ve ardından çalışan programdan bazı mesajlar ile birlikte "'derleme' başarıyla tamamlandı" ifadesini göreceksiniz.

Program çalıştırıldığında adında bir dosya oluşturacaktır. ilk.tr. İşin doğası gereği WAF, varsayılan olarak dosya yerel dizinde değil, havuzun en üst düzey dizininde oluşturulur. İzlerin kaydedildiği yolu değiştirmek isterseniz bunu belirtmek için Waf parametresini kullanabilirsiniz. --cwd. Bunu yapmadık, bu nedenle favori düzenleyicinizdeki myfirst.tr ASCII izleme dosyasına bakmak için depomuzun en üst düzey dizinine gitmemiz gerekecek.

ASCII izlerini ayrıştırma

Orada oldukça yoğun bir biçimde pek çok bilgi var, ancak dikkat etmeniz gereken ilk şey, dosyanın ayrı ayrı satırlardan oluşmasıdır. Görüntüleme penceresini genişletirseniz bu açıkça görülecektir.

Dosyadaki her satır bir izleme olayına karşılık gelir. Bu durumda simülasyondaki her bir noktadan noktaya ağ cihazında mevcut olan iletim kuyruğundaki olayları izleriz. İletim kuyruğu, noktadan noktaya bağlantı için her paketin geçmesi gereken kuyruktur. İzleme dosyasındaki her satırın tek bir karakterle başladığını (ve sonrasında bir boşluk bulunduğunu) unutmayın. Bu sembolün anlamı şu olacaktır:

+: aygıt kuyruğunda bir sıraya alma işlemi gerçekleşti;
-: aygıt kuyruğunda bir öğe alma işlemi gerçekleşti;
d: paket genellikle kuyruğun dolu olması nedeniyle düşürüldü;
r: Paket bir ağ cihazı tarafından alındı.

İzleme dosyasındaki ilk satıra daha yakından bakalım. Bunu parçalara (netlik sağlamak için girintilerle) ve soldaki satır numarasına ayıracağım:

0 +
1 2
2 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue
3 ns3::PppHeader (
4   Point-to-Point Protocol: IP (0x0021))
6   ns3::Ipv4Header (
7     tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
8     length: 1052 10.1.1.1 > 10.1.1.2)
9     ns3::UdpHeader (
10      length: 1032 49153 > 9)
11      Payload (size=1024)

Bu genişletilmiş izleme olayının ilk bölümü (satır 0) işlemdir. Burada iletim için sıraya alma işlemine karşılık gelen bir + sembolü var. İkinci bölüm (satır 1), saniye cinsinden ifade edilen simülasyon süresidir. Ne sorduğumuzu hatırlayabilirsin UdpEchoClientUygulaması iki saniye içinde paket göndermeye başlayın. Burada bunun gerçekten gerçekleştiğinin onayını görüyoruz.

İzleme örneğinin bir sonraki bölümü (2. satırdan itibaren) bu olayı hangi izleme kaynağının oluşturduğunu gösterir (ad alanı izlemesini gösterir). İzleme ad alanını, dosya sistemi ad alanı gibi düşünebilirsiniz. Ad alanının kökü Düğüm Listesi. Bu, ana ns-3 kodunda yönetilen konteynere karşılık gelir. Komut dosyasında oluşturulan tüm düğümleri içerir. Tıpkı bir dosya sisteminin kökünde dizinlerin bulunabilmesi gibi, Düğüm Listesi birçok düğümümüz olabilir. Dolayısıyla /NodeList/0 satırı, NodeList'teki boş düğümü ifade eder ve bunu genellikle "düğüm 0" olarak düşünürüz. Her düğümde kurulu cihazların bir listesi bulunur. Bu liste ad alanının yanında bulunur. Bu izleme olayının nereden geldiğini görebilirsiniz. Cihaz Listesi/0, düğümde yüklü olan boş aygıttır.

Sonraki alt dize, $ ns3 :: PointToPointNetDevice, hangi cihazın sıfır konumunda olduğunu söyler: sıfır düğümünün cihaz listesi. 0. satırda bulunan + işleminin, aygıtın iletim kuyruğuna bir öğenin eklendiği anlamına geldiğini hatırlayın. Bu, "yol yolunun" son bölümlerine yansır: TxQueue/Sıralama.

İzlemedeki geri kalan bölümler oldukça sezgisel olmalıdır. 3-4. satırlar, paketin noktadan noktaya protokolde kapsüllendiğini gösterir. 5-7. satırlar, paketin bir IP4 sürüm başlığına sahip olduğunu ve IP adresinden kaynaklandığını gösterir. 10.1.1.1 ve için tasarlanmıştır 10.1.1.2. 8-9. satırlar bu paketin bir UDP başlığına sahip olduğunu ve son olarak 10. satır ise yükün beklenen 1024 bayt olduğunu gösteriyor.

İzleme dosyasındaki bir sonraki satır, aynı paketin aynı düğümdeki iletim kuyruğundan çekildiğini gösterir.

İzleme dosyasındaki üçüncü satır, paketin yankı sunucusu ana bilgisayarındaki bir ağ cihazı tarafından alındığını gösterir. Aşağıda olayı tekrarladım.

0 r
1 2.25732
2 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
3   ns3::Ipv4Header (
4     tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
5     length: 1052 10.1.1.1 > 10.1.1.2)
6     ns3::UdpHeader (
7       length: 1032 49153 > 9)
8       Payload (size=1024)

İzleme işleminin artık r olduğunu ve simülasyon süresinin 2,25732 saniyeye çıkarıldığını unutmayın. Öğreticiyi dikkatli bir şekilde takip ettiyseniz bu, ağ cihazlarının DataRate ve Link Delay değerlerini varsayılan değerlerinde bıraktığınız anlamına gelir. Önceki bölümde gördüğünüz gibi bu zaman size tanıdık gelmelidir.

İzleme kaynağı ad alanı girişi (2. satır), bu olayın 1. düğümden kaynaklandığını yansıtacak şekilde değiştirildi (/Düğüm Listesi/1) ve paket izleme kaynağı tarafından alınır (/MacRx). Dosyada kalan izlere bakarak paketin topolojideki hareketini takip etmeniz oldukça kolay olacaktır.

5.3.2 PCAP İzlemesi

Ns-3 Aygıt Yardımcıları, .pcap biçiminde izleme dosyaları oluşturmak için de kullanılabilir. Kısaltma pkap (genellikle küçük harfle yazılır) paket yakalama anlamına gelir ve aslında .pcap dosya formatının tanımlanmasını içeren bir API'dir. Bu formatı okuyabilen ve görüntüleyebilen en popüler program Wireshark (daha önce deniyordu ruhani). Ancak bu paket formatını kullanan birçok trafik izleme analizörü vardır. Kullanıcıları, pcap izlerini analiz etmek için mevcut birçok aracı kullanmaya teşvik ediyoruz. Bu derste pcap izlerini aşağıdakileri kullanarak görüntülemeye odaklanacağız: tcp dökümü.

Pcap izlemenin etkinleştirilmesi tek satır kodla yapılır.

pointToPoint.EnablePcapAll ("myfirst");

Bu kod satırını az önce eklediğimiz ASCII izleme kodunun sonrasına yapıştırın çizik/ilk.cc. "myfirst.pcap" veya benzeri bir şeyi değil, yalnızca "myfirst" dizesini ilettiğimizi unutmayın. Bunun nedeni, parametrenin tam dosya adı değil, bir önek olmasıdır. Simülasyon sırasında asistan aslında her noktadan noktaya cihaz için bir izleme dosyası oluşturacaktır. Dosya adları önek, düğüm numarası, cihaz numarası ve ".son eki" kullanılarak oluşturulacaktır.pkap'.

Örnek betiğimiz için " adlı dosyaları göreceğizbenim ilk-0-0.pcap"Ve"benim ilk-1-0.pcap", bunlar sırasıyla düğüm 0-aygıt 0 ve düğüm 1-aygıt 0 için pcap izleridir. Pcap izlemeyi etkinleştirmek için kod satırını ekledikten sonra betiği her zamanki gibi çalıştırabilirsiniz:

$ ./waf --run scratch/myfirst

Dağıtımınızın üst düzey dizinine bakarsanız üç dosya görmelisiniz: bir ASCII izleme dosyası ilk.trdaha önce incelediğimiz dosyalar benim ilk-0-0.pcap и benim ilk-1-0.pcap - az önce oluşturduğumuz yeni pcap dosyaları.

Tcpdump ile çıktıyı okuma

Şimdilik pcap dosyalarını görüntülemenin en kolay yolu tcpdump kullanmaktır.

$ tcpdump -nn -tt -r myfirst-0-0.pcap
reading from file myfirst-0-0.pcap, link-type PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024
tcpdump -nn -tt -r myfirst-1-0.pcap
reading from file myfirst-1-0.pcap, link-type PPP (PPP)
2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024

Çöplükte benim ilk-0-0.pcap (istemci cihazı) simülasyondan 2 saniye sonra yankı paketinin gönderildiğini görebilirsiniz. İkinci çöplüğe bakarsanız (benim ilk-1-0.pcap), paketin 2,257324 saniyede alındığını göreceksiniz. İkinci dökümde paketin 2.257324 saniyede döndüğünü ve son olarak ilk dökümde paketin istemci tarafından 2.514648 saniyede geri alındığını göreceksiniz.

Wireshark ile Çıktı Okuma

Eğer aşina değilseniz Wireshark, programları ve belgeleri indirebileceğiniz bir web sitesi var: http://www.wireshark.org/. Wireshark bu izleme dosyalarını görüntülemek için kullanılabilecek bir GUI'dir. Wireshark'ınız varsa, izleme dosyalarından herhangi birini açabilir ve sanki paketleri bir paket algılayıcı kullanarak yakalamışsınız gibi içerikleri görüntüleyebilirsiniz.

Kaynak: habr.com

Yorum ekle