会话发起协议(Session Initiation Protocol,SIP)是一种信号传输协议,用于建立、修改和终止两个端点之间的会话。SIP 可用于建立 两方呼叫、多方呼叫,或者甚至 Internet 呼叫、多媒体呼叫和多媒体分发的多播会话。JSR 116:SIP Servlet API 是一个服务器端接口,描 述了针对 SIP 组件及服务的容器。SIP servlet 是在 SIP 容器中运行的 servlet,与 HTTP Servlet 类似,但提供了对 SIP 协议的支持。 SIP 和 SIP servlet 是许多基于远程通信的流行应用程序的底层技术,这些应用程序提供了各种服务,比如 Voice-over-IP (VoIP)、即时通 信、在线和好友列表管理,以及网络会议。
SIP 和 SIP servlet 对于企业也很重要。与 Java EE 技术结合,SIP servlet 可用于向企业应用程序添加丰富的媒体交互功能。JSR 289: SIP Servlet v1.1 更新了 SIP Servlet API 并定义了一个标准的应用程序编程模型,用于将 SIP servlet 和 Java EE 组件集成到一起。SIP servlet 将在下一代远程通信服务中扮演更加重要的角色。
本技术文章涵盖了 SIP 和 SIP servlet 的一些基本底层概念。本文还提供了一个示例应用程序,该应用程序使用 SIP servlet 和 HTTP servlet 提供 VoIP 电话服务。
什么是 SIP?
介绍 SIP 的一种简单方法就是从应用场景入手。我们假设用户 A 想要与用户 B 建立一个呼叫。在远程通信设置中,用户 A 和 B 将通过 用户代理进行通信。用户代理的一个例子就是软件电话——用于在 Internet 上建立电话呼叫的软件程序。另一个例子就是 VoIP Phone——一 种使用 VoIP 的电话。下面列出了建立呼叫所需的步骤:
A 邀请 B 开始会话。作为邀请的一部分,A 会说明自己支持的媒体。
B 接收到邀请并向 A 发送一个及时响应,然后对邀请进行评估。
当 B 准备好接受邀请时,它会向 A 发送一个回执。作为回执的一部分,B 将说明自己支持的媒体。
A 分析从 B 收到的回执,并确定 B 和 A 支持的媒体是否相同。如果 A 和 B 支持相同的媒体,则它们之间将建立呼叫。邀请中指定的媒 体可以简化呼叫的建立。
图 1 演示了建立呼叫的步骤。
图 1. 建立呼叫的步骤
SIP 提供了一种标准的方式来执行这些步骤。它通过定义特定的请求方法、响应、响应代码,以及信号传输和呼叫控制的头部来完成这些步 骤。该协议已由 Internet Engineering Task Force (IETF) 根据 RFC3261 实现了标准化,现已被 第 3 代合作伙伴项目(3GPP) 采纳为标 准信号传输协议,还成为了 IP 多媒体子系统(IP Multimedia Subsystem,IMS) 架构中的永久元素。
SIP 与 HTTP 有何关系?
人们通常会问 SIP 是否使用 HTTP 作为底层协议。答案是否定的。SIP 是一种与 HTTP 在同一层(即应用层)运作的协议,它使用 TCP、 UDP 或 SCTP 作为底层协议。但是,SIP 与 HTTP 有很多相似之处。例如,与 HTTP 类似,SIP 基于文本而且是用户可读的。SIP 使用带有特 定方法、响应代码和头部的“请求响应”机制,这一点也与 HTTP 类似。HTTP 和 SIP 的一个显著不同是,SIP 中的“请求响应”机制是异步 的——请求不需要在后面紧跟相应的响应。实际上,一个 SIP 请求可能导致生成一个或多个请求。
SIP 是一种对等协议。这意味着用户代理既可以作为服务器,也可以作为客户机。这是 SIP 和 HTTP 的另一个不同之处,在 HTTP 中,客 户机始终是客户机,而服务器始终是服务器。
SIP 支持以下请求方法和响应代码:
请求方法:
REGISTER。客户机使用它向 SIP 服务器注册一个地址。
INVITE。指示用户和服务器被邀请参与一个会话。此消息的正文包括一个会话描述,用户或服务被邀请参与该会话。
ACK。确认客户端已经接收到 INVITE 请求的最终响应。此方法仅与 INVITE 请求一起使用。
CANCEL。用于取消挂起的请求。
BYE。由用户代理客户机发送,向服务器表明它希望终止呼叫。
OPTIONS。用于向服务器查询与它相关的功能。