sip
Last updated
Last updated
会话发起协议(Session Initiation Protocol,缩写SIP)是一个由IETF MMUSIC工作组开发的协议,作为标准被提议用于创建,修改和终止包括视频、语音、即时通信、在线游戏和虚拟现实等多种多媒体元素在内的交互式用户会话。2000年11月,SIP被正式批准成为3GPP信号协议之一,并成为IMS体系结构的一个永久单元。SIP与H.323一样,是用于VoIP最主要的信令协议之一。
用户代理(User Agent):SIP用户代理是一个SIP逻辑网络端点,用于创建、发送、接收SIP消息并管理一个SIP会话。SIP用户代理又可分为用户代理客户端UAC(User Agent Client)和用户代理服务端UAS(User Agent Server)。UAC创建并发送SIP请求,UAS接收处理SIP请求,发送SIP响应。
代理服务器(Proxy):SIP代理服务器(PROXY)在网络上位于SIP UAC和UAS之间,用于帮助UAC和UAS间的消息路由。PROXY也可以执行路由策略控制(比如,检查SIP消息的合法性,确认消息是否允许被路由)。PROXY在转发SIP消息时,可能根据需要修改SIP消息的某些部分。
注册服务器(Register):SIP注册服务器用于接收SIP注册请求,并保存发送注册请求的UA的位置信息。
Session Model:会话中,对于消息体内容大于1300字节时,一般采用Session Model
Pager Model:在SIP消息中,对于消息体不大于1300字节时,一般采用Pager Model
整个流程称之为一个 Dialog。
主叫 发送 INVITE 请求到 代理服务器
代理服务器 返回 100 Connecting/Trying 响应到 主叫
代理服务器 返回 183 振铃响应到 主叫
代理服务器 请求传输 RTP 媒体流给 主叫
代理服务器 返回 200 OK 响应到 主叫
主叫 返回 ACK 请求到 代理服务器,会话建立
(代理服务器 发送“请输入分机号,以#键结束”音频流给 主叫)
主叫 输入分机号(DTMF)给 代理服务器
主叫 请求传输 RTP 媒体流给 代理服务器
(主叫 与 代理服务器 之间传输媒体流)
主叫 发送 BYT 请求到 代理服务器 终止会话
代理服务器 发送 200 OK 响应给 主叫,会话终止
在SIP消息中,对于消息体不大于1300字节时,一般采用Pager Model。SIP消息通信中采用MESSAGE方法,MESSAGE方法本身并不建立Dialog,在多数应用中,每条IM消息都是独立的。
分三部分组成:
请求行 (request-line) or 状态行 (status-line)
消息头 (header)
正文 (body)
INVITE 请求示例
100 Connecting 响应示例
183 Session Progress 响应示例
格式:Method Request-URI SIP-Version CRLF
REGISTER:注册联系信息
INVITE:发起会话请求
ACK:INVITE请求的响应的确认
CANCEL:取消请求
BYE:终结会话
OPTIONS:查询服务器能力
MESSAGE:RFC3428对 SIP 协议的扩展,增加了MESSAGE方法。采用Pager Model进行通信,传递不超过1300字节的数据。MESSAGE方法详细可参考 “SIP-RFC3428” https://tools.ietf.org/html/rfc3428
格式: SIP-Version Status-Code Reason-Phrase CRLF
1xx:临时响应,表示请求消息正在被处理
2xx:成功响应,表示请求已被成功接收完全理解并接收
3xx:重定向响应,表示需采取进一步完成请求
4xx:客户机错误,表示请求消息中包含语法错误信息或服务器无法完成客户机的请求
5xx:服务器错误,表示服务器无法合法完成请求
6xx:全局故障,表示任何服务器都无法完成该请求
常用状态码
100 试呼叫(Trying)
180 振铃(Ringing)
181 呼叫正在前转(Call is Being Forwarded)
200 成功响应(OK)
302 临时迁移(Moved Temporarily)
400 错误请求(Bad Request)
401 未授权(Unauthorized)
403 禁止(Forbidden)
404 用户不存在(Not Found)
408 请求超时(Request Timeout)
480 暂时无人接听(Temporarily Unavailable)
486 线路忙(Busy Here)
504 服务器超时(Server Time-out)
600 全忙(Busy Everywhere)
Call-ID:由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变
From:表示请求的发起者
To:表示请求的接收者
Via:Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路
Max-Forwards:用于表示这个包最多可以传送多少跳,每经过一跳都会减一当Max-Forwards==0系统会返回483。默认为70
Contact:包含源的URI信息,用来给响应方直接和源建立连接用
Content-Type:指明消息体的类型(SDP会话描述协议)
Content-Length:指明消息体的字节大小
https://leaderli.github.io/2020/09/04/sip/ // TODO
以拨打AXE模式隐私号为例