Start · Sprachen · JavaScript · Referenz · RTCIceCandidateStats.address

RTCIceCandidateStats.address

Eigenschaft

Liefert die IP-Adresse (IPv4/IPv6) oder einen mDNS-Hostnamen des ICE-Kandidaten, den ein <code>RTCIceCandidateStats</code>-Bericht beschreibt.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (seit ca. Kategorie: webapi

Signatur

RTCIceCandidateStats.address

Beschreibung

Die Eigenschaft address gehört zum Wörterbuch RTCIceCandidateStats. Dieses taucht in den Statistikberichten von RTCPeerConnection.getStats() als Einträge mit dem type "local-candidate" oder "remote-candidate" auf. address enthält die Netzwerkadresse des Kandidaten als Zeichenkette, also eine IPv4-Adresse wie "192.0.2.10", eine IPv6-Adresse oder einen vollqualifizierten Domainnamen.

Welche Adresse drinsteht, hängt vom candidateType ab. Bei "host"-Kandidaten ist es die lokale Schnittstellenadresse. Bei "srflx" ist es die öffentliche Adresse, die ein STUN-Server gemeldet hat. Bei "relay" ist es die Adresse auf dem TURN-Server. Zusammen mit port, protocol und candidateType lässt sich damit prüfen, über welchen Weg eine Verbindung tatsächlich läuft, etwa ob ein TURN-Relay benutzt wird.

Typische Einsatzfälle sind Diagnose-Oberflächen, Verbindungs-Logging und Fehlersuche bei NAT- und Firewall-Problemen. Den gerade aktiven Kandidaten findet man über das RTCIceCandidatePairStats-Objekt, das zum Transport gehört (selectedCandidatePairId). Dessen localCandidateId bzw. remoteCandidateId verweisen auf die passenden Kandidaten-Berichte.

Die Eigenschaft ist nur lesbar. Aus Datenschutzgründen kann sie leer sein, fehlen (undefined) oder statt einer echten IP einen verschleierten mDNS-Namen der Form "xxxxxxxx-xxxx-….local" enthalten.

Rückgabewert

Typ
string | null | undefined
Beschreibung
Die IP-Adresse oder der Hostname des Kandidaten. Kann null/undefined sein oder einen mDNS-Namen (*.local) enthalten, wenn der Browser die echte Adresse aus Datenschutzgründen verbirgt.

Beispiele

Alle lokalen und entfernten Kandidaten auflisten

const listCandidates = async (pc) => {
  const stats = await pc.getStats();
  stats.forEach((report) => {
    if (report.type === 'local-candidate' || report.type === 'remote-candidate') {
      console.log(
        `${report.type}: ${report.candidateType} ${report.protocol} ` +
        `${report.address ?? '(verborgen)'}:${report.port}`
      );
    }
  });
};

// Aufruf nach dem Verbindungsaufbau
await listCandidates(peerConnection);
local-candidate: host udp 3b1e9f2a-7c4d-4e11-9a2b-1f0c5d6e7a8b.local:54321 local-candidate: srflx udp 203.0.113.42:54321 remote-candidate: host udp 198.51.100.7:60000

Adresse des aktiv genutzten Kandidatenpaars ermitteln

const getActiveAddresses = async (pc) => {
  const stats = await pc.getStats();
  let pair;

  stats.forEach((r) => {
    if (r.type === 'transport' && r.selectedCandidatePairId) {
      pair = stats.get(r.selectedCandidatePairId);
    }
  });
  // Fallback für Browser ohne selectedCandidatePairId (z. B. Firefox)
  if (!pair) {
    stats.forEach((r) => {
      if (r.type === 'candidate-pair' && r.nominated && r.state === 'succeeded') pair = r;
    });
  }
  if (!pair) return null;

  const local = stats.get(pair.localCandidateId);
  const remote = stats.get(pair.remoteCandidateId);
  return {
    local: `${local.address}:${local.port} (${local.candidateType})`,
    remote: `${remote.address}:${remote.port} (${remote.candidateType})`
  };
};

console.log(await getActiveAddresses(peerConnection));
{ local: '203.0.113.42:54321 (srflx)', remote: '198.51.100.7:60000 (host)' }

Erkennen, ob die Verbindung über einen TURN-Server läuft

const isRelayed = async (pc) => {
  const stats = await pc.getStats();
  for (const r of stats.values()) {
    if (r.type === 'candidate-pair' && r.nominated && r.state === 'succeeded') {
      const local = stats.get(r.localCandidateId);
      if (local?.candidateType === 'relay') {
        console.log(`Relay über TURN-Adresse ${local.address}`);
        return true;
      }
    }
  }
  return false;
};

console.log(await isRelayed(peerConnection));
Relay über TURN-Adresse 192.0.2.200 true

// Wichtig · Fallstricke

  • Datenschutz: Moderne Browser ersetzen lokale Host-Adressen standardmäßig durch mDNS-Namen (*.local), damit private IPs nicht nach außen gelangen. Echte lokale IPs sieht man meist erst, wenn die Seite Kamera- oder Mikrofonrechte hat, und selbst dann nicht in jedem Browser.
  • Kann fehlen: Je nach Browser und Kandidatentyp ist address undefined oder null. Deshalb immer absichern, z. B. mit ??.
  • Veralteter Name: Ältere Implementierungen nutzten ip bzw. ipAddress statt address. Wer alte Browser unterstützen muss, fragt ab: report.address ?? report.ip.
  • Sicherheit: Adressen der Gegenstelle sind personenbezogene Daten (IP-Adressen). Beim Logging oder beim Senden an Telemetrie-Server die DSGVO beachten und die Adressen gegebenenfalls anonymisieren.
  • Die Statistiken sind Momentaufnahmen. Für aktuelle Werte getStats() erneut aufrufen.