Start · Sprachen · JavaScript · Referenz · RTCPeerConnection.sctp

RTCPeerConnection.sctp

Eigenschaft

Schreibgeschützte Eigenschaft, die das <code>RTCSctpTransport</code> der Verbindung liefert, über das SCTP-Daten (z. B. Datenkanäle) laufen, oder <code>null</code>, solange keine SCTP-Aushandlung stattfand.

seit JavaScript Baseline 2023: Chrome 76+, Edge 79+, Firefox 113+, Kategorie: webapi

Signatur

RTCPeerConnection.sctp

Beschreibung

Die Eigenschaft sctp einer RTCPeerConnection gibt ein RTCSctpTransport-Objekt zurück. Es beschreibt den SCTP-Transport (Stream Control Transmission Protocol), über den WebRTC die Daten aller RTCDataChannel-Instanzen einer Verbindung überträgt. SCTP läuft dabei gekapselt über DTLS, das wiederum über ICE/UDP transportiert wird.

Solange noch kein SCTP ausgehandelt wurde, ist der Wert null. Das ist der Fall, bis eine lokale oder entfernte Beschreibung mit einem m=application-Abschnitt gesetzt wurde, also typischerweise erst nach setLocalDescription() bzw. setRemoteDescription() mit mindestens einem erzeugten Datenkanal.

Über das zurückgegebene Objekt kommt man an nützliche Laufzeitinformationen:

  • state: Zustand des SCTP-Transports ("connecting", "connected", "closed")
  • maxMessageSize: größte Nachricht in Bytes, die RTCDataChannel.send() übertragen kann
  • maxChannels: Höchstzahl gleichzeitig nutzbarer Datenkanäle (erst im Zustand "connected" gesetzt)
  • transport: das zugrunde liegende RTCDtlsTransport (und darüber das RTCIceTransport)

Gebraucht wird die Eigenschaft vor allem, wenn man große Datenmengen in Blöcke zerlegen, Verbindungsprobleme auf Transportebene analysieren oder auf das statechange-Ereignis des SCTP-Transports reagieren möchte.

Rückgabewert

Typ
RTCSctpTransport | null
Beschreibung
Das RTCSctpTransport-Objekt der Verbindung oder null, wenn (noch) kein SCTP ausgehandelt wurde.

Beispiele

sctp ist vor der Aushandlung null

const pc = new RTCPeerConnection();
console.log(pc.sctp); // noch keine Aushandlung

pc.createDataChannel('chat');
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);

console.log(pc.sctp instanceof RTCSctpTransport);
console.log(pc.sctp.state);
null true connecting

Große Daten passend zu maxMessageSize aufteilen

const sendLarge = (pc, channel, buffer) => {
  // Fallback 16 KiB, falls sctp noch nicht verfügbar ist
  const max = pc.sctp?.maxMessageSize ?? 16 * 1024;
  // Sicherheitsabstand und Obergrenze für bessere Interoperabilität
  const chunkSize = Math.min(max, 64 * 1024);
  for (let offset = 0; offset < buffer.byteLength; offset += chunkSize) {
    channel.send(buffer.slice(offset, offset + chunkSize));
  }
  console.log(`Gesendet in Blöcken zu ${chunkSize} Bytes`);
};

// Nutzung, sobald der Kanal offen ist:
// channel.onopen = () => sendLarge(pc, channel, new ArrayBuffer(1_000_000));
Gesendet in Blöcken zu 65536 Bytes

Zustand des SCTP-Transports überwachen

const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] });
pc.createDataChannel('telemetrie');
await pc.setLocalDescription(await pc.createOffer());

const sctp = pc.sctp;
sctp.addEventListener('statechange', () => {
  console.log('SCTP-Zustand:', sctp.state);
  if (sctp.state === 'connected') {
    console.log('Max. Kanäle:', sctp.maxChannels);
    console.log('DTLS-Zustand:', sctp.transport.state);
  }
});
SCTP-Zustand: connected Max. Kanäle: 65535 DTLS-Zustand: connected

// Wichtig · Fallstricke

  • Null-Prüfung: Vor setLocalDescription()/setRemoteDescription() mit Datenkanal ist sctp null. Optional Chaining (pc.sctp?.maxMessageSize) verhindert TypeError.
  • Datenkanal nötig: Ohne createDataChannel() vor dem Angebot (oder einen entfernten Datenkanal) wird kein SCTP ausgehandelt; reine Audio-/Video-Verbindungen haben dauerhaft sctp === null.
  • maxMessageSize: Der Wert hängt von beiden Seiten ab und kann Infinity sein. Für Interoperabilität zwischen Browsern ist es üblich, Nachrichten auf 16–64 KiB zu begrenzen und bufferedAmount bzw. bufferedamountlow zur Flusskontrolle zu nutzen.
  • maxChannels ist bis zum Zustand "connected" null.
  • Kompatibilität: Firefox unterstützt die Eigenschaft erst seit Version 113, Safari seit 15.4. In älteren Browsern ist pc.sctp undefined; hier hilft eine Funktionsprüfung mit 'sctp' in RTCPeerConnection.prototype.