Signatur
Beschreibung
Die schreibgeschützte Eigenschaft transport eines RTCRtpReceiver verweist auf das RTCDtlsTransport-Objekt, über das der Empfänger die RTP-Pakete (Real-time Transport Protocol) seiner Medienspur und die zugehörigen RTCP-Steuerpakete empfängt. Über dieses Objekt lässt sich der Zustand der verschlüsselten DTLS-Verbindung auslesen, und man kommt über transport.iceTransport an die darunterliegende ICE-Ebene.
Typische Anwendungsfälle sind die Verbindungsdiagnose (z. B. „Ist die DTLS-Verbindung aufgebaut oder fehlgeschlagen?“), das Auslesen der Zertifikate der Gegenstelle mit getRemoteCertificates() und die Überwachung des ausgewählten ICE-Kandidatenpaars, etwa um zu erkennen, ob die Verbindung über einen TURN-Relay läuft.
Der Wert ist null, solange noch keine Remote-Beschreibung angewendet und damit kein Transport ausgehandelt wurde. Mit der üblichen Bündelungsrichtlinie bundlePolicy: "max-bundle" teilen sich meist alle Sender und Empfänger einer RTCPeerConnection denselben Transport.
Rückgabewert
RTCDtlsTransport-Objekt, über das der Empfänger Medien empfängt, oder null, wenn noch kein Transport ausgehandelt wurde.Beispiele
DTLS-Zustand eines eingehenden Tracks überwachen
const pc = new RTCPeerConnection();
pc.addEventListener('track', ({ receiver, track }) => {
const dtls = receiver.transport;
if (!dtls) {
console.log('Noch kein Transport ausgehandelt');
return;
}
console.log(`${track.kind}: DTLS-Zustand =`, dtls.state);
dtls.addEventListener('statechange', () => {
console.log('DTLS-Zustand geändert:', dtls.state);
if (dtls.state === 'failed') {
console.warn('Verschlüsselte Verbindung fehlgeschlagen');
}
});
});
Ausgewähltes ICE-Kandidatenpaar ermitteln (TURN erkennen)
const logCandidatePair = (receiver) => {
const ice = receiver.transport?.iceTransport;
if (!ice) return;
ice.addEventListener('selectedcandidatepairchange', () => {
const pair = ice.getSelectedCandidatePair();
if (!pair) return;
console.log('Lokal:', pair.local.type, pair.local.protocol);
console.log('Remote:', pair.remote.type, pair.remote.address);
if (pair.local.type === 'relay') {
console.log('Verbindung läuft über einen TURN-Server');
}
});
};
// Nach setRemoteDescription():
pc.getReceivers().forEach(logCandidatePair);
Zertifikat-Fingerprint der Gegenstelle prüfen
const showRemoteCertificates = async (pc) => {
const [receiver] = pc.getReceivers();
const dtls = receiver?.transport;
if (dtls?.state !== 'connected') {
console.log('DTLS noch nicht verbunden');
return;
}
const certs = dtls.getRemoteCertificates(); // ArrayBuffer[] (DER)
for (const der of certs) {
const hash = await crypto.subtle.digest('SHA-256', der);
const hex = [...new Uint8Array(hash)]
.map((b) => b.toString(16).padStart(2, '0'))
.join(':');
console.log('SHA-256:', hex);
}
};
Prüfen, ob alle Empfänger denselben Transport nutzen
const transports = new Set(
pc.getReceivers().map((r) => r.transport).filter(Boolean)
);
console.log('Anzahl DTLS-Transporte:', transports.size);
// Wichtig · Fallstricke
- Kann
nullsein: VorsetRemoteDescription()bzw. vor der Aushandlung existiert noch kein Transport – immer mit optionaler Verkettung (receiver.transport?.state) zugreifen. - Geteilte Transporte: Bei aktiver Bündelung (Standard in modernen Browsern) liefern mehrere Empfänger dasselbe Objekt. Ein
statechange-Listener pro Empfänger meldet deshalb dasselbe Ereignis mehrfach. - Das Objekt kann sich ändern: Nach einer Neuaushandlung kann
transportauf ein anderesRTCDtlsTransportverweisen. Referenzen also nicht dauerhaft zwischenspeichern. - Veraltet: Die früher spezifizierte Eigenschaft
rtcpTransportwurde entfernt; RTCP wird heute per RTCP-Mux über denselben Transport geführt. - Kompatibilität: Chrome/Edge seit 72, Safari seit 12.1, Firefox erst seit Version 110. In älteren Firefox-Versionen ist die Eigenschaft
undefined– Feature-Erkennung mit'transport' in RTCRtpReceiver.prototype. - Datenschutz: Über
iceTransportlassen sich IP-Adressen der Kandidaten auslesen. Solche Informationen nicht ungefiltert protokollieren oder an Dritte senden.