简介
SIP(Session Initiation Protocol,会话初始协议)是一个用于建立、更改和终止多媒体会话的应用 层控制协议,其中的会话可以是 IP 电话、多媒体会话或多媒体会议。SIP 是 IETF 多媒体数据和控 制体系结构的核心协议,RFC文档是 RFC 3261,还有很多其他扩展协议。
SIP 协议基于文本编码,大量借鉴了成熟的 HTTP 协议,并且具有易扩展、易实 现等特点,因此非常适合用来实现基于因特网的多媒体通信系统。
Sip消息
SIP 消息采用文本方式编码,包括请求消息与响应消息两类。
消息格式
基本格式:
- 起始行
- 消息头
- 空行
- 消息体
请求消息示例:
响应消息示例:
请求消息类型
RFC 3261规定了6种请求消息。
消息名 | 说明 | |
---|---|---|
INVITE | 请求消息用于邀请用户加入一个呼叫 | RFC 3261 |
ACK | 用于对请求消息的响应消息进行确认 | RFC 3261 |
OPTIONS | 用于请求协商能力信息 | RFC 3261 |
BYE | 用于释放已建立的呼叫 | RFC 3261 |
CANCEL | 用于释放尚未建立的呼叫 | RFC 3261 |
REGISTER | 用于向 SIP 注册服务器登记用户位置等信息 | RFC 3261 |
INFO | 用于传递会话中产生的与会话相关的控制信息,如ISUP 和ISDN信令消息 | RFC 2976 |
PRACK | 与ACK相同,用于临时响应 | |
SUBSCRIBE | 用来向远端端点预定其状态变化的通知 | |
NOTIFY | 通知预定者它所预定的状态的变化 | |
UPDATE | 允许客户更新一个会话的参数而不影响该会话的当前状态 | |
MESSAGE | 通过在其请求体中承载即时消息内容实现即时消息 | RFC 3428 |
REFER | 其功能是指示接受方通过使用在请求中提供的联系地址信息联系第三方 |
响应消息码
状态码 | 消息含义 | 消息归类 | 举例 |
---|---|---|---|
1xx | 请求被收到,正在处理中 | 临时消息 | 100 正在尝试 180 正在拨打 181 正在转接 182 正在排队 |
2xx | 请求被成功处理,接受该请求。如果是INVITE,那么必须发一条ACK消息。 | 处理成功 | 200 OK 202 被接收,用于转接 |
3xx | 服务器返回可能的位置信息,客户端当向另一个服务器重试请求 | 重定向/转接应答 | 300 多项选择 301 被永久迁移 302被暂时迁移 |
4xx | 由于客服端的原因导致请求失败,一般为消息语法错误,应根据应答消息,重新格式化请求,然后重试 | 客户端请求 | 400 呼叫不当 401 未经授权 402 要求付费 403 被禁止的 404 未发现用户 |
5xx | 由于服务器的原因,无法处理该请求,客户端可尝试其他服务器 | 服务器出错 | 500 服务器内部错误 501 无法实施 502 不当网关 503 服务器不可用 504 服务器超时 505 不支持的协议版本 |
6xx | 该请求在任何 UAS/Server 上都不能完成,不应重试,也不应使用其他服务器 | 全局错误 | 600 各处均忙 603 拒绝 604 无处存在 606 不可使用 |
重要字段
字段名 | 说明 | 一般格式 |
---|---|---|
Form | 用于指明请求发起方的地址,服务器会将请求种的此字段复制到响应消息To字段中 | Form: 显示名<sip uri>; tag=xxx; |
To | 用于标识请求的接收者 | To: 显示名<sip uri>; tag=xxx; |
Call-ID | 用于唯一标识一次会话,call-ID需要全局唯一 | |
CSeq | 用于标识请求的顺序号,服务器将请求中的此字段复制到响应消息中,用于判断响应和请求的对应关系 | CSeq: 序号 方法名 |
Via | 用于指示请求消息经历的路径,防止请求消息产生回路,并确保响应和请求消息选择同样的路径 | Via: 发送协议 发送方 参数 |
Max-Forwards | 最大转发次数 | |
Contact | 用于INVITE,ACK和REGISTER请求以及成功响应,呼叫进展响应和重定向响应消息 | Contact: 地址; 参数 |
Content-type | 消息体类型 | |
Content-Length | 消息体字节数 |
注:橙色为必选头域
会话流程