الأدلة التقنية

مصطلحات الاتصالات الهاتفية VoIP للمبتدئين

شرح مبسط لمصطلحات الهاتف عبر الإنترنت، وما يمر في الشبكة بين ضغط زر الاتصال ووصول الصوت إلى الطرف الآخر.

مصطلحات الاتصالات الهاتفية VoIP للمبتدئين

في أغلب الشركات يوجد صندوق في غرفة السيرفرات أو خلف مكتب الاستقبال اسمه «السنترال»، تدخل إليه خطوط شركة الاتصالات من جهة، وتخرج منه أسلاك الهواتف المكتبية من الجهة الأخرى، ولا يعرف أحد كيف يعمل من الداخل إلا الفني الذي يأتي عند كل تعديل. ثم يقرر أحدهم أن ينقل الهواتف إلى «VoIP»، فيسمع الفريق كلمات جديدة في أول اجتماع: SIP وTrunk وExtension وCodec وDID، ويوافق الجميع على كل شيء دون أن يعرف أحد ما الذي يمر فعلاً في الشبكة عندما يرن الهاتف.

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

  • ما هو VoIP، وما الفرق بينه وبين شبكة الهاتف التقليدية PSTN.
  • المقسم PBX والتحويلة الداخلية Extension وخطة الاتصال Dial Plan.
  • الخط الخارجي SIP Trunk والرقم المباشر DID، وكيف تصل المكالمة من جوال عميل إلى هاتف على مكتبك.
  • بروتوكول SIP ورسائله، ثم SDP وRTP اللذان يتفقان على الصوت وينقلانه.
  • الترميز Codec وكم تستهلك المكالمة الواحدة من Bandwidth.
  • مكالمة كاملة رسالة برسالة كما التقطناها في تجربة عملية، وأين تنكسر المكالمات عادة.

ما هو VoIP؟

الاتصال الصوتي عبر بروتوكول الإنترنت Voice over IP، واختصاراً VoIP، هو نقل المكالمة الهاتفية على شكل حزم بيانات IP عبر الشبكة نفسها التي يمر عليها البريد وتصفح الويب، بدل أن تمر عبر خط نحاسي مخصص لها. وفي شبكة الهاتف التقليدية Public Switched Telephone Network، واختصاراً PSTN، كانت المكالمة تحجز دائرة كاملة من طرف إلى طرف طوال مدة المكالمة، أما في VoIP فيقطع الصوت إلى أجزاء صغيرة، كل جزء منها مدته 20 ms في الغالب، ويرسل كل جزء في حزمة مستقلة، والطرف الآخر يجمعها ويشغلها بالترتيب.

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

المقسم PBX والتحويلة الداخلية Extension

المقسم الخاص Private Branch Exchange، واختصاراً PBX، هو النظام الذي يدير هواتف مؤسسة واحدة: يعرف من هم موظفوها، ويوصل مكالماتهم الداخلية ببعضها دون أن تخرج إلى شركة الاتصالات، ويوجه المكالمات الخارجية إلى الخط المناسب. وكل هاتف في المقسم له رقم قصير يسمى التحويلة الداخلية Extension، مثل 1001 و1002، وهذا الرقم له معنى داخل المقسم فقط، فلو طلبت 1001 من جوالك الشخصي لن يصل إلى أحد. والمقسم الذي يعمل بال VoIP يسمى IP PBX، وأشهر البرامج مفتوحة المصدر التي تقوم بهذا الدور هي Asterisk المرخص بترخيص GPLv2 كما في ملف الترخيص، وFreePBX الذي يضيف واجهة إدارة ويب فوق Asterisk، وسوف نخصص لكل منهما مقالاً في هذه المرحلة. والصورة التالية تبين مكتباً صغيراً بثلاثة هواتف ومقسم وخط خارجي:

مكتب فيه ثلاثة هواتف بأرقام داخلية 1001 و1002 و1003 متصلة بمقسم PBX يعمل ببرنامج Asterisk أو FreePBX، وفوقه خطة اتصال تقول إن الأرقام 10XX داخلية وإن الأرقام التي تبدأ بصفر تخرج عبر الخط الخارجي، ثم خط SIP Trunk عبر الإنترنت إلى مزود خدمة الاتصال، ومنه إلى شبكة الهاتف العامة وجوال العميل، مع جدول للأرقام المباشرة DID يربط كل رقم عام بتحويلة داخلية
المكالمة الداخلية لا تغادر المقسم، والمكالمة الخارجية تمر عبر ال Trunk إلى المزود

والهاتف نفسه قد يكون جهازاً مكتبياً Desk Phone يتصل بالشبكة بكابل Ethernet، أو برنامجاً على الحاسوب يسمى الهاتف البرمجي Softphone، أو تطبيقاً على الجوال، وكلها بالنسبة للمقسم شيء واحد: عميل يتحدث بروتوكول SIP ويسمى في المعايير وكيل المستخدم User Agent.

خطة الاتصال Dial Plan

عندما تطلب رقماً، يحتاج المقسم أن يقرر ماذا يفعل به، وهذا القرار مكتوب في خطة الاتصال Dial Plan، وهي مجموعة قواعد تقول مثلاً: إذا كان الرقم من أربع خانات يبدأ ب 10 فهو تحويلة داخلية فاتصل بها مباشرة، وإذا بدأ بصفر فأرسله عبر الخط الخارجي، وإذا كان الرقم 9000 فشغل البريد الصوتي Voicemail. وفي Asterisk تكتب هذه القواعد في الملف extensions.conf، والقاعدة التي استخدمناها في التجربة سطر واحد تقريباً:

[office]
exten => _10XX,1,NoOp(Call from ${CALLERID(num)} to ${EXTEN})
 same => n,Dial(PJSIP/${EXTEN},20)
 same => n,Hangup()

في الإعداد أعلاه لاحظ التالي:

  • _10XX نمط Pattern يطابق أي رقم من أربع خانات يبدأ ب 10، والشرطة السفلية في البداية تعني أن ما بعدها نمط وليس رقماً حرفياً.
  • Dial(PJSIP/${EXTEN},20) يتصل بالتحويلة نفسها عبر قناة SIP، وينتظر 20 ثانية قبل أن يستسلم إذا لم يرد أحد.
  • كل شيء آخر في المقسم، مثل الطوابير Queues والتسجيل وقوائم «اضغط 1 للمبيعات» IVR، هو في النهاية قواعد إضافية في هذه الخطة.

الخط الخارجي SIP Trunk والرقم المباشر DID

المقسم وحده يكفي للمكالمات الداخلية، أما الاتصال بالعالم الخارجي فيحتاج خطاً إلى شبكة الهاتف العامة، وهذا الخط يسمى Trunk. وفي الماضي كان ال Trunk كابلاً حقيقياً يحمل عدة مكالمات في وقت واحد، أما اليوم فالأشهر هو SIP Trunk، وهو حساب عند مزود خدمة اتصال عبر الإنترنت Internet Telephony Service Provider، واختصاراً ITSP، يتصل به مقسمك عبر الإنترنت، إما بالتسجيل كما يسجل الهاتف في المقسم، أو بعنوان IP ثابت يعرفه المزود، ويمرر له المزود المكالمات من وإلى الأرقام العادية. وال Trunk يأتي عادة بعدد قنوات Channels محدد، وكل قناة تعني مكالمة واحدة في الوقت نفسه، فإذا كان عندك أربع قنوات وفيها أربع مكالمات قائمة، فالمكالمة الخامسة تسمع رسالة انشغال.

أما الرقم المباشر Direct Inward Dialing، واختصاراً DID، فهو رقم هاتف عام يحجزه لك المزود ويرسل كل مكالمة تصل إليه عبر ال Trunk إلى مقسمك، ومعه الرقم المطلوب، فيقرر المقسم بحسب خطة الاتصال أي تحويلة ترن. وبهذا يمكن أن يكون لكل موظف رقم عام مباشر، أو أن تذهب كل الأرقام إلى قائمة ترحيب واحدة. والأرقام العامة تكتب بالصيغة الدولية التي يعرفها معيار ITU-T E.164، وهي رمز الدولة ثم الرقم الوطني، مثل +966 للسعودية.

⚠️
الخط الخارجي يكلف مالاً عن كل دقيقة، لذلك فأي شخص يصل إلى حساب في مقسمك يستطيع أن يجري مكالمات دولية على حسابك، وهذا ما يسمى الاحتيال على المكالمات Toll Fraud. لا تقم بتشغيل مقسم متصل بخط خارجي بكلمات مرور ضعيفة أو بمنفذ SIP مفتوح لكل الإنترنت، وسوف نخصص لتأمين المقسم مقالاً مستقلاً في هذه المرحلة.

بروتوكول SIP: الرسائل التي تجهز المكالمة

بروتوكول بدء الجلسات Session Initiation Protocol، واختصاراً SIP، الذي يعرفه RFC 3261، هو اللغة التي تتحدث بها الهواتف والمقسمات لتجهيز المكالمة وإنهائها، وهو بروتوكول نصي يشبه HTTP كثيراً: طلب Request في سطره الأول طريقة Method وعنوان، ثم ترويسات Headers، ثم جسم اختياري، ورد Response برمز حالة من ثلاث خانات. فإذا كنت قرأت شرح HTTP للمبتدئين فسوف تجد أغلب الشكل مألوفاً، والفرق أن الطرفين في SIP يرسلان الطلبات لبعضهما، فكل هاتف هو كلاينت وسيرفر في الوقت نفسه.

وأهم الطرق Methods التي سوف تراها في السجلات:

  • REGISTER: الهاتف يخبر المقسم «أنا التحويلة 1002 وتجدني على هذا العنوان»، ويكرر ذلك قبل انتهاء المدة المحددة في expires.
  • INVITE: طلب بدء مكالمة، ويحمل في جسمه وصف الصوت المطلوب بصيغة SDP كما سيأتي.
  • ACK: تأكيد استلام الرد النهائي على INVITE.
  • BYE: إنهاء مكالمة قائمة، وCANCEL: إلغاء مكالمة ما زالت ترن.
  • OPTIONS: سؤال «هل أنت موجود؟»، ويستخدمه المقسم لفحص الهواتف بشكل دوري.

ورموز الحالة تتبع منطق HTTP نفسه: 1xx رد مؤقت مثل 100 Trying و180 Ringing، و2xx نجاح مثل 200 OK، و4xx خطأ في الطلب مثل 401 Unauthorized و403 Forbidden و404 Not Found، و5xx خطأ في السيرفر مثل 503 Service Unavailable، ويضيف SIP فئة سادسة 6xx للرفض النهائي مثل 603 Decline. وتستخدم SIP المنفذ 5060 عبر UDP أو TCP، والمنفذ 5061 عند التشفير ب TLS كما في RFC 3261.

وقد يتساءل البعض: كيف يعرف المقسم أن من يرسل REGISTER هو صاحب التحويلة فعلاً؟ والإجابة أن المقسم يرد على أول طلب بالرمز 401 Unauthorized ومعه قيمة عشوائية تسمى nonce، فيحسب الهاتف هاشاً من اسم المستخدم وكلمة المرور وهذه القيمة، ويعيد إرسال الطلب ومعه الترويسة Authorization، وهذه هي طريقة Digest Authentication التي يعرفها RFC 3261، وميزتها أن كلمة المرور نفسها لا تمر في الشبكة. ولذلك لا تقلق عندما ترى 401 في كل مكالمة في السجلات، فهي الخطوة الأولى الطبيعية وليست خطأ.

المقسم يقف في المنتصف B2BUA

عندما يتصل 1001 ب 1002 عبر Asterisk، لا يمرر المقسم رسالة INVITE كما هي، وإنما يستقبلها وينهي جلسة مع 1001، ثم يبدأ جلسة جديدة تماماً مع 1002 برسالة INVITE من عنده، ويربط الجلستين ببعضهما، وهذا الدور يسمى Back-to-Back User Agent، واختصاراً B2BUA. وهذا مهم عند التشخيص، لأنك سوف تجد في السجلات مكالمتين منفصلتين لكل منهما Call-ID مختلف، وسوف تجد في Asterisk قناتين Channels لكل مكالمة، واحدة لكل طرف.

SDP وRTP: الاتفاق على الصوت ثم نقله

رسائل SIP لا تحمل الصوت أبداً، وإنما تحمل وصفاً له مكتوباً بصيغة وصف الجلسة Session Description Protocol، واختصاراً SDP، التي يعرفها RFC 8866، ويتبادل الطرفان هذا الوصف بنموذج العرض والجواب Offer/Answer الذي يعرفه RFC 3264: يرسل المتصل في INVITE عرضاً يقول فيه «أرسل لي الصوت على هذا العنوان وهذا المنفذ، وأنا أدعم هذه الترميزات»، ويرد الطرف الآخر في 200 OK بجواب بالمعلومات نفسها من جهته. وهذا هو العرض الذي أرسله الهاتف 1001 في التجربة، كما التقطناه من الشبكة:

v=0
o=- 3276203282 677258408 IN IP4 10.77.50.21
s=-
c=IN IP4 10.77.50.21
t=0 0
a=tool:baresip 1.0.0
m=audio 20004 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
a=ptime:20

في الوصف أعلاه لاحظ التالي:

  • c=IN IP4 10.77.50.21 هو العنوان الذي يريد الهاتف أن يستقبل الصوت عليه، وm=audio 20004 هو المنفذ، وهذا السطران هما سبب أغلب مشكلات الصوت خلف NAT كما سنرى في المقال التالي.
  • RTP/AVP 0 8 101 قائمة الترميزات بالترتيب المفضل، والأرقام 0 و8 ثابتة في RFC 3551 وتعني PCMU وPCMA، وهما نسختا ترميز G.711.
  • telephone-event هو الطريقة التي تنقل بها ضغطات الأزرار DTMF، مثل «اضغط 1 للمبيعات»، كحدث منفصل عن الصوت كما في RFC 4733.
  • ptime:20 يعني أن كل حزمة صوت تحمل 20 ms من الكلام.

وبعد الاتفاق يبدأ الصوت نفسه بالتدفق عبر بروتوكول النقل في الوقت الحقيقي Real-time Transport Protocol، واختصاراً RTP، الذي يعرفه RFC 3550، وهو يضيف لكل حزمة صوت رقماً تسلسلياً وطابعاً زمنياً Timestamp حتى يرتبها الطرف الآخر ويعرف الحزم المفقودة، ويرافقه بروتوكول التحكم RTCP على المنفذ التالي الذي يرسل تقارير دورية عن الفقد والتأخير. والنسخة المشفرة منه تسمى SRTP ويعرفها RFC 3711. والصورة التالية تبين أن المكالمة الواحدة لها طريقان مختلفان:

هاتف Alice على اليسار وحاسوب Bob على اليمين ومقسم في المنتصف، رسائل SIP على المنفذ 5060 تمر من Alice إلى المقسم ومن المقسم إلى Bob، وصوت RTP على منافذ من 10000 إلى 20000 يمر في مسار منفصل عبر المقسم، ومسار ثالث متقطع يبين أن الصوت قد يذهب مباشرة بين الهاتفين إذا سمح المقسم بذلك
رسائل SIP على منفذ واحد معروف، والصوت على منافذ أخرى تتغير مع كل مكالمة

وهذا الفصل بين الطريقين هو مفتاح فهم مشكلات VoIP، فقد تنجح كل رسائل SIP ويرن الهاتف ويرد الطرف الآخر، ثم لا يسمع أحدهما الآخر، لأن الصوت يمر على منافذ أخرى مغلقة في جدار الحماية، أو يرسل إلى عنوان خاطئ. وفي Asterisk يحدد الخيار direct_media هل يمر الصوت عبر المقسم أم يذهب مباشرة بين الهاتفين، ونطاق منافذ RTP عنده يحدد في الملف rtp.conf، وقيمته في الملف النموذجي من 10000 إلى 20000. وإذا كنت قرأت شرح مكالمات WebRTC خلف NAT فهذا هو الفصل نفسه بين قناة التنسيق Signaling وطريق الوسائط Media، والفرق أن WebRTC يفرض التشفير ويحمل معه آلية ICE لاكتشاف الطريق، أما هواتف SIP التقليدية فتعتمد على المقسم وإعداداته.

الترميز Codec وكم تستهلك المكالمة من Bandwidth

الترميز Codec، وهو اختصار Coder/Decoder، هو الخوارزمية التي تحول موجة الصوت إلى بايتات وتعيدها إلى صوت في الطرف الآخر. وأقدم ترميز ما زال الأكثر انتشاراً هو ITU-T G.711، الذي يأخذ 8000 عينة Sample في الثانية ويحفظ كل عينة في بايت واحد، أي 64 kbit/s، وله نسختان: μ-law وتسمى PCMU، وA-law وتسمى PCMA. وهناك ترميزات أوضح مثل G.722 الذي ينقل نطاقاً صوتياً أعرض بنفس 64 kbit/s ويسمى عادة الصوت عالي الوضوح HD Voice، وترميزات أحدث مثل Opus الذي يتغير معدله من 6 إلى 510 kbit/s بحسب الشبكة، وهو أحد الترميزين اللذين يجب أن يدعمهما كل تطبيق WebRTC مع G.711 كما في RFC 7874. والصورة التالية تبين كيف تتحول 20 ms من الكلام إلى حزمة واحدة:

موجة صوت تتحول إلى 8000 عينة في الثانية، ثم كل 20 ms أي 160 عينة يرمزها G.711 إلى 160 بايت، ثم تضاف ترويسات IP بعشرين بايت وUDP بثمانية بايت وRTP باثني عشر بايت فتصبح الحزمة 200 بايت، و50 حزمة في الثانية تعني 80 kbit/s في كل اتجاه، وتحتها جدول يقارن G.711 وG.722 وOpus من حيث النطاق الصوتي والمعدل ومكان الاستخدام
كل حزمة RTP تحمل 160 بايت من الصوت و40 بايت من الترويسات

لاحظ أن الترويسات وحدها تضيف 40 بايت على كل حزمة، لذلك فالمكالمة بترميز G.711 تستهلك نحو 80 kbit/s في كل اتجاه على مستوى IP، وليس 64 فقط، وهذا حساب نظري من أحجام الترويسات في المعايير وليس قياساً، ويزيد قليلاً مع ترويسات Ethernet. وفي التجربة رأينا أن كل طرف أرسل نحو 50 حزمة في الثانية كما يتوقع الحساب. فإذا كان في مكتبك عشرون مكالمة في الوقت نفسه فأنت تحتاج نحو 1.6 Mbit/s في كل اتجاه للصوت وحده، وهذا رقم صغير لأي اتصال حديث، والمشكلة الحقيقية في جودة الصوت ليست حجم الاتصال وإنما التأخير Latency والاهتزاز Jitter وفقد الحزم، وسوف نخصص لها مقالاً في هذه المرحلة.

وقد يتساءل البعض: لماذا لا نستخدم دائماً أفضل ترميز؟ والإجابة أن الطرفين يجب أن يتفقا على ترميز مشترك في SDP، فإذا لم يجدا ترميزاً مشتركاً فشلت المكالمة، وإذا اختار كل منهما ترميزاً مختلفاً اضطر المقسم إلى التحويل بينهما Transcoding، وهذا يستهلك المعالج ويضيف تأخيراً. لذلك يبقى G.711 هو الخيار الآمن مع شبكة الهاتف العامة لأن كل مزود يدعمه، وتستخدم الترميزات الأحدث بين هواتف المكتب نفسها.

مكالمة كاملة من البداية إلى النهاية

الآن نجمع كل ما سبق في مكالمة واحدة، وقد بنينا لذلك تجربة صغيرة فيها مقسم Asterisk وهاتفان برمجيان في Containers، وسوف نشرحها بالتفصيل مع كل أوامرها في المقال التالي، أما هنا فنأخذ منها التسلسل الحقيقي للرسائل كما التقطناه ب tcpdump على المقسم، بعد أن حذفنا من نهايته أسطر إلغاء التسجيل عند إغلاق الهاتف:

19:13:42  10.77.50.21.5060   > 10.77.50.10.5060   REGISTER sip:10.77.50.10 SIP/2.0
19:13:42  10.77.50.10.5060   > 10.77.50.21.5060   SIP/2.0 401 Unauthorized
19:13:42  10.77.50.21.5060   > 10.77.50.10.5060   REGISTER sip:10.77.50.10 SIP/2.0
19:13:42  10.77.50.10.5060   > 10.77.50.21.5060   SIP/2.0 200 OK
19:13:44  10.77.50.21.5060   > 10.77.50.10.5060   INVITE sip:[email protected] SIP/2.0
19:13:44  10.77.50.10.5060   > 10.77.50.21.5060   SIP/2.0 401 Unauthorized
19:13:44  10.77.50.21.5060   > 10.77.50.10.5060   ACK sip:[email protected] SIP/2.0
19:13:44  10.77.50.21.5060   > 10.77.50.10.5060   INVITE sip:[email protected] SIP/2.0
19:13:44  10.77.50.10.5060   > 10.77.50.21.5060   SIP/2.0 100 Trying
19:13:44  10.77.50.10.5060   > 10.77.50.22.5060   INVITE sip:[email protected]:5060 SIP/2.0
19:13:44  10.77.50.22.5060   > 10.77.50.10.5060   SIP/2.0 180 Ringing
19:13:44  10.77.50.10.5060   > 10.77.50.21.5060   SIP/2.0 180 Ringing
19:13:44  10.77.50.22.5060   > 10.77.50.10.5060   SIP/2.0 200 Answering
19:13:44  10.77.50.10.5060   > 10.77.50.22.5060   ACK sip:[email protected]:5060 SIP/2.0
19:13:44  10.77.50.10.5060   > 10.77.50.21.5060   SIP/2.0 200 OK
19:13:44  10.77.50.21.5060   > 10.77.50.10.5060   ACK sip:10.77.50.10:5060 SIP/2.0
19:13:54  10.77.50.21.5060   > 10.77.50.10.5060   BYE sip:10.77.50.10:5060 SIP/2.0
19:13:54  10.77.50.10.5060   > 10.77.50.21.5060   SIP/2.0 200 OK
19:13:54  10.77.50.10.5060   > 10.77.50.22.5060   BYE sip:[email protected]:5060 SIP/2.0
19:13:54  10.77.50.22.5060   > 10.77.50.10.5060   SIP/2.0 200 OK

العنوان 10.77.50.21 هو هاتف Alice بالتحويلة 1001، و10.77.50.10 هو المقسم، و10.77.50.22 هو هاتف Bob بالتحويلة 1002، والصورة التالية ترسم الرسائل نفسها على شكل سلم Ladder بين الأطراف الثلاثة، وهو الشكل الذي تعرضه أدوات التشخيص مثل sngrep:

مخطط سلم بثلاثة خطوط عمودية لهاتف Alice والمقسم وهاتف Bob، فيه أربع مراحل مرقمة: التسجيل بطلب REGISTER ورد 401 ثم REGISTER مع Authorization ورد 200 OK، ثم تجهيز المكالمة بطلب INVITE ورد 401 ثم INVITE مع Authorization و100 Trying ثم INVITE جديد من المقسم إلى Bob و180 Ringing في الاتجاهين و200 OK مع SDP وACK، ثم الصوت RTP في الاتجاهين، ثم إنهاء المكالمة بطلب BYE ورد 200 OK من كل جهة
التسجيل، ثم تجهيز المكالمة، ثم الصوت، ثم الإنهاء، وكل خطوة في جلستين منفصلتين حول المقسم

وفيما يلي ما يحدث في كل مرحلة:

  1. التسجيل Registration: يرسل هاتف Alice طلب REGISTER، فيرد المقسم ب 401 ومعه nonce، فيعيد الهاتف الطلب مع الهاش، فيرد المقسم ب 200 OK، ومن هذه اللحظة يعرف المقسم أين يجد التحويلة 1001. وكان هاتف Bob قد سجل بالطريقة نفسها قبل ذلك.
  2. تجهيز المكالمة: ترسل Alice طلب INVITE إلى 1002 ومعه SDP، فيطلب المقسم إثبات الهوية مرة أخرى ب 401، لأن الإعداد يطلب المصادقة على كل INVITE وليس على التسجيل فقط، فلا يستطيع أحد أن يتصل باسم تحويلة لا يعرف كلمة مرورها، ثم يرد ب 100 Trying ويبحث في خطة الاتصال، فيجد أن 1002 تحويلة داخلية مسجلة على العنوان 10.77.50.22، فيرسل إليها INVITE جديداً من عنده.
  3. الرنين والرد: يرد هاتف Bob ب 180 Ringing فينقلها المقسم إلى Alice فتسمع نغمة الرنين، ثم يرد Bob ب 200 OK ومعه SDP بعنوانه ومنفذه، فيؤكد المقسم ب ACK، ثم يرسل 200 OK إلى Alice فتؤكد هي أيضاً ب ACK.
  4. الصوت: يبدأ RTP في الاتجاهين، وفي التجربة أرسل كل طرف نحو 490 حزمة خلال عشر ثوان تقريباً، أي نحو 50 حزمة في الثانية كما حسبنا.
  5. الإنهاء: تغلق Alice الخط فترسل BYE، فيرد المقسم ب 200 OK ويرسل BYE إلى Bob فيرد ب 200 OK.

أين تنكسر المكالمات؟

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

دليلتتبع مكالمة SIP عبر الشبكة: لماذا يصل الصوت في اتجاه واحد؟نبني مقسماً وهاتفين خلف NAT في تجربة عملية، ونتتبع المكالمة حزمة بحزمة حتى نعرف لماذا يضيع الصوت وكيف نصلحه.

وإذا كانت المكالمات في المتصفح عبر WebRTC وليس عبر هواتف SIP، فالحل المعتمد هناك هو STUN وTURN، وقد شرحناه في مكالمات WebRTC خلف NAT. وإذا كان للمؤسسة عدة فروع، فالشائع أن يكون المقسم في المركز، وتصل إليه هواتف الفروع عبر شبكة خاصة بين المواقع كما في معمارية المحور والأطراف Hub and Spoke، فيبقى SIP داخل الشبكة الخاصة دون أن يمر بال NAT أصلاً، وكثير من الشركات تضع الهواتف أيضاً في شبكة VLAN خاصة بالصوت كما شرحنا في تقسيم الشبكة.

جدول المصطلحات

المصطلحالمعنىمثال
VoIPنقل المكالمة على شكل حزم IPهاتف مكتبي متصل بكابل الشبكة
PSTNشبكة الهاتف العامة التقليديةالخط الأرضي وشبكات الجوال
PBX / IP PBXمقسم المؤسسة الذي يدير هواتفها ومكالماتهاAsterisk وFreePBX
Extensionرقم داخلي للهاتف داخل المقسم1001
Dial Planقواعد المقسم لتوجيه الأرقام المطلوبة_10XX إلى تحويلة داخلية
Trunk / SIP Trunkالخط الذي يربط المقسم بشبكة الهاتف العامة عبر مزودحساب عند ITSP بأربع قنوات
DIDرقم عام يوجهه المزود إلى مقسمكرقم مباشر لقسم المبيعات
SIPبروتوكول تجهيز المكالمة وإنهائهاINVITE وBYE على المنفذ 5060
SDPوصف الصوت داخل رسائل SIPc= وm=audio
RTP / RTCP / SRTPنقل الصوت، وتقاريره، ونسخته المشفرة50 حزمة في الثانية
Codecطريقة تحويل الصوت إلى بايتاتG.711 وG.722 وOpus
DTMFضغطات أزرار الهاتف أثناء المكالمةtelephone-event
Softphoneهاتف برمجي على الحاسوب أو الجوالbaresip وLinphone
B2BUAالمقسم الذي ينهي جلسة ويبدأ أخرى ويربط بينهماقناتان في Asterisk لكل مكالمة

ماذا بعد في هذه المرحلة؟

بعد هذا المقال والمقال العملي الذي يليه، تكمل مرحلة الاتصالات الهاتفية VoIP بمقالات عن جودة الصوت والترميزات والتأخير، وربط المقسم بشبكة الهاتف عبر SIP Trunk والأرقام DID، ثم Asterisk وFreePBX وFreeSWITCH كل منها في دليل مستقل، ثم المقارنة بينها، والهواتف والتطبيقات، ومراكز الاتصال Call Center، وتأمين المقسم ضد الاحتيال على المكالمات، وتوجيه SIP للمنصات الكبيرة مع Kamailio، وسوف نربط كل مقال منها هنا عند نشره بإذن الله.

الخلاصة

  • VoIP ينقل المكالمة على شكل حزم IP، فيصبح الهاتف جهازاً على الشبكة ويصبح المقسم برنامجاً على سيرفر تستطيع أن تستضيفه بنفسك.
  • المقسم PBX يدير التحويلات الداخلية Extensions ويقرر مصير كل رقم عبر خطة الاتصال Dial Plan، والخط الخارجي SIP Trunk يربطه بشبكة الهاتف العامة، والرقم المباشر DID رقم عام يوجهه المقسم إلى تحويلة.
  • SIP يجهز المكالمة وينهيها برسائل نصية تشبه HTTP، و401 في بداية كل طلب هي خطوة المصادقة الطبيعية وليست خطأ.
  • الصوت لا يمر في SIP، وإنما يتفق عليه الطرفان في SDP ثم ينتقل عبر RTP على منافذ أخرى، وهذا الفصل هو سبب أغلب مشكلات الصوت.
  • مكالمة G.711 تستهلك نحو 80 kbit/s في كل اتجاه مع الترويسات، والتأخير والاهتزاز وفقد الحزم أهم من حجم الاتصال.
  • العناوين المكتوبة داخل SIP وSDP لا يغيرها ال NAT، وهنا تبدأ مشكلات الصوت في اتجاه واحد، وهي موضوع المقال التالي.

سجل التحديثات

  • أكتوبر 2026: كتابة المقال، مع التقاط المكالمة الكاملة من تجربة على Asterisk 20.6.0 وbaresip 1.0.0 في Docker.
Could not load content
نشرة عرب رووت | ArabRoot

معرفة تستحق مكاناً في بريدك.

مقالات مختارة وأدوات مفيدة وأفكار لمشروعك القادم، في رسالة واحدة كل أسبوع.

يمكنك إلغاء الاشتراك متى شئت. الخصوصية

تم استلام طلبك. افتح بريدك واضغط رابط التأكيد لإتمام الاشتراك.