TURN Server — είναι ένας διακομιστής του πρωτοκόλλου Traversal Using Relays around NAT που αναμεταδίδει την κίνηση πολυμέσων μεταξύ δύο ομότιμων κόμβων όταν η άμεση σύνδεση P2P δεν είναι δυνατή. Σύμφωνα με το IETF RFC 5766, 2010, ο διακομιστής TURN λειτουργεί ως το τελευταίο εφεδρικό μέσο (fallback) στη διαδικασία ICE του WebRTC, εξασφαλίζοντας εγγυημένη σύνδεση ακόμη και με Symmetric 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 χρησιμοποιούν την ίδια κεφαλίδα 20 byte και τον μηχανισμό χαρακτηριστικών. Η βασική διαφορά είναι ότι το TURN ορίζει νέους τύπους μηνυμάτων (Allocate, Refresh, Send, Data, CreatePermission, ChannelBind) και χαρακτηριστικά που απαιτούνται για τη διαχείριση των αναμεταδόσεων. Ο πελάτης δημιουργεί μια εκχώρηση (allocation) στον διακομιστή 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 έχει περιορισμένη διάρκεια ζωής — προεπιλογή 10 λεπτά. Ο πελάτης πρέπει να στέλνει περιοδικά αίτημα Refresh για παράταση της εκχώρησης. Η διάρκεια ζωής αναφέρεται σε δευτερόλεπτα στο χαρακτηριστικό LIFETIME. Εάν δεν υπάρχει Refresh, ο διακομιστής διαγράφει την εκχώρηση και απελευθερώνει τη διεύθυνση αναμετάδοσης. Συνιστώμενο διάστημα ανανέωσης — 5 λεπτά (300 δευτερόλεπτα) για προστασία από απώλεια πακέτων 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), περίπου 15–20% όλων των συνδέσεων WebRTC απαιτούν αναμετάδοση TURN. Το υπόλοιπο 80–85% δημιουργείται μέσω STUN ή τοπικών υποψήφιων host. Κατά τον σχεδιασμό της εφαρμογής, θα πρέπει να προβλέπεται προϋπολογισμός για κίνηση TURN σε ποσοστό 15–20% του συνολικού όγκου δεδομένων πολυμέσων, εάν το κοινό περιλαμβάνει χρήστες από εταιρικά δίκτυα και περιοχές με αυστηρούς περιορισμούς NAT.
Ο διακομιστής TURN καταναλώνει σημαντικούς πόρους, καθώς όλη η κίνηση πολυμέσων περνά μέσω αυτού. Κάθε ενεργή κλήση με αναμετάδοση TURN χρησιμοποιεί εύρος ζώνης του διακομιστή ίσο με τη συνολική χωρητικότητα της κίνησης πολυμέσων (εισερχόμενη + εξερχόμενη ροή). Για βιντεοκλήση ποιότητας HD (720p) αυτό μπορεί να είναι 1,5–2,5 Mbps ανά κατεύθυνση, δηλαδή 3–5 Mbps συνολικής κίνησης μέσω του διακομιστή TURN.
Υπάρχουν πολλές επιλογές για την ανάπτυξη υποδομής TURN. Οι δωρεάν δημόσιοι διακομιστές TURN δεν συνιστώνται για παραγωγή λόγω έλλειψης εγγυήσεων ποιότητας και ασφάλειας. Οι εμπορικοί πάροχοι (Twilio Network Traversal Service, Xirsys, Metered) παρέχουν TURN ως υπηρεσία με πληρωμή ανά gigabyte κίνησης — το τυπικό κόστος είναι $0,005–0,02 ανά gigabyte. Η ανεξάρτητη ανάπτυξη με βάση το coturn (διακομιστής TURN ανοιχτού κώδικα) απαιτεί διακομιστή με επαρκές εύρος ζώνης και ρύθμιση παρακολούθησης.
Κατά την επιλογή λύσης για διακομιστή TURN, θα πρέπει να λαμβάνεται υπόψη η γεωγραφία των χρηστών, το κόστος κίνησης και οι απαιτήσεις ασφάλειας. Για εφαρμογές με χιλιάδες ταυτόχρονες κλήσεις, το self-hosted coturn σε διακομιστές με ευρυζωνικό κανάλι (1+ Gbps) μπορεί να είναι οικονομικότερο από εμπορικούς παρόχους. Για μικρά έργα με δεκάδες χρήστες, οι εμπορικές υπηρεσίες TURN είναι προτιμότερες λόγω έλλειψης εξόδων διαχείρισης και παρακολούθησης.
Συχνές ερωτήσεις
Ο διακομιστής TURN είναι ένας ενδιάμεσος που μεταδίδει δεδομένα μεταξύ χρηστών όταν δεν μπορούν να συνδεθούν απευθείας. Εάν δύο υπολογιστές βρίσκονται πίσω από δρομολογητές που δεν επιτρέπουν άμεση σύνδεση, ο διακομιστής TURN λαμβάνει δεδομένα από τον έναν και τα στέλνει στον άλλον.
Ο διακομιστής TURN απαιτείται όταν και οι δύο συμμετέχοντες σε μια κλήση WebRTC βρίσκονται πίσω από Symmetric NAT ή εταιρικά τείχη προστασίας που αποκλείουν την κίνηση P2P. Σε τέτοιες περιπτώσεις, το STUN δεν μπορεί να βοηθήσει και η διαδικασία ICE μεταβαίνει αυτόματα στον υποψήφιο relay που ελήφθη από τον διακομιστή TURN.
Το STUN απλώς δείχνει στον υπολογιστή την εξωτερική του διεύθυνση για άμεση σύνδεση. Το TURN αναμεταδίδει ενεργά την κίνηση μέσω του εαυτού του. Το STUN δεν δημιουργεί φόρτο στον διακομιστή, το TURN καταναλώνει εύρος ζώνης. Το STUN λειτουργεί μόνο με συγκεκριμένους τύπους NAT, το TURN λειτουργεί πάντα αλλά είναι πιο ακριβό.
Το κόστος ενός διακομιστή TURN εξαρτάται από τον πάροχο και τον όγκο κίνησης. Η Twilio χρεώνει περίπου $0,005–0,01 ανά GB κίνησης που διέρχεται από το TURN. Η Xirsys από $0,007 ανά GB. Η ανεξάρτητη ανάπτυξη coturn απαιτεί διακομιστή με κανάλι τουλάχιστον 100 Mbps, το κόστος του οποίου εξαρτάται από τον πάροχο φιλοξενίας.
Ο δικός σας διακομιστής TURN ρυθμίζεται χρησιμοποιώντας το coturn (ανοιχτού κώδικα). Η εγκατάσταση περιλαμβάνει διαμόρφωση θυρών, αυθεντικοποίησης (shared secret), πιστοποιητικών TLS και τείχους προστασίας. Το βασικό αρχείο διαμόρφωσης περιέχει παραμέτρους listening-port, realm, user και fingerprint. Μετά τη ρύθμιση, ο διακομιστής αναφέρεται στο iceServers του WebRTC με το πρόθεμα turn: ή turns: για TLS.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης