Start · Sprachen · JavaScript · Referenz · RTCIceCandidatePairStats.packetsSent

RTCIceCandidatePairStats.packetsSent

Eigenschaft

Gibt die Gesamtzahl der Pakete an, die über dieses ICE-Kandidatenpaar gesendet wurden.

seit JavaScript Eingeschränkte Unterstützung: in Browsern untersch Kategorie: webapi

Signatur

RTCIceCandidatePairStats.packetsSent

Beschreibung

Die Eigenschaft packetsSent des Wörterbuchs RTCIceCandidatePairStats enthält eine ganze Zahl. Sie gibt an, wie viele Pakete bisher insgesamt über ein bestimmtes ICE-Kandidatenpaar, also die Verbindung aus lokalem und entferntem Kandidaten, gesendet wurden. Der Zähler steigt nur an und beginnt bei der Erstellung des Kandidatenpaars.

Die Werte bekommt man über RTCPeerConnection.getStats(). Der zurückgegebene RTCStatsReport enthält für jedes Kandidatenpaar einen Eintrag mit type === "candidate-pair". Weil es während der ICE-Aushandlung oft mehrere Paare gibt, sollte man gezielt das aktuell ausgewählte Paar auswerten. Dieses erkennt man über RTCTransportStats.selectedCandidatePairId oder, als Ausweichlösung, über nominated und state === "succeeded".

Typische Einsatzzwecke sind Diagnose und Überwachung. Man kann die Senderate in Paketen pro Sekunde berechnen, packetsSent mit packetsReceived der Gegenstelle vergleichen oder zusammen mit bytesSent die durchschnittliche Paketgröße ermitteln.

Rückgabewert

Typ
number
Beschreibung
Eine nicht negative ganze Zahl (in der Spezifikation unsigned long long) mit der Gesamtzahl der gesendeten Pakete. Die Eigenschaft ist schreibgeschützt und kann fehlen (undefined), wenn der Browser sie nicht unterstützt.

Beispiele

packetsSent aller Kandidatenpaare ausgeben

const logCandidatePairs = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === "candidate-pair") {
      console.log(`${stats.id}: ${stats.packetsSent ?? "n/a"} Pakete gesendet (Status: ${stats.state})`);
    }
  });
};

// pc ist eine bestehende, verbundene RTCPeerConnection
await logCandidatePairs(pc);
RTCIceCandidatePair_abc123: 1542 Pakete gesendet (Status: succeeded)

Ausgewähltes Kandidatenpaar über den Transport ermitteln

const getSelectedPair = async (pc) => {
  const report = await pc.getStats();
  let pair;
  report.forEach((s) => {
    if (s.type === "transport" && s.selectedCandidatePairId) {
      pair = report.get(s.selectedCandidatePairId);
    }
  });
  // Ausweichlösung für Browser ohne selectedCandidatePairId
  if (!pair) {
    report.forEach((s) => {
      if (s.type === "candidate-pair" && s.nominated && s.state === "succeeded") pair = s;
    });
  }
  return pair;
};

const pair = await getSelectedPair(pc);
console.log("Gesendete Pakete:", pair?.packetsSent);
Gesendete Pakete: 2310

Senderate in Paketen pro Sekunde überwachen

let last = null;

const monitor = setInterval(async () => {
  const report = await pc.getStats();
  let pair;
  report.forEach((s) => {
    if (s.type === "transport" && s.selectedCandidatePairId) {
      pair = report.get(s.selectedCandidatePairId);
    }
  });
  if (!pair || pair.packetsSent === undefined) return;

  if (last && last.id === pair.id) {
    const seconds = (pair.timestamp - last.timestamp) / 1000;
    const rate = (pair.packetsSent - last.packetsSent) / seconds;
    const avgSize = pair.bytesSent / pair.packetsSent;
    console.log(`${rate.toFixed(1)} Pakete/s, Ø ${avgSize.toFixed(0)} Byte/Paket`);
  }
  last = pair;
}, 1000);

// Später: clearInterval(monitor);
48.0 Pakete/s, Ø 1012 Byte/Paket

// Wichtig · Fallstricke

  • Browser-Kompatibilität: packetsSent und packetsReceived auf Kandidatenpaaren werden nicht von allen Browsern gleich unterstützt. Prüfe den Wert deshalb immer auf undefined, zum Beispiel mit ?? 0, und nimm bei Bedarf bytesSent oder die outbound-rtp-Statistiken zu Hilfe.
  • Richtiges Paar wählen: Ein Bericht kann viele Kandidatenpaare enthalten, darunter fehlgeschlagene oder wartende. Nur das ausgewählte Paar zeigt den tatsächlichen Datenverkehr.
  • Paarwechsel: Bei einem ICE-Neustart oder Netzwechsel, etwa von WLAN zu Mobilfunk, kann ein neues Paar gewählt werden. Der Zähler beginnt dann von vorn. Vergleiche bei Ratenberechnungen deshalb immer auch die id.
  • Zeitbasis: Für Raten sollte man timestamp aus dem Statistikobjekt nehmen, nicht Date.now(), weil die Werte zu einem bestimmten Zeitpunkt erfasst werden.
  • Nicht erfolgreich gesendete Pakete, zum Beispiel wegen Socket-Fehlern, werden gesondert in packetsDiscardedOnSend erfasst.
  • Häufiges Aufrufen von getStats() (öfter als etwa einmal pro Sekunde) kostet unnötig Rechenzeit.