ns-3 የአውታረ መረብ ማስመሰያ አጋዥ ስልጠና። ምዕራፍ 5

ns-3 የአውታረ መረብ ማስመሰያ አጋዥ ስልጠና። ምዕራፍ 5
ምዕራፍ 1,2
ምዕራፍ 3
ምዕራፍ 4

5 አቀማመጥ
5.1 የመግቢያ ሞጁሉን በመጠቀም
5.1.1 የመግቢያ አጠቃላይ እይታ
5.1.2 መግባትን አንቃ
5.1.3 ወደ ኮድዎ መግባትን ማከል
5.2 የትእዛዝ መስመር ግቤቶችን በመጠቀም
5.2.1 ነባሪ የባህሪ እሴቶችን መሻር
5.2.2 የራስዎን ትዕዛዞች በመያዝ ላይ
5.3 የመከታተያ ስርዓቱን መጠቀም
5.3.1 ASCII መከታተል
የ ASCII ዱካዎችን በመተንተን ላይ
5.3.2 PCAP መከታተያ

ምዕራፍ 5

በደንብ ማድረግ

5.1 የመግቢያ ሞጁሉን በመጠቀም

ስክሪፕቱን በመመልከት የ ns-3 ሎግ ሞጁሉን በአጭሩ ሸፍነናል። መጀመሪያ.cc. በዚህ ምእራፍ ውስጥ፣ ለሎግ ንኡስ ስርዓት ሊጠቀሙባቸው የሚችሉ ጉዳዮችን ጠለቅ ብለን እንመለከታለን።

5.1.1 የመግቢያ አጠቃላይ እይታ

ብዙ ትላልቅ ሲስተሞች አንዳንድ ዓይነት የመልእክት መመዝገቢያ ተቋማትን ይደግፋሉ፣ እና ns-3 ከዚህ የተለየ አይደለም። በአንዳንድ አጋጣሚዎች የስህተት መልዕክቶች ብቻ ወደ "ኦፕሬተር ኮንሶል" (በአብዛኛው በዩኒክስ ላይ በተመሰረቱ ስርዓቶች ላይ stderr ነው) ይፃፋሉ. በሌሎች ስርዓቶች ላይ የማስጠንቀቂያ መልእክቶች እና የበለጠ ዝርዝር መረጃ ሊታዩ ይችላሉ። በአንዳንድ አጋጣሚዎች ሎገሮች ውጤቱን በፍጥነት ሊያደበዝዙ የሚችሉ የማረም መልዕክቶችን ለማተም ያገለግላሉ።

በ ns-3 ውስጥ ጥቅም ላይ የዋለው ንኡስ ቺፕ እነዚህ ሁሉ የመረጃ ደረጃዎች ጠቃሚ ናቸው ብሎ ይገምታል፣ እና ለመልእክት ምዝግብ ማስታወሻ የተመረጠ፣ የተደራረበ አቀራረብ እናቀርባለን። ምዝግብ ማስታወሻ ሙሉ ለሙሉ ሊሰናከል፣ ለግለሰብ አካላት ሊነቃ ወይም በዓለም አቀፍ ደረጃ ሊሆን ይችላል። ለዚህም, ሊበጁ የሚችሉ የመረጃ ይዘት ደረጃዎች ጥቅም ላይ ይውላሉ. የ ns-3 ሎግ ሞጁል ከእርስዎ ማስመሰል ጠቃሚ መረጃ ለማግኘት በአንፃራዊነት ቀላል መንገድን ይሰጣል።

ከሞዴሎችዎ ውስጥ መረጃን ለማውጣት አጠቃላይ ዓላማ ዘዴን - ፍለጋን - እንደምናቀርብ መረዳት አለቦት ፣ ይህም ሞዴል በሚሠራበት ጊዜ ተመራጭ ውፅዓት መሆን አለበት (ስለ እኛ ፍለጋ ስርዓት የበለጠ መረጃ ፣ አጋዥ ስልጠና ክፍል 5.3 ይመልከቱ)። የማረሚያ መረጃን፣ ማስጠንቀቂያዎችን፣ የስህተት መልዕክቶችን ለማግኘት ወይም በማንኛውም ጊዜ ከእርስዎ ስክሪፕቶች ወይም ሞዴሎች መልዕክቶችን በፍጥነት ለማውጣት መግባቱ ተመራጭ ዘዴ መሆን አለበት።

በአሁኑ ጊዜ ስርዓቱ ሰባት ደረጃዎችን (አይነቶችን) የምዝግብ ማስታወሻዎችን በመረጃ አሰጣጥ ቅደም ተከተል ይገልፃል።

  • LOG_ERROR የምዝግብ ማስታወሻ የስህተት መልዕክቶች (ተያያዥ ማክሮ፡ NS_LOG_ERROR)
  • LOG_WARN የምዝግብ ማስታወሻ መልእክቶች (ተያያዥ ማክሮ፡ NS_LOG_WARN)
  • LOG_DEBUG በአንፃራዊነት ብርቅዬ የሆኑ ልዩ የማረም መልዕክቶችን ይመዝገቡ (ተያያዥ ማክሮ፡ NS_LOG_DEBUG)
  • LOG_INFO - ሾለ ፕሮግራሙ ሂደት የመረጃ መልዕክቶች ምዝገባ (ተያያዥ ማክሮ: NS_LOG_INFO);
  • LOG_FUNCTION የተጠራውን እያንዳንዱን ተግባር የሚገልጹ የምዝገባ መልእክቶች (ሁለት ተዛማጅ ማክሮዎች፡ NS_LOG_FUNCTION ለአባላት ተግባራት እና NS_LOG_FUNCTION_NOARGS ለስታቲክ ተግባራት ጥቅም ላይ ይውላሉ)
  • LOG_LOGIC - በተግባሩ ውስጥ ያለውን አመክንዮአዊ ፍሰት የሚገልጹ የመግቢያ መልዕክቶች (ተያያዥ ማክሮ፡ NS_LOG_LOGIC);
  • LOG_ALL - ከላይ የተጠቀሰውን ሁሉ በመመዝገብ ላይ (ምንም ተዛማጅ ማክሮ የለም)።
    ለእያንዳንዱ ዓይነት (LOG_TYPE) እንዲሁ LOG_LEVEL_TYPE አለ ይህም ጥቅም ላይ ከዋለ ከሱ በላይ ያሉት ሁሉም ደረጃዎች ከራሳቸው ደረጃ በተጨማሪ እንዲመዘገቡ ያስችላቸዋል። (በዚህም ምክንያት LOG_ERROR እና LOG_LEVEL_ERROR እና LOG_ALL እና LOG_LEVEL_ALL በተግባር አቻ ናቸው። G_ERROR ማክሮዎች።

እንዲሁም የምዝግብ ማስታወሻው ደረጃ ወይም አካል ምርጫ ምንም ይሁን ምን ሁልጊዜ የሚታይ ቅድመ ሁኔታ የሌለው የሎግ ማክሮ እናቀርባለን።

  • NS_LOG_UNCOND ተዛማጅ መልእክት ያለ ቅድመ ሁኔታ መግባት (ምንም ተዛማጅ የምዝግብ ማስታወሻ ደረጃ የለም)።

እያንዳንዱ ደረጃ በተናጥል ወይም በድምር ሊጠየቅ ይችላል። ምዝግብ ማስታወሻ የ NS_LOG sh አካባቢ ተለዋዋጭን በመጠቀም ወይም የስርዓት ተግባር ጥሪን በማስገባት ሊዋቀር ይችላል። ቀደም ሲል እንደታየው የምዝግብ ማስታወሻ ስርዓቱ Doxygen ሰነድ አለው እና አሁን ካላደረጉት ለመገምገም ጥሩ ጊዜ ነው።

አሁን ሰነዶቹን በዝርዝር ካነበቡ በኋላ፣ ይህን እውቀት ከምሳሌው ስክሪፕት አንዳንድ አስደሳች መረጃዎችን ለማግኘት እንጠቀምበት። scratch/myfirst.ccአስቀድመህ ያጠናቀረው.

5.1.2 መግባትን አንቃ

አንዳንድ ተጨማሪ ምዝግብ ማስታወሻዎችን ለመጀመር የNS_LOG አካባቢ ተለዋዋጭን እንጠቀም፣ ነገር ግን መጀመሪያ፣ ጥቅማችንን ለማግኘት፣ ልክ እንደበፊቱ የመጨረሻውን ስክሪፕት አስሂድ፣

$ ./waf --run scratch/myfirst

የመጀመሪያውን ns-3 ምሳሌ ፕሮግራም የሚታወቀውን ውጤት ማየት አለብህ

$ 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

ከላይ የምታያቸው "የተላከ" እና "የተቀበሉት" መልእክቶች በትክክል የተመዘገቡት መልእክቶች ናቸው። UdpEchoClient መተግበሪያ и UdpEchoServer መተግበሪያ. ለምሳሌ፣ የደንበኛ አፕሊኬሽኑ የመግቢያ ደረጃውን በNS_LOG አካባቢ ተለዋዋጭ በማዘጋጀት ተጨማሪ መረጃ እንዲያትም ልንጠይቀው እንችላለን።

ከአሁን ጀምሮ፣ “VARIABLE=value” የሚለውን አገባብ የሚጠቀም sh-like ሼል እየተጠቀሙ እንደሆነ እገምታለሁ። csh የሚመስል ሼል እየተጠቀሙ ከሆነ፣ የእኔን ምሳሌዎች በእነዚያ ዛጎሎች ወደሚፈልጉት የ"setenv ተለዋዋጭ እሴት" አገባብ መቀየር አለቦት።

በአሁኑ ጊዜ የUDP ማሚቶ ደንበኛ መተግበሪያ ለሚከተለው የኮድ መስመር ምላሽ ይሰጣል scratch/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

የLOG_LEVEL_INFO መግቢያ ደረጃን ያንቀሳቅሰዋል። የምዝግብ ማስታወሻ ደረጃን ስናልፍ፣ ያንን ደረጃ እና ሁሉንም ዝቅተኛ ደረጃዎችን እናነቃለን። በዚህ አጋጣሚ፣ NS_LOG_INFO፣ NS_LOG_DEBUG፣ NS_LOG_WARN እና NS_LOG_ERRORን አካተናል። የ NS_LOG አካባቢን ተለዋዋጭ እንደሚከተለው በማዘጋጀት ስክሪፕቱን ሳንቀይር እና እንደገና ሳናጠናቅር የምዝግብ ማስታወሻ ደረጃን ማሳደግ እና ተጨማሪ መረጃ ማግኘት እንችላለን።

$ export NS_LOG=UdpEchoClientApplication=level_all

የ sh-shellን NS_LOG ተለዋዋጭ ወደሚከተለው እሴት የምናዘጋጀው በዚህ መንገድ ነው።

UdpEchoClientApplication=level_all

የምደባው የግራ ጎን ልናዋቅረው የምንፈልገው የተቀዳ ባቄላ ስም ሲሆን በቀኝ በኩል ደግሞ ልንጠቀምበት የምንፈልገው ባንዲራ ነው። በዚህ አጋጣሚ በመተግበሪያው ውስጥ ሁሉንም የማረም ደረጃዎችን እናነቃለን። ስክሪፕቱን በ NS_LOG በዚህ መንገድ ካስኬዱት፣ ns-3 የምዝግብ ማስታወሻ ስርዓቱ ለውጦቹን ይቀበላል እና የሚከተለውን ውጤት ማየት አለብዎት።

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()

በመተግበሪያው የቀረበው ተጨማሪ የማረም መረጃ አሁን ከNS_LOG_FUNCTION ደረጃ ጋር ይዛመዳል። በስክሪፕት አፈጻጸም ወቅት እያንዳንዱን የተግባር ጥሪ ያሳያል። እንደ አንድ ደንብ ፣ በዘዴ ተግባራት ውስጥ (ቢያንስ) መጠቀም ተመራጭ ነው ።NS_LOG_FUNCTION (this)... ይጠቀሙ NS_LOG_FUNCTION_NOARGS ()
በቋሚ ተግባራት ውስጥ ብቻ. ነገር ግን፣ የ ns-3 ስርዓት ማንኛውንም የምዝግብ ማስታወሻ ተግባርን ለመደገፍ አያስፈልግም። ምን ያህል መረጃ እንደሚመዘገብ ውሳኔው የሚወሰነው በግለሰብ ሞዴል ነው. በ echo አፕሊኬሽኖች ውስጥ ከፍተኛ መጠን ያለው የመግቢያ ውፅዓት ይገኛል።

አሁን በመተግበሪያው የተደረጉ የተግባር ጥሪዎችን መዝገብ ማየት ይችላሉ። በቅርበት ከተመለከቱ በመስመሩ መካከል አንድ ኮሎን ያያሉ። UdpEchoClient መተግበሪያ እና የ C ++ ወሰን ኦፕሬተር (::) ለማየት የሚጠብቁበት ዘዴ ስም. ይህ የሚደረገው ሆን ተብሎ ነው።

ይህ በእውነቱ የክፍል ስም አይደለም ፣ ግን የምዝግብ ማስታወሻ አካል ስም ነው። የምንጭ ፋይል እና ክፍል መካከል ግጥሚያ ሲኖር አብዛኛውን ጊዜ የክፍሉ ስም ነው፣ነገር ግን የክፍሉ ስም እንዳልሆነ ማወቅ አለቦት፣እና ባለ ሁለት ኮሎን ሳይሆን አንድ ኮሎን አለ። ይህ በአንፃራዊነት ስውር በሆነ መንገድ የሎግ ባቄላ ስምን ከክፍል ስም ለመለየት የሚረዳዎት መንገድ ነው።

ይሁን እንጂ በአንዳንድ ሁኔታዎች የምዝግብ ማስታወሻውን በትክክል የሚያመነጨው የትኛው ዘዴ እንደሆነ ለመወሰን አስቸጋሪ ሊሆን ይችላል. ከላይ ያለውን ጽሑፍ ከተመለከቱ, መስመሩ የት ነው ብለው ያስባሉ.Received 1024 bytes from 10.1.1.2". ደረጃውን በማዘጋጀት ይህንን ችግር መፍታት ይችላሉ ቅድመ ቅጥያ_func ወደ NS_LOG አካባቢ ተለዋዋጭ። የሚከተሉትን ለማድረግ ይሞክሩ

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

ጥቅሶቹ አስፈላጊ መሆናቸውን ልብ ይበሉ ምክንያቱም የኦር ኦፕሬሽንን ለማመልከት የምንጠቀመው ቧንቧ የዩኒክስ የቧንቧ መስመር ማገናኛ ስለሆነ ነው። አሁን፣ ስክሪፕቱን ካስኬዱ፣ የመግቢያ ስርዓቱ በዚህ መዝገብ ውስጥ ያለው እያንዳንዱ መልእክት በክፍል ስም ቅድመ ቅጥያ መያዙን ያረጋግጣል።

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()

አሁን ከ UDP echo ደንበኛ መተግበሪያ የሚመጡ ሁሉም መልዕክቶች እንደዚ ተለይተው መገኘታቸውን ማየት ይችላሉ። መልእክት "Received 1024 bytes from 10.1.1.2' አሁን ከ echo ደንበኛ መተግበሪያ እንደመጣ በግልጽ ተለይቷል። የቀረው መልእክት ከ UDP echo አገልጋይ መተግበሪያ መምጣት አለበት። በ NS_LOG አካባቢ ተለዋዋጭ ውስጥ በኮሎን-የተለዩ ክፍሎችን ዝርዝር በማስገባት ይህንን አካል ማንቃት እንችላለን።

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

ማስጠንቀቂያ፡- ከላይ ባለው የምሳሌ ጽሑፍ ላይ ሰነዱን ለመቅረጽ የሚያገለግለውን ኮሎን(:) በኋላ ያለውን አዲስ መስመር ቁምፊ ማስወገድ ያስፈልግዎታል። አሁን ስክሪፕቱን ካስኬዱ ከደንበኛው የሚመጡትን ሁሉንም የምዝግብ ማስታወሻዎች እና የአገልጋይ ማሚቶ አፕሊኬሽኖችን ያያሉ። ይህ በማረም ጊዜ በጣም ጠቃሚ ሊሆን እንደሚችል ማየት ይችላሉ.

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()

እንዲሁም አንዳንድ ጊዜ የምዝግብ ማስታወሻው የተፈጠረበትን የማስመሰል ጊዜ ማየት መቻል ጠቃሚ ነው። OR ትንሽ በመጨመር ይህንን ማድረግ ይችላሉ። ቅድመ ቅጥያ_ጊዜ:

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

እንደገና፣ ከላይ ያለውን አዲስ መስመር ቁምፊ ማስወገድ ይኖርብዎታል። አሁን ስክሪፕቱን ካሄዱት የሚከተለውን ውፅዓት ማየት አለብዎት።

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()

ግንበኛ ለ UdpEchoServer በሲሙሌሽን 0 ሰከንድ ተጠርቷል። ይህ በእውነቱ ማስመሰል ከመጀመሩ በፊት ይከሰታል ፣ ግን ይህ ጊዜ እንደ ዜሮ ሴኮንድ ነው የሚታየው። ለገንቢ መልእክትም ተመሳሳይ ነው። 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()

ስክሪፕቱን አስታውስ scratch/first.cc የማስተጋባት ሰርቨር አፕሊኬሽኑን የጀመረው ማስመሰል ከመጀመሩ ከአንድ ሰከንድ በፊት ነው። አሁን ያንን ዘዴ ማየት ይችላሉ ማመልከቻ ጀምር አገልጋይ በመጀመሪያ ሰከንድ ውስጥ ይጠራል. በስክሪፕቱ ላይ እንደጠየቅነው የማስተጋባት ደንበኛ በምስሉ ሁለተኛ ሰከንድ ላይ መጀመሩን ሊያስተውሉ ይችላሉ።

አሁን በጥሪ ላይ የማስመሰል ሂደትን መከታተል ይችላሉ። መርሐግብር ማስተላለፍ በ echo አገልጋይ መተግበሪያ ውስጥ የ HandleRead መልሶ ጥሪን ላክ በሚደውል ደንበኛ ውስጥ። ከነጥብ-ወደ-ነጥብ ማገናኛ ላይ ፓኬት ለመላክ ያለፈው ጊዜ 3,69 ሚሊሰከንድ መሆኑን ልብ ይበሉ። የecho አገልጋዩ ለፓኬቱ ምላሽ የሰጠውን መልእክት ሲመዘግብ እና ቻናሉ ከዘገየ በኋላ የecho ደንበኛ የecho ፓኬቱን በ HandleRead ዘዴው እንደተቀበለ ማየት ይችላሉ።

እርስዎ ሳያውቁት በዚህ ሲሙሌሽን ውስጥ ብዙ ነገር አለ። ነገር ግን በስርዓቱ ውስጥ ያሉትን ሁሉንም የመግቢያ ክፍሎችን በማንቃት አጠቃላይ ሂደቱን በቀላሉ መከታተል ይችላሉ። የNS_LOG ተለዋዋጭን ወደሚከተለው እሴት ለማቀናበር ይሞክሩ፣

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

ከላይ ያለው ኮከብ ምልክት የምዝግብ ማስታወሻ አካል ምልክት ነው። ይህ በሲሙሌቱ ውስጥ ጥቅም ላይ በሚውሉ ሁሉም ክፍሎች ውስጥ ያሉትን ሁሉንም ግቤቶችን ያስችላል። ውጤቱን እዚህ አልደግመውም (በሚጽፉበት ጊዜ ለአንድ ኢኮ ፓኬት 1265 የውጤት መስመሮችን ያወጣል) ነገር ግን ይህንን መረጃ ወደ ፋይል በማዞር በሚወዱት አርታኢ ማየት ይችላሉ።

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

ችግር ሲያጋጥመኝ እና ነገሮች የት እንደተሳሳቱ ሳላውቅ በግሌ ይህን እጅግ በጣም ቃላታዊ የሆነ የምዝግብ ማስታወሻ ስሪት እጠቀማለሁ። የማቋረጫ ነጥቦችን ሳዘጋጅ እና በአራሚው ውስጥ ያለውን ኮድ ሳልጨርስ የኮድ አፈጻጸምን በቀላሉ መከተል እችላለሁ። በምወደው አርታኢ ውስጥ ውጤቱን ብቻ አርትዕ የምጠብቀውን መፈለግ እና ያልጠበቅኩትን ነገር ማየት እችላለሁ። ስህተቱ ምን እንደሆነ አጠቃላይ ሀሳብ ካገኘሁ በኋላ ችግሩን በዝርዝር ለመመርመር ወደ አራሚው ውስጥ ዘልዬ እገባለሁ። የእርስዎ ስክሪፕት ሙሉ በሙሉ ያልተጠበቀ ነገር ሲያደርግ የዚህ ዓይነቱ ውጤት ጠቃሚ ሊሆን ይችላል። አራሚውን ብቻ እየተጠቀምክ ከሆነ፣ ጠማማውን ሙሉ በሙሉ ልታጣው ትችላለህ። ምዝገባው እንደዚህ አይነት መዞሪያዎች እንዲታዩ ያደርጋል.

5.1.3 ወደ ኮድዎ መግባትን ማከል

ከበርካታ ማክሮዎች ወደ የምዝግብ ማስታወሻ ክፍል በመደወል ወደ ማስመሰሎችዎ አዲስ ግቤቶችን ማከል ይችላሉ። በስክሪፕት ውስጥ እናድርገው myfirst.cc, በ "ንጹህ" ማውጫ ውስጥ ያለን. በዚህ ሁኔታ ውስጥ የምዝግብ ማስታወሻ ክፍልን እንደገለፅን አስታውስ፡-

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

የ NS_LOG አካባቢን ተለዋዋጭ በተለያዩ ደረጃዎች በማዘጋጀት ለዚህ አካል ሁሉንም መልዕክቶች መግባትን ማንቃት እንደሚችሉ ያውቃሉ። ወደ ፊት እንሂድ እና ወደ ስክሪፕቱ አንዳንድ ግቤቶችን እንጨምር። የመረጃ ደረጃ መልዕክቶችን ወደ ምዝግብ ማስታወሻው ለመጨመር የሚያገለግለው ማክሮ NS_LOG_INFO ነው። አንጓዎችን መፍጠር ከመጀመራችን በፊት ስክሪፕቱ በ"ቶፖሎጂ መፍጠር" ደረጃ ላይ እንዳለ የሚነግርዎትን መልእክት እንጨምር። ይህ በሚከተለው የኮድ ቅንጣቢ ውስጥ ይከናወናል
ይክፈቱ scratch/myfirst.cc በሚወዱት አርታኢ ውስጥ እና መስመሩን ያክሉ ፣
NS_LOG_INFO ("Creating Topology");
ከመስመሮቹ በፊት ፣

NodeContainer nodes;
nodes.Create (2);

አሁን በመጠቀም ስክሪፕቱን ያጠናቅቁ ዋፍ, እና የ NS_LOG ተለዋዋጭን አጽዳ ቀደም ብለን የነቃነውን የመግቢያ ክር ለማሰናከል፡-

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

ከእሱ ጋር የተያያዘው የመግቢያ ክፍል (FirstScriptExample) ስላልነቃ አዲሱን መልእክት አታይም። መልእክትህን ለማየት የመግቢያ ክፍሉን ማንቃት አለብህ የመጀመሪያ ስክሪፕት ምሳሌ ከNS_LOG_INFO በታች ደረጃ ያለው። ያንን የተለየ የምዝግብ ማስታወሻ ደረጃ ማየት ከፈለግክ፣ እንደዛ ማብራት ትችላለህ፣

$ export NS_LOG=FirstScriptExample=info

አሁን ስክሪፕቱን ካስኬዱ፣ “ቶፖሎጂ መፍጠር” የሚል አዲስ መልእክት ያያሉ።

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 የትእዛዝ መስመር ግቤቶችን በመጠቀም

5.2.1 ነባሪ የባህሪ እሴቶችን መሻር

ያለ አርትዖት እና ግንባታ የ ns-3 ስክሪፕቶችን ባህሪ ለመቀየር ሌላኛው መንገድ የትእዛዝ መስመር ግቤቶችን በመጠቀም ነው። የትዕዛዝ መስመር ነጋሪ እሴቶችን የምንተነተንበትን ዘዴ እናቀርባለን እና በውጤቶቹ ላይ በመመስረት አካባቢያዊ እና ዓለም አቀፍ ተለዋዋጮችን በራስ-ሰር እናዘጋጃለን።

የትእዛዝ መስመር ክርክር ስርዓትን ለመጠቀም የመጀመሪያው እርምጃ የትእዛዝ መስመር ተንታኝ ማወጅ ነው። በሚከተለው ኮድ ውስጥ እንደሚታየው ይህ (በዋና ፕሮግራምዎ ውስጥ) ለመስራት በጣም ቀላል ነው።

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

ይህ ቀላል ሁለት መስመር ቅንጣቢ በራሱ በጣም ጠቃሚ ነው። ለ ns-3 አለምአቀፍ ተለዋዋጭ እና የባህሪ ስርዓት በሩን ይከፍታል. በዋናው የስክሪፕት ተግባር አናት ላይ ሁለት የኮድ መስመሮችን እንጨምር scratch/myfirst.cc. በመቀጠል፣ ስክሪፕቱን አሰባስበን እናሰራዋለን፣ በሚነሳበት ጊዜ የእርዳታ ጥያቄን እንደሚከተለው እናቀርባለን።

$ ./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.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.

አሁን አማራጩን አስቡበት - የህትመት ባህሪያት. በ first.cc ስክሪፕት ውስጥ የ ns-3 ባህሪ ስርዓትን አስቀድመን ጠቅሰናል። የሚከተሉትን የኮድ መስመሮች አይተናል

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

ብለው ተናገሩ የውሂብ መጠን በእውነቱ ባህሪ ነው። PointToPointNetDevice. ባህሪያቱን ለማየት የትእዛዝ መስመር ክርክር ተንታኝ እንጠቀም PointToPointNetDevice. የእርዳታ ዝርዝር ማቅረብ አለብን ይላል። ዓይነትአይድ. ይህ የፍላጎት ባህሪያት የያዙበት ክፍል ስም ነው። በእኛ ሁኔታ ውስጥ ይሆናል ns3 :: PointToPointNetDevice. ወደ ፊት እንሂድ ፣ እንግባ ፣

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

ስርዓቱ የዚህ አይነት የአውታረ መረብ መሳሪያ ሁሉንም ባህሪያት ያትማል. በዝርዝሩ ውስጥ ካሉት ባህሪዎች መካከል መኖራቸውን ያያሉ-

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

ይህ እቃው ሲፈጠር በስርዓቱ ውስጥ ጥቅም ላይ የሚውለው ነባሪ እሴት ነው. PointToPointNetDevice. ይህንን ነባሪ እሴት በመለኪያ እንሽረው አይነታ в PointToPoint ረዳት ከፍ ያለ። ነባሪ እሴቶችን ከነጥብ-ወደ-ነጥብ መሳሪያዎች እና ሰርጦች እንጠቀም። ይህንን ለማድረግ, ጥሪዎችን ያስወግዱ የመሣሪያ ባህሪ и የChannel አይነታ ከ myfirst.cc, በንጹህ ማውጫ ውስጥ ያለን.

የእርስዎ ስክሪፕት አሁን በቀላሉ ማወጅ አለበት። PointToPoint ረዳት እና ከዚህ በታች ባለው ምሳሌ እንደሚታየው ምንም አይነት የመጫኛ ስራዎችን አያድርጉ,

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

ይቀጥሉ እና አዲስ ስክሪፕት ይፍጠሩ ዋፍ (./ዋፍ) እና ወደ ኋላ ተመልሰን አንዳንድ ቅጂዎችን ከ UDP echo አገልጋይ አፕሊኬሽን አንቃ እና የጊዜ ቅድመ ቅጥያውን እናካተት።

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

ስክሪፕቱን ከሰራህ የሚከተለውን ውፅዓት ማየት አለብህ።

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()

ለመጨረሻ ጊዜ የማስመሰል ሰዓቱን የተመለከትንበት ጊዜ፣ ፓኬጁ በ echo አገልጋይ በተቀበለበት ቅጽበት፣ ጊዜው 2,00369 ሰከንድ እንደነበር አስታውስ።

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

አሁን ፓኬት በ2.25732 ሰከንድ ይቀበላል። ምክንያቱም በቀላሉ የPointToPointNetDevice ዳታ መጠንን ከአምስት ሜጋ ቢት በሰከንድ ወደ ነባሪ እሴቱ 32768 ቢት በሴኮንድ ዳግም እናስጀምረዋለን። የትእዛዝ መስመሩን ተጠቅመን አዲስ ዳታ ሬትን የምንተካ ከሆነ፣ ማስመሰልን እንደገና ማፋጠን እንችላለን። በእገዛው አካል በተገለፀው ቀመር መሠረት እንደዚህ እናደርገዋለን-

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

በውጤቱም፣ የDataRate ባህሪ ነባሪ እሴት በሰከንድ አምስት ሜጋ ቢትስ ይመለሳል። በውጤቱ ተገርመዋል? የስክሪፕቱን የመጀመሪያ ባህሪ ለመመለስ የሰርጡ መዘግየት ከብርሃን ፍጥነት ጋር እንዲመጣጠን ማድረግ አለብን። ለአውታረመረብ መሣሪያው እንዳደረግነው የትእዛዝ መስመር ስርዓቱን የሰርጡን ባህሪዎች እንዲያትሙ ልንጠይቀው እንችላለን።

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

የሰርጡ መዘግየት ባህሪው እንደሚከተለው ተቀናብሮ እናገኘዋለን።

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

ከዚያም እነዚህን ሁለቱንም ነባሪዎች በትእዛዝ መስመር ሲስተም ማዘጋጀት እንችላለን።

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

በዚህ አጋጣሚ በስክሪፕቱ ውስጥ የዳታ ተመን እና መዘግየትን በግልፅ ስናዘጋጅ የነበረንን ጊዜ እየመለስን ነው።

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()

ፓኬጁ ከ2,00369 ሰከንድ በኋላ በአገልጋዩ በድጋሚ መቀበሉን ልብ ይበሉ። በስክሪፕቱ ውስጥ ያሉትን ማናቸውንም ባህሪያት በዚህ መንገድ ማዋቀር እንችላለን። በተለይም የMaxPackets ባህሪያትን ከአንድ ሌላ እሴቶች ጋር ማዋቀር እንችላለን። UdpEchoClient.

እንዴት ነው የምትጠቀመው? ሞክረው. የባህሪውን ነባሪ እሴት የሻርንበትን እና በግልፅ ያዘጋጀንበትን ቦታ አስተያየት መስጠት እንዳለቦት ያስታውሱ ማክስፓኬቶች በስክሪፕቱ ውስጥ. ከዚያ ስክሪፕቱን እንደገና መገንባት አለብዎት። አዲስ ነባሪ ባህሪ እሴት ለማዘጋጀት በትእዛዝ መስመር ላይ የአገባብ እገዛን ማግኘት ይችላሉ። ይህንን ካወቁ በኋላ, በትእዛዝ መስመር ላይ የሚታዩትን የጥቅሎች ብዛት መቆጣጠር ይችላሉ. ትጉ ሰዎች ስለሆንን የትእዛዝ መስመራችን ይህን ይመስላል።

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

በዚህ ጊዜ የሚነሳው ተፈጥሯዊ ጥያቄ የእነዚህ ሁሉ ባህሪያት መኖሩን እንዴት ማወቅ እንደሚቻል ነው. በድጋሚ, የትእዛዝ መስመር ስርዓቱ በዚህ ጉዳይ ላይ የእርዳታ ተግባር አለው. የትእዛዝ መስመር እገዛን ከጠየቅን ማየት አለብን፡-

$ ./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.

የ"PrintGroups" ክርክርን ከመረጡ ሁሉንም የተመዘገቡ ቡድኖችን ዝርዝር ማየት አለብዎት ዓይነትአይድ. የቡድን ስሞች በምንጭ ማውጫ ውስጥ ካሉት የሞጁሎች ስሞች ጋር ይዛመዳሉ (ምንም እንኳን በካፒታል ፊደል ቢሆንም)። ሁሉንም መረጃዎች በአንድ ጊዜ ማተም በጣም ብዙ ይሆናል, ስለዚህ ተጨማሪ ማጣሪያ በቡድኖች መረጃን ለማተም ይገኛል. ስለዚህ፣ እንደገና ነጥብ-ወደ-ነጥብ ሞጁሉን ላይ በማተኮር፡-

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

ባህሪያትን ለመፈለግ የሚገኙትን የTypeId ስሞች እዚህ ማግኘት ይችላሉ ለምሳሌ በ ውስጥ
--PrintAttributes = ns3 :: PointToPointChannelከላይ እንደሚታየው.

ሌላው ስለ ባህሪያቱ የሚማርበት መንገድ በDoxygen ns-3 በኩል ነው። በሲሙሌተሩ ውስጥ የተመዘገቡትን ሁሉንም ባህሪያት የሚዘረዝር ገጽ አለ።

5.2.2 የራስዎን ትዕዛዞች በመያዝ ላይ

እንዲሁም የእራስዎን መንጠቆዎች በትእዛዝ መስመር ስርዓት በኩል ማከል ይችላሉ። ይህ የሚደረገው በቀላሉ የትእዛዝ መስመር ተንታኝ ዘዴን በመጠቀም ነው። AddValue.
ይህንን አጋጣሚ ፍፁም በተለየ መልኩ የሚታዩትን የጥቅሎች ብዛት ለመጥቀስ እንጠቀምበት። የተሰየመ የአካባቢ ተለዋዋጭ እንጨምር nPackets ወደ ተግባር ዋና. ከቀደመው ነባሪ ባህሪያችን ጋር እንዲዛመድ ወደ አንድ እናስቀምጠዋለን። የትእዛዝ መስመር ተንታኝ ይህንን እሴት እንዲለውጥ ለመፍቀድ፣ ይህንን እሴት ወደ ተንታኙ መያዝ አለብን። ይህን የምናደርገው ፈተና በመጨመር ነው። AddValue. ሂድ እና ስክሪፕቱን ቀይር scratch/myfirst.cc ስለዚህ በሚከተለው ኮድ ለመጀመር

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);
...

የ MaxPackets አይነታን ወደምናዘጋጅበት ስክሪፕት ውስጥ ወዳለው ነጥብ ወደታች ይሸብልሉ እና ከዚህ በታች እንደሚታየው ከቋሚው 1 ይልቅ ወደ nPackets ተለዋዋጭ ለመቀየር ይለውጡት።

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

አሁን ስክሪፕቱን ካስኬዱ እና --PrintHelp ክርክርን ከተተኩ አዲሱን የተጠቃሚ ክርክር ማየት አለብዎት። በእገዛ ማሳያው ላይ ተዘርዝሯል. ግባ፣

$ ./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

የሚተላለፉትን የፓኬቶች ብዛት ለመለወጥ ከፈለጉ በትእዛዝ መስመር ላይ የ -nPackets ክርክርን በማቀናበር ማድረግ ይችላሉ ፣

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

አሁን ማየት አለብህ

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()

አሁን ሁለት ፓኬጆችን ልከሃል። በጣም ቀላል ፣ ትክክል?
እንደ ns-3 ተጠቃሚ የአለምአቀፍ እሴቶችን እና ባህሪያትን ለመቆጣጠር የትእዛዝ መስመርን የክርክር ስርዓት መጠቀም እንደሚችሉ ማየት ይችላሉ። የሞዴል ደራሲ ከሆንክ በእቃዎችህ ላይ አዳዲስ ባህሪያትን ማከል ትችላለህ እና በትእዛዝ መስመር ስርዓቱ ለተጠቃሚዎችህ በራስ-ሰር ለማዋቀር ዝግጁ ይሆናሉ። የስክሪፕት ጸሃፊ ከሆንክ ወደ ስክሪፕቶችህ አዳዲስ ተለዋዋጮችን ማከል እና ያለ ህመም ከትእዛዝ መስመር ስርዓት ጋር ማገናኘት ትችላለህ።

5.3 የመከታተያ ስርዓቱን መጠቀም

አጠቃላይ የማስመሰል ነጥብ ለቀጣይ ጥናት ውጤትን ማመንጨት ነው፣ እና የ ns-3 የመከታተያ ስርዓት ለዚህ ዋነኛው ዘዴ ነው። ns-3 የC++ ፕሮግራም ስለሆነ መደበኛውን የC++ ፕሮግራም ውፅዓት ማመንጫዎችን መጠቀም ይቻላል፡-

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

ወደ መፍትሄዎ ትንሽ መዋቅር ለመጨመር የመግቢያ ሞጁሉን እንኳን መጠቀም ይችላሉ። በዚህ አካሄድ የተፈጠሩ ብዙ የሚታወቁ ችግሮች አሉ፣ እና ስለዚህ፣ እነዚህን ችግሮች ለመፍታት፣ የጋራ የክስተት ፍለጋ ንዑስ ስርዓትን አቅርበናል።

የ ns-3 መከታተያ ስርዓት ዋና ግቦች፡-

  • ለመሠረታዊ ተግባራት, የመከታተያ ስርዓቱ ተጠቃሚው ለታዋቂ ምንጮች መደበኛ ፍለጋን እንዲያመነጭ መፍቀድ አለበት, እና ፍለጋውን የሚያመነጩትን ነገሮች ይምረጡ;

  • መካከለኛ ተጠቃሚዎች የተፈጠረውን የውጤት ፎርማት ለመለወጥ ወይም አዲስ የመከታተያ ምንጮችን ለማስገባት የማስመሰያውን ኮር ሳይቀይሩ የመከታተያ ስርዓቱን ማራዘም አለባቸው።

  • የላቁ ተጠቃሚዎች አዲስ የመከታተያ ምንጮችን እና ማጠቢያዎችን ለመጨመር የሲሙሌተር ኮርን ማሻሻል ይችላሉ። የ ns-3 የክትትል ስርዓት የተገነባው በገለልተኛ የመከታተያ ምንጮች እና መድረሻዎች መርሆዎች እንዲሁም ምንጮችን ከተጠቃሚዎች ጋር ለማገናኘት የተዋሃደ ዘዴ ነው።

የ ns-3 የክትትል ስርዓት የተገነባው በገለልተኛ የመከታተያ ምንጮች እና ተቀባዮች መርሆዎች እንዲሁም ምንጮችን ከተቀባዮች ጋር ለማገናኘት የተዋሃደ ዘዴ ነው። የመከታተያ ምንጮች በሲሙሌሽን ውስጥ የተከሰቱትን ክስተቶች የሚጠቁሙ እና የፍላጎት መረጃን መዳረሻ የሚያቀርቡ ነገሮች ናቸው። ለምሳሌ፣ የመከታተያ ምንጭ የአውታረ መረብ መሳሪያ መቼ እንደተቀበለ ሊያመለክት እና የፓኬቱን ይዘት ለሚፈልጉ የመከታተያ መቀበያዎች እንዲገኝ ማድረግ ይችላል።

የመከታተያ ምንጮች በራሳቸው ተቀባዩ በሚሰጠው መረጃ ጠቃሚ ነገር ከሚሰሩ ሌሎች የኮድ ቁርጥራጮች ጋር "ተገናኝተው" እስካልሆኑ ድረስ ምንም ፋይዳ የላቸውም። ዱካዎች በክትትል ምንጮች የቀረቡ የክስተቶች እና መረጃዎች ሸማቾች ናቸው። ለምሳሌ, (ከቀደመው ምሳሌ የመከታተያ ምንጭ ጋር ሲገናኝ) በተቀበለው ፓኬት ውስጥ ያሉትን የፍላጎት ክፍሎችን የሚታተም የክትትል ማጠቢያ መፍጠር ይችላሉ.

የዚህ ግልጽ መለያየት ምክንያት ተጠቃሚዎች የሲሙሌተር ኮርን ማርትዕ እና እንደገና ማጠናቀር ሳያስፈልጋቸው አዲስ የሲንክ ዓይነቶችን አሁን ባሉት የመከታተያ ምንጮች ላይ እንዲሰኩ መፍቀድ ነው። ስለዚህ ከላይ በምሳሌው ላይ ተጠቃሚው በስክሪፕታቸው ውስጥ አዲስ መከታተያ ብቻ መግለፅ እና የተጠቃሚውን ስክሪፕት በማረም በሲሙሌሽን ኮር ውስጥ ከተገለፀው ነባር የመከታተያ ምንጭ ጋር ማገናኘት ይችላል።

በዚህ ማጠናከሪያ ትምህርት ውስጥ፣ የተወሰኑትን ቀደም ብለው የተገለጹትን ምንጮች እና መታጠቢያ ገንዳዎችን እናሳልፋለን እና በተጠቃሚው በኩል በትንሹ ጥረት እንዴት እንደሚዋቀሩ እናሳያለን። የክትትል ስም ቦታን ማራዘም እና አዲስ የመከታተያ ምንጮችን መፍጠርን ጨምሮ የላቀ የክትትል ውቅረትን በተመለከተ መረጃ ለማግኘት የ ns-3 ማኑዋልን ወይም እንዴት እንደሚደረግ ይመልከቱ።

5.3.1 ASCII መከታተል

ns-3 ቀላል የፓኬት ዱካዎችን በሚያዘጋጁበት ጊዜ ለዝርዝሮቹ እርስዎን ለማገዝ ዝቅተኛ ደረጃ የመከታተያ ስርዓት የሚያቀርብ አጋዥ ተግባርን ያቀርባል። ይህን ባህሪ ካነቁት ውጤቱን በASCII ፋይሎች ውስጥ ያያሉ። የ ns-2 ውፅዓትን ለሚያውቁ፣ የዚህ አይነት ዱካ ተመሳሳይ ነው። ውጪ.trበብዙ ስክሪፕቶች የተፈጠረ።

ወደ ስራ እንውረድ እና አንዳንድ የ ASCII መከታተያ ውጤቶችን በእኛ scratch/myfirst.cc ስክሪፕት ላይ እንጨምር። ከጥሪው በፊት Simulator :: Run ()የሚከተሉትን የኮድ መስመሮች ያክሉ
AsciiTraceHelper አስኪ;

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

ልክ እንደሌሎች ብዙ ns-3 ፈሊጦች፣ ይህ ኮድ የASCII ዱካዎችን ለመፍጠር አጋዥ ነገር ይጠቀማል። ሁለተኛው መስመር ሁለት የጎጆ ዘዴ ጥሪዎችን ይዟል። ዘዴ "ውስጥ" CreateFileStream() በቆለሉ ላይ የፋይል ዥረት ነገር ለመፍጠር (የነገር ስም የለም) እና ወደተጠራው ዘዴ ለማስተላለፍ የማይታወቅ ነገር ፈሊጥ ይጠቀማል። ወደ ፊት ወደዚህ ጉዳይ እንመረምራለን ነገርግን በዚህ ጊዜ ማወቅ ያለብዎት ነገር ቢኖር የተሰየመ ፋይልን የሚወክል ዕቃ እየፈጠሩ መሆኑን ነው። myfirst.tr እና ወደ ns-3 ያስተላልፉ። የተፈጠረውን ነገር በሕይወት ዘመኑ ሁሉ እንዲንከባከብ ወደ ns-3 እንተወዋለን፣ በዚህ ጊዜ ከC++ ዥረት ዕቃዎች ቅጂ አዘጋጆች ጋር ተያይዞ በትንሽ የታወቀ (ሆን ተብሎ) ውስንነት የተፈጠሩ ችግሮች ተፈተዋል።

የውጭ ጥሪ አንቃAsciiAll() ለሁሉም ነጥብ-ወደ-ነጥብ የመሳሪያ ግኑኝነቶች በASCII ሲሙሌሽን ውስጥ መከታተልን ማንቃት እንደሚፈልጉ እና (የተገለጹ) የመከታተያ ገንዳዎች የፓኬት እንቅስቃሴ መረጃን በASCII ቅርጸት እንዲመዘግቡ ለረዳቱ ይነግረዋል።

ns-2ን ለሚያውቁ፣ የመከታተያ ክስተቶቹ የ"+"" -" "d" እና "r" ክስተቶችን ከሚመዘገቡ የታወቁ የመከታተያ ነጥቦች ጋር እኩል ናቸው።
አሁን ስክሪፕቱን መገንባት እና ከትእዛዝ መስመሩ ማስኬድ ይችላሉ-

$ ./waf --run scratch/myfirst

ልክ እንደበፊቱ ብዙ ጊዜ፣ ከዋፍ ብዙ መልዕክቶችን ያያሉ እና ከዚያ "'build' በተሳካ ሁኔታ ተጠናቅቋል" ከሩጫ ፕሮግራሙ አንዳንድ መልዕክቶች ጋር።

በሚሰራበት ጊዜ ፕሮግራሙ የተሰየመ ፋይል ይፈጥራል myfirst.tr. በስራው ባህሪ ምክንያት ዋፍ, በነባሪነት ፋይሉ በአካባቢው ማውጫ ውስጥ አልተፈጠረም, ነገር ግን በማጠራቀሚያው ከፍተኛ-ደረጃ ማውጫ ውስጥ. ዱካዎች የሚቀመጡበትን መንገድ ለመቀየር ከፈለጉ እሱን ለመለየት የ Waf መለኪያን መጠቀም ይችላሉ። --cwd. አላደረግንም፣ ስለዚህ በተወዳጅ አርታዒዎ ውስጥ ያለውን የASCII መከታተያ ፋይል myfirst.trን ለመመልከት ወደ የእኛ ማከማቻ ከፍተኛ ደረጃ ማውጫ መሄድ አለብን።

የ ASCII ዱካዎችን በመተንተን ላይ

በጣም ጥቅጥቅ ባለ መልኩ ብዙ መረጃ አለ፣ ነገር ግን በመጀመሪያ ሊታወቅ የሚገባው ነገር ፋይሉ የተለያዩ መስመሮችን ያካተተ መሆኑ ነው። የመመልከቻ ቦታውን በስፋት ካስፋፉ ይህ በግልጽ የሚታይ ይሆናል.

በፋይሉ ውስጥ ያለው እያንዳንዱ መስመር ከክትትል ክስተት ጋር ይዛመዳል። በዚህ ሁኔታ, በእያንዳንዱ ነጥብ-ወደ-ነጥብ አውታር መሳሪያ ውስጥ በሲሙሌሽን ውስጥ የሚገኙትን የማስተላለፊያ ወረፋ ክስተቶችን እየፈለግን ነው. የማስተላለፊያ ወረፋው እያንዳንዱ ፓኬት ከነጥብ-ወደ-ነጥብ ማገናኛ ማለፍ ያለበት ወረፋ ነው. በክትትል ፋይሉ ውስጥ ያለው እያንዳንዱ መስመር በነጠላ ቁምፊ (እና ከእሱ በኋላ ቦታ እንዳለው) እንደሚጀምር ልብ ይበሉ። ይህ ቁምፊ የሚከተለው ትርጉም ይኖረዋል:

+: በመሳሪያ ወረፋ ውስጥ የማስመሰል ክዋኔ ተከስቷል;
- በመሳሪያው ወረፋ ውስጥ የኤለመንትን መልሶ ማግኛ ክዋኔ ተከስቷል;
መ: ፓኬቱ ተጥሏል, ብዙውን ጊዜ ወረፋው ስለሞላ;
r: ፓኬጁ በኔትወርኩ መሣሪያ ደረሰ።

በመከታተያ ፋይሉ ውስጥ ያለውን የመጀመሪያውን መስመር በዝርዝር እንመልከት። ወደ ክፍሎች (ለግልጽነት የተጠለፈ) እና በግራ በኩል ያለውን የመስመር ቁጥር እሰብራለሁ፡-

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)

የዚህ የተራዘመ የመከታተያ ክስተት (መስመር 0) የመጀመሪያው ክፍል ክወና ነው። እዚህ የ+ ምልክት አለን ፣ ይህም ለማስተላለፍ ከወረፋው አሠራር ጋር ይዛመዳል። ሁለተኛው ክፍል (መስመር 1) በሴኮንዶች ውስጥ የተገለጸው የማስመሰል ጊዜ ነው. የጠየቅነውን ታስታውሳላችሁ UdpEchoClient መተግበሪያ እሽጎችን በሁለት ሰከንዶች ውስጥ መላክ ይጀምሩ። እዚህ ላይ ይህ በእርግጥ እየተፈጸመ ስለመሆኑ ማረጋገጫ እናያለን።

ቀጣዩ የምሳሌው ክፍል (ከመስመር 2) ይህ ክስተት የትኛውን የመከታተያ ምንጭ እንደፈጠረው ያሳያል (የስም ቦታ ዱካ ይገለጻል)። ልክ እንደ የፋይል ስርዓት የስም ቦታ ተመሳሳይ በሆነ መልኩ የመከታተያ ስም ቦታን ማሰብ ይችላሉ። የስም ቦታ ስር ነው። መስቀለኛ ዝርዝር. ይህ በ ns-3 ኮር ኮድ ውስጥ ከሚተዳደረው መያዣ ጋር ይዛመዳል። በስክሪፕቱ ውስጥ የተፈጠሩትን ሁሉንም አንጓዎች ይዟል. ልክ የፋይል ስርዓት በስር ስር ማውጫዎች ሊኖሩት ይችላል፣ in መስቀለኛ ዝርዝር ብዙ አንጓዎች ሊኖረን ይችላል. ስለዚህ፣ መስመሩ /NodeList/0 የሚያመለክተው በመስቀለኛ መዝገብ ውስጥ ያለውን ባዶ ኖድ ነው፣ እሱም ዘወትር እንደ "መስቀለኛ 0" የምንረዳው። እያንዳንዱ መስቀለኛ መንገድ የተጫኑ መሳሪያዎች ዝርዝር አለው. ይህ ዝርዝር በስም ቦታ ቀጥሎ ይገኛል። ይህ የመከታተያ ክስተት የሚመጣው ከ መሆኑን ማየት ይችላሉ። የመሣሪያ ዝርዝር/0, ይህም በኖድ ውስጥ የተጫነው መሳሪያ ባዶ ነው.

ቀጣዩ ንዑስ ሕብረቁምፊ፣ $ ns3 :: PointToPointNetDevice, የትኛው መሳሪያ በዜሮ ቦታ ላይ እንዳለ ይነግረናል፡ የዜሮ መስቀለኛ መንገድ የመሳሪያ ዝርዝር። በመስመር 0 ላይ ያለው + ክዋኔ አንድ ኤለመንት ወደ መሳሪያው ማስተላለፊያ ወረፋ ታክሏል ማለት እንደሆነ ያስታውሱ። ይህ በ "ዱካ ዱካ" የመጨረሻ ክፍሎች ላይ ተንጸባርቋል፡- TxQueue/Enqueue.

በክትትል ውስጥ ያሉት የቀሩት ክፍሎች በትክክል የሚታወቁ መሆን አለባቸው። መስመር 3-4 የሚያመለክተው ፓኬጁ በነጥብ-ወደ-ነጥብ ፕሮቶኮል ውስጥ የታሸገ ነው። መስመር 5-7 ፓኬቱ የአይፒ 4 ሥሪት ራስጌ እንዳለው እና ከአይፒ አድራሻ እንደመጣ ያሳያሉ 10.1.1.1 እና የታሰበ 10.1.1.2. መስመር 8-9 ይህ ፓኬት የ UDP ራስጌ እንዳለው እና በመጨረሻ መስመር 10 የሚያሳየው ክፍያ የሚጠበቀው 1024 ባይት ነው።

በክትትል ፋይሉ ውስጥ ያለው ቀጣዩ መስመር ተመሳሳይ ፓኬት በተመሳሳይ መስቀለኛ መንገድ ላይ ካለው የማስተላለፊያ ወረፋ እንደተገኘ ያሳያል።

በክትትል ፋይል ውስጥ ያለው ሦስተኛው መስመር እንደሚያሳየው ፓኬጁ በአውታረመረብ መሳሪያው መስቀለኛ መንገድ ላይ ካለው የኢኮ አገልጋይ ጋር መቀበሉን ያሳያል። ይህንን ክስተት ከዚህ በታች እንደገና አዘጋጅቻለሁ።

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)

የክትትል ክዋኔው አሁን r እና የማስመሰል ጊዜ ወደ 2,25732 ሰከንድ ጨምሯል። የማጠናከሪያ ትምህርት መመሪያዎችን በጥንቃቄ ከተከተሉ፣ ይህ ማለት የአውታረ መረብ መሳሪያ ዳታ ተመን እና የሊንክ መዘግየትን በነባሪ እሴቶቻቸው ትተሃል ማለት ነው። ባለፈው ክፍል ላይ እንዳየኸው ይህ ጊዜ የተለመደ መሆን አለበት.

የመከታተያ ምንጭ የስም ቦታ ግቤት (መስመር 2) ይህ ክስተት ከኖድ 1 (/) የመጣ መሆኑን ለማንፀባረቅ ተለውጧል።መስቀለኛ ዝርዝር/1) እና ፓኬጁ በክትትል ምንጭ ተቀባይነት አግኝቷል (/ማክአርክስ). በፋይሉ ውስጥ የተቀመጡትን ዱካዎች በመመልከት የፓኬቱን ሂደት በቶፖሎጂ መከታተል ለእርስዎ በጣም ቀላል መሆን አለበት።

5.3.2 PCAP መከታተያ

የ ns-3 መሳሪያ ረዳቶች የ.pcap መከታተያ ፋይሎችን ለመፍጠርም ጥቅም ላይ ሊውሉ ይችላሉ። ምህጻረ ቃል pcap (በተለምዶ በትንንሽ ሆሄ የተፃፈ) ፓኬት ቀረፃን የሚያመለክት ሲሆን በእውነቱ የ.pcap ፋይል ቅርጸትን የሚያካትት ኤፒአይ ነው። ይህንን ቅርጸት ማንበብ እና ማሳየት የሚችል በጣም ታዋቂው ፕሮግራም ነው። Wireshark (ከዚህ ቀደም ተብሎ ይጠራል Ethereal). ሆኖም፣ ይህንን የፓኬት ቅርጸት የሚጠቀሙ ብዙ የትራፊክ መከታተያ ተንታኞች አሉ። ተጠቃሚዎች የፒኬፕ ዱካዎችን ለመተንተን ያሉትን ብዙ መሳሪያዎችን እንዲጠቀሙ እናበረታታለን። በዚህ ማጠናከሪያ ትምህርት የፒካፕ ዱካዎችን በመመልከት ላይ እናተኩራለን tcpdump.

የፒካፕ ክትትልን ማንቃት የሚከናወነው በአንድ የኮድ መስመር ነው።

pointToPoint.EnablePcapAll ("myfirst");

አሁን ከጨመርንበት ASCII መከታተያ ኮድ በኋላ ይህን የኮድ መስመር ለጥፍ scratch/myfirst.cc. "myfirst" የሚለውን ሕብረቁምፊ ብቻ እንዳለፍን አስተውል እንጂ "myfirst.pcap" ወይም እንደዚህ ያለ ነገር አይደለም። ምክንያቱም መለኪያው ቅድመ ቅጥያ እንጂ ሙሉ ብቃት ያለው የፋይል ስም አይደለም። በምስሉ ወቅት፣ ረዳቱ በእውነቱ ለእያንዳንዱ ነጥብ-ወደ-ነጥብ መሳሪያ የመከታተያ ፋይል ይፈጥራል። የፋይል ስሞቹ የሚገነቡት ቅድመ ቅጥያ፣ መስቀለኛ መንገድ ቁጥር፣ የመሳሪያ ቁጥር እና ቅጥያ "ን በመጠቀም ነው።pcap».

ለናሙና ስክሪፕታችን፣" የተሰየሙ ፋይሎችን እንጨርሳለን።myfirst-0-0.pcap"እና"myfirst-1-0.pcap'፣ እነሱም pcap ለ node 0-device 0 እና node 1-device 0፣ በቅደም ተከተል። አንዴ የፒካፕ ክትትልን ለማንቃት የኮድ መስመርን ካከሉ፣ ስክሪፕቱን በተለመደው መንገድ ማስኬድ ይችላሉ።

$ ./waf --run scratch/myfirst

በስርጭትዎ ከፍተኛ-ደረጃ ማውጫ ውስጥ ከተመለከቱ፣ ሶስት ፋይሎችን ማየት አለቦት፡ የASCII መከታተያ ፋይል myfirst.tr, ቀደም ብለን ያጠናነው, ፋይሎች myfirst-0-0.pcap и myfirst-1-0.pcap አሁን የፈጠርናቸው አዲስ pcap ፋይሎች ናቸው።

የንባብ ውጤት በ tcpdump

ለአሁን፣ የ pcap ፋይሎችን ለማየት ቀላሉ መንገድ tcpdumpን መጠቀም ነው።

$ 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

በቆሻሻ ማጠራቀሚያ ውስጥ myfirst-0-0.pcap (የደንበኛ መሳሪያ) የማስተጋባት ፓኬት ከ2 ሰከንድ ሲሙሌሽን በኋላ እንደተላከ ማየት ይችላሉ። ሁለተኛውን ቆሻሻ ከተመለከቱ (myfirst-1-0.pcap), ፓኬቱ በ 2,257324 ሰከንድ እንደተቀበለ ያያሉ. በሁለተኛው የቆሻሻ መጣያ ውስጥ ፓኬቱ በ2.257324 ሰከንድ እንደተመለሰ እና በመጨረሻም ፓኬጁ በደንበኛው እንደተቀበለው በመጀመሪያ መጣያ በ2.514648 ሰከንድ ያያሉ።

የንባብ ውጤት ከ Wireshark ጋር

የማያውቁት ከሆነ Wiresharkፕሮግራሞችን እና ሰነዶችን ማውረድ የምትችልበት ድህረ ገጽ አለ፡- http://www.wireshark.org/. Wireshark እነዚህን የመከታተያ ፋይሎች ለማሳየት የሚያገለግል ስዕላዊ የተጠቃሚ በይነገጽ ነው። Wireshark ካለዎት ማንኛውንም የመከታተያ ፋይሎቹን ከፍተው ይዘቱን በፓኬት ስኒየር በመጠቀም ፓኬቶችን እንደያዙ ይዘቱን ማሳየት ይችላሉ።

ምንጭ: hab.com

አስተያየት ያክሉ