Signatur
Beschreibung
Die schreibgeschützte Eigenschaft relatedPort eines RTCIceCandidate enthält die Portnummer, die zum verwandten Kandidaten gehört. Sie entspricht dem Feld rport in der SDP-Zeile a=candidate:… und tritt immer zusammen mit relatedAddress (raddr) auf.
Welche Bedeutung der Wert hat, hängt vom Kandidatentyp (RTCIceCandidate.type) ab:
host: Kein verwandter Kandidat vorhanden,relatedPortistnull.srflx(server-reflexiv) undprflx(peer-reflexiv): Port des lokalen Host-Kandidaten (Basis), von dem die über STUN ermittelte öffentliche Adresse abgeleitet wurde.relay: Port der gemappten (reflexiven) Adresse, die der TURN-Server für die Allokation gesehen hat.
Für den Verbindungsaufbau selbst spielt relatedPort keine Rolle. ICE nutzt ihn nicht zur Auswahl der Kandidatenpaare. Nützlich ist er vor allem bei der Diagnose, etwa um NAT-Verhalten zu untersuchen, Port-Mappings nachzuvollziehen oder zu prüfen, ob STUN- bzw. TURN-Server korrekt antworten.
Rückgabewert
null, wenn es keinen gibt (z. B. bei host-Kandidaten) oder der Browser den Wert nicht offenlegt.Beispiele
Gesammelte ICE-Kandidaten mit verwandtem Port 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;
}
const { type, address, port, relatedAddress, relatedPort } = candidate;
console.log(`${type}: ${address}:${port} ← abgeleitet von ${relatedAddress ?? '-'}:${relatedPort ?? '-'}`);
});
// Ein Datenkanal genügt, um die Kandidatensammlung zu starten
pc.createDataChannel('probe');
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
Kandidat aus SDP-String erzeugen und rport auslesen
const candidate = new RTCIceCandidate({
candidate: 'candidate:842163049 1 udp 1677729535 203.0.113.7 61022 typ srflx raddr 192.168.1.20 rport 54400',
sdpMid: '0',
sdpMLineIndex: 0
});
console.log(candidate.type); // Typ des Kandidaten
console.log(candidate.port); // öffentlicher Port
console.log(candidate.relatedPort); // lokaler Basis-Port
Port-Mapping des NAT analysieren
const analysePortMapping = (candidate) => {
if (candidate.type !== 'srflx' || candidate.relatedPort == null) return null;
if (candidate.relatedPort === 0) return 'Basis-Port wird vom Browser verborgen';
return candidate.port === candidate.relatedPort
? 'NAT behält den Port bei (port-preserving)'
: `NAT übersetzt Port ${candidate.relatedPort} → ${candidate.port}`;
};
const c = new RTCIceCandidate({
candidate: 'candidate:1 1 udp 1677729535 198.51.100.4 40001 typ srflx raddr 10.0.0.5 rport 50000',
sdpMid: '0'
});
console.log(analysePortMapping(c));
// Wichtig · Fallstricke
- Datenschutz: Um keine internen Netzwerkdetails preiszugeben, maskieren viele Browser (vor allem Chrome) bei lokal gesammelten
srflx-Kandidaten die verwandte Adresse als0.0.0.0und den Port als0. Verlasse dich deshalb nicht darauf, dass ein echter lokaler Port geliefert wird. nullprüfen: Beihost-Kandidaten und bei Kandidaten ohnerportim SDP-String ist der Wertnull. Prüfe daher mit== nullbzw.??und nicht nur auf „falsy“, denn auch0ist ein möglicher Wert.- Schreibgeschützt: Eine Zuweisung hat keine Wirkung. Der Wert stammt ausschließlich aus dem
candidate-String, der beim Erzeugen übergeben wurde. - Kompatibilität: Chromium-Browser und Safari unterstützen die Eigenschaft seit Längerem, Firefox erst in neueren Versionen. In älteren Browsern ist sie
undefined. Dann lässt sichrportnur durch Parsen voncandidate.candidategewinnen. - Für die ICE-Verbindung selbst hat der Wert keine Bedeutung. Er dient nur der Diagnose und Statistik.