عنوان
آشنایی با ساختار و نحوه عملکرد نرمافزار
شبیهسازی شبکه (Network Simulator)
استاد
ارائه کننده
فهرست عناوین
عنوان صفحه
1 مقدمه 1
1-1 هدف 1
2-1 نمای کلی 1
2 مبانی NS 5
1-2 Otcl زبانی برای استفاده کاربر 5
2-2 مثال سادهای از شبیهسازی 7
3-2 زمانبند رویداد 12
4-2 اجزای شبکه 14
5-2 بسته 17
3 بعد از شبیهسازی 19
1-3 مثالی از تحلیل ردیابی 19
4 توسعه NS 22
1-4 در کجا بدنبال چه چیزی باشیم؟ 22
2-4 اتصال Otcl 23
5 ارائه چند مثال 25
1-5 LAN 25
2-5 Multicasting 25
3-5 Web Server 26
1. مقدمه
1-1 هدف
NS شبیهسازی شئ گراست که بصورت گسسته مبتنی بر رویدادها شبکه را شبیه سازی میکند، این برنامه در دانشگاه برکلی با زبانهای C++ و Otcl ایجاد شده و بسط یافته است. NS اساساً برای پیادهسازی شبکههای محلی و گسترده مفید میباشد. هرچند استفاده از NS برای افرادی که با اصول شبیهسازها آشنا هستند ساده خواهد بود اما بکارگرفتن این برنامه برای کاربران مبتدی استفاده از شبیه سازها کاملاً دشوار است زیرا تعداد وستندات و راهنماهای مناسب برای کاربران مبتدی بسیار اندک میباشد. با وجود این مستندات زیادی وجود دارد که بوسیله افراد حرفهای در شبیه سازی برای کاربران حرفهای NS نوشته شده است. هدف از این نوشته ارائه برخی ایده از چگونگی عملکرد شبیه سازها، راهنمایی برای توسعه و ادامه راه، آشنایی با اجزای شبکه در کدهای شبیه ساز، چگونگی ایجاد اجزای شبکه جدید و …. میباشد. عمده مطالب با پرداختن به مثالهای ساده و توضیحات مختصر مبتنی بر تجربیات مختلف بیان شده است.
2-1 نمای کلی
NS یک شبیه ساز رویدادگراست که در دانشگاه برکلی برای شبیهسازی شبکههای مبتنی بر IP ایجاد گردیده. در این شبیه ساز پروتکلهای شبکه از قبیل TCP و UDP ، رفتار منابع ترافیک زا مانند Ftp ، Telnet و Web ، مکانیزم مدیریت صف در مسیریابها از قبیل DropTail ، RED و CBQ ، الگوریتمهای مسیریابی مانند Dijkestra و …. قابل اجرا میباشند. همچنین در NS، ارسال چندتایی (Multicast) و برخی از پروتکلهای لایه فیزیکی برای شبیه سازی LANها نیز قابل اجرا میباشند. پروژه NS در حال حاضر بخشی از پروژه VINT میباشد که ابزارهایی را برای نمایش نتایج شبیه سازی، آنالیز و تبدیل توپولوژهای شبکه ایجاد کرده و توسعه میدهد. توسعه VINT از طریق تولید کنندههایی که بخوبی توانایی بکارگیری NS را دارند. NS رایج کنونی در محیط C++ و Otcl ( Otcl یک زبان اسکریپت با الحاقات شئ گراست که در MIT ایجاد شده است)، نوشته شده و در دسترس میباشد. در این مقاله در مورد ساختار NS مختصری بحث میشود اما چگونگی استفاده بیشتر از NS بطور جزئی با مثالهایی توضیح داده خواهد شد.
شکل 1: NS از دیدگاهی ساده شده برای کاربر
همانگونه که در شکل 1 نشان داده شده است از دیدگاهی ساده شده برای کاربر، NS مفسر اسکریپت TCL بصورت شئ گراست که دارای یک فهرست کننده رویدادهای شبیه سازی و کتابخانه Object های اجزاء شبکه و کتابخانههای راهاندازی و تنظیم شبکه میباشد. بعبارت دیگر برای استفاده از NS شما در زبان اسکریپت Otcl برنامه مینویسید. برای تنظیم و راهاندازی شبکه، کاربر باید اسکریپت Otcl بنویسد که یک فهرست کننده رویداد (زمانبند) را ایجاد کند، برای تنظیم کردن توپولوژیهای شبکه از Objectهای شبکه و توابع موجود در کتابخانهها و بیان منابع ترافیک زا در هنگام شروع و توقف انتقال بستهها از طریق زمانبند رویدادها استفاده میشود. لغت عمودی برای تنظیم شبکه استفاده شده است چون تنظیم نمودن شبکه بصورت عمودی (عمقی) امکان مسیرهای داده را از میان Objectهای شبکه بوسیله تنظیم اشارهگر از یک Object به آدرس Object دیگر، فراهم میکند. هنگامیکه یک کاربر بخواهد یک Object شبکه جدید ایجاد کند بسهولت میتواند با نوشتن یک Object جدید یا ایجاد یک Object مرکب از کتابخانه Object یک Object جدید ایجاد نماید و جریان داده را از طریق Objectها برقرار سازد.
از اجزاء مهم NS در کنار Objectهای شبکه زمتنبند رویدادهاست. هر رویداد در NS یک ID منحصر بفردی با زمان تنظیم شده برای هر بسته است که به یک Object که رویدادها را موجب میشود، اشاره میکند. در NS یک زمنبند رویداد، زمان شبیه سازی و شروع همه رویدادها را نگه میدارد. اجزاء شبکه از طریق ارسال بستهها با یکدیگر ارتباط برقرار میکنند، هرچند که این امر موجب مصرف زمان حقیقی شبیه سازی نمیشود. همه اجزاء شبکه بخشی از زمان شبیه سازی را صرف بکاربردن بستهها میکنند. برای مثال سوئیچی در شبکه که با 20 میکروثانیه تاٌخیر خروج یک رویداد برای یک بسته شبیه سازی شدهاست، در جدول زمانبندی تاٌخیر هر رویداد برای آن 20 میکروثانیه تنظیم گردیده، زمانبند بعد از 20 میکروثانیه رویداد را از صف خارج کرده و آنرا به عنصر سوئیچ ارسال میکند، که آنهم بعد بسته را یک عنصر مرتبط خروجی مشخص ارسال مینماید. استفاده دیگری که از زمانبند رویداد میشود بعنوان تایمر است. برای مثال TCP نیازمند یک تایمر برای نگهداری زمان سرآمدن انتقال بستهها میباشد. تنها تفاوت بین تایمرها و زمانبندها، آنست که تایمر مقدار زمان مرتبط با یک بسته را اندازهگیری میکند و یک عمل خاص را به آن بسته بعد از سپری شدن یک زمان مشخص نسبت میدهد.
NS نتنها در Otcl بلکه در C++ نیز نوشته شده است. بدلیل کارآمد بودن، NS مسیرهای عبوری دادهها را از مسیرهای عبوری کنترلی تفکیک ساخته است. بخاطر کاهش دادن بستهها زمان پردازش رویدادها (نه زمان شبیه سازی)، زمانبند و Object های اجزای شبکه اصلی در مسیر دادهها با زبان C++ نوشته و کمپایل شدهاند. این Objectهای کمپایل شده از طریق یک اتصال Otcl در دسترس مفسر Otcl قرار گرفتهاند که هر اتصال Otcl یک Otcl Object جفت برای هر C++ Object ایجاد کرده و توابع کنترلی را میسازند. متغیرهای قابل تنظیم مشخص شده با Objectهای C++ بعنوان توابع و متغیرهای عضو Objectهای Otcl مخابره شده عمل میکنند. بدین طریق کنترل Objectهای C++ به Otcl واگذار شده است. همچنین افزودن توابع عضو و متغیرها به یک اتصال C++ در Otcl Object امکانپذیر است.
نیازی به کنترل کردن Objectهای C++ در شبیه سازی نمیباشد بعلاوه یک Object (نه در مسیر دادهها) بطور کامل میتواند در Otcl اجرا شود.
شکل 2: همزادی C++ و Otcl
شکل 2 نشاندهنده یک مثال سلسله مراتبی در C++ و Otcl است. چیزی که در این شکل قابل توجه میباشد Objectهای C++ی هستند که دارای یک اتصال سلسله مراتبی Otcl میباشند همانطور که نشان داده شده یک جفت سلسله مراتبی Otcl Object بسیار مشابه به نوع C++ وجود دارد.
شکل3: معماری NS
شکل 3 معماری کلی NS را نشان میهد. در این تصویر یک کاربر عمومی (نه یک کاربر حرفهای NS) میتواند با قرار گرفتن در گوشه سمت چپ پایین، طراحی و اجرای شبیه سازی را در Tcl با استفاده از Objectهای شبیه سازی موجود در کتابخانه Otcl انجام دهد. زمانبند رویدادها و اغلب اجزای شبکه در C++ اجرا میشوند و از طریق یک اتصال Otcl که با استفاده از Tclcl ایجاد شده در دسترس Otcl قرار میگیرند. تمام این چیزها با یکدیگر NS را که یک مفسر Tcl از نوع شئ گراست را با کتابخانههایش میسازند.
در اینجا چیزی که میتواند جالب توجه باشد چگونگی بدست آوردن نتایج حاصل از شبیه سازی NS است. همانطور که در شکل 1 ملاحظه میشود، زمانیکه یک شبیه سازی پایان مییابد، NS یک یا چند فایل خروجی متنی که محتویات آنها جزئیات دادههای شبیه سازی را شامل میشود، تولید میکند. این دادهها میتواند برای آنالیز کردن شبیه سازی (که در بخش بعد 2 مثال از آنالیز نتایج شبیه سازی ارائه شده است)، یا بعنوان یک ورودی یرای ابزار نمایش گرافیکی شبیه سازی که Network Animator نامیده میشود و در بخشی از پروژه VINT ایجاد شده، بکار رود. NAM (Network Animator)، دارای محیط گرافیکی مناسبی برای کاربران همانند یک برنامه CD Player (که دارای دکمههای Play، Fast Forward و … است) میباشد. همچنین در NAM یک کنترل کننده سرعت نمایش نیز تعبیه شده است. بعلاوه NAM میتواند اطلاعات را از قبیل توان گذردهی و تعداد افت بستهها در هر اتصال بصورت گرافیکی نمایش دهد هرچند که از نتایج گرافیکی برای آنالیز دقیق شبیه سازی نمیتوان استفاده کرد.
2. مبانی NS
1-2 Otcl : زبانی برای کاربر
همانگونه که در بخش قبل ذکر گردید. NS اساساً یک مفسر Otcl با با کتابخانههای Object شبیه سازی شبکه میباشد. دانستن چگونگی برنامهنویسی در محیط Otcl برای NS مفید خواهد بود که در این بخش مثالهایی به این منظور ارائه خواهد میگردد.
مثال 1 یک اسکریپت Tcl عمومیست که چگونگی ایجاد یک روال و فراخواندن آن، چگونگی مقدار دهی به متغیرها و چگونگی ایجاد یک حلقه را نشان میهد. دانستن اینکه Otcl تعمیم یافته شئ گرایی از Tcl است مشخص خواهد کرد که همه فرمانهای Tcl در Otcl قابل استفادهاند. وابستگی بین Tcl و Otcl عیناً مشابه C و C++ میباشد. برای اجرای این اسکریپت باید از برنامه ex-tcl.tcl در محیط NS استفاده نمود.
مثال1: مثالی از اسکریپت Tcl
در Tcl کلمه کلیدی proc برای تعریف یک روال بکار میرود، بدنبال آن یک نام روال و آرگومانها در دو براکت مشخص میگردند. کلمه کلیدی set برای نسبت دادن مقدار به یک متغیر استفاده میشود. [expr…] مقادیر مشخص شده در براکتهای بعد از کلمه کلیدی را محاسبه میکند. نکته قابل توجه گرفتن مقدار نسبت داده شده به یک متغیر است، $ بهمراه نام متغیر به این منظور بکار میرود . کلمه کلیدی puts رشتههای زیر را درون دو علامت گیومه چاپ میکند.
نتایج حاصل از مثال یک در اینجا نشان داده شده است.
مثال بعدی یک مثال برنامه نویسی شئ گرا در Otcl است. این مثال بسیار ساده است اما روش چگونگی ایجاد کردن و استفاده از Objectها را در Otcl نشان میدهد. شانس نوشتن یک Object برای یک کاربر مبتدی بسیار نادر است. بهرحال از اینرو همه Objectهای NSی که ما در برنامهنویسی شبیه سازی NS استفاده خواهیم کرد، چه در Otcl نوشته شد باشد چه در ++C ، اساساً Objectهای Otcl هستند.
مثال 2: مثالی از اسکریپت Tcl
مثال 2 یک اسکریپت Otcl است که 2 کلاس Object را تعریف میکند. "mom" و "kid" بطوریکه "kid" یک کلاس فرزند از "mom" است و یک تابع عضو برای هر کلاس بنام "greet" تعیین شده است. بعد از تعریف کردن کلاسها هر Object همان لحظه ایجاد و مشخص میگردد، متغیر "age" برای "mom" مقدار 45 و برای "kid" مقدار 15 تنظیم میشود و "greet" تابع عضو هر یک از Objectهای ایجاد شده میباشد. کلمه کلیدی class برای ایجاد یک کلاس شئی و کلمه instproc برای تعریف یک تابع عضو برای یک کلاس Object میباشند.
فرزندان کلاس با استفاده از کلمه کلیدی superclass مشخص شدهاند. در تعریف توابع عضو، $self همانند اشارهگر "this" دز C++ عمل میکند. و instvar چک میکند که آیا نام متغیر در کلاس خودش تعریف شدهاست یا در سوپرکلاسش. اگر نام متغیر گرفته شده کنونی قبلاً تعریف شده باشد، متغیر به نام جدید دیگری ارجاع داده میشود. در نهایت برای ایجاد یک Object کلمه کلیدی new در مثال نشان داده شده است. اجرای برنامه ex-otcl.tcl در محیط NS روی این مثال نتایج زیر را نشان خواهد داد.
2-2 مثال سادهای از شبیه سازی
در این بخش یک اسکریپت ساده NS نشان داده شده و عملیاتی که در هر سطر انجام میپذیرد توضیح داده شده است. مثال 3 یک اسکریپت Otcl است که پیکربنندی شبکه سادهای را ایجاد کرده و عملیات شبیهسازی شکل 4 را انجام میدهد. برای اجرای این شبیهسازی، باید از برنامه ns-simple.tcl در محیط استفاده شود.
شکل4: یک توپولوژی ساده شبکه و سناریوی شبیه سازی
این شبکه دارای 4 گره میباشد که در شبکل فوق دیده میشوند. اتصالات دوطرفه بین n0 و n2 ، n1 و n2 با پهنای باند 2 Mbps و تاٌخیر 10 ms برقرار است. اتصالات دو طرفه بین n2 و n3 دارای 1.7 Mbps پهنای باند و 20 ms تاٌخیر میباشد. هر گره از یک صف دنباله دار بطول حداکثر 10 خانه استفاده میکند. یک نماینده (agent) ، Tcp به n0 پیوست شده است و یک اتصال به یک نماینده "sink" ، Tcp در n3 برقرار میباشد. بعنوان پیشفرض حداکثر اندازه بستههایی که نماینده Tcp میتواند تولید نماید 1 Kbyte میباشد. نماینده "sink" Tcp، بستههای ack را برای فرستنده تولید و ارسال میکند و بستههای دریافتی را آزاد میسازد. نماینده "udp" که به n1 پیوست شده به نماینده "null" در n3 متصل گردیده است. یک نماینده "null" فقط بستههای دریافتی را آزاد میکند. یک تولید کننده ترافیک "ftp" و یک تولید کننده ترافیک "cbr" بترتیب به نماینده Tcp و Udp پیوست میشوند، و "cbr" برای تولید بستههای 1 Kbyte در نرخ 1 Mbps پیکربندی شده است. "cbr" برای شروع در ثانیه 0.1 و توقف در ثانیه 4.5 و ftp نیز برای شروع در ثانیه 0.1 و توقف در ثانیه 4 تنظیم شدهاند.
مثال3: مثالی از اسکریپت Tcl
در اینجا اسکریپت بالا را توضیح میدهیم. عموماً یک اسکریپت NS با ایجاد یک Object شبیهساز آغاز میشود.
* set ns [new Simulator]:
یک Object شبیهساز NS ایجاد میکند و آنرا به متغیر ns نسبت میدهد و بعد از آن این عملیاتها انجام میگیرند.
* تعریف کردن شکل بسته
* ایجاد یک زمتنبند
* انتخاب شکل آدرس دهی پیش فرض
Object ؛شبیهساز؛ توابع عضوی دارد که اعمال زیر را انجام میدهند.
* ایجاد Objectهای مرکب از قبیل گرهها، اتصالها
* اتصال Objectهای ایجاد شده اجزاء شبکه
* تنظیم پارامترهای اجزای شبکه
* ایجاد ارتباط بین نمایندهها
* مشخص کردن انتخابهای نمایش NAM
اغلب توابع عضو برای تنظیم و زمانبندی شبیهسازی بکار میروند، هر چند برخی از آنها برای نمایش NAM استفاده میشوند.
* $ns color fid color:
برای تنظیم رنگ بستهها در هنگام گردش در شبکه استفاده میشود. این تابع عضو برای نمایش NAM است وتاٌثیری بر شبیهسازی واقعی ندارد.
* $ns namtrace-all file-descriptor:
این تابع عضو موجب میشود شبیهساز رکوردهای نتیجه را در یک فایل با فرمتی که برای ورودی NAM بکار رود، ذخیره کند.
* proc finish {}:
این تابع بعد از پایان یافتن شبیهسازی فراخوانی میشود. در این تابع پردازشهای بعد از شبیهسازی مشخص شدهاند.
* set n0 [$ns node]:
تابع عضو node یک گره ایجاد میکند. هر گره در NS یک Object مرکب است که دارای آدرس و پورت میباشد و کاربران میتوانند بترتیب با یک آدرس و یک Object پورت گره ایجاد کنند و آنها را با هم اتصال دهند.
* $ns duplex-link node1 node2 bandwidth delay queue-type:
2 اتصال ساده با پهنای باند و تاٌخیر مشخص شده ایجاد میکند و 2 گره مشخص را بهم متصل مینماید. در NS صف خروجی هر گره بعنوان بخشی از یک اتصال محسوب میشوند از اینرو کاربران باید نوع صف را زمان ایجاد اتصالات مشخص کنند. در اسکریپت شبیهسازی بالا، صف دنباله دار استفاده شده است. اگر خواننده بخواهد از یک صف RED استفاده کند، بسادگی فقط کلمه Droptail را با RED جابجا مینماید. همانند یک گره هر اتصال یک Object مرکب میباشد و کاربران میتوانند Sub-Objectهای خود و ارتباطات آنها و گرهها را ایجاد نمایند.
* $ns queue-limit node1 node2 number:
این خط محدوده صف را بین دو اتصال سادهای که گره 1 و 2 را بهم متصل میکند، با عددهای مشخص شده تنظیم مینماید.
* $ns duplex-link-op node1 node2 …:
هر دو خط بعدی برای نمایش NAM استفاده شدهاند. برای مشاهده تاٌثیر این خطوط، کاربر میتواند آنها را بعنوان توضیح مشخص کند و بعد شبیهسازی را تکرار نماید.
حال که تنظیمهای اولیه شبکه انجام شده، نوبت تنظیم نمایندههای ترافیکی از قبیل Tcp و Udp ، منابع ترافیک زا از قبیل ftp و cbr و پیوست آنها بترتیب به گرهها و نمایندهها میباشد.
* set tcp [new Agent/TCP]:
این خط چگونگی ایجاد نماینده را نشان میدهد. عموماً کاربران توانایی ایجاد هر نماینده یا منبع ترافیک زا را به این روش خواهند داشت. نمایندهها و منابع ترافیک زا در حقیقت Objectهای پایهای میباشند (نه مرکب). غالباً در C++ ایجاد شده و به Otcl متصل شدهاند. بدین جهت توابع عضو Object شبیهسازی مشخصی که بتوان این Objectها را در لحظه ایجاد کند، وجود ندارد. برای ایجاد نمایندهها یا منابع ترافیک زا هر کاربر باید نامهای کلاسهای این Object ها را بداند. این اطلاعات در مستندات NS موجود میباشند.
* $ns attach-agent node agent:
تابع عضو attach-agent یک Object نماینده ایجاد شده را به یک Object گره پیوست میکند.
* $ns connect agent1 agent2:
بعد از اینکه 2 نمایندهای که با همدیگر در ارتباط هستند ایجاد شدند نوبت به برقراری اتصال یک شبکه منطقی بیت آنها میرسد. این خط یک اتصال شبکه بوسیله تنظیم آدرس مقصد و آدرس پورت برای هر نماینده برقرار میکند با این فرض تمام پیکربندی شبکه انجام پذیرفته است نوبت به نوشتن یک سناریو برای شبیهسازی میرسد (زمانبندی شبیهسازی). Object شبیهساز دارای تعدادی تابع عضو زمانبندی است. اما غالباً تابع زیر بیشترین کاربرد را در آن دسته دارد.
* $ns at time "string":
این تابع عضو یک Object شبیهساز زمانبند را برای زمانبندی اجرای رشتههای مشخص شده در زمان شبیهسازی، ایجاد میکند.
در NS معمولاً یک منبع ترافیک زا دادههای واقعی و درستی را انتقال نمیدهند، اما نماینده در نظر گرفته شده را برای آمادگی ارسال دیتا آگاه میسازد و نماینده فقط از مقدار داده جهت انتقال مطلع است و ایجاد و ارسال بستهها را انجام میدهد. بعد از پیکربندی تمام شبکه، زمانبندی و مشخص کردن رولهای بعد از شبیهسازی تنها عمل باقی مانده اجرای شبیهسازیست که آن نیز با $ns run انجام میپذیرد.
3-2 زمانبند رویداد
در این بخش پیرامون زمانبند رویدادهای گسسته در NS صحبت میشود. همانگونه که در بخشهای قبل آمده، استفاده کنندههای اصلی زمانبند رویدادها اجزایی از شبکهاند که تاٌخیرهای بستهها یا زمانهای مورد نیاز آنها را شبیهسازی میکنند. شکل 5 نشان میهد که هر Object شبکه از یک زمانبند رویداد استفاده میکند، بیاد داشته باشیم که یک Object از شبکه که یک رویداد را منتشر میکند کسی است که بعداً در زمانبندی، یک رویداد را بکار میبرد. همچنین باید دانست که مسیر داده بین Objectهای شبکه و مسیر رویدادها از هم متفاوتند. در حقیقت بستهها بین یک Object شبکه و Object شبکه دیگر با استفاده از روش send(Packet* p) {target_->recv(p)}; برای ارسال و روش recv(Packet*, Handler* h = 0) برای دریافت، دست به دست میشوند.
شکل5: زمانبند رویداد گسسته
NS دارای 2 نوع زمانبند رویداد متفاوت میباشد. نوع همزمان (Real Time) و نوع غیر همزمان (Un-RealTime) . برای یک زمانبند غیر همزمان 3 نوع اجرا برقرار میباشد (نوع فهرستی، کومهای و تقویمی) با این وجود همگی بطور منطقی به یک صورت اجرا میگردند. وجود این تعدد بدلیل سازگاری با متدهای مانده از قبل میباشد. زمانبند غیرهمزمان تقویمی بعنوان پیش فرض تنظیم شده است. در زیر یک مثال از یک زمانبند رویداد مشخص انتخاب شده است،
. . .
set ns [new Simulator]
$ns use-scheduler Heap
. .
دیگر استفاده از زمانبند رویداد، زمانبندی رویدادهای شبیهسازی است، از قبیل اینکه چه وقتی کاربرد ftp شروع میشود، در چه زمان یک شبیهسازی متوقف میشود یا اینکه از آن برای تولید سناریوی شبیهسازی قبل از انجام یک شبیهسازی استفاده میشود. یک Object "AtEvent" در واقع یک کلاس فرزند از رویداد است، بطوریکه دارای یک متغیر اضافی برای نگهداری رشته گرفته شده، میباشد. هر چند که در زمانبند رویداد با آن همانند یک رویداد معمولی رفتار میشود. هنگامیکه یک شبیهسازی آغاز گردد و یک زمان برای یک tras در صف رویدادها رسید، AtEven به یک "AtEvent handler"داده میشود که یکبار برای همه AtEven ها ایجاد شده است و دستور Otcl مشخص شده بوسیله فیلد string از AtEven اجرا میگردد. در زیر خط زمانبندی رویدادهای شبیهسازی به مثال بالا افزوده شده است.
. . .
set ns [new Simulator]
$ns use-scheduler Heap
$ns at 300.5 "complete_sim"
. . .
proc complete_sim {} {
. . .
}
در مثال بالا ممکن است بنظر رسد که at time "string" یک تابع عضو از Object شبیه ساز میباشد. اما بخاطر داشته باشیم که Object شبیهساز فقط بعنوان یک واسطه کاربر عمل میکند و در حقیقت توابع عضو Objectهای شبکه یا یک Object زمانبند را فراخوانی مینماید. در زیر بخشی از فهرست و توضیحات توابع عضو Objectهای شبیهساز که در ارتباط با توابع عضو زمانبند هستند، آمده است.
Simulator instproc now
# return scheduler's notion of current time
Simulator instproc at args
# schedule execution of code at specified time
Simulator instproc at-now args
# schedule execution of code at now
Simulator instproc after n args
# schedule execution of code after n secs
Simulator instproc run args
# start scheduler
Simulator instproc halt
# stop (pause) scheduler
4-2 اجزای شبکه
در این بخش در مورد اجزای NS که غالباً اجزای شبکه مرکب میباشد، صحبت خواهد شد. شکل 6 بخشی از یک کلاس Otcl سلسله مراتبی NS را نشان میدهد که به درک اجزای پایه شبکه کمک خواهد کرد.
شکل6: سلسله مراتب کلاسها
ریشه این درخت، کلاس TclObject است که خود یک Superclass برای همه Objectهای کتابخانه Otcl، اجزا، تایمرها و دیگر Objectهای مثلاً مرتبط با NAM، محسوب میشود. بعنوان یک کلاس پدر از Otcl Object، کلاس NS Object، سوپرکلاس همه Objectهای پایه شبکه است که با بستهها سروکار دارد. و ممکن است Objectهای مرکب شبکه را از قبیل گرهها و اتصالات ایجاد نماید. اجزای اصلی پایه شبکه مجدد بدرون 2 زیر کلاس بنامهای Connector و Classifier که مبتنی بر تعداد مسیرهای دادههای خروجی هستند، تقسیم میشوند. Objectهای اصلی شبکه که فقط دارای یک مسیر دادهای هستند در کلاس Connector و Objectهایی که ممکن است چند مسیر داده داشته باشند در کلاس Classifier قرار میگیرند.
* گره و مسیریابی
گره یک Object مرکب ایجاد شده از یک Object ورودی است همانگونه که در شکل 7 نشتن داده شده است، 2 نوع گره در NS وجود دارد. یک گره Unicast و یک گره Multicast.
شکل7: گره (Multicast & Unicast)
در NS گرههای Unicast، گرههای پیشفرض میباشند. برای ایجاد گره های Multicast کاربر باید درست بعد از ایجاد یک زمانبند Object مشخصاً در اسکریپت Otcl آنرا ذکر نماید. بعد از مشخص کردن نوع گره کاربر همچنین می تواند یک پروتکل مسیریابی مشخص بغیر از پیش فرض موجود انتخاب نماید.
* اتصال
هنگامیکه یک کاربر با استفاده از تابع عضو duplex-link از یک Object شبیه ساز، یک اتصال ایجاد نمود، 2 اتصال ساده در هر 2 جهت ایجاد خواهد شد (شکل زیر).
شکل8: اتصال
نکته قابل توجه آنستکه هر صف خروجی از یک گره در واقع بعنوان بخشی از اتصال ساده Object در نظر گرفته می شود.
o ردیابی
در NS فعالیتهای شبکه از طریق اتصالات ساده ردیابی میشوند. اگر شبیه ساز برای ردیابی فعالیتهای شبکه تنظیم باشد، اتصالات ایجاد شده بعد از شروع Objectهای زیر را همانطور که در شکل 9 آمده انجام میدهند. کاربران همچنین میتوانند مشخصاً یک Object ردیابی از نوع type بین گرههای مشخص src و dst با استفاده از دستورcreate-trace {type file src dst} ایجاد کنند.
شکل9: وارد کردن Objectهای ردیابی
هنگامیکه هر Object ردیابی وارد شده (i.e. EnqT, DeqT, DrpT and RecvT) یک بسته دریافت میکند. آن در فایل ردیابی مشخصی بدون هیچ صرف زمان شبیه سازی نوشته میشود و بسته به Object شبکه بعدی داده خواهد شد.
o صف مانیتورینگ
اساساً Objectهای ردیابی برای ثبت بستههای ورودی در جایی که مستقر هستند، طراحی شدهاند. هر چند که هر کاربر اطلاعات کافی از ردیابی کسب میکند، لیکن ممکن است او علاقمند به دانستن اتفاقات درون یک صف خروجی خاص باشد. برای مثال یک کاربر علاقمند به رفتار صف RED ممکن است بخواهد تغییرات متوسط اندازه صف و اندازه صف فعلی از یک صف RED مشخص را اندازهگیری نماید. مشاهده درون صف میتواند از طریق Objectهای جاسوس صف همانگونه که در شکل 10 آمده است، انجام شود.
شکل10: صف مانیتورینگ
* مثالی از جریان بستهها
تا کنون 2 جزء بسیار مهم از شبکه (گره و اتصال)، آزموده شد. شکل 11 تنظیمات و جریان داده یک مثال شبیه سازی شبکه را نشان میدهد. شبکه شامل 2 گره است (n0 , n1) که بترتیب دارای آدرسهای شبکه 0 و 1 میباشند. نماینده tcp به n0 پیوست شده و از پورت 0 برای ارتباط با یک Tcp Sink Object که به پورت 0 از گره n1 پیوست شده استفاده میکند.
شکل11: مثالی از جریان بستهها
قابل توجه است که شکل فوق رفتار دقیق یک ftp را بروی tcp نشان نمیدهد، بلکه نشاندهنده جزئیات درونی، تنظیم و جریان بستهها در شبیه سازی شبکه نیز میباشد.
5-2 بسته
یک بسته NS از یک پشته هدرها و یک فضای داده اختیاری (شکل 12)، ایجاد شده است. بعنوان یک یادآوری از بخش ؛مثال ساده شبیه سازی؛ قالب یک هدر بسته زمانیکه یک Object شبیه ساز ساخته میشود، ایجاد میگردد. جاییکه همه هدرهای ثبت شده، از قبیل هدرهای مشترک که عموماً بوسیله هر Objectی که نیاز باشد استفاده میشوند، هدر IP، هدر Tcp، هدر Rtp و هدر ردیابی، تعریف شدهاند. و افست هر هدر در پشته ثبت گردیده است. این بدان معناست که خواه یک هدر مشخص شده استفاده شده یا نشود، یک پشته از همه هدرهای ثبت شده وقتیکه یک بسته بوسیله یک نماینده معین گردید، ایجاد میشود و هر هدر Object شبکه میتواند با استفاده از مقدار متناظر افست به هر بسته در پشته دسترسی یابد.
شکل12: قالب بسته NS
معمولاً هر بسته فقط پشته هدر دارد (بهمراه یک اشارهگر به فضای دیتا که null میباشد). هرچند یک بسته میتواند دادههای واقعی را (از یک برنامه کاربردی) بوسیله تعیین یک فضای داده حمل نماید، لیکن تعداد کمی از برنامههای کاربردی و نمایندههای اجرایی این امر را پشتیبانی میکنند.
3. بعد از شبیه سازی
1-3 مثالی از تحلیل ردیابی
مثال 4 یک اسکریپت Otcl مشابه مثال نشانداده شده قبلی با اندکی خطوط بیشتر برای ایجاد یک فایل ردیابی و نوئشتن درون آن میباشد.
مثال4: اسکریپت شبیه سازی NS با فعال بودن ردیابی
اجرا کردن اسکریپت فوق یک فایل ردیابی NAM که بعنوان ورودی برای NAM میتواند استفاده گردد را با نام out.tr تولید میکند. شکل 13 نشاندهنده فرمت trace و مثال داده ردیابی از out.tr میباشد.
شکل13: مثالی از قالب ردیابی
هر خط ردیابی با یک توصیفگر رویداد (+ ، – ، d ، r) آغاز میشود که بدنبال آن زمان شبیه سازی (به ثانیه)، مربوط به آن رویداد بهمراه گرههای مبداٌ و مقصد آمده است. اگر شکل 9 بخش اجزای شبکه جاییکه در یک اتصال هر نوع رویدادی ردیابی شده است نگاه کنیم، اطلاعات بعدی در خط قبل از پرچمها (هنگامیکه پرچمی تنظیم نشد بصورت ؛—–؛ نمایان میشود)، نوع بسته و اندازه آنرا (به بایت) مشخص میکند. فیلد بعدی شناسه جریان داده از IPV6 میباشد (fid) که هر کاربر میتواندبرای هر جریان داده در ورودی اسکریپت Otcl آنرا تنظیم نماید. با ابن وجود ممکن است در شبیه سازی از fid استفاده نشود. کاربران میتوانند از این فیلد بمنظور تجزیه و تحلیل استفاده نمایند. همچنین فیلد fid زمانیکه رنگ جریان برای نمایش NAM مشخص میشود، بکار میرود. 2 فیلد بعدی آدرسهای مبداٌ و مقصد به شکلهای ؛پورت و گره؛ هستند. فیلد بعدی شماره ترتیب بستههای مربوط به پروتکلهای لایههای شبکه را نشان میدهد.
در زیر یک مثال انتقال داده کوچک آمده است. در این مثال از یک دستور نوشته شده در Perl بنام "Column" که ستونهایی را از داده ورودی انتخاب میکند، استفاده شده است.
cat out.tr | grep " 2 3 cbr " | grep ^r | column 1 10 | awk '{dif = $2 – old2; if(dif==0) dif = 1; if(dif > 0) {printf("%dt%fn", $2, ($1 – old1) / dif); old1 = $1; old2 = $2}}' > jitter.txt
این فرمان پوسته رویداد (event shell) دریافت بسته cbr را در n3 انتخاب میکند، همچنین شماره ستون 10 و زمان 1 را انتخاب مینماید و تفاوت زمان دریافت آخرین بسته را تقسیم بر تفاوت شماره ترتیب (برای بستههای تلف شده) برای هر شماره ترتیب محاسبه مینماید. در شکل محور X نشاندهنده شماره ترتیب بسته و محور Y نشاندهنده زمان شبیه سازی به ثانیه میباشد.
شکل14: گراف دریافتی (cbr) از گره n3
4. توسعه NS
1-4 در کجا بدنبال چه چیزی باشیم؟
قبل از ورود به بحث توسعه NS، بطور خلاصه مطرح میکنیم که چه اطلاعاتی در چه فهرستها یا فایلهایی ذخیره میشوند. شکل 15 بخشی از یک ساختار فهرستی شبیه ساز را نشان میدهد.
شکل15: ساختار فهرستی NS
از جمله زیرفهرستهای ns_all_22 ، ns-2 جاییست که همه اجراهای شبیه ساز (چه در C++ و یا در Otcl) را داراست. درون این فهرست همه کدهای Otcl و اسکریپتهای مثال تست در زیر فهرستی بنام tcl قرار گرفتهاند و اغلب کدهای C++ هستند که زمانبند رویدادها آنها را ایجاد میکند و کلاسهای Objectهای اجزای شبکه، به استثنای آنهایی که به www مربوط میشوند، همگی در سطح اصلی قرار گرفتهاند.
فهرست tcl دارای زیر فهرستهاییست که از آن جمله فهرست lib که شامل کدهای منبع Otcl که برای اغلب بخشهای پیادهسازی پایهای و اساسی بکار میروند، میباشد (نماینده، گره، اتصال، بسته، آدرس مسیریابی و غیره). بیاد داشته باشیم که کدهای منبع Otcl برای LAN و Web و پیادهسازیهای Multicast در زیر فهرستهای جداگانهای از tcl قرار دارند. در زیر یک بخش از فهرست فایلهای موجود در زیر فهرست ns2/tcl/lib آمده است.
* ns-lib.tcl:
کلاس شبیه ساز و تعاریف اغلب توابع عضو آن به استثنای LAN ، Web و Multicast در اینجا قرار دارند.
* ns-default.tcl:
مقدار پیشفرض برای پارامترهای قابل پیکریندی برای اجزای مختلف شبکه در اینجا قرار دارند. از آنجایی که اغلب اجزای شبکه در C++ ایجاد شدهاند، پارامترهای قابل پیکربندی در واقع متغیرهای C++ هستند که از طریق تابع اتصال Otcl قابل استفاده میباشند.
* ns-packet.tcl:
پیادهسازی ایجاد قالب هدر بستهها در اینجا قرار دارد. زمانیکه یک هدر بسته جدید ایجاد میکنیم، باید هدر را در این فایل ثبت نماییم.
* other OTcl files:
سایر فایلهای otcl در این فهرست شامل پیادهسازی Otcl مربوط به Objectهای شبکه مرکب یا Objectهای کنترلی شبکه در C++ ، میباشند. برنامه ftp بطور کامل در Otcl ایجاد شده و کد منبع آن در ns-sourc قرار دارد.
2-4 اتصال Otcl
بسط دادن NS بوسیله افزودن یک Object اصلی شبکه جدید، معمولاً درگیر ساختن اتصال Otcl از کد C++ میشود. پس از آن کلاس Object در مسیر دادهها باید بخاطر کارایی بیشتر در C++ نوشته شود. این بخش اتصالات C++/Otcl فراهم در NS را با ارائه یک مثال ایجاد نماینده ساده بنام "my agent" که رفتار یک نماینده را ندارد (مثلاً بستهای ایجاد و منتقل نمیکند)، مطرح میکند. شکلهای 16 تا 19 بخشهای فایل C++ نوشته شده برای "my agent" را بهمراه یک پیادهسازی کامل (با 3 خط هدر اضافی) نشان میدهند.
شکل16: مثالی از اجزای شبکه و Object اتصال در C++
شکل17: مثال افزایش محدوده متغیر
شکل18: مفسر فرمان Otcl
شکل19: اجرای فرمان Otcl از یک C++ Object
5. ارائه چند مثال
1-5 شبکه محلی (LAN)
در این بخش به مثالی از اسکریپت شبیه سازی یک شبکه محلی اشاره شده و توپولوژی شبکه و سناریوی شبیه سازی نشان داده شده است.
شکل 20: توپولوژی شبیه سازی شبکه محلی
2-5 پخش چندتایی (Multicast)
این بخش به اسکریپت شبیه سازی یک مثال پخش چندتایی (Multicast) اشاره دارد و نتیجه شبیه سازی در پنجره NAM نمایش داده شده است.
شکل21: پنجره NAM از شبیه سازی Multicast
3-5 سرویس دهنده Web
این بخش اشارهای به شبیه سازی یک سرویس دهنده Web داشته و توپولوژی شبکه در آن نشان داده شده است.
شکل22: توپولوژی شبیه سازی شبکه سرویس دهنده Web
24