SIP 响应码是什么意思,为什么我收到了 503?

SIP 响应码报告一次呼叫尝试的结束方式,来自 Bird 的 503 通常是一种不会在线路上解释原因的拒绝,而非过载。

这些响应类别沿用自 HTTP,常见的代码含义基本符合你的预期。但有一个在日常使用中的代码,其实际含义与标准定义有很大不同。

响应类别是什么意思?

SIP 使用六个响应类别,编号方式与 HTTP 相同,读法也一样。定义 SIP 的 RFC 3261 在第 7.2 节中列出了它们:

1xx: Provisional -- request received, continuing to process the request;
2xx: Success -- the action was successfully received, understood, and accepted;
3xx: Redirection -- further action needs to be taken in order to complete the request;
4xx: Client Error -- the request contains bad syntax or cannot be fulfilled at this server;
5xx: Server Error -- the server failed to fulfill an apparently valid request;
6xx: Global Failure -- the request cannot be fulfilled at any server.

唯一没有 HTTP 对应项的类别是 6xx。4xx 和 6xx 的区别在于作用范围。客户端错误表示此服务器无法处理该请求,而全局失败表示没有任何服务器能处理。收到 6xx 后再尝试其他路由没有意义。实际中你很少会遇到这种情况。

常见响应码是什么意思?

403 表示对端拒绝了呼叫。404 表示该号码未分配。486 表示已到达终端系统但对方忙线。503 表示服务器当前不接受该请求。RFC 3261 在第 21 节中定义了它们:

  • 403 Forbidden:"The server understood the request, but is refusing to fulfill it."
  • 404 Not Found:"The server has definitive information that the user does not exist at the domain specified in the Request-URI."
  • 486 Busy Here:"The callee's end system was contacted successfully, but the callee is currently not willing or able to take additional calls at this end system."
  • 503 Service Unavailable:"The server is temporarily unable to process the request due to a temporary overloading or maintenance of the server."

486 的措辞本身就是诊断依据:终端系统被成功联系到,然后拒绝了呼叫。404 表示该号码未分配。两者都指向你拨打的号码,而不是你自己的配置。 这与 4xx 通常引发的直觉恰好相反。一条正常工作的中继线路不需要排查。

为什么我的呼叫收到了 503?

两种完全不同的情况会返回 503,呼叫日志是区分它们的依据。

有对应呼叫记录的 503 是一次拒绝。 Bird 在拨出前会检查主叫 ID、目的地、账户限额和钱包余额,未通过其中任何一项检查的呼叫会以 503 被拒绝。记录中携带拒绝原因,指明未通过的检查项。重试相同的呼叫会得到同样的结果,因此应修复原因所指向的设置,而非再次尝试。

原因被刻意不放在线路上。 你的电话系统只收到裸的 503;具体原因存在于经过认证的呼叫记录中。这是一个安全设计而非遗漏。SIP INVITE 是请求发起呼叫的方法,任何人都可以向你发送。如果在响应中包含原因,就会暴露目的地是否启用、主叫 ID 是否已验证、或账户是否余额不足。

完全没有呼叫记录的 503 不是拒绝。 没有检查拒绝该呼叫,因此没有可读取的原因,日志中也不会出现任何内容。这种情况下 RFC 自身的定义是更好的参考,重试才是正确的做法。

因此工作流程是:在你这端看到 503,然后在日志中查找该呼叫。如果找到了,拒绝原因会告诉你需要更改什么,所有原因及其修复方法都列在被拒绝的呼叫下。如果没有找到,将其视为临时问题并重试,而不是去寻找需要修改的设置。

Rejected、Failed 还是其他?

SIP 响应码只是答案的一半。呼叫的状态是另一半,将两者结合起来才能让任一信息有用。

状态发生了什么
answered目的地已接听
no_answer已振铃但在超时前未被接听
rejected被拒绝而非正常接通
failed已发起尝试但未成功,SIP 响应是返回的结果
unknown未收到最终响应,因此无法确定结果

Rejected 涵盖两种不同的拒绝,拒绝原因是区分它们的依据。如果有原因,说明 Bird 拒绝了该呼叫,原因指出未通过的检查项,响应码为上述 503。如果没有原因,说明对端直接拒绝了呼叫,SIP 响应携带的是对端自己的响应码。被拨打号码拒绝的来电也会以无原因的 rejected 状态出现,因为它没有未通过 Bird 的任何检查。该号码被设置执行的操作记录为其入站路由。

Failed 完全不是拒绝。 呼叫已发起尝试但未成功。486 或 404 会归入此类。

另有两个状态存在于 API 中但从不出现在记录里。busy 和 canceled 保留给送达你自己号码的来电。busy 对应被叫方以忙线拒绝呼叫的情况。canceled 对应主叫方在接听前挂断的情况。两者都不会被发出,相关结果均报告为 failed。将 failed 与 SIP 响应结合起来才能区分它们。基于这两个状态的分支永远不会执行,搜索记录也不会返回任何结果。

上表列出了已结束呼叫可能携带的所有结果。仍在进行中的呼叫显示为 ringing 或 in_progress,因此过滤呼叫列表时也会遇到这两种状态。该列表在另一个方向上也是开放的:匹配你处理的状态,将无法识别的值视为你不处理的状态,而非错误。

如何跨多个呼叫查看?

逐个呼叫查看不适合发现规律。语音统计端点会汇总你所有流量中的响应码,这是区分系统性问题和个别号码问题的方法。

503 的上升与你的账户或配置有关,因为这些是 Bird 自身的拒绝。486 或 404 的上升与被拨打的号码有关。前者可以通过修改设置来解决,后者通常意味着号码列表需要清理。

语音故障排查逐一介绍各种具体情况。呼叫日志说明每条记录包含的内容,包括只有 Bird 才能解决原因时需要引用的呼叫 ID。

简而言之

  1. 503 是否属于拒绝取决于呼叫日志。

    有对应记录的 503 是拒绝,记录中会注明原因。没有记录的 503 不是拒绝,这种情况值得重试。

  2. Rejected 和 Failed 是不同的结果。

    Rejected 表示呼叫被拒绝。Failed 表示呼叫已发起但未成功,SIP 响应码是返回的结果。

  3. 486 或 404 与你拨打的号码有关。

    忙线和未分配是来自对端的应答,因此问题指向目标号码而非你的配置。

  4. 有两个呼叫状态存在但从未被使用。

    busy 和 canceled 保留给来电使用。两者都不会被发出,相关结果均报告为 failed。

付诸实践。

继续查看此主题的文档、指南和示例。

获取实施简报

基于同一网络构建。

测试 API 密钥即刻获取。添加付款方式并验证发送者身份后,即可解锁生产环境。

你的下一个创意。 随时连接。