Start · Sprachen · JavaScript · Referenz · RTCIceCandidate.port

RTCIceCandidate.port

Eigenschaft

Schreibgeschützte Portnummer (<code>number</code> oder <code>null</code>), unter der der ICE-Kandidat an der Adresse aus <code>RTCIceCandidate.address</code> erreichbar ist.

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

Signatur

RTCIceCandidate.port

Beschreibung

Die Eigenschaft port eines RTCIceCandidate enthält die Portnummer des Transportendpunkts, den der Kandidat beschreibt. Zusammen mit address und protocol ergibt sie die vollständige Netzwerkadresse, über die ein Peer erreichbar ist. Der Wert wird aus dem candidate-String (SDP-Attribut a=candidate) gelesen und lässt sich nicht direkt setzen.

Welche Bedeutung der Port hat, hängt vom Kandidatentyp (type) ab:

  • host: lokaler Port auf dem Gerät selbst.
  • srflx (server-reflexiv): der Port, den ein STUN-Server von außen sieht, also nach der NAT-Übersetzung.
  • prflx (peer-reflexiv): der Port, der bei Konnektivitätsprüfungen mit dem Peer erkannt wurde.
  • relay: der Port, den ein TURN-Server für die Weiterleitung vergeben hat.

Man braucht port vor allem zur Fehlersuche, für Verbindungsstatistiken oder zum Filtern von Kandidaten, etwa um zu prüfen, ob ein bestimmter TURN-Port verwendet wird. Die zugehörige Basisadresse steht bei nicht-host-Kandidaten in relatedAddress und relatedPort.

Rückgabewert

Typ
number | null
Beschreibung
Portnummer von 0 bis 65535 oder null, wenn der Kandidat keinen gültigen candidate-String enthält bzw. der Port nicht ermittelt werden konnte.

Beispiele

Port aus einem Kandidaten-String lesen

const candidate = new RTCIceCandidate({
  candidate: 'candidate:842163049 1 udp 1677729535 203.0.113.7 54321 typ srflx raddr 192.168.1.20 rport 50000',
  sdpMid: '0',
  sdpMLineIndex: 0
});

console.log(candidate.address, candidate.port);
console.log('Basis-Port:', candidate.relatedPort);
203.0.113.7 54321 Basis-Port: 50000

Lokal gesammelte Kandidaten mit 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;
  }
  console.log(`${candidate.type} ${candidate.protocol}://${candidate.address}:${candidate.port}`);
});

pc.createDataChannel('test');
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
host udp://a1b2c3d4-….local:54012 srflx udp://203.0.113.7:54012 ICE-Sammlung abgeschlossen

Nur TURN-Kandidaten auf Port 443 weitergeben

const sendToSignaling = (c) => console.log('Sende:', c.candidate);

const pc = new RTCPeerConnection({
  iceServers: [{ urls: 'turns:turn.example.com:443', username: 'user', credential: 'secret' }]
});

pc.onicecandidate = ({ candidate }) => {
  // Nur Relay-Kandidaten auf Port 443 akzeptieren (z. B. restriktive Firewall)
  if (candidate?.type === 'relay' && candidate.port === 443) {
    sendToSignaling(candidate);
  }
};

// Wichtig · Fallstricke

  • Datenschutz: Browser verbergen die lokalen IP-Adressen von host-Kandidaten oft hinter mDNS-Namen (….local). Der Port bleibt trotzdem sichtbar. Ports und Adressen gehören zum Netzwerk-Fingerprint, deshalb sollten sie nicht ungefiltert protokolliert oder an Dritte gesendet werden.
  • Bei TCP-Kandidaten mit tcpType "active" ist der Port häufig 9 (Discard-Port). Er dient nur als Platzhalter, weil die Verbindung ausgehend aufgebaut wird.
  • Der Wert kann null sein, zum Beispiel bei einem Kandidaten mit leerem candidate-String, der das Ende der Sammlung markiert. Vor Vergleichen deshalb prüfen.
  • Bei srflx- und relay-Kandidaten ist port der öffentliche bzw. vom Relay vergebene Port. Den lokalen Basis-Port liefert relatedPort.
  • Ältere Browser (Firefox vor Version 68, Chrome vor Version 74) stellen die Eigenschaft nicht bereit. Dort muss man den Port selbst aus candidate.candidate auslesen: Er ist das sechste durch Leerzeichen getrennte Feld.