为什么制定SIP
(可以先看关键概念)
该解决方案的好处是可以控制协议的演变。对于简单通信系统,当然是用不上sip的,两个服务规定好协议即可通信。但是对于错综复杂链路,又要使得服务具备可扩展并且可识别,它们不一定提供完全相同的功能协议。这就是创建标准的原因,通过通用规范,开发人员可以编写相互通信的各种应用程序。
关键概念
会话发起协议 (SIP) 是一种信令协议,SIP 旨在为基于 IP 的通信提供信令和呼叫建立协议,用于发起、维护和终止包括语音、视频和消息传递应用程序的通信会话。SIP 用于互联网电话、专用 IP 电话系统以及通过 LTE (VoLTE) 的移动电话呼叫。
该协议定义了交换消息的具体格式以及参与者合作的通信顺序。 SIP 是一种基于文本的协议,融合了超文本传输协议 (HTTP) 和简单邮件传输协议 (SMTP) 的许多元素。每个事务都包含调用服务器上特定方法或函数的客户端请求以及至少一个响应。 SIP 复用了 HTTP 的大部分标头字段、编码规则和状态代码,提供了可读的基于文本的格式。在SIP协议中,呼叫可以是音频、视频或其他媒体类型的通信,也就是说呼叫可能由多个媒体流组成。这样说着没什么感觉,来看一个INVITE类型的sip包。是不是和http很像。可以分为三部分请求/响应、头域、包体。
INVITE sip:alice@192.168.16.77:5060 SIP/2.0 Via: SIP/2.0/UDP 192.168.16.115:5060;rport;branch=z9hG4bKHjCsxoyfL Max-Forwards: 70 To: <sip:alice@192.168.16.77:5060> From: <sip:alice@atlanta.com>;tag=7e7GixbF Call-ID: ytTRSE1G-1709001106395@IT-202204181259 CSeq: 1 INVITE Content-Length: 215 Content-Type: application/sdp Contact: <sip:alice@192.168.16.115:5060;transport=UDP> v=0 o=user1 351137207 1490907357 IN IP4 192.168.16.115 s=- c=IN IP4 192.168.16.115 t=0 0 m=audio 5080 RTP/AVP 0 8 101 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:101 telephone-event/8000 a=sendrecv
SIP 与指定和承载会话媒体的其他几个协议结合使用。最常见的是,媒体类型和参数协商以及媒体设置是通过会话描述协议 (SDP) 执行的。上边INVITE案例的下部分就是SDP。 SIP 被设计为独立于底层传输层协议,并且可以与用户数据报协议 (UDP)、传输控制协议 (TCP) 和流控制传输协议 (SCTP) 一起使用。为了通过不安全的网络链接安全传输 SIP 消息,可以使用传输层安全性 (TLS) 对协议进行加密。对于媒体流(语音、视频)的传输,SIP 消息中携带的 SDP 有效负载通常采用实时传输协议 (RTP) 或安全实时传输协议 (SRTP)。
SIP 网络的每个资源(例如用户代理、呼叫路由器和语音邮箱)均由统一资源标识符 (URI) 标识。 URI 的语法遵循 Web 服务和电子邮件中也使用的通用标准语法。用于 SIP 的 URI 方案是 sip,典型的 SIP URI 的格式为 sip:username@domainname 或 sip:username@host:port。如果需要安全传输,则采用sips方案。SIP 客户端通常在端口号 5060 或 5061,端口 5060 通常用于未加密的信令流量,而端口 5061 通常用于使用传输层安全性 (TLS) 加密的流量。
基于 SIP 的电话网络通常实现 7 号信令系统 (SS7) 的呼叫处理功能,SS7 是一种集中式协议,其特点是复杂的中央网络架构和哑端点(传统电话听筒)。 SIP 是等效对等点的客户端-服务器协议。SIP 功能在通信端点中实现,而传统的 SS7 架构仅在交换中心之间使用。
其他
UA:用于在基于 SIP 的通信网络中发起、接收和管理会话。SIP 要求两个对等方都实现UAC(客户端) 和UAS(服务端)这两个角色。
注册:客户端应用程序在计算机启动时或希望通过 SIP 网络进行访问时进行注册。
代理:是从用户代理(或其他 SIP 节点)接收请求的元素,可以修改这些请求、请求身份验证、计算路由,然后将这些请求转发到其他代理、注册器或用户代理。这是一种中继。它可能会过滤格式错误的请求等。
SDP(会话描述协议):当用户代理发送创建媒体会话的请求时,它包含其支持的编解码器的描述。
对话(Dialog):SIP对话是指两个或多个用户之间的通信交互。它包括一系列的请求和响应消息,用于建立、修改和结束一个会话。每个SIP对话都由一个唯一的对话ID标识,并且包含一些关键信息,例如会话描述协议(SDP)数据、参与者的地址、会话状态等。
RTP协议:通过将实时数据分割为较小的数据包并加上时间戳和序列号等标识信息,来实现对数据流的传输和同步。每个RTP数据包都带有一个头部,包含了一些重要的元数据,例如数据类型、时间戳和序列号等。这些元数据可以帮助接收端恢复丢失的数据包、校正时钟差异,并确保接收端能够正确地播放音频或视频数据。
事务:指对请求和响应的一组处理流程,主要用于确保SIP消息的正确性和可靠性。确保SIP消息的正确性和可靠性。它们会处理超时、重传、确认等情况,以确保消息被正确地发送和接收。
常见头域
To 头域是第一个并且也是最先指定请求的”逻辑”接收地,或者是这个请求的用户 或者资源的 address-of-record。
From 头域包含了请求发起者的逻辑标志,可能是用户的 address-of-record。From 域必须包含一个由 UAC 产生的新的”tag”参数。
Call-ID 是一个在一系列消息中,区分一组消息的唯一标志。在对话中的任一 UA 的所有请求和所有应答的 Call-ID 必须一致。
Cseq 头域是用来区分和做位事务的顺序使用的
Max-Forwards 头域用来限制请求到他的目的地中间的跳转。
Via 头域是标志了用于事务传输的传输设备,并且也标志了应答送回的地址。只有 当需要通过选择传输设备到达下一个节点(hop)的时候,才需要在头域中包含 Via 域。当 UAC 创建一个请求,它必须在头域中添加一个 Via 域。
Contact 头域提供了访问后续请求的特定 UA 实例的联系方法:在这个规范中定义的方法中,只有 INVITE 请求会建立一个会 话。对这些请求来说,Contact 的作用域是全局性的。这就是说,Contact 头域 中包含的 URI 是 UA 能够接收请求的
常见方法
-
INVITE:用于建立一个新的会话。INVITE请求包含被叫方的SIP地址,并且它通常是在初始呼叫时发送的。
-
ACK:用于确认接收到INVITE请求,并且它通常在被叫方应答INVITE请求后发送。ACK请求不包括消息体。
-
BYE:用于结束一个会话。BYE请求可以由任何一方发送,它向对端发出结束会话的信号。
-
CANCEL:用于取消之前已经发送的INVITE请求。CANCEL请求包含之前INVITE请求的事务ID。
-
OPTIONS:用于查询对端的支持情况和能力。OPTIONS请求通常由用户代理发送,它可以用于确定对端支持的编解码器、媒体类型、SDP信息等。
-
REGISTER:用于注册用户代理的地址,以便其他用户代理能够找到它。REGISTER请求通常由用户代理发送到SIP注册服务器。
-
UPDATE:用于修改一个会话的状态或媒体类型。UPDATE请求可以用于增加或删除参与者、更改视频分辨率、更改音频编解码器等。
-
REFER:用于将一个会话转交给另一个用户代理。REFER请求可以用于转移呼叫、转移会话、转移媒体等。
sip交互过程
流程案例一
SIP 与其他几个协议一起工作,这些协议指定媒体格式和编码,并在呼叫建立后携带媒体。
1、呼叫建立,SIP 消息的正文包含会话描述协议 (SDP) 数据单元,它指定媒体格式、编解码器和媒体通信协议。
2、语音和视频媒体流通常使用实时传输协议(RTP)或安全实时传输协议(SRTP)在终端之间传送。
流程案例二
发起通话
- UAC 发送 INVITE 请求给 UAS,包含了自身的 SDP 描述信息,UAS 收到 INVITE 请求后,将返回 100 Trying 响应,表示正在处理请求。
- UAS 分析 SDP 描述信息,并根据其支持的编解码器和传输协议,选择合适的音频和视频编解码器以及传输协议,并生成自己的 SDP 描述信息,然后将该信息打包成 200 OK 响应发回给 UAC。
- UAC 收到 200 OK 响应后,分析 SDP 描述信息,并根据其支持的编解码器和传输协议,选择合适的音频和视频编解码器以及传输协议,并将该信息打包成 ACK 请求,发送给 UAS,表示接受了 UAS 提供的媒体协商。
- UAS 收到 ACK 请求后,开始发送 RTP 数据包(实时传输协议,用于传输音频和视频数据),表示 VoIP 会话已经建立。
- 在会话过程中,UAS 可能会发送一些状态信息给 UAC,例如 180 Ringing 响应,表示正在振铃;或者 183 Session Progress 响应,表示媒体协商已经完成,可以开始传输媒体数据。
注意:SDP 消息也是两段交换,这个两段的交换提供基本的兼容性协商,并且基于简单的 SDP 提出/应答交换模型。
两个代理服务器建立通话后不再查找对方的地址了,所以代理服务器不参与 接下来的通话流了。
结束通话
- UAC(User Agent Client)或者 UAS(User Agent Server)决定结束通话。
- 发送 BYE 请求:
- 当 UAC 决定结束通话时,它将向 UAS 发送一个 BYE 请求。
- 当 UAS 决定结束通话时,它也可以向 UAC 发送一个 BYE 请求。
- 对方接收到 BYE 请求后,需要发送 200 OK 响应以确认通话结束。
- 通话正式结束,两端释放资源,关闭连接。
这个 BYE 的消息将直接送到 softphone,同样是跳过代理的。
java中sip开发框架
What is the currently popular Java SIP library? - Stack Overflow
SIP Servlet
扩展了 HTTP Servlet 并具有其他依赖项。用于开发应用服务器,可支持SIP、HTTP和J2EE平台。建立在HTTP Servlet API规范之上,定义了API和用于应用打包的文件格式。SIP Servlet的核心能力是作为UA或proxy处理SIP信令。
peers
文档全面,我入手SIP的第一个项目。因为没支持MESSAGE,所以才看了其他两个。
jain-sip
a low-level light-weight SIP stack API。用于J2SE平台,开发独立的user agent、proxy和注册应用程序。对客户端开发友好,容易上手。目前在用。