SIP学习笔记
SIP
会话发起协议(SIP,Session Initiation Protocol)
在VoIP技术中使用的最常见的协议之一。它是一种应用层协议,与其他应用层协议协同工作,以控制Internet上的多媒体通信会话。
概述
- 规范文档RFC3261
- 客户端 - 服务器体系结构
- 结合HTTP的URL和URI和SMTP 的文本编码方案和标题样式
- DP描述了用于通过IP网络传递语音和视频的会话和RTP(实时传输协议)
- 可用于双方(单播)或多方(多播)会话
- 文件传输,即时消息,视频会议,在线游戏和流多媒体分发等应用场景
组成对象
- 用户代理
- 代理服务器
- 注册服务器(PBX)
- 重定向服务器
- 位置服务器
用户代理
用户代理是SIP网络中最智能的设备或网络元件。
- 包括电话,软终端,电脑
- 逻辑上包括UAC、UAS(主叫与被叫)
代理服务器
从用户代理接收请求并将其转发给另一个用户的网络元素。
- 包括有状态和无状态
注册服务器
接受来自用户代理的注册请求,用来验证网络中的用户。将URI和用户的位置存储在数据库中,以帮助同一域中的其他SIP服务器。
注册流程
- 发送注册报文
- 发送认证报文
重定向服务器
- 重定向服务器接收请求并在由注册器创建的位置数据库中查找请求的预期接收者。
- 重定向服务器使用数据库获取位置信息,并以3xx(重定向响应)向用户作出响应。
位置服务器
用来提供呼叫者的位置信息,与代理服务器和冲顶吸纳更服务器联系
SIP分层处理结构
自底向上分别是语法和编码、传输层、交易层、交易使用者
- 语法和编码:编码使用BNF(范式?)指定
- 传输层:定义C-S请求响应。包括所有SIP元素。
- 交易层:事务是由客户机事务(使用传输层)发送到服务器事务的请求,以及从服务器事务发送回客户机的对该请求的所有响应。用户代理客户端(UAC)完成的任何任务都使用一系列事务进行。无状态代理不包含事务层。
- 交易使用者:交易层上方
呼叫流程
- 发送到代理服务器的INVITE请求负责启动会话。
- 代理服务器立即向呼叫者(Alice)发送** 100 Trying **响应以停止INVITE请求的重传。
- 代理服务器在位置服务器中搜索Bob的地址。在获得地址之后,它进一步转发INVITE请求。
- 此后,由Bob产生的** 180响铃**(临时响应)被返回给Alice。
- Bob在接听电话后立即生成** 200 OK **响应。
- Alice收到** 200 OK 时,Bob会收到来自Alice的 ACK **。
- 同时,会话建立并且RTP分组(对话)开始从两端流动。
- 在对话之后,任何参与者(Alice或Bob)可以发送** BYE **请求以终止会话。
- **BYE **直接从Alice到Bob绕过代理服务器。
- 最后,Bob发送** 200 OK **响应以确认BYE并且会话终止。
- 在上述基本呼叫流程中,三个事务(标记为1,2,3)可用。
SIP梯形
信令通过代理服务器处理,媒体流可以直接点对点传输。分开通讯
- 当呼叫者发起呼叫时,向代理服务器发送INVITE消息。在接收到INVITE时,代理服务器尝试在DNS服务器的帮助下解析被调用者的地址。
- 在获得下一个路由之后,呼叫者的代理服务器(代理1,也称为出站代理服务器)将INVITE请求转发到被叫者的代理服务器,该代理服务器充当被叫者的入站代理服务器(代理2)。
- 入站代理服务器与位置服务器联系以获取有关用户注册的被叫方地址的信息。
- 在从位置服务器获取信息之后,它将呼叫转发到其目的地。
- 一旦用户代理知道他们的地址,他们可以绕过呼叫,即对话直接传递。
SIP消息
核心方法包括:INVITE、BYE、REGISTER、CANCEL、ACK、OPTIONS
拓展方法:SUBSCRIBE、NOTIFY、PUBLISH、REFER、INFO、UPDATE、PRACK、MESSAGE
INVITE
发起会话,建立会话
-
可以通过sdp描述媒体信息
-
接受2xx或发送ACK为会话建立。
-
在已建立的对话中发送的INVITE被称为** re-INVITE **。
-
Re-INVITE用于更改会话特征或刷新对话框的状态。
INVITE sips:Bob@TMC.com SIP/2.0
Via: SIP/2.0/TLS client.ANC.com:5061;branch = z9hG4bK74bf9
Max-Forwards: 70
From: Alicesips:Alice@TTP.com;tag = 1234567
To: Bobsips:Bob@TMC.com
Call-ID: 12345601@192.168.2.1
CSeq: 1 INVITE
Contact: sips:Alice@client.ANC.com
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...v = 0
o = Alice 2890844526 2890844526 IN IP4 client.ANC.com
s = Session SDP
c = IN IP4 client.ANC.com
t = 3034423619 0
m = audio 49170 RTP/AVP 0
a = rtpmap:0 PCMU/8000
BYE
- 它不能由代理服务器发送。
- BYE请求通常绕过代理服务器端到端路由。
- BYE不能发送到挂起的INVITE或未建立的会话。
REGISTER
- REGISTER请求可以被转发或代理,直到它到达指定域的权威注册器。
- 它在正在注册的用户的** To **头中携带AOR(记录地址)。
- REGISTER请求包含时间段(3600秒)。
- 一个用户代理可以代表另一个用户代理发送REGISTER请求。 这称为第三方注册。 这里,** From 标签包含代表 To **标头中标识的一方提交注册的一方的URI。
CANCEL
用户代理使用此请求取消之前发起的待处理呼叫尝试。
- 它可以由用户代理或代理服务器发送。
- CANCEL是逐跳请求,即,它通过用户代理之间的元素并接收由下一个有状态元素产生的响应。
ACK
确认INVITE
- ACK可以不被用于修改已经在初始INVITE中发送的媒体描述。
- 接收ACK的状态代理必须确定ACK是否应当向下游转发到另一个代理或用户代理。
- 对于2xx响应,ACK是端到端的,但是对于所有其他最终响应,当涉及状态代理时,其工作在逐跳基础上。
OPTIONS
用于向用户代理或代理服务器查询其功能,并发现其当前可用性。 对请求的响应列出了用户代理或服务器的功能。
- 代理永远不会生成OPTIONS请求。
subscribe
用户代理使用SUBSCRIBE来建立订阅,以获得关于特定事件的通知。
- **Expires **头字段,用于指示订阅的持续时间。
- 在该时间段过去之后,订阅将自动终止。
- 订阅在用户代理之间建立对话。
- 您可以在到期时间之前在对话框中发送另一个SUBSCRIBE再次重新订阅。
- 将收到来自用户的订阅的200 OK。
- 用户可以通过发送另一个SUBSCRIBE方法取消订阅,Expires值为0(零)。
NOTIFY
- NOTIFY包含指示事件的** Event 头字段和指示订阅当前状态的 subscriptionstate **头字段。
- NOTIFY总是在订阅的开始和终止时发送。
PUBLISH
PUBLISH由用户代理用于向服务器发送事件状态信息。
- 当有多个事件信息来源时,PUBLISH是最有用的。
- PUBLISH请求类似于NOTIFY,除了它不是在对话框中发送。
- PUBLISH请求必须包含** Expires 头字段和 Min-Expires **头字段。
REFER
引用另一个用户代理来访问对话框的URI
- refer-to
- 在对话框内或外部发送
- ACK202指示其他用户代理已接受引用
INFO
发送信令信息
UPDATE
修改会话状态、编解码方式。
PRACK
用于确认接收到临时响应(1XX)的可靠传输。
- 通常,当客户端接收到包含** RSeq 可靠序列号和支持的:100rel **头部的临时响应时,PRACK就会生成。
- PRACK在** rack **标题中包含(RSeq& plus; CSeq)值。
- PRACK方法适用于所有临时响应,除了100 Trying响应,其从未可靠地传送。
- PRACK可以包含消息体; 它可以用于提供/应答交换。
Message
使用SIP发送即时消息。作为MIME附件传送。
SIP响应代码
-
1xx:临时信息响应。用于指示呼叫进度。
- 100Trying:用于避免重新发送** INVITE **个请求
- 180振铃:收到** INVITE ,并且正在进行警报**。
- 182呼叫排队:已接收,在队列中处理
- 183会议进展:典型使用是允许UAC在通过网关进入PSTN的呼叫中听到铃声记录的通知。
-
2xx:响应成功
- 200 OK
- 202 接受:通常用于响应SUBSCRIBE,REFER方法。
-
3xx:重定向
- 300:多重悬着,Contact 返回多个待选位置。
- 301:永久重定向
- 302:临时重定向
- 305:使用代理
- 380:替代服务
-
4xx:客户端故障
-
400:错误请求
-
401:未授权
-
402:付款
-
403:forbidden
-
404:not found
-
405:方法不允许(
REGISTER请求可能会发送到用户代理。)
-
406不接受:support字段不支持
-
407:需要验证
- 响应应包含** Proxy-Authenticate **标头,通知代理所需的凭证类型。
-
408:请求超时
-
422:会话计时器间隔太小
-
423:间隔太简单
-
480:暂时不可用
-
483:跳数过多:Max-Forwards=70
-
486:用户代理正忙(客户机?)
-
487:请求以终止,取消INVITE事务
-
-
5xx:服务器故障
- 500:服务器内部错误
- 501:没有业务
- 502:bad gatway
- 503:not allow
- 504:网关超时
- 505:SIP 版本不支持
- 513:消息太大
- 580:拒绝不能满足的sdp
-
6xx:全局故障
- 600:指示对指定的Request-URI的调用可以在其他位置被应答。
- 603:拒绝
- 604:不存在位置
- 606:警告标头字段指示不接受
SIP报头
请求和响应字段
请求字段
referred-to
示例:A正在和B通话,如果A认为B需要和C通话,那么A可以发送SIP REFER请求给B,并在请求中提供了C的联系地址信息,B收到请求后将尝试呼叫C,与C建立通话。在呼叫过程中,B会向A报告呼叫的状态(是否成功等)。B与C建立通话后,A和B之间的通话会结。
Route
**Route **头字段用于为请求提供路由信息。
-
RFC 3261引入两种类型的路由:严格路由和松散路由,它们具有与相同名称的IP路由模式相似的含义。
-
在严格路由中,代理必须使用Route头字段中的第一个URI来重写Request-URI,然后将其转发。
-
在松散路由中,代理不会重写Request-URI,而是将请求转发到Route头字段中的第一个URI或另一个松散的路由元素。
-
在松散路由中,请求必须路由通过路由列表中的每个服务器,然后它可以基于请求URI路由。
-
在严格路由中,请求必须只路由通过路由头字段中的服务器集,其中在每一跳处重写Request-URI。
-
代理或UAC可以通过lr参数的存在来判断路由集中的下一个元素是否支持松散路由。
INVITE sip:user@remoteuas SIP/2.0
Route: sip:proxy1;lr,sip:proxy2,sip:proxy3;lr
严格路由:
响应字段和消息体字段
SDP会话描述协议
RFC 3264
SDP消息的一般形式是 -x = parameter1参数2 ...参数N
参数
-
v = (protocol version):0
-
o = (owner/creator and session identifier)会话标识符的信息
- 该字段包含 -o =< username>< session-id>< version>< network-type>< address-type>
- 用户名参数包含发起方的登录名或主机。
- **session-id **参数是用于确保唯一性的网络时间协议(NTP)时间戳或随机数。
- 版本是一个数字字段,对于会话的每个更改都会增加,也建议为NTP时间戳。
- 对于Internet,网络类型始终为IN。address-type参数为IPv4或IPv6地址的IP4或IP6(点分十进制形式或完全限定的主机名)。
-
s = (session name)
-
i =* (session information)
-
u =* (URI of description)
-
e =* (email address)
-
p =* (phone number)
-
c =* (connection information - not required if included in all media)
-
该字段包含 -c =< network-type>< address-type>< connection-address>
-
对于Internet,** network-type **参数定义为IN。
-
地址类型定义为IPv4地址的IP4和IPv6地址的IP6。
-
**connection-address **是将发送媒体数据包的IP地址或主机,可以是多播或单播。
-
如果组播,则connection-address字段包含 -
connection-address = base-multicast-address / ttl / number-of-addresses
-
其中** ttl **是生存时间值,并且地址数量指示从基本多播地址开始包括多少个连续的多播地址。
-
-
b =* (bandwidth information)
-
z =* (time zone adjustments)
-
k =* (encryption key)
-
a =* (zero or more session attribute lines)
-
t =字段包含会话的开始时间和停止时间。
-
m = audio 49430 RTP/AVP 0 6 8 99
- 媒体参数、port、传输协议或RTP配置文件、格式列表
- 媒体参数是音频,视频,文本,应用程序,消息,图像或控件。
- 格式列表包含有关介质的更多信息。通常,它包含在RTP音频视频简档中定义的媒体有效载荷类型。
示例:
v = 0
o = mhandley2890844526 2890842807 IN IP4 126.16.64.4
s = SDP Seminar
i = A Seminar on the session description protocol
u = http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
e = mjh@isi.edu(Mark Handley)
c = IN IP4 224.2.17.12/127
t = 2873397496 2873404696
a = recvonly
m = audio 49170 RTP/AVP 0
m = video 51372 RTP/AVP 31
m = application 32416udp wb
a = orient:portrait
建议包含a = rtpmap:的属性
提供/回答规则
生成报价,生成答案,修改会话
呼叫保持
- 通过a=sendonly暂停会话
- 通过a=sendrecv重新激活
SIP移动性
SIP 支持移动时服务能力。
呼叫前对新代理服务器进行注册完成切换即可,旧服务器会使用302重定向消息过来。
通话中检测到网络变更,在ip、注册切换完成重新INVITE修改会话状态继续通信。如果出现意外将导致轻微中断。
midcall中移动,指在代理变更时的通信中。不能re-INVITE,应该通过Replaces。
- Tom和Jerry之间的现有对话包括旧的访问代理服务器。
- 使用新无线网络的新对话框需要包括新的访问代理服务器。
- 结果,由Tom发送具有Replaces的INVITE,其创建包括新访问的代理服务器但不包括旧的访问的代理服务器的新对话。
- 当Jerry接受INVITE时,会自动发送一个BYE,以终止通过现在不再包含在会话中的旧访问代理服务器路由的旧对话。
- 使用来自INVITE中的SDP的Tom的新IP地址来建立所得到的媒体会话。
SIP分叉
- 平行分叉
-
代理服务器将把INVITE分叉到例如两个设备(UA2,UA3)。两个设备将产生180响铃,并且接收呼叫的任何人将产生200 OK。
先到达发起者的响应(假设UA2)将与UA2建立会话。对于其他响应,将触发CANCEL。
-
- 顺序分叉
- 在这种情况下,代理服务器将INVITE分叉到一个设备(UA2)。如果UA2在那时不可用或忙,则代理将它分配到另一个设备(UA3)。
分支标签
分支标识帮助代理匹配对分叉请求的响应。没有分支ID,代理服务器将无法了解分叉响应。分支标识将在Via标头中可用。
”z9h64bK”开头
呼叫支路和呼叫ID
呼叫是一组呼叫支路。呼叫支路是指UA之间的端到端连接。
语音邮件
当被叫方不可用或无法接收呼叫时,PBX将通知主叫方留下语音消息。
两种方法来实现这一点 -
- 通过使用SIP头字段扩展
- 通过使用Request-URI来发信号通知这个信息
sip:voicemail.tutorialspoint.com;target = sip:Tom@tutorialspoint.com;cause = 486
代理和路由
- 无状态代理:简单转发
- 状态代理服务器:记住请求,可以提前路由、分叉和重传
Via
请求逐个加入自身地址,响应逐个删除并转发,如果不匹配则丢弃。
- 如果UA或代理从与在顶部Via头字段中指定的地址不同的地址接收到请求,则将所接收的标签添加到Via报头字段。
- 分支参数通过UA和代理被添加到Via报头字段,其被计算为Request-URI的哈希函数,以及To,From,Call-ID和CSeq数。
SIP到PSTN
- 首先,(Tom)SIP电话拨打全球号码+91401234567到达Jerry。SIP用户代理将其理解为全局编号,并使用DNS将其转换为请求uri并触发请求。
- SIP电话直接向网关发送INVITE。
- 网关通过选择SS7 ISUP中继线到PSTN中的下一个电话交换机来发起进入PSTN的呼叫。
- 来自INVITE的拨号数字被映射到ISUP IAM。ISUP地址完成消息(ACM)由PSTN发回以指示中继已经创建。
- 电话产生铃声,并进入电话交换机。网关将ACM映射到183会话进度响应,其包含指示网关将用于桥接来自PSTN的音频的RTP端口的SDP。
- 在接收到183时,呼叫者的UAC开始接收从网关发送的RTP分组,并将该音频呈现给呼叫者,使得他们知道被叫者在PSTN中前进。
- 当被叫方应答电话时,呼叫完成,这使得电话交换机向网关发送应答消息(ANM)。
- 网关然后在两个方向上切断PSTN音频连接,并向呼叫者发送200 OK响应。由于RTP媒体路径已经建立,网关在183中回复SDP,但是不会改变RTP连接。
- UAC发送ACK以完成SIP信令交换。由于在ISUP中没有等效消息,网关吸收ACK。
- 呼叫者发送BYE到网关终止。网关将BYE映射到ISUP释放消息(REL)。
- 网关向BYE发送200OK,并从PSTN接收RLC。
SIP编解码器
- G.711:与PSTN网络使用的相同的编解码器,因此它提供最好的语音质量。然而,它消耗比其他编解码器更多的带宽。
- G.729:低带宽要求的编解码器; 它提供良好的音频质量。
- G.723.1
- GSM 06.10:为GSM移动网络设计的编解码器
B2BUA
B2BUA提供以下功能 -
- 呼叫管理(计费,自动呼叫断开,呼叫转移等)
- 网络互通(可能与协议适配)
- 隐藏网络内部(私有地址,网络拓扑等)
通常,B2BUA也在媒体网关中实现以桥接媒体流以完全控制会话。
应用:
- 专用交换机(PBX)
- 火墙内置了ALG(应用层网关)功能,允许防火墙授权SIP和媒体流量
- 会话边界控制器(SBC)。