SIP协议含义
Session Initiation Protocol(SIP)是一种标准的通信协议,sip是一个应用层控制协议,是一个信令协议。通话时需要与传输数据的协议一起配合使用。sip协议可以支持并应用于语音、视频、数据等多媒体业务。可以建立、修改和释放类似因特网电话的多媒体会话(会议)。
sip协议的构成与http协议相似,都是由三部分构成的,分别是请求头/状态行,消息头和正文。
SIP是基于udp协议的服务定位协议,使Internet服务的计算机不再需要过多为网络应用程序服务的静态配置,SLP协议基本工作原理是通过查询服务器 接收响应 创建虚拟目录跟踪现有服务,多个服务代理 提供优化机制多种存储服务信息,slp通信都是明文的 安全存在问题。
用户为服务命名并提供属性集,SLP 允许用户将这些描述捆绑到服务的网络地址上,不需要获取网络主机名
SIP协议的基本功能
1、旨在获取访问服务所需信息的客户机应用程序请求
2、对网络硬件设备或软件服务器的服务通知;例如,打印机、文件服务器、摄像机和 HTTP 服务器
3、从主服务器故障中进行托管恢复
此外,还可以根据需要执行以下操作,以管理和调整 SLP 操作。
1、将服务和用户组织到由逻辑组和功能组构成的范围中
2、启用 SLP 日志,以监视网络中的 SLP 操作或对其进行故障排除
3、调节 SLP 时间参数,以提高性能和可伸缩性
4、将 SLP 配置为:在不支持多点传送路由的网络中部署 SLP 时,它不发送和处理多点传送消息
5、部属 SLP 目录代理以提高可伸缩性和性能
会议功能
- 用户向系统注册;
- 邀请用户参加互动会议;
- 协商会议媒体内容格式;
- 建立两端点或多人之间的媒体流;
- 结束会议;
SIP的响应状态
100 | Trying | 试呼叫 |
180 | Ringing | 振铃 |
181 | Call is Being Forwarded | 呼叫正在前转 |
200 | OK | 成功响应 |
302 | Moved Temporarily | 临时迁移 |
400 | Bad Request | 错误请求 |
401 | Unauthorized | 未授权 |
403 | Forbidden | 禁止 |
404 | Not Found | 用户不存在 |
408 | Request Timeout | 请求超时 |
480 | Temporarily Unavailable | 暂时无人接听 |
486 | Busy Here | 线路忙 |
504 | Server Time-out | 服务器超时 |
600 | Busy Everywhere | 全忙 |
SIP协议相关API
1.JAIN SIP API的主要类和接口
- //创建系统的各种对象的工厂类。这些类将返回实现标准接口的对象。
- SipFactory / AddressFactory / HeaderFactory / MessageFactory
- //用于创建 ListeningPoint 和 SipProvider。
- SipStack
- //封装一个传输/端口对(例如,UDP/5060)。
- ListeningPoint
- //此接口用于发送 SIP 消息。还可以使用此接口为传入 SIP 消息注册监听器。
- SipProvider
- //必须实现此接口才能接收传入 SIP 消息。
- SipListener
- // 表示传入 SIP 请求、响应。将传递到 SipListener 进行处理。分别包含 Request或 Response 对象。
- RequestEvent / ResponseEvent
- //表示传出请求未得到答复的故障情况。将传递到 SipListener 进行处理。
- TimeoutEvent
- //表示一种故障情况,此时发送传出请求出现输入/输出问题。将传递到 SipListener进行处理。
- IOExceptionEvent
- //表示 SIP 请求、响应。两者都是 Message 接口的子接口。可通过它们访问 SIP 消息的头、内容及其他部分。
- Request / Response
- //此接口的对象封装了 SIP 对话。(提醒:在一个对话中,所有消息与同一呼叫相关联;对话通常起始于 INVITE,结束于 BYE。)
- Dialog
- //封装 SIP 事务。(提醒:所有事务起始于请求,结束于最终响应。事务通常生存于对话中。)
- ClientTransaction / ServerTransaction
2.Message 接口,Message 接口是 SIP 消息的基接口
- //将头字段设置为 SIP 消息。第一个方法可用于可重复或者可以有多个值的头,如 Contact 头。第二个方法删除此类型的现有头,然后添加单个头值。
- void addHeader(Header)
- void setHeader(Header)
- //删除此类型的现有头。
- void removeHeader(Header)
- //返回所有头名称。
- ListIterator getHeaderNames()
- //返回非标准头类型的头名称。
- ListIterator getUnrecognizedHeaders()
- //特定头的 getter。第二种形式返回可重复头(或具有多个值的头,如 Contact 头)的所有值。
- Header getHeader(String)
- ListIterator getHeaders(String)
- //设置消息的负载以及 Content-Type 头。如果类型为字符串,还将设置 Content-Length,否则使用 void setContentLength(ContentLengthHeader)。
- void setContent(Object, ContentTypeHeader)
- //检索消息的负载。
- byte [] getRawContent()
- Object getContent()
- //清空负载。
- void removeContent()
- //管理 Expires 头
- void setExpires(ExpiresHeader)
- ExpiresHeader getExpires()
- //SIP 版本元素的访问器。极少使用,默认为 SIP/2.0。
- void setSipVersion(String)
- String getSipVersion()
- //创建消息的副本。
- Object clone()
3.Request 接口(上面 Message 的子接口)
- //方法元素的访问器。可以为任何 SIP 方法,包括 Request 接口常数中的方法:ACK、BYE、CANCEL、INVITE、OPTIONS、REGISTER、NOTIFY、SUBSCRIBE、MESSAGE、REFER、INFO、PRACK 和 UPDATE。
- String getMethod()
- void setMethod(String)
- //请求 URI 的访问器,即 SIP 请求的第一行。通常,这是 SipURI 的实例。
- URI getRequestURI()
- void setRequestURI(URI)
4.Response 接口,Response接口也扩展了Message接口
- //状态码的访问器。这可以是任何 SIP 状态码,包括 Response 接口的常数成员中的状态码。以下是其中几种:RINGING (180)、OK (200)、BAD_REQUEST (400) 等等。
- void setStatusCode()
- int getStatusCode()
- //易读的状态码说明的访问器
- void setReasonPhrase(String)
- String getReasonPhrase()
API之间的关系
sipAPI关系:
先初始化sipFactory工厂
应用程序以SipFactory为中心生成其他相关类或接口,包括AddressFactory、HeaderFactory、MessageFactory和重要的SipStack
sipstack必须先指定该对象的属性properties(包含ip地址、堆栈名称、代理等参数)才能生成
用SipStack的createSipProvider(ListeningPoint)方法建立sipProvider接口 条件是ListeningPoint(端口号、协议) 利用这个接口发送消息sipProvider.sendRequest(request);
利用headerFactory生成各种头信息 用来封装到request中, 头信息如下:(重要)
To:指定请求消息的逻辑接收者或者是用户或资源的注册地址,该地址同样作为请求消息的目标地址。示例:<sip:34020000002000000001@3402000000>
From:指示请求发起方的逻辑标识,它可能是用户的注册地址。
示例:From: <sip:34020000002000000000@3402000000>;tag=503644398
tag:"tag"是From头字段的一个参数,用于标识该请求中的发送方。它用于在同一会话中唯一标识不同的请求。
Call-ID:用来将消息分组的惟一标识。SIP 规定,在一个对话中,UA 发送的所有请求消息和响应消息都必须有同样的Call-ID。
CSeq:用于标识SIP请求的顺序和唯一性,标识事务并对事务排序。CSeq由两个部分组成:序列号和方法。序列号是一个递增的整数,用于标识请求的顺序。方法指定了请求的类型,例如REGISTER、INVITE、ACK等。
通过CSeq字段,接收方可以确定请求的顺序,并在必要时对请求进行验证和处理。CSeq的值在同一个会话中必须是唯一的,这样接收方才能正确地识别和处理请求。
示例:CSeq: 20 MESSAGE
Max-Fowords:限定一个请求消息在到达目的地之前允许经过的最大跳数。它包含一个整数值,每经过一跳,这个值就被减一。如果在请求消息到达目的地之前该值变为零,那么请求将被拒绝,并返回一个 483( 跳数过多)
Via:标识响应消息将要被发送的位置。Via头字段中必须包含一个“branch”参数,该参数用来标识由当前请求所建立的事务,branch 参数值在空间和时间上必须全局惟一的。
利用MessageFactory生成集合请求 messageFactory.createRequest(各种头信息)
最后在request中添加信息及消息类型
sip事务
事务(transaction): 请求(UAC)+最终响应(相邻的UAS),SIP基于事务。所谓相邻就是说transaction存在于相邻的SIP实体,而不是存在于两个UA之间。CSeq标识。一个事务中包含一个请求消息、0个或多个临时响应消息、1个或多个最终响应消息(2xx~6xx)。SIP是事务性的协议。事务的区分通过Via字段栈顶的Branch的值来确定,这是由于对于请求消息每经过一个有事务状态的Proxy的时候,该Proxy需要为这个事务创建一个服务器端事务和一个客户端事务,并且将自己的URI添加到Via的栈顶,并生成一个Global ID做为Branch的值,以此值来表示一个与之相对应的事务。SIP在事务层面定义了状态机和定时器来实现重传。
根据textclient的demo代码基础思路(想要代码的可以评论或者私信)
初始化头、地址、消息工厂
headerFactory = sipFactory.createHeaderFactory();
addressFactory = sipFactory.createAddressFactory();
messageFactory = sipFactory.createMessageFactory();
addressFactory封装请求和接收的地址
headerFactory可以实现各种头信息
封装消息请求方法
messageFactory.createRequest(请求uri,请求方法,callid,cseq,
fromheader,toheader,viaheader,maxforwards最大跳数)
viaheader需要用集合封装起来
生成sipProvider =sipStack.createSipProvider(listeningPoint);
用来发送请求sipProvider.sendRequest(request);
实现SipListener接口处理request和respone信息
将实现接口的类加入侦听者sipProvider.addSipListener(sipListener);