Last updated: May 2, 2026

What is Packet Loss?

In the context of WebRTC and VoIP, Packet Loss means not receiving packets that were sent over the network.

WebRTC is sent over IP networks and in many ways, Packet Loss is simply part of the design of the network itself. Packets are sent over the network, in a best-effort mechanism where they compete over the network resources with other packets traversing the same networks.

Diagram showing packet loss in a network: a stream of packets sent from source with visible gaps at the receiver representing lost packets

With regular web traffic, packet losses are overcome by the use of retransmission mechanisms that are available in the underlying network protocols (TCP for example, creates a reliable transmission channel with its built in retransmission mechanism that overcomes packet loss).

In WebRTC, we think and treat packet loss differently between signaling and media:

  • For signaling, packet losses are usually handled the same was as any other IP based transport mechanism – by using retransmission of an underlying TCP-based protocol (or similar)
  • With media, we usually don’t have the time needed to use retransmission (retransmission adds latency), so we use other mechanisms to deal with it (see below)

What are the reasons for Packet Losses in IP networks?

Packet Loss can occurs due to two main reasons:

  1. Corruption, when the signal passing through the network  corrupts, getting misdelivered
  2. Congestion, when the packets are dropped somewhere along the way due to a congestion in one or more network devices

In naïve solutions that treat packet losses, the distinction between corruption and congestion isn’t made. In more modern solutions, there are attempts to distinguish between these two reasons for Packet Losses since the treatment in each case can be quite different.

How does WebRTC deal with packet losses?

There are generally 3 ways of dealing with packet losses:

  1. Concealment, where we try to conceal the fact that we lost packets and we try to reconstruct the missing media packets on our own by “guessing” what was lost
  2. Retransmission, where we decide that we might have enough time to make use of the lost packet if we retransmit it, taking into account the latency involved
  3. Forward Error Correction“), where we send packets more than once beforehand (either by duplicating the packets or by creating redundant packets in other means), so that we have a better chance of the receiver receiving one of the sent packets

All of these techniques are employed by WebRTC in different ways for different types of packet loss.

Bandwidth and Packet Loss

When packet loss occurs due to congestion on the network, it means that too many packets are sent across the network making it overloaded.

This might be due to local reasons on the sender side (someone on the same device or the local network using network resources for other applications), it might be due to congestion over the internet, or it might be due to congestion in the receiving end (at times, even due to network throttling of cloud vendors).

A common approach in WebRTC is to try to estimate the network bandwidth available and limit the sender from sending more than what we are estimating. This is an important mechanism, especially for video-based sessions, where changing video bitrate dynamically in WebRTC is a very common approach.

How to measure packet loss in your WebRTC app

The most reliable source for packet loss data is the WebRTC Stats API (getStats()). Look for these fields on RTCInboundRtpStreamStats and RTCRemoteInboundRtpStreamStats:

const stats = await pc.getStats();
stats.forEach(report => {
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
    const lost = report.packetsLost;
    const received = report.packetsReceived;
    const lossRate = lost / (lost + received);
    console.log(`Inbound video packet loss: ${(lossRate * 100).toFixed(2)}%`);
  }
});

chrome://webrtc-internals shows packet loss in real time under the packetsLost graph per SSRC. The fractionLost field (from RTCP Receiver Reports) gives you the loss fraction over the last measurement interval.

Packet loss thresholds: what is acceptable in WebRTC?

Loss rateAudio qualityVideo quality
0-1%ImperceptibleImperceptible
1-3%Slight degradation, concealed by Opus PLCOccasional artifact, NACK covers most
3-5%Noticeable on voiceVisible freezes on fast motion
5-10%Hard to understand speechFrequent freezes, keyframe requests pile up
>10%UnusableSustained freeze or black video
  • WebRTC is designed for the 0-3% range. At 5%+ you should investigate the network path rather than tuning codec settings
  • The above takes into account Opus for audio and VP8 for video. Other codecs and specific implementations may vary, so it is advised to make your own measurements and judgements here and use this table as a starting point

Common fixes

  • Enable NACK for video (most WebRTC stacks do this by default): retransmits lost packets when there is enough time
  • Enable FEC (Opus RED or DRED for audio, FlexFEC or ULP-FEC for video): sends redundant packets so the receiver can reconstruct loss without retransmission. This is less common today and is getting more adopted for audio than it is for video
  • Check your TURN relay: if loss is symmetric (both directions), the network path is the problem, not the encoder. Switch to a TURN relay closer to both endpoints
  • Reduce target bitrate: congestion-induced loss drops when you send less. Force a lower maxBitrate in RTCRtpSender parameters temporarily

Additional reading

Looking to learn more about WebRTC? 

Check my WebRTC training courses

About WebRTC Glossary

The WebRTC Glossary is an ongoing project where users can learn more about WebRTC related terms. It is maintained by Tsahi Levent-Levi of BlogGeek.me.