Signatur
Beschreibung
Die Eigenschaft dtlsState gehört zu einem RTCTransportStats-Objekt. Solche Objekte liefert RTCPeerConnection.getStats() als Einträge mit type === "transport". Der Wert zeigt, in welchem Zustand sich der DTLS-Handshake des Transports gerade befindet. Über DTLS werden die Schlüssel für SRTP (Audio/Video) und die Verschlüsselung von SCTP (DataChannels) ausgehandelt.
Mögliche Werte entsprechen der Enumeration RTCDtlsTransportState:
"new": Der DTLS-Handshake hat noch nicht begonnen."connecting": Der Handshake läuft gerade, einschließlich der Prüfung des Fingerabdrucks."connected": Der Handshake ist abgeschlossen und der Fingerabdruck wurde bestätigt."closed": Der Transport wurde ordnungsgemäß geschlossen (close_notify)."failed": Fehler beim Handshake, eine Fatal-Alert-Meldung oder eine falsche Prüfung des Fingerabdrucks.
Nützlich ist die Eigenschaft vor allem für Diagnose und Monitoring. Mit ihr lässt sich unterscheiden, ob eine Verbindung auf ICE-Ebene (iceState) oder erst bei der Verschlüsselung (DTLS) scheitert. Neben dtlsState geben die Transport-Statistiken oft auch tlsVersion, dtlsCipher, srtpCipher und dtlsRole an.
Rückgabewert
RTCDtlsTransportState, der den DTLS-Zustand zum Zeitpunkt der Statistik-Abfrage beschreibt.Beispiele
DTLS-Zustand aus getStats() auslesen
const logDtlsState = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === "transport") {
console.log(`Transport ${stats.id}: DTLS = ${stats.dtlsState}`);
}
});
};
// Aufruf nach erfolgreichem Verbindungsaufbau
await logDtlsState(peerConnection);
Verbindungsdiagnose: ICE vs. DTLS unterscheiden
const diagnose = async (pc) => {
const report = await pc.getStats();
const transport = [...report.values()].find((s) => s.type === "transport");
if (!transport) return "Kein Transport vorhanden";
if (transport.dtlsState === "failed") {
return "DTLS-Handshake fehlgeschlagen – Zertifikat/Fingerabdruck prüfen";
}
if (transport.dtlsState === "connected") {
return `Verschlüsselt: ${transport.tlsVersion ?? "?"}, SRTP: ${transport.srtpCipher ?? "?"}`;
}
return `DTLS noch im Zustand "${transport.dtlsState}"`;
};
console.log(await diagnose(peerConnection));
Periodisches Monitoring mit Zustandswechsel-Erkennung
const watchDtls = (pc, intervalMs = 2000) => {
let last;
const timer = setInterval(async () => {
if (pc.connectionState === "closed") return clearInterval(timer);
const report = await pc.getStats();
for (const s of report.values()) {
if (s.type === "transport" && s.dtlsState !== last) {
console.log(`DTLS: ${last ?? "-"} → ${s.dtlsState}`);
last = s.dtlsState;
}
}
}, intervalMs);
return () => clearInterval(timer);
};
const stop = watchDtls(peerConnection);
// Wichtig · Fallstricke
- Nur eine Momentaufnahme: Der Wert gilt nur für den Zeitpunkt, zu dem
getStats()aufgerufen wurde. Wer auf Änderungen sofort reagieren will, verwendet stattdessen das EreignisstatechangevonRTCDtlsTransport(erreichbar übersender.transport) oderconnectionstatechangederRTCPeerConnection. - Mehrere Transporte: Ohne Bundling (
bundlePolicy≠"max-bundle") kann es mehreretransport-Einträge geben. Deshalb immer alle Einträge durchlaufen und nicht nur den ersten nehmen. - Browser-Kompatibilität: Wie die Transport-Statistiken umgesetzt sind, unterscheidet sich zwischen den Engines. Firefox hat
transport-Einträge lange nicht oder nur unvollständig geliefert. Prüfe deshalb vor der Nutzung, ob die Eigenschaft vorhanden ist (stats.dtlsState ?? "unbekannt"). - Fehlersuche bei
"failed": Häufige Ursachen sind ein falschera=fingerprintin der SDP (etwa weil die SDP unterwegs verändert wurde), abgelaufene Zertifikate ausRTCPeerConnection.generateCertificate()oder Middleboxen, die UDP-Pakete verwerfen.