اگر با Asterisk، سیستمهای VoIP یا تلفنهای تحت شبکه کار کرده باشید، احتمالاً پروتکل PJSIP را در تنظیمات سرور یا هنگام ساخت یک داخلی دیدهاید. حالا برایتان سوال شده که PJSIP چیست و چرا اینقدر در Asterisk حائز اهمیت است؟ در ادامه قدمبهقدم جلو میرویم تا PJSIP را نه فقط بهعنوان یک اصطلاح، بلکه بهعنوان بخشی از زیرساخت واقعی تلفن تحت شبکه بشناسیم.
PJSIP چیست و چه تفاوتی با SIP دارد؟
قبل از هر چیز باید یک سوءتفاهم رایج را برطرف کنیم: PJSIP دقیقاً یک «پروتکل» مستقل در کنار SIP نیست. PJSIP یک کتابخانه و Stack ارتباطی متنباز است که برای پیادهسازی SIP و مجموعهای از فناوریهای مرتبط با ارتباطات چندرسانهای توسعه داده شده.
پروژه PJSIP پروتکلهایی مثل SIP، SDP و RTP را در کنار فناوریهای عبور از NAT مانند STUN، TURN و ICE پشتیبانی میکند.
بنابراین اگر بخواهیم خیلی ساده بگوییم، SIP زبان برقراری و مدیریت Session است، اما PJSIP مجموعهای از ابزارهای نرمافزاری برای پیادهسازی این ارتباط و بخشهای مرتبط با آن در یک برنامه ارتباطی است.
SIP چیست و چه کاری انجام میدهد؟
SIP یا Session Initiation Protocol پروتکلی است که برای ایجاد، مدیریت، تغییر و پایاندادن به Sessionهای ارتباطی استفاده میشود. در یک سیستم تلفنی مبتنی بر ویپ، SIP مشخص میکند دستگاهها و سرورها چطور برای برقراری تماس با یکدیگر پیام ردوبدل کنند.
برای مثال، وقتی یک تلفن IP میخواهد با داخلی دیگری تماس بگیرد، ابتدا باید به سیستم تلفنی اعلام شود که قصد برقراری یک Session وجود دارد. پیامهای SIP در این مرحله نقش اصلی را دارند. البته SIP بهتنهایی مسئول انتقال صدای مکالمه نیست؛ برای بخش Media معمولاً فناوریهایی مانند RTP وارد عمل میشوند.
PJSIP دقیقاً چه چیزی به این ماجرا اضافه میکند؟
پروتکل PJSIP یک Stack ارتباطی است که پیادهسازی SIP را همراه با بخشهای دیگری از ارتباطات Real-Time در اختیار توسعهدهنده قرار میدهد. طبق مستندات رسمی پروژه، معماری آن شامل بخشهایی برای SIP، Media و NAT Traversal است؛ از جمله PJSIP برای Stack مربوط به SIP، PJMEDIA برای Media و PJNATH برای قابلیتهای عبور از NAT.
این یعنی PJSIP صرفاً یک قطعه کد برای «فرستادن پیام SIP» نیست. هدف آن این است که بخش قابلتوجهی از پیچیدگی ارتباطات بلادرنگ را در قالب یک مجموعه نرمافزاری یکپارچه در اختیار برنامهها قرار دهد.
به همین دلیل PJSIP در طیف متنوعی از نرمافزارها و تجهیزات ارتباطی قابل استفاده است و خود پروژه نیز بر ویژگیهایی مانند حجم کم، کارایی، انعطافپذیری و قابلیت حمل تأکید دارد.

PJSIP در VoIP چه نقشی دارد؟
حالا اگر از زاویه یک کسبوکار به موضوع نگاه کنیم، داستان ملموستر میشود. وقتی یک شرکت از یک سیستم تلفنی تحت شبکه استفاده میکند، فقط داشتن اینترنت کافی نیست. تلفنها، Softphoneها، سرور تلفنی و گاهی SIP Trunk باید بتوانند از طریق استانداردهای مشخص با یکدیگر ارتباط برقرار کنند. در چنین معماریای، SIP برای Signaling اهمیت دارد و PJSIP میتواند بهعنوان یک Stack نرمافزاری، پیادهسازی این ارتباطات را فراهم کند.
در عمل، این فناوری میتواند در سناریوهایی مانند موارد زیر حضور داشته باشد:
اتصال تلفنهای IP به مرکز تلفن
برقراری تماس بین داخلیهای یک سازمان
اتصال مرکز تلفن به SIP Trunk
مدیریت Registration تلفنها
احراز هویت تجهیزات و کاربران
ارتباطات صوتی و چندرسانهای
مدیریت برخی چالشهای ارتباطی مربوط به NAT
برای یک کسبوکار که از تلفن اینترنتی VoIP استفاده میکند، این مفاهیم در لایه زیرین سرویس قرار دارند. یعنی کاربر نهایی معمولاً با PJSIP مستقیماً کاری ندارد، اما سرویس تلفنی او میتواند بر پایه همین فناوریها و استانداردها کار کند.
PJSIP چه ارتباطی با Asterisk دارد؟
خب، اینجا دقیقاً همان جایی است که احتمالاً بیشتر کاربران با نام PJSIP برخورد میکنند. Asterisk یک چارچوب متنباز برای ساخت سیستمهای ارتباطی و تلفنی است و در معماری آن، chan_pjsip درایور کانال مربوط به PJSIP است و به res_pjsip و ماژولهای مرتبط با آن متکی است. مستندات رسمی Asterisk نیز هنگام صحبت درباره پیکربندی PJSIP، عمدتاً از res_pjsip بهعنوان ماژول مدیریت منابع و پیکربندی SIP صحبت میکنند.
پس وقتی در محیط Asterisk با pjsip.conf، Endpoint یا دستورهای PJSIP روبهرو میشوید، در واقع وارد لایهای از سیستم شدهاید که ارتباطات SIP را برای Asterisk مدیریت میکند.
چرا PJSIP برای سیستمهای تلفنی امروزی مهم است؟
یکی از دلایل اهمیت PJSIP در Asterisk، گذار از درایور قدیمی chan_sip به معماری جدیدتر PJSIP است. Asterisk مستندات مستقلی برای مهاجرت از chan_sip به res_pjsip دارد و ساختار پیکربندی این دو را متفاوت میداند.
حتی ابزار تبدیل sip.conf به pjsip.conf نیز در کد Asterisk ارائه شده است؛ البته خود مستندات هشدار میدهند که این ابزار برای همه سناریوها مناسب نیست و بیشتر برای پیکربندیهای پایه کاربرد دارد.
البته این تفاوت فقط تغییر نام فایل تنظیمات نیست. ساختار PJSIP مفاهیمی مانند Endpoint، AOR و Auth را از هم تفکیک میکند و همین موضوع باعث میشود پیکربندی آن در ابتدا برای کاربری که به chan_sip عادت کرده، کمی پیچیده به نظر برسد.
برای کسبوکارهایی که به جای راهاندازی و نگهداری مستقیم چنین زیرساختی، به دنبال یک راهکار آماده و ابری هستند، سرویسهایی مانند تلفن ابری تلفنچی میتوانند خیلی از پیچیدگیهای فنی لایه زیرساخت را از دوش تیم خارج کنند.
PJSIP در Asterisk چطور کار میکند؟ آشنایی با معماری و اجزای اصلی آن
تا اینجا فهمیدیم که PJSIP صرفاً نام یک پروتکل نیست و در Asterisk نیز از طریق مجموعهای از ماژولهای مرتبط با res_pjsip مورد استفاده قرار میگیرد. اما برای کسی که واقعاً میخواهد با VoIP کار کند، دانستن این تعریف کافی نیست.
برای توضیح بهتر، بیایید به جای حفظ کردن چند اصطلاح، مسیر یک تماس را تصور کنیم. تلفن شما باید خودش را به مرکز تلفن معرفی کند، اعتبارش تأیید شود، Asterisk بداند این دستگاه متعلق به کدام Endpoint است، آدرس فعلی آن را پیدا کند و در زمان تماس بداند درخواست را به کجا بفرستد.
PJSIP برای مدیریت همین روابط، پیکربندی را به چند شیء یا Object مجزا تقسیم میکند. در مستندات رسمی Asterisk، مهمترین این Objectها شامل Endpoint، AOR، Auth، Transport، Identify، Registration و Contact هستند.
Object | نقش در PJSIP | توضیح ساده |
|---|---|---|
Endpoint | تعریف نقطه ارتباطی | مشخص میکند دستگاه یا کاربر SIP چه تنظیماتی دارد |
AOR | مدیریت آدرس و Contact | مشخص میکند برای رسیدن به Endpoint از چه آدرسهایی استفاده شود |
Auth | احراز هویت | اطلاعات لازم برای اعتبارسنجی دستگاه یا کاربر را مدیریت میکند |
Transport | مسیر انتقال SIP | مشخص میکند پیامهای SIP از چه Transportی مثل UDP، TCP یا TLS منتقل شوند |
Identify | شناسایی Endpoint | کمک میکند Asterisk تشخیص دهد درخواست ورودی متعلق به کدام Endpoint است |
Endpoint چیست؟
اگر بخواهیم با سادهترین زبان توضیح دهیم، Endpoint نماینده یک دستگاه یا نقطه ارتباطی SIP در Asterisk است؛ مثلاً یک تلفن IP، یک Softphone یا حتی یک سرور SIP دیگر.
اما یک نکته ظریف وجود دارد: Endpoint خودش مقصد قابل شمارهگیری نیست. در واقع Endpoint بیشتر نقش پروفایل تنظیمات ارتباطی را دارد و تنظیماتی مانند Codecهای مجاز، Context، Authentication و AORهای مرتبط را در خود نگه میدارد. Asterisk برای برقراری ارتباط با دستگاه، از Endpoint در کنار Objectهای دیگری مثل AOR استفاده میکند.
برای مثال، فرض کنید داخلی 6001 متعلق به یک تلفن IP در واحد فروش است. در سادهترین مدل ذهنی میتوانیم بگوییم:
6001 = Endpoint مربوط به تلفن فروش
اما این فقط بخشی از داستان است. Asterisk هنوز باید بداند این تلفن الان دقیقاً در چه آدرس شبکهای قرار دارد و برای احراز هویت آن از چه اطلاعاتی استفاده کند. اینجاست که AOR و Auth وارد ماجرا میشوند.
AOR چیست؟
AOR مخفف Address of Record است و یکی از مهمترین مفاهیم PJSIP محسوب میشود. اگر Endpoint را «هویت و تنظیمات دستگاه» در نظر بگیریم، AOR به Asterisk کمک میکند بفهمد این Endpoint از چه آدرس یا Contactهایی قابل دسترسی است. مستندات Asterisk صراحتاً میگویند که بدون یک AOR مرتبط، Endpoint قابل تماس نیست.
این موضوع در تلفنهای SIP که بهصورت Dynamic Register میشوند اهمیت زیادی دارد. فرض کنید تلفن داخلی 6001 امروز با آدرس 192.168.1.20 و فردا با آدرس دیگری روی شبکه ثبت شود. Asterisk نباید مجبور باشد آدرس ثابت دستگاه را از قبل بداند. در زمان Registration، Contact مربوط به آن ثبت میشود و AOR میتواند این اطلاعات را نگهداری کند.
پس، برای ساخت یک مدل ذهنی ساده:
Endpoint میگوید «این دستگاه چه تنظیماتی دارد».
AOR میگوید «برای رسیدن به این دستگاه، چه Contact یا آدرسی داریم».
AOR همچنین میتواند تنظیماتی مانند تعداد Contactهای مجاز، زمان انقضای Registration و Qualify را کنترل کند.
Auth چیست؟
Auth یا Authentication Object وظیفه نگهداری اطلاعات مربوط به احراز هویت SIP را دارد. وقتی یک تلفن میخواهد در Asterisk ثبت شود، سرور باید بتواند بررسی کند آیا این دستگاه واقعاً مجاز به استفاده از آن حساب است یا خیر.
در سادهترین حالت، اطلاعاتی مانند Username و Password در یک بخش type=auth قرار میگیرند و Endpoint به آن Authentication Object متصل میشود.

این همان بخشی است که در عمل با خطاهایی مثل 401 Unauthorized یا 403 Forbidden ارتباط پیدا میکند. البته این خطاها همیشه به معنی اشتباه بودن رمز عبور نیستند و برای تشخیص دقیق باید مسیر کامل Authentication و شناسایی Endpoint بررسی شود.
Transport چیست؟
Transport مشخص میکند ارتباط SIP در سطح انتقال چطور انجام شود. PJSIP در Asterisk میتواند از Transportهایی مانند UDP، TCP و TLS استفاده کند و PJSIP بهطور کلی قابلیت کار با WebSocket و سازوکارهای مرتبط با IPv6 را نیز دارد.
برای مثال، در یک پیکربندی ساده ممکن است Transport روی UDP تنظیم شود؛ در سناریوهای امنتر میتوان از TLS برای رمزنگاری ارتباط Signaling استفاده کرد.
نکته مهم این است که Transport را با انتقال صدای مکالمه یکی ندانیم. Transport در اینجا به مسیر انتقال پیامهای SIP مربوط است، در حالی که Media و صوت تماس سازوکار جداگانهای دارد.
Identify چیست؟
یکی از بخشهایی که معمولاً در آموزشهای مقدماتی PJSIP کمتر جدی گرفته میشود، Identify است؛ اما هنگام اتصال SIP Trunk یا زمانی که Asterisk باید تشخیص دهد یک درخواست ورودی متعلق به کدام Endpoint است، اهمیت زیادی پیدا میکند.
Asterisk میتواند بر اساس معیارهایی مانند IP مبدأ، Endpoint مربوط به یک درخواست SIP ورودی را شناسایی کند. برای نمونه، میتوان مشخص کرد ترافیک ورودی از یک IP مشخص به Endpoint خاصی نسبت داده شود.
این موضوع در SIP Trunkها بسیار کاربردی است. مثلاً اگر ترافیک SIP از سمت یک Provider وارد Asterisk شود، باید مشخص باشد این درخواست متعلق به کدام Endpoint است تا Asterisk بداند با آن چطور رفتار کند.
بنابراین یک مدل ذهنی کاربردی برای اجزای PJSIP این است:
Endpoint = چه کسی؟
AOR = کجا؟
Auth = با چه اعتباری؟
Transport = از چه مسیر ارتباطی؟
Identify = این درخواست متعلق به کدام Endpoint است؟
وقتی این رابطه را بفهمید، ساختار pjsip.conf دیگر شبیه مجموعهای از کدهای پراکنده و نامفهوم به نظر نمیرسد.
معماری PJSIP در Asterisk چطور است؟
حالا که Endpoint، AOR، Auth، Transport و Identify را شناختیم، میتوانیم یک قدم جلوتر برویم و ببینیم این اجزا در یک سناریوی واقعی چطور کنار هم قرار میگیرند.
فرض کنید یک شرکت سه داخلی دارد و یکی از کارشناسان فروش با یک Softphone از خانه به مرکز تلفن سازمان متصل میشود. تلفن یا Softphone ابتدا باید به Asterisk معرفی شود. سپس Asterisk باید اعتبار کاربر را بررسی کند، اطلاعات مربوط به Contact را در اختیار داشته باشد و در زمان دریافت یا ارسال تماس، Endpoint درست را پیدا کند.
در چنین سناریویی، جریان کلی را میتوان اینطور تصور کرد:
Softphone → Transport → Asterisk/PJSIP → Identify/Authentication → Endpoint → AOR → Contact
البته این یک مدل سادهشده است و در تماس واقعی، Dialplan، SIP Signaling، SDP، RTP و Codec Negotiation نیز وارد فرآیند میشوند.
PJSIP چطور یک تماس VoIP را برقرار میکند؟
فرض کنید کاربر با داخلی ۲۰۲ از یک Softphone به داخلی ۲۰۱ زنگ میزند. ابتدا Softphone باید در Asterisk شناخته شده و در صورت نیاز Register شده باشد. هنگام برقراری تماس، پیامهای SIP برای ایجاد Session ردوبدل میشوند. در این فرآیند، اطلاعاتی درباره مقصد، Codecهای قابل استفاده و مشخصات Media از طریق SDP مبادله میشود. پس از مذاکره موفق، مسیر Media برای انتقال صوت شکل میگیرد.
به همین دلیل، اگرچه کاربر در ظاهر فقط یک شماره را میگیرد، در پشت صحنه چند مرحله اتفاق میافتد:
ثبت و شناسایی Endpoint
برقراری Signaling
مذاکره SDP
انتخاب Codec
ایجاد مسیر Media
انتقال صوت
نکته مهم این است که SIP و RTP را یکی ندانیم. SIP برای کنترل Session است و پروتکل RTP معمولاً برای انتقال Media بلادرنگ به کار میرود. در معماری PJSIP نیز بخشهای مختلف Stack برای Signaling، Media و NAT Traversal از یکدیگر تفکیک شدهاند. (docs.pjsip.org)

جمعبندی
همانطور که دیدیم، PJSIP یک Stack ارتباطی متنباز است که برای پیادهسازی SIP و قابلیتهای مرتبط با ارتباطات بلادرنگ طراحی شده. مهمترین نکته برای کار با PJSIP، درک رابطه میان Objectهای آن است.
Endpoint پروفایل یک نقطه ارتباطی را تعریف میکند، AOR اطلاعات مربوط به مقصد و Contactها را مدیریت میکند، Auth برای احراز هویت به کار میرود، Transport نحوه انتقال SIP را مشخص میکند و Identify میتواند به Asterisk کمک کند درخواست ورودی را به Endpoint درست نسبت دهد.
از نگاه یک کسبوکار، شاید اصلاً لازم نباشد تیم شما با این جزئیات درگیر شود. اگر هدف، داشتن یک زیرساخت تلفنی حرفهای برای فروش، پشتیبانی و ارتباط با مشتری است، راهکارهای تلفن ابری میتوانند این لایه پیچیده را از دید کاربر پنهان کنند و امکاناتی مثل شماره اختصاصی، مدیریت تماس و قابلیتهای سازمانی را در اختیار کسبوکار قرار دهند.



نظرات و تجربههای شما
هنوز دیدگاهی ثبت نشده است؛ اولین دیدگاه را شما بنویسید.