powered by Frickelfabrik

Why VoIP calls drop after ~30 seconds

A call that connects fine and then drops after roughly 30 seconds, every time, is one of the most recognisable SIP symptoms. The near-fixed timing is the clue: it points at a SIP timer, not at anything the users did.

There are two common versions.

1. The missing ACK (most common)

After the callee answers, the caller must confirm with an ACK. If that ACK never arrives, the callee keeps retransmitting the 200 OK waiting for it. When the retransmission timer (Timer H, 64 × T1 ≈ 32 seconds) runs out, the callee gives up and tears the call down with a BYE.

In the capture it looks like this:

A ← B   200 OK
A ← B   200 OK      (retransmit)
A ← B   200 OK      (retransmit)
...     — no ACK from A —
A ← B   BYE         (t ≈ 30–32 s)

The audio may even work for those ~30 seconds, which confuses people — but the call was never fully established from the callee's point of view.

Why the ACK goes missing: almost always a routing/NAT problem. The ACK is addressed using Contact / Record-Route headers; if those contain an unroutable (private) address, or a Record-Route is missing so the ACK bypasses a needed proxy, it never reaches the callee.

2. Session timers (RFC 4028)

SIP can keep a call "fresh" with periodic re-INVITE / UPDATE refreshes (Session-Expires). If the two sides disagree, or the refresh is lost (e.g. a firewall drops the UDP flow), the session expires and one side sends BYE — again on a fixed timer, often 30 s or a multiple of it.

In the capture you would see a mid-call re-INVITE/UPDATE that fails or is never answered, followed by a BYE.

How to tell which one it is

  1. Look right before the BYE. Repeated 200 OK with no ACK → the missing-ACK case → check Contact/Record-Route and NAT.
  2. A mid-call re-INVITE/UPDATE that times out → session-timer / firewall-timeout case.
  3. Note the exact drop time. ~32 s strongly suggests the 64 × T1 timer (missing ACK).

The fix usually is…

The capture pins it down fast — the pattern of retransmissions and the exact timing tell you which timer fired.