Signatur
Beschreibung
Die Eigenschaft iceTransport eines RTCDtlsTransport gibt das RTCIceTransport-Objekt zurück, das unter der DTLS-Schicht liegt. DTLS sorgt für die Verschlüsselung (Schlüsselaustausch für SRTP und SCTP). ICE übernimmt den Verbindungsaufbau über Kandidatenpaare, also Host-, STUN- oder TURN-Verbindungen.
So kommst du an Laufzeitinformationen zur Netzwerkverbindung einer RTCPeerConnection: den ICE-Zustand (state), den Stand der Kandidatensammlung (gatheringState), die Rolle (role) und das aktuell gewählte Kandidatenpaar (getSelectedCandidatePair()). Das ist nützlich für Diagnosen, Verbindungsanzeigen oder Logik zum Umschalten zwischen Netzen.
An den RTCDtlsTransport selbst kommst du meist über RTCRtpSender.transport, RTCRtpReceiver.transport oder RTCSctpTransport.transport (bei Datenkanälen über pc.sctp). Mit Bundling (Standard: bundlePolicy: "max-bundle") teilen sich meist alle Sender und Empfänger denselben DTLS- und ICE-Transport.
Rückgabewert
RTCIceTransport-Objekt, das dieser DTLS-Transport nutzt. Die Eigenschaft ist schreibgeschützt, und die Referenz ändert sich während der Lebensdauer des Transports nicht.Beispiele
ICE-Zustand über den Sender abfragen
const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] });
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const sender = pc.addTrack(stream.getAudioTracks()[0], stream);
// transport ist erst nach setLocalDescription/setRemoteDescription gesetzt
await pc.setLocalDescription(await pc.createOffer());
const ice = sender.transport?.iceTransport;
console.log('ICE-Rolle:', ice?.role);
console.log('Sammelstatus:', ice?.gatheringState);
Wechsel des Kandidatenpaars überwachen
const watchIce = (dtlsTransport) => {
const ice = dtlsTransport.iceTransport;
ice.addEventListener('statechange', () => {
console.log('ICE-Zustand:', ice.state);
});
ice.onselectedcandidatepairchange = () => {
const pair = ice.getSelectedCandidatePair();
if (pair) {
console.log(`Lokal: ${pair.local.type} ${pair.local.address}`);
console.log(`Entfernt: ${pair.remote.type} ${pair.remote.address}`);
}
};
};
// z. B. nach erfolgreicher Verhandlung
const [sender] = pc.getSenders();
if (sender?.transport) watchIce(sender.transport);
ICE-Transport eines Datenkanals ermitteln
const pc = new RTCPeerConnection();
pc.createDataChannel('chat');
await pc.setLocalDescription(await pc.createOffer());
// Datenkanäle laufen über SCTP -> DTLS -> ICE
const ice = pc.sctp?.transport.iceTransport;
console.log(ice instanceof RTCIceTransport);
// Wichtig · Fallstricke
- Erst nach der Verhandlung verfügbar:
RTCRtpSender.transportundpc.sctpsindnull, bis eine lokale oder entfernte Beschreibung gesetzt wurde. Arbeite deshalb mit optionaler Verkettung (?.). - Bundling: Mit
max-bundleteilen sich alle Medien einen Transport. Wenn du Event-Listener auf jedem Sender registrierst, reagierst du also mehrfach auf dasselbe Objekt. - Nicht mit
pc.iceConnectionStateverwechseln: Dieser Wert fasst alle ICE-Transporte zusammen, währendiceTransport.statenur einen einzelnen Transport betrifft. - Kompatibilität:
RTCDtlsTransportundRTCIceTransportwerden von Chrome, Edge und Safari schon länger unterstützt, von Firefox erst seit Version 122 vollständig. Ältere Browser liefern beisender.transporteventuellundefined. Für robuste Diagnosen eignet sich zusätzlichpc.getStats(). - Datenschutz:
getSelectedCandidatePair()kann lokale und öffentliche IP-Adressen verraten. Gib sie nicht ungefiltert an Dritte weiter oder in Protokolle aus.