初识SIP协议

 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 目录代理以提高可伸缩性和性能

会议功能

  1. 用户向系统注册;
  2. 邀请用户参加互动会议;
  3. 协商会议媒体内容格式;
  4. 建立两端点或多人之间的媒体流;
  5. 结束会议;

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的主要类和接口
  1. //创建系统的各种对象的工厂类。这些类将返回实现标准接口的对象。  
  2. SipFactory / AddressFactory / HeaderFactory / MessageFactory   
  3.   
  4. //用于创建 ListeningPoint 和 SipProvider。  
  5. SipStack  
  6.   
  7. //封装一个传输/端口对(例如,UDP/5060)。    
  8. ListeningPoint  
  9.   
  10. //此接口用于发送 SIP 消息。还可以使用此接口为传入 SIP 消息注册监听器。  
  11. SipProvider  
  12.       
  13. //必须实现此接口才能接收传入 SIP 消息。  
  14. SipListener  
  15.       
  16. //  表示传入 SIP 请求、响应。将传递到 SipListener 进行处理。分别包含 Request或 Response 对象。  
  17. RequestEvent / ResponseEvent  
  18.       
  19. //表示传出请求未得到答复的故障情况。将传递到 SipListener 进行处理。  
  20. TimeoutEvent  
  21.       
  22. //表示一种故障情况,此时发送传出请求出现输入/输出问题。将传递到 SipListener进行处理。  
  23. IOExceptionEvent  
  24.       
  25. //表示 SIP 请求、响应。两者都是 Message 接口的子接口。可通过它们访问 SIP 消息的头、内容及其他部分。  
  26. Request / Response  
  27.       
  28. //此接口的对象封装了 SIP 对话。(提醒:在一个对话中,所有消息与同一呼叫相关联;对话通常起始于 INVITE,结束于 BYE。)  
  29. Dialog  
  30.       
  31. //封装 SIP 事务。(提醒:所有事务起始于请求,结束于最终响应。事务通常生存于对话中。)  
  32. ClientTransaction / ServerTransaction  
2.Message 接口,Message 接口是 SIP 消息的基接口
  1. //将头字段设置为 SIP 消息。第一个方法可用于可重复或者可以有多个值的头,如 Contact 头。第二个方法删除此类型的现有头,然后添加单个头值。  
  2. void addHeader(Header)   
  3. void setHeader(Header)  
  4.           
  5. //删除此类型的现有头。  
  6. void removeHeader(Header)  
  7.       
  8. //返回所有头名称。  
  9. ListIterator getHeaderNames()  
  10.       
  11. //返回非标准头类型的头名称。  
  12. ListIterator getUnrecognizedHeaders()  
  13.       
  14. //特定头的 getter。第二种形式返回可重复头(或具有多个值的头,如 Contact 头)的所有值。  
  15. Header getHeader(String)   
  16. ListIterator getHeaders(String)  
  17.       
  18. //设置消息的负载以及 Content-Type 头。如果类型为字符串,还将设置 Content-Length,否则使用 void setContentLength(ContentLengthHeader)。  
  19. void setContent(Object, ContentTypeHeader)  
  20.       
  21. //检索消息的负载。  
  22. byte [] getRawContent()   
  23. Object getContent()  
  24.   
  25. //清空负载。  
  26. void removeContent()  
  27.       
  28. //管理 Expires 头  
  29. void setExpires(ExpiresHeader)   
  30. ExpiresHeader getExpires()  
  31.       
  32. //SIP 版本元素的访问器。极少使用,默认为 SIP/2.0。  
  33. void setSipVersion(String)   
  34. String getSipVersion()  
  35.       
  36. //创建消息的副本。  
  37. Object clone()  
3.Request 接口(上面 Message 的子接口)
  1. //方法元素的访问器。可以为任何 SIP 方法,包括 Request 接口常数中的方法:ACK、BYE、CANCEL、INVITE、OPTIONS、REGISTER、NOTIFY、SUBSCRIBE、MESSAGE、REFER、INFO、PRACK 和 UPDATE。  
  2. String getMethod()  
  3. void setMethod(String)  
  4.   
  5. //请求 URI 的访问器,即 SIP 请求的第一行。通常,这是 SipURI 的实例。  
  6. URI getRequestURI()   
  7. void setRequestURI(URI) 
4.Response 接口,Response接口也扩展了Message接口
  1. //状态码的访问器。这可以是任何 SIP 状态码,包括 Response 接口的常数成员中的状态码。以下是其中几种:RINGING (180)、OK (200)、BAD_REQUEST (400) 等等。  
  2. void setStatusCode()   
  3. int getStatusCode()  
  4.       
  5. //易读的状态码说明的访问器  
  6. void setReasonPhrase(String)  
  7. 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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值