TURN Server — bu, iki peer arasında birbaşa P2P əlaqəsi mümkün olmadıqda media trafikini ötürən Traversal Using Relays around NAT protokolunun serveridir. IETF RFC 5766, 2010-a görə, TURN serveri WebRTC-nin ICE prosesində son ehtiyat (fallback) rolunu oynayır, hətta Symmetric NAT və korporativ firewall-lar olduqda belə zəmanətli əlaqəni təmin edir.
Başlıca
TURN Server (Traversal Using Relays around NAT) — bu, RFC 5766-da müəyyən edilmiş və RFC 8656-da yenilənmiş şəbəkə xidmətidir, NAT və ya firewall məhdudiyyətləri səbəbindən birbaşa P2P əlaqəsi mümkün olmadıqda iki müştəri arasında UDP və TCP trafikini ötürür. WebRTC arxitekturasında TURN serveri istənilən şəbəkə şəraitində əlaqəni təmin edən son ehtiyat mexanizmi kimi çıxış edir.
STUN-dan fərqli olaraq, sadəcə müştəriyə onun xarici ünvanını bildirən, TURN serveri məlumat ötürülməsində aktiv iştirak edir. Hər bir peer TURN serveri ilə əlaqə qurur və media məlumatlarını ona göndərir. TURN serveri öz növbəsində bu məlumatları digər peerə yönləndirir. Nəticədə peer-lər arasında birbaşa əlaqə yoxdur — bütün trafik rele serverindən keçir, bu da ən sərt NAT məhdudiyyətlərində belə çatdırılmanı təmin edir.
TURN STUN protokolunun genişləndirilməsidir. TURN mesajları eyni 20 baytlıq başlıqdan və atribut mexanizmindən istifadə edir. Əsas fərq ondadır ki, TURN rele alokasiyalarını idarə etmək üçün yeni mesaj növləri (Allocate, Refresh, Send, Data, CreatePermission, ChannelBind) və atributlar müəyyən edir. Müştəri Allocate mesajı vasitəsilə TURN serverində alokasiya yaradır, rele ünvanını (relayed transport address) alır və ondan server vasitəsilə məlumat göndərmək və qəbul etmək üçün istifadə edir.
TURN serveri aşağıdakı addımlar ardıcıllığı ilə işləyir. Müştəri autentifikasiya ilə (username, credential) Allocate Request göndərir. Server hesab məlumatlarını yoxlayır və alokasiya — rele ünvanının (TURN serverində IP:port) müştəriyə müvəqqəti bağlanmasını yaradır. Server relayed transport address ilə Allocate Response qaytarır — digər peer-lərin bu müştəriyə TURN serveri vasitəsilə məlumat göndərmək üçün istifadə edəcəyi ünvan.
Alokasiya yaradıldıqdan sonra müştəri Send Indication mesajları və ya kanallar (ChannelBind) vasitəsilə TURN serveri üzərindən məlumat göndərə bilər. Müştəridən məlumat alındıqda TURN serveri icazələri (permissions) yoxlayır və məlumatları hədəf peerə ötürür. Daxil olan məlumatları qəbul etmək üçün müştəri əvvəlcə məlumat gözlədiyi peer üçün icazə yaratmalıdır, əks halda TURN serveri daxil olan paketi rədd edəcək. İcazə peer-in IP ünvanını göstərən CreatePermission mesajı vasitəsilə yaradılır.
TURN serverində alokasiyanın məhdud ömür müddəti var — standart olaraq 10 dəqiqə. Müştəri alokasiyanı uzatmaq üçün dövri olaraq Refresh Request göndərməlidir. Ömür müddəti LIFETIME atributunda saniyələrlə göstərilir. Refresh olmadıqda server alokasiyanı silir və rele ünvanını azad edir. Tövsiyə edilən yeniləmə intervalı Refresh paketlərinin itkisindən qorunmaq üçün 5 dəqiqə (300 saniyə)dir.
WebRTC-də TURN serveri RTCPeerConnection konfiqurasiyasında iceServers massivində konfiqurasiya edilir. TURN serverləri həm UDP, həm də TCP və ya TLS transportundan istifadə edə bilər. Autentifikasiya üçün adətən tətbiq serverində yaradılan və vaxt məhdudiyyəti olan müvəqqəti hesab məlumatları (TURN credentials) istifadə olunur.
JavaScript-də HMAC-SHA1 tokeni ilə TURN serverinin konfiqurasiya nümunəsinə baxaq.
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);
Bu nümunədə TURN serveri STUN serveri ilə birlikdə vahid ICE konfiqurasiyasında göstərilir. ICE prosesi əvvəlcə host namizədlərindən və STUN-dan alınan srflx namizədlərindən istifadə etməyə çalışacaq. Birbaşa əlaqə uğursuz olarsa, ICE avtomatik olaraq TURN serverindən alınan rele namizədinə keçəcək. iceTransportPolicy: "all" parametri rele namizədlərinə icazə verir — alternativ "relay" dəyəri TURN-dan başqa bütün namizədləri qadağan edir, bu da test etmək üçün faydalıdır.
Qeyri-icazəli istifadənin qarşısını almaq üçün TURN serveri autentifikasiya tələb edir. Standart yanaşma — tətbiq serverində HMAC-SHA1 istifadə edilərək yaradılan müvəqqəti hesab məlumatlarıdır (time-limited credentials). Tətbiq serveri istifadəçi adını TURN serverinin gizli açarı ilə şifrələyir və müştəriyə istifadəçi adı və etimadnamə qaytarır. Müştəri onları RTCPeerConnection konfiqurasiyasına ötürür, brauzer isə onları TURN serverində alokasiya yaradarkən istifadə edir. Hesab məlumatlarının müddəti bitdikdə müştəri tətbiq serverindən yenilərini alır.
TURN və STUN NAT keçidi ilə bağlı oxşar vəzifələri həll edir, lakin mexanizm və dəyər baxımından əsaslı şəkildə fərqlənir. TURN trafiki ötürərək vasitəçi rolunu oynayır, STUN isə yalnız birbaşa P2P əlaqəsi üçün xarici ünvanı müəyyən etməyə kömək edir. Onların arasında seçim peer-lərin NAT növü və performans tələbləri ilə müəyyən edilir.
| Meyar | STUN | TURN |
|---|---|---|
| Mexanizm | Xarici ünvanın müəyyən edilməsi | Trafikin ötürülməsi |
| Əlaşə | Birbaşa P2P | Rele serveri vasitəsilə |
| Gecikmə | Minimal (birbaşa marşru) | Əlavə (rele vasitəsilə) |
| Server yükü | Yalnız ilkin sorğular | Daimi trafik ötürülməsi |
| Dəyər | Aşağı (tək sorğular) | Yüksək (server trafiki) |
| Symmetric NAT ilə iş | Xeyr | Bəli |
| Ötürmə qabiliyyəti | Yalnız P2P kanalının limiti | Server kanalının limiti |
Təcrübədə TURN serveri yalnız P2P-nin mümkün olmadığı əlaqələr üçün istifadə olunur. Google məlumatlarına görə (WebRTC statistikası, 2023), bütün WebRTC əlaqələrinin təxminən 15–20%-i TURN ötürülməsi tələb edir. Qalan 80–85% STUN və ya yerli host namizədləri vasitəsilə qurulur. Tətbiqin layihələndirilməsi zamanı, əgər auditoriyaya korporativ şəbəkələrdən və sərt NAT məhdudiyyətləri olan regionlardan istifadəçilər daxildirsə, ümumi media məlumatlarının 15–20%-i həcmində TURN trafiki üçün büdcə ayrılmalıdır.
TURN serveri əhəmiyyətli resurslar istehlak edir, çünki bütün media trafiki ondan keçir. TURN ötürülməsi olan hər aktiv zəng media trafikinin ümumi ötürmə qabiliyyətinə bərabər server bənd genişliyindən istifadə edir (daxil olan + çıxan axın). HD keyfiyyətli (720p) video zəng üçün bu, hər istiqamətdə əlaqə başına 1,5–2,5 Mb/s, yəni TURN serveri vasitəsilə ümumi 3–5 Mb/s trafik ola bilər.
TURN infrastrukturunun yerləşdirilməsinin bir neçe variantı var. Pulsuz ictimai TURN serverləri keyfiyyət və təhlükəsizlik təminatının olmaması səbəbindən istehsal mühiti üçün tövsiyə edilmir. Kommersiya provayderləri (Twilio Network Traversal Service, Xirsys, Metered) TURN-u gigabayt trafik üçün ödənişli xidmət kimi təqdim edir — tipik dəyəri gigabayt üçün $0,005–0,02 təşkil edir. coturn (açıq mənbəli TURN serveri) əsasında öz yerləşdirməniz kifayət qədər ötürmə qabiliyyəti olan server və monitorinq konfiqurasiyası tələb edir.
TURN serveri üçün həll seçərkən istifadəçilərin coğrafiyasını, trafikin dəyərini və təhlükəsizlik təlƏlərini nəzərə almaq lazımdır. Minlərlə eyni vaxtda zəngi olan tətbiqlər üçün geniş kanallı (1+ Gb/s) serverlərdə self-hosted coturn kommersiya provayderlərindən daha qənaətli ola bilər. Onlarla istifadəçisi olan kiçik layihələr üçün kommersiya TURN xidmətləri idarəetmə və monitorinq xərclərinin olmaması səbəbindən üstünlük təşkil edir.
Tez-tez verilən suallar
TURN serveri — bu, istifadəçilər birbaşa qoşula bilmədikdə onların arasında məlumat ötürən vasitəçidir. Əgər iki kompüter birbaşa əlaqəyə imkan verməyən marşrutizatorların arxasındadırsa, TURN serveri birindən məlumat alır və digərinə göndərir.
TURN serveri WebRTC zənginin hər iki iştirakçısı Symmetric NAT və ya P2P trafikini bloklayan korporativ firewalllar arxasında olduqda tələb olunur. Belə hallarda STUN kömək edə bilməz və ICE prosesi avtomatik olaraq TURN serverindən alınan rele namizədinə keçir.
STUN sadəcə kompüterə birbaşa əlaqə üçün onun xarici ünvanını göstərir. TURN trafiki özü vasitəsilə aktiv şəkildə ötürür. STUN server yükü yaratmır, TURN bənd genişliyi istehlak edir. STUN yalnız müəyyən NAT növləri ilə işləyir, TURN həmişə işləyir, lakin bahadır.
TURN serverinin dəyəri provayderdən və trafikin həcmindən asılıdır. Twilio TURN vasitəsilə keçən hər GB üçün təxminən $0,005–0,01 alır. Xirsys — GB üçün $0,007-dən başlayaraq. coturn-un müstəqil yerləşdirilməsi 100 Mb/s-dən kanalı olan server tələb edir, onun dəyəri hostinq provayderindən asılıdır.
Öz TURN serveriniz coturn (açıq mənbə) köməyi ilə konfiqurasiya edilir. Quraşdırma portların, autentifikasiyanın (shared secret), TLS sertifikatlarının və firewallın konfiqurasiyasını əhatə edir. Əsas konfiqurasiya faylı listening-port, realm, user və fingerprint parametrlərini ehtiva edir. Konfiqurasiyadan sonra server WebRTC iceServers-də turn: və ya TLS üçün turns: prefiksi ilə göstərilir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun