Start · Sprachen · JavaScript · Referenz · RTCIceCandidatePairStats.packetsDiscardedOnSend

RTCIceCandidatePairStats.packetsDiscardedOnSend

Eigenschaft

Gesamtzahl der Pakete, die über dieses ICE-Kandidatenpaar gesendet werden sollten, wegen Socket-Fehlern aber verworfen wurden.

seit JavaScript Chrome/Edge 88+; nicht in Firefox und Safari Kategorie: webapi

Signatur

RTCIceCandidatePairStats.packetsDiscardedOnSend

Beschreibung

Die Eigenschaft packetsDiscardedOnSend des Wörterbuchs RTCIceCandidatePairStats ist eine nicht negative Ganzzahl. Sie gibt an, wie viele Pakete für dieses Kandidatenpaar verworfen wurden, weil der Socket beim Senden einen Fehler meldete. Solche Fehler entstehen zum Beispiel, wenn der Sendepuffer des Betriebssystems voll ist, die Netzwerkschnittstelle ausfällt oder eine Route nicht erreichbar ist.

Der Wert zählt nur Pakete, die lokal gar nicht erst gesendet wurden. Pakete, die unterwegs im Netz verloren gehen, erfasst er nicht. Das unterscheidet ihn von Verlustwerten wie packetsLost in RTCRemoteInboundRtpStreamStats. Steigt der Zähler, liegt das Problem also meist beim eigenen Gerät (Überlastung, Wechsel der Netzwerkschnittstelle, VPN) und nicht beim Netzbetreiber.

Abgefragt wird der Wert über RTCPeerConnection.getStats(). Im zurückgegebenen RTCStatsReport filtert man Einträge mit type === "candidate-pair", am besten nur das gerade genutzte Paar (nominated und state === "succeeded" oder über RTCTransportStats.selectedCandidatePairId). Weil es ein kumulativer Zähler ist, sollte man ihn regelmäßig abfragen und die Differenz zwischen zwei Messungen auswerten.

Die zugehörige Eigenschaft bytesDiscardedOnSend zählt die verworfenen Bytes. Setzt man beide Werte zu packetsSent ins Verhältnis, erhält man eine lokale Verwurfsrate.

Rückgabewert

Typ
number | undefined
Beschreibung
Nicht negative Ganzzahl (unsigned long) mit der Anzahl der beim Senden verworfenen Pakete seit Beginn der Verbindung. undefined, wenn der Browser die Eigenschaft nicht unterstützt.

Beispiele

Verworfene Pakete des aktiven Kandidatenpaars auslesen

// pc ist eine bestehende, verbundene RTCPeerConnection
const getDiscardedPackets = async (pc) => {
  const report = await pc.getStats();
  let selectedPairId;

  // ID des aktiven Paars über die Transport-Statistik ermitteln
  report.forEach((stat) => {
    if (stat.type === 'transport' && stat.selectedCandidatePairId) {
      selectedPairId = stat.selectedCandidatePairId;
    }
  });

  const pair = report.get(selectedPairId);
  return pair?.packetsDiscardedOnSend ?? null;
};

const discarded = await getDiscardedPackets(pc);
console.log(`Beim Senden verworfen: ${discarded ?? 'nicht unterstützt'}`);
Beim Senden verworfen: 0

Verwurfsrate regelmäßig überwachen

// Misst jede Sekunde, wie viele Pakete lokal verworfen wurden
const monitorDiscards = (pc, intervalMs = 1000) => {
  let last = { discarded: 0, sent: 0 };

  return setInterval(async () => {
    const report = await pc.getStats();
    for (const stat of report.values()) {
      if (stat.type !== 'candidate-pair' || !stat.nominated || stat.state !== 'succeeded') continue;
      if (stat.packetsDiscardedOnSend === undefined) return;

      const dDiscarded = stat.packetsDiscardedOnSend - last.discarded;
      const dSent = stat.packetsSent - last.sent;
      last = { discarded: stat.packetsDiscardedOnSend, sent: stat.packetsSent };

      const rate = dSent + dDiscarded > 0 ? (dDiscarded / (dSent + dDiscarded)) * 100 : 0;
      if (rate > 1) {
        console.warn(`Lokale Verwurfsrate: ${rate.toFixed(2)} % – Sendepuffer oder Netzwerkschnittstelle prüfen`);
      }
    }
  }, intervalMs);
};

const timer = monitorDiscards(pc);
// Später: clearInterval(timer);
Lokale Verwurfsrate: 3.45 % – Sendepuffer oder Netzwerkschnittstelle prüfen

Pakete und Bytes gemeinsam protokollieren

const logPairDiscards = async (pc) => {
  const report = await pc.getStats();
  const pairs = [...report.values()].filter((s) => s.type === 'candidate-pair');

  console.table(pairs.map((p) => ({
    id: p.id,
    state: p.state,
    packetsDiscardedOnSend: p.packetsDiscardedOnSend ?? '–',
    bytesDiscardedOnSend: p.bytesDiscardedOnSend ?? '–'
  })));
};

await logPairDiscards(pc);
Tabelle mit allen Kandidatenpaaren und ihren Verwurfszählern

// Wichtig · Fallstricke

  • Browser-Unterstützung: Nur in Chromium-basierten Browsern (Chrome, Edge, Opera) verfügbar. Firefox und Safari liefern die Eigenschaft nicht, dort ist sie undefined. Deshalb immer mit ?? oder === undefined absichern.
  • Kumulativer Zähler: Der Wert wächst über die gesamte Lebensdauer des Kandidatenpaars. Für aktuelle Aussagen braucht man die Differenz zwischen zwei getStats()-Aufrufen.
  • Nur lokale Verluste: Pakete, die im Netz verloren gehen, sind hier nicht enthalten. Dafür packetsLost aus den RTP-Statistiken der Gegenseite verwenden.
  • Paarwechsel: Bei einem ICE-Neustart oder Wechsel des Kandidatenpaars beginnt ein neues Paar wieder bei 0. Die Paar-ID sollte man daher mitverfolgen, sonst entstehen negative Differenzen.
  • Die Eigenschaft steht nur in der Statistik-Spezifikation als Zusatzfeld und kann sich noch ändern.