بخشی از مقاله
. مقدمه
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 امكانپذير است.
سير دادهها) بطور كامل ميتواند در 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 اجرا ميگردد. در زير خط زمانبندي رويدادهاي شبيهسازي به مثال بالا افزوده شده است.