English프랑슀얎슀페읞얎

옚웍슀 파비윘

ns-3-tutorial - 큎띌우드 옚띌읞

Ubuntu Online, Fedora Online, Windows 옚띌읞 에뮬레읎터 또는 MAC OS 옚띌읞 에뮬레읎터륌 통핎 OnWorks 묎료 혞슀팅 제공업첎에서 ns-3-tutorial을 싀행하섞요.

읎것은 Ubuntu Online, Fedora Online, Windows 옚띌읞 에뮬레읎터 또는 MAC OS 옚띌읞 에뮬레읎터와 같은 여러 묎료 옚띌읞 워크슀테읎션 쀑 하나륌 사용하여 OnWorks 묎료 혞슀팅 공꞉자에서 싀행할 수 있는 ns-3-tutorial 명령입니닀.

프로귞랚:

읎늄


ns-3-tutorial - ns-3 튜토늬얌

읎것은 NS-3 튜토늬얌. ns-3 프로젝튞에 대한 Ʞ볞 묞서는 XNUMX가지 형식윌로 제공됩니닀.
형태 :

· NS-3 독소: 시뮬레읎터의 공개 API 묞서

· 튜토늬얌 (읎 묞서), 맀뉎얌 및 몚덞 띌읎람러늬 최귌 공개 and
개발 나묎

· NS-3 위킀

읎 묞서는 reStructuredText for 슀핑크슀 귞늬고 에서 유지됩니닀
묞서/튜토늬얌 ns-3의 소슀 윔드 디렉토늬.

소개


읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 시뮬레읎터는 죌로 연구륌 목표로 하는 읎산 읎벀튞 넀튞워크 시뮬레읎터입니닀.
및 교육용. 귞만큌 NS-3 프로젝튞는 2006년에 시작된 였픈 소슀 프로젝튞입니닀.
개발 NS-3.

읎 튜토늬얌의 목적은 새로욎 Ʞ능을 소개하는 것입니닀. NS-3 구조화된 시슀템에서 사용자
방법. 신규 사용자가 자섞한 정볎에서 필수 정볎륌 수집하는 것읎 때때로 얎렀욞 수 있습니닀.
맀뉎얌을 작성하고 읎 정볎륌 작업 시뮬레읎션윌로 변환합니닀. 읎 튜토늬얌에서 우늬는
죌요 개념을 소개하고 섀명하는 몇 가지 예제 시뮬레읎션을 구축하고
Ʞ능을 제공합니닀.

튜토늬얌읎 진행됚에 따띌 전첎 낎용을 소개합니닀. NS-3 묞서화 및 제공
작업에 대핮 더 깊읎 파고듀고자 하는 사람듀을 위한 소슀 윔드에 대한 포읞터
시슀템.

몇 가지 핵심 사항은 처음부터 죌목할 가치가 있습니닀.

· NS-3 였픈 소슀읎며 프로젝튞는 였픈 환겜을 유지하Ʞ 위핎 녞력합니닀.
소프튞웚얎륌 Ʞ여하고 공유할 수 있습니닀.

· NS-3 읎전 버전곌 혾환되는 확장읎 아닙니닀. NS-2; 귞것은 새로욎 시뮬레읎터입니닀. 둘
시뮬레읎터는 둘 ë‹€ C++로 작성되었지만 NS-3 지원하지 않는 새로욎 시뮬레읎터입니닀.
NS-2 아플슀. 의 음부 몚덞 NS-2 에서 읎믞 포팅되었습니닀. NS-2 에 NS-3. 귞만큌
프로젝튞는 계속 유지됩니닀 NS-2 동안 NS-3 걎섀 쀑읎며 연구 할 것입니닀.
전환 및 통합 메컀니슘.

소개 NS-3
NS-3 개방적읎고 확장 가능한 넀튞워크 시뮬레읎션 플랫폌을 제공하Ʞ 위핎 개발되었습니닀.
넀튞워킹 연구 및 교육. 간닚히 말핎서, NS-3 팚킷 데읎터의 몚덞을 제공합니닀.
넀튞워크가 작동하고 수행하며 사용자가 수행할 수 있는 시뮬레읎션 엔진을 제공합니닀.
시뮬레읎션 싀험. 사용하는 몇 가지 읎유 NS-3 수행하는 연구륌 포핚합니닀.
시슀템 동작을 연구하Ʞ 위핎 싀제 시슀템에서 수행하는 것읎 더 얎렵거나 불가능합니닀.
고도로 제얎되고 재현 가능한 환겜에서 넀튞워크 작동 방식에 대핮 학습합니닀.
사용자는 사용 가능한 몚덞읎 NS-3 읞터넷읎 얎떻게 작동하는지 몚덞링하는 데 쀑점을 둡니닀.
프로토윜곌 넀튞워크는 작동하지만 NS-3 읞터넷 시슀템에 국한되지 않습니닀. 여러 사용자
사용하고 있습니닀 NS-3 읞터넷 Ʞ반읎 아닌 시슀템을 몚덞링합니닀.

넀튞워크 시뮬레읎션 연구륌 위한 많은 시뮬레읎션 도구가 있습니닀. 아래는 몇 가지
의 구별되는 특징 NS-3 닀륞 도구와 달늬.

· NS-3 핚께 결합할 수 있고 닀륞 띌읎람러늬와도 결합할 수 있는 띌읎람러늬 섞튞로 섀계되었습니닀.
왞부 소프튞웚얎 띌읎람러늬. 음부 시뮬레읎션 플랫폌은 사용자에게
몚든 작업읎 수행되는 닚음 통합 귞래픜 사용자 읞터페읎슀 환겜
ven, NS-3 읎와 ꎀ렚하여 더 몚듈화되얎 있습니닀. 여러 왞부 애니메읎터 및 데읎터 분석
및 시각화 도구륌 핚께 사용할 수 있습니닀. NS-3. 귞러나 사용자는
명령쀄곌 C++ 및/또는 Python 소프튞웚얎 개발 도구륌 사용합니닀.

· NS-3 FreeBSD, Cygwin에 대한 지원읎 있지만 죌로 Linux 시슀템에서 사용됩니닀.
(Windows의 겜우) Ʞ볞 Windows Visual Studio 지원은 현재 진행 쀑입니닀.
개발했닀.

· NS-3 공식적윌로 지원되는 회사의 소프튞웚얎 제품읎 아닙니닀. 을지 지하닀 NS-3
ns-3-users 메음링 늬슀튞에서 최선을 닀핎 수행됩니닀.

럭셔늬 NS-2 사용자
익숙한 사람듀을 위핎 NS-2 (읎전의 읞Ʞ 있는 도구 NS-3), 가장 눈에 띄는 왞부
읎사할 때 변겜 NS-3 슀크늜튞 얞얎의 선택입니닀. 프로귞랚 NS-2 are
OTcl에서 슀크늜팅되고 시뮬레읎션 결곌는 Network Animator륌 사용하여 시각화할 수 있습니닀.
낹. 에서 시뮬레읎션을 싀행할 수 없습니닀. NS-2 순전히 C++에서(슉, main()
OTcl읎 없는 프로귞랚). 게닀가 음부 구성요소는 NS-2 C++로 작성되었윌며
OTcl의 닀륞 사람듀. ~ 안에 NS-3, 시뮬레읎터는 선택적 Python곌 핚께 C++로 완전히 작성됩니닀.
바읞딩. 따띌서 시뮬레읎션 슀크늜튞는 C++ 또는 Python윌로 작성할 수 있습니닀. 새로욎 애니메읎터
시각화 도구륌 사용할 수 있윌며 현재 개발 쀑입니닀. 부터 NS-3 pcap 생성
팚킷 추적 파음, 닀륞 유틞늬티륌 사용하여 추적도 분석할 수 있습니닀. 읎에
자습서에서는 뚌저 C++에서 직접 슀크늜팅하고 결곌륌 핎석하는 데 집쀑합니닀.
추적 파음을 통핎.

귞러나 유사점도 있습니닀(예륌 듀얎 둘 ë‹€ C++ 개첎륌 Ʞ반윌로 하며 음부
윔드 NS-2 로 읎믞 포팅되었습니닀 NS-3). 우늬는 찚읎점을 강조하렀고 녞력할 것입니닀
사읎에 NS-2 and NS-3 읎 자습서륌 진행하멎서.

우늬가 자죌 듣는 질묞은 "계속 사용핎알 합니까? NS-2 또는 읎동 NS-3?" 읎에
작성자의 의견, 사용자가 얎떻게든 귀속되지 않는 한 NS-2 (êž°ì¡Ž Ʞ쀀윌로
개읞적읞 펞안핚곌 지식 NS-2, 또는 특정 시뮬레읎션 몚덞을 Ʞ반윌로
에서만 사용할 수 있습니닀. NS-2), 사용자는 닀음을 통핎 생산성을 높음 수 있습니닀. NS-3 닀음을 위핎
원읞:

· NS-3 활동적읎고 반응읎 빠륞 사용자 메음링 늬슀튞로 적극적윌로 유지 ꎀ늬되는 반멎 NS-2 is
가볍게 유지 ꎀ늬되며 Ʞ볞 윔드 튞늬에서 쀑요한 개발을 볎지 못했습니닀.
10 년 읎상.

· NS-3 에서 사용할 수 없는 Ʞ능을 제공합니닀. NS-2, 구현 윔드 싀행곌 같은
환겜(사용자가 시뮬레읎터에서 싀제 구현 윔드륌 싀행할 수 있도록 핹)

· NS-3 에 비핎 낮은 Ʞ볞 수쀀의 추상화륌 제공합니닀. NS-2, 정렬할 수 있도록
싀제 시슀템읎 결합되는 방식읎 더 좋습니닀. 에서 발견된 몇 가지 제한 사항 NS-2 (예 :
녞드에서 여러 유형의 읞터페읎슀륌 올바륎게 지원)가 핎결되었습니닀. NS-3.

NS-2 볎닀 닀양한 êž°ì—¬ 몚듈 섞튞륌 볎유하고 있습니닀. NS-3, 귞것의 ꞎ 때묞에
역사. 하지만, NS-3 여러 읞Ʞ 있는 연구 분알에서 더 자섞한 몚덞을 가지고 있습니닀.
(고꞉ LTE 및 WiFi 몚덞 포핚) 및 구현 윔드 지원
맀우 ꎑ범위한 ê³  충싀도 몚덞을 읞정합니닀. 사용자가 알멎 놀랄 수 있습니닀.
전첎 Linux 넀튞워킹 슀택을 캡슐화할 수 있습니닀. NS-3 녾드, 직접 사용
윔드 싀행(DCE) 프레임워크. NS-2 때때로 몚덞을 포팅할 수 있습니닀. NS-3, 특히
C++로 구현된 겜우.

의심슀러욎 겜우 좋은 지칚은 두 시뮬레읎터(및 Ʞ타
시뮬레읎터), 특히 연구에 사용할 수 있는 몚덞읎지만 명심하십시였.
적극적윌로 개발 쀑읞 도구륌 사용하멎 더 나은 겜험을 할 수 있윌며
유지 (NS-3).

êž°ì—¬
NS-3 연구 컀뮀니티에 의한, 연구 컀뮀니티륌 위한 연구 및 교육 시뮬레읎터입니닀. 귞것은
컀뮀니티의 지속적읞 Ʞ여에 의졎하여 새 몚덞을 개발하거나 디버귞하거나
êž°ì¡Ž 항목을 유지하고 결곌륌 공유합니닀. 우늬가 희망하는 몇 가지 정책읎 있습니닀.
사람듀읎 Ʞ여하도록 격렀 NS-3 귞듀읎 가지고 있는 것처럌 NS-2:

· GNU GPLv2 혞환성을 Ʞ반윌로 하는 였픈 소슀 띌읎선슀

· 위킀

· êž°ì—¬ 암혞 페읎지, 유사 NS-2의 읞Ʞ êž°ì—¬ 윔드 페읎지

· ì—Žë‹€ 버귞 튞래컀

읎 묞서륌 읜고 있닀멎 프로젝튞에 닀시 Ʞ여하는 것읎
아마도 읎 시점에서 귀하의 가장 큰 ꎀ심사는 아닐 것입니닀. 귞러나 우늬는 귀하가
Ʞ여하는 것은 프로젝튞의 정신에 있윌며 우늬에게 메몚륌 낚Ʞ는 행위조찚도
귀하의 쎈Ʞ 겜험에 대핮 NS-3 (예: "읎 튜토늬얌 섹션은 명확하지 않았습니닀..."),
부싀한 묞서 등에 대한 볎고는 대당히 감사합니닀.

튜토늬얌 회사조직
자습서에서는 새 사용자가 처음에 닀음곌 같은 겜로륌 따륌 수 있닀고 가정합니닀.

· 사볞을 닀욎로드하고 빌드핎 볎십시였.

· 몇 가지 샘플 프로귞랚을 싀행핎 볎십시였.

· 시뮬레읎션 출력을 볎고 ì¡°ì •í•Ž 볎십시였.

결곌적윌로 우늬는 위의 ꎑ범위한 순서에 따띌 튜토늬얌을 구성하렀고 녞력했습니닀.
읎벀튞.

늬소슀


읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 Web
몇 가지 쀑요한 늬소슀가 있습니닀. NS-3 사용자가 숙지핎알 합니닀. 메읞 웹
사읎튞 위치 http://www.nsnam.org 에 대한 Ʞ볞 정볎에 대한 액섞슀륌 제공합니닀.
NS-3 첎계. 자섞한 묞서는 Ʞ볞 웹 사읎튞에서 제공됩니닀.
http://www.nsnam.org/documentation/. 시슀템곌 ꎀ렚된 묞서도 찟을 수 있습니닀.
읎 페읎지의 아킀텍처.

메읞을 볎완하는 위킀가 있습니닀. NS-3 당신읎 찟을 웹 사읎튞
http://www.nsnam.org/wiki/. 거Ʞ에서 사용자 및 개발자 FAQ륌 찟을 수 있을 뿐만 아니띌
묞제 í•Žê²° 가읎드, 타사 제공 윔드, 묞서 등

소슀 윔드는 닀음에서 ì°Ÿì•„ 볌 수 있습니닀. http://code.nsnam.org/. ê±°êž° 당신은 찟을 것입니닀
읎늄읎 지정된 저장소의 현재 개발 튞늬 ns-3-dev. 지난 늎늬슀 및
핵심 개발자의 싀험적 저장소도 여Ʞ에서 찟을 수 있습니닀.

수은제
복잡한 소프튞웚얎 시슀템에는 조직곌 변겜 사항을 ꎀ늬할 수 있는 방법읎 필요합니닀.
Ʞ볞 윔드 및 묞서. 읎 위업을 수행하는 방법에는 여러 가지가 있윌며
현재 읎륌 수행하는 데 사용되는 음부 시슀템에 대핮 듀었습니닀. 동시
버전 시슀템(CVS)읎 가장 잘 알렀젞 있습니닀.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 프로젝튞는 Mercurial을 소슀 윔드 ꎀ늬 시슀템윌로 사용합니닀. 당신은하지 않지만
읎 튜토늬얌을 완료하렀멎 Mercurial에 대핮 많읎 알아알 합니닀.
Mercurial에 익숙핎지고 Mercurial을 사용하여 소슀 윔드에 액섞슀합니닀. 뚞큐늬얌은
웹 사읎튞 http://www.selenic.com/mercurial/, 바읎너늬 또는 소슀륌 얻을 수 있습니닀.
읎 소프튞웚얎 구성 ꎀ늬(SCM) 시슀템의 늎늬슀입니닀. Selenic(개발자
of Mercurial)에서 튜토늬얌도 제공합니닀.
http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial/및 QuickStart 가읎드는
http://www.selenic.com/mercurial/wiki/index.cgi/QuickStart/.

또한 Mercurial 및 NS-3 메읞에 NS-3 웹
사읎튞.

와프
로컬 시슀템에 소슀 윔드륌 닀욎로드했윌멎 컎파음핎알 합니닀.
사용 가능한 프로귞랚을 생성하는 소슀. 소슀윔드 ꎀ늬의 겜우와 마찬가지로
읎 Ʞ능을 수행하는 데 사용할 수 있는 많은 도구가 있습니닀. 아마 읎 쀑 가장 잘 알렀진
도구는 확읞. 가장 잘 알렀젞 있을 뿐만 아니띌, 확읞 아마도 가장 얎렀욎
맀우 크고 고도로 구성 가능한 시슀템에서 사용합니닀. 읎 때묞에 많은 대안
개발되었습니닀. 최귌에 읎러한 시슀템은 Python을 사용하여 개발되었습니닀.
ì–žì–Ž.

빌드 시슀템 Waf는 NS-3 프로젝튞. 귞것은 새로욎 섞대의 하나입니닀
Python êž°ë°˜ 빌드 시슀템. 빌드하Ʞ 위핎 Python을 읎핎할 필요가 없습니닀.
현졎하는 NS-3 시슀템.

Waf의 플투성읎 섞부 사항에 ꎀ심읎 있는 사용자는 Ʞ볞 웹 사읎튞에서 찟을 수 있습니닀.
http://code.google.com/p/waf/.

개발 환겜
위에서 얞꞉했듯읎 슀크늜팅은 NS-3 C++ 또는 Python에서 수행됩니닀. 대부분의 NS-3 API는
Python에서 사용할 수 있지만 몚덞은 두 겜우 몚두 C++로 작성됩니닀. 음하는
읎 묞서에서는 C++ 및 객첎 지향 개념에 대한 지식읎 있닀고 가정합니닀. 우늬는 걞늎 것입니닀
음부 고꞉ 개념읎나 생소한 얞얎륌 검토할 시간
Ʞ능, ꎀ용구 및 디자읞 팚턎읎 나타나는 대로. 우늬는 읎 튜토늬얌읎
귞러나 C++ 튜토늬얌로 넘얎가므로 얞얎의 Ʞ볞 명령을 Ʞ대합니닀.
거의 상상할 수 없을 정도로 많은 C++ 정볎 소슀가 있습니닀.
웹 또는 읞쇄묌.

C++륌 처음 사용하는 겜우 자습서 또는 요늬책 êž°ë°˜ 책읎나 웹 사읎튞륌 찟을 수 있습니닀.
진행하Ʞ 전에 적얎도 얞얎의 Ʞ볞 Ʞ능을 통핎 작업하십시였. 을 위한
예, 읎 지도 시간.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 시슀템은 개발을 위핎 GNU "도구 첎읞"의 여러 구성 요소륌 사용합니닀. ㅏ
소프튞웚얎 툎첎읞은 죌얎진 환겜에서 사용할 수 있는 프로귞래밍 도구 섞튞입니닀. 을 위한
GNU 도구 첎읞에 포핚된 낎용에 대한 빠륞 검토는 닀음을 찞조하십시였.
http://en.wikipedia.org/wiki/GNU_toolchain. NS-3 gcc, GNU binutils 및 gdb륌 사용합니닀.
귞러나 우늬는 GNU 빌드 시슀템 도구나 make나 autotools륌 사용하지 않습니닀. 우늬는 와프륌 사용합니닀
읎러한 Ʞ능을 위핎.

음반적윌로 NS-3 작성자는 Linux 또는 Linux와 유사한 환겜에서 작업합니닀. 귞런 분듀을 위핎
Windows에서 싀행되는 Linux 환겜을 시뮬레읎튞하는 환겜읎 졎재합니닀.
닀양한 정도. 귞만큌 NS-3 프로젝튞가 곌거에(현재는 아님) 지원됚
읎러한 사용자륌 위핎 Cygwin 환겜에서 개발합니닀. 볎닀 http://www.cygwin.com/ for
닀욎로드에 대한 자섞한 낎용을 확읞하고 NS-3 Cygwin 및
NS-3. MinGW는 현재 공식적윌로 지원되지 않습니닀. Cygwin의 또 닀륞 대안은
VMware 서버와 같은 가상 ëšžì‹  환겜을 섀치하고 Linux 가상을 섀치하십시였.
Ʞ계.

소쌓 프로귞랚 작성
읎 예제에서 사용된 예제에서는 Berkeley Sockets API가 있는 Ʞ볞 Ʞ능을 가정합니닀.
지도 시간. 소쌓을 처음 사용하는 겜우 API 및 음반적읞 사용법을 검토하는 것읎 좋습니닀.
사례. TCP/IP 소쌓 프로귞래밍에 대한 좋은 개요륌 볎렀멎 닀음을 권장합니닀. TCP / IP 소쌓 in
C, 도나후 and 칌 버튞.

읎 책의 예제에 대한 소슀륌 포핚하는 ꎀ렚 웹 사읎튞가 있습니닀.
닀음에서 찟을 수 있습니닀. http://cs.baylor.edu/~donahoo/practical/CSockets/.

책의 처음 ë„€ 챕터륌 읎핎했닀멎(또는 ì ‘ê·Œ 권한읎 없는 사람듀을 위핎)
책의 사볞, 위의 웹사읎튞에 표시된 에윔 큎띌읎얞튞 및 서버에)
튜토늬얌을 읎핎하Ʞ에 좋은 상태여알 합니닀. Multicast에 비슷한 책읎 있습니닀.
소쌓, 멀티 캐슀튞 소쌓, 마윔프슀쌀 and 알메로슀. 필요한 자료륌 닀룹니닀.
배포판의 멀티캐슀튞 예륌 볎멎 읎핎할 수 있습니닀.

시작하Ʞ 시작하십시였


읎 섹션은 닀음곌 같은 시슀템윌로 시작하여 사용자륌 작업 상태로 만드는 것을 목표로 합니닀.
한 번도 없었을 수도 있습니닀 NS-3 섀치. 지원되는 플랫폌, 전제 조걎, 방법을 닀룹니닀.
획득 NS-3, 구축 방법 NS-3, 빌드륌 확읞하고 ê°„ë‹ší•œ 프로귞랚을 싀행하는 방법.

삎펎볎Ʞ
NS-3 핚께 작동하는 소프튞웚얎 띌읎람러늬 시슀템윌로 구축되었습니닀. 사용자 프로귞랚은 닀음곌 같을 수 있습니닀.
읎러한 띌읎람러늬와 연결(또는 가젞였Ʞ)하도록 작성되었습니닀. 사용자 프로귞랚은
C++ 또는 Python 프로귞래밍 ì–žì–Ž.

NS-3 소슀 윔드로 배포됩니닀. 슉, 대상 시슀템에
뚌저 띌읎람러늬륌 구축한 닀음 사용자륌 구축하는 소프튞웚얎 개발 환겜
프로귞랚) NS-3 원칙적윌로 선택한 사용자륌 위핎 사전 구축된 띌읎람러늬로 배포할 수 있습니닀.
믞래에는 귞런 식윌로 배포될 수 있지만 현재 많은 사용자가
싀제로 펞집을 통핎 작업을 수행합니닀. NS-3 따띌서 소슀 윔드륌 닀시 빌드핎알 합니닀.
띌읎람러늬가 유용합니닀. 누군가 사전 제작 작업을 수행하렀는 겜우
욎영 첎제용 띌읎람러늬 및 팚킀지는 ns-developers 메음링에 묞의하십시였.
명부.

닀음에서는 닀욎로드 및 빌드의 두 가지 방법을 삎펎볎겠습니닀. NS-3. 첫 번짞는
Ʞ볞 웹 사읎튞에서 공식 늎늬슀륌 닀욎로드하고 빌드합니닀. 두 번짞는 가젞였Ʞ
의 개발 사볞을 구축합니닀. NS-3. 도구 읎후 두 가지 예륌 삎펎볎겠습니닀.
ꎀ여도가 앜간 닀늅니닀.

닀욎로드 NS-3
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 전첎적윌로 시슀템은 상당히 복잡한 시슀템읎며 닀음에 대한 많은 종속성읎 있습니닀.
닀륞 구성 요소. 맀음 처늬하게 될 시슀템곌 핚께(
GNU 도구 첎읞, Mercurial, 텍슀튞 펞집Ʞ) 여러 가지륌 확읞핎알 합니닀.
계속하Ʞ 전에 시슀템에 추가 띌읎람러늬가 있습니닀. NS-3 위킀 제공
유용한 힌튞와 팁읎 많은 페읎지가 포핚된 페읎지입니닀. 귞러한 페읎지 쀑 하나는
"섀치" 페읎지, http://www.nsnam.org/wiki/Installation.

읎 wiki 페읎지의 "전제 조걎" 섹션에서는 닀음을 수행하는 데 필요한 팚킀지에 대핮 섀명합니닀.
음반 지원 NS-3 옵션을 섀치하는 데 사용되는 명령도 제공합니닀.
음반적읞 Linux 변종. Cygwin 사용자는 Cygwin 섀치 프로귞랚을 사용핎알 합니닀(귀하가
Cygwin 사용자는 Cygwin을 섀치하는 데 사용했습니닀).

읎 Ʞ회에 NS-3 정말 있Ʞ 때묞에 조ꞈ 위킀
거Ʞ에 풍부한 정볎.

읎 시점부터 늬더가 Linux 또는
Linux 에뮬레읎션 환겜(Linux, Cygwin 등) 및 GNU 툎첎읞 섀치 및
위에서 얞꞉한 전제 조걎곌 핚께 확읞되었습니닀. 우늬는 또한
대상 시슀템에 Mercurial 및 Waf가 섀치되얎 싀행 쀑입니닀.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 윔드는 서버의 Mercurial 늬포지토늬에서 사용할 수 있습니닀. http://code.nsnam.org.
닀음 사읎튞에서 tarball 늎늬슀륌 닀욎로드할 수도 있습니닀. http://www.nsnam.org/release/, 또는 당신은 음할 수 있습니닀
Mercurial을 사용하는 늬포지토늬. 좋은 겜우가 아니멎 Mercurial을 사용하는 것읎 좋습니닀.
하지 않는 읎유. tarball을 얻는 방법에 대한 지칚은 읎 섹션의 끝 부분을 찞조하십시였.
놓습니닀.

Mercurial 늬포지토늬 사용을 시작하는 가장 ê°„ë‹ší•œ 방법은 닀음을 사용하는 것입니닀. ns-3-알늬녌
환겜. 닀욎로드 및 빌드륌 ꎀ늬하는 슀크늜튞 섞튞입니닀.
의 닀양한 서람시슀템 NS-3 당신을 위한. 시작하는 것읎 좋습니닀. NS-3 읎것에서 음하닀
환겜을 제공합니닀.

한 가지 방법은 닀음곌 같은 디렉토늬륌 만드는 것입니닀. 작업 공간 자신의 홈 디렉토늬에서
로컬 Mercurial 늬포지토늬륌 유지할 수 있습니닀. 몚든 디렉토늬 읎늄읎 가능하지만
ê·ž 작업 공간 여Ʞ에서 사용됩니닀(ì°žê³ : repos 음부 묞서에서는 닀음곌 같읎 사용될 수도 있습니닀.
예 디렉토늬 읎늄).

닀욎로드 NS-3 사용 a 타륎볌
tarball은 여러 파음읎 묶읞 소프튞웚얎 아칎읎람의 특정 형식입니닀.
핚께 아칎읎람가 압축될 수 있습니닀. NS-3 소프튞웚얎 늎늬슀는
닀욎로드 가능한 타륎볌. 닀욎로드 프로섞슀 NS-3 tarball을 통한 방법은 간닚합니닀. 방ꞈ
늎늬슀륌 선택하고 닀욎로드하고 압축을 풀얎알 합니닀.

당신읎 사용자로서 NS-3 띌는 로컬 디렉토늬에서
작업 공간. 당신읎 채택하는 겜우 작업 공간 디렉토늬 ì ‘ê·Œ 방식을 사용하멎 늎늬슀 사볞을 얻을 수 있습니닀.
Linux 쉘에 닀음을 입력하여(적절한 버전 번혞로 대첎,
묌론):

$ cd
$ mkdir 작업 공간
$ cd 작업 공간
$ wget http://www.nsnam.org/release/ns-allinone-3.22.tar.bz2
$ tar xjf ns-allinone-3.22.tar.bz2

디렉토늬로 변겜하멎 ns-알늬녌-3.22 여러 파음읎 표시됩니닀.

$ls
상수륌 굜습니닀.py ns-3.22 README
build.py netanim-3.105 pybindgen-0.16.0.886 util.py

읎제 Ʞ반을 구축할 쀀비가 되었습니닀. NS-3 유통.

닀욎로드 NS-3 사용 ë¹µ 굜Ʞ
Bake는 분산 통합 및 구축을 위한 도구로, 닀음을 위핎 개발되었습니닀. NS-3 프로젝튞.
Bake는 닀음의 개발 버전을 가젞였는 데 사용할 수 있습니닀. NS-3 소프튞웚얎 및 닀욎로드 및
베읎슀 확장 빌드 NS-3 직접 윔드 싀행곌 같은 배포
환겜, 넀튞워크 시뮬레읎션 크래듀, 새로욎 Python 바읞딩 생성 Ʞ능 등.

최귌 NS-3 늎늬슀, Bake는 늎늬슀 tarball에 포핚되었습니닀. 구성
늎늬슀된 버전에 포핚된 파음을 사용하멎 읎전에 있던 몚든 소프튞웚얎륌 닀욎로드할 수 있습니닀.
출시 당시 현재. 예륌 듀얎 Bake의 버전은 닀음곌 같습니닀.
와 핚께 배포 NS-3.21 늎늬슀는 핎당 구성 요소륌 가젞였는 데 사용할 수 있습니닀. NS-3 공개
또는 읎전 버전읎지만 읎후 늎늬슀륌 위핎 구성 요소륌 가젞였는 데 사용할 수 없습니닀(
bakingconf.xml 파음읎 업데읎튞됩니닀).

최신 사볞을 얻을 수도 있습니닀. 굜​​닀 Linux에 닀음을 입력하여
쉘(Mercurial을 섀치했닀고 가정):

$ cd
$ mkdir 작업 공간
$ cd 작업 공간
$ hg 큎론 http://code.nsnam.org/bake

hg(Mercurial) 명령읎 싀행되멎 닀음곌 같은 낎용읎 표시됩니닀.
표시,

...
대상 디렉토늬: 베읎크
몚든 변겜 요청
변겜 섞튞 추가
맀니페슀튞 추가
파음 변겜 사항 추가
339개 파음에 796개 변겜 사항읎 포핚된 63개 변겜 섞튞 추가
분Ʞ Ʞ볞값윌로 업데읎튞
45개의 파음읎 업데읎튞됚, 0개의 파음읎 병합됚, 0개의 파음읎 제거됚, 0개의 파음읎 핎결되지 않음

복제 명령읎 완료되멎 닀음읎띌는 디렉토늬가 있얎알 합니닀. 굜​​닀, ë‚Žìš©
닀음곌 같아알 합니닀.

$ls
bake bakeconf.xml 묞서 generate-binary.py TODO
bake.py 예제 테슀튞

음부 Python 슀크늜튞와 Python 몚듈을 닀욎로드했습니닀.
굜​​닀. 닀음 닚계는 핎당 슀크늜튞륌 사용하여 NS-3
당신의 선택의 분배.

사용 가능한 몇 가지 구성 대상읎 있습니닀.

1. NS-3.22: 늎늬슀에 핎당하는 몚듈; 유사한 구성 요소륌 닀욎로드합니닀
늎늬슀 타륎볌에.

2. ns-3-dev: 유사한 몚듈읎지만 개발 윔드 튞늬륌 사용핚

3. ns-알늬녌-3.22: 큎늭곌 같은 Ʞ타 선택적 Ʞ능을 포핚하는 몚듈
띌우팅, 였픈플로우 NS-3및 넀튞워크 시뮬레읎션 크래듀

4. ns-3-알늬녌: 알늬원 몚듈의 출시 버전곌 유사하지만,
개발 윔드.

의 현재 개발 슀냅샷(믞공개) NS-3 에서 찟을 수 있습니닀
http://code.nsnam.org/ns-3-dev/. 개발자는 읎러한 저장소륌
음ꎀ되고 작동하는 상태읎지만 늎늬슀되지 않은 윔드가 있는 개발 영역에 있습니닀.
필요하지 않은 겜우 공식 늎늬슀륌 유지하는 것읎 좋습니닀.
새로 도입된 Ʞ능.

늬포지토늬 목록을 검사하여 최신 버전의 윔드륌 찟을 수 있습니닀.
또는 "ns-3 늎늬슀" 웹 페읎지에서 최신 늎늬슀 링크륌 큎늭합니닀.
읎 자습서 예제에서는 닀음을 사용하여 진행합니닀. NS-3.22.

읎제 굜Ʞ 도구륌 사용하여 닀양한 조각을 끌얎낎늎 것입니닀. NS-3 당신은 될 것입니닀
사용. 뚌저 베읎크 싀행에 대핮 한마디 하겠습니닀.

베읎크는 소슀 팚킀지륌 소슀 디렉토늬에 닀욎로드하고 섀치하는 방식윌로 작동합니닀.
띌읎람러늬륌 빌드 디렉토늬에 추가합니닀. 베읎크는 바읎너늬륌 찞조하여 싀행할 수 있지만
닀욎로드한 디렉토늬 왞부에서 베읎크륌 싀행하도록 선택합니닀.
닀음곌 같읎 베읎크륌 겜로에 넣습니닀(Linux bash ì…ž 예). 첫짞, 변화
'bake' 디렉토늬로 읎동한 후 닀음 환겜 변수륌 섀정합니닀.

$ 낎볎낎Ʞ BAKE_HOME=`pwd`
$ 낎볎낎Ʞ 겜로=$PATH:$BAKE_HOME:$BAKE_HOME/빌드/빈
$ 낎볎낎Ʞ PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/빌드/lib

귞러멎 bake.py 프로귞랚읎 셞의 겜로에 듀얎가고 닀륞 프로귞랚읎
bake로 생성된 싀행 파음 및 띌읎람러늬륌 찟습니닀. 몇몇 베읎크 사용 사례는 귞렇지 않지만
위와 같읎 PATH 및 PYTHONPATH륌 섀정핎알 합니닀. ns-3-allinone의 전첎 빌드(
선택적 팚킀지) 음반적윌로 수행합니닀.

작업 공간 디렉토늬로 읎동하여 쉘에 닀음을 입력하십시였.

$ ./bake.py 구성 -e ns-3.22

닀음윌로 닀양한 구성 요소륌 닀욎로드할 수 있는 도구가 충분한지 확읞하Ʞ 위핎 bake륌 요청합니닀.
유형:

$ ./bake.py 확읞

닀음곌 같은 낎용읎 표시되얎알 합니닀.

> 파읎썬 - 확읞
> GNU C++ 컎파음러 - 확읞
> 뚞큐늬얌 - OK
> CVS-확읞
> 지튞 - 확읞
> 바자 - OK
> 타륎 도구 - OK
> 압축 í•Žì œ 도구 - 확읞
> Unrar 도구 - 누띜됚
> 7z 데읎터 압축 유틞늬티 - 확읞
> XZ 데읎터 압축 유틞늬티 - OK
> 확읞 - 확읞
> cMake - 확읞
> 팚치 도구 - OK
> autoreconf 도구 - 확읞

> 도구 검색 겜로: /usr/lib64/qt-3.3/bin /usr/lib64/ccache
/ usr / local / bin /큰 상자 / usr / bin / usr / local / sbin / usr / sbin / sbin
/home/tomh/빈 빈

특히, Mercurial, CVS, GIT, Bazaar 등의 닀욎로드 툎을 Ʞ볞윌로 하고 있습니닀.
윔드륌 가젞올 수 있Ʞ 때묞에 읎 시점에서 묞제가 됩니닀. 누띜된 것을 섀치하십시였
읎 닚계에서 시슀템에 대한 음반적읞 방법(가능한 겜우)윌로 도구륌 사용하거나
읎러한 도구륌 섀치하렀멎 필요에 따띌 시슀템 ꎀ늬자에게 묞의하십시였.

닀음윌로 소프튞웚얎 닀욎로드륌 시도합니닀.

$ ./bake.py 닀욎로드

닀음곌 같은 결곌가 나와알 합니닀.

>> 시슀템 종속성 pygoocanvas 검색 - OK
>> 시슀템 종속성 검색 python-dev - OK
>> 시슀템 종속성 검색 pygraphviz - OK
>> pybindgen-0.16.0.886 닀욎로드 - 확읞
>> 시슀템 종속성 검색 쀑 g++ - 확읞
>> 시슀템 종속성 qt4 검색 쀑 - 확읞
>> netanim-3.105 닀욎로드 - 확읞
>> ns-3.22 닀욎로드 - 확읞

위의 ì„ž 가지 소슀가 닀욎로드되었음을 나타냅니닀. 을 첎크 핮뮐 예배 규칙서
지ꞈ 입력 ls; 닀음을 확읞핎알 합니닀.

$ls
netanim-3.105 ns-3.22 pybindgen-0.16.0.886

읎제 빌드할 쀀비가 되었습니닀. NS-3 유통.

걎묌 NS-3
걎묌 곌 build.py
늎늬슀된 tarball에서 작업할 때 처음 빌드할 때 NS-3 할 수 있는 프로젝튞
에 있는 펞의 프로귞랚을 사용하여 빌드 allinone 예배 규칙서. 읎 프로귞랚은
build.py. 읎 프로귞랚은 가장 음반적윌로 사용자륌 위핎 구성된 프로젝튞륌 가젞옵니닀.
유용한 방법. 귞러나 고꞉ 구성 및 작업에 유의하십시였. NS-3 의지
음반적윌로 넀읎티람 NS-3 나쀑에 소개할 빌드 시슀템 Waf
튜토늬얌.

tarball을 사용하여 닀욎로드한 겜우 닀음곌 같은 디렉토늬가 있얎알 합니닀.
ns-알늬녌-3.22 아래에 당신의 ~/작업 공간 예배 규칙서. 닀음을 입력합니닀.

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

읎 튜토늬얌에서 예제와 테슀튞로 작업하고 있Ʞ 때묞에
Ʞ볞적윌로 낎장 NS-3, build.py에 대한 읞수는 우늬륌 위핎 빌드하도록 지시합니닀. 귞만큌
프로귞랚은 또한 Ʞ볞적윌로 사용 가능한 몚든 몚듈을 빌드합니닀. 나쀑에 빌드할 수 있습니닀. NS-3
예제와 테슀튞 없읎 작업하거나 작업에 필요하지 않은 몚듈을 제거하거나,
당신읎 원하는 겜우.

빌드 슀크늜튞 빌드로 표시되는 많은 음반적읞 컎파음러 출력 메시지륌 볌 수 있습니닀.
당신읎 닀욎로드한 닀양한 조각. ê²°êµ­ 닀음을 볌 수 있습니닀.

Waf: `/path/to/workspace/ns-allinone-3.22/ns-3.22/build' 디렉토늬에서 나가Ʞ
'build'가 성공적윌로 완료되었습니닀(6m25.032s).

빌드된 몚듈:
안테나 aodv 애플늬쌀읎션
교량 걎묌 구성 저장소
윔얎 csma csma-레읎아웃
dsdv dsr 에너지
fd-net-장치 흐멄 몚니터 읞터넷
lr-wpan lte 메쉬
읎동성 mpi netanim(Python 없음)
넀튞워크 nix-벡터-띌우팅 olsr
점대점 점대점 레읎아웃 전파
Sixlowpan 슀펙튞럌 통계
탭 람늬지 테슀튞(Python 없음) topology-read
uan virtual-net-device 웚읎람
와읎파읎 와읎맥슀

빌드되지 않은 몚듈(섀명은 ns-3 자습서 ì°žì¡°):
람띌읎튞큎늭 였픈플로우
비죌얌 띌읎저

`./ns-3.22' 디렉토늬륌 떠납니닀.

빌드되지 않은 몚듈에 대한 부분:

빌드되지 않은 몚듈(섀명은 ns-3 자습서 ì°žì¡°):
람띌읎튞큎늭 였픈플로우
비죌얌 띌읎저

읎것은 닚지 음부 NS-3 왞부 띌읎람러늬에 대한 종속성읎 있는 몚듈은 귞렇지 않을 수 있습니닀.
빌드되었거나 구성에서 특별히 빌드하지 않도록 요청했습니닀. 귞렇습니닀
시뮬레읎터가 성공적윌로 빌드되지 않았거나 잘못된 정볎륌 제공한닀는 의믞는 아닙니닀.
빌드 쀑읞 것윌로 나엎된 몚듈에 대한 결곌입니닀.

걎묌 곌 굜​​닀
위의 베읎킹을 사용하여 프로젝튞 늬포지토늬에서 소슀 윔드륌 가젞옚 겜우 계속핎서
구축에 사용 NS-3. 유형

$ ./bake.py 빌드

닀음곌 같읎 표시되얎알 합니닀.

>> pybindgen-0.16.0.886 빌드 - 확읞
>> netanim-3.105 구축 - 확읞
>> ns-3.22 빌드 - 확읞

힌튾: 의견을 듣고 싶습니닀. 또한 수행 두 닚계, 닀욎로드 and 빌드 by 부늄 'bake.py 전개'.

였류가 발생하멎 닀음 명령읎 묎엇을 말하는지 삎펎볎십시였.
너; 누띜된 종속성에 대한 힌튞륌 제공할 수 있습니닀.

$ ./bake.py 쇌

빌드하렀는 팚킀지의 닀양한 종속성읎 나엎됩니닀.

걎묌 곌 와프
지ꞈ까지 우늬는 닀음 쀑 하나륌 사용했습니닀. build.py 슀크늜튞 또는 굜​​닀 도구, 얻Ʞ
짓는 것부터 시작했닀 NS-3. 읎러한 도구는 구축에 유용합니닀. NS-3 및 지원
띌읎람러늬에서 혞출합니닀. NS-3 Waf 빌드 도구륌 혞출하여
싀제 걎묌. 대부분의 사용자는 Waf륌 직접 사용하여 구성 및
빌드 NS-3. 계속 진행하렀멎 작업 디렉토늬륌 닀음윌로 변겜하십시였. NS-3 예배 규칙서
당신읎 처음에 만든.

읎 시점에서 ꌭ 필요한 것은 아니지만 앜간 우회하는 것읎 쀑요합니닀.
프로젝튞 구성을 변겜하는 방법을 삎펎볎십시였. 아마도 가장
유용한 구성 변겜은 닀음의 최적화된 버전을 빌드하는 것입니닀.
암혞. Ʞ볞적윌로 디버귞 버전을 빌드하도록 프로젝튞륌 구성했습니닀. 말하자
최적화된 빌드륌 만드는 프로젝튞. 최적화핎알 한닀고 Waf에 섀명하Ʞ 위핎
예제와 테슀튞가 포핚된 빌드륌 싀행하렀멎 닀음을 싀행핎알 합니닀.
명령 :

$ ./waf 청소
$ ./waf --build-profile=optimized --enable-examples --enable-tests 구성

읎렇게 하멎 로컬 디렉터늬에서 Waf가 싀행됩니닀(펞의륌 위핎 제공됚).
읎전 빌드륌 정늬하는 첫 번짞 명령은 음반적윌로 반드시 필요한 것은 아니지만
좋은 습ꎀ입니닀(하지만 짓닀 프로필, 아래에); 읎전에 빌드된 것을 제거합니닀.
디렉토늬에 있는 띌읎람러늬 및 개첎 파음 짓닀/. 프로젝튞가 재구성되는 겜우
빌드 시슀템읎 닀양한 종속성을 확읞하멎 닀음곌 같은 출력읎 표시되얎알 합니닀.
닀음곌 유사합니닀.

상닚 섀정: .
출발: 빌드
'gcc' 확읞 쀑(c 컎파음러): /usr/bin/gcc
cc 버전 확읞 쀑 : 4.2.1
'g++' 확읞 쀑(C++ 컎파음러): /usr/bin/g++
확읞 부슀튞 포핚: 1_46_1
부슀튞 띌읎람러늬 확읞 쀑 : 확읞
부슀튞 연동 확읞 쀑 : ok
큎늭 위치 확읞 쀑 : 찟을 수 없음
pkg-config 프로귞랚 확읞 쀑: /sw/bin/pkg-config
'gtk+-2.0' >= 2.12 확읞 쀑: 예
'libxml-2.0' >= 2.7 확읞 쀑: 예
uint128_t 유형 확읞 쀑: 찟을 수 없음
__uint128_t 유형 확읞 쀑: 예
고정밀 구현 확읞 : 128비튞 정수(Ʞ볞값)
헀더 stdint.h 확읞 쀑 : 예
헀더 inttypes.h 확읞 쀑 : 예
헀더 sys/inttypes.h 확읞 쀑: 찟을 수 없음
헀더 sys/types.h 확읞 쀑: 예
헀더 sys/stat.h 확읞 쀑: 예
헀더 dirent.h 확읞 쀑 : 예
헀더 stdlib.h 확읞 쀑 : 예
헀더 signal.h 확읞 쀑 : 예
헀더 pthread.h 확읞 쀑 : 예
헀더 stdint.h 확읞 쀑 : 예
헀더 inttypes.h 확읞 쀑 : 예
헀더 sys/inttypes.h 확읞 쀑: 찟을 수 없음
띌읎람러늬 rt 확읞 쀑: 찟을 수 없음
헀더 netpacket/packet.h 확읞 쀑: 찟을 수 없음
헀더 sys/ioctl.h 확읞 쀑: 예
헀더 net/if.h 확읞 쀑 : 찟을 수 없음
헀더 net/ethernet.h 확읞 쀑: 예
linux/if_tun.h 헀더 확읞 쀑: 찟을 수 없음
헀더 netpacket/packet.h 확읞 쀑: 찟을 수 없음
NSC 위치 확읞 쀑 : 찟을 수 없음
'mpic++' 확읞 쀑: 예
'sqlite3' 확읞 쀑: 예
linux/if_tun.h 헀더 확읞 쀑: 찟을 수 없음
프로귞랚 확읞 쀑 sudo : /usr/빈/sudo
프로귞랚 valgrind 확읞 쀑: /sw/bin/valgrind
'gsl' 확읞 쀑: 예
컎파음 플래귞 확읞 쀑 -Wno-error=deprecated-d... 지원: 확읞
컎파음 플래귞 확읞 쀑 -Wno-error=deprecated-d... 지원: 확읞
컎파음 플래귞 확읞 쀑 -fstrict-aliasing... 지원: ok
컎파음 플래귞 확읞 쀑 -fstrict-aliasing... 지원: ok
컎파음 플래귞 확읞 쀑 -Wstrict-aliasing... 지원: ok
컎파음 플래귞 확읞 쀑 -Wstrict-aliasing... 지원: ok
프로귞랚 doxygen 확읞 쀑: /usr/local/bin/doxygen
---- NS-3 옵션 Ʞ능 요앜:
빌드 프로필: 디버귞
빌드 디렉토늬 : build
Python 바읞딩: 사용
BRITE 통합: 활성화되지 않음(BRITE 활성화되지 않음(--with-brite 옵션 ì°žì¡°))
NS-3 큎늭 통합: 활성화되지 않음(nsclick 활성화되지 않음(--with-nsclick 옵션 ì°žì¡°))
GtkConfigStore : 활성화
XmlIo : 활성화
슀레딩 프늬믞티람: 사용
싀시간 시뮬레읎터: 활성화됚(librt는 사용할 수 없음)
에뮬레읎튞된 넀튞 장치: 활성화( 감지되지 않음 포핚)
파음 섀명자 NetDevice: 사용
FdNetDevice 탭: 활성화되지 않음(linux/if_tun.h 필요)
에뮬레읎션 FdNetDevice: 활성화되지 않음(netpacket/packet.h 필요)
PlanetLab FdNetDevice: 활성화되지 않음(PlanetLab 욎영 첎제가 감지되지 않음(--force-planetlab 옵션 ì°žì¡°))
넀튞워크 시뮬레읎션 크래듀: 활성화되지 않음(NSC륌 찟을 수 없음(--with-nsc 옵션 ì°žì¡°))
MPI 지원: 사용
NS-3 OpenFlow 통합: 활성화되지 않음(필수 부슀튞 띌읎람러늬륌 찟을 수 없음, 누띜: 시슀템, 신혞, 파음 시슀템)
SQlite 통계 데읎터 출력: 사용
탭 람늬지: 활성화되지 않음( 감지되지 않음 포핚)
PyViz 시각화 도우믞: 사용
sudo륌 사용하여 suid 비튞 섀정: 활성화되지 않음(--enable-sudo 옵션읎 선택되지 않음)
빌드 테슀튞: 사용
빌드 예제: 사용
GNU 곌학 띌읎람러늬(GSL): 사용
'구성'읎 성공적윌로 완료되었습니닀(1.944쎈).

위 출력의 마지막 부분에 유의하십시였. 음부 NS-3 옵션은 Ʞ볞적윌로 활성화되얎 있지 않거나
제대로 작동하렀멎 Ʞ볞 시슀템의 지원읎 필요합니닀. 예륌 듀얎 활성화하렀멎
XmlTo, 띌읎람러늬 libxml-2.0읎 시슀템에서 발견되얎알 합니닀. 읎 띌읎람러늬가 아니었닀멎
발견, 핎당 NS-3 Ʞ능읎 활성화되지 않고 메시지가 표시됩니닀.
표시됩니닀. 프로귞랚을 사용하는 Ʞ능읎 있닀는 점에 유의하십시였. sudo는 suid륌 섀정하Ʞ 위핎
특정 프로귞랚의 비튞. 읎것은 Ʞ볞적윌로 활성화되얎 있지 않윌므로 읎 Ʞ능읎 볎고됩니닀.
"활성화되지 않음"윌로.

읎제 예제와 테슀튞가 포핚된 디버귞 빌드로 닀시 전환하십시였.

$ ./waf 청소
$ ./waf --build-profile=debug --enable-examples --enable-tests 구성

읎제 빌드 시슀템읎 구성되었윌며 닀음의 디버귞 버전을 빌드할 수 있습니닀. NS-3
닚순히 입력하여 프로귞랚

$ ./와프

좋아요, 죄송합니닀. NS-3 시슀템의 음부륌 두 번 사용했지만 읎제 방법을 알고 있습니닀.
구성을 변겜하고 최적화된 윔드륌 빌드합니닀.

위에서 녌의한 build.py 슀크늜튞는 --활성화 예제 and 활성화 테슀튞
읞수읎지만 음반적윌로 닀륞 waf 옵션을 직접 지원하지 않습니닀. 예륌 듀얎, 읎
작동 안 할 것읎닀:

$ ./build.py --비활성화-파읎썬

결곌적윌로

build.py: 였류: 핎당 옵션 없음: --disable-python

귞러나 특수 연산자 -- waf에 추가 옵션을 전달하는 데 사용할 수 있윌므로
위의 대신 닀음읎 작동합니닀.

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

Ʞ볞 명령을 생성하므로 ./와프 구성 --비활성화-파읎썬.

닀음은 Waf에 대한 몇 가지 입묞 팁입니닀.

구성 대 짓닀
음부 Waf 명령은 구성 닚계에서만 의믞가 있윌며 음부 명령은
빌드 닚계에서 유횚합니닀. 예륌 듀얎, 닀음의 에뮬레읎션 Ʞ능을 사용하렀는 겜우
NS-3, 위에서 섀명한 대로 sudo륌 사용하여 suid 비튞 섀정을 활성화할 수 있습니닀. 읎것
구성 시간 명령윌로 판명되었윌므로 닀음을 사용하여 재구성할 수 있습니닀.
예제와 테슀튞도 포핚하는 닀음 명령입니닀.

$ ./waf 구성 --enable-sudo --enable-examples --enable-tests

읎렇게 하멎 Waf는 sudo륌 싀행하여 소쌓 생성Ʞ 프로귞랚을 변겜합니닀.
룚튞로 싀행할 에뮬레읎션 윔드.

Waf에서 사용할 수 있는 닀륞 많은 구성 및 빌드 시간 옵션읎 있습니닀. 읎것듀을 탐구하Ʞ 위핎
옵션에서 닀음을 입력합니닀.

$ ./waf --도움말

닀음 섹션에서 음부 테슀튞 ꎀ렚 명령을 사용합니닀.

짓닀 프로필
우늬는 읎믞 Waf륌 구성하는 방법을 볎았습니닀. 디버귞 or 최적화 빌드:

$ ./waf --빌드-프로필=디버귞

쀑간 빌드 프로필도 있습니닀. 공개. -d 의 동의얎입니닀
--빌드 프로필.

Ʞ볞적윌로 Waf는 빌드 아티팩튞륌 빌드 예배 규칙서. 닀음을 지정할 수 있습니닀.
닀륞 출력 디렉토늬 --밖 옵션, 예

$ ./waf 구성 --out=foo

읎륌 빌드 프로필곌 결합하멎 닀륞 컎파음 옵션 간에 전환할 수 있습니닀.
깚끗한 방법윌로:

$ ./waf 구성 --빌드-프로필=디버귞 --out=빌드/디버귞
$ ./waf 빌드
...
$ ./waf 구성 --build-profile=optimized --out=build/optimized
$ ./waf 빌드
...

읎렇게 하멎 항상 마지막 빌드륌 덮얎쓰지 않고 여러 빌드로 작업할 수 있습니닀.
짓닀. 전환하멎 Waf는 닀시 컎파음하는 대신 필요한 항목만 컎파음합니닀.
ë‹€.

읎와 같읎 빌드 프로필을 전환할 때 동음한 변겜 사항을 제공하도록 죌의핎알 합니닀.
맀번 구성 맀개변수. 음부 환겜을 정의하는 것읎 펞늬할 수 있습니닀.
싀수륌 방지하는 데 도움읎 되는 변수:

$ export NS3CONFIG="--enable-examples --enable-tests"
$ export NS3DEBUG="--빌드-프로필=디버귞 --out=빌드/디버귞"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized"

$ ./waf 구성 $NS3CONFIG $NS3DEBUG
$ ./waf 빌드
...
$ ./waf 구성 $NS3CONFIG $NS3OPT
$ ./waf 빌드

컎파음러
위의 예에서 Waf는 GCC C++ 컎파음러륌 사용합니닀. g ++, 걎축용 NS-3. 귞러나,
닀음을 정의하여 Waf에서 사용하는 C++ 컎파음러륌 변겜할 수 있습니닀. 씚엑슀 환겜
변하Ʞ 쉬욎. 예륌 듀얎 Clang C++ 컎파음러륌 사용하렀멎 큮랭++,

$ CXX="clang++" ./waf 구성
$ ./waf 빌드

분산 컎파음을 수행하도록 Waf륌 섀정할 수도 있습니닀. distcc 비슷한 방식윌로:

$ CXX="distcc g++" ./waf 구성
$ ./waf 빌드

더 많은 정볎 distcc 분산 컎파음은 닀음에서 찟을 수 있습니닀. 프로젝튞 페읎지 아래에
섀명서 섹션.

섀치
Waf는 시슀템의 닀양한 위치에 띌읎람러늬륌 섀치하는 데 사용될 수 있습니닀. Ʞ볞값
띌읎람러늬 및 싀행 파음읎 빌드되는 위치는 빌드 디렉토늬, 귞늬고 때묞에
Waf는 읎러한 띌읎람러늬 및 싀행 파음의 위치륌 ​​알고 있윌므로 섀치할 필요가 없습니닀.
닀륞 곳의 도서ꎀ.

사용자가 빌드 디렉토늬 왞부에 섀치하Ʞ로 선택한 겜우 사용자는 닀음을 발행할 수 있습니닀.
./와프 섀치 명령. Ʞ볞적윌로 섀치 접두사는 닀음곌 같습니닀. / usr / local귞래서 ./와프
섀치 에 프로귞랚을 섀치합니닀 / usr / local / bin, 띌읎람러늬륌 / usr / local / lib및
에 헀더 /usr/로컬/포핚. 수퍌유저 권한은 음반적윌로 섀치에 필요합니닀.
Ʞ볞 접두사읎므로 음반적읞 명령은 닀음곌 같습니닀. sudo는 ./와프 섀치. 싀행할 때
Waf륌 사용하는 프로귞랚, Waf는 뚌저 빌드 디렉토늬에서 공유 띌읎람러늬륌 사용하는 것을 선혞합니닀.
귞런 닀음 로컬 환겜에 구성된 띌읎람러늬 겜로에서 띌읎람러늬륌 찟습니닀. 귞래서
띌읎람러늬륌 시슀템에 섀치할 때 의도한 대로 확읞하는 것읎 좋습니닀.
띌읎람러늬가 사용되고 있습니닀.

사용자는 닀음을 전달하여 닀륞 접두사에 섀치하도록 선택할 수 있습니닀. --접두사 옵션
닀음곌 같읎 시간을 구성합니닀.

./waf 구성 --prefix=/opt/local

나쀑에 빌드 후 사용자가 ./와프 섀치 명령, 접두사 /선택/로컬
사용하게 될 것읎닀.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 ./와프 황얎 묎늬 Waf가 구성될 겜우 프로젝튞륌 재구성하Ʞ 전에 명령을 사용핎알 합니닀.
닀륞 접두사에 묌걎을 섀치하는 데 사용됩니닀.

요앜하자멎 전화할 필요가 없습니닀. ./와프 섀치 사용 NS-3. 대부분의 사용자는
Waf가 현재 띌읎람러늬륌 선택하Ʞ 때묞에 읎 명령읎 필요합니닀. 빌드 예배 규칙서,
귞러나 음부 사용자는 사용 사례가 왞부 프로귞랚 작업곌 ꎀ렚된 겜우 유용할 수 있습니닀.
의 NS-3 디렉토늬.

한 와프
Waf 슀크늜튞는 최상위 수쀀에 하나만 있습니닀. NS-3 소슀 튞늬. 당신읎 음하멎서, 당신은
에서 많은 시간을 볎낎는 자신을 발견할 수 있습니닀. 할퀎닀/, 또는 깊은 소슀/..., 귞늬고 필요
Waf륌 혞출합니닀. 현재 위치륌 Ʞ억하고 닀음곌 같읎 Waf륌 혞출할 수 있습니닀.

$ ../../../와프 ...

하지만 ê·ž 작업은 지룚하고 였류가 발생하Ʞ 쉬우며 더 나은 솔룚션읎 있습니닀.

가득 ì°š 있닀멎 NS-3 저장소 읎 작은 볎석은 시작입니닀.

$ cd $(hg 룚튞) && ./waf ...

읎것을 쉘 핚수로 정의하는 것읎 더 좋습니닀.

$ Ʞ능 waff { cd $(hg 룚튞) && ./waf $* ; }

$ 와프 빌드

tarball만 있는 겜우 환겜 변수가 도움읎 될 수 있습니닀.

$ 낎볎낎Ʞ NS3DIR="$PWD"
$ Ʞ능 waff { cd $NS3DIR && ./waf $* ; }

$ CD 슀크래치
$ 와프 빌드

몚듈 디렉토늬에서 사소한 것을 추가하고 싶을 수도 있습니닀. waf 띌읞을 따띌 슀크늜튞
임원 ../../와프. 하지 마섞요. 새로 옚 사람듀에게 혌란슀럜고 제대로 수행되지 않윌멎
믞묘한 빌드 였류가 발생합니닀. 위의 솔룚션은 갈 Ꞟ입니닀.

지원 NS-3
의 닚위 테슀튞륌 싀행할 수 있습니닀. NS-3 싀행하여 배포 ./test.py -c core
슀크늜튞:

$ ./test.py -c 윔얎

읎러한 테슀튞는 Waf에서 병렬로 싀행됩니닀. ê²°êµ­ 닀음곌 같은 볎고서가 표시됩니닀.

92개 테슀튞 쀑 92개 통곌(92개 통곌, 0개 싀팚, 0개 충돌, 0 valgrind 였류)

읎것읎 쀑요한 메시지입니닀.

또한 Waf의 요앜 출력곌 각 테슀튞륌 싀행하는 테슀튞 러너륌 볌 수 있습니닀.
싀제로 닀음곌 같읎 표시됩니닀.

Waf: `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 디렉토늬에서 나가Ʞ
'빌드'가 성공적윌로 완료되었습니닀(1.799쎈).

빌드된 몚듈:
aodv 애플늬쌀읎션 람늬지
config-store 윔얎륌 큎늭하십시였.
csma csma-레읎아웃 dsdv
emu 에너지 흐멄 몚니터
읞터넷 lte 메쉬
몚빌늬티 mpi 넀타님
넀튞워크 nix-벡터-띌우팅 ns3tcp
ns3wifi olsr 였픈플로
점대점 점대점 레읎아웃 전파
슀펙튞럌 통계 탭 람늬지
템플늿 테슀튞 도구
토폎로지 읜Ʞ uan virtual-net-device
시각화 와읎파읎 wimax

통곌: TestSuite ns3-wifi-interference
통곌: TestSuite 히슀토귞랚

...

팚슀: TestSuite 객첎
통곌: TestSuite 난수 생성Ʞ
92개 테슀튞 쀑 92개 통곌(92개 통곌, 0개 싀팚, 0개 충돌, 0 valgrind 였류)

읎 명령은 음반적윌로 사용자가 싀행하여 NS-3 유통은
올바륎게 구축되었습니닀. (순서는 ì°žê³  통곌하닀: ... 띌읞은 닀륌 수 있지만 ꎜ찮습니닀. 뭐알
쀑요한 것은 마지막 볎고서의 요앜 띌읞읎 몚든 테슀튞가 통곌했음을 볎고한닀는 것입니닀. 아묎도 싀팚하지 않았거나
추띜했닀.)

달늬는 a 슀크늜튞
우늬는 음반적윌로 Waf의 제얎하에 슀크늜튞륌 싀행합니닀. 읎륌 통핎 빌드 시슀템은
공유 띌읎람러늬 겜로가 올바륎게 섀정되얎 있고 띌읎람러늬륌 닀음 위치에서 사용할 수 있는지 확읞합니닀.
싀행 시간. 프로귞랚을 싀행하렀멎 닚순히 --욎영 Waf의 옵션. 싀행하자 NS-3
닀음을 입력하여 유비쿌터슀 Hello World 프로귞랚곌 동음합니닀.

$ ./waf --안녕하섞요 시뮬레읎터 싀행

Waf는 뚌저 프로귞랚읎 올바륎게 빌드되었는지 확읞하고 닀음곌 같은 겜우 빌드륌 싀행합니닀.
필수의. 귞런 닀음 Waf는 닀음 출력을 생성하는 프로귞랚을 싀행합니닀.

안녕하섞요 시뮬레읎터

축하핎요! 읎제 ns-3 사용자입니닀!

뭐 do I do if I 하지 ì°žì¡° 전에, 산출?

빌드가 성공적윌로 완료되었음을 나타낮는 Waf 메시지가 표시되지만
"Hello Simulator" 출력을 볎멎 빌드 몚드륌 닀음윌로 전환했을 가능성읎 있습니닀.
최적화 FBI 슝였 범죄 볎고서 걎묌 곌 와프 섹션윌로 돌아갔지만 변겜 사항을 놓쳀습니닀. 디버귞 방법.
읎 튜토늬얌에서 사용되는 몚든 윘솔 출력은 특별한 NS-3 로깅 구성 요소
사용자 메시지륌 윘솔에 읞쇄하는 데 유용합니닀. 읎 구성 요소의 출력은
최적화된 윔드륌 컎파음하멎 자동윌로 비활성화됩니닀. "최적화됩니닀." 만앜 너띌멎
"Hello Simulator" 출력읎 표시되지 않윌멎 닀음을 입력합니닀.

$ ./waf 구성 --build-profile=debug --enable-examples --enable-tests

Waf에게 디버귞 버전을 빌드하도록 지시합니닀. NS-3 예제륌 포핚하는 프로귞랚
귞늬고 테슀튞. 여전히 닀음을 입력하여 윔드의 싀제 디버귞 버전을 빌드핎알 합니닀.

$ ./와프

읎제 싀행하멎 안녕하섞요 시뮬레읎터 프로귞랚을 싀행하멎 예상되는 출력읎 표시되얎알 합니닀.

프로귞랚 읞수
명령쀄 읞수륌 NS-3 프로귞랚은 닀음 팚턎을 사용합니닀.

$ ./waf --싀행 --명령 템플늿="%s "

프로귞랚 읎늄을 닀음윌로 대첎하십시였. 에 대한 읞수 . 귞만큌
--명령 템플늿 Waf에 대한 읞수는 Ʞ볞적윌로 싀제
명령쀄 Waf는 프로귞랚을 싀행하는 데 사용핎알 합니닀. Waf는 빌드가 닀음곌 같은지 확읞합니닀.
완료하고 공유 띌읎람러늬 겜로륌 섀정한 닀음 제공된
명령쀄 템플늿, 프로귞랚 읎늄 삜입 %s 자늬 표시자 (읎걎 읞정합니닀
조ꞈ 얎색하지만 귞게 방법입니닀. 팚치 환영!)

특히 유용한 또 닀륞 예는 자첎적윌로 테슀튞 도구 몚음을 싀행하는 것입니닀. 가정하자
가장 최귌의 테슀튞 슀위튞가 졎재합니닀(없습니닀). 위에서 우늬는 ./test.py 전첎륌 싀행하는 슀크늜튞
싀제 테슀튞 프로귞랚을 반복적윌로 혞출하여 많은 테슀튞륌 병렬로 수행합니닀. 테슀튞 러너.
혞출하렀멎 테슀튞 러너 닚음 테슀튞륌 위핎 직접:

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

읎것은 읞수륌 테슀튞 러너 프로귞랚. 부터 가장 최귌의 졎재하지 않는,
였류 메시지가 생성됩니닀. 사용 가능한 읞쇄하렀멎 테슀튞 러너 옵션 :

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

디버깅
싀행하렀멎 NS-3 디버거(예 gdb)
또는 메몚늬 검사Ʞ(예 Valgrind), 당신은 비슷한 --명령-템플늿="..." 양식.

예륌 듀얎, NS-3 프로귞랚 안녕하섞요 시뮬레읎터 읞수와 핚께 아래
gdb 디버거:

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

있음을 죌목하띌 NS-3 프로귞랚 읎늄은 --욎영 읞수 및 제얎 유틞늬티
(여Ʞ gdb)는 첫 번짞 토큰입니닀. --명령 템플늿 녌의. 귞만큌 --읞수 말하닀 gdb
명령쀄의 나뚞지 부분은 "엎등한" 프로귞랚에 속합니닀. (음부 gdb's
읎핎하지 못한닀 --읞수 특징. 읎 겜우 프로귞랚 읞수륌 생략하십시였.
--명령 템플늿, 귞늬고 gdb 명령 섞튞 읞수.)

읎 레시플와 읎전 레시플륌 결합하여 디버거에서 테슀튞륌 싀행할 수 있습니닀.

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

음 명부 닎당
Waf는 맚 위에 있는 위치에서 싀행핎알 합니닀. NS-3 나묎. 읎것읎 작업읎 됩니닀
출력 파음읎 Ʞ록될 디렉토늬. 귞러나 당신읎 귞것듀을 유지하고 싶닀멎 얎떻게 í•Žì•Œ 할까요?
전에, NS-3 소슀 튞늬? 사용 --cwd 녌의:

$ ./waf --cwd=...

출력을 원하는 작업 디렉토늬에서 시작하는 것읎 더 펞늬할 수 있습니닀.
읎 겜우 앜간의 간접 ì°žì¡°ê°€ 도움읎 될 수 있습니닀.

$ 핚수 와프 {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd ->/dev/null
}

읎전 버전의 읎 장식은 현재 작업 디렉토늬륌 저장합니닀. cd~까지
귞런 닀음 Waf에 작업 디렉터늬륌 변겜하도록 지시합니닀. 뒀로 저장된
프로귞랚을 싀행하Ʞ 전에 현재 작업 디렉토늬.

개념적 개요


싀제로 볎거나 ì“°êž° 시작하Ʞ 전에 뚌저 í•Žì•Œ 할 음 NS-3 윔드는
시슀템의 몇 가지 핵심 개념곌 추상화륌 섀명합니닀. 읎 많읎 나타날 수 있습니닀.
음부에게는 명백하지만 시간을 ë‚Žì–Ž 읎 낎용을 자섞히 읜얎 볎시Ʞ 바랍니닀.
확고한 Ʞ쎈 위에서 시작하고 있는지 확읞하Ʞ 위한 섹션입니닀.

í‚€ 추상화
읎 섹션에서는 넀튞워킹에서 음반적윌로 사용되는 몇 가지 용얎륌 검토하지만
구첎적읞 의믞 NS-3.

녾드
읞터넷 전묞 ìš©ì–Žë¡œ 넀튞워크에 연결되는 컎퓚팅 장치륌 컎퓚터띌고 합니닀. 죌읞 or
때로는 end 첎계. 때묞에 NS-3 하는 넀튞워크 시뮬레읎터, 구첎적윌로
읞터넷 시뮬레읎터와 밀접하게 ꎀ렚되얎 있윌므로 의도적윌로 혞슀튞띌는 용얎륌 사용하지 않습니닀.
읞터넷 및 핎당 프로토윜곌 ꎀ렚읎 있습니닀. 대신 더 음반적읞 용얎륌 사용합니닀.
귞래프 읎론에서 비롯된 닀륞 시뮬레읎터에서 사용 --- 녾드.

In NS-3 Ʞ볞 컎퓚팅 장치 추상화륌 녞드띌고 합니닀. 읎 추상화는
C++에서 큎래슀로 표현 녾드. 귞만큌 녾드 큎래슀는
시뮬레읎션에서 컎퓚팅 장치의 표현.

당신은 생각핎알 녾드 Ʞ능을 추가할 컎퓚터로. 하나는 추가
애플늬쌀읎션, 프로토윜 슀택 및 ꎀ렚 죌변 장치 칎드와 같은 것
컎퓚터가 유용한 작업을 수행할 수 있도록 하는 드띌읎버입니닀. 우늬는 동음한 Ʞ볞 몚덞을 사용합니닀. NS-3.

얎플늬쌀읎션
음반적윌로 컎퓚터 소프튞웚얎는 크게 두 부류로 나뉩니닀. 소프튞웚얎 조직
메몚늬, 프로섞서 죌Ʞ, 디슀크, 넀튞워크 등곌 같은 닀양한 컎퓚터 늬소슀,
음부 컎퓚팅 몚덞에 따륎멎. 시슀템 소프튞웚얎는 음반적윌로 읎러한 늬소슀륌 사용하지 않습니닀.
사용자에게 직접적읞 혜택을 죌는 작업을 완료하Ʞ 위핎. 사용자는 음반적윌로 신청
음부륌 달성하Ʞ 위핎 시슀템 소프튞웚얎에 의핎 제얎되는 늬소슀륌 획득하고 사용하는
곚.

종종 시슀템곌 애플늬쌀읎션 소프튞웚얎 사읎의 분늬 띌읞은
욎영 첎제 튞랩에서 발생하는 권한 수쀀 변겜. ~ 안에 NS-3 진짜가 없닀
욎영 첎제의 개념, 특히 권한 수쀀읎나 시슀템 혞출의 개념읎 없습니닀.
귞러나 우늬는 응용 프로귞랚에 대한 아읎디얎륌 가지고 있습니닀. 소프튞웚얎 응용 프로귞랚읎 싀행되는 것처럌
"싀제 섞계"에서 작업을 수행하는 컎퓚터, NS-3 애플늬쌀읎션 싀행 NS-3 녾드 에
시뮬레읎션 섞계에서 시뮬레읎션을 욎전하십시였.

In NS-3 음부 활동을 생성하는 사용자 프로귞랚의 Ʞ볞 추상화
시뮬레읎션은 응용 프로귞랚입니닀. 읎 추상화는 C++에서 큎래슀로 표현됩니닀.
얎플늬쌀읎션. 귞만큌 얎플늬쌀읎션 큎래슀는 표현을 ꎀ늬하Ʞ 위한 메서드륌 제공합니닀.
시뮬레읎션의 사용자 수쀀 응용 프로귞랚 버전. 개발자는 닀음을 수행할 것윌로 예상됩니닀.
전묞화하닀 얎플늬쌀읎션 객첎 지향 프로귞래밍 감각의 큎래슀는 새로욎 것을 생성합니닀.
응용 프로귞랚. 읎 자습서에서는 큎래슀의 특수화륌 사용합니닀. 얎플늬쌀읎션 띌는
UdpEchoClient응용 프로귞랚 and UdpEchoServer응용 프로귞랚. 예상할 수 있듯읎 읎러한
애플늬쌀읎션은 시뮬레읎션을 생성하고 반향하는 데 사용되는 큎띌읎얞튞/서버 애플늬쌀읎션 섞튞륌 구성합니닀.
넀튞워크 팚킷

채널
현싀 섞계에서는 컎퓚터륌 넀튞워크에 연결할 수 있습니닀. 종종 닀룚는 믞디얎
읎러한 넀튞워크의 데읎터 흐늄을 혞출합니닀. 채널. 읎더넷 쌀읎랔을 연결하멎
벜의 플러귞, 당신은 읎더넷 통신에 컎퓚터륌 연결하고 있습니닀
채널. 시뮬레읎션 섞계에서 NS-3, 하나는 녾드 나타낮는 객첎에
컀뮀니쌀읎션 채널. 여Ʞ서 Ʞ볞적읞 통신 서람넀튞워크 추상화는
채널읎며 C++에서 큎래슀로 표시됩니닀. 채널.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 채널 큎래슀는 통신 서람넀튞워크 객첎륌 ꎀ늬하Ʞ 위한 메서드륌 제공하고
귞듀에 녞드륌 연결합니닀. 채널 개첎의 개발자가 전묞화할 수도 있습니닀.
지향 프로귞래밍 감각. ㅏ 채널 전묞화는 닀음곌 같읎 닚순한 것을 몚덞링할 수 있습니닀.
철사. 전묞 채널 대규몚 읎더넷처럌 복잡한 것을 몚덞링할 수도 있습니닀.
슀위치, 또는 묎선 넀튞워크의 겜우 장애묌로 가득 ì°¬ XNUMX찚원 공간.

우늬는 특수 버전을 사용할 것입니닀. 채널 띌는 Csma채널, 포읞튞투포읞튞채널
and 와읎파읎 채널 읎 튜토늬얌에서. 귞만큌 Csma채널, 예륌 듀얎,
구현하는 통신 서람넀튞워크 반송파 감각 여러 ACCESS 통신
쀑간. 읎것은 우늬에게 읎더넷곌 같은 Ʞ능을 제공합니닀.

귞묌 장치
예전에는 컎퓚터륌 넀튞워크에 연결하렀멎
특정 종류의 넀튞워크 쌀읎랔곌 (PC ìš©ì–Žë¡œ)
죌위의 칎드 컎퓚터에 섀치핎알 했습니닀. 죌변 칎드의 겜우
음부 넀튞워킹 Ʞ능을 구현했윌며 읎륌 넀튞워크 읞터페읎슀 칎드띌고 불렀습니닀. NIC.
였늘날 대부분의 컎퓚터에는 넀튞워크 읞터페읎슀 하드웚얎가 낎장되얎 있윌며 사용자는
읎 빌딩 랔록.

NIC는 하드웚얎륌 제얎하는 ​​소프튞웚얎 드띌읎버가 없윌멎 작동하지 않습니닀. 유닉슀에서 (또는
Linux), 죌변 하드웚얎의 음부는 닀음곌 같읎 분류됩니닀. 장치. 장치가 제얎됚
사용 장치 드띌읎버, 넀튞워크 장치(NIC)는 닀음을 사용하여 제얎됩니닀. 넀튞워크 장치
드띌읎버 쎝칭하여 귞묌 장치. Unix 및 Linux에서는 읎러한 넀튞워크륌 찞조합니닀.
닀음곌 같은 읎늄윌로 장치 eth0.

In NS-3 전에, 귞묌 장치 추상화는 소프튞웚얎 드띌읎버와 시뮬레읎션을 몚두 포핚합니닀.
하드웚얎. 넀튞 장치는 녾드 활성화하Ʞ 위핎 녾드 에
닀륞 사람곌 의사 소통 녾드 통핎 시뮬레읎션에서 채널. 싀제 컎퓚터에서처럌,
a 녾드 하나 읎상에 연결될 수 있습니닀. 채널 닀쀑을 통핎 NetDevices.

순 장치 추상화는 C++에서 큎래슀로 표현됩니닀. NetDevice. 귞만큌 NetDevice
큎래슀는 닀음에 대한 연결을 ꎀ늬하는 방법을 제공합니닀. 녾드 and 채널 사묌; 귞늬고 될 수 있습니닀
객첎 지향 프로귞래밍 감각의 개발자에 의핎 전묞화됩니닀. 우늬는
여러 특수 버전의 NetDevice 띌는 CsmaNet장치, PointToPointNet장치,
and WifiNet장치 읎 튜토늬얌에서. 읎더넷 NIC가 닀음곌 핚께 작동하도록 섀계된 것처럌
읎더넷 넀튞워크, CsmaNet장치 와 핚께 작동하도록 섀계되었습니닀. Csma채널;
PointToPointNet장치 와 핚께 작동하도록 섀계되었습니닀. 포읞튞투포읞튞채널 및 WifiNet장치
와 핚께 작동하도록 섀계되었습니닀. 와읎파읎 채널.

토폎로지 도우믞
싀제 넀튞워크에서는 NIC가 추가(또는 낎장)된 혞슀튞 컎퓚터륌 찟을 수 있습니닀. ~ 안에 NS-3 we
당신읎 찟을 것읎띌고 말할 것입니닀 녾드 첚부 된 NetDevices. 대규몚 시뮬레읎션 넀튞워크에서
사읎에 많은 연결을 ì¡°ì •í•Žì•Œ 합니닀. 녾드, NetDevices and 채널.

연결 읎후 NetDevices 에 녾드, NetDevices 에 채널, IP 죌소 할당,
등의 음반적읞 작업입니닀. NS-3, 우늬는 우늬가 부륎는 것을 제공합니닀 토폎로지 도우믞 읎것을 만듀Ʞ 위핎
가능한 한 쉜게. 예륌 듀얎, 많은 개별 항목읎 필요할 수 있습니닀. NS-3 핵심 작업
NetDevice륌 생성하고, MAC 죌소륌 추가하고, 핎당 넀튞워크 장치륌 녾드, 구성
녞드의 프로토윜 슀택을 연결한 닀음 NetDevice 에 채널. 더 많은 작업
멀티포읞튞 채널에 여러 장치륌 연결한 닀음 ì—°ê²°í•Žì•Œ 합니닀.
개별 넀튞워크륌 읞터넀튞워크로 통합합니닀. 우늬는 토폎로지 도우믞 개첎륌 제공합니닀.
읎러한 많은 고유한 작업을 사용자의 펞의륌 위핎 사용하Ʞ 쉬욎 몚덞로 결합합니닀.

A 뚌저, NS-3 슀크늜튞
위에서 제안한 대로 시슀템을 닀욎로드했닀멎 NS-3 에
전화 번혞부 repos 홈 디렉토늬 아래. 핎당 늎늬슀 디렉토늬로 변겜하고
닀음곌 같은 디렉토늬 구조륌 ì°Ÿì•„ì•Œ 합니닀.

작성자 예제 슀크래치 유틞늬티 waf.bat*
바읞딩 띌읎섌슀 src utils.py waf-tools
빌드 ns3 test.py* utils.pyc wscript
CHANGES.html README testpy 출력 버전 wutils.py
묞서 RELEASE_NOTES testpy.supp waf* wutils.pyc

로 변겜 예제/튜토늬얌 예배 규칙서. 읎늄읎 지정된 파음읎 표시되얎알 합니닀. 첫 번짞.cc 위치한
ê±°êž°. 읎것은 두 녾드 사읎에 ê°„ë‹ší•œ 지점 간 링크륌 만드는 슀크늜튞입니닀.
녾드 간에 닚음 팚킷을 에윔합니닀. 슀크늜튞 띌읞을 삎펎볎겠습니닀.
선, 귞러니 계속핎서 ì—Žì–Ž 첫 번짞.cc 좋아하는 펞집Ʞ에서.

볎음러 플레읎튞
파음의 첫 번짞 쀄은 emacs 몚드 쀄입니닀. 읎것은 포맷에 대핮 emacs에 알렀쀍니닀.
소슀 윔드에서 사용하는 규칙(윔딩 슀타음).

/* -*- 몚드:C++; c-파음 슀타음:"gnu"; 듀여쓰Ʞ 탭 몚드:nil; -*- */

읎것은 항상 닀소 녌쟁의 여지가 있는 죌제읎므로 우늬는 귞것을 방핎하지 않는 펞읎 낫습니닀.
바로. 귞만큌 NS-3 프로젝튞는 대부분의 대규몚 프로젝튞와 마찬가지로 닀음을 위핎 윔딩 슀타음을 채택했습니닀.
Ʞ여한 몚든 윔드가 쀀수핎알 합니닀. 귀하의 윔드륌
ê²°êµ­ 프로젝튞륌 쀀수핎알 합니닀. NS-3 에 섀명된 윔딩 표쀀
파음 묞서/codingstd.txt 또는 프로젝튞 웹 페읎지에 표시 LINK.

의 몚양곌 느낌에 익숙핎지는 것읎 좋습니닀. NS-3 윔딩 및 채택
우늬 윔드로 작업할 때마닀 읎 표쀀입니닀. 개발팀 몚두와
Ʞ고자듀은 닀양한 양의 불평윌로 귞렇게했습니닀. 위의 emacs 몚드 행
emacs 펞집Ʞ륌 사용하멎 올바륞 형식을 쉜게 얻을 수 있습니닀.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 시뮬레읎터는 GNU General Public License륌 사용하여 띌읎섌슀가 부여됩니닀. 당신은 볌 수 있습니닀
몚든 파음의 헀드에 있는 적절한 GNU 법률 ìš©ì–Ž NS-3 분포. 종종 당신은
ꎀ렚된 Ʞꎀ 쀑 하나에 대한 저작권 표시가 표시됩니닀. NS-3 위의 프로젝튞
아래에 나엎된 GPL 텍슀튞 및 작성자.

/*
* 읎 프로귞랚은 묎료 소프튞웚얎입니닀. 재배포 및/또는 수정할 수 있습니닀.
* 닀음곌 같읎 GNU General Public License 버전 2의 조걎에 따늅니닀.
* 자유 소프튞웚얎 재닚에서 발행;
*
* 읎 프로귞랚은 유용하게 사용되Ꞟ 바띌는 마음에서 배포되며,
* 귞러나 ì–Žë– í•œ 볎슝도 제공하지 않습니닀. 묵시적 볎슝도 없읎
* 상품성 또는 특정 목적에의 적합성. ì°žì¡°
* 자섞한 낎용은 GNU General Public License륌 찞조하십시였.
*
* GNU General Public License 사볞을 받았얎알 합니닀.
* 읎 프로귞랚곌 핚께; 귞렇지 않은 겜우 자유 소프튞웚얎에 ì“°êž°
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

몚듈 포핚 사항
적절한 윔드는 여러 include 묞윌로 시작합니닀.

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

우늬의 높은 수쀀의 슀크늜튞 사용자가
시슀템은 상대적윌로 큰 몚듈에 따띌 귞룹화합니닀. 우늬는 닚음 제공
각 몚듈에서 사용되는 몚든 포핚 파음을 재귀적윌로 로드하는 포핚 파음.
필요한 헀더륌 정확히 찟아볎고
종속성의 수에 따띌 파음 귞룹을 대규몚로 로드할 수 있는 Ʞ능을 제공합니닀.
섞분성. 읎것은 가장 횚윚적읞 ì ‘ê·Œ 방식은 아니지만 확싀히 Ꞁ쓰Ʞ륌
슀크늜튞가 훚씬 쉬워졌습니닀.

의 각 NS-3 포핚 파음은 닀음 디렉토늬에 있습니닀. ns3 (빌드 아래
포핚 파음 읎늄 충돌을 방지하는 데 도움읎 되도록 빌드 프로섞슀 쀑에 귞만큌
ns3/core-module.h 파음은 디렉토늬에서 찟을 ns-3 몚듈에 핎당합니닀.
소슀/윔얎 닀욎로드한 늎늬슀 배포판에서. 읎 디렉토늬륌 나엎하멎
많은 수의 헀더 파음을 찟윌십시였. 빌드륌 할 때 Waf는 공개 헀더륌 배치합니닀.
의 파음 ns3 핎당 디렉토늬 아래 빌드/디버귞 or 빌드/최적화 예배 규칙서
구성에 따띌. Waf는 자동윌로 몚듈 포핚을 생성합니닀.
파음을 사용하여 몚든 공개 헀더 파음을 로드합니닀.

묌론 읎 튜토늬얌을 종교적윌로 따륎고 있Ʞ 때묞에 읎믞 완료했을 것입니닀.
a

$ ./waf -d 디버귞 --enable-examples --enable-tests 구성

예제 및 테슀튞륌 포핚하는 디버귞 빌드륌 수행하도록 프로젝튞륌 구성하Ʞ 위핎.
당신은 또한

$ ./와프

프로젝튞륌 빌드합니닀. 읎제 디렉토늬륌 볎멎 ../../빌드/디버귞/ns3 당신 것입니닀
위에 표시된 XNUMX개의 몚듈 포핚 파음을 찟습니닀. 의 낎용을 삎펎볌 수 있습니닀.
읎러한 파음은 몚든 공개 포핚 파음을
각 몚듈.

NS3 넀임 슀페읎슀
의 닀음 쀄 첫 번짞.cc script는 넀임슀페읎슀 선얞입니닀.

넀임슀페읎슀 ns3 사용;

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 프로젝튞는 C++ 넀임슀페읎슀에서 구현됩니닀. ns3. 읎 귞룹은 몚두
NS-3-Ꞁ로벌 넀임슀페읎슀 왞부 범위의 ꎀ렚 ì„ ì–ž, 도움읎 되Ꞟ 바랍니닀.
닀륞 윔드와의 통합. C++ 사용 성명서는 NS-3 넀임 슀페읎슀
현재(전역) 선얞적 영역윌로. 읎것은 나쀑에 말하는 멋진 방법입니닀.
읎 선얞은 입력할 필요가 없습니닀. ns3:: 몚든 범위 읎전의 범위 결정 연산자
전에, NS-3 사용하Ʞ 위한 윔드입니닀. 넀임슀페읎슀에 익숙하지 않은 겜우 묞의하십시였.
거의 몚든 C++ 튜토늬얌곌 ns3 여Ʞ서 넀임슀페읎슀 및 사용법은
표쀀 넀임슀페읎슀와 사용 넀임 슀페읎슀 표쀀; 토론에서 자죌 볌 수 있는 진술
of 윔우튞 귞늬고 시낎.

로깅
슀크늜튞의 닀음 쀄은 닀음곌 같습니닀.

NS_LOG_COMPONENT_DEFINE("FirstScriptExample");

읎 묞장을 Doxygen 묞서에 대핮 읎알Ʞ할 수 있는 펞늬한 장소로 사용할 것입니닀.
첎계. 프로젝튞 웹사읎튞륌 볎멎, NS-3 프로젝튞에 대한 링크륌 찟을 수 있습니닀.
낎비게읎션 바의 "묞서". 읎 링크륌 선택하멎 당사로 읎동합니닀.
묞서 페읎지. 닀음윌로 읎동하는 "최신 늎늬슀" 링크가 있습니닀.
의 최신 안정 늎늬슀에 대한 묞서 NS-3. "API"륌 선택하멎
Documentation' 링크륌 큎늭하멎 닀음윌로 읎동합니닀. NS-3 API 섀명서 페읎지.

왌쪜을 따띌 구조의 귞래픜 표현을 찟을 수 있습니닀.
선적 서류 비치. 시작하Ʞ에 좋은 곳은 NS-3 몚듈 의 "책" NS-3 항핮
나묎. 확장하멎 몚듈 당신은 목록을 볌 수 있습니닀 NS-3 몚듈 섀명서. 귞만큌
여Ʞ서 몚듈의 개념은 위에서 섀명한 몚듈 포핚 파음에 직접 연결됩니닀. 귞만큌
NS-3 로깅 하위 시슀템은 C + + 구성 사용 된 by All 몚듈 섹션, 귞래서
계속핎서 핎당 묞서 녞드륌 확장하십시였. 읎제 확장 디버깅 예앜 후
륌 선택합니닀 로깅 페읎지.

읎제 Logging 몚듈에 대한 Doxygen 섀명서륌 삎펎뎐알 합니닀. 에서
목록 #밝히닀페읎지 상닚에 항목읎 표시됩니닀.
NS_LOG_COMPONENT_DEFINE. 듀얎가Ʞ 전에 검색핎볎멎 좋을 것 같아요
전첎 작업에 대한 느낌을 얻Ʞ 위한 로깅 몚듈의 "자섞한 섀명". 너
아래로 슀크례하거나 협업 닀읎얎귞랚 아래의 "자섞히..." 링크륌 선택하여 수행할 수 있습니닀.
읎.

묎슚 음읎 음얎나고 있는지에 대한 음반적읞 아읎디얎가 있윌멎 계속핎서 구첎적읞 낎용을 삎펎볎십시였.
NS_LOG_COMPONENT_DEFINE 선적 서류 비치. 여Ʞ서 묞서륌 복제하지는 않겠지만
요앜하멎 읎 쀄은 닀음곌 같은 로깅 구성 요소륌 선얞합니닀. FirstScript예 허띜하는
읎늄을 찞조하여 윘솔 메시지 로깅을 활성화 및 비활성화할 수 있습니닀.

볞ꎀ 핚수
찟을 슀크늜튞의 닀음 쀄은 닀음곌 같습니닀.

INT
메읞(int argc, char *argv[])
{

읎것은 프로귞랚(슀크늜튞)의 죌요 Ʞ능에 대한 선얞음 뿐입니닀. 에서처럌
몚든 C++ 프로귞랚에서 싀행되는 첫 번짞 핚수가 될 Ʞ볞 핚수륌 정의핎알 합니닀.
여Ʞ에는 전혀 특별한 것읎 없습니닀. 당신의 NS-3 슀크늜튞는 C++ 프로귞랚음 뿐입니닀.

닀음 쀄은 시간 분핎능을 XNUMX나녞쎈로 섀정하며 읎는 Ʞ볞값입니닀.
값 :

시간::SetResolution(시간::NS);

분핎능은 표현할 수 있는 가장 작은 시간 값입니닀.
두 시간 값 사읎의 표현 가능한 찚읎). 핎상도륌 정확하게 변겜할 수 있습니닀.
한 번. 읎러한 유연성을 가능하게 하는 메컀니슘은 닀소 메몚늬가 부족하므로 음닚
핎상도가 명시적윌로 섀정되멎 메몚늬륌 핎제하여 추가 업데읎튞륌 방지합니닀.
(핎상도륌 명시적윌로 섀정하지 않윌멎 Ʞ볞적윌로 XNUMX나녞쎈로 섀정되며
시뮬레읎션읎 시작되멎 메몚늬가 핎제됩니닀.)

슀크늜튞의 닀음 두 쀄은 빌드된 두 개의 로깅 구성 요소륌 활성화하는 데 사용됩니닀.
Echo 큎띌읎얞튞 및 Echo 서버 애플늬쌀읎션에:

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

Logging 구성요소 섀명서륌 읜얎 볞 적읎 있닀멎
각 구성 요소에서 활성화할 수 있는 여러 수쀀의 로깅 섞부 정볎/섞부 사항입니닀.
읎 두 쀄의 윔드는 에윔 큎띌읎얞튞 및
서버. 귞러멎 팚킷읎 전송될 때 응용 프로귞랚에서 메시지륌 읞쇄하게 됩니닀.
시뮬레읎션 쀑에 수신되었습니닀.

읎제 우늬는 토폎로지륌 생성하고 시뮬레읎션을 싀행하는 비슈니슀로 직접 읎동합니닀.
읎 작업을 가능한 한 쉜게 만듀Ʞ 위핎 토폎로지 도우믞 개첎륌 사용합니닀.

토폎로지 도우믞
녞드컚테읎너
슀크늜튞의 닀음 두 쀄 윔드는 싀제로 NS-3 녾드 개첎
시뮬레읎션에서 컎퓚터륌 나타냅니닀.

NodeContainer 녾드;
녾드.만듀Ʞ(2);

에 대한 묞서륌 찟아뎅시닀. 녞드컚테읎너 수업을 계속하Ʞ 전에. 또 닀륞 방법
죌얎진 큎래슀에 대한 묞서에 듀얎가는 것은 큎래슀 Doxygen의 탭
페읎지. 여전히 Doxygen읎 펞늬한 겜우 페읎지 상닚윌로 슀크례하여
륌 선택합니닀 큎래슀 탭. 새로욎 탭 섞튞가 표시되얎알 하며 ê·ž 쀑 하나는 큎래슀
명부. 핎당 탭 아래에 몚든 목록읎 표시됩니닀. NS-3 큎래슀. 아래로 슀크례,
ì°Ÿê³  ns3::녞드컚테읎너. 수업을 찟윌멎 계속핎서 선택하여 닀음윌로 읎동합니닀.
수업에 대한 묞서.

우늬의 핵심 추상화 쀑 하나가 녾드. 읎것은 컎퓚터륌 나타냅니닀.
프로토윜 슀택, 응용 프로귞랚 및 죌변 장치와 같은 것을 추가할 것입니닀.
칎드. 귞만큌 녞드컚테읎너 토폎로지 도우믞는 생성, ꎀ늬 및
액섞슀 녾드 시뮬레읎션을 싀행하Ʞ 위핎 생성하는 개첎입니닀. 위의 첫 번짞 쀄
우늬가 혞출하는 NodeContainer륌 선얞합니닀. 녾드. 두 번짞 쀄은 닀음을 혞출합니닀. 만듀Ʞ
방법에 녾드 개첎륌 만듀고 컚테읎너에 두 개의 녞드륌 생성하도록 요청합니닀. 에 섀명된 바와 같읎
Doxygen, 컚테읎너는 NS-3 두 개륌 만드는 데 적합한 시슀템 녾드
개첎에 대한 포읞터륌 낎부에 저장합니닀.

슀크늜튞에 있는 녾드는 아묎 작업도 수행하지 않습니닀. 구축의 닀음 닚계
토폎로지는 녞드륌 넀튞워크로 연결하는 것입니닀. 가장 닚순한 형태의 넀튞워크
지원은 두 녾드 사읎의 닚음 지점 간 링크입니닀. 우늬는 ê·ž 쀑 하나륌 만듀 것입니닀
여Ʞ 링크.

포읞튞투포읞튞도우믞
우늬는 점대점 링크륌 구성하고 있윌며, ꜀ 될 팚턎윌로
당신에게 친숙하지만, 우늬는 토폎로지 도우믞 객첎륌 사용하여 배치하는 데 필요한 저수쀀 작업을 수행합니닀.
핚께 링크. 핵심 추상화 쀑 두 가지가 NetDevice 귞늬고
채널. 현싀 섞계에서 읎러한 용얎는 대략 죌변 장치 칎드 및
넀튞워크 쌀읎랔. 음반적윌로 읎 두 가지는 밀접하게 연결되얎 있윌며 하나는
예륌 듀얎 읎더넷 장치와 묎선 채널을 교환할 것윌로 예상됩니닀. 우늬의 토폎로지
도우믞는 읎 친밀한 결합을 따륎므로 닚음 도구륌 사용합니닀.
포읞튞투포읞튞도우믞 구성 및 연결 NS-3 PointToPointNet장치 and
포읞튞투포읞튞채널 읎 슀크늜튞의 객첎.

슀크늜튞의 닀음 ì„ž 쀄은 닀음곌 같습니닀.

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

첫 번짞 쀄,

PointToPointHelper pointToPoint;

읞슀턎슀화 포읞튞투포읞튞도우믞 슀택의 객첎. 높은 수쀀의 ꎀ점에서 볎멎
닀음 쀄,

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

귞에게 말하닀. 포읞튞투포읞튞도우믞 값 "5Mbps"(쎈당 XNUMX메가비튞)륌 닀음곌 같읎 사용하는 개첎
생성할 때 "DataRate" PointToPointNet장치 목적.

볎닀 자섞한 ꎀ점에서 묞자엎 "DataRate"는 우늬가 혞출하는 것에 핎당합니닀.
속성 의 PointToPointNet장치. Doxygen for class륌 볎멎
ns3::PointToPointNetDevice 에 대한 섀명서륌 찟윌십시였. 유형 ID 가젞였Ʞ 방법, 당신은
목록을 ì°Ÿì•„ Attributes 장치에 대핮 정의됩니닀. 읎 쀑 "DataRate"가 있습니닀.
속성. 사용자가 가장 많읎 볌 수 있는 NS-3 객첎는 유사한 목록을 가지고 있습니닀. Attributes. 우늬는 읎것을 사용합니닀
닀시 컎파음하지 않고 시뮬레읎션을 쉜게 구성할 수 있는 메컀니슘
닀음 섹션.

의 "DataRate"와 유사 PointToPointNet장치 당신은 "지연"을 찟을 수 있습니닀 속성
ꎀ렚 포읞튞투포읞튞채널. 마지막 쀄,

pointToPoint.SetChannelAttribute("지연", StringValue("2ms"));

귞에게 말하닀. 포읞튞투포읞튞도우믞 "2ms"(XNUMX밀늬쎈) 값을
읎후 생성되는 몚든 포읞튞 투 포읞튞 채널의 전송 지연.

NetDevice컚테읎너
슀크늜튞의 읎 시점에서 우늬는 녞드컚테읎너 두 개의 녞드가 포핚되얎 있습니닀. 우늬는
포읞튞투포읞튞도우믞 귞것은 프띌읎밍되고 만듀 쀀비가 PointToPointNet장치 및 와읎얎
포읞튞투포읞튞채널 ê·žë“€ 사읎의 개첎. 우늬가 사용한 것처럌 녞드컚테읎너 토폎로지
헬퍌 객첎륌 생성하Ʞ 위한 녾드 시뮬레읎션을 위핎 포읞튞투포읞튞도우믞
우늬륌 위핎 장치륌 생성, 구성 및 섀치하는 것곌 ꎀ렚된 작업을 수행합니닀. 우늬
생성된 몚든 NetDevice 개첎 목록읎 필요하므로
NodeContainer륌 사용하여 우늬가 녞드륌 볎유하는 것처럌 NetDeviceContainer가 읎듀을 볎유합니닀.
만듀얎진. 닀음 두 쀄의 윔드는

NetDeviceContainer 장치;
장치 = pointToPoint.Install(녾드);

장치 및 채널 구성을 완료합니닀. 첫 번짞 쀄은 장치륌 선얞합니닀.
위에서 얞꞉한 컚테읎너와 두 번짞 컚테읎너가 묎거욎 작업을 수행합니닀. 귞만큌 섀치 의 방법
전에, 포읞튞투포읞튞도우믞 소요 녞드컚테읎너 맀개변수로. 낎부적윌로
NetDevice컚테읎너 생성됩니닀. 각 녞드에 대핮 녞드컚테읎너 (정확히 있얎알
점대점 링크의 겜우 XNUMX개) a PointToPointNet장치 생성되얎 장치에 저장됩니닀.
컚테읎너. ㅏ 포읞튞투포읞튞채널 생성되고 두 PointToPointNet장치 are
첚부된. 에 의핎 객첎가 생성될 때 포읞튞투포읞튞도우믞Walk Through California 프로귞랚, Attributes 읎전에
헬퍌에 섀정된 값은 핎당 쎈Ʞ화에 사용됩니닀. Attributes 생성된
사묌.

싀행 후 pointToPoint.섀치 (녾드) 우늬는 두 개의 녞드륌 갖게 될 것입니닀.
섀치된 점대점 넀튞 장치와 읎듀 사읎의 닚음 점대점 채널.
두 장치 몚두 쎈당 XNUMX메가비튞로 데읎터륌 전송하도록 구성됩니닀.
전송 지연읎 XNUMX밀늬쎈읞 채널.

읞터넷슀택헬퍌
읎제 녞드와 장치가 구성되었지만 프로토윜 슀택읎 섀치되얎 있지 않습니닀.
우늬 녞드에서. 닀음 두 쀄의 윔드가 읎륌 처늬합니닀.

InternetStackHelper 슀택;
stack.Install(녾드);

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 읞터넷슀택헬퍌 읞터넷 슀택에 있는 토폎로지 도우믞입니닀.
포읞튞투포읞튞도우믞 점대점 넀튞 장치에 대한 것입니닀. 귞만큌 섀치 방법은
녞드컚테읎너 맀개변수로. 싀행되멎 읞터넷 슀택을 섀치합니닀.
(TCP, UDP, IP 등) 녾드 컚테읎너의 각 녞드에서.

IPv4AddressHelper
닀음윌로 녞드의 장치륌 IP 죌소와 ì—°ê²°í•Žì•Œ 합니닀. 우늬는
IP 죌소 할당을 ꎀ늬하는 토폎로지 헬퍌. 사용자가 볌 수 있는 유음한 API는
싀제 죌소륌 수행할 때 사용할 Ʞ볞 IP 죌소 및 넀튞워크 마슀크 섀정
할당(도우믞 낎부의 하위 수쀀에서 수행됚).

예제 슀크늜튞에서 닀음 두 쀄의 윔드는 첫 번짞.cc,

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

죌소 도우믞 개첎륌 선얞하고 IP 죌소 할당을 시작핎알 한닀고 알렀쀍니닀.
넀튞워크 10.1.1.0에서 마슀크 255.255.255.0을 사용하여 할당 가능한 비튞륌 정의합니닀. 에 의핎
Ʞ볞적윌로 할당된 죌소는 XNUMX에서 시작하여 닚조롭게 슝가하므로 첫 번짞
읎 베읎슀에서 할당된 죌소는 10.1.1.1, 10.1.1.2 등읎 됩니닀.
수평 NS-3 시슀템은 싀제로 할당된 몚든 IP 죌소륌 Ʞ억하고
싀수로 동음한 죌소륌 두 번 생성하멎 치명적읞 였류가 발생합니닀(슉,
귞런데 였류륌 디버깅하Ʞ가 맀우 얎렵습니닀.)

윔드의 닀음 쀄,

Ipv4InterfaceContainer 읞터페읎슀 = address.Assign(장치);

싀제 죌소 할당을 수행합니닀. ~ 안에 NS-3 우늬는 IP 사읎의 연결을 만듭니닀
죌소 및 장치륌 사용하는 IPv4읞터페읎슀 묌첎. 때때로 목록읎 필요한 것처럌
나쀑에 ì°žì¡°í•  수 있도록 도우믞가 만든 넀튞 장치 목록읎 필요할 때가 있습니닀.
IPv4읞터페읎슀 사묌. 귞만큌 IPv4읞터페읎슀 컚테읎너 읎 Ʞ능을 제공합니닀.

읎제 슀택읎 섀치되고 IP 죌소가 있는 지점 간 넀튞워크가 구축되었습니닀.
할당된. 읎 시점에서 우늬에게 필요한 것은 튞래픜을 생성하는 애플늬쌀읎션입니닀.

얎플늬쌀읎션
ns-3 시슀템의 핵심 추상화 쀑 또 닀륞 하나는 얎플늬쌀읎션. 읎번에
우늬는 핵심의 두 가지 전묞화륌 사용하는 슀크늜튞 NS-3 수업 얎플늬쌀읎션 띌는
UdpEchoServer응용 프로귞랚 and UdpEchoClient응용 프로귞랚. 우늬가 읎전에 귞랬던 것처럌
Ʞ볞 개첎륌 구성하고 ꎀ늬하는 데 도움읎 되는 도우믞 개첎륌 사용합니닀.
여Ʞ서 우늬가 사용하는 UdpEchoServer도우믞 and UdpEchoClient도우믞 우늬의 삶을 펞하게 핎죌는 묌걎듀.

UdpEchoServer도우믞
예제 슀크늜튞의 닀음 윔드 쀄은 첫 번짞.cc, UDP 에윔륌 섀정하는 데 사용됩니닀.
읎전에 생성한 녾드 쀑 하나에 있는 서버 응용 프로귞랚입니닀.

UdpEchoServerHelper echoServer(9);

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

위 슀니펫의 첫 번짞 윔드 쀄은 닀음을 선얞합니닀. UdpEchoServer도우믞. 평소와 같읎,
읎것은 응용 프로귞랚 자첎가 아니띌 싀제 응용 프로귞랚을 만드는 데 도움읎 되는 개첎입니닀.
응용 프로귞랚. 우늬의 ꎀ습 쀑 하나는 필수 Attributes 도우믞에서
걎섀자. 읎 겜우 도우믞는 닀음곌 같읎 제공되지 않는 한 유용한 작업을 수행할 수 없습니닀.
큎띌읎얞튞도 알고 있는 포튞 번혞. 하나만 고륎고 Ʞ대하Ʞ볎닀
몚두 잘 작동하므로 생성자에 대한 맀개변수로 포튞 번혞가 필요합니닀. 귞만큌
생성자는 찚례로 닚순히 속성 섀정 전달된 값윌로. 당신읎 원한닀멎, 당신은
"포튞"륌 섀정할 수 있습니닀. 속성 나쀑에 닀륞 값윌로 속성 섀정.

닀륞 많은 도우믞 개첎와 유사하게 UdpEchoServer도우믞 객첎는 섀치
방법. 싀제로 Ʞ볞 에윔륌 유발하는 것은 읎 메서드의 싀행입니닀.
읞슀턎슀화되고 녞드에 연결될 서버 응용 프로귞랚입니닀. 흥믞롭게도 섀치
방법은 녞드컚테읎너 닀륞 것곌 마찬가지로 맀개변수로 섀치 우늬가 가지고 있는 방법
볞. 읎것은 귞렇게 볎읎지 않더띌도 싀제로 메소드에 전달되는 것입니닀.
읎 겜우. C++읎 있습니닀. 절대적읞 변환 결곌륌 가젞였는 여Ʞ 작업에서
녾드.가젞였Ʞ (1) (녾드 개첎에 대한 슀마튞 포읞터륌 반환합니닀 --- Ptr) 귞늬고 귞것을 사용
읎늄 없는 생성자에서 녞드컚테읎너 귞런 닀음 섀치. 당신읎있는 겜우
컎파음하고 싀행하는 C++ 윔드에서 특정 메서드 시귞니처륌 ì°Ÿêž° 위핎 항상 헀맀고 있습니닀.
좋습니닀. 읎러한 종류의 암시적 변환을 찟윌십시였.

우늬는 지ꞈ 귞것을 볞닀 echoServer.섀치 륌 섀치할 것입니닀 UdpEchoServer응용 프로귞랚 륌 시청하여 읎에 대핮 더 많은 정볎륌 얻을 수 있습니닀.
읞덱슀 번혞 XNUMX에서 찟은 녾드 녞드컚테읎너 우늬는 녞드륌 ꎀ늬했습니닀. 섀치
몚든 응용 프로귞랚에 대한 포읞터륌 볎유하는 컚테읎너륌 반환합니닀(읎 겜우 하나
우늬가 통곌 읎후 녞드컚테읎너 하나의 녾드 포핚) 도우믞에 의핎 생성됩니닀.

애플늬쌀읎션은 튞래픜 생성을 "시작"하는 데 시간읎 필요하며 선택적읞 시간읎 걞늎 수 있습니닀.
"멈추닀". 우늬는 둘 ë‹€ 제공합니닀. 읎 시간은 닀음을 사용하여 섀정됩니닀. 애플늬쌀읎션 컚테읎너 방법
슀타튞 and 쀑지. 읎러한 방법은 Time 맀개변수. 읎 겜우, 우늬는 명백한 C + +
C++ double 1.0을 가젞와서 NS-3 Time 사용하는 개첎
a 쎈 깁슀. 변환 규칙은 몚덞 작성자가 제얎할 수 있습니닀.
C++에는 고유한 규칙읎 있윌므로 항상 맀개변수가 만족슀러욞 것읎띌고 가정할 수는 없습니닀.
당신을 위핎 변환. 두 쀄,

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

에윔 서버 애플늬쌀읎션읎 슀타튞 (활성화) XNUMX쎈에
시뮬레읎션 및 쀑지 (비활성화) 시뮬레읎션 시작 XNUMX쎈 후. 의 믞덕
시뮬레읎션 읎벀튞(응용 프로귞랚 쀑지 읎벀튞)륌 닀음곌 같읎 선얞했닀는 사싀
XNUMX쎈에 싀행되멎 시뮬레읎션읎 지속됩니닀. at 가장 작은 XNUMX 쎈

UdpEchoClient도우믞
에윔 큎띌읎얞튞 응용 프로귞랚은 거의 유사한 방법윌로 섀정됩니닀.
섬Ʞ는 사람. Ʞ볞읎 있습니닀 UdpEchoClient응용 프로귞랚 에 의핎 ꎀ늬되는
UdpEchoClient도우믞.

UdpEchoClientHelper echoClient(읞터페읎슀.GetAddress(1), 9);
echoClient.SetAttribute("MaxPackets", UintegerValue (1));
echoClient.SetAttribute("간격", TimeValue(쎈(1.0)));
echoClient.SetAttribute("PacketSize", UintegerValue(1024));

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

귞러나 에윔 큎띌읎얞튞의 겜우 XNUMX가지륌 서로 닀륎게 섀정핎알 합니닀. Attributes. 처음 두
Attributes 걎섀 쀑에 섀정됩니닀. UdpEchoClient도우믞. 맀개변수륌 전달합니닀.
"RemoteAddress" 및 "RemotePort"륌 섀정하Ʞ 위핎 (도우믞 낎부적윌로) 사용되는
Attributes 우늬의 협앜에 따띌 필수 Attributes 맀개 변수
도우믞 생성자.

우늬가 사용한 것을 Ʞ억하십시였 IPv4읞터페읎슀 컚테읎너 우늬가 IP 죌소륌 추적하Ʞ 위핎
우늬 장치에 할당되었습니닀. XNUMX번짞 읞터페읎슀 읞터페읎슀 컚테읎너는
에서 XNUMX번짞 녞드의 IP 죌소에 핎당합니닀. 녾드 컚테읎너. 첫번짞
읞터페읎슀 읞터페읎슀 컚테읎너는 첫 번짞 녞드의 IP 죌소에 핎당합니닀.
전에, 녾드 컚테읎너. 따띌서 윔드의 첫 번짞 쀄(위에서)에서
도우믞 및 큎띌읎얞튞의 원격 죌소륌 IP 죌소로 섀정하도록 지시합니닀.
서버가 상죌하는 녞드에 할당됩니닀. 우늬는 또한 귞것을 볎낎도록 쀀비하띌고 말합니닀
포튞 XNUMX에 대한 팚킷.

"맥슀팚킷" 속성 큎띌읎얞튞에게 허용하는 최대 팚킷 수륌 알렀쀍니닀.
시뮬레읎션 쀑에 볎냅니닀. "간격" 속성 큎띌읎얞튞에게 대Ʞ 시간을 알렀쀍니닀.
팚킷 사읎 및 "PacketSize" 속성 큎띌읎얞튞에게 팚킷의 크Ʞ륌 알렀쀍니닀.
페읎로드가 있얎알 합니닀. 읎 특정 조합윌로 Attributes, 우늬는
큎띌읎얞튞는 하나의 1024바읎튞 팚킷을 볎냅니닀.

에윔 서버의 겜우와 마찬가지로 에윔 큎띌읎얞튞에게 닀음곌 같읎 지시합니닀. 슀타튞 and 쀑지하지만,
여Ʞ서는 서버가 활성화된 후 XNUMX쎈 후에 큎띌읎얞튞륌 시작합니닀.
시뮬레읎션).

몚의 싀험 장치
읎 시점에서 í•Žì•Œ 할 음은 싀제로 시뮬레읎션을 싀행하는 것입니닀. 읎것은 닀음을 사용하여 수행됩니닀.
Ꞁ로벌 Ʞ능 시뮬레읎터::싀행.

시뮬레읎터::싀행();

읎전에 메소드륌 혞출했을 때,

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

싀제로 시뮬레읎터에서 읎벀튞륌 1.0쎈, 2.0쎈 및 두 개의 읎벀튞로 예앜했습니닀.
10.0쎈. ì–žì œ 시뮬레읎터::싀행 혞출되멎 시슀템은 닀음을 통핎 볎Ʞ 시작합니닀.
예앜된 읎벀튞 목록 및 싀행. 뚌저 1.0쎈에 읎벀튞륌 싀행하고,
귞러멎 에윔 서버 응용 프로귞랚읎 활성화됩니닀(읎 읎벀튞는 찚례로 많은
Ʞ타 읎벀튞). 귞런 닀음 시작되는 t=2.0쎈 동안 예앜된 읎벀튞륌 싀행합니닀.
에윔 큎띌읎얞튞 애플늬쌀읎션. 닀시 말하지만 읎 읎벀튞는 더 많은 읎벀튞륌 예앜할 수 있습니닀. 시작
에윔 큎띌읎얞튞 응용 프로귞랚의 읎벀튞 구현은 닀음의 데읎터 전송 닚계륌 시작합니닀.
서버에 팚킷을 전송하여 시뮬레읎션.

팚킷을 서버로 볎낎는 행위는 닀음곌 같은 음렚의 읎벀튞륌 튞늬거합니닀.
장멎 뒀에서 자동윌로 음정읎 잡히고
슀크늜튞에서 섀정한 닀양한 타읎밍 맀개변수에 따띌 팚킷 에윔.

ê²°êµ­ 우늬는 하나의 팚킷만 볎낎Ʞ 때묞에( 최대 팚킷 속성 에 섀정되었습니닀.
하나) 닚음 큎띌읎얞튞 에윔 ​​요청에 의핎 튞늬거된 읎벀튞 첎읞읎 점점 쀄얎듀고
시뮬레읎션읎 유휎 상태가 됩니닀. 읎 음읎 발생하멎 나뚞지 읎벀튞는 닀음곌 같습니닀. 쀑지
서버와 큎띌읎얞튞에 대한 읎벀튞. 읎러한 읎벀튞가 싀행될 때
처늬할 추가 읎벀튞 및 시뮬레읎터::싀행 볎고. 귞러멎 시뮬레읎션읎 완료됩니닀.

낚은 것은 청소하는 것뿐입니닀. 읎는 전역 핚수륌 혞출하여 수행됩니닀.
시뮬레읎터::파ꎎ. 도우믞 Ʞ능(또는 저수쀀 NS-3 윔드) 싀행, 귞듀은
몚든 개첎륌 파ꎎ하Ʞ 위핎 시뮬레읎터에 후크가 삜입되도록 배엎했습니닀.
생성되었습니닀. --- 읎러한 개첎륌 직접 추적할 필요가 없었습니닀.
당신읎핎알 할 음은 전화하는 것뿐읎었습니닀 시뮬레읎터::파ꎎ 종료합니닀. 귞만큌 NS-3 시슀템읎 처늬
당신에게 얎렀욎 부분. 첫 번짞의 나뚞지 쀄 NS-3 슀크늜튞, 첫 번짞.cc, 귞냥
ê·ž :

시뮬레읎터::파ꎎ();
0가 돌아;
}

읞셀덀 공식 판맀점읞 전에, 시뮬레읎터 의지 쀑지?
NS-3 불연속 읎벀튞(DE) 시뮬레읎터입니닀. 읎러한 시뮬레읎터에서는 각 읎벀튞가 연결됩니닀.
싀행 시간곌 핚께 시뮬레읎션읎 진행됩니닀.
시뮬레읎션 시간의 순서. 읎벀튞로 읞핎 향후 읎벀튞가 예앜될 수 있습니닀(예:
타읎뚞는 닀음 간격에서 만료되도록 자첎 음정을 변겜할 수 있습니닀).

쎈Ʞ 읎벀튞는 음반적윌로 각 개첎에 의핎 튞늬거됩니닀. 예륌 듀얎 IPv6은 띌우터륌 예앜합니닀.
ꎑ고, Neighbor Solicitations 등, Application은 첫 번짞 팚킷을 예앜합니닀.
볎낎는 읎벀튞 등

읎벀튞가 처늬될 때 XNUMX개 또는 하나 읎상의 읎벀튞륌 생성할 수 있습니닀. 시뮬레읎션윌로
싀행되고 읎벀튞가 소비되지만 더 많은 읎벀튞가 생성될 수도 있고 생성되지 않을 수도 있습니닀. 귞만큌
읎벀튞 대Ʞ엎에 더 읎상의 읎벀튞가 없거나 닀음곌 같은 겜우 시뮬레읎션읎 자동윌로 쀑지됩니닀.
특별한 쀑지 읎벀튞가 발견되었습니닀. Stop 읎벀튞는 닀음을 통핎 생성됩니닀. 시뮬레읎터::정지
(정지시간); Ʞ능.

대표적읞 겜우가 있는데 시뮬레읎터::정지 쀑닚하Ʞ 위핎 절대적윌로 필요하닀.
시뮬레읎션: 자첎적윌로 지속되는 읎벀튞가 있을 때. 자첎 유지(또는 반복) 읎벀튞
항상 음정을 재조정하는 읎벀튞입니닀. 결곌적윌로 귞듀은 항상 읎벀튞륌 유지합니닀.
대Ʞ엎읎 비얎 있지 않습니닀.

반복 읎벀튞륌 포핚하는 많은 프로토윜곌 몚듈읎 있습니닀. 예:

· FlowMonitor - 손싀된 팚킷을 죌Ʞ적윌로 확읞

· RIPng - 띌우팅 테읎랔 업데읎튞의 죌Ʞ적읞 람로드캐슀튞

· 등.

읎 겜우, 시뮬레읎터::정지 시뮬레읎션을 정상적윌로 쀑지하는 데 필요합니닀. ~ 안에
추가로 ì–žì œ NS-3 에뮬레읎션 몚드에 있윌며, 싀시간 시뮬레읎터 유지하는 데 사용됩니닀.
Ʞ계 시계와 정렬된 시뮬레읎션 시계 시뮬레읎터::정지 쀑지하는 데 필요합니닀
곌정.

자습서의 많은 시뮬레읎션 프로귞랚은 명시적윌로 혞출하지 않습니닀. 시뮬레읎터::정지,
읎벀튞 대Ʞ엎은 자동윌로 읎벀튞가 부족하Ʞ 때묞입니닀. 귞러나 읎러한 프로귞랚은
전화도 받아 시뮬레읎터::정지. 예륌 듀얎 닀음 추가 묞은
첫 번짞 예제 프로귞랚은 11쎈에 명시적윌로 쀑지하도록 예앜합니닀.

+ 시뮬레읎터::정지(쎈(11.0));
시뮬레읎터::싀행();
시뮬레읎터::파ꎎ();
0가 돌아;
}

위의 낎용은 싀제로 읎 프로귞랚의 동작을 변겜하지 않습니닀.
시뮬레읎션은 10쎈 후에 자연슀럜게 종료됩니닀. 하지만 정지 시간을 변겜하렀멎
위의 섀명을 11쎈에서 1쎈로 섀정하멎 시뮬레읎션읎
출력읎 화멎에 읞쇄되Ʞ 전에 쀑지합니닀(출력은 ì•œ 2 시간에 발생하Ʞ 때묞입니닀.
시뮬레읎션 시간 쎈).

전화하는 것읎 쀑요합니닀 시뮬레읎터::정지 전에 부늄 시뮬레읎터::싀행; 귞렇지 않윌멎,
시뮬레읎터::싀행 쀑지륌 싀행하Ʞ 위핎 메읞 프로귞랚윌로 제얎륌 반환하지 않을 수 있습니닀!

걎묌 너의 슀크늜튞
우늬는 ê°„ë‹ší•œ 슀크늜튞륌 작성하는 것을 쉜게 만듀었습니닀. 당신읎핎알 할 음은 당신을 ë–šì–Ž 뜚늬는 것입니닀
슀크늜튞륌 슀크래치 디렉토늬에 넣고 Waf륌 싀행하멎 자동윌로 빌드됩니닀.
핮 볎자. 복사 예제/튜토늬얌/first.cc 로 할퀎닀 변겜 후 디렉토늬
최상위 디렉토늬로 돌아갑니닀.

$cd ../ ..
$ cp 예/튜토늬얌/first.cc 슀크래치/myfirst.cc

읎제 waf륌 사용하여 첫 번짞 예제 슀크늜튞륌 빌드합니닀.

$ ./와프

닀음을 볎고하는 메시지가 표시되얎알 합니닀. 낮 첫 번짞 예제가 성공적윌로 빌드되었습니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
[614/708] cxx: 슀크래치/myfirst.cc -> 빌드/디버귞/scratch/myfirst_3.o
[706/708] cxx_link: 빌드/디버귞/슀크래치/myfirst_3.o -> 빌드/디버귞/슀크래치/myfirst
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(2.357쎈).

읎제 예제륌 싀행할 수 있습니닀(슀크래치 디렉토늬에 프로귞랚을 빌드하는 겜우
슀크래치 디렉토늬에서 싀행핎알 핹):

$ ./waf --슀크래치/myfirst 싀행

몇 가지 출력읎 표시됩니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.418쎈).
1024바읎튞륌 10.1.1.2로 볎냈습니닀.
1024에서 10.1.1.1바읎튞 수신됚
1024에서 10.1.1.2바읎튞 수신됚

여Ʞ에서 빌드 시슀템읎 파음읎 빌드되었는지 확읞하고
귞런 닀음 싀행합니닀. 에윔 큎띌읎얞튞의 로깅 구성 요소가 전송되었음을 나타낮는 것을 볌 수 있습니닀.
1024의 Echo 서버에 하나의 10.1.1.2바읎튞 팚킷. 로깅 구성 요소도 표시됩니닀.
에윔 서버에서 1024에서 10.1.1.1바읎튞륌 수신했닀고 말합니닀. 에윔 서버
자동윌로 팚킷을 반향하고 팚킷을 수신한 반향 큎띌읎얞튞 로귞륌 볌 수 있습니닀.
닀시 서버에서.

NS-3 출처 암혞
읎제 몇 가지륌 사용했윌므로 NS-3 도우믞 쀑 음부륌 삎펎볎고 싶을 수 있습니닀.
핎당 Ʞ능을 구현하는 소슀 윔드. 최신 윔드는 에서 찟아볌 수 있습니닀.
닀음 링크의 웹 서버: http://code.nsnam.org/ns-3-dev. ê±°êž°, 당신은 볌 수 있습니닀
Mercurial 요앜 페읎지 NS-3 개발 튞늬.

페읎지 상닚에 여러 링크가 표시됩니닀.

요앜 | 쇌튞로귞 | 변겜 로귞 | 귞래프 | 태귞 | 파음

계속핎서 닀음을 선택하십시였. 파음 링크. 읎것읎 우늬 대부분의 최상위 수쀀입니닀.
저장소 볌 것읎닀:

drwxr-xr-x [업]
drwxr-xr-x 바읞딩 파읎썬 파음
drwxr-xr-x 묞서 파음
drwxr-xr-x 예제 파음
drwxr-xr-x ns3 파음
drwxr-xr-x 슀크래치 파음
drwxr-xr-x src 파음
drwxr-xr-x 유틞늬티 파음
-rw-r--r-- 2009-07-01 12:47 +0200 560 .hgignore 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 1886 .hgtags 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 1276 작성자 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 30961 CHANGES.html 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 17987 띌읎섌슀 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 3742 README 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 16171 RELEASE_NOTES 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 6 버전 파음 | 개정판 | 죌석을 달닀
-rwxr-xr-x 2009-07-01 12:47 +0200 88110 waf 파음 | 개정판 | 죌석을 달닀
-rwxr-xr-x 2009-07-01 12:47 +0200 28 waf.bat 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 35395 wscript 파음 | 개정판 | 죌석을 달닀
-rw-r--r-- 2009-07-01 12:47 +0200 7673 wutils.py 파음 | 개정판 | 죌석을 달닀

예제 슀크늜튞는 예 예배 규칙서. 큎늭하멎 예 당신은 볌 수
하위 디렉토늬 목록. 에 있는 파음 쀑 하나 지도 시간 하위 디렉토늬는 첫 번짞.cc. 만앜에
큎늭 첫 번짞.cc 방ꞈ 통곌한 윔드륌 찟을 수 있습니닀.

소슀 윔드는 죌로 SRC 예배 규칙서. 닀음 쀑 하나륌 통핎 소슀 윔드륌 볌 수 있습니닀.
디렉토늬 읎늄을 큎늭하거나 파음 의 였륞쪜에 링크
디렉토늬 읎늄. 륌 큎늭하멎 SRC 디렉토늬, 당신은 목록윌로 읎동합니닀
전에, SRC 하위 디렉토늬. 닀음을 큎늭하멎 core 하위 디렉토늬에서 목록을 찟을 수 있습니닀.
파음. (읎 Ꞁ을 쓰는 시점에서) 찟을 첫 번짞 파음은 쀑닚.h. 큎늭하멎
쀑닚.h 링크륌 큎늭하멎 소슀 파음로 전송됩니닀. 쀑닚.h 유용한 맀크로가 포핚된
비정상적읞 조걎읎 감지되멎 슀크늜튞륌 종료합니닀.

읎 장에서 사용한 도우믞의 소슀 윔드는 닀음에서 찟을 수 있습니닀.
src/응용 프로귞랚/도우믞 예배 규칙서. 디렉토늬 튞늬에서 자유롭게 찌륎멎 얻을 수 있습니닀.
거Ʞ에 대한 느낌곌 슀타음 NS-3 프로귞랚.

조정


사용 전에, 로깅 몚듈
우늬는 읎믞 에 대핮 간략히 삎펎볎았습니닀. NS-3 넘얎가는 동안 로깅 몚듈
첫 번짞.cc 슀크늜튞. 읎제 자섞히 삎펎볎고 ì–Žë–€ 종류의 사용 사례가 있는지 삎펎볎겠습니닀.
로깅 하위 시슀템은 닀룚도록 섀계되었습니닀.

로깅 삎펎볎Ʞ
많은 대형 시슀템은 음종의 메시지 로깅 Ʞ능을 지원하며 NS-3 아니닀
예왞. 겜우에 따띌 였류 메시지만 "욎영자 윘솔"에 Ʞ록됩니닀.
음반적윌로 표쀀 였류 Unix êž°ë°˜ 시슀템에서). 닀륞 시슀템에서는 겜고 메시지가
더 자섞한 정볎 메시지륌 출력합니닀. 겜우에 따띌 로깅 Ʞ능
출력을 빠륎게 흐늬게 만듀 수 있는 디버귞 메시지륌 출력하는 데 사용됩니닀.

NS-3 는 읎러한 몚든 상섞 수쀀읎 유용하닀는 견핎륌 가지고 있윌며
메시지 로깅에 대한 선택 가능한 닀닚계 ì ‘ê·Œ 방식. 로깅을 완전히 비활성화할 수 있습니닀.
구성 요소별로 활성화되거나 전역적윌로 활성화됩니닀. 선택 가능한 Ʞ능을 제공합니닀.
자섞한 수쀀. 귞만큌 NS-3 log 몚듈은 간닚하고 상대적윌로 사용하Ʞ 쉬욎 Ʞ능을 제공합니닀.
시뮬레읎션에서 유용한 정볎륌 얻는 방법.

우늬는 범용 메컀니슘 --- 추적 ---을 제공한닀는 것을 읎핎핎알 합니닀.
시뮬레읎션 출력에 선혞되는 데읎터륌 몚덞에서 가젞옵니닀(ì°žì¡°:
추적 시슀템에 대한 자섞한 낎용은 추적 시슀템 사용 튜토늬얌 섹션 ì°žì¡°).
디버깅 정볎, 겜고, 였류 메시지 또는 몚든
슀크늜튞나 몚덞에서 빠륞 메시지륌 쉜게 얻고 싶을 때.

현재 XNUMX개 레벚의 로귞 메시지가 정의되얎 있습니닀.
시슀템.

· LOG_ERROR --- 로귞 였류 메시지(연결된 맀크로: NS_LOG_ERROR);

· LOG_WARN --- 로귞 겜고 메시지(연결된 맀크로: NS_LOG_WARN);

· LOG_DEBUG --- 비교적 드묞 임시 디버깅 메시지륌 Ʞ록합니닀(ꎀ렚 맀크로:
NS_LOG_DEBUG);

· LOG_INFO --- 프로귞랚 진행에 대한 로귞 정볎 메시지(ꎀ렚 맀크로:
NS_LOG_INFO);

· LOG_FUNCTION --- 혞출된 각 핚수륌 섀명하는 메시지륌 Ʞ록합니닀(XNUMX개의 ꎀ렚 맀크로:
구성원 핚수에 사용되는 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은 Ʞ능적윌로 동음합니닀.)
예륌 듀얎, LOG_INFO륌 활성화하멎 NS_LOG_INFO 맀크로에서 제공하는 메시지만 활성화됩니닀.
LOG_LEVEL_INFO륌 활성화하멎 NS_LOG_DEBUG, NS_LOG_WARN에서 제공하는 메시지도 활성화됩니닀.
및 NS_LOG_ERROR 맀크로.

또한 조걎에 ꎀ계없읎 항상 표시되는 묎조걎 로깅 맀크로륌 제공합니닀.
로깅 수쀀 또는 구성 요소 선택.

· NS_LOG_UNCOND -- 연결된 메시지륌 묎조걎적윌로 Ʞ록합니닀(연결된 로귞 수쀀 없음).

각 레벚은 개별적윌로 또는 누적하여 요청할 수 있습니닀. 로깅은 닀음을 사용하여 섀정할 수 있습니닀.
쉘 환겜 변수(NS_LOG) 또는 로깅 시슀템 핚수 혞출. 볞 바와 같읎
튜토늬얌의 앞부분에서 로깅 시슀템에는 Doxygen 묞서가 있윌며 읎제
로깅 몚듈 묞서륌 정독하지 않은 겜우 정독할 좋은 시간입니닀.

읎제 섀명서륌 자섞히 읜었윌므로 핎당 지식 쀑 음부륌 사용하겠습니닀.
흥믞로욎 정볎륌 얻Ʞ 위핎 슀크래치/myfirst.cc 당신읎 가지고있는 예제 슀크늜튞
읎믞 지얎졌습니닀.

사용 로깅
NS_LOG 환겜 변수륌 사용하여 더 많은 로깅을 섀정핎 볎겠습니닀.
방향을 잡고 읎전에 했던 것처럌 마지막 슀크늜튞륌 싀행합니닀.

$ ./waf --슀크래치/myfirst 싀행

읎제 친숙한 첫 번짞 출력읎 표시되얎알 합니닀. NS-3 예제 프로귞랚

$ Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.413쎈).
1024바읎튞륌 10.1.1.2로 볎냈습니닀.
1024에서 10.1.1.1바읎튞 수신됚
1024에서 10.1.1.2바읎튞 수신됚

위에 볎읎는 "Sent" 및 "Received" 메시지가 싀제로 Ʞ록되고 있는 것윌로 나타났습니닀.
의 메시지 UdpEchoClient응용 프로귞랚 and UdpEchoServer응용 프로귞랚. 우늬는 묌얎볌 수 있습니닀
예륌 듀얎 로깅 수쀀을 섀정하여 더 많은 정볎륌 읞쇄하Ʞ 위한 큎띌읎얞튞 애플늬쌀읎션
NS_LOG 환겜 변수륌 통핎.

여Ʞ서부터는 닀음을 사용하는 sh와 같은 셞을 사용한닀고 가정하겠습니닀.
"VARIABLE=value" 구묞. csh와 같은 쉘을 사용하는 겜우 닀음을 수행핎알 합니닀.
낮 예제륌 핎당 셞에 필요한 "setenv VARIABLE value" 구묞윌로 변환합니닀.

현재 UDP 에윔 큎띌읎얞튞 애플늬쌀읎션은 닀음 윔드 행에 응답하고 있습니닀.
슀크래치/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

읎 윔드 쀄은 LOG_LEVEL_INFO 로깅 수쀀. 로깅을 통곌할 때
레벚 플래귞, 우늬는 싀제로 죌얎진 레벚곌 몚든 하위 레벚을 활성화합니닀. 읎 겜우,
우늬는 활성화했습니닀 NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN and NS_LOG_ERROR. 우늬는 슝가시킬 수 있습니닀
로깅 수쀀을 변겜하고 슀크늜튞륌 변겜하고 닀시 컎파음하지 않고도 더 많은 정볎륌 얻을 수 있습니닀.
닀음곌 같읎 NS_LOG 환겜 변수륌 섀정합니닀.

$ 낎볎낎Ʞ NS_LOG=UdpEchoClientApplication=level_all

읎것은 쉘 환겜 변수륌 섀정합니닀 NS_LOG 묞자엎에,

UdpEchoClientApplication=level_all

할당의 왌쪜은 섀정하렀는 로깅 구성 요소의 읎늄입니닀.
였륞쪜은 사용하렀는 플래귞입니닀. 읎 겜우 전원을 쌜겠습니닀.
응용 프로귞랚의 몚든 디버깅 수쀀. NS_LOG가 섀정된 상태에서 슀크늜튞륌 싀행하멎
읎렇게, NS-3 로깅 시슀템읎 변겜 사항을 선택하고 닀음읎 표시되얎알 합니닀.
출력 :

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.404쎈).
UdpEchoClient응용 프로귞랚:UdpEchoClient()
UdpEchoClient응용 프로귞랚:데읎터 크Ʞ 섀정(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClient응용 프로귞랚:볎낎Ʞ()
1024바읎튞륌 10.1.1.2로 볎냈습니닀.
1024에서 10.1.1.1바읎튞 수신됚
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
1024에서 10.1.1.2바읎튞 수신됚
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClient응용 프로귞랚:~UdpEchoClient()

애플늬쌀읎션에서 제공하는 추가 디버귞 정볎는 NS_LOG_FUNCTION에서 가젞옵니닀.
수쀀. 슀크늜튞 쀑에 응용 프로귞랚의 핚수가 혞출될 때마닀 표시됩니닀.
싀행. 음반적윌로 멀버 핚수에서 (적얎도) NS_LOG_FUNCTION(this)륌 사용하는 것은
우선의. 정적 핚수에서만 NS_LOG_FUNCTION_NOARGS()륌 사용하십시였. 귞러나
에는 요구 사항읎 없습니닀. NS-3 몚덞읎 특정 특정 항목을 지원핎알 하는 시슀템
로깅 Ʞ능. Ʞ록되는 정볎의 양에 대한 결정은
개별 몚덞 개발자. 에윔 애플늬쌀읎션의 겜우 상당한 양의 로귞
출력읎 가능합니닀.

읎제 애플늬쌀읎션에 대한 핚수 혞출 로귞륌 볌 수 있습니닀. 만앜 너띌멎
자섞히 볎멎 묞자엎 사읎에 하나의 윜론읎 있음을 알 수 있습니닀. UdpEchoClient응용 프로귞랚
및 C++ 범위 연산자가 예상되는 메서드 읎늄(::). 읎것은
의도적.

읎늄은 싀제로 큎래슀 읎늄읎 아니띌 로깅 구성 요소 읎늄입니닀. 있을 때
소슀 파음곌 큎래슀 사읎의 음대음 대응, 읎것은 음반적윌로
큎래슀 읎늄읎지만 싀제로는 큎래슀 읎늄읎 아니띌는 점을 읎핎핎알 합니닀.
읎쀑 윜론 대신 닚음 윜론을 사용하여 상대적윌로 믞묘하게
로깅 구성 요소 읎늄곌 큎래슀 읎늄을 개념적윌로 구분합니닀.

겜우에 따띌 싀제로 ì–Žë–€ 방법을 결정하Ʞ 얎렀욞 수 있음읎 밝혀졌습니닀.
로귞 메시지륌 생성합니닀. 위의 텍슀튞륌 볎멎 묞자엎읎 얎디에 있는지 궁ꞈ할 수 있습니닀.
"수상 1024 바읎튞 에 10.1.1.2"에서 옵니닀. OR'ing윌로 읎 묞제륌 í•Žê²°í•  수 있습니닀.
접두사_펑크 수쀀윌로 NS_LOG 환겜 변수. 닀음을 시도하십시였.

$ 낎볎낎Ʞ 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

OR을 나타낮는 데 사용하는 수직 막대 때묞에 따옎표가 필요합니닀.
작업은 Unix 파읎프 컀넥터읎Ʞ도 합니닀.

읎제 슀크늜튞륌 싀행하멎 로깅 시슀템읎 몚든
지정된 로귞 구성 요소의 메시지에는 구성 요소 읎늄읎 접두사로 추가됩니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.417쎈).
UdpEchoClient응용 프로귞랚:UdpEchoClient()
UdpEchoClient응용 프로귞랚:데읎터 크Ʞ 섀정(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClient응용 프로귞랚:볎낎Ʞ()
UdpEchoClientApplication:Send(): 1024바읎튞륌 10.1.1.2로 볎냈습니닀.
1024에서 10.1.1.1바읎튞 수신됚
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
UdpEchoClientApplication:HandleRead(): 1024에서 10.1.1.2바읎튞륌 받았습니닀.
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClient응용 프로귞랚:~UdpEchoClient()

읎제 UDP 에윔 큎띌읎얞튞 애플늬쌀읎션에서 였는 몚든 메시지가
읎와 같읎 식별됩니닀. "Received 1024 bytes from 10.1.1.2" 메시지가 읎제 명확하게 표시됩니닀.
에윔 큎띌읎얞튞 애플늬쌀읎션에서 였는 것윌로 식별됩니닀. 나뚞지 메시지는
UDP 에윔 서버 애플늬쌀읎션에서 였는 것입니닀. 닀음을 입력하여 핎당 구성 요소륌 활성화할 수 있습니닀.
NS_LOG 환겜 변수에서 윜론윌로 구분된 구성 요소 목록입니닀.

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

겜고: 닀음 쀄 바꿈을 제거핎알 합니닀. : 위의 예제 텍슀튞에서
묞서 형식 지정 목적윌로만 졎재합니닀.

읎제 슀크늜튞륌 싀행하멎 두 에윔 큎띌읎얞튞의 몚든 로귞 메시지가 표시됩니닀.
귞늬고 서버 애플늬쌀읎션. 읎것읎 묞제륌 디버깅하는 데 맀우 유용할 수 있음을 알 수 있습니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.406쎈).
UdpEchoServer응용 프로귞랚:UdpEchoServer()
UdpEchoClient응용 프로귞랚:UdpEchoClient()
UdpEchoClient응용 프로귞랚:데읎터 크Ʞ 섀정(1024)
UdpEchoServerApplication:StartApplication()
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClient응용 프로귞랚:볎낎Ʞ()
UdpEchoClientApplication:Send(): 1024바읎튞륌 10.1.1.2로 볎냈습니닀.
UdpEchoServerApplication:HandleRead(): 1024에서 10.1.1.1바읎튞륌 받았습니닀.
UdpEchoServerApplication:HandleRead(): 에윔 팚킷
UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
UdpEchoClientApplication:HandleRead(): 1024에서 10.1.1.2바읎튞륌 받았습니닀.
UdpEchoServerApplication:StopApplication()
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClient응용 프로귞랚:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

또한 때때로 로귞 메시지가 생성되는 시뮬레읎션 시간을 볌 수 있는 것읎 유용합니닀.
생성됩니닀. prefix_time 비튞에서 OR을 수행하여 읎륌 수행할 수 있습니닀.

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

닀시 말하지만 위의 쀄 바꿈을 제거핎알 합니닀. 지ꞈ 슀크늜튞륌 싀행하멎
닀음 출력을 찞조하십시였.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.418쎈).
0s UdpEchoServer응용 프로귞랚:UdpEchoServer()
0s UdpEchoClient응용 프로귞랚:UdpEchoClient()
0s UdpEchoClient응용 프로귞랚:데읎터 크Ʞ 섀정(1024)
1쎈 UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2쎈 UdpEchoClient응용 프로귞랚:볎낎Ʞ()
2s UdpEchoClientApplication:Send(): 1024바읎튞륌 10.1.1.2로 볎냈습니닀.
2.00369s UdpEchoServerApplication:HandleRead(): 1024에서 10.1.1.1바읎튞 수신됚
2.00369s UdpEchoServerApplication:HandleRead(): 에윔 팚킷
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): 1024에서 10.1.1.2바읎튞륌 수신했습니닀.
10쎈 UdpEchoServerApplication:StopApplication()
10쎈 UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClient응용 프로귞랚:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

시뮬레읎션 시간에 UdpEchoServer의 생성자가 혞출되었음을 알 수 있습니닀.
0쎈. 읎것은 시뮬레읎션읎 시작되Ʞ 전에 싀제로 발생하지만 시간은
XNUMX쎈로 표시됩니닀. UdpEchoClient 생성자 메시지도 마찬가지입니닀.

늬윜 슀크래치/first.cc 슀크늜튞는 XNUMX쎈에 에윔 서버 애플늬쌀읎션을 시작했습니닀.
시뮬레읎션에. 읎제 응용 프로귞랚 시작 서버의 방법은,
싀제로는 XNUMX쎈에 혞출됩니닀. echo 큎띌읎얞튞 애플늬쌀읎션읎
슀크늜튞에서 요청한 대로 XNUMX쎈의 시뮬레읎션 시간에 시작되었습니닀.

읎제 시뮬레읎션 진행 상황을 닀음에서 확읞할 수 있습니닀. 음정전송 전화
혞출하는 큎띌읎얞튞 전송 부터 í•žë“€ 읜Ʞ 에윔 서버 애플늬쌀읎션의 윜백. 메몚
포읞튞-투-포읞튞 링크륌 통핎 전송되는 팚킷의 겜곌 시간은 3.69입니닀.
밀늬쎈. 에윔 서버가 에윔되었음을 알늬는 메시지륌 Ʞ록하는 것을 볌 수 있습니닀.
팚킷을 수신한 닀음 닀륞 채널 지연 후에 에윔 큎띌읎얞튞가 팚킷을 수신하는 것을 볌 수 있습니닀.
에윔 팚킷 í•žë“€ 읜Ʞ 방법.

읎 시뮬레읎션에는 당신읎 알지 못하는 많은 음듀읎 숚얎 있습니닀.
볎는 것도. 몚든 프로섞슀륌 쌜멎 전첎 프로섞슀륌 맀우 쉜게 수행할 수 있습니닀.
시슀템의 로깅 구성 요소. 섀정핎 볎섞요 NS_LOG 닀음곌 같은 변수,

$ 낎볎낎Ʞ 'NS_LOG=*=level_all|prefix_func|prefix_time'

위의 별표는 로깅 구성 요소 와음드칎드입니닀. 읎렇게 하멎 몚든
시뮬레읎션에 사용된 몚든 구성 요소륌 로귞읞합니닀. 나는 출력을 재현하지 않습니닀
여Ʞ(읎 Ꞁ을 쓰는 시점에서 닚음 팚킷 에윔에 대핮 1265쀄의 출력읎 생성됚)
읎 정볎륌 파음로 늬디렉션하고 슐겚찟는
원하는 겜우 펞집자,

$ ./waf --슀크래치/myfirst 싀행 > log.out 2>&1

저는 개읞적윌로 맀우 장황한 로깅 버전을 사용합니닀.
묞제가 있고 얎디에서 묞제가 발생하는지 전혀 몚늅니닀. 의 진행 상황을 따띌갈 수 있습니닀.
쀑닚점을 섀정하지 않고 디버거에서 윔드륌 닚계별로 싀행하지 않고도 맀우 쉜게 윔드륌 작성할 수 있습니닀.
ë‚Žê°€ 가장 좋아하는 펞집Ʞ에서 출력을 펞집하고 ë‚Žê°€ Ʞ대하는 것을 검색할 수 있습니닀.
귞늬고 ë‚Žê°€ 예상하지 못한 음읎 음얎나는 것을 뎅니닀. 묎엇읞지에 대한 음반적읞 생각읎 있을 때
묞제가 발생하멎 묞제륌 섞밀하게 조사하Ʞ 위핎 디버거로 전환합니닀.
읎러한 종류의 출력은 슀크늜튞가 ì–Žë–€ 작업을 완전히 수행할 때 특히 유용할 수 있습니닀.
예Ʞ치 않은. 디버거륌 사용하여 슀테핑하는 겜우 예Ʞ치 않은 펞위륌 놓칠 수 있습니닀.
완전히. 소풍을 Ʞ록하멎 빠륎게 볌 수 있습니닀.

첚가 로깅 에 your 암혞
닀음을 통핎 로귞 구성 요소륌 혞출하여 시뮬레읎션에 새 로깅을 추가할 수 있습니닀.
여러 맀크로. 에서 귞렇게 합시닀 myfirst.cc 우늬가 가지고 있는 슀크늜튞 할퀎닀 디렉토늬.

핎당 슀크늜튞에서 로깅 구성 요소륌 정의했음을 Ʞ억하십시였.

NS_LOG_COMPONENT_DEFINE("FirstScriptExample");

읎제 닀음을 섀정하여 읎 구성 요소에 대한 몚든 로깅을 활성화할 수 있음을 알고 있습니닀.
NS_LOG 닀양한 수쀀의 환겜 변수. 계속핎서 로깅을 추가핎 볎겠습니닀.
대볞. 정볎 수쀀 로귞 메시지륌 추가하는 데 사용되는 맀크로는 닀음곌 같습니닀. NS_LOG_INFO. 가Ʞ
녾드 생성을 시작하Ʞ 직전에 슀크늜튞륌 추가하십시였.
"토폎로지 작성"입니닀. 읎것은 읎 윔드 슀니펫에서와 같읎 수행됩니닀.

엜니닀 슀크래치/myfirst.cc 좋아하는 펞집Ʞ에서 쀄을 추가하십시였.

NS_LOG_INFO("토폎로지 생성");

쀄 바로 앞,

NodeContainer 녾드;
녾드.만듀Ʞ(2);

읎제 waf륌 사용하여 슀크늜튞륌 빌드하고 NS_LOG 토렌튞륌 끄는 변수
읎전에 활성화한 로깅:

$ ./와프
$ 낎볎낎Ʞ NS_LOG=

읎제 슀크늜튞륌 싀행하멎

$ ./waf --슀크래치/myfirst 싀행

당신 것입니닀 지원 연결된 로깅 구성 요소 읎후 새 메시지륌 찞조하십시였.
(FirstScript예)읎 활성화되지 않았습니닀. 메시지륌 볎렀멎 닀음을 수행핎알 합니닀.
~을 가능하게하닀 FirstScript예 읎상의 수쀀을 가진 로깅 구성 요소
NS_LOG_INFO. 읎 특정 수쀀의 로깅만 볎고 싶닀멎 활성화할 수 있습니닀.
윌로,

$ export NS_LOG=FirstScriptExample=정볎

읎제 슀크늜튞륌 싀행하멎 새로욎 "토폎로지 생성 쀑" 로귞 메시지가 표시됩니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.404쎈).
토폎로지 생성
1024바읎튞륌 10.1.1.2로 볎냈습니닀.
1024에서 10.1.1.1바읎튞 수신됚
1024에서 10.1.1.2바읎튞 수신됚

사용 명령 띌읞 읞수
재정의 태만 Attributes
방법을 변겜할 수 있는 또 닀륞 방법 NS-3 슀크늜튞는 펞집 없읎 동작하며 빌드는 닀음을 통핎 읎룚얎집니닀.
명령 선 읞수. 명령쀄 읞수륌 구묞 분석하고
핎당 읞수륌 Ʞ반윌로 로컬 및 전역 변수륌 자동윌로 섀정합니닀.

명령쀄 읞수 시슀템을 사용하는 첫 번짞 닚계는 명령쀄을 선얞하는 것입니닀.
파서. 읎는 닀음 윔드와 같읎 맀우 간닚하게 수행됩니닀(Ʞ볞 프로귞랚에서).

INT
메읞(int argc, char *argv[])
{
...

컀맚드띌읞 cmd;
cmd.Parse(argc, argv);

...
}

읎 ê°„ë‹ší•œ 두 쀄 슀니펫은 싀제로 ê·ž 자첎로 맀우 유용합니닀. 귞것은
NS-3 전역 변수 및 속성 시슀템. 계속핎서 두 쀄의 윔드륌
전에, 슀크래치/myfirst.cc 시작 부분의 슀크늜튞 볞ꎀ. 계속핎서 슀크늜튞륌 작성하고 싀행하십시였.
귞러나 닀음곌 같은 방법윌로 슀크늜튞에 도움을 요청하십시였.

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

읎것은 Waf에게 슀크래치/myfirst 슀크늜튞륌 작성하고 명령쀄 읞수륌 전달합니닀.
--PrintHelp 슀크늜튞에. ì–Žë–€ 프로귞랚읎 ì–Žë–€ 프로귞랚을 가젞였는지 분류하렀멎 따옎표가 필요합니닀.
녌쟁. 명령쀄 파서는 읎제 --PrintHelp 녌쟁곌 응답,

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.413쎈).
TcpL4프로토윜:TcpStateMachine()
CommandLine:HandleArgument(): í•žë“€ 읞수 읎늄=PrintHelp 값=
--PrintHelp: 읎 도움말 메시지륌 읞쇄합니닀.
--PrintGroups: 귞룹 목록을 읞쇄합니닀.
--PrintTypeIds: 몚든 TypeId륌 읞쇄합니닀.
--PrintGroup=[귞룹]: 귞룹의 몚든 TypeId륌 읞쇄합니닀.
--PrintAttributes=[typeid]: typeid의 몚든 속성을 읞쇄합니닀.
--PrintGlobals: 전역 목록을 읞쇄합니닀.

에 집쀑하자 --읞쇄 속성 옵션. 우늬는 읎믞 닀음곌 같읎 암시했습니닀. NS-3 속성
걞윌멎서 시슀템 첫 번짞.cc 슀크늜튞. 우늬는 닀음곌 같은 쀄을 볎았습니닀.
윔드

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

귞늬고 얞꞉했닀 데읎터 속도 싀제로 속성 의 PointToPointNet장치. 하자
명령쀄 읞수 파서륌 사용하여 Attributes 의
PointToPointNetDevice. 도움말 목록에는 닀음을 제공핎알 한닀고 나와 있습니닀. 유형 ID. 읎
핎당 큎래슀의 큎래슀 읎늄에 핎당합니닀. Attributes 제자늬에 있닀. 읎 겜우
귞것은 될 것읎닀. ns3::PointToPointNetDevice. 계속핎서 입력핎 볎겠습니닀.

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

시슀템에서 몚든 항목을 읞쇄합니닀. Attributes 읎러한 종류의 넷 장치. 쀑
Attributes 나엎된 것을 볌 수 있습니닀.

--ns3::PointToPointNetDevice::DataRate=[32768bps]:
포읞튞 투 포읞튞 링크의 Ʞ볞 데읎터 속도

닀음을 수행할 때 사용되는 Ʞ볞값입니닀. PointToPointNet장치 에 생성됩니닀
첎계. 우늬는 읎 Ʞ볞값을 속성 섀정 포읞튞투포읞튞도우믞
위에. 점대점 장치 및 채널에 대한 Ʞ볞값을 닀음곌 같읎 사용하겠습니닀.
삭제 SetDevice속성 전화와 SetChannel속성 에서 전화 myfirst.cc
우늬는 슀크래치 디렉토늬에 있습니닀.

읎제 슀크늜튞는 닀음을 ì„ ì–ží•Žì•Œ 합니닀. 포읞튞투포읞튞도우믞 귞늬고 아묎것도하지 섞튞 욎영
닀음 예에서와 같읎

...

NodeContainer 녾드;
녾드.만듀Ʞ(2);

PointToPointHelper pointToPoint;

NetDeviceContainer 장치;
장치 = pointToPoint.Install(녾드);

...

계속핎서 Waf로 새 슀크늜튞륌 빌드합니닀(./와프) 돌아가서 음부륌 활성화하겠습니닀.
UDP 에윔 서버 애플늬쌀읎션에서 로깅하고 시간 접두사륌 쌭니닀.

$ 낎볎낎Ʞ 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

슀크늜튞륌 싀행하멎 읎제 닀음 출력읎 표시됩니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.405쎈).
0s UdpEchoServer응용 프로귞랚:UdpEchoServer()
1쎈 UdpEchoServerApplication:StartApplication()
1024바읎튞륌 10.1.1.2로 볎냈습니닀.
2.25732s 1024에서 10.1.1.1바읎튞 수신
2.25732s 에윔 팚킷
1024에서 10.1.1.2바읎튞 수신됚
10쎈 UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

팚킷읎 발생한 시뮬레읎션 시간을 마지막윌로 볎았을 때륌 상Ʞ하십시였.
에윔 서버에서 수신한 시간은 2.00369쎈였습니닀.

2.00369s UdpEchoServerApplication:HandleRead(): 1024에서 10.1.1.1바읎튞 수신됚

읎제 2.25732쎈에 팚킷을 수신합니닀. 읎것은 우늬가 방ꞈ 떚얎뜚렞Ʞ 때묞입니닀.
의 데읎터 속도 PointToPointNet장치 쎈당 Ʞ볞값읞 32768비튞로 낮춥니닀.
쎈당 XNUMX메가비튞.

우늬가 새로욎 것을 제공한닀멎 데읎터 속도 명령쀄을 사용하여 시뮬레읎션 속도륌 높음 수 있습니닀.
닀시 위로. 도움말에 포핚된 공식에 따띌 닀음곌 같은 방식윌로 읎 작업을 수행합니닀.
항목 :

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

읎렇게 하멎 닀음의 Ʞ볞값읎 섀정됩니닀. 데읎터 속도 속성 당 XNUMX메가비튞로 닀시
두번짞. 결곌에 놀랐습니까? 원볞을 얻윌렀멎
슀크늜튞의 동작을 되돌늬렀멎 채널의 빛의 속도 지연을 섀정핎알 합니닀.
또한. 명령쀄 시슀템에 닀음을 읞쇄하도록 요청할 수 있습니닀. Attributes 채널의
우늬가 net 장치에 대핮 했던 것처럌:

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

우늬는 발견 Delay 속성 채널의 섀정은 닀음곌 같읎 섀정됩니닀.

--ns3::PointToPointChannel::지연=[0ns]:
채널을 통한 전송 지연

귞런 닀음 명령쀄 시슀템을 통핎 읎러한 Ʞ볞값을 몚두 섀정할 수 있습니닀.

$ ./waf --싀행 "슀크래치/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::지연=2ms"

읎 겜우 명시적윌로 섀정했을 때의 타읎밍을 복구합니닀. 데읎터 속도 and Delay
슀크늜튞에서 :

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.417쎈).
0s UdpEchoServer응용 프로귞랚:UdpEchoServer()
1쎈 UdpEchoServerApplication:StartApplication()
1024바읎튞륌 10.1.1.2로 볎냈습니닀.
2.00369s 1024에서 10.1.1.1바읎튞 수신
2.00369s 에윔 팚킷
1024에서 10.1.1.2바읎튞 수신됚
10쎈 UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

팚킷은 2.00369쎈에 서버에서 닀시 수신됩니닀. 우늬는 할 수
싀제로 섀정 Attributes 읎런 식윌로 슀크늜튞에서 사용됩니닀. 특히 우늬는 할 수 있습니닀
섀정 UDPEcho큎띌읎얞튞 속성 최대 팚킷 XNUMX읎 아닌 닀륞 값윌로.

얎떻게 하시겠습니까? 시도 핮뮐. 장소륌 죌석 처늬핎알 핚을 Ʞ억하십시였.
우늬는 Ʞ볞값을 재정의합니닀 속성 귞늬고 명시적윌로 섀정 최대 팚킷 슀크늜튞에서. 귞럌 너
슀크늜튞륌 닀시 작성핎알 합니닀. 또한 싀제로 섀정하Ʞ 위한 구묞을 ì°Ÿì•„ì•Œ 합니닀.
명령쀄 도움말 Ʞ능을 사용하여 새 Ʞ볞 속성 값. 음닚 읎것만 있윌멎
명령에서 반향되는 팚킷 수륌 제얎할 수 있얎알 한닀는 것을 알아냈습니닀.
선. 우늬는 좋은 사람듀읎Ʞ 때묞에 명령쀄읎
같은 것,

$ ./waf --싀행 "슀크래치/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::지연=2ms
--ns3::UdpEchoClient::MaxPackets=2"

후킹 너의 소유 마쌀팅은:
명령쀄 시슀템에 고유한 후크륌 추가할 수도 있습니닀. 읎것은 맀우 간닚하게 수행됩니닀.
륌 사용하여 값을 추가 명령쀄 파서에 대한 메서드입니닀.

읎 Ʞ능을 사용하여 완전히 닀륞 환겜에서 에윔할 팚킷 수륌 지정핎 볎겠습니닀.
방법. 띌는 지역 변수륌 추가핎 볎겠습니닀. n팚킷 부터 볞ꎀ Ʞ능. 쎈Ʞ화 하겠습니닀
읎전 Ʞ볞 동작곌 음치하도록 XNUMX로 변겜합니닀. 명령쀄 파서가
읎 값을 변겜하렀멎 값을 파서에 ì—°ê²°í•Žì•Œ 합니닀. 혞출을 추가하여 읎륌 수행합니닀.
에 값을 추가. 계속핎서 닀음을 변겜하십시였. 슀크래치/myfirst.cc 로 시작하는 슀크늜튞
닀음 윔드,

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

컀맚드띌읞 cmd;
cmd.AddValue("nPackets", "반향할 팚킷 수", nPackets);
cmd.Parse(argc, argv);

...

슀크늜튞에서 섀정한 지점까지 아래로 슀크례합니닀. 최대 팚킷 속성 변겜
변수로 섀정되도록 n팚킷 상수 대신 1 아래에 표시된 것처럌.

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

읎제 슀크늜튞륌 싀행하고 --PrintHelp 녌쟁, 당신은 당신의 새로욎
사용자 녌의 도움말 표시에 나엎됩니닀.

시험,

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

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.403쎈).
--PrintHelp: 읎 도움말 메시지륌 읞쇄합니닀.
--PrintGroups: 귞룹 목록을 읞쇄합니닀.
--PrintTypeIds: 몚든 TypeId륌 읞쇄합니닀.
--PrintGroup=[귞룹]: 귞룹의 몚든 TypeId륌 읞쇄합니닀.
--PrintAttributes=[typeid]: typeid의 몚든 속성을 읞쇄합니닀.
--PrintGlobals: 전역 목록을 읞쇄합니닀.
사용자 읞수:
--nPackets: 에윔할 팚킷 수

에윔할 팚킷 수륌 지정하렀멎 읎제
--n팚킷 명령쀄의 읞수,

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

너는 지ꞈ볎아알한닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.404쎈).
0s UdpEchoServer응용 프로귞랚:UdpEchoServer()
1쎈 UdpEchoServerApplication:StartApplication()
1024바읎튞륌 10.1.1.2로 볎냈습니닀.
2.25732s 1024에서 10.1.1.1바읎튞 수신
2.25732s 에윔 팚킷
1024에서 10.1.1.2바읎튞 수신됚
1024바읎튞륌 10.1.1.2로 볎냈습니닀.
3.25732s 1024에서 10.1.1.1바읎튞 수신
3.25732s 에윔 팚킷
1024에서 10.1.1.2바읎튞 수신됚
10쎈 UdpEchoServerApplication:StopApplication()
UdpEchoServerApplication:DoDispose()
UdpEchoServerApplication:~UdpEchoServer()

읎제 두 개의 팚킷을 에윔했습니닀. ꜀ 쉜지 않나요?

당신은 당신읎 읞 겜우에 귞것을 볌 수 있습니닀 NS-3 사용자는 명령쀄 읞수 시슀템을 사용하여 닀음을 수행할 수 있습니닀.
Ꞁ로벌 가치륌 제얎하고 Attributes. 몚덞 작성자읞 겜우 새 항목을 추가할 수 있습니닀.
Attributes 너의 ~에게 사묌 사용자가 자동윌로 섀정할 수 있습니닀.
명령쀄 시슀템을 통핎 사용자. 슀크늜튞 작성자읞 겜우 새 항목을 추가할 수 있습니닀.
슀크늜튞에 변수륌 추가하고 아죌 쉜게 명령쀄 시슀템에 연결합니닀.

사용 전에, 튞레읎싱
시뮬레읎션의 요점은 추가 연구륌 위한 출력을 생성하는 것입니닀. NS-3
추적 시슀템은 읎륌 위한 Ʞ볞 메컀니슘입니닀. 부터 NS-3 C++ 프로귞랚, 표쀀
C++ 프로귞랚에서 출력을 생성하는 Ʞ능을 사용할 수 있습니닀.

#포핚
...
정수 메읞()
{
...
std::cout << "x의 값은 " << x << std::endl;
...
}

로깅 몚듈을 사용하여 솔룚션에 앜간의 구조륌 추가할 수도 있습니닀. ê±°êž°
귞러한 접귌법에 의핎 생성된 많은 잘 알렀진 묞제읎므로 우늬는 닀음을 제공했습니닀.
우늬가 쀑요하닀고 생각한 묞제륌 핎결하Ʞ 위한 음반 읎벀튞 추적 하위 시슀템.

의 Ʞ볞 목표 NS-3 추적 시슀템은 닀음곌 같습니닀.

· Ʞ볞 작업의 겜우 추적 시슀템에서 사용자가 표쀀 추적을 생성할 수 있얎알 합니닀.
널늬 사용되는 추적 소슀에 대핮 추적을 생성하는 개첎륌 사용자 지정합니닀.

· 쀑꞉ 사용자는 추적 시슀템을 확장하여 출력 형식을 수정할 수 있얎알 합니닀.
의 핵심을 수정하지 않고 생성하거나 새 추적 소슀륌 삜입합니닀.
몚의 싀험 장치;

· 고꞉ 사용자는 시뮬레읎터 윔얎륌 수정하여 새로욎 추적 소슀 및 싱크륌 추가할 수 있습니닀.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 추적 시슀템은 독늜적읞 추적 소슀 및
추적 싱크, 소슀륌 싱크에 연결하Ʞ 위한 균음한 메컀니슘. 추적 소슀는
시뮬레읎션에서 발생하는 읎벀튞에 신혞륌 볎낎고 액섞슀륌 제공할 수 있는 엔터티
흥믞로욎 Ʞ볞 데읎터. 예륌 듀얎 추적 소슀는 팚킷읎
넀튞워크 장치에서 수신하고 ꎀ심 있는 추적을 위핎 팚킷 낎용에 대한 액섞슀륌 제공합니닀.
싱크대.

추적 소슀는 ê·ž 자첎로는 유용하지 않윌며 닀륞 부분에 "연결"되얎알 합니닀.
싱크에서 제공하는 정볎로 싀제로 유용한 작업을 수행하는 윔드입니닀. 추적하닀
싱크는 추적 소슀에서 제공하는 읎벀튞 및 데읎터의 소비자입니닀. 예륌 듀얎,
튞레읎슀 싱크륌 생성할 수 있습니닀.
읎전 예) 수신된 팚킷의 흥믞로욎 부분을 읞쇄합니닀.

읎렇게 명시적윌로 구분하는 읎유는 사용자가 새로욎 유형의 싱크륌
핵심을 펞집하고 재컎파음할 필요 없읎 êž°ì¡Ž 추적 소슀
몚의 싀험 장치. 따띌서 위의 예에서 사용자는 자신의 새 추적 싱크륌 정의할 수 있습니닀.
슀크늜튞륌 작성하고 읎륌 시뮬레읎션 윔얎에 정의된 êž°ì¡Ž 추적 소슀에 첚부합니닀.
사용자 슀크늜튞만 펞집합니닀.

읎 자습서에서는 사전 정의된 음부 소슀 및 싱크륌 삎펎볎고 방법을 볎여쀍니닀.
앜간의 사용자 녞력윌로 사용자 정의할 수 있습니닀. ns-3 섀명서 또는 방법 섹션을 찞조하십시였.
추적 확장을 포핚한 고꞉ 추적 구성에 대한 정볎는
넀임슀페읎슀 및 새 추적 소슀 만듀Ʞ.

ASCII 튞레읎싱
NS-3 하위 수쀀 추적 시슀템을 래핑하는 도우믞 Ʞ능을 제공하여
쉜게 읎핎할 수 있는 음부 팚킷 추적 구성곌 ꎀ렚된 섞부 정볎가 포핚됩니닀. 만앜 너띌멎
읎 Ʞ능을 활성화하멎 ASCII 파음 --- 읎늄윌로 출력읎 표시됩니닀. 을 위한
익숙한 사람듀 NS-2 출력, 읎 유형의 추적은 out.tr 생성
많은 슀크늜튞로.

바로 뛰얎듀얎 음부 ASCII 추적 출력을 슀크래치/myfirst.cc
슀크늜튞. 혞출 직전 시뮬레읎터::싀행 (), 닀음 윔드 쀄을 추가합니닀.

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

닀륞 많은 것듀처럌 NS-3 ꎀ용구, 읎 윔드는 도우믞 객첎륌 사용하여 ASCII 생성을 돕습니닀.
흔적. 두 번짞 쀄에는 두 개의 쀑첩된 메서드 혞출읎 포핚되얎 있습니닀. "낎부" 방법,
생성파음슀튞늌() 명명되지 않은 객첎 ꎀ용구륌 사용하여
슀택(객첎 읎늄 없음)을 혞출한 메서드로 전달합니닀. 우늬는 읎것에 듀얎갈 것입니닀
앞윌로는 더 많겠지만 지ꞈ 시점에서 알아알 할 것은
"myfirst.tr"읎띌는 파음을 나타낮는 객첎 NS-3. 당신은 말하고있닀
NS-3 생성된 개첎의 수명 묞제륌 처늬하고 묞제륌 처늬하Ʞ 위핎
복사와 ꎀ렚된 슀튞늌 개첎의 C++에 대한 잘 알렀지지 않은(의도적읞) 제한윌로 읞핎 발생합니닀.
생성자.

왞부 전화, AsciiAll 활성화(), 헬퍌에게 ASCII륌 활성화하고 싶닀고 알늜니닀.
시뮬레읎션의 몚든 점대점 장치에 대한 추적 귞늬고 당신은 (제공된)
팚킷 읎동에 대한 정볎륌 ASCII 형식윌로 Ʞ록하는 추적 싱크.

익숙한 사람듀을 위핎 NS-2, 추적된 읎벀튞는 널늬 사용되는 추적 지점곌 동음합니닀.
"+", "-", "d" 및 "r" 읎벀튞륌 Ʞ록합니닀.

읎제 슀크늜튞륌 빌드하고 명령쀄에서 싀행할 수 있습니닀.

$ ./waf --슀크래치/myfirst 싀행

읎전에 여러 번 볞 것처럌 Waf에서 메시지가 표시되고
싀행 쀑읞 프로귞랚에서 음부 메시지와 핚께 "'빌드'가 성공적윌로 완료되었습니닀."

프로귞랚읎 싀행될 때 프로귞랚은 읎늄읎 지정된 파음을 생성합니닀. myfirst.tr. 방법 때묞에
Waf가 작동하멎 파음읎 로컬 디렉토늬에 생성되지 않고 닀음 위치에 생성됩니닀.
Ʞ볞적윌로 저장소의 최상위 디렉토늬. 추적 위치륌 제얎하렀멎
저장하멎 닀음을 사용할 수 있습니닀. --cwd 읎것을 지정하Ʞ 위한 Waf의 옵션. 우늬는 귞렇게 하지 않았윌므로
저장소의 최상위 디렉토늬로 변겜하고 ASCII륌 삎펎뎐알 합니닀.
추적 파음 myfirst.tr 좋아하는 펞집Ʞ에서.

파싱 아슀킀 추적
거Ʞ에는 ꜀ 조밀한 형태로 많은 정볎가 있지만, 가장 뚌저 알아찚렀알 할 것은
읎 파음에는 별개의 쀄읎 많읎 있닀는 것입니닀. 볎Ʞ 얎렀욞 수 있습니닀
당신읎 당신의 찜을 상당히 넓히지 않는 한 읎것은 분명합니닀.

파음의 각 띌읞은 더듬닀 event. 읎 겜우 읎벀튞륌 추적하고 있습니닀.
전에, 부치닀 변발 시뮬레읎션의 몚든 점대점 넀튞 장치에 졎재합니닀. 귞만큌
전송 대Ʞ엎은 지점간 채널로 향하는 몚든 팚킷읎 통곌하는 대Ʞ엎입니닀.
통곌핎알 합니닀. 추적 파음의 각 띌읞은 닚음 묞자로 시작합니닀(
ê·ž 뒀에 공백). 읎 묞자는 닀음곌 같은 의믞륌 갖습니닀.

· +: 장치 대Ʞ엎에서 대Ʞ엎에 넣Ʞ 작업읎 발생했습니닀.

· -: 장치 대Ʞ엎에서 대Ʞ엎 제거 작업읎 발생했습니닀.

· d: 음반적윌로 대Ʞ엎읎 가득 ì°šì„œ 팚킷읎 삭제되었습니닀.

· r: 넀튞워크 장치에서 팚킷을 수신했습니닀.

추적 파음의 첫 번짞 쀄을 좀 더 자섞히 삎펎볎겠습니닀. ë‚Žê°€ 부숎버늎게
왌쪜에 ì°žì¡° 번혞가 있는 섹션윌로 구분(명확성을 위핎 듀여쓰Ʞ):

+
2
/NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/읞큐
ns3::Ppp헀더(
점대점 프로토윜: IP(0x0021))
ns3::Ipv4헀더(
tos 0x0 ttl 64 id 0 프로토윜 17 였프셋 0 플래귞 [없음]
Ꞟ읎: 1052 10.1.1.1 > 10.1.1.2)
ns3::UDp헀더(
Ꞟ읎: 1032 49153 > 9)
페읎로드(크Ʞ=1024)

읎 확장된 추적 읎벀튞(ì°žì¡° 번혞 0)의 첫 번짞 섹션은 작업입니닀. 우늬
읎 + 묞자읎므로 읎것은 대Ʞ엎에 넣닀 전송 대Ʞ엎에 대한 작업.
두 번짞 섹션(ì°žì¡° 1)은 쎈 닚위로 표현된 시뮬레읎션 시간입니닀. 당신은 할 수있닀
우늬가 UdpEchoClient응용 프로귞랚 XNUMX쎈에 팚킷 전송을 시작합니닀.
여Ʞ서 우늬는 읎것읎 싀제로 음얎나고 있닀는 확읞을 뎅니닀.

예제 튞레읎슀(ì°žì¡° 2)의 닀음 섹션은 ì–Žë–€ 튞레읎슀 소슀가 생성되었는지 알렀쀍니닀.
읎 읎벀튞(추적 넀임슀페읎슀로 표현됹). 추적 넀임슀페읎슀륌 생각할 수 있습니닀.
파음 시슀템 읎늄 공간곌 비슷합니닀. 넀임슀페읎슀의 룚튞는
녾드 목록. 읎것은 닀음에서 ꎀ늬되는 컚테읎너에 핎당합니닀. NS-3 몚두 포핚하는 핵심 윔드
슀크늜튞에서 생성된 녞드의 파음 시슀템에 디렉토늬가 있는 것처럌
룚튞 아래에 녾드 번혞가 있을 수 있습니닀. 녾드 목록. 묞자엎 /녞드늬슀튞/0
따띌서 XNUMX번짞 녞드륌 찞조합니닀. 녾드 목록 음반적윌로 "녾드"띌고 생각하는
0". 각 녞드에는 섀치된 장치 목록읎 있습니닀. 읎 목록읎 나타납니닀.
넀임슀페읎슀의 닀음. 읎 추적 읎벀튞가 장치 목록/0 하는 것입니닀
녞드에 섀치된 XNUMX번짞 장치.

닀음 묞자엎, $ns3::PointToPointNetDevice ì–Žë–€ 종류의 장치가 있는지 알렀쀍니닀.
녾드 XNUMX에 대한 장치 목록의 XNUMX번짞 위치. 작업을 Ʞ억하십시였. + 에서 발견
ì°žì¡° 00은 대Ʞ엎에 넣Ʞ 작업읎 장치의 전송 대Ʞ엎에서 발생했음을 의믞합니닀.
읎는 "추적 겜로"의 마지막 섞귞뚌튞에 반영됩니닀. TxQueue/읞큐.

추적의 나뚞지 섹션은 상당히 직ꎀ적읎얎알 합니닀. ì°žì¡° 3-4는 닀음을 나타냅니닀.
팚킷읎 점대점 프로토윜로 캡슐화됩니닀. ì°žê³  묞헌 5-7은
팚킷에는 IP 버전 10.1.1.1 헀더가 있고 IP 죌소 XNUMX에서 시작되었윌며
10.1.1.2로 예정되얎 있습니닀. ì°žì¡° 8-9는 읎 팚킷읎 UDP 헀더륌 가지고 있음을 볎여쀍니닀.
마지막윌로 ì°žì¡° 10은 페읎로드가 예상되는 1024바읎튞임을 볎여쀍니닀.

추적 파음의 닀음 쀄은 동음한 팚킷읎 전송에서 대Ʞ엎에서 제왞되는 것을 볎여쀍니닀.
같은 녞드에서 대Ʞ합니닀.

추적 파음의 ì„ž 번짞 쀄은 넀튞워크 장치에서 수신되는 팚킷을 볎여쀍니닀.
에윔 서버가 있는 녾드. 아래에 핎당 읎벀튞륌 재현했습니닀.

r
2.25732
/NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
ns3::Ipv4헀더(
tos 0x0 ttl 64 id 0 프로토윜 17 였프셋 0 플래귞 [없음]
Ꞟ읎: 1052 10.1.1.1 > 10.1.1.2)
ns3::UDp헀더(
Ꞟ읎: 1032 49153 > 9)
페읎로드(크Ʞ=1024)

추적 작업읎 읎제 r 시뮬레읎션 시간읎 2.25732로 슝가했습니닀.
쎈. 자습서 닚계륌 자섞히 따띌왔닀멎 읎는 닀음을 의믞합니닀.
~륌 낚겚 놓닀 데읎터 속도 넀튞워크 장치 및 채널 Delay Ʞ볞값윌로 섀정합니닀.
읎 시간은 읎전 섹션에서 읎전에 볞 것처럌 친숙핎알 합니닀.

추적 소슀 넀임슀페읎슀 항목(ì°žì¡° 02)읎 읎 읎벀튞가
녾드 1(/녞드늬슀튞/1) 및 팚킷 수신 추적 소슀(/MacRx). 귞것
닀음을 통핎 토폎로지륌 통핎 팚킷의 진행 상황을 쉜게 따띌갈 수 있얎알 합니닀.
파음의 나뚞지 추적을 삎펎뎅니닀.

PCAP 튞레읎싱
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 장치 헬퍌는 또한 추적 파음을 생성하는 데 사용할 수 있습니닀. .pcap 첎재. 귞만큌
앜얎 pcap(음반적윌로 소묞자로 작성됚)은 팚킷 캡처륌 의믞하며 싀제로는
의 정의륌 포핚하는 API .pcap 파음 형식. 가장 읞Ʞ있는 프로귞랚은
읎 형식을 읜고 표시할 수 있는 것은 Wireshark(읎전에는 Ethereal읎띌고 핹)입니닀. 귞러나 거Ʞ에
읎 팚킷 형식을 사용하는 많은 튞래픜 추적 분석Ʞ입니닀. 우늬는 사용자가
pcap 추적을 분석하는 데 사용할 수 있는 많은 도구륌 활용하십시였. 읎 튜토늬얌에서 우늬는
tcpdump로 pcap 추적을 볎는 데 집쀑하십시였.

pcap 추적을 활성화하는 데 사용되는 윔드는 한 쀄입니닀.

pointToPoint.EnablePcapAll("myfirst");

방ꞈ 추가한 ASCII 추적 윔드 뒀에 읎 윔드 쀄을 삜입하십시였.
슀크래치/myfirst.cc. "myfirst"띌는 묞자엎만 전달했고
"myfirst.pcap" 또는 읎와 유사한 것. 읎는 맀개변수가 접두사가 아니띌 접두사읎Ʞ 때묞입니닀.
완전한 파음 읎늄. 도우믞는 싀제로 몚든 지점 간 추적 파음을 만듭니닀.
시뮬레읎션 장치. 파음 읎늄은 접두사, 녾드 번혞,
장치 번혞 및 ".pcap" 접믞사.

예제 슀크늜튞에서 ê²°êµ­ "myfirst-0-0.pcap"읎띌는 파음읎 표시되고
녾드 1-장치 0 및 녾드 0-장치 0에 대한 pcap 추적읞 "myfirst-1-0.pcap",
각각.

pcap 추적을 활성화하는 윔드 쀄을 추가하멎 닀음에서 슀크늜튞륌 싀행할 수 있습니닀.
음반적읞 방법:

$ ./waf --슀크래치/myfirst 싀행

배포판의 최상위 디렉토늬륌 볎멎 읎제 ì„ž 개의 로귞가 표시됩니닀.
파음 : myfirst.tr 읎전에 조사한 ASCII 추적 파음입니닀. myfirst-0-0.pcap
and myfirst-1-0.pcap 방ꞈ 생성한 새 pcap 파음입니닀.

읜Ʞ 출력 곌 TCP 덀프
읎 시점에서 할 수 있는 가장 쉬욎 음은 닀음을 사용하는 것입니닀. TCP 덀프 ~을 볎닀 pcap 파음.

$ tcpdump -nn -tt -r myfirst-0-0.pcap
파음 myfirst-0-0.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, Ꞟ읎 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

tcpdump -nn -tt -r myfirst-1-0.pcap
파음 myfirst-1-0.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, Ꞟ읎 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

의 덀프에서 볌 수 있습니닀. myfirst-0-0.pcap (큎띌읎얞튞 장치) 에윔 팚킷은
시뮬레읎션윌로 2쎈에 전송됩니닀. 두 번짞 덀프(myfirst-1-0.pcap)
2.257324쎈에 팚킷읎 수신되는 것을 볌 수 있습니닀. 당신은 팚킷읎
두 번짞 덀프에서 2.257324쎈에 닀시 에윔되고 마지막윌로 팚킷읎
2.514648쎈에 첫 번짞 덀프에서 큎띌읎얞튞에서 닀시 수신되었습니닀.

읜Ʞ 출력 곌 와읎얎 샀크
Wireshark에 익숙하지 않은 겜우 닀음을 수행할 수 있는 웹 사읎튞가 있습니닀.
프로귞랚 및 묞서 닀욎로드: http://www.wireshark.org/.

Wireshark는 읎러한 추적을 표시하는 데 사용할 수 있는 귞래픜 사용자 읞터페읎슀입니닀.
파음. Wireshark륌 사용할 수 있는 겜우 각 추적 파음을 ì—Žê³  표시할 수 있습니닀.
륌 사용하여 팚킷을 캡처한 것처럌 낎용을 팚킷 손수걎.

걎묌 토폎로지


걎묌 a 버슀 넀튞워크 토폎로지
읎 섹션에서 우늬는 NS-3 넀튞워크 장치 및 채널
버슀 넀튞워크의 예륌 닀룹니닀. NS-3 우늬가 CSMA띌고 부륎는 넀튞 장치와 채널을 제공합니닀.
(캐늬얎 감지 닀쀑 접속).

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 CSMA 장치는 읎더넷 정신윌로 닚순한 넀튞워크륌 몚덞링합니닀. 진정한 읎더넷
CSMA/CD(Carrier Sense Multiple Access with Collision Detection) 방식을 사용하여
공유 전송 맀첎륌 놓고 겜쟁하Ʞ 위핎 Ʞ하꞉수적윌로 슝가하는 백였프. 귞만큌 NS-3
CSMA 장치 및 채널 몚덞은 읎것의 하위 집합음 뿐입니닀.

구성할 때 점대점 토폎로지 도우믞 개첎륌 볞 것처럌
점대점 토폎로지의 겜우 읎 섹션에서 동등한 CSMA 토폎로지 도우믞륌 볌 수 있습니닀.
읎러한 도우믞의 몚양곌 작동은 맀우 친숙핎 볎음 것입니닀.

examples/tutorial} 디렉터늬에 예제 슀크늜튞륌 제공합니닀. 읎 슀크늜튞는
전에, 첫 번짞.cc 슀크늜튞륌 작성하고 CSMA 넀튞워크륌 점대점 시뮬레읎션에 추가합니닀.
졎겜받는. 계속핎서 ì—Žêž° 예제/튜토늬얌/second.cc 좋아하는 펞집Ʞ에서. 너
읎믞 충분히 볎았을 것읎닀 NS-3 읎 윔드에서 진행되는 대부분의 작업을 읎핎하는 윔드
하지만 우늬는 전첎 슀크늜튞륌 삎펎볎고 음부 출력을 검사할 것입니닀.

에서와 같읎 첫 번짞.cc 예(및 몚든 ns-3 예에서) 파음은 emacs로 시작합니닀.
몚드 띌읞곌 음부 GPL 상용구.

싀제 윔드는 몚듈 포핚 파음을 로드하는 것윌로 시작합니닀. 첫 번짞.cc
예.

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

놀랍게도 유용할 수 있는 한 가지는 만화륌 볎여죌는 앜간의 ASCII 아튞입니닀.
예제에서 구성한 넀튞워크 토폎로지의 에서 유사한 "귞늌"을 찟을 수 있습니닀.
우늬의 예의 대부분.

읎 겜우 점대점 예제륌 확장할 것임을 알 수 있습니닀(링크
아래의 녾드 n0곌 n1 사읎) 였륞쪜에서 버슀 넀튞워크륌 끊습니닀. 알아채닀
싀제로 녾드 수륌 변겜할 수 있윌므로 읎것읎 Ʞ볞 넀튞워크 토폎로지입니닀.
LAN에서 생성됩니닀. nCsma륌 XNUMX로 섀정하멎 nCsma에 쎝 XNUMX개의 녞드가 있게 됩니닀.
LAN(CSMA 채널) --- 하나의 필수 녞드와 하나의 "추가" 녾드. Ʞ볞적윌로 ì„ž 가지
아래와 같읎 "추가" 녾드:

// Ʞ볞 넀튞워크 토폎로지
//
// 10.1.1.0
// n0 -------------- n1 n2 n3 n4
// 점대점 | | | |
// ================
// 랜 10.1.2.0

귞러멎 ns-3 넀임슀페읎슀는 익숙한 로깅 구성 요소가 정의됩니닀. 읎것은 몚두
에 있었닀 첫 번짞.cc, 아직 새로욎 것읎 없습니닀.

넀임슀페읎슀 ns3 사용;

NS_LOG_COMPONENT_DEFINE("SecondScriptExample");

메읞 프로귞랚은 앜간 닀륞 방식윌로 시작됩니닀. 자섞한 정볎 표시 플래귞륌 사용하여
여부륌 결정합니닀. UdpEchoClient응용 프로귞랚 and UdpEchoServer응용 프로귞랚 로깅
구성 요소가 활성화됩니닀. 읎 플래귞의 Ʞ볞값은 true입니닀(로깅 구성 요소가 활성화됚).
하지만 읎 예제의 회귀 테슀튞 쀑에 로깅을 끌 수 있습니닀.

장치의 수륌 변겜할 수 있는 몇 가지 친숙한 윔드가 표시됩니닀.
명령쀄 읞수륌 통한 CSMA 넀튞워크. 우늬는
명령쀄 읞수 섹션에서 변겜하Ʞ 위핎 볎낞 팚킷 수. 마지막
띌읞은 최소한 하나의 "추가" 녞드가 있는지 확읞합니닀.

윔드는 읎전에 닀룬 API의 변형윌로 구성되얎 있윌므로 완전히
튜토늬얌의 읎 시점에서 닀음 윔드에 익숙합니닀.

부욞 상섞 정볎 = ì°ž;
uint32_t nCsma = 3;

컀맚드띌읞 cmd;
cmd.AddValue ("nCsma", "\"extra\" CSMA 녾드/장치 수", nCsma);
cmd.AddValue ("verbose", "찞음 겜우 로귞하도록 echo 응용 프로귞랚에 지시", verbose);

cmd.Parse(argc, argv);

if(상섞)
{
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}

nCsma = nCsma == 0 ? 1: nCsma;

닀음 닚계는 지점 간 링크륌 통핎 연결할 두 개의 녞드륌 만드는 것입니닀.
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 녞드컚테읎너 에서 수행한 것처럌 읎 작업을 수행하는 데 사용됩니닀. 첫 번짞.cc.

NodeContainer p2pNodes;
p2pNodes.Create(2);

닀음윌로 닀륞 ì„ ì–ž 녞드컚테읎너 버슀의 음부가 될 녞드륌 유지하Ʞ 위핎
(CSMA) 넀튞워크. 뚌저 컚테읎너 개첎 자첎륌 읞슀턎슀화합니닀.

NodeContainer csmaNodes;
csmaNodes.Add(p2pNodes.Get(1));
csmaNodes.만듀Ʞ(nCsma);

닀음 윔드 쀄 가젞옵니닀. 첫 번짞 녾드(읞덱슀가 XNUMX읞 겜우)
점대점 녾드 컚테읎너 및 CSMA륌 가젞올 녞드의 컚테읎너에 추가
장치. 묞제의 녾드는 점대점 장치로 끝날 것입니닀. and CSMA
장치. 귞런 닀음 나뚞지 CSMA륌 구성하는 여러 "추가" 녞드륌 만듭니닀.
회로망. CSMA 넀튞워크에 읎믞 하나의 녞드가 있윌므로
점대점 및 CSMA 넀튞워크 장치 몚두에서 "추가" 녞드의 수는
CSMA 섹션에서 원하는 녞드에서 XNUMX을 뺀 값입니닀.

닀음 윔드는 읎제 ꜀ 익숙할 것입니닀. 우늬는 포읞튞투포읞튞도우믞
ꎀ렚 Ʞ볞값을 섀정합니닀. Attributes 쎈당 XNUMX메가비튞륌 생성하도록
도우믞륌 사용하여 만든 장치의 송신Ʞ 및 채널의 XNUMX밀늬쎈 지연
도우믞에 의핎 생성됩니닀.

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

NetDeviceContainer p2p장치;
p2pDevices = pointToPoint.Install(p2pNodes);

귞런 닀음 NetDevice컚테읎너 점대점 넀튞 장치륌 추적하Ʞ 위핎
귞늬고 우늬 섀치 지점 간 녞드의 장치.

CSMA 장치 및 채널에 대한 도우믞륌 볎게 될 것읎띌고 위에서 얞꞉했습니닀.
닀음 쀄에서 귞것듀을 소개합니닀. 귞만큌 CsmaHelper 처럌 작동 포읞튞투포읞튞도우믞하지만,
CSMA 장치 및 채널을 생성하고 연결합니닀. CSMA 장치의 겜우
채널 쌍에서 데읎터 속도는 채널 속성 대신에
장치 속성. 싀제 CSMA 넀튞워크는 혌합을 허용하지 ì•Šêž° 때묞입니닀.
예륌 듀얎, 죌얎진 채널의 10Base-T 및 100Base-T 장치. 뚌저 데읎터 속도륌 닀음윌로 섀정했습니닀.
쎈당 100메가비튞, 채널의 ꎑ속 지연을 6560윌로 섀정
나녞쎈(1믞터 섞귞뚌튞에서 플튞당 100나녞쎈로 임의로 선택됚).
닀음을 섀정할 수 있습니닀. 속성 Ʞ볞 데읎터 유형을 사용합니닀.

CsmaHelper csma;
csma.SetChannelAttribute("DataRate", StringValue("100Mbps"));
csma.SetChannelAttribute("지연", TimeValue(NanoSeconds(6560)));

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

우늬가 만든 것처럌 NetDevice컚테읎너 에 의핎 생성된 장치륌 유지하Ʞ 위핎
포읞튞투포읞튞도우믞 우늬는 NetDevice컚테읎너 우늬가 만든 장치륌 볎ꎀ하Ʞ 위핎
CsmaHelper. 우늬는 섀치 방법 CsmaHelper 에 장치륌 섀치하렀멎
의 녾드 csma녾드 녞드컚테읎너.

읎제 녾드, 장치 및 채널읎 생성되었지만 프로토윜 슀택읎 없습니닀.
현재의. 에서와 같읎 첫 번짞.cc 슀크늜튞, 우늬는 읞터넷슀택헬퍌 섀치하Ʞ 위핎서
읎 슀택.

InternetStackHelper 슀택;
stack.Install(p2pNodes.Get(0));
stack.Install(csmaNodes);

우늬가 녾드 쀑 하나륌 p2p녾드 컚테읎너에 추가했습니닀.
csma녾드 컚테읎너. 따띌서 나뚞지 슀택에만 슀택을 섀치하멎 됩니닀. p2p녾드
녾드 및 몚든 녾드 csma녾드 몚든 녞드륌 포핚하는 컚테읎너
시뮬레읎션.

에서와 같읎 첫 번짞.cc 예제 슀크늜튞에서 우늬는 IPv4AddressHelper 에
장치 읞터페읎슀에 IP 죌소륌 할당합니닀. 뚌저 넀튞워크 10.1.1.0을 사용하여 생성합니닀.
두 개의 지점 간 장치에 필요한 두 개의 죌소.

Ipv4AddressHelper 죌소;
address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer p2p읞터페읎슀;
p2pInterfaces = address.Assign(p2pDevices);

쉜게 꺌낌 수 있도록 생성된 읞터페읎슀륌 컚테읎너에 저장합니닀.
나쀑에 응용 프로귞랚을 섀정하는 데 사용할 정볎륌 죌소 지정합니닀.

읎제 CSMA 장치 읞터페읎슀에 IP 죌소륌 할당핎알 합니닀. 작업읎 작동합니닀.
point-to-point의 겜우와 마찬가지로 지ꞈ은
가변 개수의 CSMA 장치가 있는 컚테읎너 ---
명령쀄 읞수로 CSMA 장치륌 변겜할 수 있습니닀. CSMA 장치가 연결됩니닀.
읎 겜우 아래와 같읎 넀튞워크 번혞 10.1.2.0의 IP 죌소륌 사용합니닀.

address.SetBase("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer csmaInterfaces;
csmaInterfaces = 죌소.할당(csmaDevices);

읎제 토폎로지가 구축되었지만 애플늬쌀읎션읎 필요합니닀. 읎 섹션은
Ʞ볞적윌로 애플늬쌀읎션 섹션곌 유사합니닀. 첫 번짞.cc 하지만 우늬는
CSMA 장치와 큎띌읎얞튞가 있는 녾드 쀑 하나에서 서버륌 읞슀턎슀화합니닀.
점대점 장치만 있는 녾드.

뚌저 에윔 서버륌 섀정합니닀. 우늬는 UdpEchoServer도우믞 귞늬고 필수 제공
속성 서버 포튞 번혞읞 생성자에 대한 값입니닀. 읎 포튞륌 Ʞ억하십시였.
륌 사용하여 나쀑에 변겜할 수 있습니닀. 속성 섀정 원하는 겜우 방법읎지만
생성자에게 제공됩니닀.

UdpEchoServerHelper echoServer(9);

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

늬윜 csma녾드 녞드컚테읎너 위핎 생성된 녾드 쀑 하나륌 포핚합니닀.
점대점 넀튞워크 및 nCsma "추가" 녾드. 우늬가 얻고자 하는 것은 마지막
"추가" 녾드. XNUMX번짞 항목 csma녾드 컚테읎너는 지점 간
마디. 읎륌 쉜게 생각하는 방법은 하나의 "추가" CSMA 녞드륌 생성하멎
닀음 쀑 하나의 읞덱슀에 있을 것입니닀. csma녾드 컚테읎너. 유도에 의핎, 우늬가 만듀멎 nCsma "추가의"
마지막 녾드는 읞덱슀에 있을 녾드 nCsma. 에 전시된 것을 볌 수 있습니닀. 돈을 받아가섞요 첫 번짞의
윔드 쀄.

큎띌읎얞튞 애플늬쌀읎션은 첫 번짞.cc 예제 슀크늜튞. 닀시,
우늬는 필수륌 제공합니닀 Attributes 부터 UdpEchoClient도우믞 생성자에서(읎 겜우
원격 죌소 및 포튞). 우늬는 큎띌읎얞튞에게 서버로 팚킷을 볎낎띌고 지시합니닀.
마지막 "추가" CSMA 녞드에 섀치됩니닀. 가장 왌쪜에 큎띌읎얞튞륌 섀치합니닀.
토폎로지 귞늌에 표시된 점대점 녾드.

UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
echoClient.SetAttribute("MaxPackets", UintegerValue (1));
echoClient.SetAttribute("간격", TimeValue(쎈(1.0)));
echoClient.SetAttribute("PacketSize", UintegerValue(1024));

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

싀제로 여Ʞ에 읞터넀튞워크륌 구축했Ʞ 때묞에 ì–Žë–€ 형태의 읞터넀튞워크가 필요합니닀.
띌우팅. NS-3 귀하륌 돕Ʞ 위핎 우늬가 Ꞁ로벌 띌우팅읎띌고 부륎는 것을 제공합니닀. Ꞁ로벌 띌우팅 테읎크
시뮬레읎션에서 전첎 읞터넀튞워크에 액섞슀할 수 있닀는 사싀의 읎점곌
시뮬레읎션을 위핎 생성된 몚든 녞드륌 통핎 싀행 --- 얎렀욎 작업을 수행합니닀.
띌우터륌 구성하지 않고도 띌우팅을 섀정할 수 있습니닀.

Ʞ볞적윌로 발생하는 음은 각 녞드가 OSPF 띌우터읞 것처럌 동작하여 닀음을 수행하는 것입니닀.
묎대 뒀의 닀륞 몚든 띌우터와 슉각적읎고 마술처럌 통신합니닀. 각 녾드
링크 ꎑ고륌 생성하고 읎륌 Ꞁ로벌 겜로 ꎀ늬자에게 직접 전달합니닀.
읎 전역 정볎륌 사용하여 각 녞드에 대한 띌우팅 테읎랔을 구성합니닀. 환겜
읎 형식의 띌우팅은 한 쀄짜늬입니닀.

Ipv4GlobalRoutingHelper::PopulateRoutingTables();

닀음윌로 pcap 추적을 활성화합니닀. pcap 추적을 활성화하는 첫 번짞 윔드 쀄은
point-to-point 도우믞는 읎제 익숙할 것입니닀. 두 번짞 쀄은 pcap을 활성화합니닀.
CSMA 헬퍌에서 추적하고 아직 만나지 못한 추가 맀개변수가 있습니닀.

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

CSMA 넀튞워크는 닀지점 간 넀튞워크입니닀. 읎것은 할 수 있음을 의믞합니닀.
읎 겜우) 공유 맀첎의 여러 끝점. 읎러한 각 끝점에는 넀튞워크가 있습니닀.
귞것곌 ꎀ렚된 장치. 추적 수집에 대한 두 가지 Ʞ볞 대안읎 있습니닀.
귞러한 넀튞워크의 정볎. 한 가지 방법은 각 넀튞 장치에 대한 추적 파음을 만드는 것입니닀.
핎당 넀튞 장치에서 낎볎낎거나 소비하는 팚킷만 저장합니닀. 또 닀륞 방법
장치 쀑 하나륌 선택하여 묎찚별 몚드로 섀정하는 것입니닀. 귞러멎 ê·ž 닚음 장치
몚든 팚킷에 대핮 넀튞워크륌 "슀니핑"하고 닚음 pcap 파음에 저장합니닀. 읎것읎 방법입니닀
TCP 덀프, 예륌 듀얎 작동합니닀. 읎 마지막 맀개변수는 CSMA 헬퍌에게 닀음 여부륌 알렀쀍니닀.
묎찚별 몚드에서 팚킷을 캡처하도록 조정합니닀.

읎 예에서는 CSMA 넀튞워크에 있는 장치 쀑 하나륌 선택하고 묌얎볌 것입니닀.
넀튞워크의 난잡한 슀니핑을 수행하여 묎엇을 에뮬레읎션합니닀. TCP 덀프 할것읎닀.
Linux 시슀템을 사용 쀑읎띌멎 닀음곌 같읎 할 수 있습니닀. TCP 덀프 -i eth0 ~을 얻Ʞ 위핎
추적하닀. 읎 겜우 닀음을 사용하여 장치륌 지정합니닀. csmaDevices.Get(1), 선택하는
컚테읎너의 첫 번짞 장치. 마지막 맀개변수륌 true로 섀정하멎 묎찚별
캡처.

윔드의 마지막 섹션은 닀음곌 같읎 시뮬레읎션을 싀행하고 정늬합니닀. 첫 번짞.cc
예.

시뮬레읎터::싀행();
시뮬레읎터::파ꎎ();
0가 돌아;
}

읎 예제륌 싀행하렀멎 쎈.cc 슀크래치 디렉토늬에 예제 슀크늜튞
waf륌 사용하여 첫 번짞.cc 예. 당신읎에있는 겜우
방ꞈ 입력한 저장소의 최상위 디렉토늬,

$ cp 예제/튜토늬얌/second.cc 슀크래치/mysecond.cc
$ ./와프

겜고: 우늬는 파음을 사용합니닀 쎈.cc 작동하는지 확읞하Ʞ 위한 회귀 테슀튞 쀑 하나로
튜토늬얌 겜험을 Ɥ정적윌로 만듀Ʞ 위핎 우늬가 생각하는 것곌 정확히 음치합니닀.
읎것은 읎늄읎 지정된 싀행 파음을 의믞합니닀. 쎈 프로젝튞에 읎믞 졎재합니닀. 플하렀멎
당신읎 싀행하고 있는 것에 대핮 혌란읎 있닀멎, 닀음윌로 읎늄을 바꟞십시였. mysecond.cc 추천
위.

당신읎 튜토늬얌을 종교적윌로 따륎고 있닀멎(당신은 귞렇지 않습니까) 여전히 당신은
NS_LOG 변수가 섀정되었윌므로 핎당 변수륌 지우고 프로귞랚을 싀행하십시였.

$ 낎볎낎Ʞ NS_LOG=
$ ./waf --슀크래치/mysecond 싀행

UDP 에윔 애플늬쌀읎션을 섀정한 읎후로 첫 번짞.cc, 귞럎거알
슀크늜튞륌 싀행할 때 유사한 출력읎 표시됩니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.415쎈).
1024바읎튞륌 10.1.2.4로 볎냈습니닀.
1024에서 10.1.1.1바읎튞 수신됚
1024에서 10.1.2.4바읎튞 수신됚

첫 번짞 메시지읞 "볎낞 1024 바읎튞 에 10.1.2.4,"는 UDP 에윔 큎띌읎얞튞입니닀.
팚킷을 서버로 볎냅니닀. 읎 겜우 서버는 닀륞 넀튞워크에 있습니닀.
(10.1.2.0). 두 번짞 메시지, "수상 1024 바읎튞 에 10.1.1.1,"는 UDP 에윔에서 가젞옚 것입니닀.
에윔 팚킷을 수신할 때 생성되는 서버. 마지막 메시지 "수상 1024
바읎튞 에 10.1.2.4,"는 에윔 큎띌읎얞튞에서 왔윌며 에윔륌 수신했음을 나타냅니닀.
닀시 서버에서.

읎제 최상위 디렉토늬로 읎동하여 볎멎 ì„ž 개의 추적 파음읎 있습니닀.

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

잠시 읎 파음의 읎늄을 삎펎볎겠습니닀. 몚두 같은 형태륌 가지고 있윌며,
- - .pcap. 예륌 듀얎 목록의 첫 번짞 파음은
쎈-0-0.pcap 읎는 녾드 XNUMX, 장치 XNUMX의 pcap 추적입니닀. 읎것읎
녾드 XNUMX의 점대점 넀튞 장치. 파음 쎈-1-0.pcap 에 대한 pcap 추적입니닀.
녾드 XNUMX의 장치 XNUMX, 또한 점대점 넀튞 장치; 귞늬고 파음 쎈-2-0.pcap is
녾드 XNUMX의 장치 XNUMX에 대한 pcap 추적.

섹션 시작 부분의 토폎로지 귞늌을 닀시 찞조하멎
핎당 녾드 XNUMX은 점대점 링크의 가장 왌쪜 녞드읎고 녾드 XNUMX은 녞드입니닀.
점대점 장치와 CSMA 장치륌 몚두 가지고 있습니닀. 녾드 XNUMX가
CSMA 넀튞워크의 첫 번짞 "추가" 녞드와 핎당 장치 XNUMX읎 장치로 선택되었습니닀.
묎찚별 몚드 추적을 캡처합니닀.

읎제 읞터넀튞워크륌 통핎 에윔 팚킷을 따띌가 뎅시닀. 뚌저 닀음의 tcpdump륌 수행합니닀.
가장 왌쪜 지점 간 녞드에 대한 추적 파음 --- 녾드 XNUMX.

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

pcap 파음의 낎용읎 표시되얎알 합니닀.

파음 second-0-0.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024
2.017607 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

덀프의 첫 번짞 띌읞은 링크 유형읎 PPP(point-to-point)임을 나타냅니닀.
예상하닀. 귞런 닀음 IP와 연결된 장치륌 통핎 녾드 XNUMX을 떠나는 에윔 팚킷을 볌 수 있습니닀.
죌소 10.1.1.1은 IP 죌소 10.1.2.4(가장 였륞쪜 CSMA 녾드)로 향합니닀. 읎 팚킷
포읞튞-투-포읞튞 링크륌 통핎 읎동하고 포읞튞-투-포읞튞 넀튞 장치에 의핎 수신됩니닀.
녾드 XNUMX. 한 번 볎자:

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

읎제 지점 간 링크의 닀륞 쪜의 pcap 추적 출력읎 표시되얎알 합니닀.

파음 second-1-0.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
2.003686 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024
2.013921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

여Ʞ에서 링크 유형도 예상한 대로 PPP임을 알 수 있습니닀. IP에서 팚킷읎 볎입니닀.
IP 죌소 10.1.1.1로 향하는 죌소 2.000000(10.1.2.4쎈에 전송됚)
읎 읞터페읎슀에 나타납니닀. 읎제 낎부적윌로 읎 녞드로 팚킷읎 전달됩니닀.
CSMA 읞터페읎슀와 우늬는 궁극적윌로 향하는 핎당 장치에서 튀얎나였는 것을 볌 수 있습니닀.
목적지.

우늬는 CSMA 넀튞워크에 대한 난잡한 슀니퍌 녞드로 녾드 2륌 선택했음을 Ʞ억하십시였.
귞런 닀음 second-2-0.pcap을 삎펎볎고 있는지 확읞합니닀.

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

읎제 녾드 XNUMX의 묎찚별 덀프읞 장치 XNUMX읎 표시되얎알 합니닀.

파음 second-2-0.pcap에서 읜Ʞ, 링크 유형 EN10MB(읎더넷)
2.007698 ARP, Request who-has 10.1.2.4 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1, Ꞟ읎 50
2.007710 ARP, 응답 10.1.2.4는 00:00:00:00:00:06, Ꞟ읎 50입니닀.
2.007803 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024
2.013815 ARP, Request who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.4, Ꞟ읎 50
2.013828 ARP, 응답 10.1.2.1는 00:00:00:00:00:03, Ꞟ읎 50입니닀.
2.013921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

볎시닀시플 링크 유형은 읎제 "읎더넷"입니닀. 귞런데 새로욎 것읎 나타났습니닀. 귞만큌
버슀 넀튞워크 필요 ARP, 죌소 확읞 프로토윜. 녾드 XNUMX은 전송핎알 핚을 알고 있습니닀.
팚킷을 IP 죌소 10.1.2.4로 볎낎지만 MAC 죌소륌 알지 못합니닀.
핎당 녾드. CSMA 넀튞워크(ff:ff:ff:ff:ff:ff)에서 람로드캐슀튞하여
IP 죌소가 10.1.2.4읞 장치. 읎 겜우 가장 였륞쪜 녾드는 닀음곌 같읎 응답합니닀.
MAC 죌소 00:00:00:00:00:06에 있습니닀. 녾드 XNUMX는 읎 작업에 직접 ꎀ여하지 않습니닀.
교환하지만 넀튞워크륌 슀니핑하고 표시되는 몚든 튞래픜을 볎고합니닀.

읎 교환은 닀음 쀄에서 볌 수 있습니닀.

2.007698 ARP, Request who-has 10.1.2.4 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1, Ꞟ읎 50
2.007710 ARP, 응답 10.1.2.4는 00:00:00:00:00:06, Ꞟ읎 50입니닀.

귞런 닀음 녾드 XNUMX, 장치 XNUMX읎 진행되얎 UDP 에윔 서버에 에윔 팚킷을 볎냅니닀.
IP 죌소 10.1.2.4.

2.007803 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024

서버는 에윔 요청을 수신하고 팚킷을 돌렀 볎낎렀고 시도합니닀.
출처. 서버는 읎 죌소가 닀음을 통핎 도달하는 닀륞 넀튞워크에 있음을 알고 있습니닀.
IP 죌소 10.1.2.1. 읎것은 우늬가 Ꞁ로벌 띌우팅을 쎈Ʞ화했고 몚든 것을 파악했Ʞ 때묞입니닀.
우늬륌 위핎 읎것의 밖윌로. 귞러나 에윔 서버 녾드는 첫 번짞 MAC 죌소륌 알지 못합니닀.
CSMA 녞드읎므로 첫 번짞 CSMA 녞드가 수행핎알 했던 것처럌 ARP륌 수행핎알 합니닀.

2.013815 ARP, Request who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.4, Ꞟ읎 50
2.013828 ARP, 응답 10.1.2.1는 00:00:00:00:00:03, Ꞟ읎 50입니닀.

귞런 닀음 서버는 에윔륌 전달 녞드로 닀시 볎냅니닀.

2.013921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

point-to-point 링크의 가장 였륞쪜 녞드륌 되돌아볎멎,

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

읎제 에윔된 팚킷읎 마지막윌로 점대점 링크로 되돌아였는 것을 볌 수 있습니닀.
추적 덀프 띌읞.

파음 second-1-0.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
2.003686 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024
2.013921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

마지막윌로 에윔륌 시작한 녞드륌 닀시 볌 수 있습니닀.

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

에윔된 팚킷읎 2.007602쎈에 소슀에 닀시 도착하는지 확읞합니닀.

파음 second-0-0.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024
2.017607 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

마지막윌로 CSMA 장치의 수륌 제얎하는 ​​Ʞ능을 추가한 것을 Ʞ억하십시였.
명령쀄 읞수로 시뮬레읎션합니닀. 읎 읞수는 닀음곌 같은 방식윌로 변겜할 수 있습니닀.
우늬는 에윔된 팚킷의 수륌 변겜하는 것을 볎았습니닀 첫 번짞.cc 예. 싀행핎 볎섞요
"추가" 장치 수가 XNUMX개로 섀정된 프로귞랚:

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

읎제 확읞핎알 합니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.405쎈).
시간에 2s 큎띌읎얞튞는 1024 바읎튞륌 10.1.2.5 포튞 9로 볎냈습니닀.
시간 2.0118쎈에 서버는 1024 포튞 10.1.1.1에서 49153바읎튞륌 수신했습니닀.
2.0118쎈에 서버가 1024바읎튞륌 10.1.1.1 포튞 49153윌로 볎냈습니닀.
시간 2.02461쎈에 큎띌읎얞튞가 1024 포튞 10.1.2.5에서 9바읎튞륌 수신했습니닀.

읎제 에윔 서버가 마지막 CSMA 녞드로 재배치되었습니닀.
10.1.2.5 Ʞ볞 쌀읎슀 대신 10.1.2.4.

방ꎀ자가 생성한 추적 파음에 만족하지 않을 수 있습니닀.
CSMA 넀튞워크. 닚음 장치에서 추적을 얻고 싶을 수도 있지만 귞렇지 않을 수도 있습니닀.
넀튞워크의 닀륞 튞래픜에 ꎀ심을 가젞알 합니닀. 당신은 읎것을 상당히 쉜게 할 수 있습니닀.

삎펎 볎겠습니닀. 슀크래치/mysecond.cc ê·ž 윔드륌 추가하멎 우늬가 더 많은 것을 할 수 있습니닀.
특정. NS-3 도우믞는 녾드 번혞와 장치 번혞륌 닀음곌 같읎 사용하는 메서드륌 제공합니닀.
맀개변수. 계속핎서 교첎하십시였. Pcap 활성화 아래 전화로 전화하십시였.

pointToPoint.EnablePcap("쎈", p2pNodes.Get(0)->GetId(), 0);
csma.EnablePcap("쎈", csmaNodes.Get(nCsma)->GetId(), 0, false);
csma.EnablePcap("쎈", csmaNodes.Get(nCsma-1)->GetId(), 0, false);

우늬는 Ʞ볞 읎늄읎 "second"읞 pcap 파음을 만듀고 싶닀는 것을 알고 있윌며 또한 알고 있습니닀.
두 겜우 몚두 ꎀ심 있는 장치가 XNUMX읎 될 것읎므로 핎당 맀개변수는
정말 흥믞로욎.

녾드 번혞륌 얻윌렀멎 두 가지 선택읎 있습니닀. 첫짞, 녾드는
만든 순서대로 XNUMX부터 시작하여 닚조롭게 슝가하는 팚션
귞듀을. 녾드 번혞륌 얻는 한 가지 방법은 읎 번혞륌 "수동윌로" 파악하는 것입니닀.
녾드 생성 순서륌 고렀합니닀. 넀튞워크 토폎로지륌 삎펎볎멎
파음의 시작 부분에 있는 귞늌, 우늬는 당신을 위핎 읎것을했고 당신은 볌 수 있습니닀
마지막 CSMA 녾드는 녾드 번혞가 됩니닀. nCsma + 1. 읎 ì ‘ê·Œ 방식은 짜슝나게 될 수 있습니닀.
더 큰 시뮬레읎션에서는 얎렵습니닀.

여Ʞ서 우늬가 사용하는 또 닀륞 방법은 녾드 컚테읎너 포핚하는
포읞터 NS-3 녾드 사묌. 귞만큌 녾드 개첎에는 닀음곌 같은 메서드가 있습니닀. ID 가젞였Ʞ 얎느 것
우늬가 찟는 녾드 번혞읞 핎당 녞드의 ID륌 반환합니닀. 륌 볎러 가자
독시젠을 위한 녾드 더 아래에 있는 핎당 메서드륌 찟습니닀. NS-3 핵심 윔드
우늬가 지ꞈ까지 볞 것볎닀; 귞러나 때로는 유용한 것을 부지런히 ì°Ÿì•„ì•Œ 합니닀.

늎늬슀에 대한 Doxygen 묞서로 읎동합니닀(Doxygen 묞서에서 찟을 수 있음을 Ʞ억하십시였.
프로젝튞 웹 사읎튞). 당신은에 도착할 수 있습니닀 녾드 륌 통핎 묞서화
"Classes" 탭에서 찟을 때까지 "Class List" 아래로 슀크례 ns3::녾드. 선택
ns3::녾드 에 대한 묞서로 읎동합니닀. 녾드 수업. 만앜 당신읎 지ꞈ
아래로 슀크례 ID 가젞였Ʞ 방법을 선택하여 상섞페읎지로 읎동합니닀.
방법에 대한 묞서. 사용하여 ID 가젞였Ʞ 방법은 녾드 번혞륌 결정할 수 있습니닀.
복잡한 토폎로지에서 훚씬 쉜습니닀.

혌란을 플하Ʞ 위핎 최상위 디렉토늬에서 읎전 추적 파음을 지우십시였.
묎슚 음읎알,

$ rm *.pcap
$ rm *.tr

새 슀크늜튞륌 빌드하고 시뮬레읎션 섀정을 싀행하멎 nCsma 100에,

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

닀음 출력읎 표시됩니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.407쎈).
시간에 2s 큎띌읎얞튞는 1024 바읎튞륌 10.1.2.101 포튞 9로 볎냈습니닀.
시간 2.0068쎈에 서버는 1024 포튞 10.1.1.1에서 49153바읎튞륌 수신했습니닀.
2.0068쎈에 서버가 1024바읎튞륌 10.1.1.1 포튞 49153윌로 볎냈습니닀.
시간 2.01761쎈에 큎띌읎얞튞가 1024 포튞 10.1.2.101에서 9바읎튞륌 수신했습니닀.

에윔 서버는 읎제 10.1.2.101개에 핎당하는 100에 있습니닀.
마지막 녞드에 에윔 서버가 있는 "추가" CSMA 녾드. pcap 파음을 나엎하멎
표시되는 최상위 디렉토늬,

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

추적 파음 쎈-0-0.pcap 에윔읞 "가장 왌쪜" 지점간 장치입니닀.
팚킷 소슀. 파음 쎈-101-0.pcap 가장 였륞쪜 CSMA 장치에 핎당합니닀.
에윔 서버가 상죌하는 곳입니닀. 의 마지막 맀개변수가
에윔 서버 녞드에서 pcap 추적을 활성화하Ʞ 위한 혞출읎 거짓읎었습니닀. 읎는 추적을 의믞합니닀.
핎당 녞드에 몚읞 녾드는 묎찚별 몚드가 아닙니닀.

난잡한 추적곌 귞렇지 않은 추적의 찚읎점을 섀명하Ʞ 위핎 우늬는 또한
마지막에서 닀음 녞드에 대한 묎찚별 추적을 요청했습니닀. 계속핎서 삎펎볎십시였.
전에, TCP 덀프 for 쎈-100-0.pcap.

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

읎제 녾드 100읎 에윔 교환의 방ꎀ자임을 알 수 있습니닀. 유음한
수신하는 팚킷은 전첎 CSMA에 람로드캐슀튞되는 ARP 요청입니닀.
넀튞워크.

파음 second-100-0.pcap에서 읜Ʞ, 링크 유형 EN10MB(읎더넷)
2.006698 ARP, Request who-has 10.1.2.101 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1, Ꞟ읎 50
2.013815 ARP, Request who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.101, Ꞟ읎 50

읎제 TCP 덀프 for 쎈-101-0.pcap.

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

읎제 녾드 101읎 싀제로 에윔 교환의 찞가자임을 알 수 있습니닀.

파음 second-101-0.pcap에서 읜Ʞ, 링크 유형 EN10MB(읎더넷)
2.006698 ARP, Request who-has 10.1.2.101 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1, Ꞟ읎 50
2.006698 ARP, 응답 10.1.2.101는 00:00:00:00:00:67, Ꞟ읎 50입니닀.
2.006803 IP 10.1.1.1.49153 > 10.1.2.101.9: UDP, Ꞟ읎 1024
2.013803 ARP, Request who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.101, Ꞟ읎 50
2.013828 ARP, 응답 10.1.2.1는 00:00:00:00:00:03, Ꞟ읎 50입니닀.
2.013828 IP 10.1.2.101.9 > 10.1.1.1.49153: UDP, Ꞟ읎 1024

몚형, Attributes and 현싀
읎것은 작은 여행을 하고 쀑요한 포읞튞륌 만듀Ʞ에 펞늬한 장소입니닀. 할 수 있습니닀
또는 명확하지 않을 수 있지만 시뮬레읎션을 사용할 때마닀 닀음을 수행하는 것읎 쀑요합니닀.
몚덞링되는 것곌 귞렇지 않은 것을 정확히 읎핎합니닀. 예륌 듀얎 닀음곌 같은 유혹읎 있습니닀.
읎전 섹션에서 사용된 CSMA 장치 및 채널을 싀제읞 것처럌 생각하십시였.
읎더넷 장치; 발생할 음을 직접 반영하는 시뮬레읎션 결곌륌 Ʞ대합니닀.
싀제 읎더넷에서. 귞렇지 ì•Šë‹€.

몚덞은 정의상 현싀의 추상화입니닀. ê²°êµ­ 책임읎닀
소위 "정확도 범위" 및 "도메읞"을 결정하Ʞ 위한 시뮬레읎션 슀크늜튞 작성자의
전첎로서의 시뮬레읎션의 "적용 가능성", 따띌서 ê·ž 구성 부분.

겜우에 따띌 씚에슀마, 묎엇읞지 결정하는 것은 상당히 쉜습니닀. 지원 몚덞. 에 의핎
몚덞 섀명 읜Ʞ(csma.h) 충돌 감지가 없음을 알 수 있습니닀.
시뮬레읎션에서 CSMA 몚덞의 사용읎 얌마나 적용 가능한지 결정합니닀.
결곌에 포핚할 수 있는 죌의 사항. 닀륞 겜우에는 맀우 쉬욞 수 있습니닀.
나가서 구맀할 수 있는 현싀곌 음치하지 않을 수 있는 행동을 구성합니닀. 귞것
몇 가지 귞러한 사례륌 조사하는 데 시간을 할애할 가치가 있음을 슝명할 것입니닀.
시뮬레읎션에서 현싀의 범위륌 쉜게 ë²—ì–Žë‚  수 있습니닀.

볎시닀시플 NS-3 제공 Attributes 사용자가 쉜게 몚덞 변겜을 섀정할 수 있는
행동. 닀음 두 가지륌 고렀하십시였. Attributes 의 CsmaNet장치: 음투 and
캡슐화 몚드. 귞만큌 음투 속성은 최대 전송 닚위륌 나타냅니닀.
장치. 읎것은 장치가 사용할 수 있는 가장 큰 PDU(Protocol Data Unit)의 크Ʞ입니닀.
볎낎닀.

MTU는 Ʞ볞적윌로 1500바읎튞입니닀. CsmaNet장치. 읎 Ʞ볞값은 숫자에 핎당합니닀.
RFC 894, "A Standard for the Transmission of IP Datagrams over Ethernet
넀튞워크." 숫자는 싀제로 10Base5의 최대 팚킷 크Ʞ에서 파생됩니닀.
(전첎 사양 읎더넷) 넀튞워크 -- 1518바읎튞. DIX 캡슐화륌 빌멎
읎더넷 팚킷(18바읎튞)에 대한 였버헀드는 가능한 최대 데읎터 크Ʞ로 끝납니닀.
(MTU) 1500바읎튞. 하나는 또한 찟을 수 있습니닀 MTU IEEE 802.3 넀튞워크의 겜우 1492
바읎튞. 읎는 LLC/SNAP 캡슐화가 XNUMX바읎튞의 추가 였버헀드륌 추가하Ʞ 때묞입니닀.
팚킷. 두 겜우 몚두 Ʞ볞 하드웚얎는 1518바읎튞만 볎낌 수 있지만 데읎터는
크Ʞ가 닀늅니닀.

캡슐화 몚드륌 섀정하Ʞ 위핎, CsmaNet장치 ~을 제공하닀 속성 띌는
캡슐화 몚드 가치륌 가질 수 있는 딕슀 or LLC. 읎듀은 읎더넷에 핎당합니닀.
및 LLC/SNAP 프레읎밍.

한 사람읎 떠나멎 음투 1500바읎튞에서 캡슐화 몚드륌 닀음윌로 변겜합니닀. LLC, 결곌
LLC/SNAP 프레읎밍윌로 1500바읎튞 PDU륌 캡슐화하는 넀튞워크가 될 것입니닀.
1526바읎튞의 팚킷을 전송할 수 있Ʞ 때묞에 많은 넀튞워크에서 불법입니닀.
팚킷당 최대 1518바읎튞. 읎것은 아마도 닀음곌 같은 시뮬레읎션을 쎈래할 것입니닀.
당신읎 Ʞ대하는 현싀을 믞묘하게 반영하지 않습니닀.

귞늌을 복잡하게 만듀Ʞ 위핎 점볎 프레임(1500 < MTU <= 9000 바읎튞)읎 있고
IEEE에서 공식적윌로 읞가하지 않았지만
음부 고속(Ʞ가비튞) 넀튞워크 및 NIC에서 사용할 수 있습니닀. 하나는 떠날 수
캡슐화 몚드가 닀음윌로 섀정됚 딕슀, 섀정 음투 속성 에 CsmaNet장치 ~ 64000바읎튞
-- ꎀ렚읎 있더띌도 Csma채널 데읎터 속도 쎈당 10메가비튞로 섀정되었습니닀. 읎것
Ʞ볞적윌로 1980년대 슀타음의 10Base5로 만든 읎더넷 슀위치륌 몚덞링합니닀.
슈퍌 점볎 데읎터귞랚을 지원하는 넀튞워크. 읎것은 확싀히 예전의 것읎 아니닀.
만듀얎지거나 만듀얎질 가능성읎 없지만 구성하Ʞ가 맀우 쉜습니닀.

읎전 예에서는 명령쀄을 사용하여 100개의 시뮬레읎션을 만듀었습니닀.
씚에슀마 녾드. 500개의 녞드로 시뮬레읎션을 쉜게 생성할 수 있습니닀. 만앜 너띌멎
싀제로 전첎 사양의 최대 Ꞟ읎읞 10Base5 뱀파읎얎 탭 넀튞워크륌 몚덞링하고 있었습니닀.
읎더넷 쌀읎랔은 500믞터읎며 최소 탭 간격은 2.5믞터입니닀. 슉 거Ʞ에
싀제 넀튞워크에서 200번만 탭할 수 있습니닀. 당신은 아죌 쉜게 불법을 만듀 수 있습니닀
넀튞워크도 마찬가지입니닀. 읎로 읞핎 의믞 있는 시뮬레읎션읎 발생할 수도 있고 귞렇지 않을 수도 있습니닀.
몚덞링하렀는 대상에 따띌 닀늅니닀.

유사한 상황읎 여러 곳에서 발생할 수 있습니닀. NS-3 귞늬고 몚든 시뮬레읎터에서. 예륌 듀얎,
녞드가 동음한 공간을 찚지하도록 녞드륌 배치할 수 있습니닀.
또는 표쀀을 위반하는 슝폭Ʞ 또는 잡음 수쀀을 구성할 수 있습니닀.
묌늬의 Ʞ볞 법칙.

NS-3 음반적윌로 유연성을 선혞하며 많은 몚덞에서 자유롭게 섀정할 수 있습니닀. Attributes
임의의 음ꎀ성읎나 특정 Ʞ볞 사양을 적용하지 않고.

읎것에서 집윌로 가젞갈 것은 NS-3 슈퍌 유연한 Ʞ반을 제공 할 것입니닀
싀험핎 볌 수 있습니닀. 시슀템에 요청하는 낎용을 읎핎하는 것은 사용자에게 달렀 있습니닀.
당신읎 만든 시뮬레읎션읎 ì–Žë–€ 의믞와 ì–Žë–€ 것을 가지고 있는지 확읞하Ʞ 위핎
당신읎 정의한 현싀곌의 연결.

걎묌 a Wireless 넀튞워크 토폎로지
읎 섹션에서는 닀음에 대한 지식을 더욱 확장할 것입니닀. NS-3 넀튞워크 장치 및
묎선 넀튞워크의 예륌 닀룚는 채널. NS-3 802.11 몚덞 섞튞 제공
802.11 사양의 정확한 MAC 수쀀 구현을 제공하렀는 시도
802.11a 사양의 "귞렇게 느늬지 않은" PHY 수쀀 몚덞.

점대점 및 CSMA 토폎로지 도우믞 개첎륌 몚두 볞 것처럌
point-to-point 토폎로지 구성, 우늬는 동등한 것을 볎게 될 것입니닀. 묎선 랜 토폎로지 도우믞
읎 구역. 읎러한 도우믞의 몚양곌 작동은 맀우 친숙하게 볎음 것입니닀.
너.

우늬는 우늬의 예제 슀크늜튞륌 제공합니닀 예제/튜토늬얌 예배 규칙서. 읎 슀크늜튞는
전에, 쎈.cc 슀크늜튞륌 작성하고 Wi-Fi 넀튞워크륌 추가합니닀. 계속핎서 ì—Žêž°
예제/튜토늬얌/third.cc 좋아하는 펞집Ʞ에서. 당신은 읎믞 충분히 볎았을 것입니닀
NS-3 읎 예제에서 진행되는 대부분의 작업을 읎핎하Ʞ 위한 윔드읎지만 몇 가지 새로욎
전첎 슀크늜튞륌 검토하고 음부 출력을 검사합니닀.

에서와 같읎 쎈.cc 예(귞늬고 몚두 NS-3 예) 파음은 emacs로 시작합니닀.
몚드 띌읞곌 음부 GPL 상용구.

Ʞ볞 넀튞워크 토폎로지륌 볎여죌는 ASCII 아튞(아래에 재현됚)륌 삎펎볎십시였.
예제에서 구성했습니닀. 예제륌 더 확장할 것임을 알 수 있습니닀.
묎선 넀튞워크륌 왌쪜에 걞멎 됩니닀. 읎것은 Ʞ볞 넀튞워크입니닀.
유선 및 묎선에서 생성된 녾드 수륌 싀제로 변겜할 수 있윌므로 토폎로지
넀튞워크. 에서와 같읎 쎈.cc 슀크늜튞 쌀읎슀, 변겜하는 겜우 nCsma, 귞것은 당신에게 쀄 것입니닀
"추가" CSMA 녞드의 수. 마찬가지로 섀정할 수 있습니닀. n와읎파읎 얌마나 많은지 제얎하Ʞ 위핎 STA
(슀테읎션) 녞드가 시뮬레읎션에 생성됩니닀. 항상 하나있을 것입니닀 AP (액섞슀 포읞튞)
묎선 넀튞워크의 녾드. Ʞ볞적윌로 XNUMX개의 "추가" CSMA 녞드와 XNUMX개의 "추가" CSMA 녞드가 있습니닀.
묎선 전화 STA 녾드.

윔드는 몚듈 포핚 파음을 로드하는 것윌로 시작합니닀. 쎈.cc 예.
Wi-Fi 몚듈 및 읎동성에 핎당하는 몇 가지 새로욎 Ʞ능읎 포핚되얎 있습니닀.
아래에서 녌의할 몚듈입니닀.

#include "ns3/core-module.h"
#include "ns3/point-to-point-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"

넀튞워크 토폎로지 귞늌은 닀음곌 같습니닀.

// Ʞ볞 넀튞워크 토폎로지
//
// 와읎파읎 10.1.3.0
// AP
// * * * *
// | | | | 10.1.1.0
// n5 n6 n7 n0 -------------- n1 n2 n3 n4
// 점대점 | | | |
// ================
// 랜 10.1.2.0

왌쪜에 있는 녞드에 새 넀튞워크 장치륌 추가하고 있음을 알 수 있습니닀.
묎선 넀튞워크의 액섞슀 포읞튞가 되는 지점 간 링크. 닀수의
묎선 STA 녞드가 생성되얎 왌쪜곌 같읎 새로욎 10.1.3.0 넀튞워크륌 채웁니닀.
귞늌의 ìž¡ë©Ž.

삜화가 끝난 후, NS-3 넀임슀페읎슀는 익숙한 로깅 구성 요소가 정의됩니닀.
지ꞈ쯀읎멎 몚두 익숙할 것입니닀.

넀임슀페읎슀 ns3 사용;

NS_LOG_COMPONENT_DEFINE("ThirdScriptExample");

메읞 프로귞랚은 닀음곌 같읎 시작됩니닀. 쎈.cc 몇 가지 명령쀄 맀개변수륌 추가하여
로깅 구성 요소륌 활성화 또는 비활성화하고 생성된 장치 수륌 변겜합니닀.

부욞 상섞 정볎 = ì°ž;
uint32_t nCsma = 3;
uint32_t nWifi = 3;

컀맚드띌읞 cmd;
cmd.AddValue ("nCsma", "\"extra\" CSMA 녾드/장치 수", nCsma);
cmd.AddValue ("nWifi", "wifi STA 장치 수", nWifi);
cmd.AddValue ("verbose", "찞음 겜우 로귞하도록 echo 응용 프로귞랚에 지시", verbose);

cmd.Parse(argc,argv);

if(상섞)
{
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}

앞의 몚든 예에서와 마찬가지로 닀음 닚계는 두 개의 녞드륌 만드는 것입니닀.
점대점 링크륌 통핎 연결하십시였.

NodeContainer p2pNodes;
p2pNodes.Create(2);

닀음윌로 였랜 친구륌 뎅니닀. 우늬는 포읞튞투포읞튞도우믞 ꎀ렚 섀정
디폮튾 값 Attributes 장치에 쎈당 XNUMX메가비튞 송신Ʞ륌 생성합니닀.
헬퍌와 헬퍌에 의핎 생성된 채널에 대한 XNUMX밀늬쎈 지연을 사용하여 생성됩니닀.
우늬는 ê·ž 전첎적윌로 녞드의 장치와 녾드 사읎의 채널.

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

NetDeviceContainer p2p장치;
p2pDevices = pointToPoint.Install(p2pNodes);

닀음윌로 닀륞 ì„ ì–ž 녞드컚테읎너 버슀의 음부가 될 녞드륌 유지하Ʞ 위핎
(CSMA) 넀튞워크.

NodeContainer csmaNodes;
csmaNodes.Add(p2pNodes.Get(1));
csmaNodes.만듀Ʞ(nCsma);

닀음 윔드 쀄 가젞옵니닀. 첫 번짞 녾드(읞덱슀가 XNUMX읞 겜우)
점대점 녾드 컚테읎너 및 CSMA륌 가젞올 녞드의 컚테읎너에 추가
장치. 묞제의 녾드는 점대점 장치와 CSMA로 끝납니닀.
장치. 귞런 닀음 나뚞지 CSMA륌 구성하는 여러 "추가" 녞드륌 만듭니닀.
넀튞워크.

귞런 닀음 CsmaHelper 귞늬고 귞것을 섀정 Attributes 읎전 예제에서 했던 것처럌.
우늬는 NetDevice컚테읎너 생성된 CSMA 넀튞 장치륌 추적한 닀음
섀치 선택한 녞드의 CSMA 장치.

CsmaHelper csma;
csma.SetChannelAttribute("DataRate", StringValue("100Mbps"));
csma.SetChannelAttribute("지연", TimeValue(NanoSeconds(6560)));

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

닀음윌로 Wi-Fi 넀튞워크의 음부가 될 녞드륌 생성합니닀. 우늬는
명령쀄 읞수에 지정된 대로 여러 "슀테읎션" 녞드륌 생성하고
지점 간 링크의 "가장 왌쪜" 녞드륌 녞드로 사용할 것입니닀.
액섞슀 포읞튞.

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

윔드의 닀음 비튞는 Wi-Fi 장치와 사읎의 상혞 연결 채널을 구성합니닀.
읎 와읎파읎 녾드. 뚌저 PHY 및 채널 도우믞륌 구성합니닀.

YansWifiChannelHelper 채널 = YansWifiChannelHelper::Default ();
YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();

닚순화륌 위핎 읎 윔드는 Ʞ볞 PHY 계잵 구성 및 채널 몚덞을 사용합니닀.
에 대한 API doxygen 묞서에 묞서화되얎 있습니닀.
YansWifiChannelHelper::Ʞ볞값 and YansWifiPhyHelper::Ʞ볞값 행동 양식. 음닚 읎러한 개첎
생성되멎 채널 객첎륌 생성하고 읎륌 PHY 계잵 객첎 ꎀ늬자에 연결합니닀.
에 의핎 생성된 몚든 PHY 레읎얎 객첎가 YansWifiPhyHelper 공유하닀
동음한 Ʞ볞 채널, 슉 동음한 묎선 맀첎륌 공유하고
통신 및 간섭:

phy.SetChannel(채널.만듀Ʞ());

PHY 도우믞가 구성되멎 MAC 계잵에 집쀑할 수 있습니닀. 여Ʞ서 우늬는 음을 선택합니닀
non-Qos MAC을 사용하므로 NqosWifiMacHelper 객첎륌 사용하여 MAC 맀개변수륌 섀정합니닀.

WifiHelper wifi = WifiHelper::Default ();
wifi.SetRemoteStationManager ("ns3::AarfWifiManager");

NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 원격 슀테읎션 ꎀ늬자 섀정 메서드는 도우믞에게 비윚 제얎 알고늬슘의 유형을 알렀쀍니닀.
사용. 여Ʞ서 도우믞에게 AARF 알고늬슘을 사용하도록 요청하고 있습니닀. --- 섞부 사항은 묌론,
Doxygen에서 사용할 수 있습니닀.

닀음윌로 MAC 유형, 슉 우늬가 원하는 읞프띌 넀튞워크의 SSID륌 구성합니닀.
슀테읎션읎 활성 프로빙을 수행하지 않도록 섀정하고 확읞합니닀.

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

읎 윔드는 뚌저 사용될 802.11 SSID(Service Set Identifier) ​​객첎륌 생성합니닀.
"Ssid"의 값을 섀정하렀멎 속성 MAC 계잵 구현의 특정
도우믞가 생성할 MAC 계잵의 종류는 닀음곌 같읎 지정됩니닀. 속성 의 졎재로
"ns3::StaWifiMac" 유형. 의 사용 NqosWifiMac도우믞 볎장합니닀
"Qos 지원됚" 속성 생성된 MAC 개첎에 대핮 false로 섀정됩니닀. 읎듀의 조합
두 가지 구성은 닀음에 생성되는 MAC 읞슀턎슀가 non-QoS non-AP가 됚을 의믞합니닀.
읞프띌 BSS(슉, AP가 있는 BSS)의 슀테읎션(STA). 마지막윌로,
"액티람프로빙" 속성 거짓윌로 섀정됩니닀. 읎는 프로람 요청읎
읎 도우믞가 만든 MAC에서 볎냅니닀.

MAC 및 PHY 몚두에서 몚든 슀테읎션별 맀개변수가 완전히 구성되멎
읎제 익숙한 레읎얎륌 혞출할 수 있습니닀. 섀치 읎듀의 Wi-Fi 장치륌 만드는 방법
슀테읎션:

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

몚든 STA 녞드에 대핮 Wi-Fi륌 구성했윌며 읎제 AP륌 구성핎알 합니닀.
(액섞슀 포읞튞) 녾드. Ʞ볞값을 변겜하여 읎 프로섞슀륌 시작합니닀. Attributes 의
NqosWifiMac도우믞 AP의 요구 사항을 반영합니닀.

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

읎 겜우 NqosWifiMac도우믞 "ns3::ApWifiMac"의 MAC 계잵을 생성할 것입니닀.
후자는 AP로 구성된 MAC 읞슀턎슀가 생성되얎알 핚을 지정하고
"QosSupported"륌 의믞하는 도우믞 유형 속성 false로 섀정핎알 핹 - 비활성화
생성된 AP에서 802.11e/WMM 슀타음 QoS 지원.

닀음 띌읞은 동음한 PHY 레벚 섞튞륌 공유하는 닚음 AP륌 생성합니닀. Attributes (귞늬고
채널) 슀테읎션윌로:

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

읎제 몚빌늬티 몚덞을 추가하겠습니닀. 우늬는 STA 녞드가 움직읎고 방황하Ʞ륌 원합니닀.
겜계 상자 낎부륌 둘러볎고 AP 녞드륌 정지 상태로 만듀고 싶습니닀. 우늬는
읎동성 도우믞 우늬가 읎것을 쉜게 할 수 있도록. 뚌저 읞슀턎슀화 읎동성 도우믞 대상
귞늬고 음부 섀정 Attributes "위치 할당자" Ʞ능을 제얎합니닀.

읎동성도우믞 읎동성;

mobility.SetPositionAllocator("ns3::GridPositionAllocator",
"MinX", DoubleValue(0.0),
"최소", DoubleValue(0.0),
"DeltaX", DoubleValue(5.0),
"DeltaY", DoubleValue(10.0),
"GridWidth", UintegerValue (3),
"레읎아웃 유형", StringValue("RowFirst"));

읎 윔드는 읎동 도우믞에게 XNUMX찚원 귞늬드륌 사용하여 처음에
STA 녾드. 수업을 위핎 Doxygen을 자유롭게 탐색하십시였. ns3::GridPositionAllocator 볌 수
정확히 묎슚 음읎 음얎나고 있는지.

쎈Ʞ 귞늬드에 녞드륌 배치했지만 읎제 읎동 방법을 알렀쀘알 합니닀.
우늬는 RandomWalk2d읎동성몚덞 녞드가 임의의 방향윌로 읎동합니닀.
겜계 상자 낎부의 임의 속도.

mobility.SetMobilityModel("ns3::RandomWalk2dMobilityModel",
"Bounds", RectangleValue(직사각형(-50, 50, -50, 50)));

우늬는 읎제 읎동성 도우믞 STA 녞드에 읎동성 몚덞을 섀치합니닀.

읎동성.섀치(wifiStaNodes);

시뮬레읎션 쀑에 액섞슀 포읞튞가 고정된 위치에 유지되Ʞ륌 원합니닀. 우늬
읎 녞드에 대한 읎동성 몚덞을
ns3::ConstantPositionMobilityModel:

mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
읎동성.섀치(wifiApNode);

읎제 녾드, 장치 및 채널읎 생성되었윌며 읎동성 몚덞읎 선택되었습니닀.
Wifi 녞드가 있지만 프로토윜 슀택읎 없습니닀. 우늬가 읎전에 많은 음을 한 것처럌
시간, 우늬는 읞터넷슀택헬퍌 읎러한 슀택을 섀치합니닀.

InternetStackHelper 슀택;
stack.Install(csmaNodes);
stack.Install(wifiApNode);
stack.Install(wifiStaNodes);

에서와 같읎 쎈.cc 예제 슀크늜튞에서 우늬는 IPv4AddressHelper 에
장치 읞터페읎슀에 IP 죌소륌 할당합니닀. 뚌저 넀튞워크 10.1.1.0을 사용하여 생성합니닀.
두 개의 지점 간 장치에 필요한 두 개의 죌소. 귞런 닀음 넀튞워크 10.1.2.0을 사용합니닀.
CSMA 넀튞워크에 죌소륌 할당한 닀음 넀튞워크 10.1.3.0에서 죌소륌 할당합니닀.
묎선 넀튞워크의 STA 장치와 AP 몚두에.

Ipv4AddressHelper 죌소;

address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer p2p읞터페읎슀;
p2pInterfaces = address.Assign(p2pDevices);

address.SetBase("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer csmaInterfaces;
csmaInterfaces = 죌소.할당(csmaDevices);

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

귞늌의 시작 부분에 있는 "가장 였륞쪜" 녞드에 에윔 서버륌 배치합니닀.
파음. 우늬는 전에 읎것을 했습니닀.

UdpEchoServerHelper echoServer(9);

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

귞늬고 에윔 큎띌읎얞튞륌 우늬가 생성한 마지막 STA 녞드에 놓고 서버륌 가늬킵니닀.
CSMA 넀튞워크. 읎전에도 유사한 작업을 볞 적읎 있습니닀.

UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
echoClient.SetAttribute("MaxPackets", UintegerValue (1));
echoClient.SetAttribute("간격", TimeValue(쎈(1.0)));
echoClient.SetAttribute("PacketSize", UintegerValue(1024));

ApplicationContainer 큎띌읎얞튞 앱 =
echoClient.Install(wifiStaNodes.Get(nWifi - 1));
clientApps.Start(쎈(2.0));
clientApps.Stop(쎈(10.0));

여Ʞ에서 읞터넀튞워크륌 구축했윌므로 닀음곌 같읎 읞터넀튞워크 띌우팅을 활성화핎알 합니닀.
우늬는에서했닀 쎈.cc 예제 슀크늜튞.

Ipv4GlobalRoutingHelper::PopulateRoutingTables();

음부 사용자륌 놀띌게 할 수 있는 한 가지는 방ꞈ 만든 시뮬레읎션읎
절대 "자연슀럜게" 멈추지 않습니닀. 묎선 액섞슀 포읞튞에 닀음을 요청했Ʞ 때묞입니닀.
비윘을 생성합니닀. 귞것은 비윘을 영원히 생성할 것읎고 읎것은 시뮬레읎터륌 생성할 것입니닀.
읎벀튞가 믞래에 묎Ʞ한윌로 예정되얎 있윌므로 시뮬레읎터에 쀑지하띌고 알렀알 합니닀.
비윘 생성 읎벀튞가 예정되얎 있더띌도. 닀음 윔드 쀄
비윘을 영원히 시뮬레읎튞하지 않고
볞질적윌로 묎한 룚프.

시뮬레읎터::정지(쎈(10.0));

우늬는 ì„ž 가지 넀튞워크륌 몚두 포ꎄ하Ʞ에 충분한 추적을 생성합니닀.

pointToPoint.EnablePcapAll("ì„ž 번짞");
phy.EnablePcap("제0", apDevices.Get(XNUMX));
csma.EnablePcap("제0", csmaDevices.Get(XNUMX), true);

읎 ì„ž 쀄의 윔드는 두 지점 간 녞드에서 pcap 추적을 시작합니닀.
백볞 역할을 하며 Wifi 넀튞워크에서 묎찚별(몚니터) 몚드 추적을 시작합니닀.
CSMA 넀튞워크에서 난잡한 추적을 시작합니닀. 읎것은 우늬가 몚든 것을 볌 수 있습니닀
최소 수의 추적 파음읎 있는 튞래픜.

마지막윌로 싀제로 시뮬레읎션을 싀행하고 정늬한 닀음 프로귞랚을 종료합니닀.

시뮬레읎터::싀행();
시뮬레읎터::파ꎎ();
0가 돌아;
}

읎 예제륌 싀행하렀멎 닀음을 복사핎알 합니닀. ì„ž 번짞.cc 예제 슀크늜튞륌
디렉터늬륌 슀크래치하고 Waf륌 사용하여 쎈.cc 예. 만앜 너띌멎
입력하렀는 저장소의 최상위 디렉토늬에 있습니닀.

$ cp 예제/튜토늬얌/third.cc 슀크래치/mythird.cc
$ ./와프
$ ./waf --슀크래치/mythird 싀행

닀시 말하지만, 우늬는 UDP 에윔 애플늬쌀읎션을 섀정했Ʞ 때묞에 쎈.cc
슀크늜튞륌 싀행하멎 비슷한 출력읎 표시됩니닀.

Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build' 디렉토늬륌 떠납니닀.
'빌드'가 성공적윌로 완료되었습니닀(0.407쎈).
시간에 2s 큎띌읎얞튞는 1024 바읎튞륌 10.1.2.4 포튞 9로 볎냈습니닀.
시간 2.01796쎈에 서버는 1024 포튞 10.1.3.3에서 49153바읎튞륌 수신했습니닀.
2.01796쎈에 서버가 1024바읎튞륌 10.1.3.3 포튞 49153윌로 볎냈습니닀.
시간 2.03364쎈에 큎띌읎얞튞가 1024 포튞 10.1.2.4에서 9바읎튞륌 수신했습니닀.

첫 번짞 메시지륌 Ʞ억하섞요. 볎낞 1024 바읎튞 에 10.1.2.4,"는 UDP 에윔 큎띌읎얞튞입니닀.
팚킷을 서버로 볎냅니닀. 읎 겜우 큎띌읎얞튞는 묎선 넀튞워크에 있습니닀.
(10.1.3.0). 두 번짞 메시지, "수상 1024 바읎튞 에 10.1.3.3,"는 UDP 에윔에서 가젞옚 것입니닀.
에윔 팚킷을 수신할 때 생성되는 서버. 마지막 메시지 "수상 1024
바읎튞 에 10.1.2.4,"는 에윔 큎띌읎얞튞에서 왔윌며 에윔륌 수신했음을 나타냅니닀.
닀시 서버에서.

읎제 최상위 디렉토늬로 읎동하여 볎멎 닀음에서 XNUMX개의 추적 파음을 찟을 수 있습니닀.
읎 시뮬레읎션은 녾드 XNUMX에서 XNUMX개, 녾드 XNUMX에서 XNUMX개입니닀.

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

"third-0-0.pcap" 파음은 녾드 XNUMX의 점대점 장치에 핎당합니닀.
"백볞"의 왌쪜. "third-1-0.pcap" 파음은 점대점에 핎당합니닀.
녾드 0의 장치 -- "백볞"의 였륞쪜. "third-1-XNUMX.pcap" 파음은
Wi-Fi 넀튞워크의 난잡한(몚니터 몚드) 추적 및 "third-1-1.pcap" 파음
CSMA 넀튞워크의 난잡한 추적읎 됩니닀. 검사륌 통핎 읎륌 확읞할 수 있습니까?
윔드?

에윔 큎띌읎얞튞가 Wi-Fi 넀튞워크에 있윌므로 ê±°êž°ì„œ 시작하겠습니닀. 닀음을 삎펎볎겠습니닀.
핎당 넀튞워크에서 캡처한 난잡한(몚니터 몚드) 추적.

$ tcpdump -nn -tt -r ì„ž 번짞-0-1.pcap

읎전에 여Ʞ에서 볞 적읎 없는 Wi-Fi처럌 볎읎는 윘텐잠가 표시되얎알 합니닀.

파음 third-0-1.pcap에서 읜Ʞ, 링크 유형 IEEE802_11(802.11)
0.000025 비윘(ns-3-ssid) [6.0* 9.0 12.0 18.0 24.0 36.0 48.0 54.0Mbit] IBSS
0.000308 연결 요청(ns-3-ssid) [6.0 9.0 12.0 18.0 24.0 36.0 48.0 54.0Mbit]
0.000324 Acknowledgment RA:00:00:00:00:00:08
0.000402 연결 응답 도움(0) :: 성공
0.000546 Acknowledgment RA:00:00:00:00:00:0a
0.000721 연결 요청(ns-3-ssid) [6.0 9.0 12.0 18.0 24.0 36.0 48.0 54.0Mbit]
0.000737 Acknowledgment RA:00:00:00:00:00:07
0.000824 연결 응답 도움(0) :: 성공
0.000968 Acknowledgment RA:00:00:00:00:00:0a
0.001134 연결 요청(ns-3-ssid) [6.0 9.0 12.0 18.0 24.0 36.0 48.0 54.0Mbit]
0.001150 Acknowledgment RA:00:00:00:00:00:09
0.001273 연결 응답 도움(0) :: 성공
0.001417 Acknowledgment RA:00:00:00:00:00:0a
0.102400 비윘(ns-3-ssid) [6.0* 9.0 12.0 18.0 24.0 36.0 48.0 54.0Mbit] IBSS
0.204800 비윘(ns-3-ssid) [6.0* 9.0 12.0 18.0 24.0 36.0 48.0 54.0Mbit] IBSS
0.307200 비윘(ns-3-ssid) [6.0* 9.0 12.0 18.0 24.0 36.0 48.0 54.0Mbit] IBSS

읎제 링크 유형읎 예상한 대로 802.11임을 알 수 있습니닀. 당신은 아마 할 수 있습니닀
묎슚 음읎 음얎나고 있는지 읎핎하고 여Ʞ에서 IP 에윔 요청 및 응답 팚킷을 찟습니닀.
추적하닀. 추적 덀프륌 완전히 구묞 분석하Ʞ 위한 연습윌로 낚겚둡니닀.

읎제 point-to-point 링크 우잡의 pcap 파음을 볎멎,

$ tcpdump -nn -tt -r ì„ž 번짞-0-0.pcap

닀시 말하지만, 익숙한 낎용읎 표시되얎알 합니닀.

파음 third-0-0.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
2.008151 IP 10.1.3.3.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024
2.026758 IP 10.1.2.4.9 > 10.1.3.3.49153: UDP, Ꞟ읎 1024

읎것은 왌쪜에서 였륞쪜윌로(Wifi에서 CSMA로) 갔닀가 닀시 돌아였는 에윔 팚킷입니닀.
점대점 링크.

읎제 point-to-point 링크 우잡의 pcap 파음을 볎멎,

$ tcpdump -nn -tt -r ì„ž 번짞-1-0.pcap

닀시 말하지만, 익숙한 낎용읎 표시되얎알 합니닀.

파음 third-1-0.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
2.011837 IP 10.1.3.3.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024
2.023072 IP 10.1.2.4.9 > 10.1.3.3.49153: UDP, Ꞟ읎 1024

읎것은 또한 왌쪜에서 였륞쪜윌로(Wifi에서 CSMA로) 갔닀가 닀시 되돌아였는 에윔 팚킷입니닀.
예상할 수 있는 앜간 닀륞 타읎밍윌로 지점 간 링크륌 통핎.

에윔 서버는 CSMA 넀튞워크에 있윌며 거Ʞ에서 난잡한 추적을 삎펎볎겠습니닀.

$ tcpdump -nn -tt -r ì„ž 번짞-1-1.pcap

닀음곌 같은 친숙한 낎용읎 표시됩니닀.

파음 third-1-1.pcap에서 읜Ʞ, 링크 유형 EN10MB(읎더넷)
2.017837 ARP, Request who-has 10.1.2.4 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1, Ꞟ읎 50
2.017861 ARP, 응답 10.1.2.4는 00:00:00:00:00:06, Ꞟ읎 50입니닀.
2.017861 IP 10.1.3.3.49153 > 10.1.2.4.9: UDP, Ꞟ읎 1024
2.022966 ARP, Request who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.4, Ꞟ읎 50
2.022966 ARP, 응답 10.1.2.1는 00:00:00:00:00:03, Ꞟ읎 50입니닀.
2.023072 IP 10.1.2.4.9 > 10.1.3.3.49153: UDP, Ꞟ읎 1024

읎것은 쉜게 읎핎되얎알 합니닀. 잊었닀멎 돌아가서 토론을 삎펎볎십시였.
in 쎈.cc. 읎것은 같은 순서입니닀.

읎제 우늬는 묎선 넀튞워크에 대한 읎동성 몚덞을 섀정하는 데 많은 시간을 할애했습니닀.
STA 녞드가 싀제로 움직읎고 있닀는 것을 볎여죌지 않고 끝낮는 것은 부끄러욎 음입니닀.
시뮬레읎션 동안 죌변. 에 연결하여 읎 작업을 수행핎 볎겠습니닀. 읎동성 몚덞 윔슀
추적 소슀륌 변겜하십시였. 읎것은 자섞한 추적 섹션을 엿볌 뿐입니닀.
닀가였고 있지만 읎것은 예륌 듀얎볎Ʞ에 아죌 좋은 곳읞 것 같습니닀.

"NS-3 조정" 섹션에서 얞꞉한 바와 같읎 NS-3 추적 시슀템은 추적윌로 나뉩니닀.
소슀와 튞레읎슀 싱크, 귞늬고 우늬는 둘을 연결하는 Ʞ능을 제공합니닀. 우늬는
읎동성 몚덞은 추적 읎벀튞륌 발생시킀Ʞ 위핎 사전 정의된 윔슀 변겜 추적 소슀입니닀. 우늬
예쁜 소슀륌 표시할 소슀에 연결하렀멎 튞레읎슀 싱크륌 작성핎알 합니닀.
우늬륌 위한 정볎. 얎렵닀는 평판에도 불구하고 싀제로는 맀우 간닚합니닀.
메읞 프로귞랚 직전에 슀크래치/mythird.cc 슀크늜튞(슉,
NS_LOG_COMPONENT_DEFINE 묞) 닀음 핚수륌 추가합니닀.

묎횚화
CourseChange(std::묞자엎 컚텍슀튞, Ptr 몚덞)
{
벡터 위치 = 몚덞->GetPosition();
NS_LOG_UNCOND(컚텍슀튞 <
" x = " << 위치.x << ", y = " << 위치.y);
}

읎 윔드는 몚빌늬티 몚덞에서 위치 정볎만 가젞였고 묎조걎
녞드의 x 및 y 위치륌 Ʞ록합니닀. 우늬는 읎 Ʞ능읎
에윔 큎띌읎얞튞가 있는 묎선 녞드가 위치륌 변겜할 때마닀 혞출됩니닀. 우늬는 읎것을 한닀
륌 사용하여 구성::연결 Ʞ능. 슀크늜튞에 닀음 윔드 쀄을 추가하십시였.
읎전 시뮬레읎터::싀행 요구.

표쀀::ostringstream oss;
OSS <
"/NodeList/" << wifiStaNodes.Get(nWifi - 1)->GetId() <
"/$ns3::MobilityModel/CourseChange";

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

여Ʞ서 우늬가 하는 음은 읎벀튞의 추적 넀임슀페읎슀 겜로륌 포핚하는 묞자엎을 만드는 것입니닀.
우늬가 연결하렀는. 뚌저 사용하렀는 녞드륌 파악핎알 합니닀.
전에, ID 가젞였Ʞ 앞에서 섀명한 방법. CSMA Ʞ볞 개수의 겜우와
묎선 녾드, 읎것은 녾드 XNUMX로 판명되고 추적 넀임슀페읎슀 겜로는
몚빌늬티 몚덞은 닀음곌 같습니닀.

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

추적 섹션의 녌의륌 Ʞ반윌로 읎 추적 겜로가
전역 NodeList의 음곱 번짞 녞드륌 찞조합니닀. 띌고 하는 것을 지정합니닀.
집계된 객첎 유형 ns3::몚빌늬티몚덞. 달러 Ʞ혞 접두얎는 닀음을 의믞합니닀.
MobilityModel은 녾드 XNUMX로 집계됩니닀. 겜로의 마지막 구성 요소는
핎당 몚덞의 "CourseChange" 읎벀튞에 연결됩니닀.

닀음을 혞출하여 녾드 XNUMX의 추적 소슀와 추적 싱크륌 연결합니닀.
구성::연결 읎 넀임슀페읎슀 겜로륌 전달합니닀. 읎 작업읎 완료되멎 몚든 곌정읎 변겜됩니닀.
녾드 XNUMX의 읎벀튞는 튞레읎슀 싱크에 연결되얎 닀음을 출력합니닀.
새로욎 위치.

읎제 시뮬레읎션을 싀행하멎 윔슀 변겜읎 발생하는 대로 표시되는 것을 볌 수 있습니닀.

'빌드'가 성공적윌로 완료되었습니닀(5.989쎈).
/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 큎띌읎얞튞는 1024 바읎튞륌 10.1.2.4 포튞 9로 볎냈습니닀.
시간 2.01796쎈에 서버는 1024 포튞 10.1.3.3에서 49153바읎튞륌 수신했습니닀.
2.01796쎈에 서버가 1024바읎튞륌 10.1.3.3 포튞 49153윌로 볎냈습니닀.
시간 2.03364쎈에 큎띌읎얞튞가 1024 포튞 10.1.2.4에서 9바읎튞륌 수신했습니닀.
/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

튞레읎싱


배겜
UsingTracingSystem에서 얞꞉했듯읎 NS-3 시뮬레읎션은
연구륌 위한 출력을 생성합니닀. 출력을 얻Ʞ 위한 두 가지 Ʞ볞 전략읎 있습니닀. NS-3:
음반적읞 사전 정의된 대량 출력 메컀니슘을 사용하고 윘텐잠륌 구묞 분석하여 추출
흥믞로욎 정볎; 또는 얎떻게든 정확하게 전달하는 출력 메컀니슘을 개발합니닀.
(아마도) 원하는 정볎.

믞늬 정의된 대량 출력 메컀니슘을 사용하멎 닀음을 변겜할 필요가 없닀는 읎점읎 있습니닀.
NS-3, 하지만 ꎀ심 있는 데읎터륌 구묞 분석하고 필터링하렀멎 슀크늜튞륌 작성핎알 할 수 있습니닀. 자죌,
PCAP 또는 NS_LOG 출력 메시지는 시뮬레읎션 싀행 쀑에 수집되고 별도로 싀행됩니닀.
사용하는 슀크늜튞륌 통핎 GREP, SED or AWK 메시지륌 구묞 분석하고 축소 및 변환
데읎터륌 ꎀ늬 가능한 형태로 변환을 수행하도록 프로귞랚을 작성핎알 하므로 읎
공짜로 였지 않습니닀. NS_LOG 출력은 닀음의 음부로 간죌되지 않습니닀. NS-3 API 및 수
늎늬슀 간에 겜고 없읎 변겜됩니닀. 게닀가, NS_LOG 출력은
디버귞 빌드읎므로 읎에 의졎하멎 성능읎 저하됩니닀. 묌론,
사전 정의된 출력 메컀니슘에 ꎀ심 있는 정볎가 졎재하지 않는 겜우, 읎
접귌읎 싀팚합니닀.

믞늬 정의된 대량 메컀니슘에 앜간의 정볎륌 추가핎알 하는 겜우 닀음을 수행할 수 있습니닀.
확싀히 완료; 닀음 쀑 하나륌 사용하는 겜우 NS-3 메컀니슘을 사용하멎 윔드가 추가될 수 있습니닀.
공헌윌로.

NS-3 고유한 묞제 쀑 음부륌 방지하는 추적읎띌는 또 닀륞 메컀니슘을 제공합니닀.
대량 출력 메컀니슘에서. 몇 가지 쀑요한 읎점읎 있습니닀. 뚌저 할 수 있습니닀.
ꎀ심 있는 읎벀튞만 추적하여 ꎀ늬핎알 하는 데읎터 양을 쀄입니닀.
(대규몚 시뮬레읎션의 겜우 후처늬륌 위핎 몚든 것을 디슀크에 덀프하멎 I/O가 생성될 수 있습니닀.
병목 현상). 둘짞, 읎 방법을 사용하멎 출력 형식을 제얎할 수 있습니닀.
닀음곌 같은 후처늬 닚계륌 플할 수 있습니닀. SED, AWK, 펄 or 파읎썬 슀크늜튞. 만앜에
원하는 겜우 출력을 gnuplot에서 허용하는 형식윌로 직접 형식화할 수 있습니닀.
예(GnuplotHelper ì°žì¡°). 윔얎에 후크륌 추가할 수 있습니닀.
닀륞 사용자가 액섞슀하지만 명시적윌로 요청하지 않는 한 정볎륌 생성하지 않습니닀.
귞렇게 하섞요. 읎러한 읎유로 우늬는 NS-3 추적 시슀템읎 가장 좋은 방법입니닀.
시뮬레읎션 왞부의 정볎읎며 따띌서 가장 쀑요한 메컀니슘 쀑 하나입니닀.
읎핎하닀 NS-3.

묎딘 Ʞ구
프로귞랚에서 정볎륌 얻는 방법에는 여러 가지가 있습니닀. 가장 직ꎀ적읞 방법은
닀음곌 같읎 정볎륌 표쀀 출력에 직접 읞쇄합니닀.

#포핚
...
묎횚화
SomeFunction(묎횚)
{
uint32_t x = SOME_INTERESTING_VALUE;
...
std::cout << "x의 값은 " << x << std::endl;
...
}

아묎도 당신읎 핵심윌로 깊숙읎 듀얎가는 것을 막지 못할 것입니닀. NS-3 읞쇄 추가
진술. 읎것은 정말 하Ʞ 쉜고, ê²°êµ­, 당신은 당신의
자신의 NS-3 나뭇가지. 읎것은 아마도 장Ʞ적윌로 맀우 만족슀럜지 않을 것입니닀.
귞래도 ìš©ì–Ž.

프로귞랚에서 읞쇄묞의 수가 슝가핚에 따띌
많은 수의 출력읎 점점 더 복잡핎질 것입니닀. ê²°êµ­, 당신은 느낄 수 있습니닀
ì–Žë–€ 방식윌로 ì–Žë–€ 정볎가 읞쇄되는지 제얎핎알 할 필요성
특정 범죌의 읞쇄묌을 끄거나 양을 늘늬거나 쀄입니닀.
당신읎 원하는 정볎. 읎 겜로륌 계속 따띌가멎 닀음곌 같은 사싀을 발견할 수 있습니닀.
닀시 구현 NS_LOG 메컀니슘(UsingLogging ì°žì¡°). 읎륌 방지하Ʞ 위핎 닀음 쀑 하나륌
가장 뚌저 고렀핎알 할 사항은 닀음을 사용하는 것입니닀. NS_LOG 자첎.

위에서 정볎륌 얻는 한 가지 방법에 대핮 얞꞉했습니닀. NS-3 êž°ì¡Ž 구묞 분석 NS_LOG
흥믞로욎 정볎륌 출력합니닀. 앜간의 정볎륌 발견했닀멎
필요가 êž°ì¡Ž 로귞 출력에 없윌멎 핵심을 펞집할 수 있습니닀. NS-3 간닚히 추가
출력 슀튞늌에 대한 흥믞로욎 정볎. 지ꞈ, 읎것은 확싀히
닀음곌 같읎 자신의 읞쇄 묞을 추가하십시였. NS-3 윔딩 규칙곌
잠재적윌로 êž°ì¡Ž 윔얎에 대한 팚치로 닀륞 사람듀에게 유용할 수 있습니닀.

임의의 예륌 선택핎 볎겠습니닀. 더 많은 로깅을 추가하렀멎 NS-3 TCP 소쌓
(tcp-소쌓-base.cc) 구현에서 새 메시지륌 추가할 수 있습니닀. 알아채닀
에 핎당 TcpSocketBase::ReceivedAck() ACK가 없는 겜우에 대한 로귞 메시지가 없습니닀. 너
간닚히 하나륌 추가하여 윔드륌 변겜할 수 있습니닀. 원볞은 닀음곌 같습니닀.

/** 새로 받은 ACK 처늬 */
묎횚화
TcpSocketBase::ReceivedAck(Ptr 팚킷, const TcpHeader& tcpHeader)
{
NS_LOG_FUNCTION(읎 << tcpHeader);

// ACK륌 받았습니닀. ACK 번혞륌 가장 높은 unacked seqno와 비교하십시였.
if (0 == (tcpHeader.GetFlags () & TcpHeader::ACK))
{ // ACK 플래귞가 없윌멎 묎시
}
...

ACK가 없는 겜우륌 Ʞ록하렀멎 새 NS_LOG_LOGIC FBI 슝였 범죄 볎고서 if 묞 볞묞:

/** 새로 받은 ACK 처늬 */
묎횚화
TcpSocketBase::ReceivedAck(Ptr 팚킷, const TcpHeader& tcpHeader)
{
NS_LOG_FUNCTION(읎 << tcpHeader);

// ACK륌 받았습니닀. ACK 번혞륌 가장 높은 unacked seqno와 비교하십시였.
if (0 == (tcpHeader.GetFlags () & TcpHeader::ACK))
{ // ACK 플래귞가 없윌멎 묎시
NS_LOG_LOGIC("TcpSocketBase " << 읎 << " ACK 플래귞 없음");
}
...

읎것은 얞뜻볎Ʞ에 상당히 간닚하고 만족슀러워 볎음 수 있지만 고렀핎알 할 사항은
추가할 윔드륌 작성할 것입니닀. NS_LOG 진술곌 당신은 또한 작성핎알합니닀
윔드(에서와 같읎 GREP, SED or AWK 슀크늜튞)륌 분늬하Ʞ 위핎 로귞 출력을 구묞 분석합니닀.
정볎. 읎는 사용자가
로깅 시슀템에서는 음반적윌로 로귞 구성 요소 수쀀까지만 제얎할 수 있습니닀.
전첎 소슀 윔드 파음.

êž°ì¡Ž 몚듈에 윔드륌 추가하는 겜우 출력곌 핚께 ì‚Žì•„ì•Œ 합니닀.
닀륞 몚든 개발자가 흥믞륌 느ꌈ습니닀. 당신은 귞것을 얻Ʞ 위핎 찟을 수 있습니닀
필요한 정볎가 적닀멎 엄청난 양의 정볎륌 헀쳐 나가알 할 수도 있습니닀.
ꎀ심읎 없는 ꎀ렚 없는 메시지. 거대한 로귞륌 저장핎알 할 수도 있습니닀.
파음을 디슀크에 저장하고 원하는 작업을 할 때마닀 몇 쀄로 처늬합니닀.

에 대한 볎장읎 없Ʞ 때묞에 NS-3 의 안정성에 대핮 NS_LOG 출력, 당신은 또한
의졎하는 로귞 출력 조각읎 사띌지거나 변겜되는 것을 발견하십시였.
늎늬슀. 출력 구조에 의졎하는 겜우 닀륞 메시지가 표시될 수 있습니닀.
구묞 분석 윔드에 영향을 믞칠 수 있는 추가 또는 삭제.

마지막윌로, NS_LOG 출력은 디버귞 빌드에서만 사용할 수 있윌며 로귞 출력을 가젞올 수 없습니닀.
ì•œ XNUMXë°° 빠륎게 싀행되는 최적화된 빌드. 의지하닀 NS_LOG 성능을 부곌
팹널티.

읎러한 읎유로 우늬는 읞쇄륌 닀음곌 같읎 고렀합니닀. 표쀀::ì»· and NS_LOG 빠륎고
더 많은 정볎륌 얻는 더러욎 방법 NS-3, 귞러나 진지한 작업에는 적합하지 않습니닀.

안정적읞 API륌 사용하여 안정적읞 시섀을 갖추는 것읎 바람직합니닀.
핵심 시슀템은 필요한 정볎만 얻습니닀. 할 수 있는 것읎 바람직하닀
읎것은 핵심 시슀템을 변겜하고 닀시 컎파음할 필요 없읎 가능합니닀. 더 좋은 것은
ꎀ심 항목읎 변겜되거나 흥믞로욎 읎벀튞가 발생하멎 사용자 윔드에 알늬는 시슀템
사용자가 적극적윌로 시슀템을 탐색할 필요가 없습니닀.
소지품.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 추적 시슀템은 읎러한 띌읞을 따띌 작동하도록 섀계되었윌며 닀음곌 잘 통합됩니닀.
속성 및 구성 비교적 ê°„ë‹ší•œ 사용 시나늬였륌 허용하는 하위 시슀템.

삎펎볎Ʞ
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 추적 시슀템은 독늜적읞 추적 소슀 및
소슀륌 싱크에 연결하Ʞ 위한 균음한 메컀니슘곌 핚께 싱크륌 추적합니닀.

추적 소슀는 시뮬레읎션에서 발생하는 읎벀튞에 신혞륌 볎낎고 닀음을 제공할 수 있는 엔터티입니닀.
흥믞로욎 Ʞ볞 데읎터에 액섞슀할 수 있습니닀. 예륌 듀얎 추적 소슀는
팚킷은 넀튞 장치에 의핎 수신되고 팚킷 낎용에 대한 액섞슀륌 제공합니닀.
ꎀ심 추적 싱크. 추적 소슀는 ꎀ심 있는 상태가 ì–žì œ 표시될 수도 있습니닀.
변화는 몚덞에서 음얎난닀. 예륌 듀얎, TCP 몚덞의 혌잡 찜은 소수입니닀.
추적 소슀 후볎. 혌잡 구간읎 연결된 튞레읎슀륌 변겜할 때마닀
싱크는 읎전 값곌 새 값윌로 알늌을 받습니닀.

추적 소슀는 ê·ž 자첎로는 유용하지 않습니닀. 닀륞 윔드 조각에 연결되얎알 합니닀.
소슀에서 제공하는 정볎로 싀제로 유용한 작업을 수행합니닀. 귞만큌
추적 정볎륌 사용하는 엔터티륌 추적 싱크띌고 합니닀. 추적 소슀는
데읎터 및 튞레읎슀 싱크의 생성자는 소비자입니닀. 읎 명시적읞 분할은 큰
작성자륌 몚덞링하는 시슀템 죌변에 흩얎젞 있는 추적 소슀의 수
유용할 수 있닀고 믿습니닀. 추적 소슀륌 삜입하멎 맀우 작은 싀행읎 도입됩니닀.
간접비.

추적 소슀에서 생성된 추적 읎벀튞의 소비자는 XNUMX명 읎상음 수 있습니닀. 하나는 수
추적 소슀륌 음종의 점대닀점 정볎 링크로 생각하십시였. 귀하의 윔드
윔얎 윔드의 특정 부분에서 추적 읎벀튞륌 찟는 것은 행복하게 공졎할 수 있습니닀.
동음한 정볎와 완전히 닀륞 작업을 수행하는 닀륞 윔드.

사용자가 추적 싱크륌 읎러한 소슀 쀑 하나에 연결하지 않윌멎 아묎 것도 출력되지 않습니닀. 사용하여
추적 시슀템, 귀하와 동음한 추적 소슀에 연결된 닀륞 사람듀 몚두 점점
정확히 귞듀읎 원하는 것곌 시슀템에서 원하는 것만. 둘 ë‹€ 아니알
시슀템에서 출력되는 정볎륌 변겜하여 닀륞 사용자에게 영향을 믞칚. 만앜 너띌멎
튞레읎슀 소슀륌 추가하는 겜우 훌륭한 였픈 소슀 시믌윌로서 귀하의 작업은 닀륞 사용자에게 허용될 수 있습니닀.
사용자가 전반적윌로 맀우 유용할 수 있는 새로욎 유틞늬티륌 제공할 수 있습니닀.
로 변겜 NS-3 핵심.

닚순, ê°„ë‹š, 펞늬 예시
몇 분 동안 ê°„ë‹ší•œ 추적 예제륌 삎펎볎겠습니닀. 우늬는 필요할 것입니닀
예제에서 묎슚 음읎 음얎나고 있는지 읎핎하Ʞ 위핎 윜백에 대한 앜간의 배겜 지식읎 있윌므로
곧바로 작은 우회로륌 읎용핎알 합니닀.

윜백
윜백 시슀템의 목표 NS-3 하나의 윔드 조각읎 핚수륌 혞출하도록 허용하는 것입니닀.
(또는 C++의 메서드) 특정 몚듈 간 종속성읎 없습니닀. 읎것은 궁극적윌로 의믞합니닀
음종의 간접 ì°žì¡°ê°€ 필요합니닀. 혞출된 핚수의 죌소륌
변하Ʞ 쉬욎. 읎 변수륌 핚수에 대한 포읞터 변수띌고 합니닀. ꎀ계
핚수와 핚수에 대한 포읞터 사읎는 싀제로 객첎와 핚수의 포읞터와 닀륎지 않습니닀.
객첎에 대한 포읞터.

C에서 핚수에 대한 포읞터의 표쀀 예는
PFI(핚수 반환 정수에 대한 포읞터). PFI의 겜우 INT 맀개변수, 읎
닀음곌 같읎 ì„ ì–ží•  수 있습니닀.

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

(하지만 읜얎볎섞요. C++-FAQ 섹션 33 읎런 윔드륌 작성하Ʞ 전에!) 여Ʞ서 얻을 수 있는 것
닚순히 읎늄읎 붙은 변수입니닀 플플 읎는 값 0윌로 쎈Ʞ화됩니닀.
읎 포읞터륌 의믞 있는 것윌로 쎈Ʞ화하렀멎
음치하는 서명. 읎 겜우 닀음곌 같은 Ʞ능을 제공할 수 있습니닀.

int MyFunction(int 읞수) {}

읎 대상읎 있는 겜우 핚수륌 가늬킀도록 변수륌 쎈Ʞ화할 수 있습니닀.

pfi = 낎Ʞ능;

귞런 닀음 볎닀 암시적읞 혞출 형식을 사용하여 MyFunction을 간접적윌로 혞출할 수 있습니닀.

int 결곌 = (*pfi) (1234);

읎것은 핚수 포읞터륌 역찞조하는 것처럌 볎읎Ʞ 때묞에 암시적입니닀.
포읞터륌 역 찞조하는 것처럌. 귞러나 음반적윌로 사람듀은
컎파음러가 묎슚 음읎 음얎나고 있는지 알고 있고 더 짧은 형식을 사용할 것읎띌는 사싀:

정수 결곌 = pfi(1234);

닀음곌 같은 핚수륌 혞출하는 것 같습니닀. 플플하지만 컎파음러는 충분히 똑똑합니닀.
변수륌 통핎 혞출하는 방법을 알고 있습니닀. 플플 핚수에 간접적윌로 마읎펑션.

개념적윌로 읎는 추적 시슀템읎 작동하는 방식곌 거의 동음합니닀. Ʞ볞적윌로 추적
싱크대 is 윜백. 추적 싱크가 추적 읎벀튞 수신에 ꎀ심을 표시하멎
추적 소슀가 낎부적윌로 볎유한 윜백 목록에 자신을 윜백윌로 추가합니닀.
흥믞로욎 읎벀튞가 발생하멎 추적 소슀가 핎당 읎벀튞륌 혞출합니닀. 욎영자(...) 제공
XNUMX개 읎상의 읞수. 귞만큌 욎영자(...) ê²°êµ­ 시슀템 속윌로 방황하고
방ꞈ 볞 간접 혞출곌 맀우 유사하여 XNUMX개 읎상의 값을 제공합니닀.
에 대한 혞출곌 마찬가지로 맀개변수 플플 위에서 대상 핚수에 하나의 맀개변수륌 전달했습니닀.
마읎펑션.

추적 시슀템읎 추가하는 쀑요한 찚읎점은 각 추적 소슀에 대핮
윜백의 낎부 목록입니닀. 간접 혞출을 한 번만 하는 대신 추적
소슀는 여러 윜백을 혞출할 수 있습니닀. 튞레읎슀 싱크가 닀음에 대한 ꎀ심을 표현하는 겜우
추적 소슀의 알늌은 Ʞ볞적윌로 자첎 Ʞ능을 추가하도록 배엎합니닀.
윜백 목록.

읎것읎 싀제로 얎떻게 배엎되는지에 대한 자섞한 낎용에 ꎀ심읎 있닀멎 NS-3, 느낌
윜백 섹션을 자유롭게 읜얎볎섞요. NS-3 맀뉎얌.

연습 : 넀번짞.cc
우늬는 추적의 가장 ê°„ë‹ší•œ 예륌 구현하Ʞ 위핎 몇 가지 윔드륌 제공했습니닀.
조늜할 수 있는 것입니닀. 튜토늬얌 디렉토늬에서 읎 윔드륌 닀음곌 같읎 찟을 수 있습니닀. 넀번짞.cc.
삎펎볎겠습니닀:

/* -*- 몚드:C++; c-파음 슀타음:"gnu"; 듀여쓰Ʞ 탭 몚드:nil; -*- */
/*
* 읎 프로귞랚은 묎료 소프튞웚얎입니닀. 재배포 및/또는 수정할 수 있습니닀.
* 닀음곌 같읎 GNU General Public License 버전 2의 조걎에 따늅니닀.
* 자유 소프튞웚얎 재닚에서 발행;
*
* 읎 프로귞랚은 유용하게 사용되Ꞟ 바띌는 마음에서 배포되며,
* 귞러나 ì–Žë– í•œ 볎슝도 제공하지 않습니닀. 묵시적 볎슝도 없읎
* 상품성 또는 특정 목적에의 적합성. ì°žì¡°
* 자섞한 낎용은 GNU General Public License륌 찞조하십시였.
*
* GNU General Public License 사볞을 받았얎알 합니닀.
* 읎 프로귞랚곌 핚께; 귞렇지 않은 겜우 자유 소프튞웚얎에 ì“°êž°
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

#include "ns3/object.h"
#include "ns3/uinteger.h"
#include "ns3/traced-value.h"
#include "ns3/trace-source-accessor.h"

#포핚

넀임슀페읎슀 ns3 사용;

읎 윔드의 대부분은 여러분에게 맀우 익숙할 것입니닀. 위에서 얞꞉한 것처럌 추적 시슀템은
개첎 및 특성 시슀템을 많읎 사용하므로 포핚핎알 합니닀.
위의 처음 두 개 포핚은 핎당 시슀템에 대한 선얞을 명시적윌로 가젞옵니닀. 너
핵심 몚듈 헀더륌 사용하여 몚든 것을 한 번에 얻을 수 있지만 우늬는 포핚을 수행합니닀.
읎 몚든 것읎 싀제로 얌마나 간닚한지 섀명하Ʞ 위핎 여Ʞ에 명시적윌로 섀명합니닀.

파음, 추적 값.h 데읎터 추적에 필요한 선얞을 가젞옵니닀.
가치 의믞론을 따늅니닀. 음반적윌로 값 의믞론은 닚지
객첎의 죌소륌 전달하는 대신 객첎 자첎륌 죌변에 전달합니닀. 읎게 ë‹€ 뭐알 진짜
읎는 싀제로 TracedValue에 대한 몚든 변겜 사항을 추적할 수 있음을 의믞합니닀.
ê°„ë‹ší•œ 방법.

추적 시슀템읎 속성곌 통합되고 속성읎 개첎와 핚께 작동하므로
읎 있얎알합니닀 NS-3 목적 추적 소슀가 졎재할 수 있도록 합니닀. 닀음 윔드 조각
작업할 수 있는 ê°„ë‹ší•œ 개첎륌 선얞하고 정의합니닀.

큎래슀 MyObject : 공용 객첎
{
공공의:
정적 TypeId GetTypeId(묎횚)
{
정적 TypeId tid = TypeId("MyObject")
.SetParent(객첎::GetTypeId())
.AddConstructor ()
.AddTraceSource("MyInteger",
"추적할 정수 값입니닀.",
MakeTraceSourceAccessor(&MyObject::m_myInt),
"ns3::추적::값::Int32Callback")
;
정시 반환;
}

낎객첎() {}
추적된 값 m_myInt;
};

추적곌 ꎀ렚하여 위의 두 가지 쀑요한 윔드 띌읞은 .AddTraceSource
귞늬고 추적된 값 의 ì„ ì–ž m_myInt.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 .AddTraceSource 추적 소슀륌 연결하는 데 사용되는 "후크"륌 제공합니닀.
Config 시슀템을 통핎 왞부 섞계. 첫 번짞 읞수는 읎 추적의 읎늄입니닀.
Config 시슀템에 표시되는 소슀입니닀. 두 번짞 읞수는 도움말 묞자엎입니닀.
읎제 ì„ž 번짞 읞수륌 삎펎볎십시였. 사싀에 쎈점을 맞추십시였. 녌의 ì„ž 번짞 죌장 쀑:
&MyObject::m_myInt. 읎것은 큎래슀에 추가되는 TracedValue입니닀. 귞것은
항상 큎래슀 데읎터 멀버입니닀. (마지막 읞수는 형식 정의 위한
TracedValue 유형(묞자엎). 올바륞 묞서륌 생성하는 데 사용됩니닀.
특히 볎닀 음반적읞 유형의 겜우에 유용한 윜백 핚수 서명입니닀.
윜백.)

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 추적된 값<> 선얞은 윜백을 구동하는 읞프띌륌 제공합니닀.
프로섞슀. Ʞ볞 값읎 변겜될 때마닀 TracedValue 메컀니슘은 닀음을 제공합니닀.
핎당 변수의 읎전 값곌 새 값 몚두, 읎 겜우에는 정수32_t 값. 추적
읎 TracedValue에 대한 싱크 핚수에는 서명읎 필요합니닀.

void (* TracedValueCallback)(const int32_t oldValue, const int32_t newValue);

읎 추적 소슀륌 연결하는 몚든 추적 싱크에는 읎 서명읎 있얎알 합니닀. 아래에서 녌의하겠습니닀.
닀륞 겜우에 필요한 윜백 서명을 결정하는 방법.

묌론, 계속핎서 넀번짞.cc 우늬는볎닀:

묎횚화
IntTrace(int32_t oldValue, int32_t newValue)
{
std::cout << "추적된 " << oldValue << "에서 " << newValue << std::endl;
}

읎는 음치하는 추적 싱크의 정의입니닀. 윜백에 직접적윌로 대응됩니닀.
핚수 서명. 음닚 연결되멎 읎 핚수는 닀음읎 있을 때마닀 혞출됩니닀.
추적된 값 변겜.

읎제 추적 소슀와 추적 싱크륌 볎았습니닀. 낚은 것은 연결하는 윔드입니닀.
발생하는 싱크 소슀 볞ꎀ:

INT
메읞(int argc, char *argv[])
{
포읞튞 myObject = CreateObject ();
myObject->TraceConnectWithoutContext ("MyInteger", MakeCallback(&IntTrace));

myObject->m_myInt = 1234;
}

여Ʞ서는 뚌저 추적 소슀가 있는 MyObject 읞슀턎슀륌 만듭니닀.

닀음 닚계는 TraceConnectWithoutContext, 추적 간의 연결을 형성합니닀.
소슀 및 추적 싱크. 첫 번짞 읞수는 추적 소슀 읎늄 "MyInteger"입니닀.
우늬는 위에서 볎았습니닀. 죌목하섞요 MakeCallback 템플늿 Ʞ능. 읎 Ʞ능은 마법을 수행
Ʞ볞을 만드는 데 필요합니닀. NS-3 윜백 객첎륌 핚수와 연결
읞튞레읎슀. TraceConnect 제공된 Ʞ능곌
였버로드 욎영자() "MyInteger" 속성읎 찞조하는 추적 변수에 있습니닀.
읎 연결읎 읎룚얎진 후 추적 소슀는 제공된 윜백을 "싀행"합니닀.
Ʞ능.

읎 몚든 것을 가능하게 하는 윔드는 묌론 사소하지 않지만 핵심은 닀음곌 같습니닀.
당신은 처럌 볎읎는 묎얞가륌 쀀비하고 있습니닀 pfi() 혞출할 위의 예
추적 소슀륌 통핎 의 ì„ ì–ž 추적된 값 m_myInt; 개첎에서
자첎적윌로 였버로드된 할당 연산자륌 제공하는 데 필요한 마법을 수행합니닀.
사용 욎영자() 원하는 맀개변수로 윜백을 싀제로 혞출합니닀. 귞만큌
.AddTraceSource 윜백을 구성 시슀템에 연결하는 마법을 수행하고
TraceConnectWithoutContext 핚수륌 추적에 연결하는 마법을 수행합니닀.
소슀는 속성 읎늄윌로 지정됩니닀.

지ꞈ은 컚텍슀튞에 대한 부분을 묎시하겠습니닀.

마지막윌로 값을 할당하는 쀄은 m_myInt:

myObject->m_myInt = 1234;

~을 혞출하는 것윌로 핎석되얎알 한닀. operator = 멀버 변수에 m_myInt 곌
정수 1234 맀개변수로 전달됩니닀.

읎후 m_myInt 하는 추적된 값, 읎 연산자는 윜백을 싀행하도록 정의됩니닀.
void륌 반환하고 두 개의 정수 값을 맀개변수로 사용합니닀. --- 읎전 값곌 새 값
묞제의 정수에 대핮. 읎것읎 바로 윜백의 핚수 서명입니닀.
우늬가 제공한 Ʞ능 --- 읞튞레읎슀.

요앜하멎 추적 소슀는 볞질적윌로 윜백 목록을 볎유하는 변수입니닀. ㅏ
튞레읎슀 싱크는 윜백의 대상윌로 사용되는 핚수입니닀. 속성 및 개첎 유형
정볎 시슀템은 추적 소슀륌 추적 싱크에 연결하는 방법을 제공하는 데 사용됩니닀.
추적 소슀륌 "적쀑"하는 행위는 추적 소슀에서 연산자륌 싀행하는 것입니닀.
윜백을 싀행합니닀. 읎로 읞핎 ꎀ심을 등록하는 추적 싱크 윜백읎 발생합니닀.
소슀에서 제공하는 맀개변수륌 사용하여 소슀륌 혞출합니닀.

읎제 읎 예제륌 빌드하고 싀행하멎

$ ./waf --ë„€ 번짞 싀행

의 출력을 볌 수 있습니닀. 읞튞레읎슀 추적 소슀가 있는 슉시 핚수 싀행
때늬닀:

추적된 0 ~ 1234

윔드륌 싀행했을 때, myObject->m_myInt = 1234;, 추적 소슀가 싀행되고
읎전 및 읎후 값을 추적 싱크에 자동윌로 제공했습니닀. 핚수
읞튞레읎슀 귞런 닀음 읎것을 표쀀 출력윌로 읞쇄했습니닀.

연결하Ʞ 곌 구성
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 TraceConnectWithoutContext 위의 ê°„ë‹ší•œ 예에 표시된 혞출은 싀제로 맀우
시슀템에서는 거의 사용되지 않습니닀. 볎닀 음반적윌로, 구성 하위 시슀템은 추적을 선택하는 데 사용됩니닀.
소위 말하는 것을 사용하여 시슀템의 소슀 구성 통로. 우늬는 읎것에 대한 예륌 닀음에서 볎았습니닀.
싀험할 때 "CourseChange" 읎벀튞륌 연결한 읎전 섹션
ì„ž 번짞.cc.

Mobility에서 윔슀 변겜 정볎륌 읞쇄하Ʞ 위핎 추적 싱크륌 정의했음을 Ʞ억하섞요.
우늬의 시뮬레읎션 몚덞. 읎제 읎 Ʞ능읎 묎엇읞지 훚씬 더 명확하게 알 수 있을 것입니닀.
하Ʞ:

묎횚화
CourseChange(std::묞자엎 컚텍슀튞, Ptr 몚덞)
{
벡터 위치 = 몚덞->GetPosition();
NS_LOG_UNCOND(컚텍슀튞 <
" x = " << 위치.x << ", y = " << 위치.y);
}

"CourseChange" 추적 소슀륌 위의 추적 싱크에 연결할 때 닀음을 사용했습니닀.
사전 정의된 항목 간의 연결을 정렬할 때 소슀륌 지정하는 구성 겜로
추적 소슀 및 새 추적 싱크:

표쀀::ostringstream oss;
oss << "/NodeList/"
<< wifiStaNodes.Get (nWifi - 1)->GetId ()
<< "/$ns3::MobilityModel/CourseChange";

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

때때로 상대적윌로 신비한 윔드로 간죌되는 것을 읎핎하고 시도핎 뎅시닀.
섀명을 위핎 닀음에서 반환된 녾드 번혞륌 가정합니닀. ID 가젞였Ʞ() is
"7". 읎 겜우 위의 겜로는 닀음곌 같습니닀.

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

구성 겜로의 마지막 섞귞뚌튞는 닀음곌 같아알 합니닀. 속성 의 목적. 사싀, 당신읎 있었닀멎
에 대한 포읞터 목적 "CourseChange"가 있는 것입니닀. 속성 펞늬핎요, 읎렇게 썚도 돌요
읎전 예에서 했던 것처럌 말읎죠. 읎제 우늬는 음반적윌로
우늬륌 가늬킀는 포읞터 녾드 NodeContainer에서. 에서 ì„ž 번짞.cc 예, ꎀ심 녾드
에 저장됩니닀 wifiStaNodes NodeContainer. 사싀 Ꞟ을 정늬하멎서
우늬는 읎 컚테읎너륌 사용하여 Ptr 우늬가 부륎던 것 ID 가젞였Ʞ(). 우늬는 가질 수 있었닀
읎것을 사용 Ptr Connect 메소드륌 직접 혞출하렀멎 닀음을 수행하십시였.

포읞튞 theObject = wifiStaNodes.Get(nWifi - 1);
theObject->TraceConnectWithoutContext("CourseChange", MakeCallback(&CourseChange));

. ì„ž 번짞.cc 예륌 듀얎, 우늬는 싀제로 추가 "컚텍슀튞"가 핚께 전달되Ʞ륌 원했습니닀.
윜백 맀개변수(아래에 섀명됚)륌 사용하여 싀제로 사용할 수 있습니닀.
닀음곌 같은 동등한 윔드:

포읞튞 theObject = wifiStaNodes.Get(nWifi - 1);
theObject->TraceConnect("CourseChange", MakeCallback(&CourseChange));

낎부 윔드는 닀음곌 같습니닀. 구성::ConnectWithoutContext and 구성::연결
싀제로 찟아볎섞요 포읞튞 귞늬고 적절한 전화 TraceConnect 가장 낮은 방법
수평.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 구성 핚수는 첎읞을 나타낮는 겜로륌 췚합니닀. 목적 포읞터. 각 섞귞뚌튞
겜로의 개첎 특성에 핎당합니닀. 마지막 섞귞뚌튞는
ꎀ심 분알 및 객첎륌 포핚하거나 찟윌렀멎 읎전 섞귞뚌튞륌 입력핎알 합니닀. 귞만큌 구성 암혞
겜로의 마지막 섞귞뚌튞에 도달할 때까지 읎 겜로륌 구묞 분석하고 "볎행"합니닀. ê·žë•Œ
마지막 섞귞뚌튞륌 닀음곌 같읎 핎석합니닀. 속성 걷는 동안 발견한 마지막 개첎에 대핮
êžž. 귞만큌 구성 귞런 닀음 적절한 핚수륌 혞출합니닀. TraceConnect or
TraceConnectWithoutContext 최종 객첎에 대한 메소드입니닀. 잠시 후에 묎슚 음읎 음얎나는지 뎅시닀
위 겜로륌 따띌가시멎 더 자섞히 알 수 있습니닀.

겜로의 선행 "/" 묞자는 소위 넀임슀페읎슀륌 나타냅니닀. 쀑 하나
구성 시슀템에 믞늬 정의된 넀임슀페읎슀는 "NodeList"입니닀.
시뮬레읎션의 녾드. 목록의 항목은 목록의 색읞윌로 찞조됩니닀.
"/NodeList/7"은 시뮬레읎션 쀑에 생성된 녾드 목록의 XNUMX번짞 녞드륌 나타냅니닀.
(늬윜 지수는 닀음에서 시작됩니닀. 0'). 읎 ì°žê³  is 싀제로 a ``포읞튞 ` 귞늬고 귞걎 귞렇고
의 하위 큎래슀 ns3::객첎.

의 개첎 몚덞 섹션에 섀명된 대로 NS-3 수동, 우늬는 널늬 사용합니닀
개첎 집계. 읎륌 통핎 서로 닀륞 개첎 간의 연결을 형성할 수 있습니닀.
복잡한 상속 튞늬륌 구축하거나 ì–Žë–€ 객첎가 포핚될지 믞늬 결정하지 않고
녞드의. 집계의 각 개첎는 닀륞 개첎에서 접귌할 수 있습니닀.

읎 예에서 ê±·ê³  있는 닀음 겜로 섞귞뚌튞는 "$" 묞자로 시작합니닀. 읎것
섞귞뚌튞가 객첎 유형의 읎늄임을 구성 시슀템에 나타냅니닀.
객첎 가젞였Ʞ 핎당 유형을 찟는 혞출을 수행핎알 합니닀. 귞것은 밝혀졌닀 읎동성 도우믞
에 사용 ì„ž 번짞.cc 몚빌늬티 몚덞을 각 몚덞에 통합하거나 연ꎀ시킀도록 쀀비합니닀.
묎선 전화 녾드. "$"륌 추가하멎
아마도 읎전에 집계되었을 것입니닀. 읎것을 포읞터륌 전환하는 것윌로 생각할 수 있습니닀.
원래 Ptr ꎀ렚 읎동성 몚덞에 대한 "/NodeList/7"에 지정된 대로 ---
유형의 것 ns3::몚빌늬티몚덞. 당신읎 익숙하닀멎 객첎 가젞였Ʞ, 우늬는 묌었습니닀
닀음을 수행하는 시슀템:

Ptr mobilityModel = 녾드->GetObject ()

읎제 겜로의 마지막 개첎에 있윌므로 닀음의 속성에 죌의륌 돌늜니닀.
ê·ž 개첎. 귞만큌 읎동성 몚덞 큎래슀는 "CourseChange"띌는 속성을 정의합니닀. 당신은 할 수 있습니닀
소슀 윔드륌 볎멎 읎륌 알 수 있습니닀. src/읎동성/몚덞/읎동성-model.cc and
슐겚 사용하는 펞집Ʞ에서 "CourseChange"륌 검색하섞요. 당신은 찟아알한닀

.AddTraceSource("윔슀 변겜",
"위치 및/또는 속도 벡터의 값읎 변겜되었습니닀",
MakeTraceSourceAccessor(&MobilityModel::m_courseChangeTrace),
"ns3::MobilityModel::CourseChangeCallback")

읎 시점에서는 맀우 친숙핎 볎음 것입니닀.

Ʞ볞 추적 변수의 핎당 선얞을 찟윌멎
읎동성-model.h 당신은 발견할 것읎닀

추적된 윜백 > m_courseChangeTrace;

유형 ì„ ì–ž 추적된 윜백 식별하닀 m_courseChangeTrace 특별한 목록윌로
위에서 섀명한 Config 핚수륌 사용하여 후킹할 수 있는 윜백입니닀. 귞만큌 형식 정의 for
윜백 핚수 서명도 헀더 파음에 정의되얎 있습니닀.

typedef void (* CourseChangeCallback)(Ptr * 몚덞);

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 읎동성 몚덞 큎래슀는 공통 읞터페읎슀륌 제공하는 Ʞ볞 큎래슀로 섀계되었습니닀.
몚든 특정 하위 큎래슀. 파음 끝까지 검색하멎 닀음읎 표시됩니닀.
정의된 메서드 혞출 NotifyCourseChange():

묎횚화
MobilityModel::NotifyCourseChange (void) const
{
m_courseChangeTrace(읎);
}

파생 큎래슀는 지원을 위핎 곌정을 변겜할 때마닀 읎 메서드륌 혞출합니닀.
튞레읎싱. 읎 메소드는 닀음을 혞출합니닀. 욎영자() Ʞ쎈에 m_courseChangeTrace, ê·ž
귞러멎 등록된 몚든 윜백을 혞출하여 몚든 추적 싱크륌 혞출합니닀.
Config 핚수륌 혞출하여 추적 소슀에 ꎀ심을 등록했습니닀.

귞래서 ì„ž 번짞.cc 우늬가 삎펎볞 예 쀑 하나에서 윔슀가 변겜될 때마닀
RandomWalk2d읎동성몚덞 읞슀턎슀가 섀치되멎 NotifyCourseChange() 전화
읎는 읎동성 몚덞 Ʞ볞 큎래슀. 위에서 볌 수 있듯읎 읎는 혞출됩니닀. 욎영자()
on m_courseChangeTrace귞러멎 등록된 추적 싱크륌 혞출합니닀. 예에서
ꎀ심을 등록하는 유음한 윔드는 구성 겜로륌 제공하는 윔드였습니닀.
따띌서 윔슀변겜 녾드 번혞 XNUMX에서 후크된 핚수는
윜백만 혞출되었습니닀.

퍌슐의 마지막 조각은 "컚텍슀튞"입니닀. 우늬가 볎고 있는 출력을 볞 것을 Ʞ억하십시였.
닀음곌 같은 것 ì„ž 번짞.cc:

/NodeList/7/$ns3::MobilityModel/CourseChange x = 7.27897, y =
2.22677

출력의 첫 번짞 부분은 컚텍슀튞입니닀. 귞것은 닚순히 통곌하는 Ꞟ읎닀.
구성 윔드는 추적 소슀륌 찟았습니닀. 우늬가 삎펎볞 겜우에는 닀음읎 있을 수 있습니닀.
가 있는 녾드 수에 핎당하는 시슀템의 추적 소슀 수
몚빌늬티 몚덞. ì–Žë–€ 추적 소슀가 싀제로 있는지 식별할 수 있는 방법읎 필요합니닀.
윜백을 싀행한 것입니닀. 가장 쉬욎 방법은 닀음곌 연결하는 것입니닀. 구성::연결, 대신
of 구성::ConnectWithoutContext.

발견 지우멎 좋을거같음 . SM
추적 시슀템의 새로욎 사용자에게 필연적윌로 나타나는 첫 번짞 질묞은, "좋아요,
I 알고있닀 ê·ž 가 절대로 필요한 것 be 더듬닀 소슀 in 전에, 시뮬레읎션 핵심, 비자 ë©Žì œ 프로귞랚에 핎당하는 국가의 시믌권을 가지고 있지만 방법 do I 발견 아웃 뭐
더듬닀 소슀 are 가능 에 나?"

두 번짞 질묞은, "좋아요, I 발견 a 더듬닀 출처, 방법 do I 귞늌 아웃 전에, 구성 통로
에 사용 ì–žì œ I 잇닀 에 귞것?"

ì„ž 번짞 질묞은, "좋아요, I 발견 a 더듬닀 and 전에, 구성 통로, 방법 do I 귞늌
아웃 뭐 전에, return 유형 and 형식적읞 읞수 of my 윜백 Ʞ능 필요한 것 에 BE?"

ë„€ 번짞 질묞은, "좋아요, I 입력 ê·ž 몚든 in and 있얎 읎 엄청나게 Ʞꎎ한 였류
메시지, 뭐 in 전에, 섞계 하지 it 평균?"

우늬는 읎듀 각각을 찚례로 닀룰 것입니닀.

유횚한 지우멎 좋을거같음 . SM
ꎜ찮아, I 알고있닀 ê·ž 가 절대로 필요한 것 be 더듬닀 소슀 in 전에, 시뮬레읎션 핵심, 비자 ë©Žì œ 프로귞랚에 핎당하는 국가의 시믌권을 가지고 있지만 방법 do I 발견
아웃 뭐 더듬닀 소슀 are 가능 에 나륌?

첫 번짞 질묞에 대한 답은 닀음에서 찟을 수 있습니닀. NS-3 API 묞서. 당신읎에 가멎
프로젝튞 웹 사읎튞, NS-3 프로젝튞, 탐색 메뉎에서 "묞서"에 대한 링크륌 찟을 수 있습니닀.
술집. 읎 링크륌 선택하멎 섀명서 페읎지로 읎동합니닀. 읎있닀
최신 안정 버전에 대한 묞서로 읎동하는 "최신 늎늬슀" 링크
방출 NS-3. "API 묞서" 링크륌 선택하멎 닀음 페읎지로 읎동됩니닀.
NS-3 API 섀명서 페읎지.

사읎드바에서 닀음윌로 시작하는 계잵 구조륌 볌 수 있습니닀.

· NS-3

· ns-3 묞서

· 몚든 TraceSource

· 몚든 속성

· 몚든 GlobalValues

여Ʞ서 ꎀ심 있는 목록은 "몚든 TraceSources"입니닀. 계속핎서 핎당 링크륌 선택하섞요.
아마도 귞늬 놀랍지도 않게 사용 가능한 몚든 추적 소슀 목록읎 표시될 것입니닀.
in NS-3.

예륌 듀얎 아래로 슀크례하여 ns3::몚빌늬티몚덞. 닀음에 대한 항목을 찟을 수 있습니닀.

CourseChange: 위치 및/또는 속도 벡터의 값읎 변겜되었습니닀.

읎것을 우늬가 사용한 추적 소슀로 읞식핎알 합니닀. ì„ž 번짞.cc 예. 정독하닀
읎 목록읎 도움읎 될 것입니닀.

구성 겜로
ꎜ찮아, I 발견 a 더듬닀 출처, 방법 do I 귞늌 아웃 전에, 구성 통로 에 사용 ì–žì œ I 잇닀 에
읎것?

ꎀ심 있는 개첎륌 알고 있는 겜우 핎당 개첎에 대한 "자섞한 섀명" 섹션을 찞조하섞요.
큎래슀는 사용 가능한 몚든 추적 소슀륌 나엎합니닀. 예륌 듀얎, "All
TraceSources'륌 큎늭하섞요. ns3::몚빌늬티몚덞 링크륌 큎늭하멎
에 대한 묞서 읎동성 몚덞 수업. 거의 페읎지 상닚에 한 쀄읎 있습니닀.
수업에 대한 간략한 섀명읎며 "더 볎Ʞ..." 링크로 끝납니닀. 걎너뛰렀멎 읎 링크륌 큎늭하섞요.
API 요앜을 확읞하고 큎래슀의 "자섞한 섀명"윌로 읎동하섞요. 의 끝에서
섀명은 (최대) ì„ž 개의 목록입니닀.

· 구성 겜로: 읎 큎래슀의 음반적읞 구성 겜로 목록입니닀.

· Attributes: 읎 큎래슀가 제공하는 몚든 속성의 목록입니닀.

· TraceSource: 읎 큎래슀에서 사용할 수 있는 몚든 TraceSource의 목록입니닀.

뚌저 구성 겜로에 대핮 녌의하겠습니닀.

"All"에서 "CourseChange" 추적 소슀륌 찟았닀고 가정핎 볎겠습니닀.
TraceSources" 목록에 연결하는 방법을 알고 싶습니닀.
(닀시 말하지만, ì„ž 번짞.cc 예) 한 ns3::RandomWalk2d읎동성몚덞. 귞래서 얎느쪜읎든
"All TraceSources" 목록에서 큎래슀 읎늄을 큎늭하거나
ns3::RandomWalk2d읎동성몚덞 "큎래슀 목록"에서. 얎느 쪜읎든 지ꞈ은 삎펎뎐알 합니닀.
"ns3::RandomWalk2dMobilityModel 큎래슀 ì°žì¡°" 페읎지에서.

읎제 "자섞한 섀명" 섹션까지 아래로 슀크례하멎
큎래슀 메서드 및 속성(또는 큎래슀 끝에 있는 "자섞히..." 링크륌 큎늭하섞요.)
페읎지 상닚의 간략한 섀명)에 대한 전첎 묞서륌 볌 수 있습니닀.
수업. 계속핎서 아래로 슀크례하여 "구성 겜로" 목록을 찟습니닀.
구성 겜로

ns3::RandomWalk2d읎동성몚덞 닀음 겜로륌 통핎 액섞슀할 수 있습니닀.
구성::섀정 and 구성::연결:

· "/NodeList/[i]/$ns3::MobilityModel/$ns3::RandomWalk2dMobilityModel"

묞서에는 닀음 위치로 읎동하는 방법읎 나와 있습니닀. RandomWalk2d읎동성몚덞 묌첎. 비교하닀
위의 묞자엎곌 예제 윔드에서 싀제로 사용한 묞자엎:

"/NodeList/7/$ns3::MobilityModel"

찚읎점은 두 개가 있닀는 사싀 때묞입니닀. 객첎 가젞였Ʞ 혞출은 발견된 묞자엎에 낎포되얎 있습니닀.
묞서에서. 첫 번짞는 $ns3::읎동성몚덞 에 대한 집계륌 쿌늬합니닀.
Ʞ볞 큎래슀. 두 번짞 암시 객첎 가젞였Ʞ 을 요구하닀 $ns3::RandomWalk2dMobilityModel,
Ʞ볞 큎래슀륌 구첎적읞 구현 큎래슀로 캐슀팅하는 데 사용됩니닀. 묞서
읎 두 가지 작업을 몚두 볎여쀍니닀. 싀제 추적 소슀는 닀음곌 같습니닀.
looking for 는 Ʞ볞 큎래슀에서 찟을 수 있습니닀.

추적 소슀 목록에 대한 "자섞한 섀명" 섹션을 자섞히 삎펎볎십시였.
당신은 발견 할 것읎닀
읎 유형에 대핮 정의된 TraceSource가 없습니닀.

TraceSource 한정된 in 부몚의 수업 ``ns3::읎동성몚덞``

· 윔슀변겜: 위치 및/또는 속도 벡터의 값읎 변겜되었습니닀.

윜백 서명: ns3::MobilityModel::CourseChangeCallback

읎것읎 바로 당신읎 알아알 할 것입니닀. ꎀ심 있는 추적 소슀는 닀음에서 찟을 수 있습니닀.
ns3::몚빌늬티몚덞 (얎찚플 당신도 알고 있었겠지만). 읎 API의 흥믞로욎 점은
묞서에 따륎멎 위의 구성 겜로에 추가 캐슀튞가 필요하지 않닀고 나와 있습니닀.
추적 소슀가 싀제로 Ʞ볞 큎래슀에 있윌므로 구첎적읞 큎래슀로 읎동합니닀.
귞러므로 추가적읞 객첎 가젞였Ʞ 필수는 아니며 닀음 겜로륌 사용하멎 됩니닀.

"/NodeList/[i]/$ns3::MobilityModel"

읎는 예제 겜로와 완벜하게 음치합니닀.

"/NodeList/7/$ns3::MobilityModel"

여닎윌로, 구성 겜로륌 찟는 또 닀륞 방법은 닀음곌 같습니닀. GREP 죌위에 NS-3 윔드베읎슀
읎믞 알아낞 누군가륌 위핎. 항상 닀륞 사람의 것을 복사하렀고 녞력핎알 합니닀.
자신의 윔드륌 작성하Ʞ 전에 작업 윔드. 닀음곌 같읎 시도핎 볎섞요.

$ ì°Ÿêž° . -읎늄 '*.cc' | xargs grep 곌정 변겜 | grep 연결

작업 윔드와 핚께 답을 찟을 수 있습니닀. 예륌 듀얎, 읎 겜우에는
src/읎동성/예제/main-random-topology.cc 당신읎 사용하Ʞ륌 Ʞ닀늬는 묎얞가가 있습니닀:

구성::연결("/NodeList/*/$ns3::MobilityModel/CourseChange",
MakeCallback(&CourseChange));

잠시 후에 읎 예제로 돌아갑니닀.

윜백 서명
ꎜ찮아, I 발견 a 더듬닀 and 전에, 구성 통로, 방법 do I 귞늌 아웃 뭐 전에, return 유형
and 형식적읞 읞수 of my 윜백 Ʞ능 필요한 것 에 있닀?

가장 쉬욎 방법은 윜백 서명을 검사하는 것입니닀. 형식 정의, 읎는
큎래슀에 대한 "자섞한 섀명"에서 추적 소슀의 "윜백 서명"은 닀음곌 같습니닀.
위에 표시된.

에서 "CourseChange" 추적 소슀 항목 반복 ns3::RandomWalk2d읎동성몚덞 we
있닀:

· 윔슀변겜: 위치 및/또는 속도 벡터의 값읎 변겜되었습니닀.

윜백 서명: ns3::MobilityModel::CourseChangeCallback

윜백 서명은 ꎀ렚 링크로 제공됩니닀. 형식 정의, 우늬가 찟는 ê³³
형식 정의 묎횚화 (* CourseChangeCallback)(const 표쀀::묞자엎 묞맥, 포읞튞
몚빌늬티몚덞> * 몚덞);

추적된 윜백 윔슀 변겜 알늌에 대한 서명입니닀.

윜백읎 닀음을 사용하여 연결된 겜우 컚텍슀튞 없읎 연결 생략 묞맥 의 죌장
서명.

파띌믞터:
[in] context Trace 소슀에서 제공하는 컚텍슀튞 묞자엎입니닀.
[in] model 겜로륌 변겜하는 MobilityModel입니닀.

위와 같읎 사용쀑읞 것을 볎렀멎 GREP 죌위에 NS-3 예륌 듀얎 윔드베읎슀륌 찞조하섞요. 예
위에서, ~로부터 src/읎동성/예제/main-random-topology.cc, "CourseChange"륌 연결합니닀.
소슀륌 추적 윔슀변겜 동음한 파음의 Ʞ능:

정적 공극
CourseChange(std::묞자엎 컚텍슀튞, Ptr 몚덞)
{
...
}

읎 Ʞ능은 닀음곌 같습니닀.

· 잠시 후에 섀명할 "컚텍슀튞" 묞자엎 읞수륌 사용합니닀. (윜백의 겜우
륌 사용하여 연결됩니닀. 컚텍슀튞 없읎 연결 Ʞ능 묞맥 죌장은
생략.)

· 읎동성 몚덞 마지막 읞수로 제공됚(또는 닀음곌 같은 겜우
컚텍슀튞 없읎 연결 사용).

· 반품 묎횚화.

우연히 윜백 서명읎 묞서화되지 않았고 읎에 대한 예제도 없는 겜우
올바륞 윜백 핚수 서명을 결정하는 것은 얎렀욞 수 있습니닀.
싀제로 소슀 윔드에서 파악하십시였.

윔드 연습을 시작하Ʞ 전에 친절하게 ê°„ë‹ší•œ 방법만 알렀드늬겠습니닀.
읎것을 알아낎Ʞ 위핎: 윜백의 반환 값은 항상 묎횚화. 공식
맀개변수 목록 추적된 윜백 템플늿 맀개변수 목록에서 찟을 수 있습니닀.
ì„ ì–ž. 현재 예에서는 닀음곌 같습니닀. 읎동성-model.h우늬가있는 ê³³
읎전에 닀음을 발견했습니닀.

추적된 윜백 > m_courseChangeTrace;

템플늿 맀개변수 목록 사읎에는 음대음 대응읎 있습니닀.
윜백 핚수의 ì„ ì–ž 및 형식 읞수입니닀. 여Ʞ, 하나 있얎요
템플늿 맀개변수는 포읞튞 몚빌늬티몚덞>. 읎것은 당신에게
void륌 반환하고 a륌 췚하는 핚수 포읞튞 몚빌늬티몚덞>. 예륌 듀멎 :

묎횚화
윔슀변겜(Ptr 몚덞)
{
...
}

넀가 원한닀멎 귞게 전부알 구성::ConnectWithoutContext. 맥띜을 원하시멎,
당신은 필요 구성::연결 묞자엎 컚텍슀튞륌 췚하는 윜백 핚수륌 사용한 닀음
템플늿 읞수:

묎횚화
CourseChange(const std::string 컚텍슀튞, Ptr 몚덞)
{
...
}

당신읎 당신의 CourseChange윜백 Ʞ능은 귀하의 앱에서만 볌 수 있습니닀.
로컬 파음에 킀워드륌 추가할 수 있습니닀. 정적 읞 귞늬고 생각핎 ë‚Žë‹€ :

정적 공극
CourseChange(const std::string 겜로, Ptr 몚덞)
{
...
}

읎것은 우늬가 ì„ž 번짞.cc 예.

싀시
읎 섹션은 전적윌로 선택 사항입니닀. 특히 귞런 사람듀에게는 욞퉁불퉁한 여정읎 될 것입니닀.
템플늿의 섞부 사항에 익숙하지 않습니닀. 귞러나 읎 곌정을 통곌하멎 닀음곌 같은 결곌륌 얻게 됩니닀.
많은 음을 아죌 잘 처늬핎 NS-3 낮은 수쀀의 ꎀ용얎.

귞래서 닀시 윜백 핚수의 서명읎 필요한지 알아 뎅시닀.
"CourseChange" 추적 소슀입니닀. 고통슀럜겠지만 읎것만 하멎 된닀
한 번. 읎 곌정을 거치고 나멎 닀음을 볌 수 있습니닀. 추적된 윜백 and
읎핎하닀.

가장 뚌저 삎펎뎐알 할 것은 추적 소슀의 선얞입니닀. 귞것을 Ʞ억핎
읎것은 안에 있닀 읎동성-model.h, 읎전에 찟은 낎용은 닀음곌 같습니닀.

추적된 윜백 > m_courseChangeTrace;

읎 선얞은 템플늿용입니닀. 템플늿 맀개변수는 꺟쇠ꎄ혞 안에 있습니닀.
귞래서 우늬는 귞것읎 묎엇읞지 알아낎는 데 정말로 ꎀ심읎 있습니닀. 추적된윜백<> 읎닀. 당신읎 가지고 있닀멎
읎게 얎디서 발견될지는 전혀 몚륎겠는데, GREP 당신의 친구입니닀.

우늬는 아마도 닀음곌 같은 종류의 선얞에 ꎀ심읎 있을 것입니닀. NS-3 출처, 귞래서
뚌저 로 변겜 SRC 예배 규칙서. 귞런 닀음 읎 선얞읎
음종의 헀더 파음에 있얎알 하므로 GREP 귞것을 위핎:

$ ì°Ÿêž° . -읎늄 '*.h' | xargs grep TracedCallback

303쀄읎 날아가는 것을 볌 수 있습니닀. wc 얌마나 나빎는지 알아볎Ʞ 위핎). 하지만
귞것은 많은 것처럌 볎음 수도 있지만 싀제로는 많은 것읎 아닙니닀. 출력을 파읎프로 연결하멎 됩니닀. ë°°ìš°êž° and
귞것을 통핎 슀캔을 시작합니닀. 첫 페읎지에서 맀우 의심슀러욎 몇 가지륌 볌 수 있습니닀.
템플늿처럌 볎읎는 것.

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

읎 몚든 것읎 헀더 파음에서 나옚 것윌로 밝혀졌습니닀. 추적된 윜백.h ì–Žë–€ 소늬가 나는지
맀우 유망합니닀. 귞런 닀음 닀음을 삎펎볌 수 있습니닀. 읎동성-model.h 귞늬고 쀄읎 있는 걞 볎섞요
읎 직감을 확읞합니닀.

#include "ns3/traced-callback.h"

묌론 닀륞 방향에서 읎 묞제륌 삎펎볎고 닀음을 삎펎볎는 것부터 시작할 수도 있습니닀.
에 포핚됩니닀 읎동성-model.h 귞늬고 닀음읎 포핚된 것을 확읞했습니닀. 추적된 윜백.h and
읎 파음읎 원하는 파음읎얎알 한닀고 추론합니닀.

두 겜우 몚두 닀음 닚계는 닀음을 삎펎볎는 것입니닀. src/윔얎/몚덞/traced-callback.h in
묎슚 음읎 음얎나고 있는지 확읞하Ʞ 위핎 가장 좋아하는 펞집자.

파음 상닚에 위안읎 될 만한 섀명읎 표시됩니닀.
ns3::TracedCallback은 음반적읞 ns3::Callback곌 거의 똑같은 API륌 가지고 있지만
혞출을 닚음 핚수로 전달하는 대신(음반적윌로 ns3::Callback읎 귞렇듯읎),
혞출을 ns3::Callback 첎읞윌로 전달합니닀.

읎것은 맀우 친숙하게 듀늎 것읎며 올바륞 Ꞟ을 가고 있음을 알렀쀄 것입니닀.

읎 댓Ꞁ 바로 뒀에는 닀음읎 표시됩니닀.

죌형
typename T3 = 비얎 있음, typename T4 = 비얎 있음,
typename T5 = 비얎 있음, typename T6 = 비얎 있음,
유형 읎늄 T7 = 비얎 있음, 유형 읎늄 T8 = 비얎 있음>
큎래슀 TracedCallback
{
...

읎는 TracedCallback읎 템플늿 큎래슀임을 알렀쀍니닀. 여덟 가지 가능한 유형읎 있습니닀.
Ʞ볞값읎 있는 맀개변수. 돌아가서 읎것을 당신의 선얞곌 비교하십시였.
읎핎하렀고:

추적된 윜백 > m_courseChangeTrace;

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 유형 읎늄 T1 템플늿 큎래슀 선얞은 닀음에 핎당합니닀. 포읞튞
몚빌늬티몚덞> 위 선얞에서. 닀륞 몚든 유형 맀개변수는 닀음곌 같읎 유지됩니닀.
Ʞ볞값. 생성자륌 볎멎 싀제로 많은 것을 알 수 없습니닀. 한 곳은
윜백 핚수와 추적 시슀템 간의 연결읎
FBI 슝였 범죄 볎고서 연결하Ʞ and 컚텍슀튞 없읎 연결 Ʞ능. 아래로 슀크례하멎 닀음곌 같은 낎용읎 표시됩니닀.
컚텍슀튞 없읎 연결 방법:

죌형
유형 읎늄 T3, 유형 읎늄 T4,
유형 읎늄 T5, 유형 읎늄 T6,
typename T7, typename T8>
묎횚화
TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::ConnectWithoutContext ...
{
Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> cb;
cb.할당(윜백);
m_callbackList.push_back(cb);
}

당신은 지ꞈ 짐승의 뱃속에 있습니닀. 템플늿읎 읞슀턎슀화되멎
위의 선얞은 컎파음러가 대첎합니닀. T1 곌 포읞튞 몚빌늬티몚덞>.

묎횚화
추적 윜백 ::ConnectWithoutContext ... cb
{
윜백 > CB;
cb.할당(윜백);
m_callbackList.push_back(cb);
}

읎제 우늬가 읎알Ʞ한 몚든 구현을 볌 수 있습니닀. 윔드
올바륞 유형의 윜백을 생성하고 여Ʞ에 핚수륌 할당합니닀. 읎것읎
동등한 플플 = 마읎펑션 읎 섹션의 시작 부분에서 녌의했습니닀. 윔드
귞런 닀음 읎 소슀에 대한 윜백 목록에 윜백을 추가합니닀. 낚은 걎
윜백의 정의륌 삎펎볎겠습니닀. 같은 것을 사용하여 GREP 우늬가 찟던 튾멭
추적된 윜백, 당신은 파음을 찟을 수 있습니닀 ./core/callback.h 우늬가 ê·ž 사람읎알
삎펎볌 필요가 있습니닀.

파음을 자섞히 삎펎볎멎 아마도 거의 읎핎할 수 없는 낎용읎 많읎 볎음 것입니닀.
템플늿 윔드. ê²°êµ­ 윜백에 대한 음부 API 섀명서에 도달하게 됩니닀.
귞러나 템플늿 큎래슀. 닀행히 영얎가 있습니닀.
윜백 템플늿 큎래슀.

읎 큎래슀 템플늿은 Functor 디자읞 팚턎을 구현합니닀. 선얞하는 데 사용됩니닀.
유형 윜백:

· 선택 사항읎 아닌 첫 번짞 템플늿 읞수는 윜백의 반환 유형을 나타냅니닀.

· 나뚞지(선택적) 템플늿 읞수는 후속 템플늿의 유형을 나타냅니닀.
윜백에 대한 읞수.

· 최대 XNUMX개의 읞수가 지원됩니닀.

우늬는 묎엇읎 묎엇읞지 알아낎렀고 녞력하고 있습니닀.

윜백 > CB;

ì„ ì–ž 수닚. 읎제 우늬는 첫 번짞(선택 사항 아님)
템플늿 읞수, 묎횚화는 윜백의 반환 유형을 나타냅니닀. 두번짞
(선택사항) 템플늿 읞수, 포읞튞 몚빌늬티몚덞> 첫 번짞 유형을 나타냅니닀.
윜백에 대한 읞수입니닀.

묞제의 윜백은 추적 읎벀튞륌 수신하는 Ʞ능입니닀. 읎것윌로부터 당신은 할 수 있습니닀
반환하는 핚수가 필요하닀고 추론 묎횚화 귞늬고 걞늜니닀 포읞튞 몚빌늬티몚덞>.
예륌 듀얎,

묎횚화
CourseChangeCallback(Ptr 몚덞)
{
...
}

넀가 원한닀멎 귞게 전부알 구성::ConnectWithoutContext. 맥띜을 원하시멎,
당신은 필요 구성::연결 묞자엎 컚텍슀튞륌 사용하는 윜백 핚수륌 사용합니닀. 읎것
왜냐하멎 연결하Ʞ Ʞ능읎 사용자에게 컚텍슀튞륌 제공합니닀. 너는 필요할거알:

묎횚화
CourseChangeCallback(std::묞자엎 컚텍슀튞, Ptr 몚덞)
{
...
}

당신읎 당신의 CourseChange윜백 로컬 파음에만 표시됩니닀.
킀워드륌 추가할 수 있습니닀 정적 읞 귞늬고 생각핎 ë‚Žë‹€ :

정적 공극
CourseChangeCallback(std::묞자엎 겜로, Ptr 몚덞)
{
...
}

읎것은 우늬가 ì„ž 번짞.cc 예. 아마도 당신은 지ꞈ 돌아가서
읎전 섹션을 닀시 읜윌십시였(Take My Word for It).

윜백 구현에 대한 자섞한 낎용에 ꎀ심읎 있윌시멎 얞제든지 묞의핎 죌섞요.
륌 삎펎볎Ʞ 위핎 NS-3 수동. 귞듀은 가장 자죌 사용되는 구조 쀑 하나입니닀.
낮은 수쀀의 부분 NS-3. 낮 생각에는 귞것은 ꜀ 우아한 음읎닀.

추적된 값
읎 섹션의 앞부분에서 우늬는 닀음을 사용하는 ê°„ë‹ší•œ 윔드륌 제시했습니닀.
추적된 값 추적 윔드의 Ʞ볞을 볎여쀍니닀. 우늬는 귞냥 얌버묎렞얎
TracedValue가 싀제로 묎엇읎며 읎에 대한 반환 유형 및 공식 읞수륌 찟는 방법
윜백.

앞서 얞꞉했듯읎 파음은 추적 값.h 추적에 필요한 선얞을 가젞옵니닀.
가치 의믞론을 따륎는 데읎터. 음반적윌로 값 의믞론은 닀음을 의믞합니닀.
객첎의 죌소륌 전달하는 대신 객첎 자첎륌 전달합니닀. 우늬는 연장한닀
할당 슀타음 연산자의 전첎 집합을 포핚핎알 하는 요구 사항은 닀음곌 같습니닀.
POD(Plain-Old-Data) 유형에 대핮 믞늬 정의됚:

┌────────────────────────────────┬─────────────┐
│operator = (곌제) │ │
├────────────────────────────────┌──────────────
│연산자*= │ 연산자/= │
├────────────────────────────────┌──────────────
│연산자+= │ 연산자-= │
├────────────────────────────────┌──────────────
│연산자++ (접두사 및 │ │
│접믞사) │ │
├────────────────────────────────┌──────────────
│욎영자-- (접두사 및 │ │
│접믞사) │ │
├────────────────────────────────┌──────────────
│연산자<<= │ 연산자>>= │
├────────────────────────────────┌──────────────
│연산자&= │ 연산자|= │
├────────────────────────────────┌──────────────
│연산자%= │ 연산자^= │
└────────────────────────────────┮─────────────┘

읎것읎 싀제로 의믞하는 바는 핎당 항목을 사용하여 읎룚얎진 몚든 변겜 사항을 추적할 수 있닀는 것입니닀.
값 의믞륌 갖는 C++ 개첎에 대한 연산자입니닀.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 추적된 값<> 위에서 볞 선얞은
위에서 얞꞉한 연산자륌 사용하고 윜백 프로섞슀륌 구동합니닀. 연산자륌 사용하는 겜우
위의 추적된 값 핎당 변수의 읎전 값곌 새 값을 몚두 제공합니닀.
읎 겜우 정수32_t 값. 의 검사로 추적된 값 ì„ ì–ž, 우늬는 알고있닀
추적 싱크 핚수에는 읞수가 있습니닀. (상수 정수32_t 였래된 값, const륌 정수32_t 새로욎 값).
에 대한 반환 유형 추적된 값 윜백 핚수는 항상 묎횚화, 귞래서 예상되는
윜백 서명은 닀음곌 같습니닀.

void (* TracedValueCallback)(const int32_t oldValue, const int32_t newValue);

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 .AddTraceSource FBI 슝였 범죄 볎고서 유형 ID 가젞였Ʞ 방법은 연결에 사용되는 "후크"륌 제공합니닀.
Config 시슀템을 통핎 소슀륌 왞부 섞계로 추적합니닀. 우늬는 읎믞 녌의
처음 ì„ž 가지 도구 추적 소슀 추가: 구성 시슀템의 속성 읎늄, 도움말
묞자엎 및 TracedValue 큎래슀 데읎터 멀버의 죌소입니닀.

예제의 마지막 묞자엎 읞수 "ns3::Traced::Value::Int32"는
형식 정의 윜백 핚수 서명용. 읎러한 서명을 정의핎알 합니닀.
정규화된 유형 읎늄을 추적 소슀 추가, API 묞서에서 닀음을 수행할 수 있습니닀.
추적 소슀륌 핚수 서명에 연결합니닀. TracedValue의 겜우 서명은 닀음곌 같습니닀.
똑바로; TracedCallbacks의 겜우 API 묞서가 싀제로 도움읎 되는 것을 읎믞 확읞했습니닀.

부동산 예시
TCP에 ꎀ한 가장 잘 알렀진 책 쀑 하나에서 가젞옚 예륌 듀얎 볎겠습니닀. "TCP/IP
W. Richard Stevens의 Illustrated, Volume 1: The Protocols"는 고전입니닀. 방ꞈ 뒀집었습니닀.
책읎 엎늬고 혌잡 찜곌 시퀀슀의 멋진 플롯을 가로질러 싀행되었습니닀.
366페읎지의 숫자 대 시간. Stevens는 읎륌 "귞늌 21.10. cwnd 및 시간의 값"읎띌고 부늅니닀.
데읎터가 전송되는 동안 시퀀슀 번혞륌 볎낎섞요." cwnd 부분을 닀시 만듀얎 볎겠습니닀.
ê·ž 음몚의 NS-3 추적 시슀템을 사용하고 귞누플롯.

유횚한 지우멎 좋을거같음 . SM
가장 뚌저 생각핎알 할 것은 데읎터륌 얎떻게 가젞올 것읞가 하는 것입니닀. 우늬는 묎엇입니까
추적핎알합니까? 따띌서 "몚든 추적 소슀" 목록을 찞조하여 ìž‘ì—…í•Žì•Œ 할 사항을 확읞하겠습니닀.
와 핚께. 읎 낎용은 닀음에서 찟을 수 있음을 Ʞ억하섞요. NS-3 API 묞서. 슀크례을 핎볎멎
목록에서 ê²°êµ­ 닀음을 찟을 수 있습니닀.
ns3::TcpNewReno

· 혌잡 ì°œ: TCP 연결의 혌잡 ì°œ

· SlowStart 임계값: TCP 느며 시작 임계값(바읎튞)

귞것은 NS-3 TCP 구현은 (대부분) 파음에 졎재합니닀.
src/읞터넷/몚덞/tcp-socket-base.cc 혌잡 제얎 변형은 닀음곌 같은 파음에 있습니닀.
as src/읞터넷/몚덞/tcp-newreno.cc. 읎것을 몚륞닀멎 a 사전,
재귀 GREP 장난:

$ ì°Ÿêž° . -읎늄 '*.cc' | xargs grep -i tcp

핎당 파음을 가늬킀는 tcp 읞슀턎슀의 페읎지륌 하나씩 찟을 수 있습니닀.

에 대한 수업 묞서 가젞였Ʞ TcpNewReno 귞늬고 목록윌로 걎너뛰Ʞ
당신읎 찟을 TraceSource
TraceSource

· 혌잡 ì°œ: TCP 연결의 혌잡 구간

윜백 서명: ns3::추적::값::Uint322Callback

윜백을 큎늭하멎 형식 정의 링크륌 큎늭하멎 읎제 예상할 수 있는 서명읎 표시됩니닀.

typedef void(* ns3::Traced::Value::Int32Callback)(const int32_t oldValue, const int32_t newValue)

읎제 읎 윔드륌 완전히 읎핎핎알 합니닀. 만앜 우늬가 포읞터륌 가지고 있닀멎 TcpNewReno,
우늬는 할 수있닀. TraceConnect 적절한 "CongestionWindow" 추적 소슀륌 제공하는 겜우
윜백 대상. 읎는 ê°„ë‹ší•œ 예에서 볞 것곌 동음한 종류의 추적 소슀입니닀.
우늬가 읎알Ʞ하고 있는 것을 제왞하고 읎 섹션의 시작 부분에 uint32_t 대신
정수32_t. 귞늬고 우늬는 ê·ž 서명곌 핚께 윜백 핚수륌 제공핎알 한닀는 것을 알고 있습니닀.

발견 예
수정할 수 있는 작업 윔드륌 찟는 것읎 항상 가장 좋습니닀.
처음부터 시작하는 것볎닀. 따띌서 읎제 비슈니슀의 첫 번짞 순서는 닀음곌 같은 윔드륌 찟는 것입니닀.
읎믞 "CongestionWindow" 추적 소슀륌 연결하고 수정할 수 있는지 확읞합니닀. 평소와 같읎
GREP 당신의 친구입니닀:

$ ì°Ÿêž° . -읎늄 '*.cc' | xargs grep CongestionWindow

읎는 몇 가지 유망한 후볎자륌 지적할 것입니닀: 예/tcp/tcp-large-transfer.cc
and src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc.

우늬는 아직 테슀튞 윔드륌 방묞하지 않았윌므로 귞곳을 삎펎볎겠습니닀. 당신은
음반적윌로 테슀튞 윔드가 상당히 작닀는 것을 알 수 있윌므로 읎는 아마도 맀우 좋은 선택음 것입니닀.
엜니닀 src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc 좋아하는 펞집Ʞ에서 닀음을 검색하섞요.
"혌잡 ì°œ". 당신은 발견 할 것읎닀,

ns3TcpSocket->TraceConnectWithoutContext("CongestionWindow",
MakeCallback(&Ns3TcpCwndTestCase1::CwndChange, 읎));

읎것은 당신에게 맀우 친숙핎 볎음 것입니닀. 위에서 얞꞉했듯읎
TcpNewReno, 우늬는 할 수 있었닀 TraceConnect "CongestionWindow" 추적 소슀로 읎동합니닀. 바로 ê·žê±°ì•Œ
우늬가 여Ʞ에 있는 것; 귞래서 읎 윔드 띌읞읎 정확히 우늬가 원하는 것을 한닀는 것읎 밝혀졌습니닀.
계속핎서 읎 핚수에서 필요한 윔드륌 추출핎 볎겠습니닀(Ns3TcpCwndTestCase1::도런
(묎횚의)). 읎 핚수륌 볎멎 마치 NS-3
슀크늜튞. 귞것읎 정확히 묎엇읞지 밝혀졌습니닀. 테슀튞에 의핎 싀행되는 슀크늜튞입니닀.
프레임워크륌 꺌낎얎 포장하멎 됩니닀. 볞ꎀ 대신에 도런. ꜀
읎 곌정을 닚계별로 진행하는 것볎닀 포팅 결곌로 생성된 파음을 제공했습니닀.
읎 테슀튞는 넀읎티람로 돌아갑니닀. NS-3 슀크늜튞 -- 예제/튜토늬얌/fifth.cc.

동적 더듬닀 지우멎 좋을거같음 . SM
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 닀섯번짞.cc 예는 반드시 읎핎핎알 하는 맀우 쀑요한 규칙을 볎여쀍니닀.
몚든 종류의 추적 소슀륌 사용하Ʞ 전에 닀음곌 같은 대상읎 있는지 확읞핎알 합니닀.
구성::연결 명령을 사용하Ʞ 전에 졎재합니닀. 읎것은 말하는 것곌 닀륎지 ì•Šë‹€.
개첎륌 혞출하Ʞ 전에 개첎륌 읞슀턎슀화핎알 합니닀. 읎것읎 명백핎 볎음지 몚륎지만
읎런 식윌로 말하멎 처음윌로 시슀템을 사용하렀는 많은 사람듀읎 걞렀 넘얎집니닀.
시간.

잠시 Ʞ볞윌로 돌아가자. 에 졎재하는 ì„ž 가지 Ʞ볞 싀행 닚계가 있습니닀.
ì–Žë–€ NS-3 슀크늜튞. 첫 번짞 닚계는 "구성 시간" 또는 "섀정"읎띌고도 합니닀.
시간"윌로 표시되며 핎당 êž°ê°„ 동안 졎재합니닀. 볞ꎀ 슀크늜튞 Ʞ능읎 싀행 쀑읎지만
전에 시뮬레읎터::싀행 혞출됩니닀. 두 번짞 닚계는 "시뮬레읎션 시간"읎띌고도 합니닀.
귞늬고 닀음곌 같은 êž°ê°„ 동안 졎재합니닀. 시뮬레읎터::싀행 적극적윌로 행사륌 진행하고 있습니닀.
시뮬레읎션 싀행읎 완료된 후, 시뮬레읎터::싀행 닀시 제얎권을 반환합니닀
전에, 볞ꎀ Ʞ능. 읎런 음읎 발생하멎 슀크늜튞는 "Teardown"
페읎슈(Phase)'는 섀정 곌정에서 생성된 구조묌곌 묌첎륌 분핎하고,
풀얎 놓았닀.

아마도 추적 시슀템을 사용하렀고 할 때 저지륎는 가장 음반적읞 싀수는 닀음곌 같닀고 가정하는 것입니닀.
동적윌로 생성된 엔터티 ...동안 시뮬레읎션 시간 구성 쀑에 사용할 수 있습니닀.
시간. 특히, NS-3 소쌓 자죌 생성되는 동적 개첎입니닀. 얎플늬쌀읎션 에
의사 소통 녾드. NS-3 얎플늬쌀읎션 항상 '시작 시간'곌 '쀑지'가 있습니닀.
시간"곌 ꎀ렚읎 있습니닀. 대부분의 겜우, 얎플늬쌀읎션 시도하지 않을 것입니닀
동적 객첎륌 생성하렀멎 응용 프로귞랚 시작 메서드는 음부 "시작"에서 혞출됩니닀.
시간". 읎는 앱읎 싀행되Ʞ 전에 시뮬레읎션읎 완전히 구성되었는지 확읞하Ʞ 위한 것입니닀.
(졎재하지 않는 녞드에 연결을 시도하멎 얎떻게 될까요?)
아직 구성하는 동안읞가요?). 결곌적윌로 구성 닚계에서는 닀음을 수행할 수 없습니닀.
추적 소슀 쀑 하나가 동적윌로 생성된 겜우 추적 소슀에 연결합니닀.
시뮬레읎션.

읎 수수께끌에 대한 두 가지 핎결책은 닀음곌 같습니닀.

1. 동적 객첎가 생성된 후 싀행되는 시뮬레읎터 읎벀튞륌 생성하고
핎당 읎벀튞가 싀행되는 시점을 추적합니닀. 또는

2. 구성 시 동적 개첎륌 생성하고 연결한 닀음 핎당 개첎륌
시뮬레읎션 시간 동안 사용할 시슀템.

우늬는 두 번짞 ì ‘ê·Œ 방식을 췚했습니닀. 닀섯번짞.cc 예. 읎 결정윌로 읞핎 우늬는
전에, 마읎앱 얎플늬쌀읎션, ê·ž 전첎 목적은 소쌓 맀개 변수로.

연습 : 닀섯번짞.cc
읎제 혌잡도륌 분석하여 구성한 예제 프로귞랚을 삎펎볎겠습니닀.
ì°œ 테슀튞. ì—Žë € 있는 예제/튜토늬얌/fifth.cc 좋아하는 펞집Ʞ에서. 넌 뎐알 핮
친숙핎 볎읎는 윔드:

/* -*- 몚드:C++; c-파음 슀타음:"gnu"; 듀여쓰Ʞ 탭 몚드:nil; -*- */
/*
* 읎 프로귞랚은 묎료 소프튞웚얎입니닀. 재배포 및/또는 수정할 수 있습니닀.
* 닀음곌 같읎 GNU General Public License 버전 2의 조걎에 따늅니닀.
* 자유 소프튞웚얎 재닚에서 발행;
*
* 읎 프로귞랚은 유용하게 사용되Ꞟ 바띌는 마음에서 배포되며,
* 귞러나 ì–Žë– í•œ 볎슝도 제공하지 않습니닀. 묵시적 볎슝도 없읎
* 상품성 또는 특정 목적에의 적합성. ì°žì¡°
* 자섞한 낎용은 GNU General Public License륌 찞조하십시였.
*
* GNU General Public License 사볞을 받았얎알 합니닀.
* 읎 프로귞랚곌 핚께; 귞렇지 않은 겜우 자유 소프튞웚얎에 ì“°êž°
* 재닚, 포핚., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

#포핚하닀
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"

넀임슀페읎슀 ns3 사용;

NS_LOG_COMPONENT_DEFINE("닀섯 번짞 슀크늜튞 예제");

읎 낎용은 몚두 닀룚었윌므로 닀시 섀명하지 않겠습니닀. 소슀의 닀음 쀄은
위에서 섀명한 묞제륌 핎결하는 넀튞워크 귞늌 및 섀명 소쌓.

// ================================================ ===========================
//
// 녾드 0 녾드 1
// +----------------+ +----------------+
// | NS-3 TCP | | NS-3 TCP |
// +----------------+ +----------------+
// | 10.1.1.1 | | 10.1.1.2 |
// +----------------+ +----------------+
// | 지점 간 | | 지점 간 |
// +----------------+ +----------------+
// | |
// +---------+
// 5Mbps, 2ms
//
//
// ns-3 TCP 혌잡 찜의 변겜 사항을 삎펎볎고자 합니닀. 우늬는 필요합니닀
// 흐늄을 시작하고 CongestionWindow 속성을 소쌓에 연결합니닀.
// 발신자. 음반적윌로 옚-였프 애플늬쌀읎션을 사용하여
// 흐늄읎지만 여Ʞ에는 몇 가지 묞제가 있습니닀. 뚌저 옚였프 소쌓입니닀.
// 애플늬쌀읎션은 애플늬쌀읎션 시작 시간까지 생성되지 않윌므로 생성되지 않습니닀.
// 구성 시 (읎제) 소쌓을 연결할 수 있습니닀. 둘짞, 비록 우늬가
// 시작 시간 읎후에 혞출을 쀀비할 수 있습니닀. 소쌓은 공개되지 않윌므로
// 도달할 수 없습니닀.
//
// 따띌서 우늬는 닀음 작업을 수행하는 ê°„ë‹ší•œ 버전의 옚-였프 애플늬쌀읎션을 만듀 수 있습니닀.
// 우늬는 원합니닀. 플러슀 잡멎에서 옚-였프의 몚든 복잡성읎 필요하지 않습니닀.
// 애플늬쌀읎션. 마읎너슀 잡에서는 도우믞가 없얎서 구핎알 합니닀.
// 섞부 사항에 좀 더 ꎀ여하지만 읎는 사소한 음입니닀.
//
// 뚌저 소쌓을 생성하고 귞에 대한 연결 추적을 수행합니닀. 귞럌 우늬는 통곌
// 읎 소쌓은 ê°„ë‹ší•œ 응용 프로귞랚의 생성자에 연결됩니닀.
// 소슀 녞드에 섀치합니닀.
// ================================================ ===========================
//

읎것은 또한 자명핎알 합니닀.

닀음 부분은 선얞묞읎닀. 마읎앱 얎플늬쌀읎션 우늬가 핚께 할 수 있도록
전에, 소쌓 구성 시 생성됩니닀.

큎래슀 MyApp : 공개 애플늬쌀읎션
{
공공의:

마읎앱();
가상 ~MyApp();

묎횚 섀정(Ptr 소쌓, 죌소 죌소, uint32_t packetSize,
uint32_t nPackets, DataRate dataRate);

비공개 :
가상 묎횚 StartApplication(묎횚);
가상 묎횚 StopApplication(묎횚);

묎횚 ScheduleTx (묎횚);
묎횚 SendPacket (묎횚);

포읞튞 m_socket;
죌소 m_peer;
uint32_t m_packetSize;
uint32_t m_n팚킷;
데읎터레읎튞 m_dataRate;
읎벀튞ID m_sendEvent;
bool m_running;
uint32_t m_packetsSent;
};

읎 큎래슀가 NS-3 얎플늬쌀읎션 수업. 볎섞요
src/넀튞워크/몚덞/application.h 상속받은 것에 ꎀ심읎 있닀멎. 귞만큌 마읎앱
큎래슀는 응용 프로귞랚 시작 and 애플늬쌀읎션 쀑지 행동 양식. 읎것듀
메서드는 닀음곌 같은 겜우 자동윌로 혞출됩니닀. 마읎앱 데읎터 전송을 시작하고 쀑지하는 데 필요합니닀.
시뮬레읎션 쀑에.

시작/쀑지 얎플늬쌀읎션
읎벀튞가 싀제로 얎떻게 시작되는지 섀명하는 데 앜간의 시간을 할애할 가치가 있습니닀.
첎계. 읎것은 또 닀륞 상당히 깊은 섀명읎며, 귞렇지 않은 겜우 묎시할 수 있습니닀.
시슀템의 낎부로 몚험을 떠날 계획입니닀. 귞러나 ê·ž 점에서는 유용합니닀.
토론은 닀음곌 같은 맀우 쀑요한 부분에 대핮 닀룹니닀. NS-3 작업하고 음부륌 녞출합니닀.
쀑요한 ꎀ용얎. 새로욎 몚덞을 구현할 계획읎띌멎 아마도 닀음을 수행하고 싶을 것입니닀.
읎 부분을 읎핎하십시였.

펌핑 읎벀튞륌 시작하는 가장 음반적읞 방법은 얎플늬쌀읎션. 읎는 닀음곌 같읎 수행됩니닀.
닀음곌 같은 (바띌걎대) 가족 띌읞의 결곌 NS-3 슀크늜튞:

ApplicationContainer 앱 = ...
apps.Start(쎈(1.0));
apps.Stop(쎈(10.0));

애플늬쌀읎션 컚테읎너 윔드(ì°žì¡°: src/넀튞워크/helper/application-container.h 당신읎있는 겜우
ꎀ심) 포핚된 응용 프로귞랚 및 혞출을 반복합니닀.

앱->SetStartTime(startTime);

의 결곌로 앱.시작 전화하고

앱->SetStopTime(stopTime);

의 결곌로 앱.쀑지 요구.

읎러한 혞출의 궁극적읞 결곌는 시뮬레읎터륌 자동윌로 갖Ʞ륌 원한닀는 것입니닀.
우늬에게 전화륌 걞얎 얎플늬쌀읎션 ì–žì œ 시작하고 멈출지 알렀쀍니닀. 의 겜우
마읎앱, 큎래슀에서 상속 얎플늬쌀읎션 귞늬고 재정의 응용 프로귞랚 시작및
애플늬쌀읎션 쀑지. 닀음은 시뮬레읎터에서 혞출할 핚수입니닀.
적절한 시간. 의 겜우 마읎앱 당신은 귞것을 찟을 것입니닀 MyApp::시작 응용 프로귞랚 하지
쎈Ʞ 바읞더및 연결하Ʞ 소쌓에서 닀음을 혞출하여 데읎터 흐늄을 시작합니닀.
MyApp::SendPacket. MyApp::쀑지응용프로귞랚 췚소하여 팚킷 생성을 쀑지합니닀.
볎류 쀑읞 볎낎Ʞ 읎벀튞는 소쌓을 닫습니닀.

좋은 점 쀑 하나는 NS-3 구현을 완전히 묎시할 수 있닀는 것입니닀
당신의 방법에 대한 섞부 사항 얎플늬쌀읎션 올바륞 위치에서 시뮬레읎터에 의핎 "자동윌로" 혞출됩니닀.
시간. 귞러나 우늬는 읎믞 깊읎 파고듀었Ʞ 때묞에 NS-3 읎믞, 귞것을 위핎 가자.

당신읎 볎멎 src/넀튞워크/몚덞/application.cc 당신은 시작 시간 섀정 방법
의 얎플늬쌀읎션 귞냥 멀버 변수륌 섀정 m_startTime 귞늬고 정지 시간 섀정 방법
귞냥 섀정 m_stopTime. 거Ʞ에서 힌튞가 없윌멎 아마도 튞레음읎 끝날 것입니닀.

튞레음을 닀시 선택하는 엎쇠는 몚든 튞랙의 Ꞁ로벌 목록읎 있닀는 것을 아는 것입니닀.
시슀템의 녾드. 시뮬레읎션에서 녞드륌 생성할 때마닀 핎당 녞드에 대한 포읞터
전역에 추가됩니닀 녾드 목록.

삎펎 src/넀튞워크/몚덞/node-list.cc 및 검색 녞드목록::추가. 공개
정적 구현은 닀음곌 같은 개읞 구현을 혞출합니닀. NodeListPriv::추가. 읎
에서 비교적 흔한 읎닎읎닀. NS-3. 귞러니 한번 삎펎볎섞요 NodeListPriv::추가. ê±°êž° 당신
찟을 것읎닀,

Simulator::ScheduleWithContext(읞덱슀, TimeStep(0), &Node::Initialize, 녾드);

읎는 시뮬레읎션에서 녞드가 생성될 때마닀 부작용윌로 혞출읎 발생핚을 알렀쀍니닀.
핎당 녞드에 쎈Ʞ화 시간 XNUMX에 발생하는 방법읎 예정되얎 있습니닀. 하지 ì•Šë‹€
아직 ê·ž 읎늄에 대핮 너묎 많은 낎용을 읜었습니닀. 읎는 녞드가 작업을 시작한닀는 의믞는 아닙니닀.
묎엇읎든 녞드에 대한 정볎 혞출로 핎석될 수 있습니닀.
녞드에 작업을 시작하띌고 지시하는 작업읎 아닌 시뮬레읎션읎 시작되었습니닀.

귞래서, 녞드목록::추가 간접적윌로 혞출을 예앜합니닀. 녾드::쎈Ʞ화 XNUMX시에 조얞을 하Ʞ 위핎
시뮬레읎션읎 시작된 새 녞드입니닀. 듀여닀볎멎 src/넀튞워크/몚덞/node.h 의견을 듣고 싶습니닀.
귞러나 닀음곌 같은 메소드륌 찟지 못할 것입니닀. 녾드::쎈Ʞ화. 귞것은
쎈Ʞ화 메소드는 큎래슀에서 상속됩니닀. 목적. 시슀템의 몚든 객첎는
시뮬레읎션읎 시작될 때 알늌을 받고 Node 큎래슀의 객첎는 ê·ž 쀑 한 종류음 뿐입니닀.
사묌.

삎펎 src/윔얎/몚덞/object.cc 닀음윌로 검색핎 볎섞요. 객첎::쎈Ʞ화. 읎 윔드
예상했던 것만큌 간닚하지 않습니닀. NS-3 사묌 SUPPORT
집합. 의 윔드 객첎::쎈Ʞ화 귞런 닀음 핎당 개첎륌 몚두 반복합니닀.
핚께 집계되얎 혞출됩니닀. 쎈Ʞ화륌 하섞요 방법. 읎것은 또 닀륞 ꎀ용구입니닀
귞것은 맀우 음반적입니닀 NS-3, 때로는 "템플늿 디자읞 팹턮"읎띌고도 합니닀.: 공개
구현 전반에 걞쳐 음정하게 유지되고
서람 큎래슀에 의핎 상속되고 구현되는 개읞 가상 구현 방법.
읎늄은 음반적윌로 닀음곌 같습니닀. 방법명 공개 API의 겜우 방법 읎늄 for
프띌읎빗 API.

읎는 우늬가 닀음을 ì°Ÿì•„ì•Œ 핚을 알렀쀍니닀. 녾드::DoInitialize 방법
src/넀튞워크/몚덞/node.cc 우늬의 흔적을 계속할 방법을 위핎. 위치륌 찟윌멎
윔드륌 사용하멎 녞드의 몚든 장치륌 반복하는 메서드륌 찟은 닀음
녾드 혞출의 몚든 애플늬쌀읎션 장치->쎈Ʞ화 and 응용프로귞랚->쎈Ʞ화
각각.

당신은 읎믞 ê·ž 수업을 알고있을 것입니닀 장치 and 얎플늬쌀읎션 둘 ë‹€ 큎래슀에서 상속 목적
귞래서 닀음 닚계는 응용 프로귞랚::쎈Ʞ화 is
띌고 불늬는. 볎섞요 src/넀튞워크/몚덞/application.cc 귞러멎 닀음을 찟을 수 있습니닀:

묎횚화
응용 프로귞랚::DoInitialize(묎횚)
{
m_startEvent = 시뮬레읎터::Schedule(m_startTime, &Application::StartApplication, this);
if (m_stopTime != TimeStep(0))
{
m_stopEvent = 시뮬레읎터::Schedule(m_stopTime, &Application::StopApplication, this);
}
객첎::DoInitialize ();
}

읎제 드디얎 Ꞟ읎 끝나는 지점에 읎륎렀습니닀. 몚든 것을 똑바로 유지했닀멎,
구현하닀 NS-3 얎플늬쌀읎션, 새 애플늬쌀읎션은 큎래슀에서 상속됩니닀. 얎플늬쌀읎션. 당신
재정의 응용 프로귞랚 시작 and 애플늬쌀읎션 쀑지 방법을 제공하고 메컀니슘을 제공합니닀.
새 데읎터 흐멄 시작 및 쀑지 얎플늬쌀읎션. 녞드가 있을 때
시뮬레읎션에서 생성되멎 전역에 추가됩니닀. 녾드 목록. 녞드륌 추가하는 행위
읎 녾드 목록 시뮬레읎터 읎벀튞륌 혞출하는 시간 XNUMX윌로 예앜되도록 합니닀.
녾드::쎈Ʞ화 시뮬레읎션 시작 시 혞출될 새로 추가된 Node의 메서드입니닀.
녾드는 목적, 읎는 닀음을 혞출합니닀. 객첎::쎈Ʞ화 녞드의 메소드
읎는 찚례로 닀음을 혞출합니닀. 쎈Ʞ화륌 하섞요 몚든 방법에 대한 사묌 에 집계
녾드(읎동성 몚덞 생각). 녾드 읎후 목적 재정의되었습니닀 쎈Ʞ화륌 하섞요귞
메서드는 시뮬레읎션읎 시작될 때 혞출됩니닀. 귞만큌 녾드::DoInitialize 메소드는
쎈Ʞ화 몚든 방법의 얎플늬쌀읎션 녞드에서. 부터 얎플늬쌀읎션 도 있습니닀
사묌, 읎로 읞핎 응용 프로귞랚::쎈Ʞ화 불늎. ì–žì œ
응용 프로귞랚::쎈Ʞ화 혞출되멎 닀음에 대한 읎벀튞륌 예앜합니닀. 응용 프로귞랚 시작 and
애플늬쌀읎션 쀑지 에 전화 얎플늬쌀읎션. 읎러한 혞출은 닀음을 시작하고 쀑지하도록 섀계되었습니닀.
데읎터의 흐멄 얎플늬쌀읎션

읎것은 ꜀ ꞎ 여정읎었지만 한 번만 수행하멎 됩니닀.
또 닀륞 맀우 깊은 부분을 읎핎하십시였 NS-3.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 마읎앱 얎플늬쌀읎션
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 마읎앱 얎플늬쌀읎션 묌론 생성자와 소멞자가 필요합니닀.

낎앱::낎앱 ()
: m_socket (0),
m_플얎(),
m_packetSize (0),
m_n팚킷 (0),
m_dataRate (0),
m_sendEvent(),
m_running (거짓),
m_packets전송됚 (0)
{
}

낎앱::~낎앱()
{
m_socket = 0;
}

닀음 윔드 비튞의 졎재가 우늬가 읎것을 작성한 전첎 읎유입니닀. 얎플늬쌀읎션 in
첫 번짞 장소.

묎횚화
MyApp::섀정(Ptr 소쌓, 죌소 죌소, uint32_t packetSize,
uint32_t nPackets, DataRate dataRate)
{
m_socket = 소쌓;
m_peer = 죌소;
m_packetSize = 팚킷 크Ʞ;
m_nPackets = n팚킷;
m_dataRate = dataRate;
}

읎 윔드는 섀명읎 맀우 ê°„ë‹ší•Žì•Œ 합니닀. 우늬는 멀버 변수륌 쎈Ʞ화하고 있습니닀.
추적의 ꎀ점에서 쀑요한 것은 포읞튞 소쌓 우늬는
구성 시간 동안 애플늬쌀읎션에 제공핎알 합니닀. 우늬가 간닀는 걞 Ʞ억핎
찜조하Ʞ 소쌓 등 Tcp소쌓 (읎는 닀음곌 같읎 구현됩니닀. TcpNewReno) 귞늬고 후크
"CongestionWindow" 추적 소슀륌 전달하Ʞ 전에 섀정 방법.

묎횚화
MyApp::StartApplication(묎횚)
{
m_running = 사싀;
m_packetsSent = 0;
m_socket->바읞드();
m_socket->연결(m_peer);
SendPacket();
}

위의 윔드는 재정의된 구현입니닀. 응용 프로귞랚::시작 응용 프로귞랚 귞럎거알.
시뮬레읎터에서 자동윌로 혞출하여 얎플늬쌀읎션 적절한 위치에서 싀행
시간. 당신은 귞것읎하는 것을 볌 수 있습니닀 소쌓 바읞더 작업. 당신읎 익숙하닀멎
버큎늬 소쌓(Berkeley Sockets) 읎것은 놀띌욎 음읎 아닙니닀. 로컬에서 필요한 작업을 수행합니닀.
예상대로 연결의 ìž¡ë©Ž. 닀음곌 같은 연결하Ʞ 묎엇을 할 것읞가
TCP와의 연결을 섀정하는 데 필요합니닀. 죌소 m_peer. 읎제 분명핎졌을 겁니닀
왜 우늬는 읎 많은 부분을 시뮬레읎션 시간윌로 ì—°êž°í•Žì•Œ ​​합니까? 연결하Ʞ 필요할 것읎닀
완벜하게 작동하는 넀튞워크륌 완성합니닀. 후 연결하ꞰWalk Through California 프로귞랚, 얎플늬쌀읎션 귞런 닀음 시작
혞출하여 시뮬레읎션 읎벀튞 생성 SendPacket.

닀음 윔드 비튞는 얎플늬쌀읎션 시뮬레읎션 읎벀튞 생성을 쀑지하는 방법.

묎횚화
MyApp::StopApplication(묎횚)
{
m_running = 거짓;

if (m_sendEvent.IsRunning())
{
시뮬레읎터::췚소(m_sendEvent);
}

if (m_소쌓)
{
m_socket->ë‹«êž°();
}
}

시뮬레읎션 읎벀튞가 예정될 때마닀 읎벀튞 생성됩니닀. 만앜 읎벀튞 볎류 쀑
싀행 또는 싀행, ê·ž 방법 싀행 쀑 돌아올거알. 찞된. 읎 윔드에서 만앜
싀행쀑() true륌 반환합니닀. 우늬는 췚소 시뮬레읎터 읎벀튞에서 제거하는 읎벀튞
대Ʞ쀄. 읎륌 통핎 우늬는 사걎의 연쇄륌 끊습니닀. 얎플늬쌀읎션 유지하는 데 사용하고 있습니닀
볎낎는 쀑 팚킷 귞늬고 얎플늬쌀읎션 조용히 ê°„ë‹€. 우늬가 조용히 한 후 얎플늬쌀읎션 we
ë‹«êž° TCP 연결을 끊는 소쌓.

소쌓은 싀제로 소멞자에서 삭제됩니닀. m_socket = 0 싀행됩니닀. 읎것
Ʞ볞 Ptr에 대한 마지막 찞조륌 제거합니닀. 소멞자륌 유발하는
혞출할 개첎입니닀.

늬윜 응용 프로귞랚 시작 띌는 SendPacket 섀명하는 음렚의 읎벀튞륌 시작합니닀.
전에, 얎플늬쌀읎션 행동.

묎횚화
MyApp::SendPacket(묎횚)
{
포읞튞 팚킷 = 생성 (m_packetSize);
m_socket->볎낎Ʞ(팚킷);

if (++m_packetsSent < m_nPackets)
{
ScheduleTx();
}
}

저Ʞ, ê·žê±° 볎읎시죠 SendPacket 귞렇게 합니닀. 귞것은 생성 팚킷 귞런 닀음 전송
Berkeley Sockets륌 알고 있닀멎 아마도 예상했던 바로 ê·ž 몚습음 것입니닀.

의 책임입니닀. 얎플늬쌀읎션 음렚의 읎벀튞 음정을 계속 계획하Ʞ 위핎
닀음 회선 전화 ScheduleTx 닀륞 전송 읎벀튞륌 예앜하렀멎(a SendPacket) 까지
얎플늬쌀읎션 충분히 볎냈닀고 판닚합니닀.

묎횚화
MyApp::ScheduleTx(묎횚)
{
겜우 (m_running)
{
시간 tNext(쎈(m_packetSize * 8 / static_cast (m_dataRate.GetBitRate ())));
m_sendEvent = 시뮬레읎터::Schedule(tNext, &MyApp::SendPacket, this);
}
}

저Ʞ, ê·žê±° 볎읎시죠 ScheduleTx 바로 귞런 음을 합니닀. 만앜 얎플늬쌀읎션 싀행 쀑입니닀(만앜
애플늬쌀읎션 쀑지 혞출되지 않음) 혞출되는 새 읎벀튞륌 예앜합니닀. SendPacket
닀시. 겜고륌 읜는 사람은 새로욎 사용자에게도 걞늌돌읎 되는 것을 발견할 것입니닀. 데읎터 속도
의 얎플늬쌀읎션 바로 귞것입니닀. Ʞ볞 데읎터 속도와 ꎀ렚읎 없습니닀.
채널. 읎는 얎플늬쌀읎션 비튞륌 생산합니닀. 귞것은 받아듀읎지 않는닀
전송하는 데 사용하는 닀양한 프로토윜읎나 채널에 대한 였버헀드륌 고렀합니닀.
데읎터. 데읎터 속도륌 섀정하멎 얎플늬쌀읎션 Ʞ볞 데읎터와 동음한 데읎터 속도로
채널 ê²°êµ­ 버퍌 였버플로가 발생합니닀.

더듬닀 싱크
읎 연습의 요점은 TCP에서 추적 윜백을 가젞였는 것입니닀.
혌잡 Ʞ간읎 업데읎튞되었습니닀. 닀음 윔드 조각은 핎당
추적 싱크:

정적 공극
CwndChange(uint32_t oldCwnd, uint32_t newCwnd)
{
NS_LOG_UNCOND (시뮬레읎터::Now ().GetSeconds () << "\t" << newCwnd);
}

읎것은 읎제 여러분에게 맀우 친숙할 것읎므로 자섞한 낎용은 닀룚지 않겠습니닀. 읎 Ʞ능
현재 시뮬레읎션 시간곌 정첎 찜의 새 값을 맀음 Ʞ록합니닀.
시간읎 변겜됩니닀. 결곌 출력을 로드할 수 있닀고 상상할 수 있습니닀.
귞래픜 프로귞랚(gnuplot 또는 Excel)에 입력하고 슉시 멋진 귞래프륌 볌 수 있습니닀.
시간 겜곌에 따륞 혌잡 ì°œ 동작.

팚킷읎 드롭되는 위치륌 표시하Ʞ 위핎 새로욎 튞레읎슀 싱크륌 추가했습니닀. 였류륌 추가하겠습니닀.
읎 윔드에도 적용할 수 있윌므로 읎 작업을 시연하고 싶었습니닀.

정적 공극
RxDrop(Ptr 플)
{
NS_LOG_UNCOND ("RxDrop at " << Simulator::Now ().GetSeconds ());
}

읎 튞레읎슀 싱크는 포읞튞 투 포읞튞의 "PhyRxDrop" 튞레읎슀 소슀에 연결됩니닀.
NetDevice. 읎 추적 소슀는 넀튞워크의 묌늬적 계잵에서 팚킷읎 삭제될 때 싀행됩니닀.
NetDevice. 소슀륌 조ꞈ만 우회하멎
(src/점대점/몚덞/점대점-net-device.cc) 읎 추적읎
출처는 ì°žì¡° PointToPointNetDevice::m_phyRxDropTrace. 귞럌 듀여닀볎멎
src/점대점/몚덞/점대점-net-device.h 읎 멀버 변수에 대핮
로 선얞되얎 있음을 알 수 있습니닀. 추적 윜백 팚킷> >. 읎것은 당신에게 말핎알합니닀
윜백 대상은 void륌 반환하고 닚음
파띌믞터는 포읞튞 팚킷> (우늬가 사용한닀고 가정 컚텍슀튞 없읎 연결) -- 닚지
우늬가 위에 있는 것.

볞ꎀ 프로귞랚
닀음 윔드는 읎제 맀우 친숙할 것입니닀.

INT
메읞(int argc, char *argv[])
{
NodeContainer 녾드;
녾드.만듀Ʞ(2);

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

NetDeviceContainer 장치;
장치 = pointToPoint.Install(녾드);

읎렇게 하멎 귞늌곌 같읎 두 녾드 사읎에 점대점 채널읎 있는 두 개의 녞드가 생성됩니닀.
파음 시작 부분의 귞늌.

닀음 몇 쀄의 윔드는 새로욎 것을 볎여쀍니닀. 동작하는 연결을 추적하멎
완벜하게, 우늬는 닚조롭게 슝가하는 혌잡 찜윌로 끝날 것입니닀. 묎엇읎든 볎렀멎
흥믞로욎 행동, 우늬는 정말로 팚킷을 떚얎뜚늬는 링크 였류륌 도입하고 싶습니닀.
쀑복 ACK륌 발생시킀고 혌잡 찜의 볎닀 흥믞로욎 동작을 튞늬거합니닀.

NS-3 제공 였류몚덞 붙음 수 있는 묌걎 채널. 우늬는
비윚 였류 몚덞 읎는 우늬가 였류륌 채널 죌얎진 시간에 윚.

Ptr em = CreateObject ();
em->SetAttribute ("ErrorRate", DoubleValue (0.00001));
devices.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em));

위의 윔드는 비윚 였류 몚덞 객첎, "ErrorRate"륌 섀정합니닀. 속성
원하는 값윌로. 귞런 닀음 읞슀턎슀화된 결곌륌 섀정합니닀. 비윚 였류 몚덞 였류로
point-to-point에서 사용하는 몚덞 NetDevice. 읎것은 우늬에게 앜간의 재전송을 제공하고
플롯을 좀 더 흥믞롭게 만듭니닀.

InternetStackHelper 슀택;
stack.Install(녾드);

Ipv4AddressHelper 죌소;
address.SetBase("10.1.1.0", "255.255.255.252");
Ipv4InterfaceContainer 읞터페읎슀 = address.Assign(장치);

위의 윔드는 익숙할 것입니닀. 두 녞드에 읞터넷 슀택을 섀치하고
읞터페읎슀륌 생성하고 지점 간 장치에 대한 IP 죌소륌 할당합니닀.

TCP륌 사용하고 있윌므로 TCP륌 수신하렀멎 대상 녞드에 묎얞가가 필요합니닀.
연결 및 데읎터. 귞만큌 팚킷싱크 얎플늬쌀읎션 에서 음반적윌로 사용되는 NS-3 귞에 대한
목적.

uint16_t 싱크포튞 = 8080;
죌소 sinkAddress(InetSocketAddress(interfaces.GetAddress(1), sinkPort));
PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory",
InetSocketAddress(Ipv4Address::GetAny(), 싱크포튞));
ApplicationContainer sinkApps = packetSinkHelper.Install(nodes.Get(1));
sinkApps.Start(쎈(0.));
sinkApps.Stop(쎈(20.));

닀음을 제왞하고 몚두 친숙핎알 합니닀.

PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory",
InetSocketAddress(Ipv4Address::GetAny(), 싱크포튞));

읎 윔드는 팚킷 싱크 도우믞 큎래슀륌 사용하여 소쌓을 생성하도록 지시합니닀.
ns3::TcpSocketFactory. 읎 큎래슀는 "객첎 팩토늬"띌는 디자읞 팚턎을 구현합니닀.
읎는 객첎륌 생성하는 데 사용되는 큎래슀륌 지정하Ʞ 위핎 음반적윌로 사용되는 메컀니슘입니닀.
추상적읞 방법. 여Ʞ서 객첎 자첎륌 생성하는 대신 닀음을 제공합니닀.
팚킷 싱크 도우믞 륌 지정하는 묞자엎 유형 ID 객첎륌 생성하는 데 사용되는 묞자엎
귞런 닀음 팩토늬에서 생성된 객첎의 읞슀턎슀륌 생성하는 데 사용할 수 있습니닀.

나뚞지 맀개변수는 얎플늬쌀읎션 ì–Žë–€ 죌소와 포튞가 바읞더 에.

닀음 두 쀄의 윔드는 소쌓을 만듀고 추적 소슀륌 연결합니닀.

Ptr ns3TcpSocket = 소쌓::CreateSocket(nodes.Get(0),
TcpSocketFactory::GetTypeId ());
ns3TcpSocket->TraceConnectWithoutContext("CongestionWindow",
MakeCallback(&CwndChange));

첫 번짞 묞은 정적 멀버 핚수륌 혞출합니닀. 소쌓::CreateSocket 제공합니닀
녾드 및 명시적 유형 ID 소쌓을 만드는 데 사용되는 개첎 팩터늬에 대핮. 읎것은
윜볎닀 앜간 낮은 레벚 팚킷 싱크 도우믞 위의 혞출 및 명시적 C++ 사용
묞자엎읎 찞조하는 유형 대신 유형. 귞렇지 않윌멎 개념적윌로 동음합니닀.
맡은 음.

한 번 Tcp소쌓 생성되얎 녞드에 연결되멎 사용할 수 있습니닀.
TraceConnectWithoutContext CongestionWindow 추적 소슀륌 추적 싱크에 연결합니닀.

우늬가 얎플늬쌀읎션 귞래서 우늬는 귞것을 ì·ší•  수 소쌓 우늬는 방ꞈ (동안
구성 시간) 시뮬레읎션 시간에 사용하십시였. 읎제 읞슀턎슀화핎알 합니닀.
얎플늬쌀읎션. 우늬는 얎플늬쌀읎션 so
"수동윌로" 만듀고 섀치핎알 합니닀. 읎것은 싀제로 맀우 쉜습니닀.

Ptr 앱 = CreateObject ();
앱->섀정(ns3TcpSocket, sinkAddress, 1040, 1000, DataRate("1Mbps"));
nodes.Get (0)->AddApplication(앱);
앱->시작(쎈(1.));
앱->쀑지(쎈(20.));

첫 번짞 쀄은 목적 유형의 마읎앱 -- 우늬의 얎플늬쌀읎션. 두 번짞 쀄읎 알렀쀍니닀.
전에, 얎플늬쌀읎션 뭐 소쌓 사용할 죌소, 연결할 죌소, 전송할 데읎터 양
각 전송 읎벀튞, 생성할 전송 읎벀튞 수 및 데읎터 생성 속도
ê·ž 사걎듀로부터.

닀음윌로 수동윌로 추가합니닀. 마읎앱 얎플늬쌀읎션 소슀 녞드에 명시적윌로
슀타튞 and 쀑지 에 대한 방법 얎플늬쌀읎션 작업을 시작하고 쀑지할 때륌 알렀쀍니닀.
맡은 음.

싀제로 늬시버 지점 간 연결을 수행핎알 합니닀. NetDevice 드롭 읎벀튞
우늬에게 RxDrop 지ꞈ 윜백하섞요.

devices.Get (1)->TraceConnectWithoutContext("PhyRxDrop", MakeCallback (&RxDrop));

읎제 우늬가 수신에 대한 찞조륌 얻고 있닀는 것읎 분명핎알 합니닀. 녾드 NetDevice
컚테읎너에서 "PhyRxDrop" 속성윌로 정의된 추적 소슀륌 연결합니닀.
추적 싱크에 핎당 장치 RxDrop.

마지막윌로 시뮬레읎터에 몚든 것을 재정의하도록 지시합니닀. 얎플늬쌀읎션 귞냥 처늬륌 쀑지
시뮬레읎션윌로 20쎈의 읎벀튞.

시뮬레읎터::쀑지(쎈(ì‚Œ));
시뮬레읎터::싀행();
시뮬레읎터::파ꎎ();

0가 돌아;
}

음닚 Ʞ억핎 시뮬레읎터::싀행 혞출되고 구성 시간읎 종료되고 시뮬레읎션
시간읎 시작됩니닀. 우늬가 만든 몚든 작업은 얎플늬쌀읎션 귞늬고 귞것을 가륎치는
데읎터륌 연결하고 볎낎는 방법은 싀제로 읎 핚수 혞출 쀑에 발생합니닀.

자마자 시뮬레읎터::싀행 돌아였멎 시뮬레읎션읎 완료되고 분핎에 듀얎갑니닀.
닚계. 읎 겜우, 시뮬레읎터::파ꎎ 플투성읎의 섞부 사항을 처늬하고 우늬는 귞냥 돌아갑니닀
완료 후 성공 윔드.

달늬는 닀섯번짞.cc
파음을 제공했Ʞ 때묞에 닀섯번짞.cc 배포판을 구축한 겜우(in
사용하Ʞ 때묞에 디버귞 몚드 NS_LOG -- 최적화된 빌드가 최적화됚을 Ʞ억하십시였. NS_LOG) 귞것
달렀갈 당신을 Ʞ닀늬고 있을 것입니닀.

$ ./waf --닀섯 번짞 싀행
Waf: `/home/craigdo/repos/ns-3-allinone-dev/ns-3-dev/build' 디렉토늬 입력 쀑
Waf: `/home/craigdo/repos/ns-3-allinone-dev/ns-3-dev/build' 디렉토늬에서 나가Ʞ
'빌드'가 성공적윌로 완료되었습니닀(0.684쎈).
1 536
1.0093 1072
1.01528 1608
1.02167 2144
...
1.11319 8040
1.12151 8576
1.12983 9112
1.13696에서 RxDrop
...

튞레읎슀에서 몚든 종류의 읞쇄묌을 사용하는 것의 닚점을 슉시 알 수 있습니닀.
흥믞로욎 정볎 전첎에 읞쇄된 ꎀ렚 없는 WAF 메시지륌 얻습니닀.
ê·ž RxDrop 메시지와 핚께. 우늬는 곧 귞것을 ê³ ì¹  것읎지만 나는 당신읎 볎고 싶얎 Ʞ닀늎 수 없닀고 확신
읎 몚든 작업의 ​​결곌. 핎당 출력을 닀음 파음로 늬디렉션하겠습니닀. cwnd.dat:

$ ./waf -- 닀섯 번짞 싀행 > cwnd.dat 2>&1

읎제 좋아하는 펞집Ʞ에서 "cwnd.dat"륌 펞집하고 waf 빌드 상태륌 제거하고 드롭합니닀.
추적된 데읎터만 ë‚šêž°ê³  띌읞을 죌석 처늬할 수도 있습니닀.
TraceConnectWithoutContext("PhyRxDrop", MakeCallback (&Rx드롭)); 없애Ʞ 위핎 슀크늜튞에서
방욞읎 쉜게 읞쇄됩니닀.

읎제 gnuplot을 싀행하고(섀치된 겜우) 예쁜 파음을 생성하도록 지시할 수 있습니닀.
영화:

$ gnuplot
gnuplot> 터믞널 png 크Ʞ 640,480 섀정
gnuplot> 출력 "cwnd.png" 섀정
gnuplot> 띌읞 포읞튞가 있는 1:2 제목 '혌잡 ì°œ'을 사용하여 "cwnd.dat" 플롯
gnuplot> 종료

읎제 혌잡 ì°œ 대 파음에 앉아 있는 시간의 귞래프가 있얎알 합니닀.
"cwnd.png" loading="lazy"는 닀음곌 같습니닀.
[읎믞지]

사용 쀑간 수쀀 도우믞
읎전 섹션에서 우늬는 추적 소슀륌 후킹하고 희망적윌로 얻는 방법을 볎여죌었습니닀.
시뮬레읎션에서 나옚 흥믞로욎 정볎. 아마도 당신은 우늬가 전화했던 것을 Ʞ억할 것입니닀.
닀음을 사용하여 표쀀 출력에 로깅 표쀀::ì»· 읎볎닀 훚씬 앞선 "묎뚝뚝한 도구"
장. 또한 로귞 출력을 순서대로 구묞 분석핎알 하는 묞제에 대핎서도 썌습니닀.
흥믞로욎 정볎륌 분늬합니닀. 우늬가 방ꞈ 많은 돈을 썌닀는 생각읎 듀었을 수도 있습니닀.
우늬가 핎결하렀는 몚든 묞제륌 볎여죌는 예제륌 구현하는 시간
전에, NS-3 추적 시슀템! 당신 말읎 맞을 것입니닀. 하지만 찞아죌섞요. 아직 끝나지 않았습니닀.

우늬가 하고 싶은 가장 쀑요한 음 쀑 하나는 쉜게 할 수 있는 능력을 갖는 것입니닀.
시뮬레읎션에서 나였는 출력의 양을 제얎합니닀. 귞늬고 우늬는 또한 귞것듀을 저장하고 싶습니닀
나쀑에 닀시 ì°žì¡°í•  수 있도록 데읎터륌 파음로 저장합니닀. 쀑간 수쀀의 추적 도우믞륌 사용할 수 있습니닀.
제공 NS-3 귞냥 귞렇게하고 귞늌을 완성합니닀.

예제에서 개발한 cwnd change 및 drop 읎벀튞륌 작성하는 슀크늜튞륌 제공합니닀.
닀섯번짞.cc 별도의 파음로 디슀크에 저장합니닀. cwnd 변겜 사항은 탭윌로 구분된 ASCII 형식윌로 저장됩니닀.
파음곌 삭제 읎벀튞는 PCAP 파음에 저장됩니닀. 읎륌 싀현하Ʞ 위한 변겜 사항은 닀음곌 같습니닀.
꜀ 작은.

연습 : 여섯번짞.cc
에서 읎동하는 데 필요한 변겜 사항을 삎펎볎겠습니닀. 닀섯번짞.cc 에 여섯번짞.cc. ì—Žë‹€
예제/튜토늬얌/sixth.cc 좋아하는 펞집Ʞ에서. 당신은 첫 번짞 변화륌 볌 수 있습니닀
CwndChange륌 검색합니닀. 추적에 대한 서명읎 변겜되었음을 알 수 있습니닀.
싱크하고 추적된 정볎륌
파음을 나타낮는 슀튞늌.

정적 공극
CwndChange(Ptr 슀튞늌, uint32_t oldCwnd, uint32_t newCwnd)
{
NS_LOG_UNCOND (시뮬레읎터::Now ().GetSeconds () << "\t" << newCwnd);
*stream->GetStream () << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;
}

정적 공극
RxDrop(Ptr 파음, 태평양 표쀀시 플)
{
NS_LOG_UNCOND ("RxDrop at " << Simulator::Now ().GetSeconds ());
file->Write(Simulator::Now(), p);
}

"stream" 맀개변수륌 추가했습니닀. CwndChange 추적 싱크. 읎것은 개첎입니닀
C++ 출력 슀튞늌을 볎유(안전하게 유지)합니닀. 읎것은 맀우 간닚하닀는 것읎 밝혀졌습니닀.
개첎읎지만 슀튞늌의 수명 묞제륌 ꎀ늬하고 묞제륌 핎결하는 개첎입니닀.
숙렚된 C++ 사용자가 싀행합니닀. 에 대한 복사 생성자가 표쀀::ostream
비공개로 표시됩니닀. 읎것은 std::ostream 값 의믞론을 따륎지 않고 할 수 없습니닀.
슀튞늌을 복사핎알 하는 몚든 메컀니슘에서 사용할 수 있습니닀. 여Ʞ에는 NS-3
Ʞ억할 수 있는 윜백 시슀템에는 값 의믞 첎계륌 따륎는 개첎가 필요합니닀.
닀음 쀄을 추가했습니닀. CwndChange 튞레읎슀 싱크
읎행:

*stream->GetStream () << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;

교첎하멎 맀우 친숙한 윔드가 됩니닀. *stream->GetStream () 곌 표쀀::ì»·, 같읎
에서:

std::cout << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;

읎것은 Ptr 정말 귞냥 듀고 닀니고
표쀀::슀튞늌 당신을 위핎 여Ʞ에서 닀륞 출력 슀튞늌처럌 사용할 수 있습니닀.

에서도 비슷한 상황읎 발생합니닀. RxDrop 전달되는 개첎륌 제왞하고 (a
Ptr)은 PCAP 파음을 나타냅니닀. 추적 싱크에 한 쀄짜늬가 있습니닀.
드롭되는 팚킷의 타임슀탬프와 낎용을 PCAP 파음에 Ʞ록합니닀.

file->Write(Simulator::Now(), p);

묌론 두 파음을 나타낮는 개첎가 있윌멎 얎딘가에 만듀얎알 합니닀.
또한 추적 싱크로 전달되도록 합니닀. 에서 볎멎 볞ꎀ Ʞ능,
읎륌 수행하는 새 윔드륌 찟을 수 있습니닀.

AsciiTraceHelper asciiTraceHelper;
Ptr stream = asciiTraceHelper.CreateFileStream("sixth.cwnd");
ns3TcpSocket->TraceConnectWithoutContext("CongestionWindow", MakeBoundCallback(&CwndChange, 슀튞늌));

...

PcapHelper pcapHelper;
Ptr file = pcapHelper.CreateFile("sixth.pcap", std::ios::out, PcapHelper::DLT_PPP);
devices.Get (1)->TraceConnectWithoutContext("PhyRxDrop", MakeBoundCallback (&RxDrop, 파음));

위 윔드 슀니펫의 첫 번짞 섹션에서 ASCII 추적 파음을 생성합니닀.
귞것을 ꎀ늬하고 윜백의 변형을 사용하는 객첎 생성
개첎가 싱크로 전달되도록 정렬하는 생성 Ʞ능. ASCII 추적
도우믞는 텍슀튞(ASCII) 파음을 쉜게 사용할 수 있도록 닀양한 Ʞ능을 제공합니닀. 우늬는
여Ʞ서는 파음 슀튞늌 생성 Ʞ능의 사용을 섀명하겠습니닀.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 파음슀튞늌 생성 핚수는 Ʞ볞적윌로 표쀀::슀튞늌 개첎 및
새 파음을 생성하거나 êž°ì¡Ž 파음을 자늅니닀. 읎것 표쀀::슀튞늌 에 포장되얎 있습니닀
NS-3 수명 ꎀ늬 및 복사 생성자 묞제 핎결을 위한 개첎입니닀.

귞러멎 우늬는 읎것을 NS-3 파음을 나타낮는 객첎륌 전달합니닀. MakeBoundCallback().
읎 핚수는 닀음곌 같읎 윜백을 생성합니닀. 메읎크윜백()하지만 새 값을 닀음에 "바읞딩"합니닀.
윜백. 읎 값은 윜백읎 싀행되Ʞ 전에 첫 번짞 읞수로 추가됩니닀.
전화했닀.

Ʞ볞적윌로, MakeBoundCallback(&CwndChange, 개욞) 추적 소슀가
혞출하Ʞ 전에 공식 맀개변수 목록 앞에 추가 "stream" 맀개변수
윜백. 읎렇게 하멎 필요한 서명읎 변겜됩니닀. CwndChange 하나에 맞게 싱크대
위에 표시된 "extra" 맀개변수 포핚 Ptr 흐멄.

위 슀니펫 윔드의 두 번짞 섹션에서 PcapHelper 을 할 수
PCAP 추적 파음에 대핮 동음한 작업을 수행했습니닀. AsciiTraceHelper. 의 띌읞
윔드

Ptr 파음 = pcapHelper.CreateFile("sixth.pcap",
"w", PcapHelper::DLT_PPP);

파음 몚드가 "w"읞 "sixth.pcap"읎띌는 PCAP 파음을 생성합니닀. 슉, 새 파음
핎당 읎늄을 가진 êž°ì¡Ž 파음읎 발견되멎 잘늜니닀(ë‚Žìš© 삭제). 마지막
맀개변수는 새 PCAP 파음의 "데읎터 링크 유형"입니닀. 읎듀은 PCAP와 동음합니닀.
닀음에 정의된 띌읎람러늬 데읎터 링크 유형 bpf.h PCAP에 익숙한 겜우. 읎 겜우,
DLT_PPP PCAP 파음읎 가늬킀는 접두사가 붙은 팚킷을 포핚할 것임을 나타냅니닀.
포읞튞 헀더. 팚킷읎 지점 간 장치에서 였Ʞ 때묞에 읎것은 사싀입니닀.
욎전사. 닀륞 음반적읞 데읎터 링크 유형은 csma에 적합한 DLT_EN10MB(10MB 읎더넷)입니닀.
Wi-Fi 장치에 적합한 장치 및 DLT_IEEE802_11(IEEE 802.11). 읎듀은 정의됩니닀
in src/넀튞워크/helper/trace-helper.h 당신읎 목록을 볎는 데 ꎀ심읎 있닀멎. 귞만큌
목록의 항목은 bpf.h 귞러나 PCAP 소슀륌 플하Ʞ 위핎 복제합니닀.
의졎.

A NS-3 PCAP 파음을 나타낮는 개첎는 닀음에서 반환됩니닀. CreateFile 바욎드에서 사용
윜백은 ASCII 겜우와 동음합니닀.

쀑요한 우회로: 읎 두 개첎가 몚두
맀우 유사한 방식윌로 선얞했습니닀.

Ptr 파음 ...
Ptr 개욞 ...

Ʞ볞 개첎는 완전히 닀늅니닀. 예륌 듀얎, Ptr 하는
에 대한 슀마튞 포읞터 NS-3 지지하는 상당히 묎거욎 묌첎
속성 및 구성 시슀템에 통합됩니닀. 귞만큌 Ptr,에
반멎에 맀우 가벌욎 ì°žì¡° 칎욎튞 객첎에 대한 슀마튞 포읞터입니닀.
묌걎. ì–Žë–€ 가정을 하Ʞ 전에 찞조하는 개첎륌 확읞핎알 합니닀.
개첎가 가질 수 있는 "권한"에 대핮.

예륌 듀얎 src/넀튞워크/utils/pcap-file-wrapper.h 유통 및
알아 채닀,

큎래슀 PcapFileWrapper : 공용 개첎

ê·ž 수업 Pcap파음래퍌 는 Teledyne LeCroy 였싀로슀윔프 및 LSA-XNUMX 시늬슈 임베디드 신혞 분석Ʞ가 NS-3 상속 덕분에 객첎. 귞럌 뎐
src/넀튞워크/몚덞/output-stream-wrapper.h 귞늬고 죌목,

큎래슀 OutputStreamWrapper : 공개
SimpleRefCount

읎 개첎가 NS-3 개첎는 "닚순히" C++ 개첎입니닀.
칚입 ì°žì¡° 칎욎팅을 지원합니닀.

여Ʞ서 요점은 당신읎 읜Ʞ 때묞에 Ptr 반드시 귞런 뜻은 아니닀
ê·ž 묎얞가 는 Teledyne LeCroy 였싀로슀윔프 및 LSA-XNUMX 시늬슈 임베디드 신혞 분석Ʞ가 NS-3 걞 수 있는 묌걎 NS-3 예륌 듀얎 속성.

읎제 예로 돌아가겠습니닀. 읎 예제륌 빌드하고 싀행하멎,

$ ./waf --XNUMX번짞 싀행

"fifth"륌 싀행했을 때와 동음한 메시지가 표시되지만 두 개의 새 파음읎
최상위 디렉토늬에 나타납니닀. NS-3 유통.

여섯 번짞.cwnd 여섯 번짞.pcap

"sixth.cwnd"는 ASCII 텍슀튞 파음읎므로 닀음곌 같읎 볌 수 있습니닀. 방법 또는 좋아하는 파음
ë·°ì–Ž.

+ 1 0 536
+ 1.0093 536 1072
+ 1.01528 1072 1608
+ 1.02167 1608 2144
...
+ 9.69256 5149 5204
+ 9.89311 5204 5259

타임슀탬프가 있는 탭윌로 구분된 파음, 읎전 정첎 êž°ê°„ 및 새
플롯 프로귞랚윌로 직접 가젞였Ʞ에 적합한 혌잡 ì°œ. 없닀
파음의 ꎀ렚 없는 읞쇄, 구묞 분석 또는 펞집읎 필요하지 않습니닀.

"sixth.pcap"은 PCAP 파음읎므로 TCP 덀프.

파음 six.pcap에서 읜Ʞ, 링크 유형 PPP(PPP)
1.136956 IP 10.1.1.1.49153 > 10.1.1.2.8080: 플래귞 [.], 시퀀슀 17177:17681, ack 1, win 32768, 옵션 [TS val 1133 ecr 1127,eol], Ꞟ읎 504
1.403196 IP 10.1.1.1.49153 > 10.1.1.2.8080: 플래귞 [.], 시퀀슀 33280:33784, ack 1, win 32768, 옵션 [TS val 1399 ecr 1394,eol], Ꞟ읎 504
...
7.426220 IP 10.1.1.1.49153 > 10.1.1.2.8080: 플래귞 [.], 시퀀슀 785704:786240, ack 1, win 32768, 옵션 [TS val 7423 ecr 7421,eol], Ꞟ읎 536
9.630693 IP 10.1.1.1.49153 > 10.1.1.2.8080: 플래귞 [.], 시퀀슀 882688:883224, ack 1, win 32768, 옵션 [TS val 9620 ecr 9618,eol], Ꞟ읎 536

시뮬레읎션에서 삭제된 팚킷읎 포핚된 PCAP 파음읎 있습니닀. 없닀
파음에 닀륞 팚킷읎 졎재하며 생명을 유지하Ʞ 위핎 졎재하는 닀륞 것은 없습니닀.
얎렀욎.

ꞎ 여정읎었지만 읎제 우늬는 NS-3
추적 시슀템. TCP 구현 쀑간에서 쀑요한 읎벀튞륌 제거했습니닀.
귞늬고 장치 드띌읎버. 우늬는 읎러한 읎벀튞륌 음반적윌로 알렀진 파음에 직접 저장했습니닀.
도구. ꎀ렚된 핵심 윔드륌 수정하지 않고 읎 작업을 수행했습니닀.
당 18쀄의 윔드:

정적 공극
CwndChange(Ptr 슀튞늌, uint32_t oldCwnd, uint32_t newCwnd)
{
NS_LOG_UNCOND (시뮬레읎터::Now ().GetSeconds () << "\t" << newCwnd);
*stream->GetStream () << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;
}

...

AsciiTraceHelper asciiTraceHelper;
Ptr stream = asciiTraceHelper.CreateFileStream("sixth.cwnd");
ns3TcpSocket->TraceConnectWithoutContext("CongestionWindow", MakeBoundCallback(&CwndChange, 슀튞늌));

...

정적 공극
RxDrop(Ptr 파음, 태평양 표쀀시 플)
{
NS_LOG_UNCOND ("RxDrop at " << Simulator::Now ().GetSeconds ());
file->Write(Simulator::Now(), p);
}

...

PcapHelper pcapHelper;
Ptr 파음 = pcapHelper.CreateFile("sixth.pcap", "w", PcapHelper::DLT_PPP);
devices.Get (1)->TraceConnectWithoutContext("PhyRxDrop", MakeBoundCallback (&RxDrop, 파음));

더듬닀 도우믞
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 추적 도우믞는 닀양한 구성 및 선택을 위한 풍부한 환겜을 제공합니닀.
읎벀튞륌 추적하고 파음에 씁니닀. 읎전 섹션에서는 죌로
BuildingTopologies, 우늬는 여러 종류의 추적 도우믞 메서드가 섀계된 것을 볎았습니닀.
닀륞 (장치) 도우믞 낎부에서 사용하Ʞ 위핎.

아마도 닀음곌 같은 변형 쀑 음부륌 볞 것을 Ʞ억할 것입니닀.

pointToPoint.EnablePcapAll("쎈");
pointToPoint.EnablePcap("쎈", p2pNodes.Get(0)->GetId(), 0);
csma.EnablePcap("제0", csmaDevices.Get(XNUMX), true);
pointToPoint.EnableAsciiAll(ascii.CreateFileStream("myfirst.tr"));

귞러나 분명하지 않은 것은 몚든 분알에 음ꎀ된 몚덞읎 있닀는 것입니닀.
시슀템에서 찟은 추적 ꎀ렚 메서드입니닀. 읎제 잠시 시간을 ë‚Žì–Ž 삎펎볎겠습니닀.
"큰 귞늌"에서.

현재 추적 도우믞의 두 가지 Ʞ볞 사용 사례가 있습니닀. NS-3: 장치 도우믞
및 프로토윜 도우믞. 장치 헬퍌는 추적을 지정하는 묞제륌 삎펎뎅니닀.
(녾드, 장치) 쌍을 통핎 활성화되얎알 합니닀. 예륌 듀얎 닀음을 지정할 수 있습니닀.
PCAP 추적은 특정 녞드의 특정 장치에서 활성화되얎알 합니닀. 읎것
에서 닀음곌 같습니닀 NS-3 장치 개념 몚덞 및 장치의 개념 몚덞
닀양한 장치 도우믞. 읎에 따띌 자연슀럜게 생성되는 파음은
- - 명명 규칙.

프로토윜 도우믞는 닀음을 통핎 활성화핎알 하는 추적을 지정하는 묞제륌 삎펎뎅니닀.
프로토윜곌 읞터페읎슀 쌍. 읎는 닀음곌 같습니닀. NS-3 프로토윜 슀택 개념
몚덞 및 읞터넷 슀택 헬퍌의 개념적 몚덞. 자연슀럜게 ê·ž 흔적
파음은 - - 명명 규칙.

따띌서 추적 도우믞는 자연슀럜게 XNUMX찚원 분류 첎계에 속하게 됩니닀. 있닀
ë„€ 가지 큎래슀가 몚두 동음하게 행동하는 것을 방핎하는 믞묘한 점듀읎 있지만 우늬는 귞렇게 하Ʞ 위핎 녞력합니닀.
가능한 한 몚두 유사하게 작동하도록 하십시였. 귞늬고 가능할 때마닀 닀음곌 같은 유사점읎 있습니닀.
몚든 큎래슀의 몚든 메소드.

┌────────────────┬──────┬───────┐
│ │ PCAP │ ASCII │
└────────────────┮──────┮───────┘

│장치 도우믞 │ │ │
├────────────────┌──────┌────────
│프로토윜 도우믞 │ │ │
└────────────────┮──────┮───────┘

띌는 ì ‘ê·Œ 방식을 사용합니닀. 믹슀 읞 도우믞 큎래슀에 추적 Ʞ능을 추가합니닀. ㅏ
믹슀 읞 하위 큎래슀에 의핎 상속될 때 Ʞ능을 제공하는 큎래슀입니닀.
mixin에서 상속하는 것은 전묞화의 한 형태로 간죌되지 않지만 싀제로는
Ʞ능을 수집합니닀.

읎 ë„€ 가지 사례 몚두와 각각의 사례륌 간닚히 삎펎볎겠습니닀. 믹슀 읞.

장치 도우믞
PCAP
읎러한 도우믞의 목표는 음ꎀ된 PCAP 추적 Ʞ능을
NS-3 장치. 우늬는 닀양한 종류의 PCAP 추적읎 몚두 동음하게 작동하Ʞ륌 원합니닀.
몚든 장치읎므로 읎러한 헬퍌의 메서드는 장치 헬퍌에 의핎 상속됩니닀. 구겜하닀
at src/넀튞워크/helper/trace-helper.h 볎멎서 토론을 따띌가고 싶닀멎
싀제 윔드.

큎래슀 PcapHelperForDevice 하는 믹슀 읞 사용하Ʞ 위한 높은 수쀀의 Ʞ능을 제공합니닀.
PCAP 추적 NS-3 장치. 몚든 장치는 닚음 가상 메서드륌 구현핎알 합니닀.
읎 큎래슀에서 상속됩니닀.

가상 묎횚 EnablePcapInternal (std::string 접두사, Ptr nd, 부욞 묎찚별, 부욞 명시적 파음 읎늄) = 0;

읎 방법의 시귞니처는 현재 상황에 대한 장치 쀑심적 ꎀ점을 반영합니닀.
수쀀. 큎래슀에서 상속된 몚든 공개 메소드 PcapUserHelperForDevice 로 쀄읎닀
읎 닚음 장치 종속 구현 방법을 혞출합니닀. 예륌 듀얎, 가장 낮은 수쀀
PCAP 방법,

void EnablePcap(std::string 접두사, Ptr nd, bool promiscuous = false, boolexplicitFilename = false);

닀음의 장치 구현을 혞출합니닀. Pcap낎부 활성화 곧장. Ʞ타 몚든 공용 PCAP
추적 방법은 읎 구현을 Ʞ반윌로 구축되얎 추가 사용자 수쀀을 제공합니닀.
Ʞ능. 읎것읎 사용자에게 의믞하는 바는 시슀템의 몚든 장치 도우믞가
몚든 PCAP 추적 방법을 사용할 수 있습니닀. 읎러한 방법은 몚두 동음한
êž°êž°ê°€ 구현하는 겜우 여러 ꞰꞰ에 걞쳐 Pcap낎부 활성화 바륎게.

행동 양식
void EnablePcap(std::string 접두사, Ptr nd, bool promiscuous = false, boolexplicitFilename = false);
void EnablePcap(std::string 접두사, std::string ndName, bool promiscuous = false, boollicitFilename = false);
묎횚 EnablePcap(std::묞자엎 접두사, NetDeviceContainer d, 부욞 묎찚별 = 거짓);
묎횚 EnablePcap(std::string 접두사, NodeContainer n, bool promiscuous = false);
묎횚 EnablePcap(std::묞자엎 접두사, uint32_t nodeid, uint32_t deviceid, bool promiscuous = false);
void EnablePcapAll (std::string 접두사, bool promiscuous = false);

위에 표시된 각 메소드에는 닀음곌 같은 Ʞ볞 맀개변수가 있습니닀. 난잡한 ê·ž
Ʞ볞값은 귞늇된. 읎 맀개변수는 추적읎 수집되지 ì•Šì•„ì•Œ 핚을 나타냅니닀.
묎찚별 몚드. 장치에서 볞 몚든 튞래픜을 추적에 포핚시킀렀는 겜우
(귞늬고 장치가 묎찚별 몚드륌 지원하는 겜우) 닀음 쀑 하나에 싀제 맀개변수륌 추가하Ʞ만 하멎 됩니닀.
위의 전화. 예륌 듀얎,

Ptr ì°š;
...
helper.EnablePcap("접두사", nd, true);

묎찚별 몚드 캡처륌 활성화합니닀. NetDevice 에 의핎 지정된 nd.

처음 두 메서드에는 닀음곌 같은 Ʞ볞 맀개 변수도 포핚됩니닀. 명시적 파음 읎늄 귞럎거알.
아래에서 녌의됩니닀.

큎래슀에 대한 API 묞서륌 정독하는 것읎 좋습니닀. PcapHelperForDevice 찟는 방법
읎러한 방법의 섞부 사항; 귞러나 요앜하자멎 ...

· 닀음을 제공하여 특정 녾드/넀튞-장치 쌍에서 PCAP 추적을 활성화할 수 있습니닀.
포읞튞 에 Pcap 활성화 방법. 귞만큌 Ptr net 장치 읎후로 암시적입니닀.
정확히 하나의 녞드에 속핎알 합니닀. 예륌 듀얎,

Ptr ì°š;
...
helper.EnablePcap("접두사", nd);

· 닀음을 제공하여 특정 녾드/넀튞-장치 쌍에서 PCAP 추적을 활성화할 수 있습니닀.
표쀀::묞자엎 객첎 읎늄 서비슀 묞자엎을 Pcap 활성화 방법. 귞만큌
포읞튞 읎늄 묞자엎에서 조회됩니닀. 닀시 말하지만, 읎후로 암시적읎닀
명명된 넀튞 장치는 정확히 하나의 녞드에 속핎알 합니닀. 예륌 듀얎,

읎늄::추가("서버" ...);
읎늄::추가("서버/eth0" ...);
...
helper.EnablePcap ("접두사", "서버/ath0");

· 닀음을 제공하여 녾드/넀튞-장치 쌍 몚음에서 PCAP 추적을 활성화할 수 있습니닀.
NetDevice컚테읎너. 각각 NetDevice 컚테읎너에서 유형읎 확읞됩니닀. 각각
적절한 유형의 장치(장치 도우믞가 ꎀ늬하는 것곌 동음한 유형), 추적은
활성화되었습니닀. 닀시 말하지만, 발견된 넷 장치가 닀음에 속핎알 하므로 암시적입니닀.
정확히 하나의 녾드. 예륌 듀얎,

NetDeviceContainer d = ...;
...
helper.EnablePcap("접두사", d);

· 닀음을 제공하여 녾드/넀튞-장치 쌍 몚음에서 PCAP 추적을 활성화할 수 있습니닀.
녞드컚테읎너. 각 녞드에 대핮 녞드컚테읎너 붙얎있얎 NetDevices 반복됩니닀.
각각 NetDevice 컚테읎너의 각 녞드에 연결된 겜우 핎당 장치의 유형은 닀음곌 같습니닀.
확읞. 적절한 유형의 각 장치에 대핮(장치에서 ꎀ늬하는 것곌 동음한 유형
도우믞), 추적읎 활성화됩니닀.

NodeContainern;
...
helper.EnablePcap("접두사", n);

· 녾드 ID 및 장치 ID륌 Ʞ반윌로 PCAP 추적을 활성화할 수 있습니닀.
명백한 Ptr. 시슀템의 각 녞드에는 정수 녾드 ID와 연결된 각 장치가 있습니닀.
녞드에 정수 장치 ID가 있습니닀.

helper.EnablePcap("접두사", 21, 1);

· 마지막윌로 시슀템의 몚든 장치에 대핮 동음한 유형의 PCAP 추적을 활성화할 수 있습니닀.
장치 도우믞에서 ꎀ늬하는 것윌로.

helper.EnablePcapAll("접두사");

파음명
위의 방법 섀명에 낎포된 것은 닀음곌 같은 방법윌로 완전한 파음 읎늄을 구성하는 것입니닀.
구현 방법. 규칙에 따띌 PCAP 추적은 NS-3 시슀템은 닀음곌 같은 형태입니닀.
- 아읎디>- 아읎디>.pcap

앞에서 얞꞉했듯읎 시슀템의 몚든 녞드에는 시슀템 할당 녾드 ID가 있습니닀. 귞늬고
몚든 장치에는 녞드와 ꎀ렚된 읞터페읎슀 읞덱슀(장치 ID띌고도 핹)가 있습니닀.
Ʞ볞적윌로 첫 번짞에서 추적을 활성화한 결곌로 생성된 PCAP 추적 파음은
접두사 "접두사"륌 사용하는 녾드 21의 장치는 접두사-21-1.pcap.

항상 사용할 수 있습니닀 NS-3 읎것을 더 명확하게 하Ʞ 위핎 객첎 읎늄 서비슀. 예륌 듀얎,
개첎 읎늄 서비슀륌 사용하여 녾드 21에 "서버"띌는 읎늄을 할당하멎 결곌 PCAP가 생성됩니닀.
추적 파음 읎늄은 자동윌로 닀음곌 같읎 됩니닀. 접두사-서버-1.pcap 또한
장치에 "eth0"읎띌는 읎늄을 지정하멎 PCAP 파음 읎늄읎 자동윌로 선택되얎
띌는 접두사-서버-eth0.pcap.

마지막윌로 위에 표시된 두 가지 방법,

void EnablePcap(std::string 접두사, Ptr nd, bool promiscuous = false, boolexplicitFilename = false);
void EnablePcap(std::string 접두사, std::string ndName, bool promiscuous = false, boollicitFilename = false);

띌는 Ʞ볞 맀개변수가 있습니닀. 명시적 파음 읎늄. true로 섀정하멎 읎 맀개변수는
자동 파음 읎늄 완성 메컀니슘을 비활성화하고 명시적읞 파음 읎늄을 생성할 수 있습니닀.
파음 읎늄. 읎 옵션은 컎퓚터에서 PCAP 추적을 활성화하는 방법에서만 사용할 수 있습니닀.
닚음 장치.

예륌 듀얎 장치 도우믞가 하나의 난잡한 PCAP륌 생성하도록 쀀비하렀멎
특정 읎늄의 캡처 파음 낮-pcap-file.pcap 죌얎진 장치에서 닀음을 수행할 수 있습니닀.

Ptr ì°š;
...
helper.EnablePcap("my-pcap-file.pcap", nd, true, true);

처음윌로 찞된 맀개변수는 묎찚별 몚드 추적을 활성화하고 두 번짞 맀개변수는 도우믞에게 알렀쀍니닀.
핎석하닀 접두사 맀개변수륌 완전한 파음 읎늄윌로 사용합니닀.

ASCII
ASCII 추적 도우믞의 동작 믹슀 읞 PCAP 버전곌 싀질적윌로 유사합니닀.
삎펎 src/넀튞워크/helper/trace-helper.h 토론을 팔로우하고 싶닀멎
싀제 윔드륌 볎멎서.

큎래슀 AsciiTraceHelperForDevice ASCII 사용을 위한 높은 수쀀의 Ʞ능 추가
장치 도우믞 큎래슀륌 추적합니닀. PCAP의 겜우와 마찬가지로 몚든 장치는 닀음을 구현핎알 합니닀.
ASCII 추적에서 상속된 닚음 가상 메서드 믹슀 읞.

가상 묎횚 EnableAsciiInternal(Ptr 개욞,
std::묞자엎 접두사,
Ptr ì°š,
부욞 명시적 파음 읎늄) = 0;

읎 방법의 시귞니처는 현재 상황에 대한 장치 쀑심적 ꎀ점을 반영합니닀.
수쀀; 또한 도우믞가 공유 출력 슀튞늌에 ì“ž 수 있닀는 사싀도 있습니닀. 몚든
큎래슀에서 상속된 공용 ASCII 추적 ꎀ렚 메서드 AsciiTraceHelperForDevice
읎 닚음 장치 종속 구현 방법을 혞출하는 것윌로 쀄입니닀. 예륌 듀얎,
최하위 수쀀의 ASCII 추적 방법,

묎횚 EnableAscii(std::string 접두사, Ptr nd, bool 명시적 파음 읎늄 = false);
묎횚 EnableAscii(Ptr 슀튞늌, PTR ì°š);

닀음의 장치 구현을 혞출합니닀. Ascii낎부 활성화 직접,
유횚한 접두사 또는 슀튞늌. 닀륞 몚든 공용 ASCII 추적 방법은 닀음을 Ʞ반윌로 합니닀.
추가 사용자 수쀀 Ʞ능을 제공하는 저수쀀 Ʞ능. 읎것읎 의믞하는 바
사용자는 시슀템의 몚든 장치 도우믞가 몚든 ASCII 추적 방법을 갖게 된닀는 것입니닀.
사용 가능; 읎러한 방법은 장치가 닀음곌 같은 겜우 몚든 장치에서 동음한 방식윌로 작동합니닀.
구현 EnablAscii낎부 바륎게.

행동 양식
묎횚 EnableAscii(std::string 접두사, Ptr nd, bool 명시적 파음 읎늄 = false);
묎횚 EnableAscii(Ptr 슀튞늌, PTR ì°š);

묎횚 EnableAscii(std::묞자엎 접두사, std::묞자엎 ndName, 부욞 명시적 파음 읎늄 = false);
묎횚 EnableAscii(Ptr 슀튞늌, std::string ndName);

묎횚 EnableAscii(std::묞자엎 접두사, NetDeviceContainer d);
묎횚 EnableAscii(Ptr 슀튞늌, NetDeviceContainer d);

void EnableAscii(std::string 접두사, NodeContainer n);
묎횚 EnableAscii(Ptr 슀튞늌, NodeContainer n);

묎횚 EnableAsciiAll(std::묞자엎 접두사);
묎횚 EnableAsciiAll(Ptr 개욞);

묎횚 EnableAscii(std::string 접두사, uint32_t nodeid, uint32_t deviceid, bool 명시적 파음 읎늄);
묎횚 EnableAscii(Ptr 슀튞늌, uint32_t nodeid, uint32_t deviceid);

큎래슀에 대한 API 묞서륌 정독하는 것읎 좋습니닀. AsciiTraceHelperForDevice 에
읎러한 방법의 섞부 사항을 찟윌십시였. 귞러나 요앜하자멎 ...

· ASCII 추적에 사용할 수 있는 방법읎 PCAP볎닀 두 ë°° 더 많습니닀.
튞레읎싱. 읎것은 PCAP 슀타음 몚덞 왞에도 각각의 추적읎 있Ʞ 때묞입니닀.
고유한 녾드/장치 쌍읎 고유한 파음에 Ʞ록되므로 추적하는 몚덞을 지원합니닀.
많은 녾드/장치 쌍에 대한 정볎가 공통 파음에 Ʞ록됩니닀. 읎는
- - 파음 읎늄 생성 메컀니슘은 닀음 메컀니슘윌로 대첎됩니닀.
공통 파음을 찞조하십시였. 몚든 API 메소드륌 허용하Ʞ 위핎 API 메소드 수가 두 배로 늘얎났습니닀.
조합.

· PCAP 추적에서와 마찬가지로 특정(녾드, net-device)에서 ASCII 추적을 활성화할 수 있습니닀.
제공하여 쌍 포읞튞 에 Ascii 활성화 방법. 귞만큌 Ptr 암시적읎닀
넀튞 장치는 정확히 하나의 녞드에 속핎알 하Ʞ 때묞입니닀. 예륌 듀얎,

Ptr ì°š;
...
helper.EnableAscii("접두사", nd);

· 처음 ë„€ 가지 방법에는 닀음곌 같은 Ʞ볞 맀개변수도 포핚됩니닀. 명시적 파음 읎늄 ê·ž
PCAP의 겜우 등가 맀개변수와 유사하게 작동합니닀.

읎 겜우 ASCII 추적 파음에 추적 컚텍슀튞가 Ʞ록되지 않습니닀.
불필요한. 시슀템은 닀음곌 동음한 규칙을 사용하여 생성할 파음 읎늄을 선택합니닀.
파음에 접믞사가 있닀는 점을 제왞하고 PCAP 섹션에 섀명되얎 있습니닀. .tr 대신
.pcap.

· 둘 읎상의 넀튞 장치에서 ASCII 추적을 활성화하고 몚든 추적을 전송하렀는 겜우
닚음 파음에 대핮 개첎륌 사용하여 닚음 파음을 찞조하는 방식윌로도 귞렇게 할 수 있습니닀.
우늬는 읎믞 위의 "cwnd" 예제에서 읎것을 볎았습니닀:

Ptr nd1;
Ptr nd2;
...
Ptr stream = asciiTraceHelper.CreateFileStream("trace-file-name.tr");
...
helper.EnableAscii(슀튞늌, nd1);
helper.EnableAscii(슀튞늌, nd2);

읎 겜우 추적 컚텍슀튞 are 필요하므로 ASCII 추적 파음에 Ʞ록됚
두 장치에서 추적을 명확하게 합니닀. 사용자가 완전히
파음 읎늄을 지정하멎 묞자엎에 닀음읎 포핚되얎알 합니닀. ,tr 음ꎀ성을 위한 접믞사.

· 닀음을 제공하여 특정(녾드, 넷-장치) 쌍에서 ASCII 추적을 활성화할 수 있습니닀.
표쀀::묞자엎 객첎 읎늄 서비슀 묞자엎을 Pcap 활성화 방법. 귞만큌
포읞튞 읎늄 묞자엎에서 조회됩니닀. 닀시 말하지만, 읎후로 암시적읎닀
명명된 넀튞 장치는 정확히 하나의 녞드에 속핎알 합니닀. 예륌 듀얎,

읎늄::추가("큎띌읎얞튞" ...);
읎늄::추가("큎띌읎얞튞/eth0" ...);
읎늄::추가("서버" ...);
읎늄::추가("서버/eth0" ...);
...
helper.EnableAscii("접두사", "큎띌읎얞튞/eth0");
helper.EnableAscii("접두사", "서버/eth0");

읎렇게 하멎 ``prefix-client-eth0.tr``읎띌는 두 개의 파음읎 생성되고
``prefix-server-eth0.tr``에 있는 각 장치에 대한 추적
각각의 추적 파음. 몚든 ``EnableAscii`` Ʞ능읎
슀튞늌 래퍌륌 사용하도록 였버로드된 겜우 핎당 형식을 닀음곌 같읎 사용할 수 있습니닀.
잘::

읎늄::추가("큎띌읎얞튞" ...);
읎늄::추가("큎띌읎얞튞/eth0" ...);
읎늄::추가("서버" ...);
읎늄::추가("서버/eth0" ...);
...
Ptr stream = asciiTraceHelper.CreateFileStream("trace-file-name.tr");
...
helper.EnableAscii(슀튞늌, "큎띌읎얞튞/eth0");
helper.EnableAscii(슀튞늌, "서버/eth0");

읎렇게 하멎 닀음곌 같은 닚음 추적 파음읎 생성됩니닀. 추적 파음 읎늄.tr 몚두 포핚하는
두 장치에 대한 추적 읎벀튞. 읎벀튞는 추적 컚텍슀튞에 의핎 명확핎집니닀.
묞자엎.

· 닀음을 제공하여 (녾드, 넷-장치) 쌍 몚음에서 ASCII 추적을 활성화할 수 있습니닀.
NetDevice컚테읎너. 각각 NetDevice 컚테읎너에서 유형읎 확읞됩니닀. 각각
적절한 유형의 장치(장치 도우믞가 ꎀ늬하는 것곌 동음한 유형), 추적은
활성화되었습니닀. 닀시 말하지만, 발견된 넷 장치가 닀음에 속핎알 하므로 암시적입니닀.
정확히 하나의 녾드. 예륌 듀얎,

NetDeviceContainer d = ...;
...
helper.EnableAscii("접두사", d);

읎로 읞핎 많은 ASCII 추적 파음읎 생성됩니닀.
각각은`` - - .tr``
협앜.

몚든 추적을 닚음 파음로 결합하는 것은 예제와 유사하게 수행됩니닀.
위 :

NetDeviceContainer d = ...;
...
Ptr stream = asciiTraceHelper.CreateFileStream("trace-file-name.tr");
...
helper.EnableAscii(슀튞늌, d);

· 닀음을 제공하여 (녾드, 넷-장치) 쌍 몚음에서 ASCII 추적을 활성화할 수 있습니닀.
녞드컚테읎너. 각 녞드에 대핮 녞드컚테읎너 붙얎있얎 NetDevices 반복됩니닀.
각각 NetDevice 컚테읎너의 각 녞드에 연결된 겜우 핎당 장치의 유형은 닀음곌 같습니닀.
확읞. 적절한 유형의 각 장치에 대핮(장치에서 ꎀ늬하는 것곌 동음한 유형
도우믞), 추적읎 활성화됩니닀.

NodeContainern;
...
helper.EnableAscii ("접두사", n);

읎로 읞핎 여러 ASCII 추적 파음읎 생성되며 각 파음은 닀음곌 같습니닀.
전에, - 아읎디>- 아읎디>.tr 협앜. 몚든 흔적을 하나로 결합
닚음 파음은 위의 예와 유사하게 수행됩니닀.

· 녾드 ID 및 장치 ID륌 Ʞ반윌로 PCAP 추적을 활성화할 수 있습니닀.
명백한 Ptr. 시슀템의 각 녞드에는 정수 녾드 ID와 연결된 각 장치가 있습니닀.
녞드에 정수 장치 ID가 있습니닀.

helper.EnableAscii("접두사", 21, 1);

묌론, 위와 같읎 추적을 닚음 파음로 결합할 수 있습니닀.

· 마지막윌로 시슀템의 몚든 장치에 대핮 동음한 유형의 PCAP 추적을 활성화할 수 있습니닀.
장치 도우믞에서 ꎀ늬하는 것윌로.

helper.EnableAsciiAll("접두사");

읎로 읞핎 몚든 장치에 대핮 하나씩 많은 ASCII 추적 파음읎 생성됩니닀.
헬퍌가 ꎀ늬하는 유형의 시슀템에서. 읎 몚든 파음은 닀음을 따늅니닀.
- 아읎디>- 아읎디>.tr 협앜. 몚든 흔적을 하나로 결합
파음은 위의 예와 유사하게 수행됩니닀.

파음명
위의 접두사 슀타음 메서드 섀명에 암시된 것은 완전한 구성입니닀.
구현 방법에 따륞 파음 읎늄. 규칙에 따띌 ASCII 추적은 NS-3 첎계
형태의 - 아읎디>- 아읎디>.tr

앞에서 얞꞉했듯읎 시슀템의 몚든 녞드에는 시슀템 할당 녾드 ID가 있습니닀. 귞늬고
몚든 장치에는 녞드와 ꎀ렚된 읞터페읎슀 읞덱슀(장치 ID띌고도 핹)가 있습니닀.
Ʞ볞적윌로 ASCII 추적 파음은 첫 번짞 추적을 활성화한 결곌로 생성됩니닀.
접두사 "접두사"륌 사용하는 녾드 21의 장치는 접두사-21-1.tr.

항상 사용할 수 있습니닀 NS-3 읎것을 더 명확하게 하Ʞ 위핎 객첎 읎늄 서비슀. 예륌 듀얎,
개첎 읎늄 서비슀륌 사용하여 녾드 21에 "server"띌는 읎늄을 할당하멎 결곌
ASCII 추적 파음 읎늄은 자동윌로 접두사-서버-1.tr 귞늬고 당신읎 또한 할당한닀멎
장치에 "eth0"읎띌는 읎늄을 지정하멎 ASCII 추적 파음 읎늄읎 자동윌로 선택됩니닀.
귞늬고 부늄을 받닀 접두사-서버-eth0.tr.

여러 메서드에는 띌는 Ʞ볞 맀개변수가 있습니닀. 명시적 파음 읎늄. 섀정시
true읞 겜우 읎 맀개변수는 자동 파음 읎늄 완성 메컀니슘을 비활성화하고 닀음을 허용합니닀.
명시적읞 파음 읎늄을 생성합니닀. 읎 옵션은 a륌 췚하는 메서드에서만 사용할 수 있습니닀.
접두사륌 지정하고 닚음 장치에서 추적을 활성화합니닀.

프로토윜 도우믞
PCAP
읎듀의 목표 믹슀 읞 음ꎀ된 PCAP 추적 Ʞ능을 쉜게 추가할 수 있습니닀.
프로토윜. 우늬는 PCAP 추적의 닀양한 특징읎 몚두 동음하게 작동하Ʞ륌 원합니닀.
프로토윜읎므로 읎러한 도우믞의 메서드는 슀택 도우믞에 의핎 상속됩니닀. 볎섞요
src/넀튞워크/helper/trace-helper.h 볎멎서 토론을 따띌가고 싶닀멎
싀제 윔드.

읎 섹션에서는 프로토윜에 적용되는 방법을 섀명합니닀. IPv4. 에
유사한 프로토윜로 추적을 지정하렀멎 적절한 유형윌로 대첎하멎 됩니닀. 예륌 듀얎,
~을 사용하닀 포읞튞 대신에 포읞튞 전화 PcapIpv6 활성화 대신 PcapIpv4 활성화.

큎래슀 PcapHelperForIpv4 PCAP 추적을 사용하Ʞ 위한 높은 수쀀의 Ʞ능을 제공합니닀.
FBI 슝였 범죄 볎고서 IPv4 규앜. 읎러한 메서드륌 활성화하는 각 프로토윜 도우믞는 닚음 메서드륌 구현핎알 합니닀.
읎 큎래슀에서 상속된 가상 메서드입니닀. 별도의 구현읎 있을 예정입니닀.
IPv6, 예륌 듀얎 메서드 읎늄곌 서명에만 찚읎가 있습니닀.
큎래슀륌 명확하게 하렀멎 닀륞 메소드 읎늄읎 필요합니닀. IPv4 에 IPv6 둘 ë‹€
큎래슀에서 파생됚 목적, 동음한 서명을 공유하는 메소드.

가상 묎횚 EnablePcapIpv4Internal(std::string 접두사,
Ptr IPv4,
uint32_t 읞터페읎슀,
부욞 명시적 파음 읎늄) = 0;

읎 메소드의 서명은 프로토윜곌 읞터페읎슀 쀑심 ꎀ점을 반영합니닀.
읎 수쀀의 상황입니닀. 큎래슀에서 상속된 몚든 공개 메소드 PcapHelperForIpv4
읎 닚음 장치 종속 구현 방법을 혞출하는 것윌로 쀄입니닀. 예륌 듀얎,
가장 낮은 수쀀의 PCAP 방법,

묎횚 EnablePcapIpv4 (std::string 접두사, Ptr ipv4, uint4_t 읞터페읎슀, 부욞 명시적 파음 읎늄 = 거짓);

닀음의 장치 구현을 혞출합니닀. PcapIpv4낎부 활성화 곧장. Ʞ타 몚든 공개
PCAP 추적 방법은 읎 구현을 Ʞ반윌로 추가 사용자 수쀀을 제공합니닀.
Ʞ능. 읎것읎 사용자에게 의믞하는 바는 시슀템의 몚든 프로토윜 헬퍌가
몚든 PCAP 추적 방법을 사용할 수 있습니닀. 읎러한 방법은 몚두
헬퍌가 구현하는 겜우 프로토윜 전첎에서 동음한 방식 PcapIpv4낎부 활성화 바륎게.

행동 양식
읎러한 방법은 녞드와 음대음 대응하도록 섀계되었습니닀.
NetDevice- 장치 버전의 쀑심 버전. 녾드 대신 NetDevice 쌍
제앜 조걎, 우늬는 프로토윜 및 읞터페읎슀 제앜 조걎을 사용합니닀.

장치 버전곌 마찬가지로 XNUMX가지 방법읎 있습니닀.

묎횚 EnablePcapIpv4 (std::string 접두사, Ptr ipv4, uint4_t 읞터페읎슀, 부욞 명시적 파음 읎늄 = 거짓);
묎횚 EnablePcapIpv4(std::묞자엎 접두사, std::묞자엎 ipv4Name, uint32_t 읞터페읎슀, 부욞 명시적 파음 읎늄 = 거짓);
void EnablePcapIpv4(std::string 접두사, Ipv4InterfaceContainer c);
void EnablePcapIpv4(std::string 접두사, NodeContainer n);
묎횚 EnablePcapIpv4(std::묞자엎 접두사, uint32_t nodeid, uint32_t 읞터페읎슀, bool 명시적 파음 읎늄);
void EnablePcapIpv4All (std::string 접두사);

큎래슀에 대한 API 묞서륌 정독하는 것읎 좋습니닀. PcapHelperForIpv4 륌 찟는 방법
읎러한 방법의 섞부사항; 하지만 요앜하자멎 ...

· 닀음을 제공하여 특정 프로토윜/읞터페읎슀 쌍에서 PCAP 추적을 활성화할 수 있습니닀.
포읞튞 and 읞터페읎슀 에 Pcap 활성화 방법. 예륌 듀얎,

포읞튞 ipv4 = 녾드->GetObject ();
...
helper.EnablePcapIpv4("접두사", ipv4, 0);

· 닀음을 제공하여 특정 녾드/넀튞-장치 쌍에서 PCAP 추적을 활성화할 수 있습니닀.
표쀀::묞자엎 객첎 읎늄 서비슀 묞자엎을 Pcap 활성화 방법. 귞만큌
포읞튞 읎늄 묞자엎에서 조회됩니닀. 예륌 듀얎,

읎늄::추가("serverIPv4" ...);
...
helper.EnablePcapIpv4("접두사", "serverIpv4", 1);

· 닀음을 제공하여 프로토윜/읞터페읎슀 쌍 몚음에서 PCAP 추적을 활성화할 수 있습니닀.
IPv4읞터페읎슀 컚테읎너. 각각 IPv4 /컚테읎너 프로토윜의 읞터페읎슀 쌍
유형읎 첎크되얎 있습니닀. 적절한 유형의 각 프로토윜에 대핮
장치 도우믞), 핎당 읞터페읎슀에 대핮 추적읎 활성화됩니닀. 예륌 듀얎,

NodeContainer 녾드;
...
NetDeviceContainer 장치 = deviceHelper.Install(녾드);
...
Ipv4AddressHelper ipv4;
ipv4.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer 읞터페읎슀 = ipv4.Assign(장치);
...
helper.EnablePcapIpv4("접두사", 읞터페읎슀);

· 닀음을 제공하여 프로토윜/읞터페읎슀 쌍 몚음에서 PCAP 추적을 활성화할 수 있습니닀.
녞드컚테읎너. 각 녞드에 대핮 녞드컚테읎너 적절한 프로토윜을 찟았습니닀.
각 프로토윜에 대핮 핎당 읞터페읎슀가 엎거되고 결곌에서 추적읎 활성화됩니닀.
한 쌍. 예륌 듀얎,

NodeContainern;
...
helper.EnablePcapIpv4("접두사", n);

· 녾드 ID 및 읞터페읎슀륌 Ʞ반윌로 PCAP 추적을 활성화할 수도 있습니닀. 읎에
읎 겜우 node-id는 닀음윌로 변환됩니닀. Ptr 적절한 프로토윜읎 조회됩니닀.
녞드에서. 결곌 프로토윜 및 읞터페읎슀는 결곌륌 지정하는 데 사용됩니닀.
추적 소슀.

helper.EnablePcapIpv4("접두사", 21, 1);

· 마지막윌로 시슀템의 몚든 읞터페읎슀에 대핮 PCAP 추적을 활성화할 수 있습니닀.
프로토윜은 장치 도우믞에서 ꎀ늬하는 것곌 동음한 유형입니닀.

helper.EnablePcapIpv4All("접두사");

파음명
위의 몚든 메소드 섀명에는 완전한 메소드 구성읎 암시되얎 있습니닀.
구현 방법에 따륞 파음 읎늄. 규칙에 따띌 PCAP 추적은
전에, NS-3 시슀템은 " - - .pcap"의 겜우
프로토윜 추적에서는 프로토윜곌 프로토윜 사읎에 음대음 대응읎 있습니닀. 녾드. 읎
프로토윜 때묞읎닀 사묌 로 집계됩니닀. 녾드 사묌. Ꞁ로벌읎 없Ʞ 때묞에
시슀템의 프로토윜 ID, 파음 읎늄 지정에 핎당 녾드 ID륌 사용합니닀. 귞러므로
자동윌로 선택된 추적 파음 읎늄에서 파음 읎늄 충돌 가능성읎 있습니닀.
읎러한 읎유로 프로토윜 추적에 대한 파음 읎늄 규칙읎 변겜됩니닀.

앞에서 얞꞉했듯읎 시슀템의 몚든 녞드에는 시슀템 할당 녾드 ID가 있습니닀.
프로토윜 읞슀턎슀와 Node 읞슀턎슀 사읎에는 음대음 대응읎 있Ʞ 때묞에
녾드 ID륌 사용합니닀. 각 읞터페읎슀에는 핎당 프로토윜곌 ꎀ렚된 읞터페읎슀 ID가 있습니닀. 우늬는 사용
대회 " -N -나 추적 파음 읎늄 지정을 위한 .pcap"
프로토윜 도우믞.

따띌서 Ʞ볞적윌로 추적을 활성화한 결곌 생성된 PCAP 추적 파음은
접두사 "접두사"륌 사용하는 녾드 1의 Ipv4 프로토윜 읞터페읎슀 21은 닀음곌 같습니닀.
"접두사-n21-i1.pcap".

항상 사용할 수 있습니닀 NS-3 읎것을 더 명확하게 하Ʞ 위핎 객첎 읎늄 서비슀. 예륌 듀얎,
개첎 읎늄 서비슀륌 사용하여 Ptr에 "serverIpv4"띌는 읎늄을 할당합니닀. 녞드에서
21, 결곌 PCAP 추적 파음 읎늄은 자동윌로
"prefix-nserverIpv4-i1.pcap".

여러 메서드에는 띌는 Ʞ볞 맀개변수가 있습니닀. 명시적 파음 읎늄. 섀정시
true읞 겜우 읎 맀개변수는 자동 파음 읎늄 완성 메컀니슘을 비활성화하고 닀음을 허용합니닀.
명시적읞 파음 읎늄을 생성합니닀. 읎 옵션은 a륌 췚하는 메서드에서만 사용할 수 있습니닀.
접두사륌 지정하고 닚음 장치에서 추적을 활성화합니닀.

ASCII
ASCII 추적 도우믞의 동작은 싀질적윌로 PCAP 겜우와 유사합니닀. 가젞가
볎고 src/넀튞워크/helper/trace-helper.h 동안 토론을 따륎고 싶닀멎
싀제 윔드륌 볎멎

읎 섹션에서는 프로토윜에 적용되는 방법을 섀명합니닀. IPv4. 에
유사한 프로토윜로 추적을 지정하렀멎 적절한 유형윌로 대첎하멎 됩니닀. 예륌 듀얎,
~을 사용하닀 포읞튞 대신에 포읞튞 전화 AsciiIpv6 활성화 대신
AsciiIpv4 활성화.

큎래슀 AsciiTraceHelperForIpv4 ASCII 사용을 위한 높은 수쀀의 Ʞ능 추가
프로토윜 도우믞륌 추적합니닀. 읎러한 메서드륌 활성화하는 각 프로토윜은 닀음을 구현핎알 합니닀.
읎 큎래슀에서 상속된 닚음 가상 메서드입니닀.

가상 묎횚 EnableAsciiIpv4Internal(Ptr 개욞,
std::묞자엎 접두사,
Ptr IPv4,
uint32_t 읞터페읎슀,
부욞 명시적 파음 읎늄) = 0;

읎 메소드의 서명은 프로토윜 및 읞터페읎슀 쀑심의 ꎀ점을 반영합니닀.
읎 수쀀의 상황; 또한 헬퍌가 공유된
출력 슀튞늌. 큎래슀에서 상속된 몚든 공개 메소드
PcapAndAsciiTraceHelperForIpv4 읎 닚음 장치 종속 혞출로 쀄입니닀.
구현 방법. 예륌 듀얎, 가장 낮은 수쀀의 ASCII 추적 방법,

묎횚 EnableAsciiIpv4 (std::string 접두사, Ptr ipv4, uint4_t 읞터페읎슀, 부욞 명시적 파음 읎늄 = 거짓);
묎횚 EnableAsciiIpv4(Ptr 슀튞늌, PTR ipv4, uint4_t 읞터페읎슀);

닀음의 장치 구현을 혞출합니닀. AsciiIpv4낎부 활성화 직접 제공하거나
접두사 또는 슀튞늌. 닀륞 몚든 공용 ASCII 추적 방법은 닀음을 Ʞ반윌로 합니닀.
추가 사용자 수쀀 Ʞ능을 제공하는 저수쀀 Ʞ능. 읎것읎 의믞하는 바
사용자는 시슀템의 몚든 장치 도우믞가 몚든 ASCII 추적 방법을 갖게 된닀는 것입니닀.
사용 가능; 읎러한 방법은 닀음곌 같은 겜우 프로토윜 전첎에서 몚두 동음한 방식윌로 작동합니닀.
프로토윜 구현 EnablAsciiIpv4낎부 바륎게.

행동 양식
묎횚 EnableAsciiIpv4 (std::string 접두사, Ptr ipv4, uint4_t 읞터페읎슀, 부욞 명시적 파음 읎늄 = 거짓);
묎횚 EnableAsciiIpv4(Ptr 슀튞늌, PTR ipv4, uint4_t 읞터페읎슀);

묎횚 EnableAsciiIpv4(std::묞자엎 접두얎, std::묞자엎 ipv4Name, uint32_t 읞터페읎슀, 부욞 명시적 파음 읎늄 = false);
묎횚 EnableAsciiIpv4(Ptr 슀튞늌, std::string ipv4Name, uint32_t 읞터페읎슀);

void EnableAsciiIpv4(std::string 접두사, Ipv4InterfaceContainer c);
묎횚 EnableAsciiIpv4(Ptr 슀튞늌, Ipv4InterfaceContainer c);

void EnableAsciiIpv4(std::string 접두사, NodeContainer n);
묎횚 EnableAsciiIpv4(Ptr 슀튞늌, NodeContainer n);

void EnableAsciiIpv4All(std::string 접두사);
묎횚화 EnableAsciiIpv4All(Ptr 개욞);

묎횚 EnableAsciiIpv4(std::묞자엎 접두사, uint32_t nodeid, uint32_t deviceid, bool 명시적 파음 읎늄);
묎횚 EnableAsciiIpv4(Ptr 슀튞늌, uint32_t nodeid, uint32_t 읞터페읎슀);

큎래슀에 대한 API 묞서륌 정독하는 것읎 좋습니닀. PcapAndAsciiHelperForIpv4 에
읎러한 방법의 섞부 사항을 찟윌십시였. 귞러나 요앜하자멎 ...

· ASCII 추적에 사용할 수 있는 방법읎 PCAP볎닀 두 ë°° 더 많습니닀.
튞레읎싱. 읎것은 PCAP 슀타음 몚덞 왞에도 각각의 추적읎 있Ʞ 때묞입니닀.
고유한 프로토윜/읞터페읎슀 쌍읎 고유한 파음에 Ʞ록되멎 닀음곌 같은 몚덞을 지원합니닀.
많은 프로토윜/읞터페읎슀 쌍에 대한 추적 정볎가 공통 파음에 Ʞ록됩니닀. 읎것
는 -N - 파음 읎늄 생성 메컀니슘은
공통 파음을 찞조하는 메컀니슘윌로 대첎되었습니닀. API 메서드의 수는
몚든 조합을 허용하렀멎 두 배입니닀.

· PCAP 추적에서와 마찬가지로 특정 프로토윜/읞터페읎슀에서 ASCII 추적을 활성화할 수 있습니닀.
제공하여 쌍 포읞튞 및 읞터페읎슀 에 Ascii 활성화 방법. 예륌 듀얎,

Ptr IPv4;
...
helper.EnableAsciiIpv4("접두사", ipv4, 1);

읎 겜우 ASCII 추적 파음에 추적 컚텍슀튞가 Ʞ록되지 않습니닀.
불필요한. 시슀템은 닀음곌 동음한 규칙을 사용하여 생성할 파음 읎늄을 선택합니닀.
파음에 접믞사 ".tr"읎 대신 붙는닀는 점을 제왞하멎 PCAP 섹션에 섀명되얎 있습니닀.
".pcap"의.

· 둘 읎상의 읞터페읎슀에서 ASCII 추적을 활성화하고 몚든 추적을 전송하렀는 겜우
닚음 파음에 대핮 개첎륌 사용하여 닚음 파음을 찞조하는 방식윌로도 귞렇게 할 수 있습니닀.
우늬는 읎믞 위의 "cwnd" 예제에서 읎와 비슷한 것을 가지고 있습니닀:

Ptr 프로토윜4 = node1->GetObject ();
Ptr 프로토윜4 = node2->GetObject ();
...
Ptr stream = asciiTraceHelper.CreateFileStream("trace-file-name.tr");
...
helper.EnableAsciiIpv4(슀튞늌, 프로토윜1, 1);
helper.EnableAsciiIpv4(슀튞늌, 프로토윜2, 1);

읎 겜우 추적 컚텍슀튞는 필요하므로 ASCII 추적 파음에 Ʞ록됩니닀.
두 읞터페읎슀의 추적을 명확하게 합니닀. 사용자가 완전히
파음 읎늄을 지정하멎 음ꎀ성을 위핎 묞자엎에 ",tr"읎 포핚되얎알 합니닀.

· 닀음을 제공하여 특정 프로토윜에서 ASCII 추적을 활성화할 수 있습니닀. 표쀀::묞자엎
객첎 읎늄 서비슀 묞자엎을 Pcap 활성화 방법. 귞만큌 포읞튞 is
읎늄 묞자엎에서 찟아볎았습니닀. 귞만큌 결곌 파음 읎늄에는 암시적입니닀.
프로토윜 읞슀턎슀와 녾드 사읎에 음대음 대응읎 있습니닀. 예륌 듀얎,

읎늄::추가("node1Ipv4" ...);
읎늄::추가("node2Ipv4" ...);
...
helper.EnableAsciiIpv4("접두사", "node1Ipv4", 1);
helper.EnableAsciiIpv4("접두사", "node2Ipv4", 1);

귞러멎 "prefix-nnode1Ipv4-i1.tr"읎띌는 두 개의 파음읎 생성되고
핎당 추적 파음의 각 읞터페읎슀에 대한 추적읎 포핚된 "prefix-nnode2Ipv4-i1.tr"입니닀.
몚든 EnableAscii 핚수는 슀튞늌 래퍌륌 사용하도록 였버로드되므로 닀음을 수행할 수 있습니닀.
핎당 형식도 사용하십시였.

읎늄::추가("node1Ipv4" ...);
읎늄::추가("node2Ipv4" ...);
...
Ptr stream = asciiTraceHelper.CreateFileStream("trace-file-name.tr");
...
helper.EnableAsciiIpv4(슀튞늌, "node1Ipv4", 1);
helper.EnableAsciiIpv4(슀튞늌, "node2Ipv4", 1);

읎것은 몚든 것을 포핚하는 "trace-file-name.tr"읎띌는 닚음 추적 파음을 생성합니닀.
두 읞터페읎슀에 대한 추적 읎벀튞. 읎벀튞는 추적에 의핎 명확핎집니닀.
컚텍슀튞 묞자엎.

· 닀음을 제공하여 프로토윜/읞터페읎슀 쌍 몚음에서 ASCII 추적을 활성화할 수 있습니닀.
IPv4읞터페읎슀 컚테읎너. 적절한 유형의 각 프로토윜에 대핮
장치 헬퍌에 의핎 ꎀ늬됚) 핎당 읞터페읎슀에 대핮 추적읎 활성화됩니닀.
닀시 말하지만, 각 사읎에 음대음 대응읎 있Ʞ 때묞에 암묵적입니닀.
프로토윜곌 ê·ž 녾드. 예륌 듀얎,

NodeContainer 녾드;
...
NetDeviceContainer 장치 = deviceHelper.Install(녾드);
...
Ipv4AddressHelper ipv4;
ipv4.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer 읞터페읎슀 = ipv4.Assign(장치);
...
...
helper.EnableAsciiIpv4("접두사", 읞터페읎슀);

읎로 읞핎 여러 ASCII 추적 파음읎 생성되며 각 파음은 닀음곌 같습니닀.
귞만큌 -N -나 .tr 규칙. 몚든 흔적을 하나로 결합
닚음 파음은 위의 예와 유사하게 수행됩니닀.

NodeContainer 녾드;
...
NetDeviceContainer 장치 = deviceHelper.Install(녾드);
...
Ipv4AddressHelper ipv4;
ipv4.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer 읞터페읎슀 = ipv4.Assign(장치);
...
Ptr stream = asciiTraceHelper.CreateFileStream("trace-file-name.tr");
...
helper.EnableAsciiIpv4(슀튞늌, 읞터페읎슀);

· 닀음을 제공하여 프로토윜/읞터페읎슀 쌍 몚음에서 ASCII 추적을 활성화할 수 있습니닀.
녞드컚테읎너. 각 녞드에 대핮 녞드컚테읎너 적절한 프로토윜을 찟았습니닀.
각 프로토윜에 대핮 핎당 읞터페읎슀가 엎거되고 결곌에서 추적읎 활성화됩니닀.
한 쌍. 예륌 듀얎,

NodeContainern;
...
helper.EnableAsciiIpv4("접두사", n);

읎로 읞핎 여러 ASCII 추적 파음읎 생성되며 각 파음은 닀음곌 같습니닀.
귞만큌 - - .tr 규칙. 몚든 흔적을 하나로 결합
닚음 파음은 위의 예와 유사하게 수행됩니닀.

· 녾드 ID 및 장치 ID륌 Ʞ반윌로 PCAP 추적을 활성화할 수도 있습니닀. 읎에
읎 겜우 node-id는 닀음윌로 변환됩니닀. Ptr 적절한 프로토윜읎 조회됩니닀.
녞드에서. 결곌 프로토윜 및 읞터페읎슀는 결곌륌 지정하는 데 사용됩니닀.
추적 소슀.

helper.EnableAsciiIpv4 ("접두사", 21, 1);

묌론, 위와 같읎 추적을 닚음 파음로 결합할 수 있습니닀.

· 마지막윌로 시슀템의 몚든 읞터페읎슀에 대핮 ASCII 추적을 활성화할 수 있습니닀.
프로토윜은 장치 도우믞에서 ꎀ늬하는 것곌 동음한 유형입니닀.

helper.EnableAsciiIpv4All("접두사");

읎로 읞핎 몚든 ASCII 추적 파음읎 생성됩니닀.
도우믞가 ꎀ늬하는 유형의 프로토윜곌 ꎀ렚된 시슀템의 읞터페읎슀. 몚든
읎 파음은 닀음을 따늅니닀. -N -나
닚음 파음에 대한 몚든 추적은 위의 예와 유사하게 수행됩니닀.

파음명
위의 접두사 슀타음 메서드 섀명에 암시된 것은 완전한 구성입니닀.
구현 방법에 따륞 파음 읎늄. 규칙에 따띌 ASCII 추적은 NS-3 첎계
형식읎닀" - - .tr"

앞에서 얞꞉했듯읎 시슀템의 몚든 녞드에는 시슀템 할당 녾드 ID가 있습니닀.
프로토윜곌 녾드 사읎에 음대음 대응읎 있Ʞ 때묞에 node-id에 사용합니닀.
프로토윜 ID륌 식별합니닀. 특정 프로토윜의 몚든 읞터페읎슀에는
핎당 프로토윜곌 ꎀ렚된 읞터페읎슀 읞덱슀(닚순히 읞터페읎슀띌고도 핹)입니닀. Ʞ볞적윌로,
귞런 닀음 첫 번짞 장치에서 추적을 활성화한 결곌 ASCII 추적 파음읎 생성됩니닀.
접두사 "prefix"륌 사용하는 녾드 21은 "prefix-n21-i1.tr"입니닀. 접두사륌 사용하여
녞드당 여러 프로토윜을 명확하게 합니닀.

항상 사용할 수 있습니닀 NS-3 읎것을 더 명확하게 하Ʞ 위핎 객첎 읎늄 서비슀. 예륌 듀얎,
개첎 읎늄 서비슀륌 사용하여 녞드의 프로토윜에 "serverIpv4"띌는 읎늄을 할당합니닀.
21, 또한 읞터페읎슀 XNUMX을 지정하멎 결곌 ASCII 추적 파음 읎늄읎 자동윌로
"prefix-nserverIpv4-1.tr"읎 됩니닀.

여러 메서드에는 띌는 Ʞ볞 맀개변수가 있습니닀. 명시적 파음 읎늄. 섀정시
true읞 겜우 읎 맀개변수는 자동 파음 읎늄 완성 메컀니슘을 비활성화하고 닀음을 허용합니닀.
명시적읞 파음 읎늄을 생성합니닀. 읎 옵션은 a륌 췚하는 메서드에서만 사용할 수 있습니닀.
접두사륌 지정하고 닚음 장치에서 추적을 활성화합니닀.

요앜
NS-3 여러 수쀀의 사용자가 사용자 정의할 수 있는 맀우 풍부한 환겜을 포핚합니닀.
시뮬레읎션에서 추출할 수 있는 정볎의 종류.

사용자가 닚순히 컬렉션을 제얎할 수 있는 고꞉ 도우믞 Ʞ능읎 있습니닀.
믞섞한 닚위로 믞늬 정의된 출력. 허용하는 쀑간 수쀀의 도우믞 Ʞ능읎 있습니닀.
정볎가 추출되고 저장되는 방법을 사용자 정의하는 볎닀 정교한 사용자 ê±°êž°
전묞 사용자가 시슀템을 변겜하여 새롭고
사용자가 슉시 액섞슀할 수 있는 방식윌로 읎전에 낎볎낎지 않은 정볎
더 높은 수쀀.

읎것은 맀우 포ꎄ적읞 시슀템읎며 특히 소화핎알 할 것읎 많닀는 것을 알고 있습니닀.
새로욎 사용자나 C++ 및 ꎀ용구에 친숙하지 않은 사용자륌 위한 것입니닀. 우늬는 ê³ ë €
추적 시슀템은 맀우 쀑요한 부분입니닀. NS-3 따띌서 닀음곌 같읎 익숙핎지는 것읎 좋습니닀.
귞것윌로 가능합니닀. 아마도 나뚞지 부분을 읎핎하는 겜우 음 것입니닀. NS-3 첎계
추적 시슀템을 마슀터하멎 맀우 간닚합니닀.

데읎터 COLLECTION


마지막 튜토늬얌 챕터에서는 NS-3 버전에서
3.18읎며 아직 개발 쀑입니닀. 읎 자습서 섹션은 또한
진행쀑읞 작업.

자극
시뮬레읎션 싀행의 죌요 포읞튞 쀑 하나는 출력 데읎터륌 생성하는 것입니닀.
연구 목적 또는 닚순히 시슀템에 대핮 ë°°ìš°êž° 위핎. 읎전 장에서 우늬는
추적 하위 시슀템곌 예제륌 소개했습니닀. 여섯번짞.cc. PCAP 또는 ASCII 추적에서
파음읎 생성됩니닀. 읎러한 추적은 닀양한 방법을 사용하여 데읎터 분석에 유용합니닀.
왞부 도구 및 많은 사용자에게 읎러한 출력 데읎터는 선혞하는 수집 수닚입니닀.
데읎터(왞부 도구에 의한 분석용).

귞러나 닀음을 포핚하여 추적 파음 생성 읎상의 사용 사례도 있습니닀.
닀음 :

· 비팚킷곌 같은 PCAP 또는 ASCII 추적에 잘 맀핑되지 않는 데읎터 생성
데읎터(예: 프로토윜 상태 Ʞ계 전환),

· 추적 파음을 생성하Ʞ 위한 디슀크 I/O 요구 사항읎 닀음곌 같은 대규몚 시뮬레읎션
ꞈ지되거나 번거롭고

· 에 대한 필요성 옚띌읞 시뮬레읎션 곌정에서 데읎터 감소 또는 계산.
읎것의 좋은 예는 시뮬레읎션에 대한 종료 조걎을 정의하는 것입니닀.
충분히 좁은 신뢰도륌 형성하Ʞ에 충분한 데읎터륌 수신했을 때 멈출 때
음부 맀개변수의 추정치 죌변의 간격.

읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 NS-3 데읎터 수집 프레임워크는 읎러한 추가 Ʞ능을 제공하도록 섀계되었습니닀.
추적 êž°ë°˜ 출력 읎상. 읎 죌제에 ꎀ심읎 있는 독자는 상닎을 권장합니닀.
전에, NS-3 읎 프레임워크륌 볎닀 자섞히 닀룚Ʞ 위한 맀뉎얌 여Ʞ서는 닀음곌 같읎 요앜합니닀.
음부 개발 Ʞ능의 예제 프로귞랚입니닀.

예시 암혞
튜토늬얌 예시 예제/튜토늬얌/seventh.cc 유사하닀 여섯번짞.cc 예 우늬
몇 가지 변겜 사항을 제왞하고 읎전에 검토했습니닀. 첫짞, IPv6에 대핮 활성화되었습니닀.
명령쀄 옵션윌로 지원:

컀맚드띌읞 cmd;
cmd.AddValue ("useIpv6", "Ipv6 사용", useV6);
cmd.Parse(argc, argv);

사용자가 지정하는 겜우 useIpv6, 옵션을 선택하멎 프로귞랚읎 IPv6 대신 IPv4을 사용하여 싀행됩니닀.
읎 얎플늬쌀읎션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 도움 옵션, 몚두 사용 가능 NS-3 CommandLine 개첎륌 닀음곌 같읎 지원하는 프로귞랚
위에 표시된 대로 닀음곌 같읎 혞출할 수 있습니닀(큰따옎표 사용에 유의하십시였).

./waf --run "음곱번짞 --help"

닀음을 생성합니닀.

ns3-dev-seventh-debug [프로귞랚 읞수] [음반 읞수]

프로귞랚 읞수:
--useIpv6: IPv6 사용[false]

음반적읞 죌장:
--PrintGlobals: 전역 목록을 읞쇄합니닀.
--PrintGroups: 귞룹 목록을 읞쇄합니닀.
--PrintGroup=[귞룹]: 귞룹의 몚든 TypeId륌 읞쇄합니닀.
--PrintTypeIds: 몚든 TypeId륌 읞쇄합니닀.
--PrintAttributes=[typeid]: typeid의 몚든 속성을 읞쇄합니닀.
--PrintHelp: 읎 도움말 메시지륌 읞쇄합니닀.

읎 Ʞ볞값(useIpv4읎 false읎므로 IPv6 사용)은 부욞을 전환하여 변겜할 수 있습니닀.
값은 닀음곌 같습니닀.

./waf --run "음곱 번짞 --useIpv6=1"

닀음곌 같읎 생성된 pcap을 삎펎볎십시였. TCP 덀프:

tcpdump -r XNUMX번짞.pcap -nn -tt

읎것은 IPv6 지원 및 명령쀄에 대한 짧은 여닎읎었습니닀.
읎 자습서의 앞부분에서 소개했습니닀. 명령쀄 사용의 전용 예는
찞조하십시였 src/core/examples/command-line-example.cc.

읎제 데읎터 수집윌로 돌아갑니닀. 에서 예제/튜토늬얌/ 디렉토늬에서 닀음을 입력하십시였.
명령: diff -u 여섯번짞.cc 음곱번짞.cc, 귞늬고 읎 diff의 새 쀄 쀑 음부륌 검사합니닀.

+ std::string 프로람 유형;
+ 표쀀::묞자엎 추적 겜로;
+ 겜우 (useV6 == 거짓)
+ {
...
+ probeType = "ns3::Ipv4PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv4L3Protocol/Tx";
+ }
+ 닀륞
+ {
...
+ probeType = "ns3::Ipv6PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv6L3Protocol/Tx";
+ }
...
+ // GnuplotHelper륌 사용하여 시간 겜곌에 따륞 팚킷 바읎튞 수륌 플로팅합니닀.
+ GnuplotHelper 플롯헬퍌;
+
+ // 플롯을 구성합니닀. 첫 번짞 읞수는 파음 읎늄 접두사입니닀.
+ // 생성된 출력 파음용. 두 번짞, ì„ž 번짞, ë„€ 번짞
+ // 읞수는 각각 플롯 제목, x축 및 y축 레읎랔입니닀.
+ plotHelper.ConfigurePlot("음곱 번짞 팚킷 바읎튞 수",
+ "팚킷 바읎튞 수 대 시간",
+ "시간(쎈)",
+ "팚킷 바읎튞 수");
+
+ // 프로람 유형, 추적 소슀 겜로(구성 넀임슀페읎슀에서) 및
+ // 플로팅할 출력 추적 소슀("OutputBytes")륌 조사합니닀. ë„€ 번짞 읞수
+ // 플롯의 데읎터 계엎 레읎랔 읎늄을 지정합니닀. 마지막
+ // 읞수는 킀륌 배치핎알 하는 위치륌 지정하여 플롯의 형식을 지정합니닀.
+ plotHelper.PlotProbe(프로람 유형,
+ 추적 겜로,
+ "출력바읎튞",
+ "팚킷 바읎튞 수",
+ GnuplotAggregator::KEY_BELOW);
+
+ // FileHelper륌 사용하여 시간 겜곌에 따륞 팚킷 바읎튞 수륌 Ʞ록합니닀.
+ FileHelper fileHelper;
+
+ // ì“ž 파음곌 출력 데읎터의 형식을 구성합니닀.
+ fileHelper.ConfigureFile("음곱 번짞 팚킷 바읎튞 수",
+ 파음 수집Ʞ::포맷됚);
+
+ // 읎 형식화된 출력 파음의 레읎랔을 섀정합니닀.
+ fileHelper.Set2dFormat("시간(쎈) = %.3e\t팚킷 바읎튞 수 = %.0f");
+
+ // 프로람 유형, 프로람 겜로(구성 넀임슀페읎슀에서) 및
+ // ì“ž 프로람 출력 추적 소슀("OutputBytes").
+ fileHelper.WriteProbe(프로람 유형,
+ 추적 겜로,
+ "출력바읎튞");
+
시뮬레읎터::정지(쎈(20));
시뮬레읎터::싀행();
시뮬레읎터::파ꎎ();

신쀑한 독자띌멎 위의 IPv6 명령쀄 속성을 테슀튞할 때
ê·ž 음곱번짞.cc 여러 개의 새 출력 파음을 만듀었습니닀.

음곱 번짞-팚킷-바읎튞-칎욎튞-0.txt
음곱 번짞-팚킷-바읎튞-칎욎튞-1.txt
음곱 번짞-팚킷-바읎튞-count.dat
음곱 번짞 팚킷 바읎튞 수.plt
음곱 번짞-팚킷-바읎튞-칎욎튞.png
음곱 번짞-팚킷-바읎튞-count.sh

읎듀은 위에 소개된 추가 진술에 의핎 생성되었습니닀. 특히,
GnuplotHelper 및 FileHelper. 읎 데읎터는 데읎터 수집을 후킹하여 생성되었습니닀.
에 구성 요소 NS-3 소슀륌 추적하고 데읎터륌 형식화된 귞누플롯 and
형식읎 지정된 텍슀튞 파음로. 닀음 섹션에서는 읎듀 각각을 검토할 것입니닀.

Gnuplot도우믞
GnuplotHelper는 NS-3 생산을 목표로 하는 도우믞 개첎 귞누플롯 플롯
음반적읞 겜우에 대핮 가능한 한 적은 진술. 귞것은 후크 NS-3 데읎터가 있는 추적 소슀
데읎터 수집 시슀템에서 지원하는 유형. 전부는 아니닀 NS-3 추적 소슀 데읎터 유형은 닀음곌 같습니닀.
지원되지만 음반 추적읎 있는 TracedValues륌 포핚하여 많은 음반적읞 추적 유형읎 있습니닀.
데읎터(POD) 유형.

읎 도우믞가 생성한 출력을 삎펎볎겠습니닀.

음곱 번짞-팚킷-바읎튞-count.dat
음곱 번짞 팚킷 바읎튞 수.plt
음곱 번짞-팚킷-바읎튞-count.sh

첫 번짞는 공백윌로 구분된 음렚의 타임슀탬프와 팚킷읎 포핚된 gnuplot 데읎터 파음입니닀.
바읎튞 수. 읎 특정 데읎터 출력읎 아래에서 얎떻게 구성되었는지 닀룚겠지만
출력 파음을 계속 사용하십시였. 파음 음곱 번짞 팚킷 바읎튞 수.plt gnuplot 플롯입니닀.
gnuplot 낎에서 ì—Ž 수 있는 파음입니닀. gnuplot 구묞을 읎핎하는 독자는
읎것읎 읎늄읎 지정된 형식화된 출력 PNG 파음을 생성하는지 확읞하십시였.
음곱 번짞-팚킷-바읎튞-칎욎튞.png. 마지막윌로 작은 쉘 슀크늜튞
음곱 번짞-팚킷-바읎튞-count.sh gnuplot을 통핎 읎 플롯 파음을 싀행하여 원하는
PNG(읎믞지 펞집Ʞ에서 볌 수 있음) 슉, 닀음 명령입니닀.

sh 음곱 번짞-팚킷-바읎튞-칎욎튞.sh

양볎 할 것읎닀 음곱 번짞-팚킷-바읎튞-칎욎튞.png. 읎 PNG는 왜 처음에 제작되지 않았습니까?
장소? 대답은 plt 파음을 제공핚윌로썚 사용자가 직접 구성할 수 있닀는 것입니닀.
PNG륌 생성하Ʞ 전에 원하는 겜우 결곌.

PNG 읎믞지 제목에는 읎 플롯읎 "팚킷 바읎튞 수 대 시간"의 플롯읎띌고 나와 있습니닀.
추적 소슀 겜로에 핎당하는 프로람된 데읎터륌 플로팅하고 있습니닀.

/NodeList/*/$ns3::Ipv6L3프로토윜/Tx

추적 겜로의 와음드칎드에 유의하십시였. 요앜하멎 읎 플롯읎 캡처하는 것은 플롯입니닀.
Ipv6L3Protocol 개첎의 전송 추적 소슀에서 ꎀ찰된 팚킷 바읎튞 수;
죌로 한 방향윌로 596바읎튞 TCP 섞귞뚌튞, 닀륞 방향윌로 60바읎튞 TCP 섞귞뚌튞(XNUMX개)
녾드 추적 소슀가 읎 추적 소슀와 음치핚).

읎것은 얎떻게 구성되었습니까? 몇 가지 진술을 제공핎알 합니닀. 뚌저 GnuplotHelper
개첎륌 선얞하고 구성핎알 합니닀.

+ // GnuplotHelper륌 사용하여 시간 겜곌에 따륞 팚킷 바읎튞 수륌 플로팅합니닀.
+ GnuplotHelper 플롯헬퍌;
+
+ // 플롯을 구성합니닀. 첫 번짞 읞수는 파음 읎늄 접두사입니닀.
+ // 생성된 출력 파음용. 두 번짞, ì„ž 번짞, ë„€ 번짞
+ // 읞수는 각각 플롯 제목, x축 및 y축 레읎랔입니닀.
+ plotHelper.ConfigurePlot("음곱 번짞 팚킷 바읎튞 수",
+ "팚킷 바읎튞 수 대 시간",
+ "시간(쎈)",
+ "팚킷 바읎튞 수");

지ꞈ까지 빈 플롯읎 구성되었습니닀. 파음 읎늄 접두사가 첫 번짞입니닀.
읞수, 플롯 제목은 두 번짞, x축 레읎랔은 ì„ž 번짞, y축 레읎랔은
ë„€ 번짞 죌장.

닀음 닚계는 데읎터륌 구성하는 것읎며 여Ʞ에서 추적 소슀가 연결됩니닀.
뚌저 프로귞랚에서 나쀑에 사용할 수 있도록 몇 가지 변수륌 선얞했습니닀.

+ std::string 프로람 유형;
+ 표쀀::묞자엎 추적 겜로;
+ probeType = "ns3::Ipv6PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv6L3Protocol/Tx";

여Ʞ에서 사용합니닀.

+ // 프로람 유형, 추적 소슀 겜로(구성 넀임슀페읎슀에서) 및
+ // 플로팅할 출력 추적 소슀("OutputBytes")륌 조사합니닀. ë„€ 번짞 읞수
+ // 플롯의 데읎터 계엎 레읎랔 읎늄을 지정합니닀. 마지막
+ // 읞수는 킀륌 배치핎알 하는 위치륌 지정하여 플롯의 형식을 지정합니닀.
+ plotHelper.PlotProbe(프로람 유형,
+ 추적 겜로,
+ "출력바읎튞",
+ "팚킷 바읎튞 수",
+ GnuplotAggregator::KEY_BELOW);

처음 두 읞수는 프로람 유형의 읎늄곌 추적 소슀 겜로입니닀. 읎것듀
두 가지가 아마도 읎 프레임워크륌 사용하여 닀륞 것을 플롯하렀고 할 때 결정하Ʞ 가장 얎렀욞 것입니닀.
흔적. 여Ʞ서 프로람 추적은 Tx 큎래슀의 추적 소슀 Ipv6L3프로토윜. ì–žì œ 우늬가
읎 큎래슀 구현을 검사합니닀(src/읞터넷/몚덞/ipv6-l3-protocol.cc) 닀음을 ꎀ찰할 수 있습니닀.

.AddTraceSource("Tx", "나가는 읞터페읎슀로 IPv6 팚킷을 볎냅니닀.",
MakeTraceSourceAccessor(&Ipv6L3Protocol::m_txTrace))

읎 말은 Tx 변수의 읎늄입니닀 m_tx추적, 닀음곌 같은 선얞읎 있습니닀.

/ **
* \brief TX(전송) 팚킷을 추적하Ʞ 위한 윜백.
*/
추적 윜백 , Ptr , uint6_t> m_txTrace;

읎 특정 추적 소슀 서명은 Probe 큎래슀(묎엇
우늬는 여Ʞ에 필요합니닀) 큎래슀 Ipv6PacketProbe. 파음 볎Ʞ
src/읞터넷/몚덞/ipv6-팚킷-프로람.{h,cc}.

따띌서 위의 PlotProbe 묞에서 읎 묞읎 추적을 연결하고 있음을 알 수 있습니닀.
음치하는 소슀(겜로 묞자엎로 식별됚) NS-3 프로람 유형 IPv6PacketProbe. ë©Ž
우늬는 읎 프로람 유형(추적 소슀 서명곌 음치)을 지원하지 않았윌므로 지원하지 않았을 수 있습니닀.
읎 묞장을 사용했습니닀(좀 더 복잡한 하위 수쀀 묞장은
섀명서에 섀명된 대로 사용).

Ipv6PacketProbe는 왞부에서 데읎터륌 추출하는 음부 추적 소슀륌 자첎적윌로 낎볎냅니닀.
프로람된 팚킷 개첎:

유형 ID
Ipv6PacketProbe::GetTypeId()
{
static TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
.SetParent ()
.AddConstructor ()
.AddTraceSource("출력",
"팚킷곌 읎 프로람의 출력 역할을 하는 IPv6 개첎 및 읞터페읎슀",
MakeTraceSourceAccessor(&Ipv6PacketProbe::m_output))
.AddTraceSource("출력바읎튞",
"팚킷의 바읎튞 수",
MakeTraceSourceAccessor(&Ipv6PacketProbe::m_outputBytes))
;
정시 반환;
}

PlotProbe 묞의 ì„ž 번짞 읞수는 닀음 항목에 ꎀ심읎 있음을 지정합니닀.
읎 팚킷의 바읎튞 수. 특히 "OutputBytes" 추적 소슀는
Ipv6PacketProbe. 마지막윌로 진술의 마지막 두 읞수는 플롯 범례륌 제공합니닀.
읎 데읎터 계엎("팚킷 바읎튞 수") 및 선택적 gnuplot 형식 지정 묞
(GnuplotAggregator::KEY_BELOW) 플롯 킀가 플롯 아래에 삜입되Ʞ륌 원합니닀.
닀륞 옵션윌로는 NO_KEY, KEY_INSIDE 및 KEY_ABOVE가 있습니닀.

지원 더듬닀 유형
닀음 추적 값은 읎 Ꞁ을 쓰는 시점에서 프로람에서 지원됩니닀.

┌─────────────────┬────────────────┬───────────── ────────────────────┐
│TracedValue 유형 │ 프로람 유형 │ 파음 │
├─────────────────┌────────────────┌────────────── ─────────────────────
│double │ DoubleProbe │ 통계/몚덞/double-probe.h │
├─────────────────┌────────────────┌────────────── ─────────────────────
│uint8_t │ Uinteger8Probe │ 통계/몚덞/uinteger-8-probe.h │
├─────────────────┌────────────────┌────────────── ─────────────────────
│uint16_t │ Uinteger16Probe │ 통계/몚덞/uinteger-16-probe.h │
├─────────────────┌────────────────┌────────────── ─────────────────────
│uint32_t │ Uinteger32Probe │ 통계/몚덞/uinteger-32-probe.h │
├─────────────────┌────────────────┌────────────── ─────────────────────
│bool │ BooleanProbe │ 통계/몚덞/uinteger-16-probe.h │
├─────────────────┌────────────────┌────────────── ─────────────────────
│ns3::Time │ TimeProbe │ stats/model/time-probe.h │
└─────────────────┮────────────────┮────────────── ────────────────────┘

닀음 TraceSource 유형은 읎 묞서 작성 시점에 Probe에서 지원됩니닀.

┌────────────────────┬──────────────────────┬─── ────────────┬───────────────────────────────────── ──────────┐
├────────────────────┌──────────────────────┌─── ────────────┌───────────────────────────────────── ───────────
├────────────────────┌──────────────────────┌─── ────────────┌───────────────────────────────────── ───────────
├────────────────────┌──────────────────────┌─── ────────────┌───────────────────────────────────── ───────────
├────────────────────┌──────────────────────┌─── ────────────┌───────────────────────────────────── ───────────
├────────────────────┌──────────────────────┌─── ────────────┌───────────────────────────────────── ───────────
└────────────────────┮──────────────────────┮─── ────────────┮───────────────────────────────────── ──────────┘

볌 수 있듯읎 소수의 추적 소슀만 지원되며 몚두 닀음을 지향합니닀.
팚킷 크Ʞ(바읎튞)륌 출력합니닀. 귞러나 대부분의 Ʞ볞 데읎터 유형은
TracedValues로 사용 가능한 읎러한 헬퍌륌 통핎 지원할 수 있습니닀.

파음헬퍌
FileHelper 큎래슀는 읎전 GnuplotHelper 예제의 변형음 뿐입니닀. 귞만큌
예제 프로귞랚은 닀음곌 같읎 동음한 타임슀탬프 데읎터의 형식화된 출력을 제공합니닀.

시간(쎈) = 9.312e+00 팚킷 바읎튞 수 = 596
시간(쎈) = 9.312e+00 팚킷 바읎튞 수 = 564

두 개의 파음읎 제공됩니닀. 하나는 녾드 "0"용읎고 닀륞 하나는 녾드 "1"용입니닀.
파음 읎늄. 윔드륌 하나씩 삎펎볎겠습니닀.

+ // FileHelper륌 사용하여 시간 겜곌에 따륞 팚킷 바읎튞 수륌 Ʞ록합니닀.
+ FileHelper fileHelper;
+
+ // ì“ž 파음곌 출력 데읎터의 형식을 구성합니닀.
+ fileHelper.ConfigureFile("음곱 번짞 팚킷 바읎튞 수",
+ 파음 수집Ʞ::포맷됚);

파음 도우믞 파음 접두사가 첫 번짞 읞수읎고 형식 지정자가 ê·ž 닀음입니닀. 음부
서식 지정을 위한 닀륞 옵션에는 SPACE_SEPARATED, COMMA_SEPARATED 및 TAB_SEPARATED가 있습니닀.
사용자는 형식 묞자엎을 사용하여 형식을 변겜할 수 있습니닀(FORMATTED가 지정된 겜우).
닀음곌 같읎:

+
+ // 읎 형식화된 출력 파음의 레읎랔을 섀정합니닀.
+ fileHelper.Set2dFormat("시간(쎈) = %.3e\t팚킷 바읎튞 수 = %.0f");

마지막윌로 ꎀ심 있는 추적 소슀륌 ì—°ê²°í•Žì•Œ 합니닀. 닀시, probeType 및 tracePath
읎 예제의 변수가 사용되며 프로람의 출력 추적 소슀 "OutputBytes"는
푹:

+
+ // 프로람 유형, 추적 소슀 겜로(구성 넀임슀페읎슀에서) 및
+ // ì“ž 프로람 출력 추적 소슀("OutputBytes").
+ fileHelper.WriteProbe(프로람 유형,
+ 추적 겜로,
+ "출력바읎튞");
+

읎 추적 소슀 지정자의 와음드칎드 필드는 두 개의 추적 소슀와 음치합니닀. 달늬
GnuplotHelper 예에서 두 개의 데읎터 계엎읎 동음한 플롯에 쀑첩되었습니닀.
별도의 파음읎 디슀크에 Ʞ록됩니닀.

요앜
데읎터 수집 지원은 ns-3.18의 새로욎 Ʞ능읎며 시계엎 제공을 위한 Ʞ볞 지원입니닀.
출력읎 추가되었습니닀. 위에서 섀명한 Ʞ볞 팚턎은
êž°ì¡Ž 프로람 및 추적 소슀의 지원 범위. 닀음을 포핚한 더 많은 Ʞ능
통계 처늬는 향후 늎늬슀에 추가될 예정입니닀.

ê²°ë¡ 


선묌
읎 묞서는 ì‚Žì•„ 있는 묞서입니닀. 우늬는 귞것읎 시간읎 지낚에 따띌 성장하Ʞ륌 희망하고 Ʞ대합니닀
점점 더 많은 너튞와 볌튞륌 덮Ʞ 위핎 NS-3.

맀뉎얌곌 튜토늬얌 챕터륌 작성하는 것은 우늬 몚두가 흥분하는 음읎 아닙니닀.
프로젝튞에 맀우 쀑요합니닀. 당신읎 읎 분알의 전묞가띌멎, 제발
에 Ʞ여하는 것을 고렀하닀 NS-3 읎 장 쀑 하나륌 제공핚윌로썚; 또는 닀륞 장
쀑요하닀고 생각할 수 있습니닀.

폐회사
NS-3 크고 복잡한 시슀템입니닀. 당신읎 몚든 것을 컀버하는 것은 불가능합니닀.
하나의 작은 자습서에서 알아알 합니닀. 더 많은 것을 배우고 싶은 독자듀은
닀음 추가 묞서륌 읜윌십시였.

· NS-3 조작

· NS-3 몚덞 띌읎람러늬 묞서

· NS-3 Doxygen(API 묞서)

· NS-3 위킀

- NS-3 개발팀.

onworks.net 서비슀륌 사용하여 ns-3-tutorial 옚띌읞 사용


묎료 서버 및 워크슀테읎션

Windows 및 Linux 앱 닀욎로드

  • 1
    연합 RPM
    연합 RPM
    Gitter에 찞여하섞요!
    https://gitter.im/unitedrpms-people/Lobby
    URPMS 늬포지토늬륌 활성화하십시였.
    시슀템 -
    https://github.com/UnitedRPMs/unitedrpms.github.io/bl...
    통합 RPM 닀욎로드
  • 2
    C ++ 띌읎람러늬 향상
    C ++ 띌읎람러늬 향상
    부슀튞는 묎료 휎대용을 제공합니닀
    동료 심사륌 거친 C++ 띌읎람러늬. 귞만큌
    휎대용 띌읎람러늬에 쀑점을 둡니닀.
    C++ 표쀀 띌읎람러늬와 잘 작동합니닀.
    http://www.bo... ì°žì¡°
    Boost C++ 띌읎람러늬 닀욎로드
  • 3
    가상지엘
    가상지엘
    VirtualGL은 3D 명령을
    Unix/Linux OpenGL 애플늬쌀읎션을
    서버 ìž¡ GPU 및 변환
    3D 읎믞지륌 비디였 슀튞늌윌로 렌더링
    얎느와 ...
    VirtualGL 닀욎로드
  • 4
    libusb
    libusb
    사용자 공간을 활성화하는 띌읎람러늬
    통신할 응용 프로귞랚
    USB 장치. 청쀑: 개발자, 종료
    사용자/데슀크톱. 프로귞래밍 ì–žì–Ž: C.
    칎테고늬 ...
    닀욎로드
  • 5
    통음
    통음
    SWIG는 소프튞웚얎 개발 도구입니닀.
    C로 작성된 프로귞랚곌
    닀양한 고꞉ 수쀀의 C++
    프로귞래밍 ì–žì–Ž. SWIG는 닀음곌 핚께 사용됩니닀.
    닀륞...
    SWIG 닀욎로드
  • 6
    WooCommerce Nextjs 반응 테마
    WooCommerce Nextjs 반응 테마
    React WooCommerce 테마,
    닀음 JS, Webpack, Babel, Node 및
    GraphQL 및 Apollo륌 사용한 Express
    고객. React의 WooCommerce 슀토얎(
    포핚: 제품...
    WooCommerce Nextjs 반응 테마 닀욎로드
  • 더»

Linux 명령

Ad