SIP #
SIP 协议使用 RTP 协议传送音视频数据流,使用 SDP 协议进行媒体描述。
CALL-ID #
SIP 的一次通话,可以通过 From
, To
, Call-ID
三元组来区分。
CALL-ID 字段用于标识一个特定邀请以及与这个邀请相关的所有后续事务(即标识一个会话)
包内容 #
Message #
Session Initiation Protocol (MESSAGE)
Request-Line: MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Message Header
Via: SIP/2.0/UDP 192.168.137.109:5060;rport;branch=z9hG4bK1013136823
From: <sip:34020000001320000001@3402000000>;tag=676399389
To: <sip:34020000002000000001@3402000000>
Call-ID: 1119613114
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 178
Message Body
<?xml version="1.0" encoding="GB2312"?>\n
<Notify>\n
<CmdType>Keepalive</CmdType>\n
<SN>123</SN>\n
<DeviceID>34020000001320000001</DeviceID>\n
<Status>OK</Status>\n
<Info>\n
</Info>\n
</Notify>\n
Bye #
同一个会话,CSeq 要 +1
Invite->100->200->Ack ->Bye->200
Bye 的包,From 和 To 要和 Ack 的一致(包括 tag
),Call-ID 也要一致
包字段 #
SN(命令序列号) #
MANSCDP 消息中的 SN 值用于与请求命令的匹配处理,响应命令中的 SN 值应使用请求命令中的 SN 值。
SIP Proxy #
SIP Proxy 有分为两种模式,一种是状态代理模式,另外一种是无状态代理模式。
SIP 代理自己本身不能发起 INVITE
或者 BYE
请求,这样就不能满足 IP 语音通信的基本呼叫功能。
双方终端通过多个 Proxy 代理以后,根据 Route Set
返回处理流程。
但是,在一些情况下,如果终端忽略了 Route Set
以后,直接通过呼叫方和被呼叫方,双方可能进行非法呼叫,
它们跳过了代理服务器,导致业务控制层很难对其进行管理。
为了解决这个问题,引入了 B2BUA
机制,通过背靠背的方式来实现业务能力的管理和会话的管理
开源实现 #
Kamalio #
OpenSIPS #
B2BUA #
B2BUA 是一个逻辑实体,它由一个 UAS 和一个 UAC 两个部分构成,分别负责接收请求,处理请求和生成请求。 B2BUA 和 SIP 代理不同,它必须保持在 dialog 中所有创建的请求。只有这样,B2BUA 才能完全控制所有需要管理的会话。
B2BUA 具体的构成如下:
B2BUA 介于两个终端之间
- UAC 对 B2BUA 发起一个 INVITE 请求,在 B2BUA 端,B2BUA 是一个 UAS 来接收这个请求,创建了第一个会话来管理这个请求。双方保存了彼此的 Route Set 记录消息。
- 为了对另外一个终端发起 INVITE 请求,B2BUA 同时也扮演了一个 UAC 的角色,它创建了第二个会话,并且再次对下游终端发起 INVITE 请求。这里,UAC 需要从 UAS 端拷贝 SDP 消息和其他必要消息内容。然后,UAC 对下游终端发起 INVITE 请求。终端接收了 INVITE 请求,并且保存了 Route Set 数据记录。
- 为了响应 INVITE 请求,这里,下游终端就会变成一个 UAS 回复 B2BUA 200 OK。B2BUA 再次拷贝 200 OK 的消息,然后通过 UAS 再次返回到 UAC 终端。
- UAC 终端收到 200 OK 以后,保存为 Route Set 数据内容。
为什么需要 B2BUA #
如果计费模块检测到双方呼叫费用出现超额的时候,这时,B2BUA 会切换成 UAC/UAC 的状态,同时对终端发送 BYE 消息。
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。