Start · Sprachen · JavaScript · Referenz · RTCIceCandidate.protocol

RTCIceCandidate.protocol

Eigenschaft

Schreibgeschützter String, der angibt, ob ein ICE-Kandidat <code>"udp"</code> oder <code>"tcp"</code> als Transportprotokoll nutzt.

seit JavaScript Baseline: alle modernen Browser (Chrome 74+, Firef Kategorie: webapi

Signatur

RTCIceCandidate.protocol

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

Typ
"udp" | "tcp" | null
Beschreibung
"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);
host via udp: 3f1c…​.local:54321 srflx via udp: 203.0.113.7:54321 ICE-Sammlung abgeschlossen

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);
tcp active

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));
Aktives Protokoll: udp

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an protocol wird ignoriert (im Strict Mode gibt es einen TypeError). Wer das Protokoll ändern will, muss einen neuen Kandidaten mit einem angepassten candidate-String erzeugen.
  • Nicht mit TURN-Transport verwechseln: Bei Relay-Kandidaten beschreibt protocol den Transport zwischen TURN-Server und Gegenstelle, fast immer UDP. Ob der Client den TURN-Server per UDP, TCP oder TLS erreicht, steht in relayProtocol der Statistik-Einträge vom Typ local-candidate aus getStats().
  • Der Wert null kommt vor bei leeren Kandidaten-Strings (Ende-der-Kandidaten-Signal) und bei älteren Browsern, die das Parsen nicht unterstützen. Deshalb vor dem Zugriff immer auf null prü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 des candidate-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.