البرنامج التعليمي لمحاكاة الشبكة ns-3 الفصل 4

البرنامج التعليمي لمحاكاة الشبكة ns-3 الفصل 4
الفصل 1,2
3

4 نظرة عامة على المفهوم
4.1 التجريدات الرئيسية
4.1.1 العقدة
4.1.2 التطبيق
4.1.3 القناة
4.1.4 جهاز الشبكة
4.1.5 المساعدين الطوبولوجيين
4.2 البرنامج النصي الأول ns-3
4.2.1 الكود النموذجي
4.2.2 المكونات الإضافية
4.2.3 مساحة الاسم ns3
4.2.4 التسجيل
4.2.5 الوظيفة الرئيسية
4.2.6 استخدام مساعدي الطوبولوجيا
4.2.7 استخدام التطبيق
4.2.8 المحاكي
4.2.9 بناء البرنامج النصي الخاص بك
4.3 ns-3 كود المصدر

الفصل 4

نظرة عامة على المفهوم

أول شيء يتعين علينا القيام به قبل أن نبدأ في تعلم أو كتابة كود ns-3 هو شرح بعض المفاهيم والتجريدات الأساسية في النظام. قد يبدو الكثير من هذا واضحًا للبعض، لكننا نوصي بتخصيص الوقت لقراءة هذا القسم للتأكد من أنك تبدأ على أساس متين.

4.1 التجريدات الرئيسية

في هذا القسم، سنلقي نظرة على بعض المصطلحات شائعة الاستخدام على الويب ولكن لها معنى محدد في ns-3.

4.1.1 العقدة

في لغة الإنترنت، يُطلق على جهاز الكمبيوتر الذي يتصل بالشبكة اسم المضيف أو في بعض الأحيان النظام النهائي. نظرًا لأن ns-3 عبارة عن محاكي شبكة وليس محاكيًا للإنترنت، فإننا تعمدنا عدم استخدام مصطلح المضيف، حيث يرتبط هذا ارتباطًا وثيقًا بالإنترنت وبروتوكولاتها. بدلاً من ذلك، نستخدم مصطلحًا أكثر عمومية، تستخدمه أيضًا المحاكيات الأخرى، والذي نشأ في نظرية الرسم البياني: العقدة (العقدة).

في ns-3، يسمى التجريد الأساسي لجهاز الحوسبة بالعقدة. يتم تمثيل هذا التجريد في لغة C++ بواسطة فئة Node. فصل NodeNode (العقدة) توفر طرقًا لمعالجة تمثيلات أجهزة الكمبيوتر في عمليات المحاكاة.

يجب ان تفهم العقدة مثل الكمبيوتر الذي تضيف إليه وظائف. ستضيف أشياء مثل التطبيقات ومجموعات البروتوكولات والبطاقات الطرفية مع برامج التشغيل التي تسمح للكمبيوتر بالقيام بعمل مفيد. نحن نستخدم نفس النموذج الأساسي في ns-3.

4.1.2 التطبيق

بشكل عام، تنقسم برامج الكمبيوتر إلى فئتين عريضتين. يقوم برنامج النظام بتنظيم موارد الكمبيوتر المختلفة مثل الذاكرة ودورات المعالج والقرص والشبكة وما إلى ذلك وفقًا لبعض نماذج الحوسبة. عادةً لا يستخدم برنامج النظام هذه الموارد لتنفيذ المهام التي تعود بالنفع المباشر على المستخدم. عادةً ما يقوم المستخدم بتشغيل تطبيق لتحقيق هدف محدد، والذي يحصل على الموارد التي يتحكم فيها برنامج النظام ويستخدمها.

غالبًا ما يتم رسم الخط الفاصل بين النظام والبرامج التطبيقية عند تغييرات مستوى الامتياز التي تحدث في مصائد نظام التشغيل. ليس لدى ns-3 مفهوم حقيقي لنظام التشغيل، وبالتالي لا يوجد مفهوم لمستويات الامتياز أو استدعاءات النظام. ومع ذلك، لدينا فكرة لتطبيق ما. كما هو الحال في تطبيقات برمجيات "العالم الحقيقي" التي تعمل على أجهزة الكمبيوتر لأداء المهام، تعمل تطبيقات ns-3 على عقد ns-3 للتحكم في عمليات المحاكاة في العالم المحاكي.

في ns-3، التجريد الأساسي لبرنامج المستخدم الذي يولد بعض الأنشطة للنمذجة هو التطبيق. يتم تمثيل هذا التجريد في لغة C++ بواسطة فئة التطبيق. توفر فئة التطبيق طرقًا لمعالجة طرق عرض إصدارنا من التطبيقات على مستوى المستخدم في عمليات المحاكاة. من المتوقع أن يتخصص المطورون في فئة التطبيق بمعنى البرمجة الموجهة للكائنات لإنشاء تطبيقات جديدة. في هذا البرنامج التعليمي، سوف نستخدم تخصصات فئة التطبيق تسمى UdpEchoClientApplication и UdpEchoServerApplication. كما قد تتوقع، تشكل هذه التطبيقات مجموعة من تطبيقات العميل/الخادم المستخدمة لإنشاء حزم الشبكة وصداها.

4.1.3 القناة

في العالم الحقيقي، يمكنك توصيل جهاز كمبيوتر بشبكة. غالبًا ما تسمى الوسائط التي يتم من خلالها نقل البيانات في هذه الشبكات بالقنوات. عندما تقوم بتوصيل كابل إيثرنت بمأخذ الحائط، فإنك تقوم بتوصيل جهاز الكمبيوتر الخاص بك برابط إيثرنت. في محاكاة عالم ns-3، يتم توصيل العقدة بكائن يمثل قناة اتصال. هنا، يسمى التجريد الأساسي لشبكة الاتصال الفرعية بالقناة ويتم تمثيله في لغة C++ بواسطة فئة القناة.

فئة قناة القناة يوفر طرقًا لإدارة تفاعل كائنات الشبكة الفرعية وتوصيل العقد بها. يمكن أيضًا تخصيص القنوات بواسطة المطورين بمعنى البرمجة الموجهة للكائنات. يمكن لتخصص القناة أن يصمم شيئًا بسيطًا مثل السلك. يمكن للقناة المخصصة أيضًا أن تصمم أشياء معقدة مثل محول إيثرنت كبير أو مساحة ثلاثية الأبعاد مليئة بالعوائق في حالة الشبكات اللاسلكية.

سنستخدم إصدارات متخصصة من القناة في هذا البرنامج التعليمي تسمى CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и قناة واي فاي قناة واي فاي. قناة CsmaChannelعلى سبيل المثال، تصمم نسخة من شبكة اتصالات فرعية تقوم بتنفيذ بيئة اتصالات متعددة الوصول لاستشعار الناقل. وهذا يمنحنا وظيفة تشبه شبكة إيثرنت.

4.1.4 جهاز الشبكة

كان من المعتاد أنه إذا كنت تريد توصيل جهاز كمبيوتر بشبكة، فيجب عليك شراء كابل شبكة محدد وجهاز يسمى (في مصطلحات الكمبيوتر الشخصي) بطاقة طرفية يلزم تثبيتها في الكمبيوتر. إذا نفذت بطاقة طرفية بعض وظائف الشبكة، فإنها تسمى بطاقات واجهة الشبكة أو بطاقات الشبكة. اليوم، تأتي معظم أجهزة الكمبيوتر مزودة بأجهزة واجهة شبكة متكاملة ولا يراها المستخدمون كأجهزة منفصلة.

لن تعمل بطاقة الشبكة بدون برنامج تشغيل يتحكم في أجهزتها. في نظام Unix (أو Linux)، يتم تصنيف قطعة من المعدات الطرفية على أنها جهاز. تتم إدارة الأجهزة باستخدام برامج تشغيل الأجهزة، وتتم إدارة أجهزة الشبكة (NIC) باستخدام برامج تشغيل أجهزة الشبكة (برامج تشغيل أجهزة الشبكة) وتسمى مجتمعة أجهزة الشبكة (أجهزة صافية). في نظامي Unix وLinux، يتم الإشارة إلى أجهزة الشبكة بأسماء مثل eth0.

في ns-3، يغطي تجريد جهاز الشبكة كلا من برنامج تشغيل البرنامج والأجهزة التي يتم تصميمها. في المحاكاة، يتم "تثبيت" جهاز شبكة في العقدة للسماح له بالاتصال بالعقد الأخرى عبر القنوات. تمامًا مثل الكمبيوتر الحقيقي، يمكن توصيل العقدة بقنوات متعددة من خلال أجهزة متعددة NetDevices.

يتم تمثيل تجريد الشبكة للجهاز في C++ بواسطة الفئة NetDevice. فصل NetDevice يوفر طرقًا لإدارة الاتصالات بكائنات العقدة والقناة؛ ويمكن للمطورين أن يتخصصوا بمعنى البرمجة الشيئية. في هذا البرنامج التعليمي سوف نستخدم عدة إصدارات متخصصة من NetDevice تسمى جهاز CsmaNet, PointToPointNetDevice и جهاز WifiNet. تمامًا كما تم تصميم محول شبكة Ethernet للعمل مع الشبكة إيثرنت, جهاز CsmaNet مصممة للعمل مع قناة CsmaChannel, PointToPointNetDevice مصممة للعمل مع PointToPointChannelو جهاز WifiNet - مصممة للعمل مع قناة واي فاي.

4.1.5 المساعدين الطوبولوجيين

في الشبكة الحقيقية، ستجد أجهزة كمبيوتر مضيفة مزودة ببطاقات شبكة مضافة (أو مدمجة). في ns-3، نقول إنك سترى عقدًا متصلة بـ NetDevices. في شبكة محاكاة كبيرة، ستحتاج إلى تنظيم الاتصالات بين العديد من الكائنات العقدة, NetDevice и قناة.

منذ توصيل NetDevices بالعقد، وNetDevices بالروابط، وتعيين عناوين IP، وما إلى ذلك. في ns-3 هي مهمة شائعة، ولجعلها سهلة قدر الإمكان، نقدم ما يسمى بمساعدي الطوبولوجيا. على سبيل المثال، لإنشاء NetDevice، تحتاج إلى تنفيذ العديد من عمليات ns-3 kernel، وإضافة عنوان MAC، وتثبيت جهاز الشبكة في العقدة، وتكوين حزمة بروتوكولات العقدة، ثم توصيل NetDevice بالقناة. ستكون هناك حاجة إلى المزيد من العمل لتوصيل أجهزة متعددة بروابط متعددة النقاط ثم توصيل الشبكات الفردية بشبكة Internetworks. نحن نقدم كائنات مساعدة للطوبولوجيا تجمع بين هذه العمليات العديدة في نموذج سهل الاستخدام من أجل راحتك.

4.2 البرنامج النصي الأول ns-3

إذا قمت بتثبيت النظام كما هو مقترح أعلاه، فسيكون لديك الإصدار ns-3 في دليل يسمى repos في دليلك الرئيسي. اذهب إلى الدليل الافراج عن

إذا لم يكن لديك مثل هذا الدليل، فهذا يعني أنك لم تحدد دليل الإخراج عند إنشاء نسخة الإصدار من ns-3، قم بالبناء على النحو التالي:
$ ./waf تكوين —build-profile=release —out=build/release,
$ ./waf بناء

هناك سترى بنية دليل مشابهة لما يلي:

AUTHORS       examples      scratch       utils       waf.bat*
bindings      LICENSE       src           utils.py    waf-tools
build         ns3           test.py*      utils.pyc   wscript
CHANGES.html  README        testpy-output VERSION     wutils.py
doc           RELEASE_NOTES testpy.supp   waf*        wutils.pyc

اذهب إلى الدليل أمثلة / تعليمي. يجب أن تشاهد ملفًا موجودًا هناك يسمى first.cc. هذا هو البرنامج النصي الذي سيقوم بإنشاء اتصال بسيط من نقطة إلى نقطة بين عقدتين وينقل حزمة واحدة بين العقد. دعونا نلقي نظرة على هذا البرنامج النصي سطرًا تلو الآخر؛ وللقيام بذلك، افتح first.cc في محررك المفضل.

4.2.1 الكود النموذجي
السطر الأول في الملف هو سطر وضع المحرر ايماكس. فهو يخبر إيماكس عن اصطلاحات التنسيق (أسلوب الترميز) التي نستخدمها في كود المصدر الخاص بنا.

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */

هذه دائمًا قضية مثيرة للجدل، لذا نحتاج إلى وضع الأمور في نصابها الصحيح لإخراجها من الطريق على الفور. مشروع ns-3، مثل معظم المشاريع الكبيرة، اعتمد أسلوب ترميز يجب أن تتوافق معه كافة التعليمات البرمجية المساهمة. إذا كنت تريد المساهمة بالكود الخاص بك في المشروع، فسيتعين عليك في النهاية التوافق مع معيار الترميز ns-3، كما هو موضح في الملف doc / codingstd.txt أو يظهر على صفحة المشروع على الويب: https://www.nsnam.org/develop/contributing-code/coding-style/.

نوصيك بالاعتياد على شكل ومظهر كود ns-3 وتطبيق هذا المعيار كلما كنت تستخدم الكود الخاص بنا. وافق فريق التطوير بأكمله والمساهمون على ذلك بعد بعض التذمر. سطر وضع emacs أعلاه يجعل من السهل التنسيق بشكل صحيح إذا كنت تستخدم محرر emacs.

تم ترخيص جهاز محاكاة ns-3 باستخدام رخصة جنو العمومية العامة. سترى الرأس القانوني المناسب لـ GNU في كل ملف توزيع ns-3. غالبًا ما ستشاهد إشعار حقوق الطبع والنشر لإحدى المؤسسات المشاركة في مشروع ns-3 أعلى نص GPL ومؤلفه، كما هو موضح أدناه.

/* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License version 2 as 
* published by the Free Software Foundation; 
*
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
*/

4.2.2 المكونات الإضافية

يبدأ الكود نفسه بسلسلة من عبارات التضمين (تتضمن).

#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، والتي ستجدها في الدليل src / الأساسية في الإصدار الذي قمت بتثبيته. ستجد في قائمة هذا الدليل عددًا كبيرًا من ملفات الرأس. عندما تقوم بالتجميع، WAF يضع ملفات الرأس العامة في دليل ns3 في دليل فرعي بناء / تصحيح

إذا لم يكن لديك مثل هذا الدليل، فهذا يعني أنك لم تحدد دليل الإخراج عند إنشاء نسخة الإصدار من ns-3، قم بالبناء على النحو التالي:
$ ./waf تكوين --build-profile=debug --out=build/debug
$ ./waf بناء
أو
$ ./waf تكوين --build-profile=optimized --out=build/optimized
$ ./waf بناء

أو بناء / الأمثل، اعتمادا على التكوين الخاص بك. WAF سيقوم أيضًا تلقائيًا بإنشاء ملف تضمين الوحدة النمطية لتحميل كافة ملفات الرأس العامة. نظرًا لأنك بالطبع تتبع هذا الدليل دينيًا، فقد قمت بذلك بالفعل

$ ./waf -d debug --enable-examples --enable-tests configure

لتكوين المشروع لتشغيل إصدارات التصحيح التي تتضمن الأمثلة والاختبارات. أنت أيضا فعلت

$ ./waf

لتجميع المشروع. والآن عندما تنظر في الدليل ../../build/debug/ns3، ستجد هناك، من بين أمور أخرى، ملفات رأس الوحدات الأربع الموضحة أعلاه. يمكنك إلقاء نظرة على محتويات هذه الملفات والعثور على أنها تتضمن جميع الملفات العامة التي تستخدمها الوحدات المقابلة.

4.2.3 مساحة الاسم ns3

السطر التالي في البرنامج النصي first.cc هو إعلان مساحة الاسم.

using namespace ns3;

يتم تنفيذ مشروع ns-3 في مساحة اسم C++ تسمى ns3. يؤدي هذا إلى تجميع جميع الإعلانات المتعلقة بـ ns-3 في نطاق خارج مساحة الاسم العامة، وهو ما نأمل أن يساعد في التكامل مع التعليمات البرمجية الأخرى. يؤدي استخدام عامل التشغيل C++ إلى إدخال مساحة الاسم ns-3 في المنطقة التصريحية (العالمية) الحالية. هذه طريقة رائعة لقول أنه بعد هذا التصريح، لن تحتاج إلى كتابة عامل إذن ns3::scope قبل كل كود ns-3 الخاص بك لاستخدامه. إذا لم تكن على دراية بمساحات الأسماء، فارجع إلى أي كتاب مدرسي لـ C++ تقريبًا وقارن مساحة الاسم ns3 باستخدام مساحة الاسم std والإعلان using namespace std; في أمثلة العمل مع مشغل الإخراج cout والجداول.

4.2.4 التسجيل

السطر التالي من البرنامج النصي هو:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

سوف نستخدم هذا البيان كمكان مناسب لمناقشة نظام التوثيق الخاص بنا Doxygen. إذا نظرت إلى موقع مشروع ns-3، فستجد رابط التوثيق في شريط التنقل. إذا نقرت على هذا الرابط، فسيتم نقلك إلى صفحة الوثائق الخاصة بنا. يوجد رابط "أحدث إصدار" سينقلك إلى الوثائق الخاصة بأحدث إصدار ثابت من ns-3. إذا حددت رابط "وثائق API"، فسيتم نقلك إلى صفحة وثائق ns-3 API.

ستجد على الجانب الأيسر من الصفحة تمثيلاً رسوميًا لبنية التوثيق. مكان جيد للبدء هو "كتاب" الوحدات النمطية ns-3 في شجرة التنقل ns-3. إذا كشفت الوحدات، سترى قائمة بوثائق وحدات ns-3. كما تمت مناقشته أعلاه، يرتبط مفهوم الوحدة هنا ارتباطًا مباشرًا بالملفات المضمنة في الوحدة أعلاه. تمت مناقشة نظام التسجيل الفرعي ns-3 في القسم باستخدام وحدة التسجيل، لذا سنعود إليها لاحقًا في هذا البرنامج التعليمي، ولكن يمكنك التعرف على العبارة أعلاه من خلال النظر إلى الوحدة جوهرومن ثم فتح الكتاب أدوات التصحيحومن ثم اختيار الصفحة تسجيل. انقر فوق تسجيل.

يجب عليك الآن مراجعة الوثائق Doxygen للوحدة النمطية تسجيل. في قائمة وحدات الماكرو الموجودة أعلى الصفحة، ستشاهد إدخالاً لـ NS_LOG_COMPONENT_DEFINE. قبل النقر على الرابط، تأكد من إلقاء نظرة على "الوصف التفصيلي" لوحدة التسجيل لفهم كيفية عملها بشكل عام. للقيام بذلك، يمكنك التمرير لأسفل أو تحديد "المزيد..." أسفل المخطط.

بمجرد أن يكون لديك فكرة عامة عما يحدث، تابع وإلقاء نظرة على الوثائق الخاصة بـ NS_LOG_COMPONENT_DEFINE المحدد. لن أقوم بتكرار الوثائق هنا، ولكن للتلخيص، يعلن هذا السطر عن مكون تسجيل يسمى مثال FirstScript، والذي يسمح لك بتمكين أو تعطيل تسجيل الرسائل في وحدة التحكم بالرجوع إلى الاسم.

4.2.5 الوظيفة الرئيسية

في السطور التالية من البرنامج النصي سترى،

int 
main (int argc, char *argv[])
{ 

هذا مجرد إعلان عن الوظيفة الرئيسية لبرنامجك (البرنامج النصي). كما هو الحال مع أي برنامج C++، تحتاج إلى تحديد وظيفة رئيسية، ويتم تنفيذها أولاً. لا يوجد شيء خاص هنا. البرنامج النصي ns-3 الخاص بك هو مجرد برنامج C++. يقوم السطر التالي بتعيين دقة الوقت إلى 1 نانو ثانية، وهو الإعداد الافتراضي:

Time::SetResolution (Time::NS);

دقة الوقت، أو ببساطة الدقة، هي أصغر قيمة زمنية يمكن استخدامها (أصغر فرق يمكن تمثيله بين مرتين). يمكنك تغيير الدقة مرة واحدة بالضبط. الآلية التي توفر هذه المرونة تستهلك الذاكرة، لذلك بمجرد تعيين الدقة بشكل صريح، نقوم بتحرير الذاكرة، مما يمنع المزيد من التحديثات. (إذا لم تقم بتعيين الدقة بشكل صريح، فسيتم ضبطها بشكل افتراضي على نانو ثانية واحدة وسيتم تحرير الذاكرة عند بدء المحاكاة.)

يتم استخدام السطرين التاليين من البرنامج النصي لتمكين مكوني التسجيل المضمنين في التطبيقات EchoClient и خادم الصدى:

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

إذا قرأت الوثائق الخاصة بمكون التسجيل، فسترى أن هناك عدة مستويات من التسجيل/التفاصيل التي يمكنك تمكينها في كل مكون. يعمل هذان السطران من التعليمات البرمجية على تمكين تسجيل تصحيح الأخطاء إلى مستوى INFO لعملاء وخوادم الصدى. في هذا المستوى، سيقوم التطبيق بطباعة الرسائل أثناء إرسال واستقبال الحزم أثناء المحاكاة.

سنبدأ الآن في إنشاء الهيكل وتشغيل المحاكاة. نحن نستخدم كائنات مساعد الطوبولوجيا لجعل هذه المهمة سهلة قدر الإمكان.

4.2.6 استخدام مساعدي الطوبولوجيا

سيقوم السطران التاليان من التعليمات البرمجية في البرنامج النصي الخاص بنا بإنشاء كائنات Node ns-3 التي ستمثل أجهزة الكمبيوتر في المحاكاة.

NodeContainer nodes;
nodes.Create (2);

قبل أن نواصل، دعونا نجد الوثائق الخاصة بالفصل NodeContainer. هناك طريقة أخرى للوصول إلى الوثائق الخاصة بفصل معين وهي من خلال علامة التبويب فصول دراسية على الصفحات Doxygen. إذا كان Doxygen مفتوحًا بالفعل، فما عليك سوى التمرير لأعلى إلى أعلى الصفحة وتحديد علامة التبويب "الفصول". من المفترض أن تشاهد مجموعة جديدة من علامات التبويب، إحداها عبارة عن قائمة بالفئات. ضمن علامة التبويب هذه، سترى قائمة بجميع فئات ns-3. قم بالتمرير لأسفل إلى ns3::NodeContainer. عندما تجد فصلًا دراسيًا، حدده للانتقال إلى الوثائق الخاصة بالفصل الدراسي.

كما نتذكر، إحدى تجريداتنا الأساسية هي العقدة. إنه يمثل الكمبيوتر الذي سنضيف إليه أشياء مثل مجموعات البروتوكول والتطبيقات والبطاقات الطرفية. مساعد الطوبولوجيا NodeContainer يوفر طريقة ملائمة لإنشاء أي كائنات وإدارتها والوصول إليها العقدة، والتي قمنا بإنشائها لتشغيل المحاكاة. السطر الأول أعلاه يعلن ببساطة NodeContainer، والتي نسميها العقد. يستدعي السطر الثاني طريقة الإنشاء على كائن العقد ويطلب من الحاوية إنشاء عقدتين. كما هو موضح في Doxygen، تطلب الحاوية من نظام ns-3 إنشاء كائنين العقدة ويخزن المؤشرات إلى هذه الكائنات داخليًا.

العقد التي تم إنشاؤها في البرنامج النصي لا تفعل شيئًا حتى الآن. الخطوة التالية في بناء الهيكل هي توصيل عقدنا بالشبكة. إن أبسط أشكال الشبكات التي ندعمها هو الاتصال من نقطة إلى نقطة بين عقدتين. سنقوم الآن بإنشاء مثل هذا الاتصال.

PointToPointHelper

نقوم بإنشاء اتصال من نقطة إلى نقطة باستخدام نمط مألوف، وذلك باستخدام كائن مساعد طوبولوجي للقيام بالعمل منخفض المستوى المطلوب للاتصال. تذكر أن التجريدين الرئيسيين لدينا NetDevice и قناة. في العالم الحقيقي، تتوافق هذه المصطلحات تقريبًا مع البطاقات الطرفية وكابلات الشبكة. عادة، يرتبط هذان الأمران ارتباطًا وثيقًا ببعضهما البعض، ولا يمكن لأحد الاعتماد على مشاركة الأجهزة، على سبيل المثال إيثرنت عبر قناة لاسلكية. يتبع مساعدو الهيكل لدينا هذه العلاقة الوثيقة، وبالتالي ستستخدم كائنًا واحدًا في هذا السيناريو PointToPointHelper لإعداد وتوصيل كائنات ns-3 PointToPointNetDevice и PointToPointChannel. الأسطر الثلاثة التالية في البرنامج النصي:

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

السطر الأول،

PointToPointHelper pointToPoint;

إنشاء مثيل لكائن على المكدس PointToPointHelper. من وجهة نظر المستوى الأعلى السطر التالي،

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

يقول الكائن PointToPointHelper استخدم القيمة "5 ميجابت/ثانية" (خمسة ميجابت في الثانية) كـ "معدل البيانات".

من وجهة نظر أكثر تحديدًا، تتوافق السلسلة "DataRate" مع ما نسميه سمة PointToPointNetDevice. إذا نظرت إلى Doxygen للصف ns3::PointToPointNetDevice وفي وثائق الطريقة GetTypeId ستجد قائمة بالسمات المحددة للجهاز. من بينها ستكون السمة "معدل البيانات" تحتوي معظم كائنات ns-3 المرئية للمستخدم على قوائم مماثلة من السمات. نحن نستخدم هذه الآلية لإعداد المحاكاة بسهولة دون إعادة الترجمة، كما سترون في القسم التالي.

مشابه ل "معدل البيانات" في PointToPointNetDevice، ستجد سمة "التأخير" المرتبطة بـ PointToPointChannel. السطر الأخير

pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

يقول PointToPointHelper استخدم القيمة "2 مللي ثانية" (ملي ثانية) كقيمة تأخير النشر للارتباط من نقطة إلى نقطة الذي ينشئه لاحقًا.

NetDeviceContainer

في هذه اللحظة لدينا في البرنامج النصي NodeContainer، والذي يحتوي على عقدتين. لدينا PointToPointHelper، وهو مستعد لإنشاء الكائنات PointToPointNetDevices وربطها باستخدام كائن PointToPointChannel. تمامًا كما استخدمنا الكائن المساعد لطوبولوجيا NodeContainer لإنشاء العقد، سنسألك PointToPointHelper أداء العمل بالنسبة لنا فيما يتعلق بإنشاء أجهزتنا وتكوينها وتثبيتها. نحن بحاجة إلى قائمة بجميع الكائنات التي تم إنشاؤها NetDevice، لذلك نستخدم NetDeviceContainer لتخزينها بنفس الطريقة التي استخدمناها NodeContainer لتخزين العقد التي أنشأناها. السطرين التاليين من التعليمات البرمجية،

NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);

إعداد كامل للجهاز والقناة. يعلن السطر الأول عن حاوية الجهاز المذكورة أعلاه، بينما يقوم الثاني بالعمل الرئيسي. طريقة تثبيت كائن PointToPointHelper يأخذ NodeContainer كمعلمة. داخل NetDeviceContainer لكل عقدة تقع في NodeContainer تم إنشاؤه (للاتصال من نقطة إلى نقطة يجب أن يكون هناك اثنان منهم بالضبط) PointToPointNetDevice يتم إنشاؤه وحفظه في حاوية الجهاز. PointToPointChannel مخلوق وملحق به اثنان PointToPointNetDevices. بعد إنشاء الكائنات، يتم تخزين السمات فيها PointToPointHelper، تُستخدم لتهيئة السمات المقابلة في الكائنات التي تم إنشاؤها.

بعد إجراء مكالمة pointToPoint.Install (العقد) سيكون لدينا عقدتين، كل واحدة منهما مزودة بجهاز شبكة من نقطة إلى نقطة ورابط واحد من نقطة إلى نقطة بينهما. سيتم تكوين كلا الجهازين لنقل البيانات بسرعة خمسة ميجابت في الثانية مع تأخير إرسال قدره ملي ثانية عبر القناة.

InternetStackHelper

لدينا الآن عقد وأجهزة تم تكوينها، لكن عقدنا لا تحتوي على مجموعات بروتوكولات مثبتة. سوف يعتني السطران التاليان من التعليمات البرمجية بهذا.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - عبارة عن مساعد هيكلي لمكدسات الإنترنت، يشبه PointToPointHelper لأجهزة الشبكة من نقطة إلى نقطة. طريقة تثبيت يأخذ NodeContainer كمعلمة. عند التنفيذ، سيتم تثبيت حزمة الإنترنت (TCP، UDP، IP، وما إلى ذلك) على كل عقدة حاوية.

IPv4AddressHelper

ثم نحتاج إلى ربط أجهزتنا بعناوين IP. نحن نقدم مساعد طبولوجيا لإدارة تخصيص عنوان IP. واجهة برمجة التطبيقات (API) الوحيدة المرئية للمستخدم هي تعيين عنوان IP الأساسي وقناع الشبكة لاستخدامهما عند القيام بتوزيع العنوان الفعلي (يتم ذلك على مستوى أقل داخل المساعد). السطرين التاليين من التعليمات البرمجية في مثالنا النصي first.cc,

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

أعلن عن كائن مساعد العنوان وأخبره أنه يجب أن يبدأ في تخصيص عناوين IP من الشبكة 10.1.1.0، باستخدام قناع البت 255.255.255.0 لتحديد ذلك. افتراضيًا، ستبدأ العناوين المخصصة بواحد وتزداد بشكل رتيب، وبالتالي فإن العنوان الأول المخصص من هذه القاعدة سيكون 10.1.1.1، ثم 10.1.1.2، وما إلى ذلك. في الواقع، على مستوى منخفض، يتذكر نظام ns-3 جميع عناوين IP المخصصة ويقوم بإنشاء خطأ فادح إذا قمت عن طريق الخطأ بإنشاء موقف يتم فيه إنشاء نفس العنوان مرتين (بالمناسبة، هذا الخطأ يصعب تصحيحه).

السطر التالي من التعليمات البرمجية،

Ipv4InterfaceContainer interfaces = address.Assign (devices);

ينفذ تعيين العنوان الفعلي. في ns-3 نقوم بإنشاء اتصال بين عنوان IP وجهاز يستخدم الكائن واجهة IPv4. مثلما نحتاج أحيانًا إلى قائمة بأجهزة الشبكة التي أنشأها المساعد لاستخدامها لاحقًا، نحتاج أحيانًا إلى قائمة بالكائنات واجهة IPv4. IPv4InterfaceContainer يوفر هذه الوظيفة.

قمنا ببناء شبكة من نقطة إلى نقطة، مع تثبيت الحزم وتعيين عناوين IP. نحتاج الآن إلى تطبيقات في كل عقدة لتوليد حركة المرور.

4.2.7 استخدام التطبيق

أحد التجريدات الرئيسية الأخرى لنظام ns-3 هو تطبيق (طلب). في هذا السيناريو، نستخدم تخصصين من الفئة الأساسية تطبيق تم استدعاء NS-3 UdpEchoServerApplication и UdpEchoClientApplication. كما في الحالات السابقة، نستخدم الكائنات المساعدة لتكوين الكائنات الأساسية وإدارتها. هنا نستخدم UdpEchoServerHelper и UdpEchoClientHelpeص الأشياء لجعل حياتنا أسهل.

UdpEchoServerHelper

يتم استخدام سطور التعليمات البرمجية التالية في البرنامج النصي الخاص بمثال first.cc لتكوين تطبيق خادم صدى UDP على إحدى العقد التي أنشأناها سابقًا.

UdpEchoServerHelper echoServer (9);

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

يتم إنشاء السطر الأول من التعليمات البرمجية في المقتطف أعلاه UdpEchoServerHelper. كالعادة، هذا ليس تطبيقًا بحد ذاته، بل هو كائن يساعدنا في إنشاء تطبيقات حقيقية. إحدى اتفاقياتنا هي تمرير السمات المطلوبة إلى مُنشئ الكائن المساعد. في هذه الحالة، لا يستطيع المساعد القيام بأي شيء مفيد إلا إذا تم إعطاؤه رقم المنفذ الذي سيستمع عليه الخادم للحزم، ويجب أن يكون هذا الرقم معروفًا للعميل أيضًا. في هذه الحالة، نقوم بتمرير رقم المنفذ إلى المنشئ المساعد. المنشئ بدوره يفعل ذلك بكل بساطة SetAttribute مع القيمة التي تم تمريرها. لاحقًا، إذا رغبت في ذلك، يمكنك استخدام SetAttribute لتعيين قيمة مختلفة لسمة المنفذ.

مثل العديد من الكائنات المساعدة الأخرى، الكائن UdpEchoServerHelper لديه طريقة تثبيت. يؤدي تنفيذ هذه الطريقة بشكل فعال إلى إنشاء تطبيق خادم صدى أساسي وربطه بالمضيف. ومن المثير للاهتمام أن الطريقة تثبيت يأخذ NodeContainer كمعلمة تماما مثل الآخرين تثبيت الأساليب التي رأيناها.

يأخذ التحويل الضمني C++ الذي يعمل هنا نتيجة الطريقة العقدة.الحصول على(1) (الذي يُرجع مؤشرًا ذكيًا إلى كائن العقدة - Ptr ) ويستخدمه في مُنشئ الكائن المجهول NodeContainerوالذي يتم بعد ذلك تمريره إلى الطريقة تثبيت. إذا لم تتمكن من تحديد توقيع الطريقة الذي تم تجميعه وتنفيذه في كود C++، فابحث بين التحويلات الضمنية.

الآن نرى ذلك echoServer.Install على وشك تثبيت التطبيق UdpEchoServerApplication على وجدت في NodeContainerالتي نستخدمها لإدارة عقدنا، العقدة ذات الفهرس 1. الطريقة تثبيت سيُرجع حاوية تحتوي على مؤشرات لجميع التطبيقات (في هذه الحالة واحدة، نظرًا لأننا مررنا ملف مجهول NodeContainer، تحتوي على عقدة واحدة) تم إنشاؤها بواسطة المساعد.

تحتاج التطبيقات إلى تحديد متى تبدأ في توليد حركة المرور بداية وقد تحتاج أيضًا إلى تحديد وقت لإيقافه "قف". نحن نقدم كلا الخيارين. يتم ضبط هذه الأوقات باستخدام الطرق حاوية التطبيق آبدأ и قلة النوم. تقبل هذه الطرق معلمات النوع الوقت: . في هذه الحالة نستخدم تسلسلًا واضحًا لتحويلات C++ للحصول على C++ مضاعفة 1.0 وتحويله إلى كائن الوقت tns-3 الذي يستخدم كائن الثواني للتحويل إلى ثواني. تذكر أنه يمكن التحكم في قواعد التحويل بواسطة مؤلف النموذج، وأن C++ لها قواعدها الخاصة، لذلك لا يمكنك دائمًا الاعتماد على المعلمات التي يتم تحويلها بالطريقة التي تتوقعها. خطين

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

سيؤدي إلى بدء تشغيل تطبيق خادم الصدى (تشغيله تلقائيًا) بعد ثانية واحدة من بدء المحاكاة وإيقافه (إيقاف تشغيله) بعد عشر ثوانٍ من المحاكاة. نظرًا لأننا أعلنا عن حدث محاكاة (حدث إيقاف التطبيق)، والذي سيتم تنفيذه خلال عشر ثوانٍ، فسيتم محاكاة عشر ثوانٍ على الأقل من تشغيل الشبكة.

UdpEchoClientHelper

تطبيق العميل صدى تم تكوينه بطريقة مشابهة تقريبًا للخادم. هناك كائن أساسي UdpEchoClientApplicationالتي تدار
UdpEchoClientHelper.

UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

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

ومع ذلك، بالنسبة لعميل الصدى، نحتاج إلى تعيين خمس سمات مختلفة. يتم تعيين السمتين الأوليين في وقت الإنشاء UdpEchoClientHelper. نقوم بتمرير المعلمات المستخدمة (داخل المساعد) لتعيين السمات "عنوان بعيد" и "المنفذ البعيد" وفقًا لاتفاقنا لتمرير المعلمات الضرورية إلى المنشئ المساعد.

دعونا نتذكر أننا استخدمنا IPv4InterfaceContainer لتتبع عناوين IP التي خصصناها لأجهزتنا. ستتوافق الواجهة الخالية في حاوية الواجهات مع عنوان IP الخاص بالعقدة الخالية في حاوية العقد. تتوافق الواجهة الأولى في حاوية الواجهات مع عنوان IP الخاص بالعقدة الأولى في حاوية العقد. لذلك، في السطر الأول من التعليمات البرمجية (أعلاه)، نقوم بإنشاء مساعد ونخبره أن عنوان العميل البعيد سيكون عنوان IP المخصص للمضيف حيث يوجد الخادم. نقول أيضًا أننا بحاجة إلى الترتيب لإرسال الحزم إلى المنفذ التاسع.

تخبر سمة "MaxPackets" العميل بالحد الأقصى لعدد الحزم التي يمكننا إرسالها أثناء المحاكاة. تخبر السمة "الفاصل الزمني" العميل بمدة الانتظار بين الحزم، وتخبر السمة "حجم الحزمة" العميل بمدى حجم حمولة الحزمة. باستخدام مجموعة السمات هذه، نطلب من العميل إرسال حزمة واحدة بحجم 1024 بايت.

كما هو الحال مع خادم الصدى، قمنا بتعيين سمات عميل الصدى آبدأ и قلة النومولكن هنا نبدأ العميل بعد ثانية من تشغيل الخادم (ثانيتين بعد بدء المحاكاة).

4.2.8 المحاكي

عند هذه النقطة نحن بحاجة إلى تشغيل المحاكاة. يتم ذلك باستخدام الدالة العالمية محاكي :: تشغيل.

Simulator::Run ();

عندما قمنا سابقًا بتسمية الأساليب،

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

لقد قمنا بالفعل بجدولة الأحداث في جهاز المحاكاة في 1,0 ثانية، و2,0 ثانية، وحدثين في 10,0 ثانية. بعد المكالمة محاكي :: تشغيل، سيبدأ النظام في عرض قائمة الأحداث المجدولة وتنفيذها. سيتم إطلاق حدث أولاً بعد 1,0 ثانية، مما سيؤدي إلى تشغيل تطبيق خادم الصدى (يمكن لهذا الحدث بدوره جدولة العديد من الأحداث الأخرى). سيتم بعد ذلك إطلاق حدث مجدول عند t=2,0 ثانية والذي سيؤدي إلى تشغيل تطبيق عميل echo. مرة أخرى، قد يكون لهذا الحدث العديد من الأحداث المخطط لها. سيبدأ تنفيذ حدث البداية في عميل الصدى مرحلة نقل البيانات للمحاكاة عن طريق إرسال حزمة إلى الخادم.

سيؤدي إرسال حزمة إلى الخادم إلى إطلاق سلسلة من الأحداث التي سيتم جدولتها تلقائيًا خلف الكواليس والتي ستنفذ آليات إرسال حزمة صدى وفقًا لمعلمات التوقيت التي وضعناها في البرنامج النصي.

ونتيجة لذلك، نظرًا لأننا نرسل حزمة واحدة فقط (تذكر السمة MaxPackets تم ضبطه على واحد)، ستنتهي سلسلة الأحداث التي بدأها اختبار اتصال العميل الفردي هذا وستنتقل المحاكاة إلى وضع الاستعداد. بمجرد حدوث ذلك، ستكون الأحداث المجدولة المتبقية هي الأحداث قلة النوم للخادم والعميل. عند تنفيذ هذه الأحداث، لن يكون هناك أي أحداث متبقية لمزيد من المعالجة محاكي :: تشغيل سوف يعود السيطرة. اكتملت المحاكاة.

كل ما تبقى هو التنظيف بعد نفسك. يتم ذلك عن طريق استدعاء الدالة العمومية محاكاة::تدمير. لأنه تم استدعاء الوظائف المساعدة (أو كود ns-3 منخفض المستوى)، والتي تم تنظيمها بحيث يتم إدراج الخطافات في جهاز المحاكاة لتدمير جميع الكائنات التي تم إنشاؤها. لم تكن بحاجة إلى تتبع أي من هذه الأشياء بنفسك - كل ما عليك فعله هو الاتصال محاكاة::تدمير واخرج. سيقوم نظام ns-3 بهذا العمل الشاق نيابةً عنك. الأسطر المتبقية من نصنا الأول ns-3، first.cc، تفعل ذلك تمامًا:

Simulator::Destroy ();
return 0;
}

متى سيتوقف جهاز المحاكاة؟

ns-3 عبارة عن محاكي حدث منفصل (DE). في مثل هذه المحاكاة، يرتبط كل حدث بوقت تنفيذه، وتستمر المحاكاة من خلال معالجة الأحداث بترتيب حدوثها مع تقدم المحاكاة. يمكن أن تتسبب الأحداث في جدولة الأحداث المستقبلية (على سبيل المثال، يمكن للمؤقت إعادة جدولة نفسه لإنهاء العد في الفاصل الزمني التالي).

عادةً ما يتم بدء الأحداث الأولية بواسطة الكيان، على سبيل المثال، سيقوم IPv6 بجدولة اكتشاف الخدمات على الشبكة، وطلبات الجوار، وما إلى ذلك. يقوم التطبيق بجدولة حدث إرسال الحزمة الأول، وهكذا. عندما تتم معالجة حدث ما، فإنه يمكن إنشاء حدث واحد أو صفر أو أكثر. ومع تقدم عملية المحاكاة، تقع أحداث، إما تنتهي أو تخلق أحداثًا جديدة. ستتوقف المحاكاة تلقائيًا إذا كانت قائمة انتظار الأحداث فارغة أو تم اكتشاف حدث خاص قلة النوم. حدث قلة النوم تم إنشاؤها بواسطة الوظيفة محاكاة::توقف (وقت التوقف).

هناك حالة نموذجية يكون فيها Simulator::Stop ضروريًا للغاية لإيقاف المحاكاة: عندما تكون هناك أحداث ذاتية الاستدامة. الأحداث المستمرة (أو المتكررة) هي الأحداث التي يتم إعادة جدولتها دائمًا. ونتيجة لذلك، فإنهم دائمًا يبقون قائمة انتظار الأحداث غير فارغة. هناك العديد من البروتوكولات والوحدات التي تحتوي على أحداث متكررة، على سبيل المثال:

• FlowMonitor - فحص دوري للحزم المفقودة.

• RIPng – البث الدوري لتحديثات جدول التوجيه.

• إلخ.

في حالات كهذه محاكاة::توقف اللازمة لوقف المحاكاة بشكل صحيح. بالإضافة إلى ذلك، عندما يكون ns-3 في وضع المحاكاة، يتم استخدام RealtimeSimulator لمزامنة ساعة المحاكاة مع ساعة الآلة، و محاكاة::توقف اللازمة لوقف العملية.

العديد من برامج المحاكاة في الكتاب المدرسي لا تستدعي ذلك محاكاة::توقف بشكل صريح، نظرًا لأنها تنتهي تلقائيًا عند استنفاد الأحداث الموضوعة في قائمة الانتظار. ومع ذلك، ستقبل هذه البرامج أيضًا استدعاء Simulator::Stop. على سبيل المثال، العبارة الإضافية التالية في برنامج المثال الأول ستقوم بجدولة توقف صريح عند 11 ثانية:

+ Simulator::Stop (Seconds (11.0));
  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

ما ورد أعلاه لن يغير سلوك هذا البرنامج فعليًا، نظرًا لأن هذه المحاكاة المحددة تنتهي بشكل طبيعي بعد 10 ثوانٍ. ولكن إذا قمت بتغيير وقت التوقف في العبارة أعلاه من 11 ثانية إلى ثانية واحدة، فستلاحظ أن المحاكاة تتوقف قبل أن يصل أي مخرج إلى الشاشة (نظرًا لأن الإخراج يحدث بعد حوالي ثانيتين من وقت المحاكاة).

من المهم استدعاء Simulator::Stop قبل الاتصال بـ Simulator::Run; وإلا فإن Simulator::Run قد لا يعيد التحكم إلى البرنامج الرئيسي لتنفيذ الإيقاف!

4.2.9 بناء البرنامج النصي الخاص بك

لقد جعلنا إنشاء البرامج النصية البسيطة أمرًا تافهًا. كل ما عليك فعله هو وضع البرنامج النصي الخاص بك في الدليل المؤقت وسيتم إنشاؤه تلقائيًا في حالة تشغيله WAF. دعونا نحاول. ارجع إلى دليل المستوى الأعلى وانسخه أمثلة/البرنامج التعليمي/first.cc للفهرسة خدش

$ cd ../.. 
$ cp examples/tutorial/first.cc scratch/myfirst.cc

الآن قم ببناء نموذج البرنامج النصي الأول الخاص بك باستخدام WAF:

$ ./waf

من المفترض أن تشاهد رسائل تشير إلى أنه تم إنشاء المثال الأول الخاص بك بنجاح.

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
[614/708] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
[706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (2.357s)

يمكنك الآن تشغيل المثال (لاحظ أنه إذا قمت بإنشاء برنامجك في الدليل المؤقت، فيجب عليك تشغيله من خدش):

$ ./waf --run scratch/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.418s) Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

هنا يمكنك أن ترى أن نظام البناء يتحقق من إنشاء الملف ثم يقوم بتشغيله. ترى أن إدخال المكون على عميل الصدى يشير إلى أنه أرسل حزمة واحدة بحجم 1024 بايت إلى خادم الصدى 10.1.1.2. أنت أيضًا ترى مكون التسجيل على خادم الصدى لتقول أنه تلقى 1024 بايت من 10.1.1.1. يقوم خادم الصدى بإعادة تشغيل الحزمة بصمت ويمكنك أن ترى في سجل عميل الصدى أنه استلم الحزمة الخاصة به مرة أخرى من الخادم.

4.3 ns-3 كود المصدر

الآن بعد أن استخدمت بعض مساعدات ns-3، يمكنك إلقاء نظرة على بعض التعليمات البرمجية المصدر التي تنفذ هذه الوظيفة. يمكن الاطلاع على أحدث كود على خادم الويب الخاص بنا على الرابط التالي: https://gitlab.com/nsnam/ns-3-dev.git. هناك سترى صفحة ملخص Mercurial لشجرة التطوير ns-3 الخاصة بنا. في أعلى الصفحة ستجد عدة روابط

summary | shortlog | changelog | graph | tags | files

المضي قدما وحدد رابط الملفات. هذا هو الشكل الذي سيبدو عليه المستوى الأعلى لمعظم مستودعاتنا:

drwxr-xr-x                               [up]
drwxr-xr-x                               bindings python  files
drwxr-xr-x                               doc              files
drwxr-xr-x                               examples         files
drwxr-xr-x                               ns3              files
drwxr-xr-x                               scratch          files
drwxr-xr-x                               src              files
drwxr-xr-x                               utils            files
-rw-r--r-- 2009-07-01 12:47 +0200 560    .hgignore        file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1886   .hgtags          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1276   AUTHORS          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 30961  CHANGES.html     file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 17987  LICENSE          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 3742   README           file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 16171  RELEASE_NOTES    file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 6      VERSION          file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 88110  waf              file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 28     waf.bat          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 35395  wscript          file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 7673   wutils.py        file | revisions | annotate

أمثلة البرامج النصية لدينا موجودة في الدليل أمثلة. إذا نقرت على الأمثلة سترى قائمة من الدلائل الفرعية. أحد الملفات الموجودة في الدليل الفرعي البرنامج التعليمي - first.cc. إذا قمت بالنقر فوق first.cc سترى الكود الذي تعلمته للتو.

كود المصدر موجود بشكل رئيسي في الدليل SRC. يمكنك عرض الكود المصدري بالضغط على اسم الدليل أو الضغط على رابط الملفات الموجود على يمين اسم الدليل. إذا قمت بالنقر فوق دليل src، فستحصل على قائمة بأدلة src الفرعية. إذا قمت بعد ذلك بالنقر فوق الدليل الفرعي الأساسي، فستجد قائمة بالملفات. الملف الأول الذي ستراه (في وقت كتابة هذا الدليل) هو إحباط.ح. إذا قمت بالنقر على الرابط إحباط.ح، سيتم إرسالك إلى الملف المصدر ل إحباط.ح، والذي يحتوي على وحدات ماكرو مفيدة للخروج من البرامج النصية في حالة اكتشاف حالات غير طبيعية. يمكن العثور على الكود المصدري للمساعدين الذين استخدمناهم في هذا الفصل في الدليل src/التطبيقات/helper. لا تتردد في التجول في شجرة الدليل لمعرفة مكان وجودها وفهم أسلوب برامج ns-3.

المصدر: www.habr.com

إضافة تعليق