欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SIP基础学习笔记

程序员文章站 2022-07-09 20:18:32
...

原文地址:http://blog.chinaunix.net/uid-20655530-id-1589483.html

 

SIP基础学习笔记
            
    
    博客分类: 流媒体socket  

学习 SIP 协议最快捷的方法是通过范例来学习,

找到了一个完整的呼叫流程,let's go

 

INVITE

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

INVITE sip:marconi@radio.org SIP/2.0
    < 请求方法、请求地址(RequestURI)、SIP 版本号(目前都是 SIP/2.0
        <
 请求地址一般就是被叫方地址,跟 MSN 中好友 eMail 地址类似

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
    <SIP 版本号(2.0)、传输类型(UDP)、呼叫地址、
        <
branch是一随机码,它被看作传输标识
        <Via 字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成
        <
=传输类型可以为 UDPTCPTLSSCTP

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

To: G. Marconi <sip:Marconi@radio.org>
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;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: <sip:n.tesla@lab.high-voltage.org>

    <
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 <sip:marconi@radio.org>;tag=a53e42    <=上已提到,To tag 做为被叫方标识
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341  <=要求很发送方 From tag 一致
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact: <sip:marconi@tower.radio.org>
Content-Length: 0
    <=对于 180 Ringing 响应,基本上就是将 INVITE  ViaToFromCall-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 <sip:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID:
 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact: <sip:marconi@tower.radio.org>
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 <sip:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID: 
123456789@lab.high-voltage.org
CSeq: 1 ACK
Content-Length: 0

BYE

通话完毕后,由被叫方 Marconi 首先挂机,发送 BYE 请求命令。注意这回由 Marconi 做为主叫方了,因此 Via 字段和 FromTo  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 <sip:n.tesla@high-voltage.org>;tag=76341
From: G. Marconi <sip:marconi@radio.org>;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 <sip:n.tesla@high-voltage.org>;tag=76341
From: G. Marconi <sip:marconi@radio.org>;tag=a53e42
Call-ID:
 123456789@lab.high-voltage.org
CSeq: 1 BYE
Content-Length: 0

 

到此,就是最简单的呼叫过程。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方 IP 地址即可。现实生活中这种呼叫形式是很少见的。