Signatur
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 meist9(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
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);
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
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));
// Wichtig · Fallstricke
- Bei UDP-Kandidaten ist der Wert immer
null. Prüfen Sie deshalb zuerstprotocol === "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 neuenRTCIceCandidateerzeugen. - 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 keintcpType.