摘要
SIP(Session Initiation Protocol,会话初始协议)是互联网实时通信的基石协议,广泛应用于VoIP电话、视频会议、即时消息等场景。本文从协议定位、核心架构、工作流程、安全机制到实践应用,全面解析SIP协议的技术细节。
一、协议概述:SIP是什么?
1.1 定义与定位
SIP(RFC 3261) 是一个应用层信令控制协议,用于创建、修改和终止多媒体会话。它只负责“打电话”过程中的控制动作(拨号、振铃、接通、挂断),不传输实际的音视频数据(那是RTP协议的工作)。
如果把一次网络通话比作一次快递配送:
- SIP = 客服电话(通知、确认、协调)
- RTP = 快递货车(实际运送货物)
- SDP = 发货单(描述货物的规格、地址)
1.2 核心特点
| 特性 | 说明 |
|---|---|
| 文本编码 | 基于UTF-8,类HTTP语法,易于调试扩展 |
| 传输无关 | 可运行于UDP/TCP/TLS(默认5060/5061) |
| 分布式架构 | 支持代理、重定向、注册服务器协同工作 |
| 可扩展性 | 通过新方法(INFO/UPDATE)和头域灵活扩展 |
| 移动性支持 | 支持RE-INVITE更新IP地址,适应漫游场景 |
1.3 与HTTP的本质区别
虽然SIP在设计上大量借鉴HTTP(请求-响应模型、文本格式、状态码分类),但两者底层完全不同:
| 对比维度 | SIP | HTTP |
|---|---|---|
| 默认传输 | UDP 5060 | TCP 80/443 |
| 设计目标 | 实时会话控制 | 资源传输 |
| 消息顺序 | 不保证(靠CSeq) | TCP保证 |
| 代理行为 | 可改写消息(Via头) | 通常仅转发 |
| 状态维护 | 会话状态在应用层(Call-ID) | 无状态或依赖Cookie |
二、核心架构:组件与角色
2.1 逻辑实体
graph TD
UA[User Agent 用户终端] --> REG[Registrar Server 注册服务器]
UA --> PROXY[Proxy Server 代理服务器]
UA --> REDIR[Redirect Server 重定向服务器]
REG --> LOC[Location Server 位置服务器]
PROXY --> LOC
subgraph "SIP网络核心"
REG
PROXY
REDIR
LOC
end
UA1[话机A] --> PROXY
PROXY --> UA2[话机B]
各组件职责:
- User Agent(UA):终端设备(软电话、IP话机),兼具UAC(发起请求)和UAS(响应请求)能力
- Proxy Server:转发请求,协助路由(类似HTTP代理)
- Registrar Server:接收注册信息,维护
地址→IP映射 - Redirect Server:返回下一跳地址,让UA重发请求(类似302重定向)
- Location Server:存储用户注册信息(通常与Registrar合一)
2.2 URI格式
SIP使用类似邮件地址的URI定位用户:
sip:alice@example.com:5060;transport=udp
sips:bob@example.com ← TLS加密版本
三、工作流程:一次完整的呼叫
3.1 基础呼叫流程
sequenceDiagram
participant A as 话机A<br/>(UAC)
participant P as 代理服务器
participant R as 注册服务器
participant B as 话机B<br/>(UAS)
Note over A,R: 1. 注册阶段
A->>R: REGISTER (sip:alice@example.com → IP)
R-->>A: 200 OK
Note over A,B: 2. 呼叫建立
A->>P: INVITE (sip:bob@example.com + SDP)
P->>R: 查询Bob位置
R-->>P: Bob当前IP
P->>B: INVITE (转发)
B-->>P: 180 Ringing
P-->>A: 180 Ringing
B-->>P: 200 OK (接听 + SDP)
P-->>A: 200 OK
A->>P: ACK
P->>B: ACK
Note over A,B: 3. 媒体传输
A-->>B: RTP媒体流 (语音/视频)
Note over A,B: 4. 挂断
A->>P: BYE
P->>B: BYE
B-->>P: 200 OK
P-->>A: 200 OK
3.2 关键步骤解析
Step 1: REGISTER注册
- UA向Registrar发送注册请求,建立
用户名@域名 → IP地址映射 - 注册有效期通常为3600秒,需定期刷新
Step 2: INVITE发起呼叫
- 主叫发送INVITE请求,消息体携带SDP(描述支持的编解码器、IP和端口)
- 示例SDP:
v=0 o=alice 2890844526 2890844526 IN IP4 192.168.1.100 s=Phone Call c=IN IP4 192.168.1.100 m=audio 49170 RTP/AVP 0 8 101 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000
Step 3: 代理路由与定位
- 代理服务器检查Request-URI(
sip:bob@example.com),查询Location Server - 若Bob在线,获取其当前IP,转发INVITE
Step 4: 振铃与应答
- Bob的UA返回
180 Ringing(电话响铃) - Bob摘机后返回
200 OK,携带自己的SDP(告诉主叫用哪个编解码和端口接收媒体)
Step 5: ACK确认(三次握手关键)
- 主叫收到200 OK后发送ACK,完成3次握手
- 此时双方都知道了对方的媒体接收地址,RTP通道正式建立
Step 6: BYE终止
- 任一方发送BYE,对方回复200 OK,会话结束
四、核心协议要素
4.1 主要请求方法
| 方法 | 用途 | RFC |
|---|---|---|
| REGISTER | 注册位置信息 | RFC 3261 |
| INVITE | 发起会话 | RFC 3261 |
| ACK | 确认INVITE最终响应(3次握手) | RFC 3261 |
| BYE | 终止会话 | RFC 3261 |
| CANCEL | 取消未建立的请求 | RFC 3261 |
| OPTIONS | 查询服务器能力 | RFC 3261 |
| SUBSCRIBE | 订阅事件通知 | RFC 6665 |
| NOTIFY | 发送事件通知 | RFC 6665 |
| MESSAGE | 即时消息(类短信) | RFC 3428 |
| REFER | 呼叫转移 | RFC 3515 |
| UPDATE | 更新会话参数(不改变对话状态) | RFC 3311 |
| INFO | 会话中传递应用层信息(如DTMF按键) | RFC 6086 |
4.2 状态码分类
graph LR
A[SIP状态码] --> B[1xx 临时性]
A --> C[2xx 成功]
A --> D[3xx 重定向]
A --> E[4xx 客户端错误]
A --> F[5xx 服务器错误]
A --> G[6xx 全局错误]
B --> B1[100 Trying<br/>180 Ringing<br/>183 Session Progress]
C --> C1[200 OK<br/>202 Accepted]
D --> D1[301 Moved Permanently<br/>302 Moved Temporarily]
E --> E1[401 Unauthorized<br/>404 Not Found<br/>486 Busy Here]
F --> F1[500 Server Internal Error<br/>503 Service Unavailable]
G --> G1[600 Busy Everywhere<br/>603 Decline]
4.3 关键头域
以一次INVITE请求为例,标注核心头域的作用:
INVITE sip:bob@example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK74bf9
← 记录路径(响应时原路返回),branch用于事务匹配
Max-Forwards: 70 ← 最大跳数,防止循环
From: <sip:alice@example.com>;tag=1928301774 ← 主叫标识,tag区分不同对话
To: <sip:bob@example.com> ← 被叫标识(逻辑目标)
Call-ID: a84b4c76e66710@pc33.example.com ← 全局唯一会话ID(一次呼叫所有消息共用)
CSeq: 314159 INVITE ← 命令序列号(匹配请求/响应,检测重复)
Contact: <sip:alice@192.168.1.100> ← 后续请求直接发往的地址
Content-Type: application/sdp ← 消息体类型
Content-Length: 142 ← 消息体长度
(空白行)
v=0
o=alice 2890844526 2890844526 IN IP4 192.168.1.100
s=Phone Call
c=IN IP4 192.168.1.100
m=audio 49170 RTP/AVP 0 8 101
五、协议栈与传输机制
5.1 SIP协议栈层次
graph TD
APP[应用层<br/>VoIP/视频会议/IM]
SIP[SIP事务层<br/>事务管理/重传]
TRANS[传输层<br/>UDP/TCP/TLS]
NET[网络层<br/>IP]
APP --> SIP
SIP --> TRANS
TRANS --> NET
subgraph "事务层内部"
TU[事务用户<br/>(TU,如INVITE客户端)]
ICT[INVITE客户端事务]
IST[INVITE服务器事务]
NICT[非INVITE客户端事务]
NIST[非INVITE服务器事务]
end
5.2 可靠性机制(UDP场景)
由于SIP默认使用UDP,需自行实现可靠性:
- INVITE事务:定时器A(重传间隔默认500ms)→ 定时器B(超时时间默认32秒)
- 非INVITE事务:定时器E(重传)→ 定时器F(超时)
- 收到临时响应(1xx)会停止重传,收到最终响应(2xx-6xx)后结束事务
5.3 对话(Dialog)与会话(Session)
| 概念 | 定义 | 标识 |
|---|---|---|
| 事务 | 一个请求及其所有响应的完整交换 | Via branch + CSeq |
| 对话 | 两个UA之间的端到端信令关系,持续到BYE | Call-ID + From tag + To tag |
| 会话 | 实际的媒体流通信(RTP通道) | SDP中的IP+端口组合 |
六、NAT穿透问题与解决方案
6.1 NAT带来的问题
SIP消息中携带内网IP地址(SDP的c=行和Contact头),NAT设备无法自动转换,导致:
- 信令无法到达公网UA
- 媒体流(RTP)指向内网地址,无法建立通道
6.2 常见解决方案
graph LR
NAT[NAT穿透方案] --> STUN[STUN<br/>RFC 5389]
NAT --> TURN[TURN<br/>RFC 5766]
NAT --> ICE[ICE<br/>RFC 8445]
NAT --> ALG[ALG<br/>应用层网关]
STUN --> 描述1[发现公网IP/端口<br/>适用于锥形NAT]
TURN --> 描述2[中继转发媒体<br/>适用于对称NAT]
ICE --> 描述3[综合使用STUN/TURN<br/>收集候选地址并连通性检查]
ALG --> 描述4[防火墙/路由器<br/>自动修改SIP消息]
推荐方案:ICE(Interactive Connectivity Establishment),它综合使用STUN和TURN,按优先级尝试直连→STUN穿透→TURN中继,适配各种NAT环境。
七、安全机制
7.1 信令加密(SIPS)
- 使用 SIPS URI(如
sips:bob@example.com)强制要求TLS加密 - 默认端口:5061(TLS),替代5060
- 加密整个SIP消息,防止窃听和篡改
7.2 认证机制(HTTP Digest)
sequenceDiagram
UA->>Proxy: INVITE (无认证)
Proxy-->>UA: 401 Unauthorized<br/>(带realm/nonce)
UA->>Proxy: INVITE (带Authorization头<br/>基于密码计算response)
Proxy-->>UA: 200 OK (认证通过)
- 密码不明文传输,而是使用MD5哈希(用户名+realm+密码+nonce+method+URI)
- 防重放攻击:nonce带时间戳或计数
7.3 其他安全措施
| 安全威胁 | 防护手段 |
|---|---|
| 注册劫持 | 强制认证+短注册有效期 |
| 会话窃听 | SIPS全链路加密 |
| DoS攻击 | 速率限制、防火墙、SIP洪泛检测 |
| 篡改消息 | TLS完整性校验 |
| 伪造BYE | 校验From/To tag匹配 |
八、实践应用场景
8.1 企业VoIP(IP-PBX)
典型部署:Asterisk/FreeSWITCH作为PBX,SIP话机或软电话(如Zoiper)注册,实现内线免费通话、外线中继、自动话务员等功能。
8.2 WebRTC与SIP互连
- WebRTC使用HTTP/WebSocket进行信令交换,SDP仍用于媒体协商
- 通过WebRTC网关(如Janus、Kamailio WebSocket模块)实现浏览器与SIP网络的互通
8.3 视频会议系统
- SIP作为控制信令,BFCP(Binary Floor Control Protocol)管理发言人权限
- 结合MCU(多点控制单元)实现多方混音/混屏
8.4 物联网(IoT)与智能家居
- ONVIF安防协议使用SIP进行报警事件上报
- 轻量级SIP实现(如microSIP)用于传感器状态通知
九、调试与故障排查
9.1 常用抓包分析
# 抓取SIP信令(UDP 5060)
tcpdump -i eth0 -s 0 -w sip.pcap port 5060
# 过滤特定IP或Call-ID(Wireshark显示过滤)
sip.Call-ID == "a84b4c76e66710@pc33.example.com"
9.2 常见排查点
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 注册失败 | 认证密码错误/注册服务器不可达 | 检查401响应,ping服务器 |
| 单通(一方无声音) | NAT未穿透,RTP被阻断 | 检查SDP中的IP地址是否为公网 |
| 呼叫超时 | 防火墙阻挡INVITE | 检查5060端口是否开放 |
| 回铃音正常但接听后断线 | ACK未到达被叫 | 检查代理是否转发ACK,是否存在对称路由问题 |
十、总结
10.1 协议优势回顾
- 开放标准,互操作性强(IETF主导)
- 灵活扩展,适应新业务需求(如即时消息、Presence)
- 与互联网基础设施天然融合(DNS、URL、Web技术)
- 轻量级,适合嵌入式设备
10.2 演进趋势
- SIP over WebSocket:为WebRTC提供浏览器原生信令通道
- IPv6支持:彻底解决NAT穿透,简化SIP部署
- SRTP(安全RTP):媒体流加密与信令加密形成完整安全体系
- AI与SIP结合:智能语音助手通过SIP控制通话,实时语音分析
参考资源
| 类型 | 资源 |
|---|---|
| 核心RFC | RFC 3261(SIP)、RFC 4566(SDP)、RFC 3550(RTP) |
| 开源实现 | Asterisk、FreeSWITCH、Kamailio、PJSIP |
| 测试工具 | sipp(性能测试)、Wireshark(协议分析) |
| 在线文档 | SIP Wiki |
| 中文资源 | 中国通信标准化协会(CCSA)SIP相关行标 |
原文 https://blog.csdn.net/2301_79518550/article/details/163244878