ns-3 ๋„คํŠธ์›Œํฌ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ํŠœํ† ๋ฆฌ์–ผ. ์ œ5์žฅ

ns-3 ๋„คํŠธ์›Œํฌ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ํŠœํ† ๋ฆฌ์–ผ. ์ œ5์žฅ
1,2 ์žฅ
3ํ™”
4ํ™”

5๊ฐ€์ง€ ์„ค์ •
5.1 ๋กœ๊น… ๋ชจ๋“ˆ ์‚ฌ์šฉ
5.1.1 ๋กœ๊น… ๊ฐœ์š”
5.1.2 ๋กœ๊น… ํ™œ์„ฑํ™”
5.1.3 ์ฝ”๋“œ์— ๋กœ๊น… ์ถ”๊ฐ€
5.2 ๋ช…๋ น์ค„ ์ธ์ˆ˜ ์‚ฌ์šฉ
5.2.1 ๊ธฐ๋ณธ ์†์„ฑ ๊ฐ’ ์žฌ์ •์˜
5.2.2 ์ž์‹ ๋งŒ์˜ ๋ช…๋ น ์บก์ฒ˜
5.3 ์ถ”์  ์‹œ์Šคํ…œ ์‚ฌ์šฉ
5.3.1 ASCII ์ถ”์ 
ASCII ์ถ”์  ๊ตฌ๋ฌธ ๋ถ„์„
5.3.2 PCAP ์ถ”์ 

์žฅ 5

์กฐ์ •

5.1 ๋กœ๊น… ๋ชจ๋“ˆ ์‚ฌ์šฉ

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด๋ฉด์„œ ns-3 ๋กœ๊น… ๋ชจ๋“ˆ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ.cc. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ๋กœ๊น… ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ๊ฐ€๋Šฅํ•œ ์šฉ๋„๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

5.1.1 ๋กœ๊น… ๊ฐœ์š”

๋งŽ์€ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์€ ์ผ์ข…์˜ ๋ฉ”์‹œ์ง€ ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ ns-3๋„ ์˜ˆ์™ธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ "์šด์˜์ž ์ฝ˜์†”"(์ผ๋ฐ˜์ ์œผ๋กœ Unix ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ๋Š” stderr)์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋งŒ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋” ์ž์„ธํ•œ ์ •๋ณด์™€ ํ•จ๊ป˜ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ถœ๋ ฅ์„ ๋น ๋ฅด๊ฒŒ ํ๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ns-3์—์„œ ์‚ฌ์šฉ๋˜๋Š” subHRD๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ˆ˜์ค€์˜ ์ •๋ณด ์ฝ˜ํ…์ธ ๊ฐ€ ์œ ์šฉํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ฉ”์‹œ์ง€ ๋กœ๊น…์— ๋Œ€ํ•œ ์„ ํƒ์ ์ด๊ณ  ๊ณ„์ธตํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊น…์€ ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜, ๊ตฌ์„ฑ ์š”์†Œ๋ณ„๋กœ ๋˜๋Š” ์ „์ฒด์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์กฐ์ • ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์˜ ์ •๋ณด ์ฝ˜ํ…์ธ ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ns-3 ๋กœ๊น… ๋ชจ๋“ˆ์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•œ ๋ฒ”์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ ์ถ”์ ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ถœ๋ ฅ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ถ”์  ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŠœํ† ๋ฆฌ์–ผ ์„น์…˜ 5.3์„ ์ฐธ์กฐํ•˜์„ธ์š”). ๋กœ๊น…์€ ๋””๋ฒ„๊น… ์ •๋ณด, ๊ฒฝ๊ณ , ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์–ป๊ฑฐ๋‚˜ ์–ธ์ œ๋“ ์ง€ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋ชจ๋ธ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์‹œ์Šคํ…œ์€ ์ •๋ณด ๋‚ด์šฉ์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ XNUMX๊ฐ€์ง€ ์ˆ˜์ค€(์œ ํ˜•)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • LOG_ERROR - ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋กœ๊น…(๊ด€๋ จ ๋งคํฌ๋กœ: NS_LOG_ERROR);
  • LOG_WARN - ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ๊ธฐ๋ก(๊ด€๋ จ ๋งคํฌ๋กœ: NS_LOG_WARN);
  • LOG_DEBUG - ์ƒ๋Œ€์ ์œผ๋กœ ๋“œ๋ฌธ ํŠน์ˆ˜ ๋””๋ฒ„๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค(๊ด€๋ จ ๋งคํฌ๋กœ: NS_LOG_DEBUG).
  • LOG_INFO - ํ”„๋กœ๊ทธ๋žจ ์ง„ํ–‰์— ๊ด€ํ•œ ์ •๋ณด ๋ฉ”์‹œ์ง€ ๋“ฑ๋ก(๊ด€๋ จ ๋งคํฌ๋กœ: NS_LOG_INFO)
  • LOG_FUNCTION - ํ˜ธ์ถœ๋œ ๊ฐ ํ•จ์ˆ˜(๋‘ ๊ฐœ์˜ ๊ด€๋ จ ๋งคํฌ๋กœ: ๋ฉค๋ฒ„ ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” NS_LOG_FUNCTION ๋ฐ ์ •์  ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” NS_LOG_FUNCTION_NOARGS)๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • LOG_LOGIC - ํ•จ์ˆ˜ ๋‚ด์˜ ๋…ผ๋ฆฌ์  ํ๋ฆ„์„ ์„ค๋ช…ํ•˜๋Š” ๋กœ๊น… ๋ฉ”์‹œ์ง€(๊ด€๋ จ ๋งคํฌ๋กœ: NS_LOG_LOGIC)
  • LOG_ALL - ์œ„์— ์–ธ๊ธ‰๋œ ๋ชจ๋“  ๋‚ด์šฉ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค(๊ด€๋ จ ๋งคํฌ๋กœ ์—†์Œ).
    ๊ฐ ์œ ํ˜•(LOG_TYPE)์—๋Š” LOG_LEVEL_TYPE๋„ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์ฒด ์ˆ˜์ค€ ์™ธ์—๋„ ๊ทธ ์œ„์˜ ๋ชจ๋“  ์ˆ˜์ค€์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ฒฐ๊ณผ์ ์œผ๋กœ LOG_ERROR์™€ LOG_LEVEL_ERROR, LOG_ALL๊ณผ LOG_LEVEL_ALL์€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.) ์˜ˆ๋ฅผ ๋“ค์–ด LOG_INFO๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด NS_LOG_INFO ๋งคํฌ๋กœ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์‹œ์ง€๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, LOG_LEVEL_INFO๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด NS_LOG_DEBUG, NS_LOG_WARN ๋ฐ NS_LOG_ERROR ๋งคํฌ๋กœ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์‹œ์ง€๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋กœ๊น… ์ˆ˜์ค€์ด๋‚˜ ์„ ํƒ ๊ตฌ์„ฑ ์š”์†Œ์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ํ‘œ์‹œ๋˜๋Š” ๋ฌด์กฐ๊ฑด ๋กœ๊น… ๋งคํฌ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • NS_LOG_UNCOND - ๊ด€๋ จ ๋ฉ”์‹œ์ง€์˜ ๋ฌด์กฐ๊ฑด ๋กœ๊น…(๊ด€๋ จ ๋กœ๊น… ์ˆ˜์ค€ ์—†์Œ)

๊ฐ ์ˆ˜์ค€์€ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋˜๋Š” ๋ˆ„์ ์ ์œผ๋กœ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊น…์€ sh ํ™˜๊ฒฝ ๋ณ€์ˆ˜ NS_LOG๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋กœ๊น…ํ•˜์—ฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ๋กœ๊น… ์‹œ์Šคํ…œ์—๋Š” Doxygen ๋ฌธ์„œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์•„์ง ๊ฒ€ํ† ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ง€๊ธˆ ๊ฒ€ํ† ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋ฌธ์„œ๋ฅผ ๋งค์šฐ ์ž์„ธํžˆ ์ฝ์—ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ง€์‹์„ ํ™œ์šฉํ•˜์—ฌ ์˜ˆ์ œ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๋ฅผ ์–ป์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ž˜์น˜/myfirst.cc์ด๋ฏธ ์ปดํŒŒ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

5.1.2 ๋กœ๊น… ํ™œ์„ฑํ™”

NS_LOG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋งŽ์€ ๋กœ๊ทธ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋ฐฉํ–ฅ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์— ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋งˆ์ง€๋ง‰ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ ./waf --run scratch/myfirst

์ฒซ ๋ฒˆ์งธ ns-3 ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์˜ ์นœ์ˆ™ํ•œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

์œ„์— ํ‘œ์‹œ๋œ "์ „์†ก" ๋ฐ "์ˆ˜์‹ " ๋ฉ”์‹œ์ง€๋Š” ์‹ค์ œ๋กœ๋Š” ๋‹ค์Œ์—์„œ ๊ธฐ๋ก๋œ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. UdpEchoClient์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ะธ UdpEchoServer์‘์šฉ ํ”„๋กœ๊ทธ๋žจ. ์˜ˆ๋ฅผ ๋“ค์–ด, NS_LOG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋กœ๊น… ์ˆ˜์ค€์„ ์„ค์ •ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ธ์‡„ํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ๋Š” "VARIABLE=value" ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” sh์™€ ๊ฐ™์€ ์‰˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. csh์™€ ์œ ์‚ฌํ•œ ์…ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์ œ๋ฅผ ํ•ด๋‹น ์…ธ์—์„œ ์š”๊ตฌํ•˜๋Š” "setenv ๋ณ€์ˆ˜ ๊ฐ’" ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ UDP ์—์ฝ” ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ ์ฝ”๋“œ ์ค„์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ž˜์น˜/myfirst.cc,

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

๋กœ๊น… ์ˆ˜์ค€ LOG_LEVEL_INFO๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊น… ์ˆ˜์ค€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์‹ค์ œ๋กœ ํ•ด๋‹น ์ˆ˜์ค€๊ณผ ๋ชจ๋“  ํ•˜์œ„ ์ˆ˜์ค€์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN ๋ฐ NS_LOG_ERROR๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. NS_LOG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ๋ณ€๊ฒฝ์ด๋‚˜ ์žฌ์ปดํŒŒ์ผ ์—†์ด ๋กœ๊น… ์ˆ˜์ค€์„ ๋†’์ด๊ณ  ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ export NS_LOG=UdpEchoClientApplication=level_all

๋”ฐ๋ผ์„œ sh ์‰˜ ๋ณ€์ˆ˜ NS_LOG๋ฅผ ๋‹ค์Œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

UdpEchoClientApplication=level_all

ํ• ๋‹น์˜ ์™ผ์ชฝ์€ ๊ตฌ์„ฑํ•˜๋ ค๋Š” ๊ธฐ๋ก๋œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ด๋ฆ„์ด๊ณ  ์˜ค๋ฅธ์ชฝ์€ ์ ์šฉํ•  ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ชจ๋“  ์ˆ˜์ค€์˜ ๋””๋ฒ„๊น…์„ ํ™œ์„ฑํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. NS_LOG๋ฅผ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ns-3 ๋กœ๊น… ์‹œ์Šคํ…œ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜๋ฝํ•˜๊ณ  ๋‹ค์Œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ œ๊ณตํ•˜๋Š” ์ถ”๊ฐ€ ๋””๋ฒ„๊น… ์ •๋ณด๋Š” ์ด์ œ NS_LOG_FUNCTION ์ˆ˜์ค€์— ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ค‘ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ ํ•จ์ˆ˜์—์„œ๋Š” (์ตœ์†Œํ•œ) ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.NS_LOG_FUNCTION (this)... ์‚ฌ์šฉ NS_LOG_FUNCTION_NOARGS ()
์ •์  ํ•จ์ˆ˜์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ns-3 ์‹œ์Šคํ…œ์€ ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์ง€์›ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ •๋ณด๊ฐ€ ๊ธฐ๋ก๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์€ ๊ฐœ๋ณ„ ๋ชจ๋ธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. echo ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋Œ€๋Ÿ‰์˜ ๋กœ๊น… ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ˆ˜ํ–‰๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ๋ณด๋ฉด ์ค„ ์‚ฌ์ด์— ์ฝœ๋ก ์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UdpEchoClient์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ทธ๋ฆฌ๊ณ  C++ ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž(: :)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์˜๋„์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Š” ์‹ค์ œ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ๋กœ๊น… ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์†Œ์Šค ํŒŒ์ผ๊ณผ ํด๋ž˜์Šค๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉฐ ์ด์ค‘ ์ฝœ๋ก  ๋Œ€์‹  ๋‹จ์ผ ์ฝœ๋ก ์ด ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋ฏธ๋ฌ˜ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„์—์„œ ๋กœ๊น… Bean ์ด๋ฆ„์„ ๊ฐœ๋…์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์‹ค์ œ๋กœ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ํ…์ŠคํŠธ๋ฅผ ๋ณด์‹œ๋ฉด "๋ผ๋Š” ์ค„์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.Received 1024 bytes from 10.1.1.2" ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ_ํŽ‘ํฌ NS_LOG ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—. ๋‹ค์Œ์„ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

OR ์—ฐ์‚ฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์„ธ๋กœ ๋ง‰๋Œ€๋„ Unix ํŒŒ์ดํ”„ ์ปค๋„ฅํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ์˜ดํ‘œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋กœ๊น… ์‹œ์Šคํ…œ์ด ํŠน์ • ๋กœ๊ทธ์˜ ๋ชจ๋“  ๋ฉ”์‹œ์ง€ ์•ž์— ๊ตฌ์„ฑ ์š”์†Œ ์ด๋ฆ„์ด ๋ถ™๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด์ œ UDP ์—์ฝ” ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ค๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ์ด์™€ ๊ฐ™์ด ์‹๋ณ„๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ "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: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.406s)
UdpEchoServerApplication:UdpEchoServer()
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoServerApplication:StartApplication()
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
UdpEchoServerApplication:HandleRead(): Echoing packet
UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
UdpEchoServerApplication:StopApplication()
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()

๋กœ๊ทธ ๋ฉ”์‹œ์ง€๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ์œ ์šฉํ•  ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. OR ๋น„ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ_์‹œ๊ฐ„:

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

์ด๋ฒˆ์—๋„ ์œ„์˜ ๊ฐœํ–‰ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

์ƒ์„ฑ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. UDPEcho์„œ๋ฒ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ค‘์— 0์ดˆ ๋™์•ˆ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ œ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•˜์ง€๋งŒ ์‹œ๊ฐ„์€ XNUMX์ดˆ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ๋ฉ”์‹œ์ง€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. UDPEchoํด๋ผ์ด์–ธํŠธ.

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

์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ธฐ์–ตํ•˜์„ธ์š”. ์Šคํฌ๋ž˜์น˜/first.cc ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์ž‘ XNUMX์ดˆ ์ „์— ์—์ฝ” ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ทธ ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์„œ๋ฒ„๋Š” ์‹ค์ œ๋กœ ์ฒซ ๋ฒˆ์งธ ์ˆœ๊ฐ„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์—์„œ ์š”์ฒญํ•œ ๋Œ€๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ ๋‘ ๋ฒˆ์งธ ์ดˆ์— ์—์ฝ” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ํ†ตํ™” ์‹œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์ •์ „์†ก HandleRead ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์—์ฝ” ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ง€์  ๊ฐ„ ๋งํฌ๋ฅผ ํ†ตํ•ด ํŒจํ‚ท์„ ๋ณด๋‚ด๋Š” ๋ฐ ๊ฒฝ๊ณผ๋œ ์‹œ๊ฐ„์€ 3,69๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. ์—์ฝ” ์„œ๋ฒ„๊ฐ€ ํŒจํ‚ท์— ์‘๋‹ตํ–ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•œ ๋‹ค์Œ, ์ฑ„๋„ ์ง€์—ฐ ํ›„ ์—์ฝ” ํด๋ผ์ด์–ธํŠธ๊ฐ€ HandleRead ๋ฉ”์„œ๋“œ์—์„œ ์—์ฝ” ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„๋„ ๋ชจ๋ฅด๋Š” ์‚ฌ์ด์— ๋งŽ์€ ์ผ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ๋กœ๊น… ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NS_LOG ๋ณ€์ˆ˜๋ฅผ ๋‹ค์Œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด๋ณด์„ธ์š”.

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

์œ„์˜ ๋ณ„ํ‘œ๋Š” ๋กœ๊น… ๊ตฌ์„ฑ ์š”์†Œ์˜ ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์‚ฌ์šฉ๋œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ถœ๋ ฅ์„ ์žฌํ˜„ํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ(์ž‘์„ฑ ๋‹น์‹œ์—๋Š” ๋‹จ์ผ ์—์ฝ” ํŒจํ‚ท์— ๋Œ€ํ•ด 1265์ค„์˜ ์ถœ๋ ฅ์ด ์ƒ์„ฑ๋จ) ์ด ์ •๋ณด๋ฅผ ํŒŒ์ผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ณ  ์ฆ๊ฒจ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ง‘๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์ „ํ˜€ ์•Œ ์ˆ˜ ์—†์„ ๋•Œ ๋งค์šฐ ์žฅํ™ฉํ•œ ๋กœ๊น… ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋””๋ฒ„๊ฑฐ์—์„œ ์ฝ”๋“œ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ฝ”๋“œ ์‹คํ–‰์„ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ํŽธ์ง‘๊ธฐ์—์„œ ์ถœ๋ ฅ์„ ํŽธ์ง‘ํ•˜๊ณ  ๋‚ด๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์•„๋ณด๊ณ  ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์ผ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์ž˜๋ชป๋˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์–ป์€ ํ›„์—๋Š” ๋””๋ฒ„๊ฑฐ๋กœ ๋›ฐ์–ด๋“ค์–ด ๋ฌธ์ œ๋ฅผ ์ž์„ธํžˆ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ถœ๋ ฅ์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™„์ „ํžˆ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ์œ„์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“ฑ๋ก์„ ํ•˜๋ฉด ๊ทธ๋Ÿฌํ•œ ์ „ํ™˜์ด ๋ˆˆ์— ๋„๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

5.1.3 ์ฝ”๋“œ์— ๋กœ๊น… ์ถ”๊ฐ€

์—ฌ๋Ÿฌ ๋งคํฌ๋กœ์—์„œ ๋กœ๊ทธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋กœ ํ•ด๋ณด์ž myfirst.cc, "clean" ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋กœ๊น… ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ •์˜ํ–ˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

NS_LOG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์—์„œ ์„ค์ •ํ•˜์—ฌ ์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ๋“  ๋ฉ”์‹œ์ง€ ๋กœ๊น…์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ์Šคํฌ๋ฆฝํŠธ์— ๋ช‡ ๊ฐ€์ง€ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ •๋ณด ์ˆ˜์ค€ ๋ฉ”์‹œ์ง€๋ฅผ ๋กœ๊ทธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋งคํฌ๋กœ๋Š” NS_LOG_INFO์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ "ํ† ํด๋กœ์ง€ ์ƒ์„ฑ" ๋‹จ๊ณ„์— ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ฉ”์‹œ์ง€(๋…ธ๋“œ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ง์ „)๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ ์ฝ”๋“œ ์กฐ๊ฐ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
์—ด์–ด ๋ผ. ์Šคํฌ๋ž˜์น˜/myfirst.cc ์ข‹์•„ํ•˜๋Š” ํŽธ์ง‘๊ธฐ์—์„œ ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
NS_LOG_INFO ("Creating Topology");
์ค„ ๋ฐ”๋กœ ์•ž์—,

NodeContainer nodes;
nodes.Create (2);

์ด์ œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜์‹ญ์‹œ์˜ค. waf, NS_LOG ๋ณ€์ˆ˜๋ฅผ ์ง€์›Œ ์ด์ „์— ํ™œ์„ฑํ™”ํ•œ ๋กœ๊น… ์ŠคํŠธ๋ฆผ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

$ ./waf
$ export NS_LOG=
ะขะตะฟะตั€ัŒ, ะตัะปะธ ะฒั‹ ะทะฐะฟัƒัั‚ะธั‚ะต ัะบั€ะธะฟั‚,
$ ./waf --run scratch/myfirst

์—ฐ๊ฒฐ๋œ ๋กœ๊น… ๊ตฌ์„ฑ ์š”์†Œ(FirstScriptExample)๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ ค๋ฉด ๋กœ๊น… ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. FirstScript์˜ˆ NS_LOG_INFO๋ณด๋‹ค ๋‚ฎ์ง€ ์•Š์€ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ์ด ํŠน์ • ๋กœ๊น… ์ˆ˜์ค€์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ export NS_LOG=FirstScriptExample=info

์ง€๊ธˆ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด "Creating Topology"๋ผ๋Š” ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

5.2 ๋ช…๋ น์ค„ ์ธ์ˆ˜ ์‚ฌ์šฉ

5.2.1 ๊ธฐ๋ณธ ์†์„ฑ ๊ฐ’ ์žฌ์ •์˜

ํŽธ์ง‘์ด๋‚˜ ๋นŒ๋“œ ์—†์ด ns-3 ์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋กœ์ปฌ ๋ฐ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์ค„ ์ธ์ˆ˜ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๋ช…๋ น์ค„ ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ ์ฝ”๋“œ์—์„œ์™€ ๊ฐ™์ด (๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ์—์„œ) ๋งค์šฐ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๊ฐ„๋‹จํ•œ ๋‘ ์ค„์งœ๋ฆฌ ์ฝ”๋“œ ์กฐ๊ฐ์€ ์‹ค์ œ๋กœ ๊ทธ ์ž์ฒด๋กœ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ns-3 ์ „์—ญ ๋ณ€์ˆ˜ ๋ฐ ์†์„ฑ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ฌธ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋‘ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ž˜์น˜/myfirst.cc. ๊ณ„์†ํ•ด์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„์›€ ์š”์ฒญ์„ ํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋ช…๋ น์€ ๋ฌป์Šต๋‹ˆ๋‹ค. ์™€ํ”„ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์Šคํฌ๋ž˜์น˜/myfirst ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. โ€”์ธ์‡„๋„์›€๋ง. ์ธ์ˆ˜๊ฐ€ ์˜๋„๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋‚˜ํƒ€๋‚ด๋ ค๋ฉด ๋”ฐ์˜ดํ‘œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ค„ ํŒŒ์„œ๊ฐ€ ์ธ์ˆ˜๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. โ€”์ธ์‡„๋„์›€๋ง ๋‹ต๋ณ€์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

์ด์ œ ์˜ต์…˜์„ ์‚ดํŽด๋ณด์ž โ€”์ธ์‡„ ์†์„ฑ. ์šฐ๋ฆฌ๋Š” first.cc ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—ฐ๊ตฌํ•  ๋•Œ ์ด๋ฏธ ns-3 ์†์„ฑ ์‹œ์Šคํ…œ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ์ค„์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ์–ด์š” ๋ฐ์ดํ„ฐ ์†๋„ ์‹ค์ œ๋กœ๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค PointToPointNet์žฅ์น˜. ๋ช…๋ น์ค„ ์ธ์ˆ˜ ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. PointToPointNet์žฅ์น˜. ๋„์›€๋ง ๋ชฉ๋ก์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ID. ๊ด€์‹ฌ ์žˆ๋Š” ์†์„ฑ์ด ์†ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ns3::PointToPointNetDevice. ๊ณ„์† ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€์ž, ๋“ค์–ด๊ฐ€์ž,

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

์‹œ์Šคํ…œ์€ ์ด ๋„คํŠธ์›Œํฌ ์žฅ์น˜ ์œ ํ˜•์˜ ๋ชจ๋“  ์†์„ฑ์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ์†์„ฑ ์ค‘ ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

์ด๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. PointToPointNet์žฅ์น˜. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์†์„ฑ ะฒ ํฌ์ธํŠธํˆฌํฌ์ธํŠธ๋„์šฐ๋ฏธ ๋” ๋†’์€. ์ง€์  ๊ฐ„ ์žฅ์น˜ ๋ฐ ์ฑ„๋„์—๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ†ตํ™”๋ฅผ ์‚ญ์ œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. SetDevice์†์„ฑ ะธ SetChannel์†์„ฑ ์œผ๋กœ myfirst.cc, ๊นจ๋—ํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ„๋‹จํžˆ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํŠธํˆฌํฌ์ธํŠธ๋„์šฐ๋ฏธ ์•„๋ž˜ ์˜ˆ์™€ ๊ฐ™์ด ์„ค์น˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

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

๊ณ„์†ํ•ด์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ์™€ํ”„ (./์™€ํ”„) ๋‹ค์‹œ ๋Œ์•„๊ฐ€์„œ UDP ์—์ฝ” ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ถ€ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜๊ณ  ์‹œ๊ฐ„ ์ ‘๋‘์–ด๋ฅผ ํฌํ•จํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

๋งˆ์ง€๋ง‰์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์„ ์‚ดํŽด๋ดค์„ ๋•Œ, ์—์ฝ” ์„œ๋ฒ„๊ฐ€ ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•œ ์ˆœ๊ฐ„์€ 2,00369์ดˆ์˜€์Šต๋‹ˆ๋‹ค.

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

์ด์ œ ๊ทธ๋Š” 2.25732์ดˆ ์•ˆ์— ํŒจํ‚ท์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ PointToPointNetDevice ๋ฐ์ดํ„ฐ ์†๋„๋ฅผ ์ดˆ๋‹น 32768๋ฉ”๊ฐ€๋น„ํŠธ์—์„œ ๊ธฐ๋ณธ๊ฐ’์ธ ์ดˆ๋‹น XNUMX๋น„ํŠธ๋กœ ์žฌ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด DataRate๋ฅผ ๋Œ€์ฒดํ•œ๋‹ค๋ฉด ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์†๋„๋ฅผ ๋‹ค์‹œ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€๋ง ์š”์†Œ์— ํฌํ•จ๋œ ๊ณต์‹์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DataRate ์†์„ฑ์ด ๊ธฐ๋ณธ๊ฐ’์ธ ์ดˆ๋‹น XNUMX๋ฉ”๊ฐ€๋น„ํŠธ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์— ๋†€๋ž๋‚˜์š”? ์Šคํฌ๋ฆฝํŠธ์˜ ์›๋ž˜ ๋™์ž‘์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด ๋น›์˜ ์†๋„์™€ ์ผ์น˜ํ•˜๋„๋ก ์ฑ„๋„ ์ง€์—ฐ๋„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์žฅ์น˜์— ๋Œ€ํ•ด ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ช…๋ น์ค„ ์‹œ์Šคํ…œ์— ์ฑ„๋„ ์†์„ฑ์„ ์ธ์‡„ํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฑ„๋„ ์ง€์—ฐ ์†์„ฑ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช…๋ น์ค„ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ๋ชจ๋‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ์—์„œ DataRate ๋ฐ Delay๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ–ˆ์„ ๋•Œ์˜ ์‹œ๊ฐ„์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

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

2,00369์ดˆ ํ›„์— ์„œ๋ฒ„์—์„œ ํŒจํ‚ท์„ ๋‹ค์‹œ ์ˆ˜์‹ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ์‹ค์ œ๋กœ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ์— ์‚ฌ์šฉ๋œ ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ MaxPackets ์†์„ฑ์„ XNUMX์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UDPEchoํด๋ผ์ด์–ธํŠธ.

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์‹œ๋„ ํ•ด๋ด. ๊ธฐ๋ณธ ์†์„ฑ ๊ฐ’์„ ์žฌ์ •์˜ํ•˜๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•œ ์œ„์น˜๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์ตœ๋Œ€ ํŒจํ‚ท ์Šคํฌ๋ฆฝํŠธ์—์„œ. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๊ธฐ๋ณธ ์†์„ฑ ๊ฐ’ ์„ค์ •์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ๋„์›€๋ง์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋ฉด ๋ช…๋ น์ค„์— ํ‘œ์‹œ๋˜๋Š” ํŒจํ‚ค์ง€ ์ˆ˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ช…๋ น์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์‹œ์ ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ์งˆ๋ฌธ์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์†์„ฑ์˜ ์กด์žฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋Š๋ƒ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋ช…๋ น์ค„ ์‹œ์Šคํ…œ์—๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋„์›€๋ง ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์— ๋„์›€์„ ์š”์ฒญํ•˜๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

"PrintGroups" ์ธ์ˆ˜๋ฅผ ์„ ํƒํ•˜๋ฉด ๋“ฑ๋ก๋œ ๋ชจ๋“  ๊ทธ๋ฃน ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ID. ๊ทธ๋ฃน ์ด๋ฆ„์€ ์†Œ์Šค ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“ˆ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค(๋Œ€๋ฌธ์ž๋กœ ํ‘œ์‹œ๋จ). ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ์— ์ธ์‡„ํ•˜๋ฉด ์šฉ๋Ÿ‰์ด ๋„ˆ๋ฌด ์ปค์ง€๋ฏ€๋กœ ์ถ”๊ฐ€ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฃน๋ณ„๋กœ ์ •๋ณด๋ฅผ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์‹œ ์ง€์  ๊ฐ„ ๋ชจ๋“ˆ์— ์ดˆ์ ์„ ๋งž์ถ”๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์—์„œ ์†์„ฑ ์กฐํšŒ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ TypeId ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด
--PrintAttributes = ns3 :: PointToPointChannel์œ„์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ.

์†์„ฑ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ Doxygen nsโ€‘3์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ์†์„ฑ์„ ๋‚˜์—ดํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

5.2.2 ์ž์‹ ๋งŒ์˜ ๋ช…๋ น ์บก์ฒ˜

๋ช…๋ น์ค„ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ž์‹ ๋งŒ์˜ ํ›„ํฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ช…๋ น์ค„ ํŒŒ์„œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์ถ”๊ฐ€.
์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ‘œ์‹œํ•  ํŒจํ‚ค์ง€ ์ˆ˜๋ฅผ ์ง€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ผ๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. nํŒจํ‚ท ํ•จ์ˆ˜๋กœ ๋ณธ๊ด€. ์ด์ „ ๊ธฐ๋ณธ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜๋„๋ก XNUMX๋กœ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„ ํŒŒ์„œ๊ฐ€ ์ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด ํŒŒ์„œ์—์„œ ์ด ๊ฐ’์„ ์บก์ฒ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์ถ”๊ฐ€. ๊ฐ€์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ”๊ฟ”๋ณด์„ธ์š” ์Šคํฌ๋ž˜์น˜/myfirst.cc ๋”ฐ๋ผ์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ ค๋ฉด

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

MaxPackets ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์ง€์ ๊นŒ์ง€ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์ˆ˜ 1 ๋Œ€์‹  nPackets ๋ณ€์ˆ˜๋กœ ์„ค์ •๋˜๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

์ด์ œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  -PrintHelp ์ธ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์ƒˆ ์‚ฌ์šฉ์ž ์ธ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋„์›€๋ง ํ‘œ์‹œ์— ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๋‹ค,

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

์ „์†ก๋˜๋Š” ํŒจํ‚ท ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ช…๋ น์ค„ ์ธ์ˆ˜ -nPackets๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

์ด์ œ ์ด์ œ ๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ด์ œ ๋‘ ๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ฝค ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‚˜์š”?
ns-3 ์‚ฌ์šฉ์ž๋กœ์„œ ๋ช…๋ น์ค„ ์ธ์ˆ˜ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ ๊ฐ’๊ณผ ์†์„ฑ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ ์ž‘์„ฑ์ž์ธ ๊ฒฝ์šฐ ๊ฐœ์ฒด์— ์ƒˆ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ช…๋ น์ค„ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํŠน์„ฑ์„ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ž๋ผ๋ฉด ์Šคํฌ๋ฆฝํŠธ์— ์ƒˆ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ๋ช…๋ น์ค„ ์‹œ์Šคํ…œ์— ์›ํ™œํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5.3 ์ถ”์  ์‹œ์Šคํ…œ ์‚ฌ์šฉ

๋ชจ๋ธ๋ง์˜ ์ „์ฒด ์š”์ ์€ ์ถ”๊ฐ€ ์—ฐ๊ตฌ๋ฅผ ์œ„ํ•œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ns-3 ์ถ”์  ์‹œ์Šคํ…œ์€ ์ด๋ฅผ ์œ„ํ•œ ์ฃผ์š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ns-3์€ C++ ํ”„๋กœ๊ทธ๋žจ์ด๋ฏ€๋กœ C++ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋กœ๊น… ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†”๋ฃจ์…˜์— ์•ฝ๊ฐ„์˜ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์•Œ๋ ค์ง„ ๋ฌธ์ œ๊ฐ€ ๋งŽ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ ์ด๋ฒคํŠธ ์ถ”์  ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

ns-3 ์ถ”์  ์‹œ์Šคํ…œ์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ถ”์  ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์ธ๊ธฐ ์žˆ๋Š” ์†Œ์Šค์— ๋Œ€ํ•œ ํ‘œ์ค€ ์ถ”์ ์„ ์ƒ์„ฑํ•˜๊ณ  ์ถ”์ ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ค‘๊ธ‰ ์‚ฌ์šฉ์ž๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ฝ”์–ด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ถ”์  ์‹œ์Šคํ…œ์„ ํ™•์žฅํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ถœ๋ ฅ ํ˜•์‹์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ถ”์  ์†Œ์Šค๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ฝ”์–ด๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ถ”์  ์†Œ์Šค์™€ ์‹ฑํฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ns-3 ์ถ”์  ์‹œ์Šคํ…œ์€ ๋…๋ฆฝ์ ์ธ ์ถ”์  ์†Œ์Šค ๋ฐ ์ˆ˜์‹ ๊ธฐ์˜ ์›์น™๊ณผ ์†Œ์Šค๋ฅผ ์†Œ๋น„์ž์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ†ตํ•ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ns-3 ์ถ”์  ์‹œ์Šคํ…œ์€ ๋…๋ฆฝ์ ์ธ ์ถ”์  ์†Œ์Šค ๋ฐ ์ˆ˜์‹ ๊ธฐ์˜ ์›์น™๊ณผ ์†Œ์Šค๋ฅผ ์ˆ˜์‹ ๊ธฐ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ†ตํ•ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”์  ์†Œ์Šค๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๊ณ  ๊ด€์‹ฌ ์žˆ๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ถ”์  ์†Œ์Šค๋Š” ๋„คํŠธ์›Œํฌ ์žฅ์น˜๊ฐ€ ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•œ ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๊ด€์‹ฌ ์žˆ๋Š” ์ถ”์  ์ˆ˜์‹ ๊ธฐ๊ฐ€ ํŒจํ‚ท์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ฑํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ๋กœ ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ "๊ฒฐํ•ฉ"๋˜์ง€ ์•Š๋Š” ํ•œ ์ถ”์  ์†Œ์Šค ์ž์ฒด๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ถ”์  ํ”„๋กœ๊ทธ๋žจ์€ ์ถ”์  ์†Œ์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฐ ๋ฐ์ดํ„ฐ์˜ ์†Œ๋น„์ž์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „ ์˜ˆ์˜ ์ถ”์  ์†Œ์Šค์— ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ์ˆ˜์‹ ๋œ ํŒจํ‚ท์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ธ์‡„ํ•˜๋Š” ์ถ”์  ์‹ฑํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์ด์œ ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ฝ”์–ด๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ํ•„์š” ์—†์ด ์ƒˆ๋กœ์šด ์‹ฑํฌ ์œ ํ˜•์„ ๊ธฐ์กด ์ถ”์  ์†Œ์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์˜ˆ์—์„œ ์‚ฌ์šฉ์ž๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒˆ ์ถ”์  ํ”„๋กœ๊ทธ๋žจ์„ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ฝ”์–ด์— ์ •์˜๋œ ๊ธฐ์กด ์ถ”์  ์†Œ์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์‚ฌ์ „ ์ •์˜๋œ ์†Œ์Šค ๋ฐ ์‹ฑํฌ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์‚ฌ์šฉ์ž ์ธก์—์„œ ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ถ”์  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ™•์žฅ ๋ฐ ์ƒˆ ์ถ”์  ์†Œ์Šค ์ƒ์„ฑ์„ ํฌํ•จํ•œ ๊ณ ๊ธ‰ ์ถ”์  ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ns-3 ๋งค๋‰ด์–ผ ๋˜๋Š” ๋ฐฉ๋ฒ• ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

5.3.1 ASCII ์ถ”์ 

ns-3์€ ๊ฐ„๋‹จํ•œ ํŒจํ‚ท ์ถ”์ ์„ ์„ค์ •ํ•  ๋•Œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ถ”์  ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•˜๋Š” ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ASCII ํŒŒ์ผ๋กœ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ns-2 ์ถœ๋ ฅ์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ถ”์ ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. out.tr, ์ด๋Š” ๋งŽ์€ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ณธ๋ก ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์Šคํฌ๋ž˜์น˜/myfirst.cc ์Šคํฌ๋ฆฝํŠธ์— ์ผ๋ถ€ ASCII ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ†ตํ™” ์ง์ „ Simulator :: Run (), ๋‹ค์Œ ์ฝ”๋“œ ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
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 --run scratch/myfirst

์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Waf์—์„œ ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ถ€ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ "'๋นŒ๋“œ'๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์‹œ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. myfirst.tr. ์ž‘ํ’ˆ์˜ ํŠน์„ฑ์ƒ ์™€ํ”„, ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์ผ์€ ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ €์žฅ์†Œ์˜ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ถ”์ ์ด ์ €์žฅ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด Waf ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --cwd. ์•„์ง ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ฆ๊ฒจ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ง‘๊ธฐ์—์„œ ASCII ์ถ”์  ํŒŒ์ผ myfirst.tr์„ ๋ณด๋ ค๋ฉด ์ €์žฅ์†Œ์˜ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ASCII ์ถ”์  ๊ตฌ๋ฌธ ๋ถ„์„

์ƒ๋‹นํžˆ ์กฐ๋ฐ€ํ•œ ํ˜•ํƒœ๋กœ ๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ๋จผ์ € ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๊ฒƒ์€ ํŒŒ์ผ์ด ๊ฐœ๋ณ„ ์ค„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด๊ธฐ ์ฐฝ์„ ๋” ๋„“๊ฒŒ ํ™•์žฅํ•˜๋ฉด ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์˜ ๊ฐ ์ค„์€ ์ถ”์  ์ด๋ฒคํŠธ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ ๊ฐ ์ง€์  ๊ฐ„ ๋„คํŠธ์›Œํฌ ์žฅ์น˜์— ์žˆ๋Š” ์ „์†ก ๋Œ€๊ธฐ์—ด์˜ ์ด๋ฒคํŠธ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ „์†ก ํ๋Š” ์ง€์  ๊ฐ„ ๋งํฌ๋ฅผ ์œ„ํ•ด ๊ฐ ํŒจํ‚ท์ด ํ†ต๊ณผํ•ด์•ผ ํ•˜๋Š” ํ์ž…๋‹ˆ๋‹ค. ์ถ”์  ํŒŒ์ผ์˜ ๊ฐ ์ค„์€ ๋‹จ์ผ ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ ๋’ค์— ๊ณต๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐํ˜ธ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

+: ์žฅ์น˜ ๋Œ€๊ธฐ์—ด์—์„œ ๋Œ€๊ธฐ์—ด ์ž‘์—…์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
-: ์žฅ์น˜ ํ์—์„œ ์š”์†Œ ๊ฒ€์ƒ‰ ์ž‘์—…์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
d: ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๊ธฐ์—ด์ด ๊ฐ€๋“ ์ฐจ์„œ ํŒจํ‚ท์ด ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
r: ํŒจํ‚ท์ด ๋„คํŠธ์›Œํฌ ์žฅ์น˜์— ์˜ํ•ด ์ˆ˜์‹ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”์  ํŒŒ์ผ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์™ผ์ชฝ์— ์ค„ ๋ฒˆํ˜ธ๋ฅผ ํ‘œ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์ด ํ™•์žฅ ์ถ”์  ์ด๋ฒคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์„น์…˜(๋ผ์ธ 0)์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— + ๊ธฐํ˜ธ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋Š” ์ „์†ก์„ ์œ„ํ•œ ๋Œ€๊ธฐ์—ด ์ž‘์—…์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์„น์…˜(๋ผ์ธ 1)์€ ์ดˆ ๋‹จ์œ„๋กœ ํ‘œํ˜„๋˜๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ๊ธฐ์–ตํ•˜์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. UdpEchoClient์‘์šฉ ํ”„๋กœ๊ทธ๋žจ XNUMX์ดˆ ์•ˆ์— ํŒจํ‚ท ์ „์†ก์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค๋Š” ํ™•์ธ์„ ๋ด…๋‹ˆ๋‹ค.

์ถ”์  ์˜ˆ์ œ์˜ ๋‹ค์Œ ์„น์…˜(2ํ–‰)์—์„œ๋Š” ์ด ์ด๋ฒคํŠธ(๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถ”์ ์„ ๋‚˜ํƒ€๋ƒ„)๋ฅผ ์ƒ์„ฑํ•œ ์ถ”์  ์†Œ์Šค๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ถ”์  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ฃจํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋ชฉ๋ก. ์ด๋Š” ๊ธฐ๋ณธ ns-3 ์ฝ”๋“œ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ฃจํŠธ์— ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋…ธ๋“œ ๋ชฉ๋ก ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ /NodeList/0 ํ–‰์€ ์ผ๋ฐ˜์ ์œผ๋กœ "๋…ธ๋“œ 0"์œผ๋กœ ์ƒ๊ฐ๋˜๋Š” NodeList์˜ null ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ์—๋Š” ์„ค์น˜๋œ ์žฅ์น˜ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์˜†์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ถ”์  ์ด๋ฒคํŠธ๊ฐ€ ๋‹ค์Œ์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฅ์น˜ ๋ชฉ๋ก/0, ์ด๋Š” ๋…ธ๋“œ์— ์„ค์น˜๋œ null ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ํ•˜์œ„ ๋ฌธ์ž์—ด, $ ns3 :: PointToPointNetDevice, ์–ด๋–ค ์žฅ์น˜๊ฐ€ ์œ„์น˜ 0์— ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ฆ‰, ๋…ธ๋“œ XNUMX์˜ ์žฅ์น˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. XNUMXํ–‰์— ์žˆ๋Š” + ์—ฐ์‚ฐ์€ ์žฅ์น˜์˜ ์ „์†ก ๋Œ€๊ธฐ์—ด์— ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” "ํŠธ๋ž™ ๊ฒฝ๋กœ"์˜ ๋งˆ์ง€๋ง‰ ์„ธ๊ทธ๋จผํŠธ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. TxQueue/์ธํ.

์ถ”์ ์˜ ๋‚˜๋จธ์ง€ ์„น์…˜์€ ์ƒ๋‹นํžˆ ์ง๊ด€์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 3-4ํ–‰์€ ํŒจํ‚ท์ด ์ง€์ ๊ฐ„ ํ”„๋กœํ† ์ฝœ๋กœ ์บก์Šํ™”๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 5-7ํ–‰์€ ํŒจํ‚ท์— IP4 ๋ฒ„์ „ ํ—ค๋”๊ฐ€ ์žˆ๊ณ  IP ์ฃผ์†Œ์—์„œ ์‹œ์ž‘๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. 10.1.1.1 ~์„์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 10.1.1.2. ๋ผ์ธ 8-9๋Š” ์ด ํŒจํ‚ท์— UDP ํ—ค๋”๊ฐ€ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ผ์ธ 10์€ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” 1024๋ฐ”์ดํŠธ์ž„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ถ”์  ํŒŒ์ผ์˜ ๋‹ค์Œ ์ค„์€ ๋™์ผํ•œ ํŒจํ‚ท์ด ๋™์ผํ•œ ๋…ธ๋“œ์˜ ์ „์†ก ํ์—์„œ ๋‹น๊ฒจ์กŒ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ถ”์  ํŒŒ์ผ์˜ ์„ธ ๋ฒˆ์งธ ์ค„์€ ํŒจํ‚ท์ด ์—์ฝ” ์„œ๋ฒ„ ํ˜ธ์ŠคํŠธ์˜ ๋„คํŠธ์›Œํฌ ์žฅ์น˜์—์„œ ์ˆ˜์‹ ๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•„๋ž˜์— ๊ทธ ์‚ฌ๊ฑด์„ ์žฌํ˜„ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด์ œ ์ถ”์  ์ž‘์—…์€ r์ด๊ณ  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์€ 2,25732์ดˆ๋กœ ๋Š˜์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ž์Šต์„œ๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋”ฐ๋ž๋‹ค๋ฉด ์ด๋Š” ๋„คํŠธ์›Œํฌ ์žฅ์น˜์˜ DataRate ๋ฐ Link Delay๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‘์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ œ๋Š” ์ด์ „ ์„น์…˜์—์„œ ๋ณด์•˜๋“ฏ์ด ์ต์ˆ™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”์  ์†Œ์Šค ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ•ญ๋ชฉ(๋ผ์ธ 2)์€ ์ด ์ด๋ฒคํŠธ๊ฐ€ ๋…ธ๋“œ 1(/๋…ธ๋“œ ๋ชฉ๋ก/1) ํŒจํ‚ท์€ ์ถ”์  ์†Œ์Šค(/)์— ์˜ํ•ด ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค.๋งฅ์•Œ์—‘์Šค). ํŒŒ์ผ์— ๋‚จ์•„ ์žˆ๋Š” ์ถ”์ ์„ ๋ณด๋ฉด ํ† ํด๋กœ์ง€ ์ „์ฒด์—์„œ ํŒจํ‚ท์˜ ์ด๋™์„ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

5.3.2 PCAP ์ถ”์ 

ns-3 ์žฅ์น˜ ๋„์šฐ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .pcap ํ˜•์‹์˜ ์ถ”์  ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘๋ฌธ์ž์–ด pcap (๋ณดํ†ต ์†Œ๋ฌธ์ž๋กœ ์ž‘์„ฑ๋จ)์€ ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์‹ค์ œ๋กœ๋Š” .pcap ํŒŒ์ผ ํ˜•์‹ ์ •์˜๋ฅผ ํฌํ•จํ•˜๋Š” API์ž…๋‹ˆ๋‹ค. ์ด ํ˜•์‹์„ ์ฝ๊ณ  ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™€์ด์–ด ์ƒคํฌ (์ด์ „์— ๋ถˆ๋ €๋˜ ๋ฏธ๋ฌ˜ํ•œ). ๊ทธ๋Ÿฌ๋‚˜ ์ด ํŒจํ‚ท ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ ์ถ”์  ๋ถ„์„๊ธฐ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ pcap ์ถ”์ ์„ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ pcap ์ถ”์ ์„ ๋ณด๋Š” ๋ฐ ์ค‘์ ์„ ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. TCP ๋คํ”„.

pcap ์ถ”์  ํ™œ์„ฑํ™”๋Š” ํ•œ ์ค„์˜ ์ฝ”๋“œ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

pointToPoint.EnablePcapAll ("myfirst");

๋ฐฉ๊ธˆ ์ถ”๊ฐ€ํ•œ ASCII ์ถ”์  ์ฝ”๋“œ ๋’ค์— ์ด ์ฝ”๋“œ ์ค„์„ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”. ์Šคํฌ๋ž˜์น˜/myfirst.cc. "myfirst.pcap"์ด๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ž์—ด์€ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  "myfirst" ๋ฌธ์ž์—ด๋งŒ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ „์ฒด ํŒŒ์ผ ์ด๋ฆ„์ด ์•„๋‹Œ ์ ‘๋‘์‚ฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ค‘์— ๋ณด์กฐ์ž๋Š” ์‹ค์ œ๋กœ ๊ฐ ์ง€์  ๊ฐ„ ์žฅ์น˜์— ๋Œ€ํ•œ ์ถ”์  ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์€ ์ ‘๋‘์‚ฌ, ๋…ธ๋“œ ๋ฒˆํ˜ธ, ์žฅ์น˜ ๋ฒˆํ˜ธ ๋ฐ ์ ‘๋ฏธ์‚ฌ "๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.pcap".

์˜ˆ์ œ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ "myfirst-0-0.pcap"๊ทธ๋ฆฌ๊ณ "myfirst-1-0.pcap"๋Š” ๊ฐ๊ฐ ๋…ธ๋“œ 0-์žฅ์น˜ 0 ๋ฐ ๋…ธ๋“œ 1-์žฅ์น˜ 0์— ๋Œ€ํ•œ pcap ์ถ”์ ์ž…๋‹ˆ๋‹ค. pcap ์ถ”์ ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ์ฝ”๋“œ ์ค„์„ ์ถ”๊ฐ€ํ•œ ํ›„์—๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ ./waf --run scratch/myfirst

๋ฐฐํฌํŒ์˜ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ณด๋ฉด ์„ธ ๊ฐœ์˜ ํŒŒ์ผ์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค: ASCII ์ถ”์  ํŒŒ์ผ myfirst.tr, ์ด์ „์— ์—ฐ๊ตฌํ•œ ํŒŒ์ผ myfirst-0-0.pcap ะธ myfirst-1-0.pcap - ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ์ƒˆ pcap ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

tcpdump๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ์ฝ๊ธฐ

ํ˜„์žฌ pcap ํŒŒ์ผ์„ ๋ณด๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ tcpdump๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋คํ”„์—์„œ myfirst-0-0.pcap (ํด๋ผ์ด์–ธํŠธ ์žฅ์น˜) ์‹œ๋ฎฌ๋ ˆ์ด์…˜ 2์ดˆ ํ›„์— ์—์ฝ” ํŒจํ‚ท์ด ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋คํ”„๋ฅผ ๋ณด๋ฉด (myfirst-1-0.pcap), 2,257324์ดˆ์— ํŒจํ‚ท์ด ์ˆ˜์‹ ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋คํ”„์—์„œ๋Š” ํŒจํ‚ท์ด 2.257324์ดˆ์— ๋ฐ˜ํ™˜๋˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋คํ”„์—์„œ 2.514648์ดˆ์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŒจํ‚ท์„ ๋‹ค์‹œ ์ˆ˜์‹ ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Wireshark๋กœ ์ถœ๋ ฅ ์ฝ๊ธฐ

์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์™€์ด์–ด ์ƒคํฌ, ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ฌธ์„œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: http://www.wireshark.org/. ์™€์ด์–ด ์ƒคํฌ ์ด๋Ÿฌํ•œ ์ถ”์  ํŒŒ์ผ์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” GUI์ž…๋‹ˆ๋‹ค. Wireshark๊ฐ€ ์žˆ์œผ๋ฉด ์ถ”์  ํŒŒ์ผ์„ ์—ด๊ณ  ๋งˆ์น˜ ํŒจํ‚ท ์Šค๋‹ˆํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท์„ ์บก์ฒ˜ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚ด์šฉ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€