SIP实例
使用位置服务和 DNS 请求地址解析示例
该实例未显示传入和传出代理服务器,而仅显示了中间的一个代理服务器(Proxy Server)。这种简单的网络配置可能适用于在小型专用网络。
SIP用户代理A希望向另一个由SIP URI sip:userb@there.com标识的用户代理B发送通用的SIP请求
- A首先需要知道B的SIP服务器地址,所以去查询DNS服务器,通过SRV去记录传输协议、通过NAPTR记录SIP服务器的地址
- 将记录带回
- 将SIP请求发送到代理服务器
- 代理服务器告知A已接收,正在处理,并返回一个临时响应
- 代理服务器咨询定位服务,定位用户B的注册URI,获得 +86123456789
- 返回B注册消息
- 发送一组ENUM查询相应的URI地址,通过ENUM可以获取相应的URI地址
- 返回记录
- 发送SIP请求到B
- 响应200 OK
SIP会话建立
SIP会话建立是一个三向握手。
- UAC发起一个INVITE请求
- 临时响应 1xx开头的都代表正常临时响应
- 临时响应 可以在最终ACK之前发送多个临时响应
- ACK回复,对话建立(ACK必须和INVITE配对使用)
更改会话参数问题
- 使用媒体描述sdp1建立呼叫
- 临时响应
- 200 代表已经接收到
- INVITE的收尾ACK
- 在已经会话之后,被呼叫方希望使用sdp2作为新的会话参数发送INVITE请求给原呼叫方
- 原呼叫方觉得不可以接收,返回405代表不接受
- 被呼叫方响应
- 被呼叫方提出了新的会话参数,再次发送
- 这次原呼叫方觉得可以,返回200代表接收
- 响应
请注意,重新邀请可能会更改任何媒体特征,包括会话类型、使用的编解码器,甚至源 IP 地址和端口号
使用 BYE 的会话终止示例
只需要在会话建立之后发送BYE请求并且返回OK,即可断开连接。但如果一方在会话未建立之前就想取消呼叫,需要用到Cancel请求。Cancel是一个逐跳的请求,收到Cancel的请求代理需要立刻返回一个200OK响应
- 在ACK还未响应时,发起Cancel请求。
- 发送200OK代表响应
INFO扩展
使用Info扩展必须有两个条件
1.当前会话必须已经建立
2.当收到一个INFO请求时,必须要立刻进行响应
使用 REFER 的呼叫控制示例
6. 此时A和B已经建立了会话,A发送给B一个请求,希望B和C去进行通话,消息体如下
REFER sip:userb@there.com SIP/2.0
Via: SIP/2.0/TCP pc.there.com:5060;branch=z9hG4bK765d
To: User B <sip:userb@there.com>
From: User A <sip:usera@here.com>
Call-ID: a5-32-43-12-77@4.3.2.1
CSeq: 2 REFER
Refer-To: <sip:UserC@anywhere.com>
Referred-By: <sip:usera@here.com>
Content-Length: 0
- B响应
- B发送INVITE请求给C,表示是从A这里refer,消息体如下
INVITE sip:UserC@anywhere.com SIP/2.0
Via: SIP/2.0/UDP 100.101.102.103:5060
To: <sip:UserC@anywhere.com>
From: User B <sip:userb@there.com>
Call-ID: 383874109476@there.com
CSeq: 67 INVITE
Contact: sip:userb@here.com
Referred-By: <sip:usera@here.com> //代表A指示
Content-Length: ...
9.与此同时发送Notify通知给A
临时响应中携带SDP消息
此呼叫流程使用了 SIP 的三个扩展,第一个是 Early Media,允许临时响应中携带SDP消息、第二个是对 SIP 的可靠临时响应扩展,它允许检测和重传丢失的临时响应、第三个扩展是使用 COMET方法。
- 183响应:可以进行一次额外的SDP协商
- UPDATE请求:用于通话未ACK时更新媒体状态流。必须在使用UPDATE之前实现了一次SDP传输,意味着只有用了Early Media,才可以使用UPDATE;