Start · Sprachen · JavaScript · Referenz · RTCIceCandidate.relatedPort

RTCIceCandidate.relatedPort

Eigenschaft

Liefert bei abgeleiteten ICE-Kandidaten (reflexiv oder Relais) die Portnummer des Kandidaten, von dem sie abgeleitet sind, sonst <code>null</code>.

seit JavaScript WebRTC 1.0 – Chrome, Edge, Safari; Firefox erst in Kategorie: webapi

Signatur

RTCIceCandidate.relatedPort

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, relatedPort ist null.
  • srflx (server-reflexiv) und prflx (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

Typ
number | null
Beschreibung
Ganzzahlige Portnummer (0–65535) des verwandten Kandidaten oder 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);
host: abc123.local:54400 ← abgeleitet von -:- srflx: 203.0.113.7:61022 ← abgeleitet von 0.0.0.0:0 ICE-Sammlung abgeleitet abgeschlossen

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
srflx 61022 54400

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));
NAT übersetzt Port 50000 → 40001

// Wichtig · Fallstricke

  • Datenschutz: Um keine internen Netzwerkdetails preiszugeben, maskieren viele Browser (vor allem Chrome) bei lokal gesammelten srflx-Kandidaten die verwandte Adresse als 0.0.0.0 und den Port als 0. Verlasse dich deshalb nicht darauf, dass ein echter lokaler Port geliefert wird.
  • null prüfen: Bei host-Kandidaten und bei Kandidaten ohne rport im SDP-String ist der Wert null. Prüfe daher mit == null bzw. ?? und nicht nur auf „falsy“, denn auch 0 ist 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 sich rport nur durch Parsen von candidate.candidate gewinnen.
  • Für die ICE-Verbindung selbst hat der Wert keine Bedeutung. Er dient nur der Diagnose und Statistik.