SIP 消息

来源:互联网 发布:java lucene 全文检索 编辑:程序博客网 时间:2024/05/16 17:59

SIP协议是一个基于文本的协议,其消息包括请求和响应。


消息格式

开始行(请求行、状态行)// 请求行(方法 Request-URI 版本)/响应行(版本 状态码 信息)
消息头域空行
(CRLF)//”\r\n”
[消息体]
消息体包含媒体信息,采用SDP协议描述


SIP请求主要方法:

INVITE: 表示请求用户或服务加入一个会话
ACK:用来确认客户已经收到了一个对INVITE请求的最终响应
仅和INVITE请求配套
证实已收到对于INVITE请求的最终响应
成功响应:UAC证实不成功响应:PS或UAC证实
三次握手过程:INVITE-响应-ACK
ACK可含消息体,给出被叫使用的最终会话描述
OPTIONS:用于查询对方用户代理的能力
BYE:用于结束一个会话
CANCEL:用于撤销一个正在等待的请求
REGISTER:用于将自己的地址信息注册到服务器上


其他方法:

INFO, REFER, PRACK, COMET, SUBSCRIBE, UNSUBSCRIBE, NOTIFY, MESSAGE等


SIP响应响应类型:

1XX 进展报告,请求已收到,正在处理.
100:Trying 
180:Ringing 
181:Call is being forwarded
182:Queued
2XX 请求成功
3XX 重定向,还需进一步操作才能完成请求
Contact: 指示重定向地址
300:Multiple Choices
301:Moved Permanently(UAC更新地址本和cache)
302:Moved Temporarily(可有有效期)
305:Use Proxy
380:Alternative Services(消息体中说明)
4XX 客户端错误,请求包含无效语法,或服务 器不能接受该请求
401: Unauthorized 用户需认证
407: Proxy Authentication Required
403: Forbidden 禁止该请求
404: Not found 域内无此用户
408: Request Timeout 
482: Loop detected
483: Too Many Hops
486: Busy Here(可带Retry After 字段)
5XX 服务器端错误
6XX 全局错误


SIP Request-URI://指示请求的当前目的地地址
指示请求的目的地址
代理服务器基于Request-URI路有请求
当地址被进一步解析的时候,Request-URI可以被修改


SIP tags
Tag是一种伪随机数,被用于From和To头域中,用于唯一标识一个Dialog
任何用户代理或服务器产生一个请求的响应,并在To头域中插入to-tag。如:To: sip:bob@juphoon.com;tag=35635333
SIP消息头域
需要的头域有To, From, Via, Call-ID, CSeq
可选的头域有Subject, Authorization等


头域介绍:
Contact//指示重定向地址
后续Request将根据Contact头域的内容决定目的地的地址,同时将Contact头域的内容放到Request-URI中。它还可以用来指示没有在Record-Route头域中记录的Proxies的地址。同时它还可以被用在Redirect servers和REGISTER requests 和responses。? 
From//指示请求的源地址
Eg:From: “Bob” sips:bob@Biloxi.com; tag=a48s
From: sip:+12125551212@phone2.com; tag=887s
From: Anonymous sip:c8oqzsdaf@privacy.org; tag=hyh8
Ps:SIP URI与sips URI的区别:  SIPS是指安全SIP, 是使用TLS作为安全传输协议,要求在传输SIP消息前先建立TLS连接….
类似于 http: 与 https: 的区别。(加入SSL层)
To  //指示请求想要抵达的目的地
Eg: Carol <sip: carol@chicago.com>
Via //指示请求消息历经的路径,  
作用:可以使响应消息沿原路返回请求发起方
发现路由环路
NAT处理
Via示例:
Via:SIP/2.0/UDP first.example.com:4000;ttl=16;maddr=224.2.0.1;branch=a7c6a8dlze(Example)
Via:发送协议 发送方;生存期参数;多播地址参数;接收标记;分支参数
Branch用来标识由当前请求所建立的事务, 该参数既用在客户端, 也用在服务器端.
NAT处理的例子:
UAC(10.0.0.1:5060)->NAT->Proxy Server(ealang.bell.com)->…
PS接收消息:Via:SIP/2.0/UDP 10.0.0.1:5060
     发现:消息源地址!=Via地址(跨越了NAT)
转发消息: Via:SIP/2.0/UDP erlang.bell.com               Via:SIP/2.0/UDP 10.0.0.1:5060;      
                          received=199.172.136.3
后续收到响应消息时,就可根据received参数,将其发往199.127.136.3:5060
同样原则处理NAPT

• Call-Id //标识呼叫的全局唯一的标识识别多个请求和响应消息属于同一呼叫

在一个会话中,UA发送的所有请求消息和相应消息都必须有同样的Call-ID.

Call-ID:本地标识@host(区分大小写)

Eg:Call-ID:f81d4fae-7dec-11d0-a765-00a0c91ebbfb@foo.bar.com

• Cseq //判定响应和请求的对应关系判定重复请求

相同Call-ID的请求消息:

--不同请求方法

--不同头部字段

--不同消息体

Cseq ++

请求中的Cseq值复制到响应消息中

初始值任意值

Eg: CSeq: 4711 INVITE

• Subject

• Authorization 

• Accept 

• Content-Length

• Content-Type

• Encryption

• Expires

• Max-Forwards

• Priority

• Record-Route

• Require

• Retry-After

• Route

• Unsupported

• Warning


SIP消息体

• 消息体可以使任何协议格式

• 常用消息体类型有SDP、ISUP等

SIP Transaction

• 一个SIP事务处理包含一个请求、零个或多个临时响应和一个最终响应。

• 同一个事务处理中,请求和响应的To、From、Call-ID、CSeq等头域的值相同。

• Call-ID用于标识一个会话,在同一时刻全局唯一。

• 事务类型:
INVITE Client Transaction
INVITE Server Transaction
non-INVITE Client Transaction
non-INVITE Server Transaction

SIP Dialog

• Dialog is a peer-to-peer SIP relationship between two user agents that persists for some time

• Dialog有利于对消息进行排序和把请求正确的路由给两侧的用户

• Dialog ID:
Call-Id, 本地tag, 对端tag 组成

• Dialog状态:
由本地请求序列号,对端请求序列号,本地URI,对端URI,secure标志

• Dialog的创建方法:
RFC3261 INVITE
RFC3265 SUBSCRIBE

SIP Transport

• 使用UDP、TCP、TLS等协议传输

• 缺省端口号 :5060(UDP)、5061(TCP)

• 可靠性保证
使用SeqNum保证消息次序
超时重传保证消息可靠发送

• 使用RFC3262的PRACK方法实现临时响应的可靠传输

SIP协议逻辑实体

• User Agent :能够发送和接收请求,如SIP Phone
User Agent Client:初始SIP请求
User Agent Server:返回SIP响应

• Proxy Server:决定请求的下一跳和转发请求
Stateless Proxy:无状态代理服务器//一旦传送完毕忘记所有信息.
Stateful Proxy:有状态代理服务器//记住他的接收的入请求以及回送的响应和它传送的请求.

• Registrar Server :接受客户端的注册(REGISTER) 请求

• Redirect Server:返回下一跳的地址信息给客户端

SIP Phone的特性

• 呼叫响应:发送200 OK 响应

• 呼叫忙:发送483 Busy Here 响应

• 呼叫拒绝:发送603 Declined 响应

• 显示呼叫ID: 显示From头域的主叫信息

• 呼叫保持:发送re-INVITE请求

• 呼叫选择:根据From、Priority、Subject选择呼叫

• 呼叫等待:发送180 Ringing 响应

• 呼叫排队:发送181 Call Queued 响应