دموی تماس تصویری بین دو لپتاپ روی یک Wi‑Fi در پنج دقیقه کار میکند؛ Production جایی است که یک کاربر پشت CGNAT موبایل، دیگری در شبکه سازمانی با UDP بسته، نفر سوم روی Safari و Recording در Region دیگری است. اگر TURN، State machine، کیفیت و هزینه از ابتدا قرارداد نشده باشند، «Connected» هم میتواند تماس بیصدا، Relay گران یا جلسهای غیرقابل بازیابی باشد.
WebRTC فقط RTCPeerConnection نیست؛ یک سیستم رسانه بلادرنگ شامل Identity، Room، Signaling، ICE/STUN/TURN، Media topology، Codec، Permission، رمزنگاری، Observability و Operations است. این راهنما توضیح میدهد WebRTC چیست و چگونه برای تماس تصویری، کلاس آنلاین، پشتیبانی و Data Channel در شرایط واقعی کاربران ایرانی طراحی، تست و اداره میشود.
خلاصه اجرایی WebRTC در Production
| تصمیم | پاسخ کوتاه | شاهد لازم |
|---|---|---|
| آیا همیشه P2P است؟ | خیر؛ مسیر میتواند Direct، TURN یا SFU باشد | Selected candidate pair و topology |
| STUN کافی است؟ | خیر؛ برای بخشی از شبکهها Relay لازم میشود | Relay-only test و failure rate |
| تماس گروهی چگونه؟ | معمولاً SFU؛ گاهی Mesh یا MCU | Participant/device/layout/recording model |
| آیا رمزنگاری سرتاسری است؟ | هر PeerConnection رمزنگاری دارد؛ E2EE گروهی قرارداد جداست | Trust boundary و key management |
| کیفیت خوب چیست؟ | Join سریع، Media پیوسته، Task موفق | getStats + QoE event + user outcome |
| هزینه اصلی کجاست؟ | TURN/SFU Egress، media compute، recording و operations | دقیقه/شرکتکننده، bitrate و relay share |
| Build یا Buy؟ | براساس time-to-value، data، TCO و exit | Pilot چندشبکهای و export/rebuild drill |
WebRTC چیست و چه چیزی را تحویل نمیدهد؟
Web Real‑Time Communication مجموعه APIها و پروتکلهای استاندارد برای صدا، ویدئو و داده کمتأخیر در Browser و App است. استاندارد WebRTC در W3C APIهایی مانند RTCPeerConnection، Sender/Receiver/Transceiver، SDP negotiation و Statistics model را تعریف میکند.
WebRTC یک سرویس کامل تماس نیست. این موارد همچنان مالک و Backend میخواهند:
- Account، Identity، Session و مجوز Room؛
- Signaling transport و ترتیب پیام؛
- صدور Credential برای TURN/SFU؛
- Presence، نقش Host/Guest/Moderator و Waiting room؛
- Recording، Transcription، Retention و Consent؛
- Abuse prevention، Observability، Billing و Support؛
- Deployment، Compatibility، Failover و Rollback.
مرز مقاله: معماری Media session، نه Backend یا Monitoring عمومی
این مقاله مالک مسیر Join→Negotiate→Connect→Adapt→Recover→Leave است. برای قرارداد عمومی Signaling/API به راهنمای API قابلاعتماد، برای Authentication/Authorization و Abuse به راهنمای امنیت API و برای Telemetry architecture به راهنمای Observability سایت مراجعه کنید.
قرارداد جلسه WebRTC را قبل از انتخاب SDK بنویسید
| فیلد | نمونه تصمیم | چرا |
|---|---|---|
| Use case | پشتیبانی یکبهیک، کلاس ۱۲نفره، Webinar | Topology و QoE فرق دارد |
| Participant | Host، speaker، viewer، moderator | Publish/subscribe/record permission |
| Media | audio، camera، screen، data | Codec/bitrate/device budget |
| Quality | join p95، freeze، audio gap، recovery | SLO قابل اندازهگیری |
| Privacy | E2EE، recording، retention، region | Trust boundary و vendor eligibility |
| Scale | همزمانی، room size، active speaker | SFU/TURN capacity و Egress |
| Continuity | reconnect، region fail، fallback audio | Runbook و product state |
| Exit | recording/export/protocol/client portability | وابستگی فروشنده و مهاجرت |
«تماس تصویری باکیفیت» Requirement نیست. مثلاً برای مشاوره فروش، Audio continuity و زمان اتصال شاید از 1080p مهمتر باشد؛ برای Screen share متن، وضوح و Freeze از Frame rate مهمتر است.
نقشه اجزای WebRTC
| جزء | مسئولیت | Failure نمونه |
|---|---|---|
| App/API | Identity، Room، Role، Token | Join غیرمجاز یا Session منقضی |
| Signaling | Offer/Answer/Candidate/control | ترتیب، duplicate، reconnect، glare |
| ICE/STUN/TURN | یافتن مسیر قابل استفاده | UDP block، credential، relay saturation |
| Peer/SFU/MCU | انتقال/forward/mix رسانه | packet loss، overload، region fail |
| Capture/Render | device، permission، encode/decode | busy device، thermal، autoplay |
| Recording/AI | ذخیره، transcription، moderation | consent، key access، incomplete file |
| Telemetry | quality، event، trace، cost | high-cardinality، missing client data |
سه API اصلی و قرارداد هرکدام
MediaDevices و getUserMedia
navigator.mediaDevices.getUserMedia() با Permission کاربر Track صوتی/تصویری میگیرد. Constraint یک درخواست ترجیح/الزام است؛ موفقیت آن تضمین کیفیت نیست. Media Capture and Streams در W3C الگوریتم Permission، Device و Track را تعریف میکند.
RTCPeerConnection
Offer/Answer، Transceiver، Codec negotiation، ICE، DTLS-SRTP، Track event، Data channel و Stats را مدیریت میکند. نام PeerConnection به معنی مسیر فیزیکی مستقیم نیست.
RTCDataChannel
داده را با SCTP روی DTLS منتقل میکند. Ordered/Unordered و سیاست Retransmission قابل تنظیماند. RFC ۸۸۳۱ برای WebRTC Data Channels مدل Transport را توضیح میدهد؛ App هنوز باید Message schema، size، backpressure، retry، idempotency و authorization را تعریف کند.
چرخه برقراری تماس از Join تا First media
- Client Session معتبر میگیرد و Room/Role مجاز میشود.
- App با توضیح Context از کاربر Permission میخواهد.
- PeerConnection با ICE server policy ساخته و Track/Transceiver اضافه میشود.
- Offer/Answer و ICE generation در Signaling مبادله میشوند.
- Trickle candidateها همزمان جمع و ارسال میشوند.
- ICE candidate pairها را Check و یک Pair را nominate/select میکند.
- DTLS handshake و SRTP keying انجام میشود.
- Media/Data جریان مییابد و First audio/video/render ثبت میشود.
- Congestion control و SFU subscription کیفیت را تطبیق میدهند.
- Disconnect/network change با ICE restart یا reconnect مدیریت میشود.
برای UX، «دکمه Join فشرده شد» با «صدا دوطرفه شد» فرق دارد. milestoneهای permission requested/granted، signaling ready، ICE connected، first packet، first decoded frame و first audible audio را جدا ثبت کنید.
Signaling: پروتکل تعریفنشده، مسئولیت حذفنشده
WebRTC Transport سیگنالینگ را تحمیل نمیکند؛ WebSocket، HTTP، SSE یا کانال دیگری ممکن است. هر پیام باید Envelope نسخهدار داشته باشد:
{
"schema": "rtc.signal.v3",
"room_id": "opaque-room-id",
"participant_id": "opaque-user-id",
"connection_id": "pc-unique-id",
"ice_generation": 4,
"seq": 18,
"type": "candidate",
"sent_at": "2026-08-10T12:00:00Z",
"payload": {}
}Room ID را Secret فرض نکنید. Backend باید Join/Publish/Subscribe/Record/Moderate را جدا authorize، Token کوتاهعمر صادر، Size/Rate را محدود و پیام نامعتبر را بدون Crash رد کند.
Ordering، Duplicate و Reconnect
یک WebSocket تا زمان اتصال Order دارد؛ reconnect، چند Tab، retry و failover میتوانند پیام دیررس یا duplicate بسازند. connection_id، ice_generation و seq جلوی Candidate مربوط به Session قدیمی را میگیرند. Eventهای کسبوکار مانند Start recording باید idempotency key داشته باشند.
Perfect Negotiation و Glare
وقتی دو طرف همزمان Offer میسازند Glare رخ میدهد. Pattern مشهور Perfect Negotiation به Peerها نقش Polite/Impolite میدهد تا یکی collision را rollback و دیگری Offer خود را حفظ کند. State machine باید makingOffer، signalingState، ignored offer و Candidate مربوط به Offer ردشده را مدیریت کند؛ Timeout یا «اگر خطا شد دوباره Offer بساز» راهحل پایدار نیست.
ICE، STUN و TURN دقیقاً چه میکنند؟
RFC ۸۴۴۵ برای ICE Candidateها را جمع، Pair میکند، Connectivity check میزند و مسیر قابل استفاده را nominate میکند. STUN در RFC 8489 آدرس Reflexive دیدهشده از بیرون را آشکار میکند؛ TURN در RFC 8656 Relay allocation میدهد.
| Candidate | منبع | معنا |
|---|---|---|
| Host | Interface محلی/mDNS | مسیر شبکه محلی یا مستقیم قابل دسترس |
| Server-reflexive | STUN mapping | آدرس/Port دیدهشده پشت NAT |
| Peer-reflexive | Connectivity check | Mapping کشفشده در مسیر |
| Relay | TURN allocation | Packet از Relay عمومی عبور میکند |
STUN رله و «سرور تماس» نیست
STUN معمولاً برای ساخت Server-reflexive candidate است؛ Media بعد از انتخاب Pair از STUN server عبور نمیکند. «STUN وصل است» اثبات نمیکند تماس در شبکه محدود وصل میشود.
TURN بیمه اتصال و یک مسیر Media واقعی است
وقتی مسیر مستقیم ممکن یا مجاز نیست، Relay candidate میتواند برنده شود. در این حالت کل Packet مربوط از TURN عبور میکند؛ ظرفیت، Latency، Egress و Abuse سطح Production دارند. حذف TURN یعنی پذیرفتن Failure برای Population نامعلوم، نه صرفهجویی تضمینی.
Trickle ICE زمان اتصال را کوتاه میکند، اما Generation میخواهد
RFC ۸۸۳۸ برای Trickle ICE Candidateها را بهصورت افزایشی همزمان با Gathering و Check مبادله میکند. Signaling باید Candidate و end-of-candidates را به ICE session درست نسبت دهد؛ Candidate دیررس Generation قبلی نباید وارد Restart جدید شود.
TURN Production contract
| حوزه | قرارداد | تست |
|---|---|---|
| Transport | UDP primary + TCP/TLS fallback بر پایه نیاز | relay-only هر Transport/ISP |
| Credential | کوتاهعمر، scoped، بدون Secret ثابت در JS | expiry/replay/leak |
| Network | IPv4/IPv6، port range، DNS، cert | external probe |
| Capacity | allocation، bps، concurrent session، headroom | load/soak/saturation |
| Abuse | realm/user/rate/quota/egress anomaly | credential theft simulation |
| Region | placement، steering، health، drain | region loss/failover |
| Observability | allocation/error/transport/bytes/latency | alert/runbook |
TURN را فقط با تماس Direct تست نکنید
یک تست خودکار با iceTransportPolicy: "relay" باید روزانه از شبکههای نماینده اجرا شود. UDP، TCP و TLS، Credential جدید/منقضی، IPv4/IPv6 و Region fail را جدا بسنجید. Relay-only یک Diagnostic است؛ Policy عمومی را بدون نیاز روی Relay قفل نکنید.
فرمول ظرفیت و هزینه Relay
مدل ساده برای یک تماس یکبهیک Relayشده:
TURN transferred bytes ≈
sum(media bitrate in both directions)
× call seconds
÷ 8
× protocol/overhead factorدر عمل Audio/Video/RTX/FEC/Simulcast، تغییر Bitrate و قیمت Egress هر Region را از Metric واقعی بگیرید. KPIهای مفید:
- Relay share بر ISP/Browser/Region/Release؛
- Transferred GB بهازای participant-minute؛
- Allocation success و setup latency؛
- TURN transport mix: UDP/TCP/TLS؛
- Peak concurrent allocations و headroom؛
- Cost per successful room-minute.
کاهش Relay share هدف مطلق نیست؛ اگر Direct path ناپایدار باشد، هزینه کمتر و Failure بیشتر یک بهینهسازی ناموفق است.
Mesh، SFU و MCU؛ Topology براساس Workload
RFC ۷۶۶۷ درباره RTP Topologies واژگان Point-to-point، Translator و Mixer را روشن میکند. اصطلاحهای محصولی Mesh/SFU/MCU را با رفتار واقعی Media server تطبیق دهید.
| Topology | رفتار | مزیت | محدودیت |
|---|---|---|---|
| Mesh | هر Client به Clientهای دیگر Stream میدهد | سرور Media کمتر، شروع ساده | Upload/encode/decode با N رشد میکند |
| SFU | Stream/Layerها را انتخاب و Forward میکند | گروه، simulcast/SVC، latency مناسب | Egress، subscription، availability |
| MCU/Mixer | Decode/compose/re-encode | Client ضعیف، layout/interop خاص | CPU، latency، کیفیت و هزینه |
| Broadcast pipeline | WebRTC ingest سپس HLS/DASH/CDN | Viewer بسیار زیاد | Latency بیشتر و معماری دوگانه |
Full Mesh را با فرمول Client budget بسنجید
در Mesh، N−۱ مسیر outbound/inbound ممکن است؛ اما Simulcast، Track count و mute رفتار را عوض میکند. Upload ضعیف موبایل و Encode همزمان معمولاً زودتر از CPU سرور محدود میشوند. Room-size cutoff را از تست دستگاه/شبکه خودتان بگیرید.
SFU یک Forwarder ساده بدون State نیست
SFU باید Publisher/Subscriber، Layer، keyframe request، bandwidth estimate، active speaker، pause/resume و region routing را مدیریت کند. Failure آن چندین Participant را همزمان متاثر میکند. Capacity per node، drain، rolling upgrade و room placement باید Runbook داشته باشند.
MCU را برای «کیفیت بهتر» انتخاب نکنید
Mixing میتواند بار Client یا تعداد Stream را کم کند، اما Re-encode latency و افت کیفیت دارد. Recording ترکیبی، Endpoint قدیمی یا Client بسیار ضعیف دلیل قابلآزموناند؛ نام معماری دلیل نیست.
SFU چندمنطقهای: Room را وسط تماس جابهجا نکنید مگر طراحی شده باشد
Geo steering باید قبل از Join و براساس Participant distribution، latency، capacity، data policy و failure domain تصمیم بگیرد. جابهجایی Room فعال میان SFUها پیچیده است؛ Track identity، sequence، keyframe، subscription و recording continuity باید حفظ شود.
- Room affinity و placement version ثبت کنید.
- Region drain پیش از Deploy/maintenance داشته باشید.
- Failure را به reconnect همان Region محدود نکنید؛ alternate plan تعریف کنید.
- برای تماس حساس، fallback صوتی یا rejoin سریع بسازید.
- Cross-region Egress و latency را در TCO ببینید.
امنیت WebRTC لایهبهلایه
RFC ۸۸۲۷ معماری امنیت WebRTC رمزنگاری Media با SRTP/SRTCP و Data channel با DTLS را الزام میکند. این پایه مهم است، اما امنیت محصول موارد بیشتری دارد:
| لایه | کنترل | ریسک باقیمانده |
|---|---|---|
| Origin | HTTPS، CSP، dependency integrity | XSS با دسترسی به Session/permission |
| Identity | auth، session، MFA متناسب | account takeover |
| Room | join/publish/subscribe/record authorization | IDOR/role escalation |
| Signaling | WSS، schema، rate، replay/idempotency | DoS/state desync |
| TURN/SFU | short credential، quota، network policy | relay abuse/insider/server compromise |
| Media | DTLS-SRTP یا SFrame E2EE | metadata/key endpoint risk |
| Recording | consent، encryption، access، retention | export/share/transcription vendor |
برای Resource/Policy/Enforcement و Service identity، راهنمای Zero Trust را به معماری Media اضافه کنید.
DTLS-SRTP با E2EE گروهی یکی نیست
اگر PeerConnection کاربر در SFU خاتمه یابد، Transport encryption نیز در SFU terminate میشود. برای اینکه SFU Payload Media را نبیند، رمزنگاری Frame-level و Key management بین Endpointهای مجاز لازم است.
RFC ۹۶۰۵ برای SFrame مکانیزم رمزنگاری و Authentication فریم در تماس چندنفره با SFU را تعریف میکند. WebRTC Encoded Transform در ۲۱ مه ۲۰۲۶ هنوز Working Draft مسیر Recommendation است؛ Browser support و API stability را در Snapshot پروژه بررسی کنید.
E2EE contract فقط Algorithm نیست
- چه کسی Participant identity را تأیید میکند؟
- کلید چگونه ساخته، توزیع، rotate و revoke میشود؟
- Join/leave چگونه Epoch جدید میسازد؟
- Multi-device و recovery چه میشوند؟
- Recording/transcription/moderation با E2EE سازگار است یا Endpoint مجاز میخواهد؟
- Metadata، اندازه، timing و participant graph چه مقدار قابل مشاهدهاند؟
Badge «رمزنگاریشده» باید دقیقاً بگوید Transport encryption است یا Participant-verified E2EE.
Permission و Device privacy
getUserMedia در Secure Context است و Browser Permission میگیرد. تجربه امن:
- Prompt را پس از اقدام معنادار و با توضیح علت نشان دهید.
- Audio-only و Join بدون دوربین را در صورت امکان فراهم کنید.
- Deny، dismiss، device busy، no device و constraint failure را جدا پیام دهید.
- Mute UI را با Track/Server state همسو نگه دارید.
- هنگام Leave Trackها را stop و indicator را آزاد کنید.
- iframe را با Permissions Policy و
allowمحدود کنید. - Device label/ID، IP-derived data و Stats را حداقل و زماندار نگه دارید.
بودجه Storage/Consent/Vendor/Incident را برای Recording و Telemetry در راهنمای بودجه حریم خصوصی داده بسنجید. الزامات حقوقی بازار هدف را با مشاور مربوط تأیید کنید.
Codec policy: Capability، Content و Device
| Media | Candidate | تصمیم |
|---|---|---|
| Speech/audio | Opus | bitrate/FEC/DTX و موسیقی یا گفتار |
| Camera video | VP8/H.۲۶۴/VP9/AV1 حسب support | hardware encode/decode، battery، interop |
| Screen share | Codec + contentHint متناسب | text sharpness در برابر motion/fps |
| Mobile low-end | hardware-friendly profile | thermal، encode time، battery |
| Recording | ingest/transcode strategy | container، seek، cost، playback support |
Codec را صرفاً با compression efficiency انتخاب نکنید. Browser/OS/hardware، SFU capability، E2EE transform، Recording و patent/licensing review ممکن است نتیجه را تغییر دهند. Capability detection و fallback لازماند.
Simulcast، SVC و Subscription adaptation
Simulcast چند Encoding مستقل میفرستد؛ SVC در یک Bitstream Layerهای زمانی/فضایی/کیفی دارد. SFU میتواند براساس Tile، visibility، active speaker، bandwidth و device Layer مناسب را Forward کند.
| کنترل | سود | هزینه |
|---|---|---|
| Simulcast layers | انتخاب سریع کیفیت per subscriber | upload/encode sender بیشتر |
| SVC | Layering کارآمد در Codecهای پشتیبان | interop/implementation complexity |
| Pause offscreen | decode/network کمتر | resume/keyframe latency |
| Active speaker high layer | کیفیت جایی که دیده میشود | speaker detection و churn |
| Screen priority | متن خواناتر | camera quality tradeoff |
هر adaptation باید hysteresis داشته باشد تا با نوسان شبکه میان Layerها پرش نکند.
RTCDataChannel: کمتأخیر به معنی بدون محدودیت نیست
برای Cursor، game state، whiteboard، chat control یا فایل میتواند مفید باشد. قرارداد پیشنهادی:
- Channel purpose و schema/version؛
- Ordered/unordered و maxRetransmits/maxPacketLifeTime؛
- حد اندازه پیام و chunking؛
bufferedAmountوbufferedAmountLowThresholdبرای backpressure؛- authorization مستقل از اتصال؛
- dedupe/idempotency برای command؛
- fallback server path برای state حیاتی؛
- resume/reconciliation پس از reconnect.
State کسبوکار مهم را فقط در Peerها نگه ندارید؛ قطع هر دو Peer نباید Truth سفارش یا سند را نابود کند.
WebRTC، WebSocket و WebTransport
| فناوری | مدل | کار اصلی |
|---|---|---|
| WebRTC Media | real-time media + congestion control | audio/video/screen |
| RTCDataChannel | PeerConnection/SCTP/DTLS | peer data با reliability قابل تنظیم |
| WebSocket | Client-server روی TCP | signaling، presence، command |
| WebTransport | Client-server stream/datagram روی HTTP/۳ | server data کمتأخیر |
| HTTP | request/response | auth، room API، upload، export |
اینها جایگزین مطلق نیستند. برای مبانی QUIC/HTTP/۳ و محدودیت شبکه، راهنمای HTTP/۳ و QUIC مرز Transport را روشن میکند.
Recording، Transcription و Live streaming
| روش | مزیت | Failure/Tradeoff |
|---|---|---|
| Client recording | server سادهتر، E2EE endpoint ممکن | tab close، sleep، storage، upload ناقص |
| SFU egress/record | کنترل و فایل پایدارتر | media access، compute، data governance |
| Composite/MCU | فایل آماده با layout | re-encode، کیفیت، CPU |
| Individual tracks | edit/transcription انعطافپذیر | فایل/همگامسازی بیشتر |
| WebRTC→HLS/DASH | viewer scale با CDN | latency و pipeline دوم |
Start/stop recording یک Event امنیتی و حقوقی است: consent indicator، owner، retention، encryption at rest، signed URL، audit، delete/export و incomplete-file recovery لازماند. E2EE ممکن است Server transcription را عمداً غیرممکن کند.
Observability: State «connected» SLI کیفیت نیست
getStats() Counter و Gaugeهای مرتبط با Transport/Codec/RTP میدهد. WebRTC Statistics API در W3C شناسهها و Semantics را تعریف میکند. Counterها را با Delta و بازه زمانی تحلیل کنید؛ مقدار تجمعی خام با Rate برابر نیست.
| لایه | Metric | تفسیر |
|---|---|---|
| Join | permission/signaling/ICE/first media time | مرحله کند یا fail |
| Network | RTT، jitter، loss، candidate type | مسیر و congestion |
| Sender | bitrate، fps، encode time، quality limitation | CPU/bandwidth pressure |
| Receiver | jitter buffer، decode/drop/freeze | playout experience |
| SFU | subscription/layer/NACK/PLI/egress | forwarding و adaptation |
| Product | rejoin، mute confusion، task success، rating | QoE واقعی |
| Cost | relay/SFU GB و compute per room-minute | unit economics |
Metric cardinality و Privacy را کنترل کنید
Raw SDP، IP، Device label و Room/User ID را بیدلیل در Log نریزید. شناسه Opaque، sampling، aggregation، retention و access تعریف کنید. برای Debug نمونه، consent/policy و redaction داشته باشید.
QoE و SLO: کیفیت را از دید Task تعریف کنید
| SLI | تعریف نمونه | Segment |
|---|---|---|
| Join success | first two-way media / eligible join | ISP/browser/device/region |
| Join time | user intent تا first usable media p50/p95 | direct/relay/SFU |
| Audio continuity | gap/concealment یا user-reported issue | network/codec |
| Video continuity | freeze/dropped/decoded frame | tile/device/layer |
| Recovery | network change تا usable media | ICE restart/reconnect |
| Room completion | جلسه بدون rejoin/abandon | room size/use case |
| Cost | infra cost / successful participant-minute | region/topology |
Threshold را از Baseline و User research بسازید. یک MOS تخمینی یا RTT ثابت «حقیقت کیفیت» نیست؛ Audio intelligibility، Screen readability و Task success را هم ببینید.
Trace یک تماس را End-to-end کنید
یک call_attempt_id Opaque باید Client event، Signaling، token issuance، TURN allocation، SFU room، recording و support incident را بدون ذخیره Payload حساس به هم وصل کند. Timeline نمونه:
- join_clicked
- permission_resolved
- signal_connected
- offer/answer applied
- ice_checking/connected
- dtls_connected
- first_inbound_audio/video
- quality_degraded/recovered
- leave/failed/rejoined
Clock skew، event loss و sampling را در تحلیل در نظر بگیرید.
عیبیابی از Symptom به Layer
| نشانه | فرضیهها | اولین شواهد |
|---|---|---|
| Join fail | auth/room/token/signaling | API status، close code، role |
| ICE fail | candidate/order/TURN/DNS/firewall | ICE state، candidate pair، TURN logs |
| Connected بدون Media | track/transceiver/codec/autoplay/mute | sender/receiver stats و element state |
| One-way audio | direction، device، route، permission | outbound/inbound RTP delta |
| افت بعد چند دقیقه | thermal، leak، congestion، TURN/SFU load | encode time، memory، loss، node saturation |
| فقط ISP خاص | UDP/IPv6/route/MTU/TLS fallback | transport mix و synthetic probe |
| بعد Deploy | SDP/schema/codec/flag incompatibility | release cohort و error diff |
Runbookهای ضروری
- TURN region down یا certificate/credential failure؛
- SFU node saturation و room drain؛
- Signaling disconnect storm؛
- Browser release و Codec/permission regression؛
- Recording backlog/storage failure؛
- Telemetry loss یا high-cardinality bill؛
- Abuse/credential leak/room enumeration؛
- Vendor/region inaccessible برای کاربران ایران.
برای Synthetic probe، escalation و Incident lifecycle به راهنمای مانیتورینگ آپتایم مراجعه کنید.
تست Matrix برای ایران
| بعد | حداقل پوشش | هدف |
|---|---|---|
| ISP | موبایل چند اپراتور + اینترنت ثابت + شبکه سازمانی | UDP/TCP/TLS و route |
| IP | CGNAT، IPv4، IPv6 در صورت دسترس | candidate و fallback |
| Device | Android ضعیف، iPhone، Desktop | CPU/thermal/battery/permission |
| Browser | Chrome/Firefox/Safari/WebView در support | interop/codec/API |
| Network event | Wi‑Fi↔mobile، loss، latency، offline/return | ICE restart/recovery |
| Topology | direct، relay-only، SFU room size | connectivity/quality/cost |
| Media | audio، camera، screen، mute/device change | task correctness |
| Failure | region/node/token/cert/recording loss | runbook/rollback |
VPN را اگر در Population واقعی وجود دارد Segment جدا کنید؛ نتیجه VPN یا تهران را به کل ایران تعمیم ندهید. وضعیت Vendor eligibility، پرداخت، داده، Support و مسیر شبکه را با تاریخ Snapshot ثبت کنید.
تستهای خودکار و دستی پیش از انتشار
- Unit: signaling reducer، policy، cost formula و stats delta؛
- Contract: message schema/version، token claims، webhook/recording event؛
- Browser integration: offer/answer، glare، trickle، ICE restart، data backpressure؛
- Media fixture: synthetic audio/video برای packet/freeze validation؛
- Interop: Browser/OS/codec matrix؛
- Network emulation: loss/jitter/latency/bandwidth/UDP block؛
- Load/soak: signaling/TURN/SFU/recording و جلسه طولانی؛
- Security: room IDOR، token replay، rate/size، credential leak؛
- Accessibility: keyboard، focus، captions، status و error؛
- Chaos: node/region/certificate/vendor failure.
انتشار امن WebRTC و سازگاری نسخهها
Client قدیمی ممکن است همزمان با Signaling/SFU جدید فعال باشد. Protocol version، feature capability و backward-compatibility window لازماند.
- Schema و SDP-affecting change را version کنید.
- Capability negotiation را از User-agent sniff جدا نگه دارید.
- Deploy را با internal room و synthetic call شروع کنید.
- Canary را بر Region/room cohort کوچک اجرا کنید.
- Join/QoE/error/cost Guardrail را قبل از ramp بررسی کنید.
- SFU nodeها را drain و سپس upgrade کنید.
- Client/server/flag rollback و room recovery را تمرین کنید.
برای Provenance، staged rollout و rollback به راهنمای CI/CD امن مراجعه کنید.
مدل TCO هر participant-minute
| سرفصل | Driver | شاهد |
|---|---|---|
| Signaling/API | connection/event/request | usage و peak |
| TURN | relay share × bitrate × duration | allocation/bytes |
| SFU | publisher/subscriber/layer/egress | node/room metrics |
| MCU/transcode | encode/decode/composition | CPU/GPU minute |
| Recording | track/compose/storage/egress | GB/minute/retention |
| Observability | event/stats/cardinality/retention | ingest/storage/query |
| Engineering/Ops | interop/SRE/security/support | on-call/incident/change |
| Vendor/FX | seat/minute/egress/region/exchange | dated quote/eligibility |
| Exit | migration/rebuild/export/dual run | drill estimate |
سناریوی Low/Base/Peak و Direct/Relay/SFU را جدا کنید. هزینه هر دقیقه تماس ناموفق را نیز حساب کنید؛ Infrastructure ارزان با Join failure بالا ارزان نیست.
Build، Open-source یا CPaaS مدیریتشده؟
| گزینه | مناسب وقتی | ریسک |
|---|---|---|
| Managed CPaaS | زمان کم، تیم Media کوچک، feature استاندارد | usage cost، vendor/data/exit |
| Open-source SFU managed by team | کنترل/سفارشیسازی و SRE دارید | upgrade/region/interop/on-call |
| Build core | نیاز متمایز و ظرفیت تخصصی پایدار | زمان، استاندارد، security، operations |
| Hybrid | مسیر حساس داخلی و burst/vendor fallback | parity/routing/dual TCO |
Vendor scorecard
- Browser/mobile SDK و release cadence؛
- TURN/SFU region و داده واقعی مسیر ایران؛
- E2EE/SFrame/key ownership؛
- Recording/transcription/data retention؛
- QoE stats/export/raw events و limits؛
- ۹۹.x SLA با exclusionها، support و incident history؛
- Pricing egress/minute/recording/overage/FX؛
- Room/recording/config export و exit assistance؛
- Eligibility، پرداخت و continuity برای کسبوکار ایرانی.
Pilot ۳۰روزه WebRTC
| بازه | خروجی | شرط عبور |
|---|---|---|
| روز ۱–۵ | Session contract، threat/data map، SLO و topology candidates | Use case و trust boundary روشن |
| روز ۶–۱۰ | Signaling schema/state + TURN relay-only | glare/reconnect/credential tests پاس |
| روز ۱۱–۱۵ | SFU/codec/adaptation و getStats pipeline | first media/QoE trace کامل |
| روز ۱۶–۲۰ | ایران ISP/device/browser/network matrix | join/recovery و known limits ثبت |
| روز ۲۱–۲۵ | load/soak/chaos/security/privacy/recording | capacity/runbook/retention تأیید |
| روز ۲۶–۳۰ | Canary، TCO، vendor/build scorecard و exit drill | guardrail، rollback و decision record |
خطاهای رایج WebRTC
- فرض P2P همیشگی و حذف TURN؛
- استفاده از RFC/پیکربندی قدیمی TURN بدون auth/abuse/capacity؛
- Secret یا Credential بلندمدت در JavaScript؛
- نداشتن generation/seq و state machine برای glare/reconnect؛
- Full Mesh براساس Demo سهنفره؛
- یکیدانستن DTLS-SRTP با E2EE چندنفره؛
- E2EE بدون identity/key/recording contract؛
- Hardcode یک Codec یا Resolution برای همه Deviceها؛
- DataChannel بدون backpressure و reconciliation؛
- مانیتورینگ فقط CPU سرور یا فقط state=connected؛
- ندیدن Relay/SFU Egress و هزینه Recording؛
- تست فقط Wi‑Fi دفتر و یک Browser؛
- Deploy SFU بدون drain/canary/compatibility/rollback؛
- ذخیره Raw SDP/IP/recording بدون Data governance.
چکلیست Production readiness
- Session/role/media/quality/privacy/scale/exit contract نوشته شده است.
- Signaling schema، order، duplicate، glare و reconnect تست شدهاند.
- ICE generation و Trickle end-of-candidates درست مدیریت میشوند.
- TURN short credential، relay-only، IPv4/۶، transport و capacity پاساند.
- Topology/codec/simulcast/SVC بر Device/Network واقعی سنجیده شدهاند.
- Room/recording/TURN/SFU access و abuse controls حاضرند.
- Transport encryption و E2EE claim دقیق و جدا هستند.
- Permission/deny/mute/leave و recording consent قابلفهماند.
- getStats delta، QoE SLO، trace، privacy و cost dashboard فعالاند.
- Iran ISP/device/browser/VPN segment و vendor eligibility ثبت شدهاند.
- Load/soak/chaos/security و region failure تمرین شدهاند.
- Canary، drain، rollback، export و exit drill انجام شدهاند.
پرسشهای متداول WebRTC
آیا WebRTC همیشه ارتباط مستقیم P2P دارد؟
خیر. ICE یک Candidate pair قابل استفاده را انتخاب میکند؛ مسیر میتواند مستقیم، Relayشده با TURN یا متصل به SFU/MCU باشد. نوع Selected candidate و topology را از Stats/Server telemetry ببینید، نه از نام PeerConnection.
تفاوت STUN و TURN چیست؟
STUN آدرس Reflexive دیدهشده پشت NAT را آشکار میکند و Media را رله نمیکند. TURN Allocation و Relay candidate میدهد و در صورت انتخاب، Packetها از آن عبور میکنند؛ به همین دلیل ظرفیت، Egress، Authentication و Abuse مهماند.
آیا WebRTC بدون سرور کار میکند؟
دموی محدود ممکن است با کمترین Backend دیده شود، اما محصول معمولاً به Web/API، Identity، Room، Signaling و STUN/TURN نیاز دارد. تماس گروهی نیز اغلب SFU/MCU و Recording/Observability میخواهد.
آیا رمزنگاری WebRTC همان E2EE است؟
هر PeerConnection باید Media/Data را در Transport رمزنگاری کند. اگر اتصال در SFU خاتمه یابد، Server میتواند Payload را ببیند؛ E2EE گروهی به Frame encryption مانند SFrame، Identity و Key management جدا نیاز دارد و با Recording/Moderation tradeoff دارد.
هزینه WebRTC چگونه محاسبه میشود؟
هزینه از Signaling، TURN relay، SFU egress/compute، MCU/transcode، Recording/storage، Observability، Engineering و Vendor/FX میآید. مدل را به participant-minute موفق، Bitrate، Relay share، room topology و Region بشکنید و Low/Base/Peak بسازید.
جمعبندی: WebRTC را بهعنوان یک سرویس رسانه اداره کنید
موفقیت WebRTC با ایجاد Offer و دیدن تصویر خودتان ثابت نمیشود. باید نشان دهید کاربر واجد در شبکه و Device واقعی وصل میشود، Audio/Video قابل استفاده میماند، Failure بازیابی میشود، دسترسی و Recording درستاند و هزینه هر participant-minute قابل پیشبینی است.
ترتیب عملی ماندگار این است: Session contract → Signaling state → ICE/STUN/TURN → Topology/Codec → Security/E2EE → Permission/Privacy → QoE/Cost telemetry → Iran matrix → Canary/Failover/Exit. با این ترتیب، Demo شکننده به یک قابلیت Production قابلدفاع تبدیل میشود.






