730 likes | 1.03k Views
SIP 协议初级讲义. 基本信息. 适用对象: SIP 协议初学者 学习目标: 掌握 SIP 协议的基本术语 理解 SIP/SDP 消息 掌握 SIP 协议的寻址过程 掌握媒体协商过程 掌握 SIP 呼叫流程 具有 SIP 协议的独立学习能力 时间: 3小时学习+1小时讨论. 学习内容. 1. 概述(*) 2. SIP 的功能实体 3. SIP 的寻址 4. SIP 消息体结构 (*) 5. SIP 请求消息(*) 6. SIP 响应消息. 7. Sdp 协议
E N D
基本信息 适用对象: SIP协议初学者 学习目标: 掌握SIP协议的基本术语 理解SIP/SDP消息 掌握SIP协议的寻址过程 掌握媒体协商过程 掌握SIP呼叫流程 具有SIP协议的独立学习能力 时间: 3小时学习+1小时讨论
学习内容 1. 概述(*) 2. SIP的功能实体 3. SIP的寻址 4. SIP消息体结构(*) 5. SIP请求消息(*) 6. 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协议
SIP Redirect Server Location Server IP Network 主要结构 DBMS Registrar Server SIP Proxy Server SIP Proxy Server UserAgent 图例 UserAgnet SIP协议 私有协议
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:85521717@suntektech.com • URL可以用在下面头域中: • FROM头域 FROM:<SIP:kermit@suntektech.com> • TO头域 TO:<SIP:tom@netcentrex.com> • CONTACT头域:<TEL:6831@suntektech.com> • 可以方便的嵌入网页,提供多种网上业务
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:j.doe@big.com • sip:j.doe:secret@big.com;transport=tcp • sip:j.doe@big.com?subject=project • sip:+1-212-555-1212:1234@gateway.com;user=phone • sip:1212@gateway.com • sip:alice@10.1.2.3 • sip:alice@example.com • sip:alice%40example.com@gateway.com • sip:alice@registrar.com;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) • CALL LEG (呼叫历程) Call leg用CallID(呼叫标识)、From(源方)和To(目的地)的组合来标识一个会话。 • TRANSACTION(事务) SIP定义一个请求及其最终应答称为一个事务。所有应答有相同的Call-ID,Cseq,To和From域。
4. SIP消息体结构 • 消息体结构 • 头域说明
响应的SIP版本SP状态码 SP原因短语 CRLF 请求的方法SP请求的SIP-URL SP SIP版本CRLF 起始行 Start-Line General-header | Request-header | Response-header | Entity-header 消息头域 Message-line 空行 CRLF 消息体 Message-body 消息体(SDP原码,加密的SDP,…) SIP 消息体组成
Start line(起始行详细描述) 起始行 Start-Line = request-line | status-line request-line = Method SP Request-URI SP SIP-Version CRLF INVITE sip :SS@SunTek.com SIP2.0 status-line = SIP-Version SP status-code SP phase CRLF SIP2.0 200 OK
General headers(通用头域) 路由信息:Accept | Accept-Encoding | Accept-Language | Contact | Date| Encryption| Expires | From | Record-Route |Timestamp 呼叫标示 : Call-ID, CSeq, INVITE sip: Sip@SunTek.com SIP2.0 Via: SIP/2.0/UDP proxy.SunTek.com Via: SIP/2.0/UDP sation1.SunTek.com From : Wang < sip: Wang@SunTek.com > To : softswitch <sip: Sip@SunTek.com > Call-ID : 23434@ sation1.SunTek.com CSeq: 1 INVITE Contact : Wang@SunTek.com
其他头域(请求、响应、实体) Request Headers: Hide, In-Reply-To, Max-Forwards, Priority, Proxy-Authentication, Proxy-Require, Response-Key, Subject, Route Response Headers: Proxy-Authenticate, Retry-After, Server, Unsupported, Warning, WWW-Authenticate Entity Headers: Allow, Content-Disposition, Content-Encoding, Content-Language, 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; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c • CallID: 唯一标识一个会话,保持全球的唯一性 Call-ID区分大小写 随机产生,有效的提高安全性 CallID相同,消息体不同时将更新会话 Syntax: Call-ID = (“Call-ID” | “i”)”:”local-id”@”host Example:Call-ID: f81d4fae-7dec-11d0-a765-00a0c91e6bf6@foo.bar.com
关键头域解析(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:operator@cs.columbia.edu>;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 INVITE sip:john@192.190.132.31 SIP/2.0 Via: SIP/2.0/UDP 192.190.132.20:3456 Call-ID: a2e3a@192.190.132.20 From: sip: mary@192.190.132.20 To: sip: john@192.190.132.31 Cseq 1 INVITE Content-type: application/sdp Content-Length: 98 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 Mary John SIP/2.0 200 OK v: SIP/2.0/UDP 192.190.132.20:3456 i: a2e3a@192.190.132.20 f: sip: mary@192.190.132.20 t: sip: john@192.190.132.31 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 192.190.132.20 192.190.132.31 ACK sip:john@192.190.132.31 SIP/2.0 Via: SIP/2.0/UDP 192.190.132.20:3456 Call-ID: a2e3a@192.190.132.20 From: sip: mary@192.190.132.20 To: sip: john@192.190.132.31 Cseq 1 ACK
BYE(结束会话) • 作用:结束当前会话 • 可以由UAC(主叫)或者UAS(被叫)发起 • UA收到BYE消息后,必须停止向对方发送媒体流
Bye Details BYE sip:mary@192.190.132.20 SIP/2.0 v: SIP/2.0/UDP 192.190.132.31:3456 i: a2e3a@192.190.132.20 From: sip: john@192.190.132.31 To: sip: mary@192.190.132.20 Cseq 2 BYE 192.190.132.20 SIP/2.0 200 OK Via: SIP/2.0/UDP 192.190.132.31:3456 Call-ID: a2e3a@192.190.132.20 From: sip: john@192.190.132.20 To: sip: mary@192.190.132.31 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的响应消息 • 响应消息的具体格式 • 状态码定义
状态码定义 • 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(不接受)