Signatur
Beschreibung
Die Eigenschaft protocol eines RTCIceCandidate gibt an, über welches Transportprotokoll der Kandidat erreichbar ist. Möglich sind die Werte "udp" und "tcp". Der Wert wird aus dem Kandidaten-String (candidate) geparst, also dem a=candidate-Attribut aus dem SDP.
WebRTC bevorzugt UDP, weil es für Echtzeit-Medien weniger Verzögerung hat. TCP-Kandidaten werden vor allem in restriktiven Netzwerken genutzt, etwa hinter Firewalls, die UDP blockieren. Bei TCP-Kandidaten gibt zusätzlich tcpType an, ob es sich um einen aktiven, passiven oder Simultaneous-Open-Kandidaten ("active", "passive", "so") handelt.
In der Praxis braucht man protocol zur Fehlersuche bei Verbindungsproblemen, für Statistiken oder um Kandidaten gezielt zu filtern. Ein Beispiel wäre, in einer Testumgebung nur UDP-Kandidaten an die Gegenstelle zu schicken.
Rückgabewert
"udp" oder "tcp". Wenn der Kandidaten-String sich nicht parsen lässt oder leer ist (Ende-der-Kandidaten-Signal), ist der Wert null.Beispiele
Protokoll gesammelter Kandidaten protokollieren
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
});
pc.addEventListener('icecandidate', ({ candidate }) => {
if (!candidate) {
console.log('ICE-Sammlung abgeschlossen');
return;
}
console.log(`${candidate.type} via ${candidate.protocol}: ${candidate.address}:${candidate.port}`);
});
// Datenkanal anlegen, damit ICE-Sammlung startet
pc.createDataChannel('test');
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
Kandidat aus einem SDP-String parsen
const candidate = new RTCIceCandidate({
candidate: 'candidate:842163049 1 tcp 1518280447 192.168.1.20 9 typ host tcptype active',
sdpMid: '0',
sdpMLineIndex: 0
});
console.log(candidate.protocol);
console.log(candidate.tcpType);
Nur UDP-Kandidaten an die Gegenstelle senden
const pc = new RTCPeerConnection();
const signaling = new WebSocket('wss://example.com/signal');
pc.onicecandidate = ({ candidate }) => {
// Ende-Signal immer weiterleiten
if (candidate && candidate.protocol !== 'udp') return;
signaling.send(JSON.stringify({ type: 'candidate', candidate }));
};
Protokoll des aktiven Kandidatenpaars über getStats ermitteln
const getActiveProtocol = async (pc) => {
const stats = await pc.getStats();
for (const report of stats.values()) {
if (report.type === 'candidate-pair' && report.nominated && report.state === 'succeeded') {
const local = stats.get(report.localCandidateId);
return local?.protocol ?? null;
}
}
return null;
};
console.log('Aktives Protokoll:', await getActiveProtocol(pc));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
protocolwird ignoriert (im Strict Mode gibt es einenTypeError). Wer das Protokoll ändern will, muss einen neuen Kandidaten mit einem angepasstencandidate-String erzeugen. - Nicht mit TURN-Transport verwechseln: Bei Relay-Kandidaten beschreibt
protocolden Transport zwischen TURN-Server und Gegenstelle, fast immer UDP. Ob der Client den TURN-Server per UDP, TCP oder TLS erreicht, steht inrelayProtocolder Statistik-Einträge vom Typlocal-candidateausgetStats(). - Der Wert
nullkommt vor bei leeren Kandidaten-Strings (Ende-der-Kandidaten-Signal) und bei älteren Browsern, die das Parsen nicht unterstützen. Deshalb vor dem Zugriff immer aufnullprüfen. - Kompatibilität: Firefox unterstützt die Eigenschaft seit Version 68, Chrome seit 74. In älteren Versionen ist sie
undefined. Als Rückfall kann man das dritte Feld descandidate-Strings selbst auslesen. - Datenschutz: Kandidaten enthalten Netzwerkinformationen. Moderne Browser verschleiern lokale Host-Adressen mit mDNS-Namen (
*.local). Kandidaten sollten nicht ungefiltert protokolliert oder an Dritte weitergegeben werden.