Signatur
Beschreibung
Die Eigenschaft foundation eines RTCIceCandidate liefert eine Kennung, die für alle Kandidaten gleich ist, die denselben Typ haben, von derselben Basis-IP-Adresse (Host-Interface) stammen, dasselbe Transportprotokoll verwenden und über denselben STUN- bzw. TURN-Server ermittelt wurden. Sie entspricht dem ersten Feld des a=candidate:-Attributs im SDP (z. B. candidate:842163049 1 udp …, dort ist 842163049 die Foundation).
Der ICE-Agent nutzt die Foundation intern für den Frozen-Algorithmus: Kandidatenpaare mit gleicher Foundation werden bei Verbindungsprüfungen gemeinsam behandelt, damit ein erfolgreicher Pfad nicht für jede Komponente oder jeden Media-Stream erneut getestet werden muss. Für Anwendungscode ist der Wert vor allem zur Diagnose und Gruppierung nützlich – etwa um zu erkennen, welche RTP- und RTCP-Kandidaten (Komponente 1 und 2) oder welche Kandidaten verschiedener Transporte auf demselben Netzwerkpfad beruhen.
Der Wert ist eine undurchsichtige Zeichenkette (maximal 32 Zeichen laut ICE-Spezifikation); man sollte nur auf Gleichheit vergleichen und keine Bedeutung aus dem Inhalt ableiten. Wurde der Kandidat aus einer Zeichenkette erzeugt, die sich nicht parsen lässt, ist der Wert null.
Rückgabewert
null, wenn sie nicht aus der Kandidaten-Beschreibung ermittelt werden konnte.Beispiele
Foundation eines manuell erzeugten Kandidaten auslesen
const candidate = new RTCIceCandidate({
candidate: 'candidate:842163049 1 udp 1677729535 203.0.113.5 46154 typ srflx raddr 192.168.1.10 rport 46154',
sdpMid: '0',
sdpMLineIndex: 0
});
console.log(candidate.foundation);
console.log(candidate.type, candidate.protocol);
Lokale Kandidaten nach Foundation gruppieren
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
});
const gruppen = new Map();
pc.addEventListener('icecandidate', ({ candidate }) => {
if (!candidate) {
// Sammeln abgeschlossen
for (const [foundation, liste] of gruppen) {
console.log(foundation, liste.map(c => `${c.type}/${c.component}`));
}
return;
}
const key = candidate.foundation ?? 'unbekannt';
if (!gruppen.has(key)) gruppen.set(key, []);
gruppen.get(key).push(candidate);
});
pc.createDataChannel('test');
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
Prüfen, ob zwei Kandidaten denselben Netzwerkpfad nutzen
const gleicherPfad = (a, b) =>
a.foundation !== null && a.foundation === b.foundation;
const rtp = new RTCIceCandidate({
candidate: 'candidate:1 1 udp 2122260223 192.168.1.10 50000 typ host',
sdpMid: '0'
});
const rtcp = new RTCIceCandidate({
candidate: 'candidate:1 2 udp 2122260222 192.168.1.10 50001 typ host',
sdpMid: '0'
});
console.log(gleicherPfad(rtp, rtcp));
// Wichtig · Fallstricke
- Nur Gleichheitsvergleich: Die Foundation ist eine undurchsichtige Kennung. Keine Annahmen über Format, Länge oder numerischen Inhalt treffen – verschiedene Browser erzeugen unterschiedliche Werte.
- Kein globaler Bezeichner: Gleiche Foundations bei lokalem und entferntem Kandidaten haben keine Bedeutung; sinnvoll ist der Vergleich nur innerhalb derselben Seite (lokal bzw. remote).
nullmöglich: Bei leeren Kandidaten (Ende-des-Sammelns-Signal mitcandidate: '') oder unparsbaren Strings ist der Wertnull.- Schreibgeschützt: Eine Zuweisung wird ignoriert (im Strict Mode
TypeError). Ändern lässt sich die Foundation nur, indem ein neuer Kandidat mit anderemcandidate-String erzeugt wird. - Kompatibilität: Chromium-Browser und Safari unterstützen die Eigenschaft vollständig; ältere Firefox-Versionen lieferten die geparsten Einzelfelder (
foundation,typeusw.) nicht, dort musste dercandidate-String manuell geparst werden. - Datenschutz: Kandidaten können lokale IP-Adressen offenlegen; moderne Browser verschleiern Host-Adressen per mDNS (
.local). Kandidatendaten nicht unnötig protokollieren oder an Dritte senden.