Start · Sprachen · JavaScript · Referenz · RTCIceCandidate.tcpType

RTCIceCandidate.tcpType

Eigenschaft

Schreibgeschützte Eigenschaft, die bei TCP-ICE-Kandidaten den TCP-Typ (<code>"active"</code>, <code>"passive"</code> oder <code>"so"</code>) angibt, sonst <code>null</code>.

seit JavaScript Baseline: Chrome 74+, Edge 79+, Firefox 68+, Safar Kategorie: webapi

Signatur

RTCIceCandidate.tcpType

Beschreibung

Die schreibgeschützte Eigenschaft tcpType eines RTCIceCandidate ist nur bei Kandidaten gesetzt, deren protocol den Wert "tcp" hat. Sie gibt an, welche Rolle der Kandidat beim Aufbau der TCP-Verbindung übernimmt. Bei UDP-Kandidaten ist der Wert null.

Es gibt drei mögliche Werte (nach RFC 6544):

  • "active": Der Transport versucht, eine ausgehende Verbindung aufzubauen. Eingehende Verbindungen nimmt er nicht an. Bei ausgehenden Kandidaten ist der Port meist 9 (ein Platzhalter).
  • "passive": Der Transport nimmt eingehende Verbindungen an, baut selbst aber keine auf.
  • "so" (simultaneous open): Beide Seiten versuchen gleichzeitig, eine Verbindung zueinander zu öffnen.

In der Praxis brauchen Sie tcpType vor allem zur Fehlersuche und Diagnose: Wenn UDP durch eine Firewall blockiert ist, fällt WebRTC auf TCP-Kandidaten zurück. Mit dieser Eigenschaft sehen Sie, welche Art von TCP-Kandidat gesammelt oder ausgewählt wurde. Der Wert kommt aus dem Feld tcptype der SDP-Zeile a=candidate.

Rückgabewert

Typ
"active" | "passive" | "so" | null
Beschreibung
Der TCP-Typ des Kandidaten als String. null, wenn es kein TCP-Kandidat ist oder der Typ nicht bestimmt werden konnte.

Beispiele

TCP-Kandidaten beim ICE-Gathering protokollieren

const pc = new RTCPeerConnection();
pc.createDataChannel('probe');

pc.addEventListener('icecandidate', ({ candidate }) => {
  if (!candidate) {
    console.log('ICE-Gathering abgeschlossen');
    return;
  }
  if (candidate.protocol === 'tcp') {
    console.log(`TCP-Kandidat: ${candidate.address}:${candidate.port} (tcpType=${candidate.tcpType})`);
  }
});

const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
TCP-Kandidat: 192.168.1.20:9 (tcpType=active) ICE-Gathering abgeschlossen

tcpType aus einer Kandidaten-Zeichenkette auslesen

const candidate = new RTCIceCandidate({
  candidate: 'candidate:1 1 tcp 1518280447 192.168.1.20 9 typ host tcptype active',
  sdpMid: '0',
  sdpMLineIndex: 0
});

console.log(candidate.protocol); // tcp
console.log(candidate.tcpType);  // active

const udp = new RTCIceCandidate({
  candidate: 'candidate:2 1 udp 2122260223 192.168.1.20 54321 typ host',
  sdpMid: '0'
});
console.log(udp.tcpType); // null
tcp active null

Kandidaten nach TCP-Rolle gruppieren

const summarizeTcpCandidates = (candidates) =>
  candidates
    .filter((c) => c.protocol === 'tcp')
    .reduce((acc, c) => {
      const key = c.tcpType ?? 'unbekannt';
      acc[key] = (acc[key] ?? 0) + 1;
      return acc;
    }, {});

const list = [
  'candidate:1 1 tcp 1518280447 10.0.0.2 9 typ host tcptype active',
  'candidate:2 1 tcp 1518214911 10.0.0.2 50000 typ host tcptype passive',
  'candidate:3 1 udp 2122260223 10.0.0.2 54321 typ host'
].map((candidate) => new RTCIceCandidate({ candidate, sdpMid: '0' }));

console.log(summarizeTcpCandidates(list));
{ active: 1, passive: 1 }

// Wichtig · Fallstricke

  • Bei UDP-Kandidaten ist der Wert immer null. Prüfen Sie deshalb zuerst protocol === "tcp".
  • Aktive TCP-Kandidaten haben meist den Port 9 (Discard-Port als Platzhalter). Das ist kein Fehler, denn es wird kein lokaler Port für eingehende Verbindungen gebraucht.
  • Browser sammeln nicht zwingend TCP-Kandidaten. Firefox und Chrome tun es je nach Konfiguration oder Richtlinie. Safari liefert sie je nach Version gar nicht oder nur eingeschränkt. Verlassen Sie sich nicht darauf, dass sie vorhanden sind.
  • Die Eigenschaft ist schreibgeschützt. Um den Wert zu ändern, müssen Sie die Kandidaten-Zeichenkette (tcptype …) anpassen und einen neuen RTCIceCandidate erzeugen.
  • Die Werte "so" (Simultaneous Open) werden von aktuellen Browsern praktisch nicht erzeugt.
  • ICE-TCP ist nicht dasselbe wie TURN über TCP/TLS. Relay-Kandidaten über TURN-TCP haben meist protocol === "udp" (Transport zum Peer) und kein tcpType.