SIP 协议讨论 - 东营市第一中学 www.dyyz.net

Download Report

Transcript SIP 协议讨论 - 东营市第一中学 www.dyyz.net

SIP协议初级讲义
基本信息
适用对象:
SIP协议初学者
学习目标:
掌握SIP协议的基本术语
理解SIP/SDP消息
掌握SIP协议的寻址过程
掌握媒体协商过程
掌握SIP呼叫流程
具有SIP协议的独立学习能力
时间:
3小时学习+1小时讨论
学习内容
1.
2.
3.
4.
5.
6.
概述(*)
SIP的功能实体
SIP的寻址
SIP消息体结构(*)
SIP请求消息(*)
SIP响应消息
*部分将重点讲述
7.Sdp协议
8.SIP的能力协商
9.案例分析(*)
10.测验
11.实现方法入门
12.SIP学习方法
1.
SIP协议概述




基本情况
主要特点
主要结构
名词解析
基本情况






创立
组织:IETF/mmusic工作组
IP网络协议的后起之秀,是NGN的理想协
议
时间:1995开始研究
1999年2月提出草案
草案编号:RFC2543
目前版本:Version 9(Feb,2002)
主要特点






是应用层的控制协议,可以建立,修改和结束多媒体会
话。
独立于TCP或者UDP,使用自己应用层协议保证消息的
可靠传送。
消息体采用文本方式
以客户-服务器方式建立会话
灵活的寻址方式
SIP没有媒体协商功能,往往需要集成SDP协议
DBMS
主要结构
Registrar Server
SIP Redirect Server
SIP Proxy Server
Location Server
SIP Proxy Server
IP Network
UserAgent
图例
SIP协议
私有协议
UserAgnet
2.功能实体





User Agent
Proxy Server
Redirect Server
Registrar Server
Location Server
功能实体(1)
 User
Agent(呼叫代理)
是SIP网络的终端,具体的分为UserAgent
Client和UserAgent Server。UAC是客户端,表
示主叫;UAS是服务端,表示被叫。
 REGISTRAR
SERVER(注册服务器)
接受客户端的注册请求,将用户的地址信息写入
数据库,并返回注册状态。
功能实体(2)

REDIRECT SERVER(重定向服务器)
接受SIP的请求,映射请求的原地址成零个或者
多个IP地址,并且返回给客户端。 由客户端重
新发起请求。
 LOCATION
SERVER(定位服务器)
管理若干数据库,接受由Redirect Server或者
Proxy Server的路由查询。
功能实体(3)
Proxy
Server(代理服务器)
完成SIP消息的转接和转发功能,可以修改SIP消
息内容。具体功能有:
呼叫认证
状态管理
路由选择
失败重传
3. SIP协议的寻址




SIP URL
URL的表示规则
定位UserAgent
定位方式
SIP URL
 SIP依靠URL进行路由。SIP
URL的格式可以是EmailID
或者是E.164地址。
SIP: user@host
TEL:[email protected]
 URL可以用在下面头域中:
 FROM头域
FROM:<SIP:[email protected]>
 TO头域
TO:<SIP:[email protected]>
 CONTACT头域:<TEL:[email protected]>
 可以方便的嵌入网页,提供多种网上业务
URL的表示规则
SIP-URL = "sip:" [ userinfo "@" ] hostport
url-parameters [ headers ]
userinfo
= user [ ":" password ]
user
= *( unreserved | escaped
| "&" | "=" | "+" | "$" | "," )
password
= *( unreserved | escaped
| "&" | "=" | "+" | "$" | "," )
hostport
= host [ ":" port ]
host
= hostname | IPv4address
hostname = *( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *(
alphanum | "-" ) alphanum
toplabel
= alpha | alpha *( alphanum | "-" )
alphanum
IPv4address = 1*digit "." 1*digit "." 1*digit
"." 1*digit
port
= *digit
url-parameters = *( ";" url-parameter )
url-parameter = transport-param | user-param
| method-param | ttl-param | maddr-param |
other-param
transport-param = "transport=" ( "udp" | "tcp"
)
ttl-param
= "ttl=" ttl
ttl
= 1*3DIGIT
; 0 to 255
maddr-param = "maddr=" host
user-param = "user=" ( "phone" | "ip" )
method-param = "method=" Method
tag-param
= "tag=" UUID
UUID
= 1*( hex | "-" )
other-param = ( token | ( token "=" ( token
| quoted-string )))
headers
= "?" header *( "&" header )
header
= hname "=" hvalue
hname
= 1*uric
hvalue
= *uric
uric
= reserved | unreserved | escaped
reserved
= ";" | "/" | "?" | ":" | "@" | "&" |
"=" | "+" | "$" | ","
digits
= 1*DIGIT
例子









sip:[email protected]
sip:j.doe:[email protected];transport=tcp
sip:[email protected]?subject=project
sip:+1-212-555-1212:[email protected];user=phone
sip:[email protected]
sip:[email protected]
sip:[email protected]
sip:alice%[email protected]
sip:[email protected];method=REGISTER
定位Proxy服务器
 配置UA指向Proxy
Server
 配置UA指向Redirect
Server,由Redirect Server
分配合适的Proxy Server
定位SIP UserAgent Server(被叫)
 User
Agent激活时通过Registrar Server注册。
 Proxy Server通过Location Server得到User
Agent Server的路由。
 Proxy Server根据地址呼叫UserAgent Server
 如果没有能到达UserAgent Server的路由,必须
返回UserAgent Client(主叫)具体的原因,包
括代码和文字的原因。
定位UserAgent的方式
 简单方式
主叫Proxy可以直接发送请求消息到被叫,建立
会话。只适应小型网络。
 复杂方式
主叫的Proxy Server也可以发请求消息到被叫
的Proxy Server,由Proxy Server根据URI重
新定位UserAgent Server。
注意的问题(1)
 Location
Server可能会返回几个位置,Proxy
Server可以决定如何处理。
 如果Proxy
Server转发SIP 请求,它必须将自
己的IP地址加入到Via部分的开头。而在返回的
时候,将Via域中的地址去掉。
注意的问题(2)
 在进行Forks定位时,用相同的Call-ID,Cseq,
而Tags不同。
 Proxy有两种形式:
 有状态
返回UserAgent 100消息,表示Proxy 可以完成
状态的管理
 无状态
Proxy不能管理呼叫状态,必须有UserAgent自
己解决
注意的问题(3)(比较CallID/CSeq/Tag)












CallID 是会话的唯一标志
一个会话过程使用同一个CallID
随机产生
Cseq 是会话命令的序列
一个Transaction使用同一个Cseq
32位无符号整数
判断命令的版本
以Bye结束会话时增加
“tag”是一个标签,用来区别会话中的不同对象。
出现在请求的From头域中,当共享同一个SIP地址的用户的两个
实例使用同一个Call-ID发出邀请时,必须使用此“tag”。
Proxy使用tag来判断消息是传给自己,还是给用户。
单个用户的Tag在呼叫过程中保持一致
注意的问题(4)
LEG (呼叫历程)
Call leg用CallID(呼叫标识)、From(源方)
和To(目的地)的组合来标识一个会话。
 CALL
 TRANSACTION(事务)
SIP定义一个请求及其最终应答称为一个事务。
所有应答有相同的Call-ID,Cseq,To和From域。
4. SIP消息体结构


消息体结构
头域说明
SIP 消息体组成
响应的SIP版本SP状态
码 SP原因短语 CRLF
起始行
Start-Line
消息头域
Message-line
空行
CRLF
消息体
Message-body
消 息体( SDP原 码,加 密的
SDP,…)
请求的方法SP请求的SIP-URL
SP SIP版本CRLF
General-header
| Request-header
| Response-header
| Entity-header
Start line(起始行详细描述)
起始行
Start-Line = request-line | status-line
request-line =
Version CRLF
Method SP Request-URI SP SIPINVITE sip :[email protected]
SIP2.0
status-line
phase CRLF
=
SIP-Version SP status-code SP
SIP2.0
200
OK
General headers(通用头域)
路由信息:Accept | Accept-Encoding | Accept-Language |
Contact | Date| Encryption| Expires | From | Record-Route
|Timestamp
呼叫标示
: Call-ID, CSeq,
INVITE sip: [email protected] SIP2.0
Via:
SIP/2.0/UDP proxy.SunTek.com
Via:
SIP/2.0/UDP sation1.SunTek.com
From :
Wang < sip:
[email protected] >
To : softswitch <sip: [email protected]
Call-ID : 23434@ sation1.SunTek.com
CSeq: 1
INVITE
Contact : [email protected]
>
其他头域(请求、响应、实体)
Request Headers:
Hide, In-Reply-To, Max-Forwards, Priority, ProxyAuthentication, Proxy-Require, Response-Key, Subject,
Route
Response Headers:
Proxy-Authenticate, Retry-After, Server, Unsupported,
Warning,
WWW-Authenticate
Entity Headers:
Allow, Content-Disposition, Content-Encoding, ContentLanguage, Content-Length, Content-Type, Expires
关键头域解析(Accept,CallID)
 Accept :
指明请求方所能接受的响应类型.
媒体类型: Internet media types, defined in MIME
缺省值是 application/sdp.
syntax
Accept : # ( */* | type/* | type/subtype ) ; q= value;
Example : Accept : text/plain;
text/x-dvi;
 CallID:
q=0.5,
q=0.8,
text/html,
text/x-c
唯一标识一个会话,保持全球的唯一性
Call-ID区分大小写
随机产生,有效的提高安全性
CallID相同,消息体不同时将更新会话
Syntax: Call-ID = (“Call-ID” | “i”)”:”local-id”@”host
Example:Call-ID: [email protected]
关键头域解析(Cseq)

Cseq

对于每一个请求,客户必须使用Cseq(Command sequence)通
用头域
重传请求用相同的Cseq
ACK和CANCEL相应必须返回跟INVITE请求相同的Cseq
BYE请求释放一个请求时必须含有以更高数值的Cseq
用户代理服务器必须记住同一个Call-ID的INVITE请求的最高序列数。
所有在并行搜寻中产生的请求拥有和触发此并行搜寻的请求一样的
Cseq值。





Syntax: Cseq =“Cseq” “:” 1*DIGIT Method
Funtion:不用比较消息体就可以将不同消息区分开来
Example: CSeq: 4711 INVITE
关键头域解析(From,To)

From(源地址)


请求和响应必须包含From通用头域,指示请求的初始者
“tag”可以出现在一个请求的From头域中,当共享同一个SIP地址的用户
的两个实例使用同一个Call-ID发出邀请时,必须使用此“tag”, 如Forks。

To(目的地地址)
To通用头域说明了请求的接收者
 如果请求包含了不止一个Via头域,则必须增加“tag”参数。
Syntax:
To =(“To” | “t”)“:”(name-addr | addr-spec)*(“;”addr-params)
Example:
To: The Operator <sip:[email protected]>;tag=287447

关键头域解析(Max-Forwards,Via)

Max-Forwards(最大前转数目)


用来限制前转请求的代理或者网关的数目,防止死循环。
适用于任何请求方式,
防止死循环的还有Via域

Via

头域指示请求迄今为止所走的路径。
确保消息能够迎着原请求路径返回
防止死循环



关键头域解析(Content-Length)

Content-Length(内容长度)

实体头域指示消息体的长度。形式上以八个比
特为一个字节。

服务器如果收到一个包含有Content-Length域的
UDP请求。但它的值比消息体的实际长度大,
客户则应产生一个400类的响应。
关键名词解析(Subject)

Subject(标题)
为请求头域提供了一个摘要,或者指示了呼叫的实际情
况
 可以不必分析通话描述便可过滤呼叫。
Syntax:
Subject = (“subject” | “s”)“:”*TEXT-UTF8


Timestamp(时间标记)

指示客户何时向服务器发送请求
服务器不能修改此值
可以计算Round-Trip时间,以便更改TimeOut时间


5. SIP请求消息






INVITE
ACK
BYE
REGISTER
CANCEL
OPTIONS
INVITE(会话邀请)
 INVITE用于发起一个会话请求,建立会话的三
个基本头域参数(CallID,From,To)。此三个基
本参数在会话过程中保持不变。
 INVITE消息体中带有本次会话的基本参数



连接地址
主叫媒体能力
带宽指示
ACK(邀请证实)
 证实INVITE请求
 ACK只和INVITE请求一起使用
 ACK有UserAgent
Client(主叫)发出
 ACK中的CallID,From,To,Cseq由INVITE消息复
制而来
Invite Details
Mary
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 192.190.132.20:3456
Call-ID: [email protected]
From: sip: [email protected]
To: sip: [email protected]
Cseq 1 INVITE
Content-type: application/sdp
Content-Length: 98
John
v=0
o=mary 3123 121231 IP IP4 192.190.132.20
c=IN IP4 192.190.132.20
m=audio 49170 RTP/AVP 0
192.190.132.20
SIP/2.0 200 OK
v: SIP/2.0/UDP 192.190.132.20:3456
i: [email protected]
f: sip: [email protected]
t: sip: [email protected]
Cseq 1 INVITE
c: application/sdp
l: 98
v=0
o=john 5664 456456 IP IP4 192.190.132.31
c=IN IP4 192.190.132.31
m=audio 23244 RTP/AVP 0
ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 192.190.132.20:3456
Call-ID: [email protected]
From: sip: [email protected]
To: sip: [email protected]
Cseq 1 ACK
192.190.132.31
BYE(结束会话)
 作用:结束当前会话
 可以由UAC(主叫)或者UAS(被叫)发起
 UA收到BYE消息后,必须停止向对方发送媒体
流
Bye Details
BYE sip:[email protected] SIP/2.0
v: SIP/2.0/UDP 192.190.132.31:3456
i: [email protected]
From: sip: [email protected]
To: sip: [email protected]
Cseq 2 BYE
192.190.132.20
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.190.132.31:3456
Call-ID: [email protected]
From: sip: [email protected]
To: sip: [email protected]
Cseq 2 BYE
192.190.132.31
REGISTER(用户注册)
 用于UA向Registrar
Server中登记
 Request-URI:要注册的域名
 To:Registrar Server分析To头域的URI,将其
与UA的IP地址关联起来
 Contact:UA发送注册信息中有可选的Contact
头域,可以将Contact的URI也关联到UA的IP地
址。
注册例子
CANCEL(取消会话)

作用:取消正在建立的会话(注意不能取消已经
建立的会话)

UA收到CANCEL命令时,如果发现CallID,
FROM,TO和Cseq一致时,便取消本次会话。

典型应用:Proxy 取的用户的几个联系地址,同
时发起邀请,但其中有些有返回时,对其他还没
有返回的地址,可以发送CANCEL。
OPTIONS(能力查询)
 用途
在发送会话请求之前查询UserAgent Server的能
力集
 响应消息复制OTIONS命令的CALLID,FROM,
TO值
 返回的能力可以在下面的头域中取得:
 Allow:支持的消息(INIVTE,ACK等)
 Accept-Language:支持的语言
 SDP:支持能力
6.SIP的响应消息


响应消息的具体格式
状态码定义
SIP响应消息的格式
The SIP response format.
Status Line
SIP/2.0 302 Moved temporarily
From: sip:[email protected]
To: sip:[email protected];tag=2332462
Call-ID: [email protected]
Location: sip:[email protected]
Expires: Wed, 29 Jul 1998 9:00:00 GMT
CSeq: 1 INVITE
Headers
Blank Line
Response Data
(clear SDP,
encrypted SDP, text/plain or text/html)
状态码定义






1xx Responses - Information Responses
2xx Responses - Successful Responses
3xx Responses - Redirection Responses
4xx Responses - Request Failures Responses
5xx Responses - Server Failure Responses
6xx Responses - Global Failure Responses
Status Code(1XX,2XX,3XX)

Informational 1xx


100 Trying(尝试)
180 Ringing(振铃)
181 Call Is Being Forwarded(呼叫正被前转)

Successful 2xx 请求成功,终止搜寻


指示消息
200 OK(成功)

Redirection 3xx 重定向

300 Multiple Choices(多个选择)
301 Moved Permanently(永久转移)
302 Moved Temporarily(临时转移)
305 Use Proxy(使用代理)
380 Alternative Service(可选的服务)




Status Code(4XX)

Request Failure 4xx (客户端请求失败)

400 Bad Request(错误请求)
401 Unauthorized(未鉴权)
402 Payment Required(需要支付(付款))
403 Forbidden(禁止)
404 Not Found(未找到)
405 Method Not Allowed(方式不允许)
406 Not Acceptable(不接受)
407 Proxy Authentication Required(需要代理验证)
486 Busy Here(本地忙)








Status Code(5XX,6XX)

Server Failure 5xx(服务器失败5XX)


500 Server Internal Error(服务器内部错误)
501 Not Implemented(未实现)
502 Bad Gateway(错误的网关)
503 Service Unavailable(无效服务)
504 Gateway Time-out(网关超时)
505 Version Not Supported(不支持的版本)

Global Failure 6xx

600 Busy Everywhere(全忙)
603 Decline(拒绝)
604 Does Not Exist Anywhere(不存在)
606 Not Acceptable(不接受)







7. SDP协议介绍



协议概述
协议格式
理解SDP协议
SDP协议概述

协议说明

全称是Session Description Protocol (By ITEF/MMUSIC)

SDP功能概述

通过会话公告将会议的地址,时间,媒体和建立等信息告知的
会话参加者,获得这些信息后可以加入会话。

SDP的责任和传送

SDP定义了会话描述的统一格式,但并不定义多播地址的分配
和SDP消息的传送,也不支持媒体编码方案的协商
SDP描述的信息封装在传送协议中发送,典型的会话传送协议
包括:会话公告协议(SAP,SIP,RTSP,HTTP )

SDP的传送格式
Header
Text Payload




Header: 所用会话协议的控制信息
Text payload: 是SDP的会话描述。
文本的Payload必须小于1K byte
一个包中只能有一个会话。
会话描述格式


综述
SDP会话描述由很多文本行组成,每个文本行的格式是
<type>=<value>
1)<type>是一个字符,<value>取决于<type>的变化。
2)两者必须区分大小写(通常都是小写)
3)<value>一般由多个字段组成,各个字段由一个空格符
分隔,也可以是一个自由格式阿文本串。
4)“=”两侧不允许有空格。
会话描述格式
Session Description
v=(protocol version)
o=(owner/creator
and session identifier).
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)
b=* (bandwidth information)
One or more time descriptions
(see below)
z=* (time zone adjustments)
k=* (encryption key)
a=* (zero or more session
attribute lines)
Zero or more media descriptions
(see below)
Sdp语法










Time description
t= (time the session is active)
r=* (zero or more repeat times)
Media description
m= (media name and transport address)
i=* (media title)
c=* (connection information - optional if included
at session-level)
b=* (bandwidth information)
k=* (encryption key)
a=* (zero or more media attribute lines)
例子
v=0
版本是0
o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4
o=<username> <session id> <version> <network type> <address
type><address>
<session id> 取决于NTP(Network Time Protocol)
<version> is increased when a modification is made
s=SDP Seminar //只能有一个Session name
i=A Seminar on the session description protocol
对于会话水平和媒体水平,都只能是一个i.
u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps //可选的,允许有多个URI
[email protected] (Mark Handley)
p=+44-171-380-777 // Email&Phone,可多选,也可不选。+表示国家代码; -表
示号码连接符
c=IN IP4 224.2.17.12/127/3 // Connection Data
 // c=<network type> <address type> <connection address>
 // IN stand for Internet //127 stand for TIME TO LIVE (range 0-255)
 //3表示后面连接的地址生命期是127
b=12345678:8 // b=<modifier>:<bandwidth-value>。可选项,modifier
是带宽的修饰语,带宽值的单位是kilobits/second
t=2873397496 2873404696
// t=<start time> <stop time> 如果
stop time 为零,则会话无效;如果start time 为0,则永久有效。注
意要写上start time 和 stop time,以防止防止意外。
K= uri:<202.1.2.3> // Encryption Keys k=<method>:<encryption key>
// 到URI指定的地址取密钥
a=recvonly
// a=<attribute>
m=audio 49170 RTP/AVP 0
// 可多选 m=<media> <port> <transport> <fmt list>
// AVP=audio/video profile
// <fmt list> 参考下页表
m=video 51372 RTP/AVP 31
Payload types for standard audio encoding
Audio Encoding
Payload type
1016
1
DVI4
5, 6
G721
2
G722
9
G728
15
GSM
3
L16
10, 11
LPC
7
MPA
14
PCMA
8
PCMU
0
8 . 能力协商


协商介绍
协商例子
UA能力协商概述
 主叫携带能力集
INVITE的消息体中带有UAC(主叫)的能力集
 被叫证实能力
UAS(被叫)在从主叫的能力集中选择一种,
通过200 OK消息返回
 根据消息体中的IP地址和端口号创建RTP流
c=IN IP4 192.190.132.3
(例子参加案例分析之“基本呼叫”)
9.案例分析



最简单的呼叫
经过两个Proxy的呼叫
呼叫转移
例子一:最简单的呼叫
Mary
192.190.132.20
John
INVITE
[email protected]
c=IN IP4 192.190.132.20
m=audio 49170 RTP/AVP 0 3
192.190.132.31
John’s terminal rings
180 Ring
200 OK
c=IN IP4 192.190.132.31
m=audio 12345 RTP/AVP 3
ACK
GSM Stream
BYE
200 OK
Port 12345
The response indicates that
John’s terminal can receive
GSM data, on port 12345
例子二:经过两个Proxy的呼叫
例子三: 遇忙转移
Proxy
User A
INVITE
100 Trying
User B1
INVITE
468 Busy
ACK
INVITE
180 Ringing
180 Ringing
200 OK
200 OK
ACK
ACK
Both way RTP voice
BYE
200 OK
BYE
200 OK
10. 测验
1. SIP网络的主要功能实体是什么?
2. SIP协议有什么请求消息?
3. SIP如何寻址?
4. 如何进行媒体协商?
5. 画出经过一个Proxy Server的呼叫序列图
11. SIP协议的实现方法入门




概述
封装消息
解析消息
状态机
实现方法概述
封装消息
INVITE
内存对象
字符串消息
CallID
From
To
CallID
From
To
EnCode
解析消息
State
内存对象
CallID
From
To
字符串消息
DeCode
CallID
From
To
状态机的实现
12. SIP的继续学习方法
1. SIP协议原文(RFC2543)
2. SIP协议的扩展(RFC2976)
3. SIP的权威站点
1)http://www.ietf.org/html.charters/sip-charter.html(官方站点)
2) Http://www.sipforum.com(最新应用)
3) Http://www.sinpcenter.com(最新应用)
4) Http://www.vovida.org(免费源代码组织)
5) http://www.cs.columbia.edu/~hgs/sip/(SIP的哥伦比亚大学老家)
Contact me when you
are troubled with SIP.
It is my pleasure to
discuss with you!
Kermit