来自不同厂商的电话系统需要一种共同的方式来协商通话。
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 部分如何分工。
简而言之
SIP 建立会话,但不承载会话。
其规范本身将它定义为一个组件,而非完整的系统。音频运行在单独的协议上,通常也走不同的路径。
这种分离正是通话接通却没有声音的原因。
信令和媒体可以各自独立地失败,因此通话可以正常接通但没有声音,双方所看到的状态都没有错。
注册和呼叫是两个独立的动作。
客户端通过注册来告知网络自己当前的可达地址。发起呼叫并不需要注册,Bird 对每个呼叫邀请分别进行认证,而非依赖注册。
响应码看起来像 HTTP,因为它就是照着设计的。
六个响应类别使用了相同的熟悉编号,另外还有一个 HTTP 没有对应项的类别,表示没有任何服务器能够处理该请求。