Start · Sprachen · JavaScript · Referenz · RTCTransportStats.packetsReceived

RTCTransportStats.packetsReceived

Eigenschaft

Gibt die Gesamtzahl der Pakete an, die über diesen Transport (<code>RTCDtlsTransport</code> bzw. ICE-Transport) seit seiner Erstellung empfangen wurden.

seit JavaScript Chrome/Edge 88+, Firefox (teilweise), Safari 16.4+ Kategorie: webapi

Signatur

RTCTransportStats.packetsReceived

Beschreibung

Die Eigenschaft packetsReceived des Wörterbuchs RTCTransportStats enthält eine nicht negative Ganzzahl. Sie zählt alle Pakete, die auf dem jeweiligen Transport eingegangen sind. Ein Objekt dieses Typs bekommt man, wenn man in dem RTCStatsReport aus RTCPeerConnection.getStats() nach Einträgen mit type === "transport" filtert.

Gezählt wird auf der Transportebene. Der Wert umfasst also alle Pakete, die über diesen Transport laufen: RTP, RTCP, DTLS und je nach Implementierung auch Daten für RTCDataChannel (SCTP). Er ist damit in der Regel größer als die Summe der packetsReceived-Werte der einzelnen inbound-rtp-Statistiken.

In der Praxis vergleicht man mehrere Momentaufnahmen, um Paketraten zu berechnen oder eine hängende Verbindung zu erkennen. Steigt der Zähler über mehrere Sekunden nicht mehr, obwohl die Verbindung als connected gilt, kommen vermutlich keine Daten an. Zusammen mit bytesReceived lässt sich auch die mittlere Paketgröße bestimmen.

Rückgabewert

Typ
number | undefined
Beschreibung
Nicht negative Ganzzahl (unsigned long long) mit der Anzahl der seit Erstellung des Transports empfangenen Pakete. undefined, wenn der Browser das Feld nicht liefert.

Beispiele

Empfangene Pakete des Transports auslesen

const logTransportPackets = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'transport') {
      console.log(`Transport ${stats.id}: ${stats.packetsReceived ?? 'n/a'} Pakete empfangen`);
    }
  });
};

// Aufruf mit einer bestehenden, verbundenen RTCPeerConnection
await logTransportPackets(peerConnection);
Transport T01: 15342 Pakete empfangen

Paketrate pro Sekunde berechnen

const getTransport = async (pc) => {
  const report = await pc.getStats();
  return [...report.values()].find((s) => s.type === 'transport');
};

let previous = await getTransport(peerConnection);

const timer = setInterval(async () => {
  const current = await getTransport(peerConnection);
  if (!current || !previous) return;
  // timestamp ist in Millisekunden
  const seconds = (current.timestamp - previous.timestamp) / 1000;
  const rate = (current.packetsReceived - previous.packetsReceived) / seconds;
  console.log(`Empfangsrate: ${rate.toFixed(1)} Pakete/s`);
  previous = current;
}, 1000);

// Später beenden: clearInterval(timer);
Empfangsrate: 52.0 Pakete/s

Stillstand der Verbindung erkennen

const watchForStall = (pc, { intervalMs = 2000, maxIdle = 3 } = {}) => {
  let last = null;
  let idleCount = 0;

  const id = setInterval(async () => {
    const report = await pc.getStats();
    const transport = [...report.values()].find((s) => s.type === 'transport');
    const received = transport?.packetsReceived ?? 0;

    idleCount = received === last ? idleCount + 1 : 0;
    last = received;

    if (idleCount >= maxIdle) {
      console.warn('Seit mehreren Messungen keine Pakete empfangen – Verbindung prüfen!');
      clearInterval(id);
    }
  }, intervalMs);

  return () => clearInterval(id);
};

const stopWatching = watchForStall(peerConnection);
Seit mehreren Messungen keine Pakete empfangen – Verbindung prüfen!

// Wichtig · Fallstricke

  • Kumulativer Zähler: Der Wert zählt seit Erstellung des Transports nur nach oben. Für Raten muss man zwei Momentaufnahmen vergleichen und dabei timestamp berücksichtigen, nicht die Timer-Zeit.
  • Nicht mit inbound-rtp verwechseln: RTCInboundRtpStreamStats.packetsReceived zählt nur die RTP-Pakete eines einzelnen Medienstroms. Der Transport-Zähler enthält zusätzlich RTCP-, DTLS- und SCTP-Verkehr.
  • Bündelung: Mit bundlePolicy: "max-bundle" teilen sich alle Streams meist einen einzigen Transport. Ohne Bündelung kann es mehrere transport-Einträge geben, deren Werte man bei Bedarf addieren muss.
  • Browser-Kompatibilität: Das Feld kam erst später in die Spezifikation und wird nicht überall geliefert. Firefox stellt teilweise keine transport-Statistiken bereit. Deshalb immer mit ?? 0 bzw. einer Prüfung auf undefined absichern.
  • Nach pc.close() liefert getStats() je nach Browser keine oder eingefrorene Werte mehr.