sip编程开发基础入门 联系客服

发布时间 : 星期四 文章sip编程开发基础入门更新完毕开始阅读94357508ba1aa8114431d9e0

SIP 学习入门范例 (1)

学习 SIP 协议最快捷的方法是通过范例来学习,因此我从 Understand SIP 上找了4个最简单呼叫过程来分析。通过对这些流程图以及每个呼叫所包含的消息体文本分析,尽快熟悉 SIP 呼叫原理。 PS. 如果有什么地方说明不妥,请告诉我

一、基本 SIP 会话建立范例

下面的流程图显示出最简单的 SIP 呼叫流程。它由两个呼叫终端组成(其实真正的系统并没有这么简单),呼叫终端可以为 SIP 电话机或者具备 SIP 功能的手机等终端设备。在这里我们假设它是能够连接到 IP 网的终端设备,并且它们已经知道对方的 IP 地址。

PS. 因为这是第一节,每个字段我们讲得会比较详细,后面章节如何字段意义差不多,我们将会省略。对于某些常用的,有重要意义的字段,我们还将在专门的地方说明。 INVITE

主叫方Tesla首先发起 INVITE 消息到被叫方Marconi。INVITE 消息包含会话类型和一些呼叫所必须的参数。会话类型可能是单纯的语音,也可能是网络会议所用的多媒体视频,还可能是游戏会话。下面是消息体范例,我们来详细分析各个字段的意义: INVITE sip:marconi@radio.org SIP/2.0

<= 请求方法、请求地址(Request-URI)、SIP 版本号(目前都是 SIP/2.0) <= 请求地址一般就是被叫方地址,跟 MSN 中好友 eMail 地址类似 Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b <=SIP 版本号(2.0)、传输类型(UDP)、呼叫地址、 <=branch是一随机码,它被看作传输标识

<=Via 字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成 <=传输类型可以为 UDP、TCP、TLS、SCTP Max-Forwards: 70

<=最大跳跃数,就是经过 SIP 服务器的跳跃次数,主要是防止循环跳跃 <=每尽管一台代理服务器,该整数减一 To: G. Marconi

From: Nikola Tesla ;tag=76341 <=表示请求消息的发送方和目标方

<=如果里面有用户名标签,地址要求用尖括号包起来

<=对于 INVITE 消息,可以在 From 字段中包含 tag,它也是个随机码 Call-ID: 123456789@lab.high-voltage.org

<=呼叫ID是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变

<=对于用户代理发送 INVITE 消息,本地将生成 From tag 和 Call-ID 全局唯一码,被叫方代理则生成 To tag 全局唯一码。这三个随机码做为整个对话中对话标识(dialog indentifier)

在通话双方使用。 CSeq: 1 INVITE

<=CSeq,又叫命令队列(Command Seqence),每发送一个新的请求,该数自动加1 * 以上几个字段是所有 SIP 消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须 Subject: About That Power Outage...

Contact:

<=Contact 是 INVITE 消息所必须的,它用来路由到被叫设备地址,也称为用户代理(UA) Content-Type: application/sdp Content-Length: 158

<=最后两位附属字段说明消息体类型以及字段长度 v=0 <=SDP版本号,目前都是 0

o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org <=主叫源地址,类型等 s=Phone Call <=主题

c=IN IP4 100.101.102.103 <=连接 t=0 0 <= 时间戳

m=audio 49170 RTP/AVP 0 <=媒体 a=rtpmap:0 PCMU/8000 <=媒体属性 <=从上面 SDP 消息体我们可以得出下面信息 <=连接 IP 地址:100.101.102.103 <=媒体格式:audio <=端口号:49170 <=媒体传输类型:RTP <=媒体编码:PCM u Law <=采样率:8000 Hz 180 Ringing

当被叫方接收到 INVITE 请求消息后,将回复 180 Ringing。顾名思义,就是发回铃音,提示主叫方电话已连接上了,正等待被叫应答。被叫方接收到 INVITE 消息后也会发生响铃或者其它有呼入提示,这由被叫方设定(我们可以把它想象成我们自己设定手机铃声)。对于 180 响应又被称为“消息及时响应”,它是一种用来测试被叫状态的一种响应。因此它所包含的信息不多,具体 180 响应消息如下:

SIP/2.0 180 Ringing

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b

;received=100.101.102.103 <=这里增加一个 received 参数,标识接收方 IP 地址 To: G. Marconi ;tag=a53e42 <=上已提到,To tag 做为被叫方标识

From: Nikola Tesla ;tag=76341 <=要求很发送方 From tag 一致

Call-ID: 123456789@lab.high-voltage.org CSeq: 1 INVITE

Contact:

Content-Length: 0

<=对于 180 Ringing 响应,基本上就是将 INVITE 的 Via、To、From、Call-ID 和 CSeq 内容复制过来,对于首行标出 SIP 版本号,响应代码(180)和动作原因(reason phrase) <=注意这里 From 和 To 地址,因为它们用来指定呼叫方向,因此这里的 200 OK 响应并没有将地址对调,仍然保持原样。一点不同的是 To 头字段添加了由被叫方 Marconi 生成的 tag 标识 200 Ok

被叫响铃后,如果被叫用户 Marconi 接起电话,则发出 200 OK 响应。这个响应除了做为接通指示之外,还有一个功能是用来指定被叫允许的连接媒体格式,让主叫方确认是否可以接收该媒体。 消息体如下: SIP/2.0 200 OK

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b ;received=100.101.102.103

To: G. Marconi ;tag=a53e42

From: Nikola Tesla ;tag=76341 Call-ID: 123456789@lab.high-voltage.org CSeq: 1 INVITE

Contact: Content-Type: application/sdp Content-Length: 155 <=头字段部分基本同上 v=0

o=Marconi 2890844528 2890844528 IN IP4 tower.radio.org s=Phone Call

c=IN IP4 200.201.202.203 t=0 0

m=audio 60000 RTP/AVP 0 a=rtpmap:0 PCMU/8000

<=从上面 SDP 消息体我们可以得出下面信息 <=终端 IP 地址:200.201.202.203 <=媒体格式:audio <=端口号:60000 <=媒体传输类型:RTP <=媒体编码:PCM u Law <=采样率:8000 Hz ACK

通话前最后一步是主叫方确认 200 OK响应。该项确认证明连接被允许,即将使用另一种协议开始媒体连接。这另一种协议是上面在 SDP 消息段中所协商好的 RTP 格式。该 ACK 响应内容如下:

ACK sip:marconi@tower.radio.org SIP/2.0

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g Max-Forwards: 70

To: G. Marconi ;tag=a53e42

From: Nikola Tesla ;tag=76341 Call-ID: 123456789@lab.high-voltage.org CSeq: 1 ACK Content-Length: 0 BYE

通话完毕后,由被叫方 Marconi 首先挂机,发送 BYE 请求命令。注意这回由 Marconi 做为主叫方了,因此 Via 字段和 From、To 与 INVITE 字段有所不同。其实也就是倒置。 BYE sip:n.tesla@lab.high-voltage.org SIP/2.0

Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf Max-Forwards: 70

To: Nikola Tesla ;tag=76341 From: G. Marconi ;tag=a53e42 Call-ID: 123456789@lab.high-voltage.org CSeq: 1 BYE Content-Length: 0 200 OK

BYE 之后,要求被叫方发 200 Ok 确认,也就是让主叫知道被叫已经知道你挂断了。(注意这里所说的主被叫角色已经倒过来了)打个比方,通话之后,有一方要求挂机,另一方需要知道它已经挂机了。

SIP/2.0 200 OK

Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf ;received=200.201.202.203

To: Nikola Tesla ;tag=76341 From: G. Marconi ;tag=a53e42 Call-ID: 123456789@lab.high-voltage.org CSeq: 1 BYE Content-Length: 0

到此,我们已经将最简单的呼叫过程讲完了。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方 IP 地址即可。现实生活中这种呼叫形式是很少见的。后面我们将继续介绍另一种利用代理方式进行呼叫连接。 留个疑问:为什么说这种点对点的方式比较少用?