مجله ایرانیکاسرورآموزش سرور، هاست، وردپرس و شبکه
آموزشی

RTPengine چیست؟ مدیریت NAT، WebRTC و SRTP در شبکه‌های VoIP پرترافیک

RTPengine یک Media Proxy یا واسط رسانه برای سامانه‌های VoIP است؛ یعنی برخلاف Kamailio و OpenSIPS که عمدتاً پیام‌های SIP را مسیریابی می‌کنند، RTPengine در مسیر صدای واقعی تماس، ویدئو و سایر جریان‌های RTP…

RTPengine چیست؟ مدیریت NAT، WebRTC و SRTP در شبکه‌های VoIP پرترافیک
خلاصه سریع این آموزش

RTPengine یک Media Proxy یا واسط رسانه برای سامانه‌های VoIP است؛ یعنی برخلاف Kamailio و OpenSIPS که عمدتاً پیام‌های SIP را مسیریابی می‌کنند، RTPengine در مسیر صدای واقعی تماس، ویدئو…

۲۵ دقیقه مطالعه ۰ دیدگاه ۲۵ مهر ۱۴۰۵ آخرین به‌روزرسانی
RTPengine یک Media Proxy یا واسط رسانه برای سامانه‌های VoIP است؛ یعنی برخلاف Kamailio و OpenSIPS که عمدتاً پیام‌های SIP را مسیریابی می‌کنند، RTPengine در مسیر صدای واقعی تماس، ویدئو و سایر جریان‌های RTP قرار می‌گیرد و می‌تواند NAT، WebRTC، ICE، SRTP، تبدیل IPv4/IPv6، مخفی‌کردن IP سرورهای داخلی و حتی Transcoding را مدیریت کند.

تا زمانی که یک PBX ساده با چند تلفن در یک شبکه دارید، ممکن است اصلاً به RTPengine نیاز نداشته باشید. اما وقتی معماری شما شامل چند PBX، کاربران اینترنتی، WebRTC، تلفن‌های پشت CGNAT، چند دیتاسنتر یا لایه SIP Proxy مثل Kamailio و OpenSIPS می‌شود، مدیریت Media به یک مسئله مستقل تبدیل می‌شود.

در چنین معماری‌ای ممکن است SIP کاملاً درست Route شود، تلفن زنگ بخورد و تماس حتی Answer شود، اما هیچ صدایی شنیده نشود؛ چون مسیر SIP و مسیر RTP دو مسئله جدا هستند.

در این مقاله دقیقاً بررسی می‌کنیم RTPengine چیست، چرا در معماری‌های جدید VoIP اهمیت بیشتری پیدا کرده، چه تفاوتی با SIP Proxy و TURN دارد، NAT و WebRTC را چگونه مدیریت می‌کند، SRTP و ICE چه نقشی دارند و برای Scale کردن چند RTPengine چه معماری‌ای مناسب است.

وضعیت نسخه در ۱۷ اکتبر ۲۰۲۶: پروژه RTPengine چند شاخه فعال دارد. در Releaseهای فعلی، mr26.2.1.5 از جدیدترین Buildهای منتشرشده است و شاخه LTS فعلی نیز تا mr13.5.1.30 به‌روزرسانی شده است. برای Production، سازگاری نسخه با Kamailio/OpenSIPS و انتخاب شاخه LTS مهم‌تر از انتخاب صرفاً بزرگ‌ترین شماره نسخه است.

فهرست مطالب

RTPengine چیست؟

نام کامل پروژه در مستندات:

Sipwise NGCP rtpengine

است.

RTPengine یک Proxy برای:

🔹 RTP

🔹 RTCP

🔹 SRTP

🔹 و سایر Mediaهای مبتنی بر UDP

است.

به زبان ساده، به‌جای اینکه صدای تماس مستقیماً بین دو Endpoint ردوبدل شود، می‌توان آن را از RTPengine عبور داد.

مثلاً:

Phone A
   |
   | RTP
   v
RTPengine
   |
   | RTP
   v
Phone B

یا در یک معماری واقعی‌تر:

                 SIP
Phone ─────── Kamailio/OpenSIPS ─────── PBX
  \                                      /
   \                                    /
    └────────── RTPengine ──────────────┘
                   RTP

تفاوت RTPengine با Kamailio و OpenSIPS چیست؟

این تفاوت پایه‌ای را باید قبل از هر چیز بدانید.

Kamailio و OpenSIPS معمولاً Signaling را مدیریت می‌کنند.

RTPengine Media را مدیریت می‌کند.

Signaling شامل پیام‌هایی مثل:

🔹 REGISTER

🔹 INVITE

🔹 180 Ringing

🔹 200 OK

🔹 ACK

🔹 BYE

است.

اما صدای واقعی تماس داخل RTP منتقل می‌شود.

یک تماس می‌تواند SIP سالم و RTP خراب داشته باشد

این همان سناریوی معروف:

تماس برقرار می‌شود ولی صدا نداریم

است.

مثلاً SIP چنین مسیری دارد:

Phone → OpenSIPS → Asterisk

اما SDP به تلفن می‌گوید RTP را به:

10.20.0.12:18546

بفرستد.

کاربر اینترنتی طبیعتاً به IP خصوصی 10.20.0.12 دسترسی ندارد.

تماس Answer می‌شود ولی Media نمی‌رسد.

RTPengine این مشکل را چگونه حل می‌کند؟

SIP Proxy هنگام عبور SDP آن را برای RTPengine می‌فرستد.

RTPengine یک Port محلی رزرو می‌کند و SDP را بازنویسی می‌کند.

مثلاً مقدار:

c=IN IP4 10.20.0.12
m=audio 18546 RTP/AVP 0 8 101

می‌تواند در سمت اینترنت به چیزی شبیه:

c=IN IP4 203.0.113.20
m=audio 32784 RTP/AVP 0 8 101

تغییر کند.

از این لحظه Endpoint صدای خود را به RTPengine می‌فرستد.

RTPengine خودش SIP Server نیست

RTPengine به‌طور معمول منتظر INVITE مستقیم کاربران نمی‌ماند.

یک SIP Proxy یا Application دیگر باید به آن فرمان بدهد.

کنترل معمولاً از طرف:

🔹 Kamailio

🔹 OpenSIPS

🔹 یا نرم‌افزار سازگار با NG Control Protocol

انجام می‌شود.

Control Plane و Media Plane را جدا ببینیم

این معماری را می‌توان به دو بخش تقسیم کرد.

Control Plane:

Kamailio/OpenSIPS → RTPengine

Media Plane:

Endpoint ↔ RTPengine ↔ PBX/Endpoint

NG Control Protocol چیست؟

Kamailio یا OpenSIPS برای RTPengine پیام‌هایی مثل:

🔹 offer

🔹 answer

🔹 delete

🔹 query

می‌فرستد.

به‌طور مفهومی:

Offer: یک Media Session جدید بساز.

Answer: اطلاعات سمت دوم را تکمیل کن.

Delete: Session را بعد از پایان تماس پاک کن.

Query: وضعیت و آمار Session را بده.

چرا Control Port را نباید روی اینترنت باز کنیم؟

این Port برای کنترل Media Sessionها استفاده می‌شود و باید فقط از SIP Proxyهای مورد اعتماد قابل دسترسی باشد.

اگر Kamailio و RTPengine روی یک Server هستند، می‌توانید Control Interface را روی Loopback نگه دارید.

اگر روی دو Server جدا هستند، از Private Network و Firewall محدود استفاده کنید.

مثال معماری امن

Internet
   |
Kamailio
10.20.0.5
   |
   | Private control network
   |
RTPengine
10.20.0.20:2223

Port کنترل RTPengine نباید برای همه اینترنت Allow شود.

مهم‌ترین کاربرد RTPengine: NAT

NAT هنوز یکی از اصلی‌ترین دلایل مشکلات Media در VoIP است.

Endpoint ممکن است در SDP آدرس خصوصی خودش را قرار دهد:

192.168.1.35

در حالی که از دید اینترنت Public IP چیز دیگری است.

RTPengine می‌تواند Media را Anchor کند و آدرس قابل‌دسترسی خودش را در SDP قرار دهد.

RTPengine می‌تواند Public و Private Interface جدا داشته باشد

این قابلیت در معماری SBC بسیار مهم است.

مثلاً:

Public Media:
203.0.113.20

Private Media:
10.20.0.20

سمت اینترنت Public Interface را می‌بیند و PBXهای داخلی Private Interface را.

نمونه Config با دو Interface

ساختار فعلی RTPengine امکان تعریف Interfaceهای منطقی را می‌دهد.

[rtpengine]
table = 0
listen-ng = 10.20.0.20:2223
interfaces-config = interface

[interface-public]
address = 10.10.0.20
advertised = 203.0.113.20
port-min = 30000
port-max = 39999

[interface-private]
address = 10.20.0.20
port-min = 40000
port-max = 49999

IPها فقط نمونه مستندسازی هستند.

advertised چه کاربردی دارد؟

ممکن است خود RTPengine پشت NAT باشد.

در آن حالت Server روی:

10.10.0.20

گوش می‌دهد ولی در SDP باید:

203.0.113.20

تبلیغ شود.

Media Port Range را از Firewall فراموش نکنید

Default فعلی مستند RTPengine برای Media Port Range از حدود:

30000
تا
40000

است، مگر اینکه خودتان تغییر دهید.

اگر Config شما Range متفاوتی دارد، Firewall هم باید دقیقاً همان Range را Allow کند.

Range بزرگ‌تر همیشه بهتر نیست

هر Media Stream به Port نیاز دارد.

اما باز کردن:

UDP 1-65535

فقط برای راحتی، انتخاب مناسبی نیست.

Range مشخص تعریف و همان Range را در Firewall مدیریت کنید.

چرا WebRTC باعث مهم‌تر شدن RTPengine شده است؟

تلفن SIP سنتی معمولاً با چیزی شبیه:

RTP/AVP + PCMA/PCMU

کار می‌کند.

اما Browser WebRTC معمولاً نیازهای متفاوتی دارد:

🔹 ICE

🔹 DTLS

🔹 SRTP

🔹 RTCP-MUX

🔹 AVPF/SAVPF

🔹 اغلب Opus

پس Browser و یک PBX قدیمی الزاماً Media Protocol یکسانی ندارند.

مثال WebRTC به SIP

سمت Browser:

ICE
DTLS-SRTP
RTP/SAVPF
RTCP-MUX
Opus

سمت PBX یا Carrier:

RTP/AVP
PCMA

RTPengine می‌تواند بین این دو دنیا قرار بگیرد.

RTPengine برای WebRTC چه قابلیت‌هایی دارد؟

در نسخه‌های فعلی:

🔹 ICE را می‌فهمد و Candidate تولید یا بازنویسی می‌کند.

🔹 Trickle ICE را پشتیبانی می‌کند.

🔹 DTLS-SRTP را پشتیبانی می‌کند.

🔹 RTP و SRTP را Bridge می‌کند.

🔹 RTCP-MUX را Multiplex یا Demultiplex می‌کند.

🔹 RTP/AVP، RTP/AVPF، RTP/SAVP و RTP/SAVPF را به هم تبدیل می‌کند.

🔹 Opus و سایر Codecها را در صورت نیاز Transcode می‌کند.

ICE چیست؟

ICE یا Interactive Connectivity Establishment مکانیزمی است که Endpointهای WebRTC با آن مسیر مناسب Media را بین Candidateهای مختلف پیدا می‌کنند.

Candidateها ممکن است شامل:

🔹 IP محلی

🔹 IP به‌دست‌آمده از STUN

🔹 Relay

باشند.

RTPengine در ICE چه نقشی دارد؟

RTPengine می‌تواند:

۱. خودش را به‌عنوان Candidate اضافه کند.

۲. Candidateهای قبلی را حذف و Media را مجبور به عبور از خودش کند.

۳. بین Endpoint دارای ICE و Endpoint بدون ICE Bridge ایجاد کند.

۴. به‌صورت ICE Lite عمل کند.

ICE=force چه مفهومی دارد؟

وقتی Policy روی Force قرار گیرد، Candidateهای موجود می‌توانند کنار گذاشته شوند و RTPengine خودش مسیر Media را کنترل کند.

این حالت زمانی مفید است که:

می‌خواهید Media حتماً از Relay عبور کند.

اما Force کردن Relay در همه تماس‌ها هزینه Bandwidth و CPU را افزایش می‌دهد.

آیا RTPengine همان TURN است؟

نه دقیقاً.

TURN یک Relay استاندارد عمومی برای WebRTC است که Client مستقیماً با پروتکل TURN به آن متصل می‌شود.

RTPengine معمولاً توسط SIP Proxy و بر اساس SDP کنترل می‌شود.

پس برای یک WebRTC Application مبتنی بر SIP، RTPengine می‌تواند بخش بزرگی از نیاز Media Relay را برطرف کند، اما نباید آن را جایگزین عمومی TURN برای هر نوع WebRTC Application دانست.

چه زمانی هنوز TURN لازم است؟

اگر Application شما:

🔹 SIP-based نیست.

🔹 WebRTC Peer Connection عمومی دارد.

🔹 Client باید مستقیماً TURN Allocation انجام دهد.

یک TURN Server مانند coturn ممکن است همچنان لازم باشد.

SRTP چیست و RTPengine چه کمکی می‌کند؟

RTP معمولی رمزنگاری نشده است.

SRTP نسخه امن RTP است.

در معماری‌های VoIP ممکن است یک سمت SRTP باشد و سمت دیگر فقط RTP را پشتیبانی کند.

مثلاً:

WebRTC
DTLS-SRTP
    |
    v
 RTPengine
    |
    v
Asterisk
RTP/AVP

RTPengine می‌تواند Crypto Termination را انجام دهد و Media را در سمت دیگر با Profile متفاوت ارسال کند.

RTPengine چه روش‌های SRTP را پشتیبانی می‌کند؟

از جمله:

🔹 SDES-SRTP

🔹 DTLS-SRTP

🔹 AES-CM

🔹 AES-GCM

🔹 HMAC-SHA1 Authentication

این یعنی RTPengine خودش یک نقطه حساس امنیتی است

اگر Media رمزنگاری‌شده روی RTPengine Terminate شود، سرور Media Keyها و Media Decrypted را پردازش می‌کند.

در نتیجه امنیت خود RTPengine بسیار مهم است.

بهتر است:

🔹 Control Port فقط در شبکه خصوصی باشد.

🔹 SSH محدود باشد.

🔹 Server مرتب Update شود.

🔹 دسترسی Root محدود شود.

🔹 فایل Recordingها در صورت استفاده محافظت شود.

RTPengine فقط Relay نیست؛ Transcoding هم دارد

نسخه‌های فعلی RTPengine قابلیت Transcoding دارند.

برای مثال:

Opus
  ↕
PCMA

یا Codecهای دیگر در صورت پشتیبانی Build.

چه زمانی Transcoding لازم می‌شود؟

مثلاً Browser فقط Opus را ترجیح می‌دهد ولی Carrier شما PCMA می‌خواهد.

اگر هیچ Codec مشترکی وجود نداشته باشد، تماس بدون Transcoding ممکن است برقرار نشود.

Transcoding رایگان نیست

Relay ساده یک Packet با Transcoding همان Packet بسیار متفاوت است.

در Transcoding، Media باید:

Decode → Process → Encode

شود.

مصرف CPU می‌تواند به‌طور قابل توجهی افزایش پیدا کند.

برای همین ظرفیت RTPengine را فقط با تست RTP Pass-through اندازه نگیرید اگر Production شما WebRTC-to-PSTN دارد.

Recording هم روی RTPengine ممکن است

RTPengine قابلیت Recording Media را نیز دارد.

این ویژگی می‌تواند در معماری‌هایی مفید باشد که نمی‌خواهند PBX مسئول ضبط تماس باشد.

اما Recording باعث اضافه‌شدن:

🔹 Disk I/O

🔹 Storage Consumption

🔹 Privacy Requirement

🔹 Encryption-at-rest Requirement

می‌شود.

اگر فقط Media Relay می‌خواهیم، Recording را فعال نکنیم

هر Feature اضافه‌ای می‌تواند Capacity و Complexity را کاهش دهد.

اصل مناسب برای Media Node:

فقط قابلیت‌هایی را فعال کنید که واقعاً لازم دارید.

Packet Forwarding در User Space چه مشکلی دارد؟

RTP شامل Packetهای کوچک اما بسیار پرتعداد است.

در حالت معمول هر Packet:

NIC → Kernel → User Space → RTPengine → Kernel → NIC

را طی می‌کند.

این رفت‌وبرگشت باعث:

🔹 Context Switch

🔹 Memory Copy

🔹 Scheduler Overhead

می‌شود.

برای همین RTPengine Kernel Forwarding دارد

نسخه‌های فعلی RTPengine از:

nft_rtpengine

استفاده می‌کنند.

این Module می‌تواند Media Packetهای Session پایدار را مستقیماً داخل Kernel Forward کند.

مزیت Kernel Forwarding چیست؟

بخش بزرگی از Packetها دیگر لازم نیست برای هر Hop وارد Process اصلی RTPengine شوند.

نتیجه می‌تواند:

🔹 CPU کمتر

🔹 Latency کمتر

🔹 Session بیشتر

🔹 PPS بالاتر

باشد.

راهنماهای قدیمی iptables را با احتیاط بخوانید

مستندات جدید RTPengine برای In-kernel Forwarding از:

nftables + nft_rtpengine

صحبت می‌کنند.

بسیاری از آموزش‌های قدیمی اینترنت هنوز بر اساس Moduleهای قدیمی iptables نوشته شده‌اند.

وضعیت Module را بررسی کنیم

lsmod | grep rtpengine

و در صورت نصب صحیح:

modprobe nft_rtpengine

اگر Kernel Module لود نشود چه می‌شود؟

RTPengine می‌تواند به User Space Forwarding برگردد.

پس Failure Module الزاماً به معنی قطع کامل سرویس نیست، اما Capacity و CPU Profile ممکن است تغییر زیادی کند.

برای همین Monitoring باید بفهمد Media واقعاً در چه Modeای Forward می‌شود.

Transcoding همیشه قابل Kernel Offload نیست

Kernel Forwarding برای Packet Forwarding ساده فوق‌العاده است.

اما وقتی نیاز به:

🔹 Transcoding

🔹 Media Manipulation

🔹 برخی حالت‌های Recording

دارید، RTPengine باید Media را عمیق‌تر پردازش کند و User Space نقش بیشتری پیدا می‌کند.

پس Benchmark Relay و Transcoding باید جدا باشد

مثلاً این دو تست یکسان نیستند:

تست A:

PCMA → PCMA

تست B:

WebRTC Opus/DTLS-SRTP
       ↓
Transcoding
       ↓
PCMA/RTP

RTPengine و IPv4/IPv6

یکی دیگر از قابلیت‌های مهم پروژه Bridge کردن:

IPv4 ↔ IPv6

است.

یعنی یک Endpoint IPv6 می‌تواند با Endpoint IPv4 تماس Media داشته باشد و RTPengine در میان آن‌ها قرار بگیرد.

این قابلیت برای شبکه‌های جدید مهم‌تر شده است

برخی Mobile Networkها و Cloud Environmentها IPv6 بیشتری استفاده می‌کنند، در حالی که بسیاری از SIP Carrierها همچنان IPv4 هستند.

داشتن Media Relay دوپشته باعث می‌شود Backend مجبور نباشد تمام Endpointها را مستقیم Reach کند.

چرا RTPengine برای مخفی‌کردن Topology مهم است؟

فرض کنید PBX شما روی:

10.20.0.11

است.

Kamailio می‌تواند SIP Headerها را مخفی کند، اما SDP همچنان ممکن است آدرس PBX را نشان دهد.

RTPengine با Rewrite کردن SDP اجازه می‌دهد Public Client فقط Media IP متعلق به RTPengine را ببیند.

پس Topology Hiding دو بخش دارد

Signaling:

Kamailio/OpenSIPS

Media:

RTPengine

اگر فقط یکی را مخفی کنید، Topology دیگری ممکن است هنوز قابل مشاهده باشد.

RTPengine در کنار Asterisk چه فایده‌ای دارد؟

Asterisk خودش می‌تواند RTP را Anchor و NAT را مدیریت کند.

پس سؤال منطقی این است که چرا RTPengine اضافه کنیم؟

وقتی یک Asterisk دارید، شاید واقعاً نیازی نباشد.

اما وقتی:

🔹 چند Asterisk دارید.

🔹 SIP Edge جدا دارید.

🔹 WebRTC دارید.

🔹 نمی‌خواهید Media IP هر Asterisk Public شود.

🔹 می‌خواهید Media Scale مستقل داشته باشد.

RTPengine جذاب‌تر می‌شود.

معماری چند Asterisk بدون RTPengine

           Kamailio
           /   |   \
          /    |    \
       AST1   AST2   AST3
        ↑      ↑      ↑
        └──── RTP ────┘

هر Asterisk باید Media Public/NAT خودش را درست مدیریت کند.

با RTPengine

         Kamailio
         /  |  \
      AST1 AST2 AST3
         \  |  /
          \ | /
        RTPengine
            |
         Clients

Media Edge مستقل‌تر می‌شود.

آیا این یعنی Asterisk دیگر Media را نمی‌بیند؟

نه الزاماً.

اگر مسیر:

Client → RTPengine → Asterisk

باشد، Media هنوز از Asterisk هم عبور می‌کند.

RTPengine فقط لایه دیگری به Media Path اضافه کرده است.

برای حذف Asterisk از Media Path باید معماری و Direct Media جداگانه طراحی شود.

چند RTPengine را چطور Scale کنیم؟

یکی از مزیت‌های مهم، Scale مستقل Media Layer است.

مثلاً:

              SIP Proxy
            /     |     \
           /      |      \
       RTP-01   RTP-02   RTP-03
          |        |        |
        Media    Media    Media

Kamailio و OpenSIPS هر دو چند RTPengine را پشتیبانی می‌کنند

Moduleهای کنترل RTPengine می‌توانند چند Media Proxy را داخل Set قرار دهند.

در OpenSIPS حتی Weight هر Node در Selection قابل تعریف است.

در نتیجه Node قوی‌تر می‌تواند سهم بیشتری از تماس‌ها بگیرد.

نمونه مفهومی Set

Set 1:
RTPengine-01 weight=10
RTPengine-02 weight=10
RTPengine-03 weight=20

Node سوم می‌تواند تقریباً سهم بیشتری بگیرد.

Offer و Answer یک تماس باید روی همان Node بمانند

Media Session State روی RTPengine نگه‌داری می‌شود.

پس نمی‌توانید:

Offer → RTP-01
Answer → RTP-02

را بدون State Design انجام دهید.

Module کنترل باید Selection همان Session را حفظ کند.

Health Check در چند RTPengine

اگر یک Media Node پاسخ Control Message ندهد، Kamailio/OpenSIPS می‌توانند آن را موقتاً Disable و Sessionهای جدید را به Nodeهای سالم بفرستند.

در OpenSIPS پارامترهایی برای:

🔹 Timeout

🔹 Retry

🔹 Disable Timeout

وجود دارد.

خرابی RTPengine وسط تماس چه می‌شود؟

این بخش با Failover تماس جدید فرق دارد.

اگر Media Node وسط تماس Crash کند، RTP همان تماس روی همان Node بوده است.

انتخاب RTPengine دیگر برای تماس جدید آسان است، اما انتقال تماس فعال نیاز به State Sharing و Failover Design پیشرفته‌تری دارد.

Redis Persistence در RTPengine

RTPengine می‌تواند Session State را داخل Redis ذخیره کند.

در Startup نیز امکان Restore کردن Sessionهای ذخیره‌شده وجود دارد.

گزینه‌هایی برای:

🔹 Redis Read

🔹 Redis Write

🔹 Keyspace Subscription

🔹 Active Switchover

وجود دارند.

آیا Redis یعنی Failover کاملاً بدون قطع؟

نه.

Persistence و State Takeover ابزارهای مهمی هستند، اما Media Failover همچنان به:

🔹 Network Topology

🔹 IP Advertisement

🔹 Session State

🔹 Encryption State

🔹 Routing

وابسته است.

نباید صرف فعال‌کردن Redis را معادل HA بدون وقفه دانست.

Alias Interface برای Failover

مستندات جدید RTPengine امکان تعریف Alias برای Interface را نیز ارائه می‌کنند.

این قابلیت در کنار Redis Replication مفید است؛ زیرا Standby Node می‌تواند همان Logical Interface را با IP محلی متفاوت نگاشت کند.

چطور یک RTPengine را Drain کنیم؟

نسخه‌های فعلی امکان محدودکردن Sessionهای جدید را دارند.

پارامتر:

max-sessions

برای Admission Control وجود دارد.

در Runtime نیز می‌توان سقف Session را تغییر داد.

برای Maintenance می‌توانید پذیرش Session جدید را متوقف کنید و منتظر بمانید تماس‌های فعال تخلیه شوند.

RTPengine Admission Control دارد

علاوه بر تعداد Session، می‌توان Limitهایی برای:

🔹 Load Average

🔹 CPU

🔹 Bandwidth

تعریف کرد.

وقتی Node به سقف برسد، Session جدید Reject می‌شود تا Server کاملاً Overload نشود.

این بهتر از Crash شدن Media Node است

در VoIP Real-Time بهتر است:

تماس جدید به Node دیگری Route شود

تا اینکه Node فعلی به 100 درصد CPU برسد و کیفیت تمام تماس‌های موجود خراب شود.

Port Scaling روی یک Node

یک Public IP تعداد محدودی UDP Port دارد.

RTPengine اجازه می‌دهد چند Interface/IP با نام پایه مشترک تعریف کنید و Port Allocation را Round Robin بین آن‌ها توزیع کنید.

مثلاً:

public:1
public:2
public:3

و هنگام استفاده از نام پایه `public` یکی از Interfaceهای دارای Port آزاد انتخاب شود.

یک RTPengine تا چند تماس را تحمل می‌کند؟

عدد عمومی قابل اعتمادی وجود ندارد.

ظرفیت به این موارد بستگی دارد:

🔹 Codec

🔹 Transcoding

🔹 SRTP

🔹 DTLS

🔹 WebRTC

🔹 Recording

🔹 Packetization

🔹 Kernel Forwarding

🔹 CPU

🔹 NIC

🔹 Network PPS

Bandwidth تنها معیار نیست

RTP شامل تعداد زیادی Packet کوچک است.

ممکن است NIC از نظر Mbps هنوز فضای زیادی داشته باشد اما از نظر:

Packets Per Second

یا CPU Interrupt به محدودیت نزدیک شده باشد.

برای Benchmark چه چیزهایی را ثبت کنیم؟

معیار دلیل
Concurrent Sessions تعداد Media Session فعال
Packets Per Second فشار واقعی RTP روی NIC و CPU
Bandwidth ظرفیت شبکه
CPU per Core شناسایی Bottleneck
Packet Loss کیفیت صدا
Jitter کیفیت Real-Time Media
Round Trip تأخیر شبکه
MOS برآورد کیفیت مکالمه
Transcoding Sessions بار CPU واقعی
SRTP/WebRTC Ratio هزینه Encryption

RTPengine خودش آمار Media هم دارد

نسخه‌های فعلی می‌توانند RTP Metrics را اندازه‌گیری کنند.

در Integration Kamailio حتی متغیرهایی برای دریافت:

🔹 MOS

🔹 Packet Loss

🔹 Jitter

🔹 Round Trip

وجود دارند.

measure-rtp چه کاربردی دارد؟

در حالت ساده Pass-through ممکن است همه Metricهای RTP جمع‌آوری نشوند.

گزینه:

measure-rtp = true

برای اندازه‌گیری Metric حتی در سناریوهای RTP Pass-through قابل استفاده است.

فعال‌کردن Measurement نیز باید از نظر Performance روی بار واقعی تست شود.

آیا باید RTPengine را روی همان Server Kamailio نصب کنیم؟

برای Lab و پروژه کوچک، ممکن است.

اما در Production پرترافیک معمولاً جداسازی مزیت دارد.

Kamailio Signaling-heavy است.

RTPengine Network/Media-heavy است.

با جداکردن آن‌ها می‌توانید هر بخش را مستقل Scale کنید.

معماری پیشنهادی برای شروع

Public SIP
    |
Kamailio/OpenSIPS
    |
    +------- PBX Pool
    |
    +------- RTPengine-01
             RTPengine-02

معماری بزرگ‌تر

              Clients / Carriers
                      |
                SIP Edge Cluster
               /              \
        Kamailio-01         Kamailio-02
               \              /
                  PBX Pool
            /        |        \
         PBX-01    PBX-02    PBX-03

                Media Layer
            /        |        \
      RTPengine-01 RTPengine-02 RTPengine-03

برای چند دیتاسنتر چه کنیم؟

بهتر است Media تا جای ممکن نزدیک Endpoint عبور کند.

مثلاً User اروپایی نباید فقط به‌خاطر یک Architecture نامناسب RTP را از آسیا عبور دهد.

در معماری Multi-Region می‌توانید RTPengine Set جدا برای هر Region داشته باشید.

مثال Set منطقه‌ای

Set 1 → Iran
Set 2 → Europe
Set 3 → Backup Region

SIP Routing می‌تواند بر اساس User، Carrier یا Region، Media Set مناسب را انتخاب کند.

Latency را در Media Architecture جدی بگیرید

اضافه‌کردن RTPengine یک Hop جدید ایجاد می‌کند.

اگر Media Node در مسیر نامناسب باشد، کیفیت تماس می‌تواند بدتر شود.

هدف Media Proxy این نیست که RTP را هرجا خواستیم عبور دهیم؛ باید مسیر کوتاه و پایدار طراحی شود.

چه زمانی RTPengine واقعاً لازم است؟

🔹 چند PBX پشت Kamailio/OpenSIPS دارید.

🔹 کاربران زیادی پشت NAT یا CGNAT هستند.

🔹 WebRTC دارید.

🔹 WebRTC باید به SIP/PSTN متصل شود.

🔹 DTLS-SRTP و RTP معمولی باید Interwork شوند.

🔹 Media IP Backendها نباید Public شود.

🔹 IPv4 و IPv6 باید Bridge شوند.

🔹 Media Layer باید مستقل Scale شود.

چه زمانی RTPengine ممکن است اضافه‌کاری باشد؟

اگر:

🔹 فقط یک Asterisk دارید.

🔹 NAT روی خود Asterisk درست کار می‌کند.

🔹 WebRTC ندارید.

🔹 Media مستقیم و پایدار است.

🔹 نیاز به Topology Hiding رسانه ندارید.

اضافه‌کردن RTPengine ممکن است فقط یک Component دیگر برای نگهداری ایجاد کند.

اشتباه رایج: هر مشکل صدای یک‌طرفه را با RTPengine حل کنیم

صدای یک‌طرفه می‌تواند ناشی از:

🔹 SDP اشتباه

🔹 Firewall

🔹 NAT

🔹 Routing

🔹 RTP Port Range

🔹 SIP ALG

باشد.

قبل از اضافه‌کردن Media Proxy مشخص کنید مشکل واقعی چیست.

Packet Capture قبل از تغییر معماری

در SIP Proxy:

tcpdump -ni any udp port 5060

و برای Media Range نمونه:

tcpdump -ni any udp portrange 30000-39999

می‌تواند مشخص کند Packet اصلاً وارد Server می‌شود یا خیر.

اگر RTP وارد می‌شود ولی خارج نمی‌شود

مواردی مثل:

🔹 Routing Table

🔹 Firewall

🔹 Interface Direction

🔹 SDP Rewrite

🔹 Session State

را بررسی کنید.

اگر هیچ RTPای وارد نمی‌شود

بیشتر روی:

🔹 SDP

🔹 ICE Candidate

🔹 Public IP

🔹 Port Range

🔹 NAT/Firewall سمت Client

تمرکز کنید.

RTPengine و QoS

RTPengine امکان تنظیم TOS/QoS Field را دارد.

اما اگر Router یا Provider بعدی DSCP را پاک کند، تنظیم روی Server به‌تنهایی کیفیت را تضمین نمی‌کند.

QoS باید End-to-End تا حد ممکن هماهنگ باشد.

RTPengine یا RTPProxy؟

RTPProxy پروژه قدیمی‌تری با هدف مشابه Media Relay است.

RTPengine در طول زمان قابلیت‌های بسیار گسترده‌تری برای:

🔹 WebRTC

🔹 ICE

🔹 SRTP

🔹 Transcoding

🔹 Kernel Forwarding

🔹 Recording

اضافه کرده است.

در معماری‌های جدید معمولاً RTPengine گزینه کامل‌تری برای بررسی است.

RTPengine یا Media روی خود PBX؟

ویژگی Media روی PBX RTPengine
سادگی بیشتر پیچیده‌تر
NAT پایه معمولاً کافی بسیار انعطاف‌پذیر
چند PBX پیچیده‌تر مناسب‌تر
WebRTC Interworking بسته به PBX قوی
Media Scale مستقل خیر بله
Topology Hiding رسانه محدودتر بله
IPv4/IPv6 Bridge بسته به PBX بله

یک Test Plan قبل از Production

مرحله ۱: تماس RTP ساده PCMA به PCMA بگیرید.

مرحله ۲: NAT Client را تست کنید.

مرحله ۳: Public-to-Private Interface را تست کنید.

مرحله ۴: صدای دوطرفه را بررسی کنید.

مرحله ۵: WebRTC را با ICE و DTLS-SRTP تست کنید.

مرحله ۶: Opus به PCMA Transcoding را در صورت نیاز تست کنید.

مرحله ۷: RTPengine Node را زیر Load قرار دهید.

مرحله ۸: CPU، PPS، Jitter و Packet Loss را ثبت کنید.

مرحله ۹: یک Media Node را از دسترس خارج کنید.

مرحله ۱۰: بررسی کنید تماس‌های جدید به Node سالم بروند.

مرحله ۱۱: Drain و Maintenance را تست کنید.

مرحله ۱۲: Monitoring و Alert را قبل از ورود کاربران اصلی فعال کنید.

چه چیزهایی را مانیتور کنیم؟

🔹 Active Sessions

🔹 CPU

🔹 Network PPS

🔹 Bandwidth

🔹 Port Usage

🔹 Packet Loss

🔹 Jitter

🔹 MOS

🔹 Redis Connectivity در معماری HA

🔹 Controller-to-RTPengine Latency

محدودیت Session را قبل از Overload تنظیم کنید

یکی از روش‌های امن این است که RTPengine قبل از رسیدن Server به نقطه بحرانی، Session جدید را نپذیرد.

برای مثال اگر Benchmark نشان داد Node در ۴۰۰۰ Session به Limit نزدیک می‌شود، سقف Production را دقیقاً ۴۰۰۰ قرار ندهید.

Headroom لازم دارید.

چرا Headroom مهم است؟

Load Media همیشه ثابت نیست.

ممکن است ناگهان:

🔹 تماس WebRTC بیشتر شود.

🔹 Transcoding زیاد شود.

🔹 Packet Rate بالا برود.

🔹 Kernel Offload موقتاً از مدار خارج شود.

و CPU Profile تغییر کند.

آیا RTPengine روی VPS مناسب است؟

برای ظرفیت کوچک و متوسط، بله؛ به شرط اینکه Network و CPU پایدار باشند.

اما Media Server نسبت به یک Web Server به مواردی مثل:

🔹 CPU Steal

🔹 Packet Loss

🔹 Jitter

🔹 NIC Performance

حساس‌تر است.

برای پروژه پرترافیک بهتر است Benchmark دقیق روی همان نوع زیرساخت انجام شود.

سرور داخل ایران یا خارج؟

محل Media Node باید بر اساس محل واقعی کاربران و Carrier انتخاب شود.

اگر اغلب کاربران و SIP Provider داخل ایران هستند، Media Node داخل ایران می‌تواند Latency را کاهش دهد.

اگر عمده کاربران اروپا هستند، قراردادن Media Node بسیار دور از آن‌ها می‌تواند مسیر RTP را طولانی کند.

معماری Multi-Region برای پروژه بزرگ منطقی‌تر است.

اشتباه‌های رایج RTPengine

اشتباه ۱: تصور می‌کنیم SIP Proxy خودش RTP را عبور می‌دهد.

اشتباه ۲: Control Port RTPengine را روی اینترنت باز می‌کنیم.

اشتباه ۳: Public IP اشتباه در SDP Advertise می‌شود.

اشتباه ۴: Media Port Range در Firewall باز نیست.

اشتباه ۵: WebRTC را مثل SIP/RTP معمولی در نظر می‌گیریم.

اشتباه ۶: Transcoding را در Capacity Planning حساب نمی‌کنیم.

اشتباه ۷: یک RTPengine جلوی چند PBX می‌گذاریم و Media Layer را SPOF می‌کنیم.

اشتباه ۸: Redis را معادل Failover جادویی تماس فعال تصور می‌کنیم.

اشتباه ۹: راهنمای قدیمی iptables را روی معماری جدید nftables بدون بررسی اجرا می‌کنیم.

اشتباه ۱۰: بدون Capture و SDP Analysis به‌سرعت RTPengine اضافه می‌کنیم.

پرسش‌های رایج

RTPengine چیست؟

RTPengine یک Media Proxy برای RTP و سایر Mediaهای VoIP است که می‌تواند NAT، SDP Rewrite، ICE، SRTP، WebRTC، Transcoding، Recording و Media Relay را مدیریت کند.

آیا RTPengine جای Kamailio یا OpenSIPS را می‌گیرد؟

خیر. Kamailio و OpenSIPS عمدتاً SIP Signaling را مدیریت می‌کنند و RTPengine Media را. معمولاً این سیستم‌ها در کنار هم استفاده می‌شوند.

آیا RTPengine برای Asterisk لازم است؟

برای یک Asterisk ساده لزوماً نه. وقتی چند PBX، SIP Proxy، WebRTC، NAT پیچیده یا Media Scaling مستقل دارید RTPengine ارزش بیشتری پیدا می‌کند.

RTPengine چگونه مشکل NAT را حل می‌کند؟

با قرارگرفتن در Media Path و بازنویسی SDP، Endpointها RTP را به آدرس قابل‌دسترسی RTPengine می‌فرستند و RTPengine Media را به سمت مقصد واقعی Relay می‌کند.

آیا RTPengine از WebRTC پشتیبانی می‌کند؟

بله. ICE، Trickle ICE، DTLS-SRTP، RTP/SAVPF، RTCP-MUX و قابلیت‌های موردنیاز برای Bridge کردن WebRTC با SIP/RTP سنتی را پشتیبانی می‌کند.

تفاوت RTPengine و TURN چیست؟

TURN یک Relay عمومی استاندارد برای WebRTC است که Client مستقیماً با آن صحبت می‌کند. RTPengine معمولاً توسط SIP Proxy و از طریق SDP کنترل می‌شود و برای معماری‌های SIP/VoIP طراحی شده است.

آیا RTPengine می‌تواند RTP را به SRTP تبدیل کند؟

بله. RTPengine می‌تواند بین RTP و SRTP و همچنین روش‌های SDES و DTLS-SRTP Interworking انجام دهد.

آیا RTPengine Transcoding انجام می‌دهد؟

بله. نسخه‌های فعلی Transcoding و Repacketization را پشتیبانی می‌کنند، اما این عملیات نسبت به Relay ساده CPU بیشتری مصرف می‌کنند.

nft_rtpengine چیست؟

ماژول Kernel فعلی RTPengine برای nftables است که بخش زیادی از Packet Forwarding را داخل Kernel انجام می‌دهد تا CPU و Context Switch کاهش پیدا کند.

برای HA چند RTPengine چه کنیم؟

چند Media Node را داخل Setهای SIP Proxy قرار دهید، Health Check و Weight تعریف کنید و برای تماس‌های جدید Failover داشته باشید. برای State Recovery پیشرفته نیز Redis قابل استفاده است، اما HA تماس فعال نیاز به طراحی کامل شبکه و State دارد.

چطور ظرفیت RTPengine را اندازه بگیریم؟

Concurrent Session، Network PPS، CPU per Core، Bandwidth، Packet Loss، Jitter، MOS، درصد SRTP/WebRTC و تعداد Transcoding Session را روی Workload واقعی اندازه بگیرید.

جمع‌بندی

RTPengine یکی از اجزایی است که با پیچیده‌ترشدن معماری VoIP اهمیت بیشتری پیدا می‌کند، چون Signaling و Media را از هم جدا می‌کند.

Kamailio یا OpenSIPS می‌توانند تصمیم بگیرند تماس به کدام PBX برود، اما RTPengine تعیین می‌کند Media از چه IP و Portی عبور کند و در صورت نیاز NAT، ICE، SRTP، WebRTC، IPv4/IPv6 و Transcoding را مدیریت می‌کند.

برای WebRTC اهمیت این موضوع بیشتر می‌شود؛ Browser معمولاً با DTLS-SRTP، ICE، RTCP-MUX و Opus وارد تماس می‌شود، در حالی که PBX یا Carrier قدیمی ممکن است فقط RTP/AVP و G.711 را پشتیبانی کند. RTPengine می‌تواند بین این دو طرف قرار بگیرد.

برای بار بالا نیز معماری جدید RTPengine امکان In-kernel Forwarding با `nft_rtpengine`، چند Interface، چند Media Node، Set و Weight، Admission Control و Redis Persistence را فراهم می‌کند.

اما RTPengine را نباید به هر معماری اضافه کرد. اگر یک PBX ساده دارید و NAT و Media روی همان سیستم درست کار می‌کنند، Media Proxy جدا ممکن است فقط Complexity ایجاد کند.

در پروژه‌های بزرگ‌تر، معماری مناسب معمولاً به این شکل است:

SIP Edge Cluster → PBX/Application Pool + RTPengine Media Pool

و Signaling، Application و Media هرکدام مستقل Scale و مانیتور می‌شوند.

منابع و مستندات
نسخه‌های فعلی RTPengine، Media Proxy، NAT، ICE، WebRTC، SRTP، Kernel Forwarding، Redis و Scale-out با منابع رسمی پروژه و مستندات Kamailio/OpenSIPS تا ۱۷ اکتبر ۲۰۲۶ بررسی شده‌اند.
نسخه روز
مرجع Releaseهای فعال فعلی شامل mr26.2.1.5 و به‌روزرسانی شاخه LTS mr13.5.1.30 در اکتبر ۲۰۲۶
قابلیت‌ها
مرجع رسمی ICE، Trickle ICE، SRTP، DTLS-SRTP، IPv4/IPv6، Recording، Transcoding، RTCP-MUX و WebRTC Media Interworking
Daemon
مرجع Interface، Advertised IP، Port Range، چند Interface، Redis Persistence، max-sessions، max-cpu، max-load و max-bandwidth
Kernel Forwarding
مرجع nft_rtpengine، nftables، کاهش Context Switch و Forward کردن Media در Kernel برای ظرفیت و CPU بهتر
WebRTC / ICE / SRTP
مرجع WebRTC Policy، ICE، Trickle ICE، RTCP-MUX، SDES، SRTP، DTLS و کنترل Codecها و SDP
Kamailio
مرجع کنترل RTPengine از Kamailio، Setها، Media Statistics، MOS، Packet Loss، Jitter و Round Trip
OpenSIPS
مرجع چند RTPengine، Set، Weight-based Load Balancing، Failover، ICE، RTP/SRTP و کنترل Media از OpenSIPS
پیشنهاد ایرانیکاسرور برای زیرساخت RTPengine

WebRTC، چند PBX یا کاربران پشت NAT دارید؟ Media Server را جداگانه طراحی و تست کنید

در معماری‌های جدید VoIP، فقط داشتن CPU بالا کافی نیست. RTPengine به شبکه پایدار، Packet Loss پایین، Latency مناسب، Public IP ثابت و Media Port Range قابل‌کنترل نیاز دارد؛ مخصوصاً اگر قرار است WebRTC، SRTP یا Transcoding روی آن انجام شود.

می‌توانید یک سرور مجازی مستقل ایرانیکاسرور برای RTPengine راه‌اندازی کنید و قبل از انتقال تماس‌های اصلی، مسیر Public/Private Media، NAT، WebRTC، DTLS-SRTP، Kernel Forwarding و Failover چند Media Node را روی همان زیرساخت تست کنید.

مشاوره Kamailio، OpenSIPS، RTPengine و WebRTC: 021-91302467

اشتراک‌گذاری مقاله
گفت‌وگو درباره آموزش

دیدگاه‌ها (۰)

هنوز دیدگاهی ثبت نشده است.

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *