TURN Server — سرور پروتکل Traversal Using Relays around NAT است که ترافیک رسانهای را بین دو همتا در زمانی که اتصال مستقیم P2P ممکن نیست، رله میکند. بر اساس IETF RFC 5766, 2010، سرور TURN به عنوان آخرین راهحل (fallback) در فرآیند ICE در WebRTC عمل میکند و اتصال تضمینشده را حتی در NAT متقارن و فایروالهای شرکتی فراهم میکند.
موارد کلیدی
TURN Server (Traversal Using Relays around NAT) — یک سرویس شبکه است که در RFC 5766 تعریف شده و در RFC 8656 بهروزرسانی شده است که ترافیک UDP و TCP را بین دو کلاینت زمانی که اتصال مستقیم P2P به دلیل محدودیتهای NAT یا فایروالها ممکن نیست، رله میکند. در معماری WebRTC، سرور TURN به عنوان مکانیسم پشتیبان نهایی عمل میکند و اتصال را در هر شرایط شبکهای تضمین میکند.
بر خلاف STUN که فقط آدرس خارجی کلاینت را به آن اطلاع میدهد، سرور TURN فعالانه در انتقال داده شرکت میکند. هر همتا با سرور TURN اتصال برقرار میکند و دادههای رسانهای خود را به آن ارسال میکند. سرور TURN به نوبه خود این دادهها را به همتای دیگر هدایت میکند. در نتیجه هیچ اتصال مستقیمی بین همتاها وجود ندارد — تمام ترافیک از طریق سرور رله عبور میکند که تحویل را حتی در سختترین محدودیتهای NAT تضمین میکند.
TURN یک توسعه پروتکل STUN است. پیامهای TURN از همان هدر ۲۰ بایتی و مکانیزم ویژگیها استفاده میکنند. تفاوت کلیدی این است که TURN انواع پیام جدید (Allocate, Refresh, Send, Data, CreatePermission, ChannelBind) و ویژگیهای لازم برای مدیریت تخصیصهای رله را تعریف میکند. کلاینت یک تخصیص روی سرور TURN از طریق پیام Allocate ایجاد میکند، آدرس حملونقل رلهشده (relayed transport address) را دریافت میکند و از آن برای ارسال و دریافت داده از طریق سرور استفاده میکند.
سرور TURN طبق دنباله مراحل زیر کار میکند. کلاینت یک درخواست Allocate با احراز هویت (username, credential) ارسال میکند. سرور اعتبارنامه را بررسی میکند و یک تخصیص ایجاد میکند — اتصال موقت آدرس رله (IP:پورت روی سرور TURN) به کلاینت. سرور یک پاسخ Allocate با relayed transport address برمیگرداند — آدرسی که سایر همتاها برای ارسال داده به این کلاینت از طریق سرور TURN استفاده خواهند کرد.
پس از ایجاد تخصیص، کلاینت میتواند دادهها را از طریق سرور TURN با استفاده از پیامهای Send Indication یا از طریق کانالها (ChannelBind) ارسال کند. هنگام دریافت داده از کلاینت، سرور TURN مجوزها (permissions) را بررسی میکند و دادهها را به همتای هدف رله میکند. برای دریافت دادههای ورودی، کلاینت باید ابتدا مجوزی برای همتایی که از آن انتظار داده دارد ایجاد کند، در غیر این صورت سرور TURN بسته ورودی را دور میریزد. مجوز از طریق پیام CreatePermission با مشخص کردن آدرس IP همتا ایجاد میشود.
تخصیص روی سرور TURN طول عمر محدودی دارد — به طور پیشفرض ۱۰ دقیقه. کلاینت باید به طور دورهای درخواست Refresh را برای تمدید تخصیص ارسال کند. طول عمر بر حسب ثانیه در ویژگی LIFETIME مشخص میشود. در صورت عدم وجود Refresh، سرور تخصیص را حذف و آدرس رله را آزاد میکند. فاصله بهروزرسانی توصیهشده ۵ دقیقه (۳۰۰ ثانیه) برای جلوگیری از از دست رفتن بستههای Refresh است.
در WebRTC سرور TURN از طریق پیکربندی RTCPeerConnection در آرایه iceServers پیکربندی میشود. سرورهای TURN میتوانند از حملونقل UDP، TCP یا TLS استفاده کنند. برای احراز هویت معمولاً از اعتبارنامههای موقت (TURN credentials) استفاده میشود که در سرور برنامه تولید شده و مدت زمان محدودی دارند.
مثالی از پیکربندی سرور TURN در JavaScript با احراز هویت از طریق توکن HMAC-SHA1 را بررسی میکنیم.
async function createPeerConnection(turnServerUrl) {
const credentials = await fetchTurnCredentials();
const config = {
iceServers: [
{
urls: "stun:stun.l.google.com:19302"
},
{
urls: turnServerUrl,
username: credentials.username,
credential: credentials.credential
}
],
iceTransportPolicy: "all"
};
return new RTCPeerConnection(config);
}
async function fetchTurnCredentials() {
const response = await fetch("/api/turn-credentials");
return response.json();
}
const turnUrl = "turn:turn.example.com:3478";
const pc = await createPeerConnection(turnUrl);
در این مثال، سرور TURN همراه با سرور STUN در یک پیکربندی واحد ICE مشخص شده است. فرآیند ICE ابتدا کاندیداهای host و srflx دریافتشده از STUN را امتحان میکند. اگر اتصال مستقیم امکانپذیر نباشد، ICE خودکار به کاندیدای relay دریافتشده از سرور TURN سوئیچ میکند. پارامتر iceTransportPolicy: "all" کاندیداهای relay را مجاز میکند — مقدار جایگزین "relay" هر کاندیدایی غیر از TURN را ممنوع میکند که برای تست مفید است.
برای جلوگیری از استفاده غیرمجاز، سرور TURN نیاز به احراز هویت دارد. رویکرد استاندارد — اعتبارنامههای محدود به زمان (time-limited credentials) است که در سرور برنامه با استفاده از HMAC-SHA1 تولید میشود. سرور برنامه نام کاربری را با کلید مخفی سرور TURN رمزگذاری کرده و username و credential را به کلاینت برمیگرداند. کلاینت آنها را در پیکربندی RTCPeerConnection قرار میدهد و مرورگر هنگام ایجاد تخصیص روی سرور TURN از آنها استفاده میکند. پس از انقضای اعتبارنامهها، کلاینت اعتبارنامه جدیدی از سرور برنامه دریافت میکند.
TURN و STUN وظایف مرتبط عبور از NAT را حل میکنند اما از نظر مکانیزم و هزینه تفاوت اساسی دارند. TURN ترافیک را رله میکند و به عنوان واسطه عمل میکند، در حالی که STUN فقط به تعیین آدرس خارجی برای اتصال مستقیم P2P کمک میکند. انتخاب بین آنها با نوع NAT همتاها و الزامات عملکرد تعیین میشود.
| معیار | STUN | TURN |
|---|---|---|
| مکانیزم | تعیین آدرس خارجی | رله ترافیک |
| اتصال | مستقیم P2P | از طریق سرور رله |
| تأخیر | حداقل (مسیر مستقیم) | اضافی (از طریق رله) |
| بار بر سرور | فقط درخواستهای اولیه | رله دائمی ترافیک |
| هزینه | کم (تعداد کمی درخواست) | زیاد (ترافیک روی سرور) |
| کار با Symmetric NAT | خیر | بله |
| پهنای باند | فقط محدودیت کانال P2P | محدودیت کانال سرور |
در عمل سرور TURN فقط برای اتصالاتی استفاده میشود که P2P در آنها ممکن نیست. بر اساس آمار Google (WebRTC statistics, 2023)، حدود ۱۵–۲۰٪ از تمام اتصالات WebRTC نیاز به رله TURN دارند. ۸۰–۸۵٪ باقیمانده از طریق STUN یا کاندیداهای محلی host برقرار میشوند. هنگام طراحی برنامه باید بودجهای برای ترافیک TURN به میزان ۱۵–۲۰٪ از کل حجم دادههای رسانهای در نظر گرفت، اگر مخاطب شامل کاربرانی از شبکههای شرکتی و مناطق با محدودیتهای NAT شدید باشد.
سرور TURN منابع قابل توجهی مصرف میکند، زیرا تمام ترافیک رسانهای از طریق آن عبور میکند. هر تماس فعال با رله TURN از پهنای باند سرور معادل مجموع پهنای باند ترافیک رسانهای (ورودی + خروجی) استفاده میکند. برای تماس تصویری با کیفیت HD (720p) این میتواند ۱.۵–۲.۵ مگابیت بر ثانیه برای هر جهت باشد، یعنی ۳–۵ مگابیت بر ثانیه ترافیک کلی از طریق سرور TURN.
چندین گزینه برای استقرار زیرساخت TURN وجود دارد. سرورهای TURN عمومی رایگان برای محیط تولید توصیه نمیشوند به دلیل عدم تضمین کیفیت و امنیت. ارائهدهندگان تجاری (Twilio Network Traversal Service, Xirsys, Metered) TURN را به عنوان سرویس با پرداخت به ازای گیگابایت ترافیک ارائه میدهند — هزینه معمول $۰.۰۰۵–۰.۰۲ به ازای هر گیگابایت است. استقرار مستقل با استفاده از coturn (سرور TURN متنباز) نیازمند سروری با پهنای باند کافی و پیکربندی مانیتورینگ است.
هنگام انتخاب راهحل برای سرور TURN باید جغرافیای کاربران، هزینه ترافیک و الزامات امنیتی را در نظر گرفت. برای برنامههایی با هزاران تماس همزمان، coturn خودمیزبان روی سرورهای با پهنای باند بالا (۱+ گیگابیت بر ثانیه) ممکن است مقرونبهصرفهتر از ارائهدهندگان تجاری باشد. برای پروژههای کوچک با دهها کاربر، سرویسهای تجاری TURN به دلیل عدم وجود هزینههای مدیریت و مانیتورینگ ترجیح داده میشوند.
سوالات متداول
سرور TURN واسطهای است که دادهها را بین کاربران زمانی که نمیتوانند مستقیماً متصل شوند، منتقل میکند. اگر دو کامپیوتر پشت روترهایی قرار دارند که اتصال مستقیم را ممکن نمیسازند، سرور TURN دادهها را از یکی دریافت کرده و به دیگری ارسال میکند.
سرور TURN زمانی نیاز است که هر دو شرکتکننده تماس WebRTC پشت NAT متقارن یا فایروالهای شرکتی قرار دارند که ترافیک P2P را مسدود میکنند. در چنین مواردی STUN نمیتواند کمک کند و فرآیند ICE خودکار به کاندیدای relay دریافتشده از سرور TURN سوئیچ میکند.
STUN فقط آدرس خارجی کامپیوتر را برای اتصال مستقیم نشان میدهد. TURN فعالانه ترافیک را از طریق خود رله میکند. STUN باری بر سرور ایجاد نمیکند، TURN پهنای باند مصرف میکند. STUN فقط با انواع خاصی از NAT کار میکند، TURN همیشه کار میکند اما هزینه بیشتری دارد.
هزینه سرور TURN به ارائهدهنده و حجم ترافیک بستگی دارد. Twilio حدود $۰.۰۰۵–۰.۰۱ به ازای هر گیگابایت ترافیک عبوری از TURN دریافت میکند. Xirsys از $۰.۰۰۷ به ازای هر گیگابایت. استقرار مستقل coturn نیازمند سروری با پهنای باند حداقل ۱۰۰ مگابیت بر ثانیه است که هزینه آن به ارائهدهنده هاستینگ بستگی دارد.
سرور TURN شخصی با استفاده از coturn (متنباز) پیکربندی میشود. نصب شامل پیکربندی پورتها، احراز هویت (shared secret)، گواهیهای TLS و فایروال است. فایل پیکربندی پایه شامل پارامترهای listening-port, realm, user و fingerprint است. پس از پیکربندی، سرور در iceServers در WebRTC با پیشوند turn: یا turns: برای TLS مشخص میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید