Step 0 of 0
// Current step
Press Play to begin
Before two browsers can exchange media they must agree on a network path. ICE is the process of listing every possible path, testing them all, and picking the best one that works. Each possible path is called a candidate.
See your own candidates right now The ICE Candidate Inspector gathers real candidates from your browser and shows your NAT situation.
Open ICE inspector →
host
An address on one of your own network interfaces: Wi-Fi, Ethernet, or a VPN adapter. Highest priority because a direct LAN path is fastest and free.
srflx
Server reflexive. Your public address as seen by a STUN server. This is what lets two peers on different networks reach each other.
relay
An address allocated on a TURN server. Lowest priority because every packet costs bandwidth and adds latency, so ICE only uses it as a last resort.
prflx
Peer reflexive. Discovered during connectivity checks when a peer arrives from an address nobody predicted. Rare, but it happens with some NATs.
.local addresses
Browsers hide your private LAN IP behind a random mDNS name like a1b2c3.local so websites cannot fingerprint your network. This is normal, not a bug.
Trickle ICE
Rather than waiting for all candidates, browsers send each one the moment it is found. This is why calls connect in a second instead of ten.

What is an ICE candidate?

When your browser wants to connect to another browser, it does not know in advance which network path will work. So it does something pragmatic: it lists every path it can possibly imagine, sends that list to the other side, and then both ends test all the combinations until one succeeds. Each entry in that list is an ICE candidate, and ICE stands for Interactive Connectivity Establishment.

A raw candidate looks like this: candidate:1 1 UDP 2122260223 192.168.1.20 54321 typ host. The important part is at the end. The typ field tells you which kind of candidate it is, and that single word explains most WebRTC connection problems.

host candidates

A host candidate is an address on one of your device's own interfaces. If you are on Wi-Fi it might be 192.168.1.20. These have the highest priority because if both peers are on the same network, a direct local path is the fastest possible route and costs nothing. In a modern browser you will usually see something like a1b2c3d4.local instead of the real IP, because browsers now hide private addresses behind mDNS names to stop websites fingerprinting your home network.

srflx candidates

Server reflexive candidates come from asking a STUN server what your public address looks like from outside. This is the candidate that makes internet calls possible, because it is an address the other peer can actually route to. If you gather no srflx candidates at all, STUN is blocked or unreachable and direct connections from that network will fail.

relay candidates

Relay candidates are addresses allocated on a TURN server. They only appear if you configured TURN with working credentials. They have the lowest priority in ICE because every media packet has to travel through that server, which costs you bandwidth and adds a hop of latency. ICE treats relay as the fallback of last resort, which is exactly right.

How ICE picks a winner

Once both sides have exchanged candidates, ICE forms every possible pairing of local and remote candidates and runs connectivity checks on them, in priority order. Each check is a STUN request sent along that path. If a reply comes back, the pair works. ICE keeps the highest priority pair that succeeded and nominates it, and media starts flowing. Everything else is discarded. This is why a call can take a moment to connect: it is quietly trying many paths at once.

This diagram is part of Sazrika Foundation. Gather your real candidates with the ICE Candidate Inspector, read the companion diagram on STUN vs TURN, or decode an offer with the SDP Analyzer.