This content originally appeared on DEV Community and was authored by SIP GAMES
In the previous round, we explored SIP Requests — the moves you make to start, manage, and end a SIP session. But what happens when your move lands?
That’s where SIP Responses come in. Every request gets an answer. Some are good, some bad, and some just say, "Hold up, we’re thinking about it."
This post will cover:
- Categories of SIP responses (1xx → 6xx).
- How to interpret them.
- Examples for quick understanding.
- A handy response code reference table.
- How unique identifiers (tags, Call-ID) tie requests and responses together.
- How SIP timers behave with responses.
đź§© SIP Response Categories
SIP responses follow a status code system (like HTTP, but SIP-flavored).
🔹 1xx: Provisional Responses
- These don’t finish the transaction. They’re progress updates.
- Examples:
-
100 Trying
→ “Got your request, working on it.” -
180 Ringing
→ “User is being alerted.” -
183 Session Progress
→ “Here’s early media info.”
-
🔹 2xx: Success Responses
- Everything went fine.
- Examples:
-
200 OK
→ The Swiss Army knife of SIP. Success for INVITE, BYE, REGISTER, etc. - With INVITE, it establishes the dialog (when To-tag is set).
-
🔹 3xx: Redirection Responses
- The called party isn’t here, but they suggest where to go.
- Examples:
-
302 Moved Temporarily
→ “Try this other address.”
-
🔹 4xx: Client Error Responses
- Something’s wrong with the request. Caller must fix it.
- Examples:
-
400 Bad Request
→ Syntax or formatting error. -
401 Unauthorized
→ Challenge for authentication (withWWW-Authenticate
). -
404 Not Found
→ User not registered / unknown. -
415 Unsupported Media Type
→ Codec/SDP mismatch.
-
🔹 5xx: Server Error Responses
- The server understood the request but failed to process it.
- Examples:
-
500 Server Internal Error
→ General failure. -
503 Service Unavailable
→ Overloaded or temporarily down.
-
🔹 6xx: Global Failure Responses
- Final “no” that applies everywhere.
- Examples:
-
603 Decline
→ Callee doesn’t want to talk. -
606 Not Acceptable
→ Callee’s capabilities don’t match caller’s request.
-
📊 SIP Response Code Reference Table
Here’s a quick reference for the most common responses:
Code | Category | Meaning |
---|---|---|
100 | Provisional | Trying |
180 | Provisional | Ringing |
183 | Provisional | Session Progress (early media) |
200 | Success | OK |
202 | Success | Accepted (rare in INVITE, more in SUB) |
302 | Redirection | Moved Temporarily |
400 | Client Error | Bad Request |
401 | Client Error | Unauthorized |
403 | Client Error | Forbidden |
404 | Client Error | Not Found |
415 | Client Error | Unsupported Media Type |
480 | Client Error | Temporarily Unavailable |
486 | Client Error | Busy Here |
500 | Server Error | Internal Server Error |
503 | Server Error | Service Unavailable |
603 | Global Failure | Decline |
606 | Global Failure | Not Acceptable |
🏷️ How IDs Tie It Together
Remember from our last post:
- Call-ID: Shared across all requests and responses in a dialog.
- From-tag: Caller’s unique dialog identifier.
-
To-tag: Set by callee in the first final response (like
200 OK
to INVITE). - Via branch parameter: Identifies the specific transaction so responses can find their way back.
Example:
INVITE sip:bob@example.com SIP/2.0
Via: SIP/2.0/UDP 192.0.2.10;branch=z9hG4bK123
From: Alice sip:alice@example.com
;tag=111
To: Bob sip:bob@example.com
Call-ID: 1234567890@example.com
CSeq: 1 INVITE
...
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 192.0.2.10;branch=z9hG4bK123
From: Alice sip:alice@example.com
;tag=111
To: Bob sip:bob@example.com
;tag=222
Call-ID: 1234567890@example.com
CSeq: 1 INVITE
- The branch matches the INVITE transaction.
- The To-tag creates the dialog.
- Call-ID stays constant for all dialog messages.
📞 Example Call Flow with Responses
Here’s a simple ASCII call flow showing requests + responses:
Alice Bob
| INVITE ---------------------> |
| <---------- 100 Trying -------|
| <---------- 180 Ringing ------|
| <---------- 200 OK -----------|
| ACK ------------------------->|
|========= Media (RTP) =========|
| BYE ------------------------->|
| <---------- 200 OK -----------|
-
100 Trying
→ Provisional, no retransmission of INVITE needed. -
180 Ringing
→ Alerts Alice, doesn’t complete transaction. -
200 OK
→ Final response, completes the INVITE transaction. -
ACK
→ Separate request confirming the dialog setup.
⏱️ SIP Timers and Responses
SIP uses timers to ensure requests don’t get lost forever. Some key ones:
- Timer A → INVITE retransmission interval (UDP). Stops when 100 Trying is received.
- Timer B → INVITE transaction timeout (default 32s). If no final response (2xx–6xx), transaction fails.
- Timer D → Wait time after sending final response to INVITE (to absorb stray retransmissions).
- Timer F → Non-INVITE transaction timeout.
- Timer K → Wait time before cleaning up after final response in non-INVITE.
How responses affect them:
- 100 Trying: Stops retransmission (Timer A).
- 200 OK: Ends INVITE transaction → Caller must send ACK.
- 4xx/5xx/6xx: Also final, but may trigger re-INVITE or fallback by application.
🔎 Quick-Reference: Timers vs Responses
Timer | Triggered / Stopped By | Notes |
---|---|---|
Timer A | Stopped by 100 Trying | INVITE retransmission timer (UDP) |
Timer B | Stopped by final resp | INVITE timeout (32s if no reply) |
Timer D | After sending final resp | Keeps transaction state to absorb stray retransmits (INVITE server) |
Timer F | Stopped by final resp | Non-INVITE timeout (client side) |
Timer K | After final resp (non-INVITE) | Waits before cleanup |
📞 Example: Timers in Action (ASCII Flow)
Caller (UAC) Callee (UAS)
INVITE ---------------------------> (Start Timer A, B)
[ Timer A running: Retransmit INVITE if no response ]
[ Timer B running: Fail after 32s if no final response ]
<----------------------- 100 Trying
(Stops Timer A)
<----------------------- 180 Ringing
(Timer B still running)
<----------------------- 200 OK
(Stops Timer B)
👉 In this flow:
-
Timer A
makes sure the INVITE doesn’t vanish (stopped by100 Trying
). -
Timer B
guarantees the call won’t hang forever if the other side stays silent. - The
200 OK
stops Timer B and the transaction is finalized with the ACK.
This ties responses directly to timers, helping you debug retransmissions, timeouts, or why a SIP phone “gives up” after a while.
⚡ Quick Recap
- SIP Responses = feedback for SIP Requests.
- Categories: 1xx progress, 2xx success, 3xx redirect, 4xx client error, 5xx server error, 6xx global failure.
- IDs (Call-ID, tags, branch) bind everything together.
- Timers ensure SIP doesn’t wait forever.
âŹď¸Ź Next Round: SIP in Action with Scenarios
Up next, we’ll dive into real-world call scenarios with SIP Requests + Responses, and build toward understanding all the different SIP methods in actual use.
🕹 Follow @sip_games to survive the signaling jungle.
This content originally appeared on DEV Community and was authored by SIP GAMES

SIP GAMES | Sciencx (2025-08-20T14:08:35+00:00) 🎯 SIP Responses: Talking Back. Retrieved from https://www.scien.cx/2025/08/20/%f0%9f%8e%af-sip-responses-talking-back/
Please log in to upload a file.
There are no updates yet.
Click the Upload button above to add an update.