SIP 服务器与 VoIP

使用 Asterisk / FreeSWITCH 搭建企业级 SIP 电话系统,详解注册、呼叫路由与媒体协商全流程。

SIP 协议简介

SIP(Session Initiation Protocol)是由 IETF 制定的应用层信令协议,用于建立、修改和终止多媒体会话(语音、视频、IM)。SIP 只负责"信令"——决定谁和谁通话,真正的语音数据由 RTP(Real-time Transport Protocol)承载

在 IPTV 场景中,SIP 常用于机顶盒与软交换之间的呼叫控制、视频会议、IVR 语音菜单等。

主流 SIP 服务器对比

项目 Asterisk FreeSWITCH Kamailio
定位PBX / IPPBX软交换平台SIP 代理 / 路由
开发语言CC / Lua / JSC
配置方式.conf 文件 / ARIXML / ESL / APIcfg.text / 脚本
并发能力中等(数千)高(万级)极高(十万级)
媒体处理原生支持转码原生支持转码不处理媒体
适用场景企业呼叫中心大容量软交换边缘代理 / 注册

一次 SIP 呼叫的完整流程

STEP 1

注册 (REGISTER)

终端向 SIP 服务器发送 REGISTER,带上账号密码完成鉴权。

STEP 2

呼叫 (INVITE)

主叫发起 INVITE 携带 SDP 描述媒体能力(编码、端口)。

STEP 3

振铃 (180 Ringing)

被叫收到 INVITE,返回 100 Trying 与 180 Ringing。

STEP 4

应答 (200 OK)

被叫摘机,返回 200 OK 并附带自己的 SDP 应答。

STEP 5

媒体 (RTP)

双方按协商的端口用 RTP 直连传输音视频。

STEP 6

挂断 (BYE)

任一方发送 BYE,服务器转发并释放会话资源。

快速部署:FreeSWITCH

以 Debian/Ubuntu 为例,使用官方一键脚本安装:

# 添加官方仓库并安装
apt install -y gnupg2 wget lsb-release
wget -O - https://files.freeswitch.org/repo/deb/debian-release/fsstretch-archive-keyring.asc | apt-key add -
echo "deb http://files.freeswitch.org/repo/deb/debian-release/ `lsb_release -sc` main" > /etc/apt/sources.list.d/freeswitch.list
apt update && apt install -y freeswitch-meta-vanilla

# 启动并查看状态
systemctl enable --now freeswitch
fs_cli -x "status"

默认配置位于 /etc/freeswitch/conf/dialplan/default.xml 是默认拨号计划。注册账号 1000~1019,密码 1234

Asterisk 基础配置示例

注册一个 SIP 分机(pjsip.conf):

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060

[1000]
type=endpoint
context=internal
disallow=all
allow=ulaw,alaw,h264
auth=1000
aors=1000

[1000]
type=auth
auth_type=userpass
username=1000
password=your_secure_password

[1000]
type=aor
max_contacts=1

extensions.conf 中添加一个简单的拨号计划,让 1000 拨打 1001:

[internal]
exten => 1001,1,Answer()
exten => 1001,n,Dial(PJSIP/1001)
exten => 1001,n,Hangup()
调试技巧:使用 asterisk -rvvvvv 进入交互控制台,实时查看 SIP 消息流。FreeSWITCH 使用 fs_cli -x "sofia status" 查看注册状态。
安全提醒:切勿将 5060 端口暴露公网且使用弱密码,否则会被扫描爆破产生高额国际长途费用。建议启用 fail2ban + IP 白名单。

常用 SIP 软电话客户端