// 安全研究 · 2026-07-27

SIP协议学习笔记

摘要

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