TURN Server — a Traversal Using Relays around NAT protokoll szervere, amely médiaforgalmat továbbít két peer között, amikor a közvetlen P2P kapcsolat lehetetlen. Az IETF RFC 5766, 2010 szerint a TURN szerver az utolsó tartalékként (fallback) működik a WebRTC ICE folyamatában, garantált kapcsolatot biztosítva még Symmetric NAT és vállalati tűzfalak esetén is.
Főbb pontok
TURN Server (Traversal Using Relays around NAT) — egy RFC 5766-ban meghatározott és RFC 8656-ban frissített hálózati szolgáltatás, amely UDP és TCP forgalmat továbbít két ügyfél között, amikor a közvetlen P2P kapcsolat lehetetlen NAT korlátozások vagy tűzfalak miatt. A WebRTC architektúrában a TURN szerver végső tartalékmechanizmusként működik, garantálva a kapcsolatot bármilyen hálózati körülmények között.
Ellentétben a STUN-nal, amely csak közli az ügyféllel a külső címét, a TURN szerver aktívan részt vesz az adatátvitelben. Minden peer kapcsolatot létesít a TURN szerverrel és elküldi neki a médiaadatait. A TURN szerver továbbítja ezeket az adatokat a másik peernek. Ennek eredményeként nincs közvetlen kapcsolat a peerek között — az összes forgalom a relé szerveren halad át, ami garantálja a kézbesítést még a legszigorúbb NAT korlátozások mellett is.
A TURN a STUN protokoll kiterjesztése. A TURN üzenetek ugyanazt a 20 bájtos fejlécet és attribútummechanizmust használják. A fő különbség, hogy a TURN új üzenettípusokat (Allocate, Refresh, Send, Data, CreatePermission, ChannelBind) és attribútumokat határoz meg a relé allokációk kezeléséhez. Az ügyfél allokációt hoz létre a TURN szerveren az Allocate üzenettel, megkapja a relé szállítási címet (relayed transport address), és azt használja adatok küldésére és fogadására a szerveren keresztül.
A TURN szerver a következő lépéssorozat szerint működik. Az ügyfél Allocate Requestet küld hitelesítéssel (username, credential). A szerver ellenőrzi a hitelesítő adatokat és létrehoz egy allokációt — a relé cím (IP:port a TURN szerveren) ideiglenes hozzárendelését az ügyfélhez. A szerver Allocate Response-t küld a relayed transport address-szel — azzal a címmel, amelyet a többi peer használni fog adatok küldésére ennek az ügyfélnek a TURN szerveren keresztül.
Az allokáció létrehozása után az ügyfél adatokat küldhet a TURN szerveren keresztül Send Indication üzenetekkel vagy csatornákon (ChannelBind) keresztül. Az ügyféltől érkező adatok fogadásakor a TURN szerver ellenőrzi az engedélyeket (permissions) és továbbítja az adatokat a cél peernek. A bejövő adatok fogadásához az ügyfélnek előzetesen engedélyt kell létrehoznia annak a peernek, akitől adatokat vár, különben a TURN szerver elutasítja a bejövő csomagot. Az engedély a CreatePermission üzenettel jön létre a peer IP címének megadásával.
A TURN szerveren lévő allokáció korlátozott élettartammal rendelkezik — alapértelmezés szerint 10 perc. Az ügyfélnek időszakosan Refresh Requestet kell küldenie az allokáció meghosszabbításához. Az élettartam másodpercekben van megadva a LIFETIME attribútumon. Refresh hiányában a szerver törli az allokációt és felszabadítja a relé címet. Ajánlott frissítési intervallum 5 perc (300 másodperc) a Refresh csomagok elvesztése elleni védelem érdekében.
A WebRTC-ben a TURN szervert az RTCPeerConnection konfigurációban, az iceServers tömbben konfiguráljuk. A TURN szerverek használhatnak UDP, TCP és TLS szállítást is. A hitelesítéshez általában ideiglenes hitelesítő adatokat (TURN credentials) használnak, amelyek az alkalmazásszerveren generálódnak és időben korlátozottak.
Nézzünk egy példát a TURN szerver konfigurálására JavaScript-ben HMAC-SHA1 tokenes hitelesítéssel.
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);
Ebben a példában a TURN szerver a STUN szerverrel együtt egy egységes ICE konfigurációban van megadva. Az ICE folyamat először megpróbálja használni a host jelölteket és a STUN-tól kapott srflx jelölteket. Ha a közvetlen kapcsolat sikertelen, az ICE automatikusan átvált a TURN szervertől kapott relé jelöltre. A iceTransportPolicy: "all" paraméter engedélyezi a relé jelölteket — az alternatív "relay" érték tiltja az összes jelöltet a TURN kivételével, ami teszteléshez hasznos.
A jogosulatlan használat megakadályozása érdekében a TURN szerver hitelesítést igényel. A standard megközelítés az időkorlátos hitelesítő adatok (time-limited credentials) használata, amelyek az alkalmazásszerveren HMAC-SHA1 segítségével generálódnak. Az alkalmazásszerver titkosítja a felhasználónevet a TURN szerver titkos kulcsával, és visszaküldi a felhasználónevet és a hitelesítő adatokat az ügyfélnek. Az ügyfél továbbítja őket az RTCPeerConnection konfigurációba, a böngésző pedig használja őket az allokáció létrehozásakor a TURN szerveren. A hitelesítő adatok lejárta után az ügyfél újakat kap az alkalmazásszervertől.
TURN és STUN hasonló NAT átjárási feladatokat oldanak meg, de alapvetően különböznek mechanizmusban és költségben. A TURN továbbítja a forgalmat, közvetítőként működve, míg a STUN csak a külső cím meghatározásában segít a közvetlen P2P kapcsolathoz. A közöttük való választást a peerek NAT típusa és a teljesítménykövetelmények határozzák meg.
| Szempont | STUN | TURN |
|---|---|---|
| Mechanizmus | Külső cím meghatározása | Forgalom továbbítása |
| Kapcsolat | Közvetlen P2P | Relé szerveren keresztül |
| Késleltetés | Minimális (közvetlen útvonal) | Többlet (relén keresztül) |
| Szerverterhelés | Csak kezdeti kérések | Folyamatos forgalomtovábbítás |
| Költség | Alacsony (egyedi kérések) | Magas (szerverforgalom) |
| Symmetric NAT működés | Nem | Igen |
| Sávszélesség | Csak a P2P csatorna korlátja | Szervercsatorna korlátja |
A gyakorlatban a TURN szervert csak azokhoz a kapcsolatokhoz használják, ahol a P2P lehetetlen. A Google adatai szerint (WebRTC statisztika, 2023) az összes WebRTC kapcsolat körülbelül 15–20%-a igényel TURN továbbítást. A fennmaradó 80–85% STUN-on vagy helyi host jelölteken keresztül jön létre. Az alkalmazás tervezésekor költségkeretet kell elkülöníteni a TURN forgalomra az összes médiaadat-mennyiség 15–20%-ának megfelelően, ha a célközönség vállalati hálózatokból és szigorú NAT korlátozású régiókból származó felhasználókat tartalmaz.
A TURN szerver jelentős erőforrásokat fogyaszt, mivel az összes médiaforgalom áthalad rajta. Minden aktív, TURN továbbítással rendelkező hívás a szerver sávszélességét a médiaforgalom teljes átbocsátóképességével megegyező mértékben használja (bejövő + kimenő adatfolyam). Egy HD minőségű (720p) videóhívás esetén ez kapcsolatonként 1,5–2,5 Mb/s lehet minden irányban, azaz 3–5 Mb/s teljes forgalom a TURN szerveren keresztül.
Több lehetőség létezik a TURN infrastruktúra telepítésére. Az ingyenes nyilvános TURN szerverek nem ajánlottak éles célú használatra a minőségi és biztonsági garanciák hiánya miatt. A kereskedelmi szolgáltatók (Twilio Network Traversal Service, Xirsys, Metered) TURN-t szolgáltatásként kínálják gigabájtonkénti forgalmi díjjal — a tipikus költség $0,005–0,02 gigabájtonként. A saját telepítés coturn (open-source TURN szerver) alapján megfelelő sávszélességű szervert és monitorozás konfigurálását igényel.
A TURN szerverre vonatkozó megoldás kiválasztásakor figyelembe kell venni a felhasználók földrajzi eloszlását, a forgalmi költségeket és a biztonsági követelményeket. Többezer egyidejű hívással rendelkező alkalmazások esetén a self-hosted coturn széles sávú (1+ Gb/s) szervereken gazdaságosabb lehet, mint a kereskedelmi szolgáltatók. Kis projektek esetén, tízes nagyságrendű felhasználóval, a kereskedelmi TURN szolgáltatások előnyösebbek az adminisztrációs és monitorozási költségek hiánya miatt.
Gyakran ismételt kérdések
A TURN szerver egy közvetítő, amely adatokat továbbít a felhasználók között, amikor azok nem tudnak közvetlenül kapcsolódni. Ha két számítógép olyan útválasztók mögött van, amelyek nem teszik lehetővé a közvetlen kapcsolatot, a TURN szerver fogadja az adatokat az egyiktől és továbbítja a másiknak.
TURN szerverre akkor van szükség, amikor egy WebRTC hívás mindkét résztvevője Symmetric NAT vagy a P2P forgalmat blokkoló vállalati tűzfalak mögött van. Ilyen esetekben a STUN nem tud segíteni, és az ICE folyamat automatikusan átvált a TURN szervertől kapott relé jelöltre.
A STUN csak megmutatja a számítógépnek a külső címét a közvetlen kapcsolathoz. A TURN aktívan továbbítja a forgalmat saját magán keresztül. A STUN nem okoz szerverterhelést, a TURN sávszélességet fogyaszt. A STUN csak bizonyos NAT típusokkal működik, a TURN mindig működik, de drágább.
A TURN szerver költsége a szolgáltatótól és a forgalom mennyiségétől függ. A Twilio körülbelül $0,005–0,01-t számít fel a TURN-on átmenő forgalom GB-jáért. Az Xirsys — $0,007-tól GB-ként. A coturn saját telepítése legalább 100 Mb/s sávszélességű szervert igényel, amelynek költsége a hosting szolgáltatótól függ.
A saját TURN szerver a coturn (open-source) segítségével konfigurálható. A telepítés magában foglalja a portok, hitelesítés (shared secret), TLS tanúsítványok és tűzfal konfigurálását. Az alap konfigurációs fájl a listening-port, realm, user és fingerprint paramétereket tartalmazza. Konfigurálás után a szervert a WebRTC iceServers-ben kell megadni a turn: vagy TLS esetén a turns: előtaggal.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is