ICE (link) provides unreliable packet transport between two clients (p2p) or between a client and a server.
This documentation provides an overview of how ICE is implemented, i.e how the following classes interact.
-
cricket::IceTransportInternal
- is the interface that does ICE (manage ports, candidates, connections to send/receive packets). The interface is implemented bycricket::P2PTransportChannel
. -
cricket::PortInterface
Represents a local communication mechanism that can be used to create connections to similar mechanisms of the other client. There are 4 implementations ofcricket::PortInterface
cricket::UDPPort
,cricket::StunPort
,cricket::TcpPort
andcricket::TurnPort
. The ports share lots of functionality in a base class,cricket::Port
. -
cricket::Candidate
represents an address discovered by acricket::Port
. A candidate can be local (i.e discovered by a local port) or remote. Remote candidates are transported using signaling, i.e outside of webrtc. There are 4 types of candidates:local
,stun
,prflx
orrelay
(standard) -
cricket::Connection
provides the management of acricket::CandidatePair
, i.e for sending data between two candidates. It sends STUN Binding requests (aka STUN pings) to verify that packets can traverse back and forth and keep connections alive (both that NAT binding is kept, and that the remote peer still wants the connection to remain open). -
cricket::P2PTransportChannel
uses ancricket::PortAllocator
to create ports and discover local candidates. Thecricket::PortAllocator
is implemented bycricket::BasicPortAllocator
. -
cricket::P2PTransportChannel
uses ancricket::IceControllerInterface
to manage a set of connections. Thecricket::IceControllerInterface
decides whichcricket::Connection
to send data on.
This section describes a normal sequence of interactions to establish ice state completed link ( standard )
All of these steps are invoked by interactions with PeerConnection
.
-
P2PTransportChannel::MaybeStartGathering
This function is invoked as part ofPeerConnection::SetLocalDescription
.P2PTransportChannel
will use thecricket::PortAllocator
to create acricket::PortAllocatorSession
. Thecricket::PortAllocatorSession
will create local ports as configured, and the ports will start gathering candidates. -
IceTransportInternal::SignalCandidateGathered
When a port finds a local candidate, it will be added to a list oncricket::P2PTransportChannel
and signaled to application usingIceTransportInternal::SignalCandidateGathered
. A p2p application can then send them to peer using favorite transport mechanism whereas a client-server application will do nothing. -
P2PTransportChannel::AddRemoteCandidate
When the application get a remote candidate, it can add it usingPeerConnection::AddRemoteCandidate
(afterPeerConnection::SetRemoteDescription
has been called!), this will trickle down toP2PTransportChannel::AddRemoteCandidate
.P2PTransportChannel
will combine the remote candidate with all compatible local candidates to form newcricket::Connection
(s). Candidates are compatible if it is possible to send/receive data (e.g ipv4 can only send to ipv4, tcp can only connect to tcp etc...) The newly formedcricket::Connection
(s) will be added to thecricket::IceController
that will decide whichcricket::Connection
to send STUN ping on. -
P2PTransportChannel::SignalCandidatePairChanged
When a remote connection replies to a STUN ping,cricket::IceController
will instructP2PTransportChannel
to use the connection. This is signalled up the stack usingP2PTransportChannel::SignalCandidatePairChanged
. Note thatcricket::IceController
will continue to send STUN pings on the selected connection, as well as other connections. -
P2PTransportChannel::SignalIceTransportStateChanged
The initial selection of a connection makesP2PTransportChannel
signal up stack that state has changed, which may makecricket::DtlsTransportInternal
initiate a DTLS handshake (depending on the DTLS role).