什么是 SIP?

会话发起协议(SIP)负责发起、变更和结束通话,而音频则通过独立的路径传输。

来自不同厂商的电话系统需要一种共同的方式来协商通话。

SIP 不承载媒体,这一边界解释了为什么已接通的通话可能没有音频。

SIP 到底做什么?

它让双方就是否建立会话以及会话条件达成一致。

RFC 3261 是 2002 年 6 月发布的定义该协议的规范,将 SIP 描述为 "an application-layer control (signaling) protocol for creating, modifying, and terminating sessions with one or more participants"。五项职责分别是:找到远端、判断对方是否接听、协商媒体参数、振铃,以及之后的挂断或转接。规范将它们列举如下:

User location: determination of the end system to be used for
     communication;

User availability: determination of the willingness of the called
     party to engage in communications;

User capabilities: determination of the media and media parameters
     to be used;

Session setup: "ringing", establishment of session parameters at
     both called and calling party;

Session management: including transfer and termination of
     sessions, modifying session parameters, and invoking
     services.

五项职责中没有一项是承载音频。这就是它的全部范围。

为什么我的通话接通了却没有音频?

因为音频从来不归 SIP 承载,而两条路径可以各自独立地失败。

规范对自身的范围有明确说明:

SIP is not a vertically integrated communications system. SIP is rather a component that can be used with other IETF protocols to build a complete multimedia architecture.

媒体通过 RTP 传输,在建立阶段协商完成后独立运行,常常在信令从未经过的端点之间直接流动。信令可以完成,双方都认为会话已经建立。但音频仍然可能因为防火墙、网络地址转换器或媒体端点之间的路由规则将其丢弃而无法到达,同时信令完全不受影响。

这就是为什么单向音频和无音频自成一个诊断类别,而非普通通话故障的变体。通话日志会显示已接通,因为信令确实做到了接通。语音故障排查会逐一排查这些症状。Bird 自带的测试呼叫工具会打印每个方向的峰值音频摘要,其中某一侧为零就是单向音频症状的数字化表现。

同样的分离设计也让其他功能可以顺畅接入。RFC 3261 如此表述:"SIP does not provide services. Rather, SIP provides primitives that can be used to implement different services." 语音信箱、寻线组、通话录音和 AI 坐席都是基于这些原语构建的,而非由协议本身定义。

我必须先注册客户端才能拨打电话吗?

不需要。Bird 中继对通话进行认证,无需客户端注册。

SIP 确实定义了注册功能,用户代理通过它告知网络自己当前的可达地址。正是注册让桌面话机在有人拨打分机时可以被找到。但注册和拨打电话是两个独立的动作,只发起呼叫的系统不需要被找到。

SIP INVITE 是请求发起呼叫的方法。Bird 通过中继的 IP 白名单或密码挑战对每个请求进行认证。客户端不需要向中继注册。将 Bird 配置为中继而非注册账户:在 Asterisk 中不使用 type=registration 部分,在 FreeSWITCH 网关上设置 register=false,在 FreePBX 或 3CX 中将注册设为 none。如果软电话不提供关闭注册的选项,注册失败的尝试只是表面现象,拨号仍然有效,因为平台根据呼叫邀请而非注册来处理。SIP 客户端设置包含完整的配置示例。

关键在于凭据放在哪里。你的客户端发送两个不同的身份信息。主叫号码放在 From 请求头中,且必须是你已验证的号码。摘要认证用户名在每个中继上都是 bird。如果将主叫号码放在认证字段中,会导致认证错误,而不是提示主叫号码有误。

为什么响应码看起来像 HTTP?

因为该协议就是照着设计的,连编号范围都一样。

SIP 是一个基于文本的请求/响应协议,包含方法和请求头。它的响应使用相同的六个类别和相同的熟悉编号,404 表示目标不存在,486 表示终端忙。这种共同结构让你可以像阅读 HTTP 跟踪日志一样阅读 SIP 跟踪日志。

有两个例外。第六个类别 6xx 在 HTTP 中没有对应项,表示没有任何服务器能够处理该请求,而不仅仅是当前这台。另外有一个常见状态码在 Bird 上携带了标准未描述的含义。SIP 响应码含义涵盖了这两种情况,包括为什么来自 Bird 的 503 通常是一种拒绝回应,它不愿在线路上说明原因,而非真正的过载。

我在 Bird 上哪里会接触到 SIP?

在中继上,它就是你的设备向其发送请求的地址。

每个中继有一个固定的 SIP 域名,在 5060 上接受 UDP 或 TCP,或在 5061 上接受 TLS(用于加密传输中的信令)。允许哪些来源发送请求由你决定,新中继在你明确授权之前不接受任何请求。什么是 SIP 中继介绍了这一决策及其背后的三种机制。什么是语音 API介绍了 SIP 部分和 HTTP 部分如何分工。

简而言之

  1. SIP 建立会话,但不承载会话。

    其规范本身将它定义为一个组件,而非完整的系统。音频运行在单独的协议上,通常也走不同的路径。

  2. 这种分离正是通话接通却没有声音的原因。

    信令和媒体可以各自独立地失败,因此通话可以正常接通但没有声音,双方所看到的状态都没有错。

  3. 注册和呼叫是两个独立的动作。

    客户端通过注册来告知网络自己当前的可达地址。发起呼叫并不需要注册,Bird 对每个呼叫邀请分别进行认证,而非依赖注册。

  4. 响应码看起来像 HTTP,因为它就是照着设计的。

    六个响应类别使用了相同的熟悉编号,另外还有一个 HTTP 没有对应项的类别,表示没有任何服务器能够处理该请求。

付诸实践。

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

获取实施简报

基于同一网络构建。

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

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