بسم الله الرحمن الرحيم
سوف ابدأ مستعينا بالله بكتابة سلسلة دروس تتعلق بالـRTP Protocol ومناقشة مشكلات ووضع حلول عملية لنقل الصوت والصورة ذات الجودة العالية عبر شبكات الـMulticasting والـInternet2 وسوف تحتوي هذه السلسلة على المواضيع التالية:
1- مقدمة في المشكلات والحلول في عملية نقل الصوت والصورة ذات الجودة العالية عبر شبكات الـMulticasting والـInternet2 مبيننا فيها اهم تلك الأسباب والتحديات التي تواجه مبرمجي تلك الأنظمة.
2- التعامل مع بروتوكول النقل في الزمن الحقيقي RTP وشرح مكوناته واجزائه وبرمجته تحت منصة الدوت نيت
3- التعامل مع الـDirect Sound والـRTP لعلية نقل الصوت كذلك حل بعض المشاكل المتعلقة بالـ Jitter
4- التعامل مع الـMicrosoft Direct Show والـRTP لعملية نقل الصورة وحل بعض المشاكل المتعلقة بالمزامنة بين الصوت والصورة
5- امن وتشفير الـVOIP وحل مشكلات الـQoS لعملية نقل الصوت بشكل امن.
الدرس الأول: مقدمة في المشكلات والحلول في عملية نقل الصوت والصورة ذات الجودة العالية عبر شبكات الـMulticasting والـInternet2 مبيننا فيها اهم تلك الأسباب والتحديات التي تواجه مبرمجي تلك الأنظمة
سأقدم في هذا الدرس تحليل لأهم التحديات التي تواجه مبرمجي أنظمة المؤتمرات وذلك من خلال دراسة العوامل المؤثرة على جودة نقل الصوت والصورة عبر شبكة الإنترنت وكيفية التغلب على هذه المشكلات باستخدام بروتوكول النقل في الزمن الحقيقي RTP Real Time Protocol وشرح كيفية التعامل معه برمجيا.
يعتبر استخدام برمجيات الدردشة Chatting وأيضا الـConferencing من أكثر الأمور التي تستخدم بشكل يومي ومع دخول هذه المجالات في أنظمة التعلم الإلكتروني تتزايد الحاجة لنقل كميات اكبر من البيانات بزمن الحقيقي Real Time Transportation لعدد اكبر من المتصلين و يعتبر عامل الزمن Timestamp من أهم التحديات والتي تواجه مبرمجي هذه الأنظمة ويظهر هذا التحدي جليا عند التعامل مع شبكة الإنترنت لنقل صوت المحاضر إلى عدد كبير من المتصلين فتأخر وصول جزء من البيانات يعني تقطع في الصوت ووصول جزء قبل الأخر يعني خروج صوت غير مفهوم ومشاكل أخرى قد تحدث في المزامنة بين الصوت والصورة وهذا الأمر غير مقبول في أنظمة الـConferencing التي تعتمد على الزمن الحقيقي والجودة العالية المفترضة منها.
ويمكننا أن نلخص هذه التحديات بثلاثة عوامل رئيسية:
أولا حجم البيانات المرسلة وعلاقته بحجم الـBuffer عند المرسل بناء على سرعة الشبكة:
يعرف الـBuffer من طرف المرسل بأنه المساحة التخزينية التي يتم حجزها بذاكرة وبمقدار محدد لتخزين البيانات بشكل مؤقت قبل إرسالها و من الطبيعي في برمجيات الـConferencing أنه كلما زادت جودة وسرعة الشبكة قلت حاجتنا للـBuffer من طرف المرسل إذ يزيد حجم الـBuffer نسبة التأخر في عملية نقل الصوت ولكنه يضمن وصول أكثر أمانا للبيانات فبزيادة حجم الـBuffer يكون هنالك أمل أكبر لإعادة إرسال البيانات التي يتم فقدانها إثناء النقل. والتحكم في حجم الـBuffer يعتمد أيضا على طبيعة البرنامج وكمثال فإن برمجيات البث الإذاعي أقل حاجة لزمن الحقيقي من البرمجيات التي يتم فيها التفاعل بين الأطراف وبذلك يمكن أن نزيد فيها حجم الـBuffer لتخزين مدة محددة من العرض قبل عملية الإرسال ومن الأمثلة على ذلك برنامج Microsoft Media Encoder وهو برنامج يأتي مع المجموعة Microsoft Expression Studio والذي من ضمن خواصه التعامل مع والـWindows Media Server لعملية بث الصوت والصورة سواء بشكل مباشر Live أو من ملف MM مسجل.
ثانيا Voice Jitter Loss & Delay:
يعتبر هذا التحدي من واحد من أكبر التحديات التي تواجه مبرمجي أنظمة المؤتمرات وذلك لسبب هام ومعروف وهو أنه كلما زاد حجم البيانات المحملة على الـRTP Packet زاد الاحتياج إلى قناة نقل ذات جودة أعلى والسبب اختلاف حجم الـFrame الأقصى Max Size of frame والتي تستطيع قناة النقل أن تحمله وكمثال فإن الحجم الأقصى للـFrame في شبكة الـEthernet هو 1500 Bytes وهذا يعني أنه في حالة نقل البيانات على شبكات أبطأ عندها يجب تقليل حجم الـFrame وكلما قل حجم الـFrame زاد عدد تلك الـFrames وبالتالي فرصة اكبر لضياع Frames إثناء النقل كما سيحتاج المستقبل فترة أطول و Buffer أكبر لإعادة ترتيب تلك الـFrames إذ يتراوح حجم الـHeader الخاص بالـIPv4 من 20 إلى 60 Bytes بناءا على الـOptions المستخدم فإذا لم يتم استخدام الـOptions عندها سيكون حجم الـHeader ثابت وهو 20 Bytes ويحتاج الـUDP Header إلى 8Bytes و الـRTP Header إلى 12 Bytes وفي هذه الحالة فإن صافي حجم الـRTP Frame الواحد بدون البيانات هو 40 Bytes.
Empty RTP Frame Size = 20 Bytes for IPv4 Header+ 8 Bytes for UDP Header + 12 Bytes For RTP Header = 40Bytes.
وكمثال إذا كنت تريد نقل 1024 K Bytes من البيانات على شبكة الـEthernet فإنك ستحتاج إلى تقسيم البيانات على الحجم ألأعظمي لقناة النقل هذه وهو 1500 Bytes ولحساب ذلك:
1500 Bytes – 40 Bytes for each frame = 1460 Bytes 1024 KB to Bytes = 1024^2 (1024^2) / 1460 = 718 Frames
وبذلك نحتاج إلى تقسيم تلك البيانات إلى 718 Frames مما يعني زيادة حجم البيانات بمقدار 28720 Bytes وهي ناتج ضرب حجم الـFrame الواحد بعدد الـFrames أي 718 * 40 وتعتبر هذه الزيادة حجم زائد يتحملها في النهاية المستقبل وبالتالي زيادة في Delay لإجراء عمليات الترتيب والمعالجة لتلك البيانات قبل عرضها.
ثالثا وصول البيانات بشكل غير مرتب Out-Of- Sequence وكيفية التغلب على هذه المشكلة:
تحدثت في كتاب (احترف برمجة الشبكات الجزء الأول) عن عملية نقل البيانات من خلال بروتوكولات النقل المعروفة وهي الـ TCP والـ UDP وقد بينا عيوب كل منها في عملية النقل فمن المعروف أن الـTCP بروتوكول جيد لنقل البيانات الكبيرة الحجم والتي لا يعتبر فيها عامل الزمن الحقيقي لنقل أمر مهم ومن عيوبه أنه لا يدعم عمليات الـMulticasting والـBroadcasting لكن من أهم خواصه التأكد من نقل البيانات بالشكل الصحيح وبالترتيب السليم وبهذا فإن بروتوكول الـUDP سريع في عملية النقل للبيانات التي لا يزيد حجمها عن الحجم الأقصى للـFrame والتي تستطيع قناة النقل تحمله وبالتالي فإن نقل البيانات التي يزيد حجمها عن الحجم الأقصى للـFrame لا يمكن نقلها باستخدام الـUDP إلا إذا تم تقسيمها على مجموعة من الـFrames ومن المعروف أن الـUDP لا يدعم عملية ترتيب الـFrames وبالتالي فإن وصول Frame قبل الآخر قد يسبب فشل عملية النقل بأكملها ومن هنا دعم بروتوكول الـUDP ببروتوكول الـRTP لكي يتمكن المستقبل من إعادة ترتيب الـFrames بعد نقلها كما ويدعم الـRTP عملية محاولة لتصليح الـFrames التي قد تصل مشوهة وذلك من خلال FEC – Frame Error Correction وبالتالي محاولة الإصلاح بدلا من إعادة طلب الإرسال.

