FreeSwitch Sip

本文介绍了SIP协议的基本概念,包括其作为会话初始化协议的角色,以及与HTTP的相似之处。SIP是一个对等协议,用户代理(UA)可以作为发起者或响应者。文章还详细讨论了SIP的注册过程,通过示例展示了注册服务器如何验证用户身份。此外,文中通过实例演示了UA间的直接呼叫和通过B2BUA(FreeSWITCH)的呼叫流程,解释了SIP请求和响应的类型以及呼叫的建立和结束。
摘要由CSDN通过智能技术生成

在继续学习 FreeSWITCH 之前我们有必要来学习一下 SIP 协议,因为它是 FreeSWITCH 的核心。但即使如此,讲清楚 SIP 必然需要很大篇幅,本书是关于 FreeSWITCH 的,而重点不是 SIP。因此,我将仅就理解 FreeSWITCH 必需的一些概念加以通俗的解释,更严肃一些的请参阅其它资料或 RFC(Request For Comments)。

SIP 的概念和相关元素

会话初始协议(Session Initiation Protocol)是一个控制发起、修改和终结交互式多媒体会话的信令协议。它是由 IETF(Internet Engineering Task Force,Internet工程任务组)在 RFC 2543 中定义的。最早发布于 1999 年 3 月,后来在 2002 年 6 月又发布了一个新的标准 RFC 2361。

SIP 是一个基于文本的协议,在这一点上与 HTTP 和 SMTP 相似。我们来对比一个简单的 SIP 请求与 HTTP 请求:

GET /index.html HTTP/1.1

INVITE sip:seven@freeswitch.org.cn SIP/2.0

请求由三部分组成。在 HTTP 中, GET 指明一个获取资源(文件)的动作,而 /index.html 则是资源的地址,最后是协议版本号。而在 SIP 中,INVITE 表示发起一次请求,seven@freeswitch.org.cn 为请求的地址,称为 SIP URI,最后也是版本号。其中,SIP URI很类似一个电子邮件,其格式为“协议:名称@主机”。与 HTTP 和 HTTPS 相对应,有 SIP 和 SIPS,后者是加密的;名称可以是一串数字的电话号码,也可以是字母表示的名称;而主机可以是一个域名,也可以是一个IP地址。

SIP 是一个对等的协议,类似 P2P。不像传统电话那样必须有一个中心的交换机,它可以在不需要服务器的情况下进行通信,只要通信双方都彼此知道对方地址(或者,只有一方知道另一方地址),如下图,bob 给 alice 发送一个 INVITE 请求,说“Hi, 一起吃饭吧...”,alice 说"好的,OK",电话就通了。

在 SIP 网络中,alice 和 bob 都叫做用户代理(UA, User Agent)。UA 是在 SIP 网络中发起或响应 SIP 处理的逻辑功能。UA是有状态的,也就是说,它维护会话(或称对话)的状态。UA 有两种功能:一种是 UAC(UA Client用户代理客户端),它是发起 SIP 请求的一方,如上图的 bob。另一种是 UAS(UA Server),它是接受请求并发送响应的一方,如上图中的 alice。由于 SIP 是对等的,如果 alice 呼叫 bob 时(有时候 alice 也主动叫 bob 一起吃饭),alice 就称为 UAC,而 bob 则执行 UAS的功能。一般来说,UA 都会实现上述两种功能。

设想 bob 和 alice 是经人介绍认识的,而他们还不熟悉,bob 想请 alice 吃饭就需要一个中间人(M)传话,而这个中间人就叫代理服务器(Proxy Server)。还有另一种中间人叫做重定向服务器(Redirect Server),它类似于这样的方式工作──中间人 M 告诉 bob,我也不知道 alice 在哪里,但我老婆知道,要不然我告诉你我老婆的电话,你直接问她吧,我老婆叫 W。这样,M 就成了一个重定向服务器,而他老婆 W 则是真正的代理服务器。这两种服务器都是 UAS,它们主要是提供一对欲通话的 UA 之间的路由选择功能。具有这种功能的设备通常称为边界会话控制器(SBC,Service Border Controller)。

还有一种 UAS 叫做注册服务器。试想这样一种情况,alice 还是个学生,没有自己的手机,但它又希望 bob 能随时找到她,于是当她在学校时就告诉中间人 M 说她在学校,如果有事打她可以打宿舍的电话;而当她回家时也通知 M 说有事打家里电话。只要 alice 换一个新的位置,它就要向 M 重新“注册”新位置的电话,以让 M 能随时找到她,这时候 M 就是一个注册服务器。

最后一种叫做背靠背用户代理(B2BUA,Back-to-Back UA)。需要指出,其实 RFC 3261 并没有定义 B2BUA的功能,它只是一对 UAS 和 UAC的串联。FreeSWITCH 就是一个典型的 B2BUA,事实上,B2BUA 的概念会贯穿本书始终,所以,在此我们需要多花一点笔墨来解释。

我们来看上述故事的另一个版本:M 和 W 是一对恩爱夫妻。M 认识 bob 而 W 认识 alice。M 和 W 有意搓合两个年轻人,但见面时由于两人太腼腆而互相没留电话号码。事后 bob 相知道 alice 对他感觉如何,于是打电话问 M,M 不认识 alice,就转身问老婆 W (注意这次 M 没有直接把 W 电话给 bob),W 接着打电话给 alice,alice 说印象还不错,W 就把这句话告诉 M, M 又转过身告诉 bob。 M 和 W 一个面向 bob,一个对着 alice,他们两个合在一起,称作 B2BUA。在这里,bob 是 UAC,因为他发起请求;M 是 UAS,因为他接受 bob 的请求并为他服务;我们把 M 和 W 看做一个整体,他们背靠着背(站着坐着躺着都行),W 是 UAC,因为她又向 alice 发起了请求,最后 alice 是 UAS。其实这里UAC 和 UAS 的概念也不是那么重要,重要的是要理解这个背靠背的用户代理。因为事情还没有完,bob 一听说 alice 对他印象还不错,心花怒放,便想请 alice 吃饭,他告诉 M, M 告诉 W, W 又告诉 alice,alice 问去哪吃,W 又只好问 M, M 再问 bob…… 在这对年轻人挂断电话这前, M 和 W 只能“背对背”的工作。

从上图可以看出,四个人其实全是 UA。从上面故事可以看出,虽然 FreeSWITCH 是 B2BUA,但也可以经过特殊的配置,实现一些代理服务器和重定向服务器的功能,甚至也可以从中间劈开,两边分别作为一个普通的 UA 来工作。这没有什么奇怪的,在 SIP 世界中,所有 UA 都是平等的。具体到实物,则 M 和 W 就组成了实现软交换功能的交换机,它们对外说的语言是 SIP,而在内部,它们则使用自己家的语言沟通。bob 和 alice 就分别成了我们常见的软电话,或者硬件的 SIP 电话。

SIP 注册

不像普通的固定电话网中,电话的地址都是固定的。因特网是开放的,alice 的 UA 可能在家也可能在学校,或者,在世界是任何角落,只要能上网,它就能与世界通信。为了让我们的 FreeSWITCH 服务器能找到它,它必须向服务器进行注册。通常的注册流程是:

Alice                          FreeSWITCH 
  |                                |
  |           REGISTER             |
  |------------------------------->|
  |   SIP/2.0 401 Unauthorized     |
  |<-------------------------------|
  |           REGISTER             |
  |------------------------------->|
  |   SIP/2.0 200 OK               |
  |                                |

我们用真正的注册流程进行说明。下面的 SIP 消息是在真正的 FreeSWITCH 中 trace 出来的。其中 FreeSWITCH 服务器的 IP 地址是 192.168.4.4,使用默认的端口号 5060,在这里,我们使用的是 UDP 协议。 alice 使用的 UAC 是 Zoiper,端口号是 5090(在我写作时它与 FreeSWITCH 在同一台机器上,所以不能再使用端口 5060)。其中每个消息短横线之间的内容都是 FreeSWITCH 中输出的调试信息,不是 SIP 的一部分。

------------------------------------------------------------------------
recv 584 bytes from udp/[192.168.4.4]:5090 at 12:30:57.916812:
------------------------------------------------------------------------
REGISTER sip:192.168.4.4;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-d9ed3bbae47e568b-1---d8754z-;rport
Max-Forwards: 70
Contact: <sip:alice@192.168.4.4:5090;rinstance=d42207a765c0626b;transport=UDP>
To: <sip:alice@192.168.4.4;transport=UDP>
From: <sip:alice@192.168.4.4;transport=UDP>;tag=9c709222
Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE.
CSeq: 1 REGISTER
Expires: 3600
Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
User-Agent: Zoiper rev.5415
Allow-Events: presence
Content-Length: 0

recv 表明 FreeSWITCH 收到来自 alice 的消息。我们前面已经说进,SIP 是纯文本的协议,类似 HTTP,所以很容易阅读。

  • 第一行的 REGISTER 表示是一条注册消息。
  • Via 是 SIP 的消息路由,如果 SIP 经过好多代理服务器转发,则会有多条 Via 记录。
  • Max-forwards 指出消息最多可以经过多少次转发,主要是为了防止产生死循环。
  • Contact 是 alice 家的地址,本例中,FreeSWITCH 应该能在 192.168.4.4 这台机器上的 5090 端口找到她。
  • To 和 From 先不管。
  • Call-ID 是本次 SIP 会话(Session)的标志。
  • CSeq 是一个序号,由于 UDP 是不可靠的协议,在不可靠的网络上可能丢包,所以有些包需要重发,该序号则可以防止重发引起的消息重复。
  • Expires 是说明本次注册的有效期,单位是秒。在本例中,alice 应该在一小时内再次向 FreeSWITCH 注册,防止 FreeSWITCH 忘掉她。实际上,大部分 UA 的实现都会在几十秒内就重新发一次注册请求,这在 NAT 的网络中有助于保持连接。
  • Allow 是说明 alice 的 UA 所能支持的功能,某些 UA 功能丰富,而某些 UA 仅有有限的功能。
  • User-Agent 是 UA 的型号。
  • Allow-Events 则是说明她允许哪些事件通知。
  • Content-Length 是消息体(Body)的长度,在这里,只有消息头(Header),没有消息体,因此长度为 0 。

.

------------------------------------------------------------------------
send 664 bytes to udp/[192.168.4.4]:5090 at 12:30:57.919364:
------------------------------------------------------------------------
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-d9ed3bbae47e568b-1---d875
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值