ICE Candidate — είναι ένα στοιχείο της υποδομής WebRTC που αντιπροσωπεύει μια πιθανή διεύθυνση δικτύου (IP + θύρα) για τη δημιουργία σύνδεσης P2P μεταξύ συσκευών. Κάθε υποψήφιος περιγράφει μια διαθέσιμη διαδρομή μεταφοράς που μπορεί να χρησιμοποιηθεί για τη μετάδοση δεδομένων πολυμέσων. Στη διαδικασία ICE (Interactive Connectivity Establishment), οι συσκευές ανταλλάσσουν λίστες υποψηφίων, τους δοκιμάζουν και επιλέγουν τη βέλτιστη διαδρομή. Σύμφωνα με το Mozilla MDN, 2026, το ICE Candidate είναι ένα βασικό στοιχείο της στοίβας WebRTC που εξασφαλίζει σύνδεση σε περίπλοκες συνθήκες δικτύου.
Κύρια σημεία
ICE Candidate (Interactive Connectivity Establishment Candidate) — είναι μια θεμελιώδης μονάδα στη διαδικασία δημιουργίας σύνδεσης P2P μέσω του πρωτοκόλλου WebRTC. Αντιπροσωπεύει ένα ζεύγος διεύθυνσης IP + θύρας που μπορεί να χρησιμοποιηθεί για τη μετάδοση δεδομένων μεταξύ δύο ομότιμων κόμβων. Κάθε υποψήφιος περιέχει πληροφορίες σχετικά με το πρωτόκολλο μεταφοράς (UDP, TCP), τον τύπο σύνδεσης και την προτεραιότητα.
Το ICE Candidate σχηματίζεται σε κάθε συσκευή ξεχωριστά. Η συσκευή συλλέγει όλες τις διαθέσιμες διεπαφές δικτύου, ζητά την εξωτερική διεύθυνση μέσω ενός διακομιστή STUN και προσθέτει μια διεύθυνση αναμετάδοσης από τον διακομιστή TURN. Η λίστα υποψηφίων που προκύπτει αποστέλλεται στον απομακρυσμένο ομότιμο κόμβο μέσω του καναλιού σηματοδοσίας σε μορφή SDP (Session Description Protocol).
Σύμφωνα με την προδιαγραφή RFC 8445 (IETF, 2018), το ICE χρησιμοποιεί τον μηχανισμό nominated pairs: μετά τη συλλογή όλων των υποψηφίων, πραγματοποιείται ζευγαρωτή δοκιμή τους μέσω αιτημάτων STUN. Το πρώτο ζεύγος που περνά τη δοκιμή κηρύσσεται nominated (διορισμένο) και χρησιμοποιείται για τη μετάδοση πολυμέσων. Τα υπόλοιπα ζεύγη παραμένουν σε εφεδρεία σε περίπτωση διακοπής της σύνδεσης.
Το WebRTC — είναι ένα ανοιχτό πρότυπο για επικοινωνίες P2P, αλλά η άμεση σύνδεση μεταξύ συσκευών είναι συχνά αδύνατη λόγω NAT (Network Address Translation) και τειχών προστασίας. Το ICE Candidate λύνει αυτό το πρόβλημα προσφέροντας πολλαπλές εναλλακτικές διαδρομές σύνδεσης. Το πρωτόκολλο ICE (Interactive Connectivity Establishment) είναι υποχρεωτικό στοιχείο του WebRTC και περιγράφεται στην προδιαγραφή W3C WebRTC (2025).
Πολλοί προγραμματιστές εφαρμογών για κινητά χρησιμοποιούν βιβλιοθήκες WebRTC, όπως το Google WebRTC (για Android) και εγγενή περιτυλίγματα για iOS. Σε καθεμία από αυτές, η διαδικασία ICE διαχειρίζεται αυτόματα, αλλά η κατανόηση των τύπων υποψηφίων επιτρέπει στον προγραμματιστή να διαμορφώσει την υποδομή διακομιστή και να βελτιστοποιήσει την ποιότητα σύνδεσης.
Το ICE Candidate μεταδίδεται στο πλαίσιο μηνύματος SDP ως χαρακτηριστικά a=candidate. Κάθε γραμμή περιέχει foundation, component ID, πρωτόκολλο μεταφοράς, προτεραιότητα, διεύθυνση IP, θύρα και τύπο υποψηφίου. Παρακάτω δίνεται ένα παράδειγμα τμήματος SDP με τρεις υποψηφίους διαφορετικών τύπων:
// Παράδειγμα SDP με υποψηφίους ICE
a=candidate:1 1 UDP 2130706431 192.168.1.10 54321 typ host
a=candidate:2 1 UDP 1694498815 203.0.113.5 54322 typ srflx
a=candidate:3 1 TCP 1019212287 198.51.100.7 54323 typ relay raddr 203.0.113.5 rport 3478
Το πεδίο priority καθορίζει τη σειρά δοκιμής των υποψηφίων. Όσο υψηλότερη είναι η προτεραιότητα, τόσο νωρίτερα θα ελεγχθεί ο υποψήφιος. Οι υποψήφιοι host έχουν πάντα την υψηλότερη προτεραιότητα, ενώ οι relay τη χαμηλότερη.
Η προδιαγραφή RFC 8445 ορίζει τέσσερις τύπους υποψηφίων ICE, καθένας από τους οποίους αντιστοιχεί σε έναν συγκεκριμένο τρόπο πρόσβασης στον απομακρυσμένο ομότιμο κόμβο. Ο τύπος υποψηφίου επηρεάζει την προτεραιότητά του, τον χρόνο δημιουργίας σύνδεσης και τις απαιτήσεις υποδομής διακομιστή.
| Τύπος | Προτεραιότητα | Πηγή | Εξάρτηση από διακομιστή |
|---|---|---|---|
| host | Υψηλότερη | Τοπική διεπαφή δικτύου | Όχι |
| srflx | Υψηλή | Αντανάκλαση STUN | STUN |
| prflx | Μεσαία | Αντανάκλαση peer (στη διαδικασία ICE) | Όχι |
| relay | Χαμηλότερη | Διακομιστής TURN | TURN |
Υποψήφιος host σχηματίζεται από τη διεύθυνση IP της τοπικής διεπαφής δικτύου της συσκευής. Εάν η συσκευή βρίσκεται στο ίδιο τοπικό δίκτυο με τον ομότιμο κόμβο, ο υποψήφιος host παρέχει άμεση σύνδεση με ελάχιστη καθυστέρηση. Για κινητές συσκευές, οι υποψήφιοι host δημιουργούνται για τη διεπαφή WiFi, την κινητή σύνδεση LTE/5G και, εάν χρειαστεί, για σήραγγες VPN.
Οι υποψήφιοι host έχουν την υψηλότερη προτεραιότητα (2130706431 για UDP) και δοκιμάζονται πρώτοι. Εάν και οι δύο ομότιμοι κόμβοι βρίσκονται πίσω από NAT, οι υποψήφιοί τους host θα είναι ιδιωτικές διευθύνσεις (192.168.x.x, 10.x.x.x) και η άμεση σύνδεση μέσω αυτών είναι αδύνατη. Το ICE προχωρά στη δοκιμή υποψηφίων srflx και relay.
SRFLX (Server Reflexive) — είναι η εξωτερική διεύθυνση IP και η θύρα που λαμβάνονται από τον διακομιστή STUN. Όταν η συσκευή στέλνει ένα αίτημα STUN, ο διακομιστής βλέπει τη δημόσια διεύθυνσή της μετά το NAT και την επιστρέφει. Αυτός ο υποψήφιος επιτρέπει τη δημιουργία άμεσης σύνδεσης μεταξύ ομότιμων κόμβων πίσω από διαφορετικά NAT, εάν οι συσκευές NAT τους υποστηρίζουν Hairpinning.
PRFLX (Peer Reflexive) ανιχνεύεται δυναμικά όταν ένα αίτημα STUN από έναν ομότιμο κόμβο φτάνει σε μια απροσδόκητη διεύθυνση. Αυτός ο τύπος προκύπτει όταν και οι δύο ομότιμοι κόμβοι στέλνουν αιτήματα ταυτόχρονα και το NAT δημιουργεί μια προσωρινή σύνδεση. Ο υποψήφιος PRFLX έχει υψηλότερη προτεραιότητα από τον srflx, αλλά χαμηλότερη από τον host.
Σε εφαρμογές για κινητά, οι υποψήφιοι srflx είναι ιδιαίτερα σημαντικοί κατά την εναλλαγή μεταξύ WiFi και κινητού δικτύου. Όταν η συσκευή αλλάζει δίκτυο, η διεύθυνση IP αλλάζει και το ICE πρέπει να συλλέξει ξανά τους υποψηφίους. Αυτή η διαδικασία ονομάζεται ICE restart και απαιτεί εκ νέου αποστολή νέου SDP.
Υποψήφιος relay — είναι μια διεύθυνση στον διακομιστή TURN μέσω της οποίας η κίνηση αναμεταδίδεται από τον έναν ομότιμο κόμβο στον άλλο. Αυτός ο τύπος χρησιμοποιείται ως εφεδρική επιλογή όταν η άμεση σύνδεση P2P είναι αδύνατη (συμμετρικό NAT, εταιρικό τείχος προστασίας). Το κανάλι αναμετάδοσης προσθέτει καθυστέρηση και αυξάνει το φορτίο του διακομιστή, γι’ αυτό σε βέλτιστες ρυθμίσεις ο διακομιστής TURN χρησιμοποιείται μόνο για το 10–15% όλων των συνεδριών.
Δημοφιλείς υλοποιήσεις διακομιστών TURN: coturn (ανοιχτός κώδικας), Twilio Network Traversal, Metered TURN. Η επιλογή παρόχου TURN επηρεάζει την ποιότητα σύνδεσης πολυμέσων σε εφαρμογές για κινητά — ο διακομιστής πρέπει να βρίσκεται γεωγραφικά κοντά στους χρήστες για να ελαχιστοποιηθεί η πρόσθετη καθυστέρηση.
Η διαδικασία ICE — είναι ένα πολυσταδιακό πρωτόκολλο που εγγυάται τη δημιουργία αξιόπιστης σύνδεσης P2P υπό συνθήκες αβεβαιότητας της τοπολογίας δικτύου. Ο αλγόριθμος περιγράφεται στο RFC 8445 και περιλαμβάνει τέσσερις υποχρεωτικές φάσεις: συλλογή υποψηφίων, ταξινόμηση, δοκιμή και διορισμό.
Κάθε συσκευή συλλέγει όλες τις διαθέσιμες διευθύνσεις δικτύου. Για αυτό, η μηχανή WebRTC απαριθμεί τις τοπικές διεπαφές (host), στέλνει ένα αίτημα στον διακομιστή STUN (srflx) και ζητά διεύθυνση αναμετάδοσης από τον διακομιστή TURN (relay). Ταυτόχρονα, η συσκευή μπορεί να ανιχνεύσει έναν υποψήφιο prflx εάν λάβει ένα εισερχόμενο αίτημα STUN από τον ομότιμο κόμβο.
Στην ανάπτυξη για κινητά, αυτή η φάση είναι κρίσιμη για τον χρόνο δημιουργίας σύνδεσης. Σε iOS και Android, η συλλογή υποψηφίων μπορεί να διαρκέσει από 200 ms έως 2 δευτερόλεπτα, ανάλογα με την ταχύτητα δικτύου, τη διαθεσιμότητα διακομιστών STUN/TURN και τον αριθμό ενεργών διεπαφών δικτύου.
Αφού ληφθεί η λίστα υποψηφίων από τον απομακρυσμένο ομότιμο κόμβο μέσω του καναλιού σηματοδοσίας, η τοπική μηχανή ICE σχηματίζει όλα τα πιθανά ζεύγη υποψηφίων (τοπικός + απομακρυσμένος). Κάθε ζεύγος λαμβάνει προτεραιότητα σύμφωνα με τον τύπο από το RFC 8445, ο οποίος λαμβάνει υπόψη τις προτεραιότητες και των δύο υποψηφίων και την κατεύθυνση (incoming/outgoing).
Τα ζεύγη ταξινομούνται κατά φθίνουσα προτεραιότητα. Τα καλύτερα ζεύγη δοκιμάζονται πρώτα. Ο αλγόριθμος εγγυάται ότι το ζεύγος host-host θα ελεγχθεί νωρίτερα από host-srflx, host-relay ή relay-relay, ελαχιστοποιώντας την καθυστέρηση σύνδεσης σε απλές διαμορφώσεις δικτύου.
Το ICE στέλνει αιτήματα STUN-binding για κάθε ζεύγος υποψηφίων. Εάν ληφθεί απάντηση STUN — το ζεύγος είναι έγκυρο. Το πρώτο έγκυρο ζεύγος διορίζεται (nominated) ως κύριο. Η μηχανή WebRTC αρχίζει να μεταδίδει πολυμέσα μέσω αυτού του ζεύγους, ενώ τα υπόλοιπα ζεύγη συνεχίζουν να ελέγχονται σε περίπτωση αποτυχίας του κύριου.
Η διαδικασία δοκιμής μπορεί να διαρκέσει έως και αρκετά δευτερόλεπτα με μεγάλο αριθμό υποψηφίων. Το WebRTC χρησιμοποιεί χρονοδιακόπτες: για ζεύγη host ένας επιθετικός χρονοδιακόπτης (20 ms), για relay — ένας πιο συντηρητικός (200 ms). Οι προγραμματιστές εφαρμογών για κινητά μπορούν να επιταχύνουν τη σύνδεση περιορίζοντας τον αριθμό διακομιστών ICE ή διαμορφώνοντας το iceTransportPolicy.
ICE restart — είναι η επανεκκίνηση της διαδικασίας ICE χωρίς επαναδημιουργία ολόκληρου του RTCPeerConnection. Είναι απαραίτητο κατά την αλλαγή δικτύου, απώλεια σύνδεσης ή εναλλαγή μεταξύ WiFi και κινητού δικτύου. Κατά την επανεκκίνηση, όλοι οι τρέχοντες υποψήφιοι μηδενίζονται και η διαδικασία ξεκινά από την αρχή με τη δημιουργία νέου ufrag και pwd.
Στην ανάπτυξη iOS, η επανεκκίνηση ICE καλείται με τη μέθοδο restartIce() στο RTCPeerConnection. Στο Android χρησιμοποιείται παρόμοια μέθοδος στην κλάση PeerConnection από το Google WebRTC. Η σωστή διαχείριση του ICE restart — κρίσιμη απαίτηση για εφαρμογές που λειτουργούν σε κινητές συσκευές με ασταθή σύνδεση δικτύου.
STUN (Session Traversal Utilities for NAT) και TURN (Traversal Using Relays around NAT) — είναι βασικά στοιχεία διακομιστή χωρίς τα οποία το ICE Candidate δεν μπορεί να εγγυηθεί επιτυχή σύνδεση σε συνθήκες πραγματικού διαδικτύου. Η σωστή διαμόρφωσή τους επηρεάζει άμεσα την ποιότητα κλήσης σε εφαρμογές για κινητά.
Ο διακομιστής STUN επιτρέπει στη συσκευή να μάθει τη δημόσια διεύθυνση IP και τη θύρα που το NAT έχει εκχωρήσει για την εξερχόμενη σύνδεση. Το πρωτόκολλο STUN ορίζεται στο RFC 8489 και λειτουργεί μέσω UDP στη θύρα 3478, καθώς και υποστηρίζει TCP. Η Google παρέχει δημόσιους διακομιστές STUN (stun.l.google.com:19302) που μπορούν να χρησιμοποιηθούν δωρεάν.
Στην ανάπτυξη για κινητά, ένα αίτημα STUN — ελαφριά λειτουργία που διαρκεί 50–200 ms. Ωστόσο, ορισμένα εταιρικά και κινητά δίκτυα μπλοκάρουν την κίνηση UDP, αναγκάζοντας το ICE να χρησιμοποιεί TCP για επικοινωνία STUN ή να μεταβεί απευθείας σε TURN.
Διακομιστής TURN — είναι ένας αναμεταδότης κίνησης πολυμέσων. Όταν η άμεση σύνδεση P2P είναι αδύνατη (συμμετρικό NAT, τείχος προστασίας), η συσκευή στέλνει δεδομένα στο TURN, το οποίο τα προωθεί στον άλλο ομότιμο κόμβο. Το TURN είναι ένας αξιόπιστος αλλά δαπανηρός μηχανισμός: προσθέτει καθυστέρηση (30–100 ms) και απαιτεί εύρος ζώνης διακομιστή ίσο με το άθροισμα όλων των συνεδριών πολυμέσων.
Σύμφωνα με την Αναφορά Στατιστικών WebRTC (2025), περίπου 8–15% των συνεδριών WebRTC σε κινητά δίκτυα απαιτούν TURN. Για τη βελτιστοποίηση του κόστους κίνησης TURN, οι προγραμματιστές χρησιμοποιούν προκαταρκτική δοκιμή σύνδεσης και μόνο όταν αποτύχει το P2P ενεργοποιούν το κανάλι TURN.
Κατά την επιλογή υποδομής για ICE σε ένα έργο κινητού, λαμβάνονται υπόψη: η γεωγραφική θέση των διακομιστών για ελαχιστοποίηση καθυστέρησης, η υποστήριξη UDP και TCP, το κόστος κίνησης TURN και το SLA. Δημοφιλείς λύσεις: coturn για αυτόνομη εγκατάσταση, Twilio, Agora και LiveKit για χρήση στο cloud.
Για τους προγραμματιστές κινητών, η κατανόηση του ICE Candidate ξεπερνά τη θεωρία — είναι πρακτική αναγκαιότητα κατά τη δημιουργία εφαρμογών με φωνητικές και βιντεοκλήσεις. Οι πλατφόρμες iOS και Android παρέχουν εγγενή API για WebRTC που αυτοματοποιούν την εργασία με το ICE, αλλά ο προγραμματιστής είναι υπεύθυνος για τη διαμόρφωση των διακομιστών ICE και τον χειρισμό συμβάντων αλλαγής δικτύου.
Σε iOS, το WebRTC είναι διαθέσιμο μέσω του πλαισίου WebRTC.framework ή της βιβλιοθήκης GoogleWebRTC μέσω CocoaPods. Οι διακομιστές ICE διαμορφώνονται μέσω του πίνακα RTCIceServer στο RTCConfiguration:
let config = RTCConfiguration()
let stunServer = RTCIceServer(urlStrings: ["stun:stun.l.google.com:19302"])
let turnServer = RTCIceServer(urlStrings: ["turn:turn.example.com:3478"],
username: "user",
credential: "pass")
config.iceServers = [stunServer, turnServer]
let pc = RTCPeerConnection(configuration: config)
Μετά τη δημιουργία RTCPeerConnection και την κλήση offer() ή answer(), η μηχανή συλλέγει αυτόματα υποψηφίους ICE. Το συμβάν iceGatheringStateChange ειδοποιεί για αλλαγή της κατάστασης συλλογής, και το iceConnectionState — για την κατάσταση σύνδεσης.
Το Android χρησιμοποιεί την ίδια βιβλιοθήκη Google WebRTC. Οι διακομιστές ICE ορίζονται μέσω PeerConnection.RTCConfiguration. Ο προγραμματιστής μπορεί να διαχειριστεί την πολιτική ICE μέσω iceTransportsType — η λειτουργία relay επιβάλλει τη χρήση μόνο TURN, αυξάνοντας την αξιοπιστία αλλά και την καθυστέρηση:
val iceServers = listOf(
PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer(),
PeerConnection.IceServer.builder("turn:turn.example.com:3478")
.setUsername("user")
.setPassword("pass")
.createIceServer()
)
val config = PeerConnection.RTCConfiguration(iceServers)
config.iceTransportsType = PeerConnection.IceTransportsType.ALL
config.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE
Η παράμετρος bundlePolicy επηρεάζει τον αριθμό υποψηφίων ICE — η λειτουργία MAXBUNDLE συνενώνει όλες τις ροές πολυμέσων σε μία μεταφορά, μειώνοντας τον συνολικό αριθμό υποψηφίων και επιταχύνοντας τη σύνδεση.
Τα βασικά συμβάντα ICE που πρέπει να χειρίζεται ο προγραμματιστής: κατάσταση σύνδεσης ICE (ICE connection state), αλλαγή κατάστασης συλλογής (ICE gathering state) και ανίχνευση νέου υποψηφίου. Αφού το ICE ολοκληρώσει τη συλλογή και τη δοκιμή, η κατάστασή του μεταβαίνει σε connected ή completed.
Στα κινητά δίκτυα συμβαίνουν συχνά εναλλαγές μεταξύ WiFi και κινητής σύνδεσης. Κατά την αλλαγή δικτύου, το ICE πρέπει να εκτελέσει επανεκκίνηση, διαφορετικά η ροή πολυμέσων διακόπτεται. Οι προγραμματιστές υλοποιούν παρακολούθηση NetworkManager (iOS) ή ConnectivityManager (Android) για αυτόματη κλήση restartIce().
Η επιτυχημένη υλοποίηση ICE σε εφαρμογή κινητού περιλαμβάνει: επιλογή αξιόπιστων διακομιστών STUN/TURN, σωστό χειρισμό ICE restart κατά την αλλαγή δικτύου, διαμόρφωση iceConnectionState για εμφάνιση κατάστασης σύνδεσης στο UI και παρακολούθηση στατιστικών μέσω RTCStatsReport.
Συχνές Ερωτήσεις
ICE Candidate — είναι μια “δοκιμαστική διεύθυνση” για μια κλήση μέσω WebRTC. Φανταστείτε ότι πρέπει να καλέσετε έναν φίλο, αλλά δεν ξέρετε πού βρίσκεται. Προσπαθείτε να καλέσετε στο σπίτι (host), μέσω κοινών γνωστών (STUN) και μέσω ταχυμεταφορέα (TURN). Κάθε τέτοιος τρόπος είναι ένα ICE Candidate.
Η προδιαγραφή RFC 8445 διακρίνει τέσσερις τύπους: host (τοπική διεπαφή), srflx (εξωτερική διεύθυνση μέσω STUN), prflx (δυναμικός υποψήφιος από ομότιμο κόμβο) και relay (διεύθυνση σε διακομιστή TURN). Κάθε τύπος έχει τη δική του προτεραιότητα και μηχανισμό ανίχνευσης.
STUN βοηθά να μάθετε την εξωτερική σας διεύθυνση IP για σύνδεση P2P, αλλά δεν συμμετέχει στη μετάδοση δεδομένων. TURN — είναι ένας αναμεταδότης που μεταδίδει την κίνηση πολυμέσων μέσω του εαυτού του όταν η άμεση σύνδεση P2P είναι αδύνατη. Το TURN προσθέτει καθυστέρηση και καταναλώνει εύρος ζώνης διακομιστή.
Το ICE restart είναι απαραίτητο κατά αλλαγή δικτύου (εναλλαγή από WiFi σε κινητό διαδίκτυο), απώλεια σύνδεσης ή λήξη συνεδρίας. Κατά την επανεκκίνηση, όλοι οι τρέχοντες υποψήφιοι μηδενίζονται και το ICE ξεκινά τη συλλογή από την αρχή με νέα ufrag και pwd.
Στο WebRTC, χρησιμοποιήστε τη μέθοδο getStats() στο RTCPeerConnection που επιστρέφει RTCStatsReport με το πεδίο candidateType. Σε Android και iOS μπορείτε να λάβετε στατιστικά για τον ενεργό υποψήφιο ICE, τον τύπο του και το RTT για το επιλεγμένο ζεύγος.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.