ICE is a standardized protocol for interactively establishing connections between peers possibly behind a NAT (the reason why there are multiple PCs in your network all using one global IP and why you need to forward a port). It does so by using the 2 protocols STUN and TURN.
To establish a connection ice does the following:
1. gather candidates (at which the other peer can reach me), adapter state: gathering
2. send candidates to other peer, adapter state: awaitingCandidates
3. build pairs of candidates, local <-> remote, and check which of them can be used for communication, adapter state: checking
4. succeed or fail
There are 3 (4) types of candidates: (which can be seen in the local/remote columns of the debug window)
1. Host candidate (and address on your local interface, will be used for LAN connection, sometimes in combination with srflx, this means a direct connection)
2. Srflx candidate (basically your global IP as seen by asking a STUN server, this means a direct connection, maybe involving hole punching)
(3. Prflx candidate )
4. Relay candidate (a public IP "borrowed" from a TURN server which can be used to communicate with other peers, this is as the name suggests a proxy connection)
If one of the 2 peers, local or remote is a relay candidate, the connection is effectively proxied, as the other peer will only be connecting directly (srflx/host) to a proxy which yields no benefit.