sip入门

更新时间:2024-06-27 08:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

SIP协议全方位概要介绍

介于目前还有不少人对SIP协议不太了解,我从网上载录了一篇写得还比较详细的SIP介绍性文字。有兴趣的话可以读一读。 SIP协议全方位概要介绍

---------------------------------------------

转载自:http://www.net130.com 出处:中国电信

摘要:SIP协议是NGN中的重要协议,越来越得到业界的重视。本文通过SIP协议的背景、功能、网络元素、实现机制、以及SIP消息的组成等几个方面对SIP协议做了全方位的概要性介绍,以使读者对SIP有初步的概念和认识。 一、SIP协议的背景和功能

SIP(会话初始协议)的开发目的是用来帮助提供跨越因特网的高级电话业务。因特网电话(IP电话)正在向一种正式的商业电话模式演进,SIP就是用来确保这种演进实现而需要的NGN(下一代网络)系列协议中重要的一员。

SIP是IETF标准进程的一部分,它是在诸如SMTP(简单邮件传送协议)和HTTP(超文本传送协议)基础之上建立起来的。它用来建立,改变和终止基于IP网络的用户间的呼叫。为了提供电话业务它还需要结合不同的标准和协议:特别是需要确保传输(RTP),与当前电话网络的信令互连,能够确保语音质量(RSVP),能够提供目录(LDAP),能够鉴权用户(RADIUS)等等。 SIP被描述为用来生成,修改和终结一个或多个参与者之间的会话。这些会话包括因特网多媒体会议,因特网(或任何IP网络)电话呼叫和多媒体发布。会话中的成员能够通过多播或单播联系的网络来通信。SIP支持会话描述,它允许参与者在一组兼容媒体类型上达成一致。它同时通过代理和重定向请求到用户当前位置来支持用户移动性。SIP不与任何特定的会议控制协议捆绑。 本质上,SIP提供以下功能:

名字翻译和用户定位:无论被呼叫方在哪里都确保呼叫达到被叫方。执行任何描述信息到定位信息的映射。确保呼叫(会话)的本质细节被支持。

特征协商:它允许与呼叫有关的组(这可以是多方呼叫)在支持的特征上达成一致(注意:不是所有方都能够支持相同级别的特征)。例如视频可以或不可以被支持。总之,存在很多需要协商的范围。

呼叫参与者管理:呼叫中参与者能够引入其它用户加入呼叫或取消到其它用户的连接。此外,用户可以被转移或置为呼叫保持。

呼叫特征改变:用户应该能够改变呼叫过程中的呼叫特征。例如,一呼叫可以被设置为

“voice-only”,但是在呼叫过程中,用户可以需要开启视频功能。也就是说一个加入呼叫的第三方为了加入该呼叫可以开启不同的特征。 二、SIP网络元素

SIP中有两个要素。SIP用户代理和SIP网络服务器。用户代理是呼叫的终端系统元素,而SIP服务器是处理与多个呼叫相关联信令的网络设备。

用户代理本身具有一客户机元素(用户代理客户机UAC)和一服务器元素(用户代理服务器UAS)。客户机元素初始呼叫而服务器元素应答呼叫。这允许点到点的呼叫通过客户机-服务器协议来完成。 SIP服务器元素提供多种类型的服务器。有三种服务器形式存在于网络中--SIP有状态代理服务器,SIP无状态代理服务器和SIP重定向服务器。由于呼叫者未必知道被呼叫方的IP地址或主机名,SIP服务器的主要功能是提供名字解析和用户定位。可以获得的是email形式的地址或与被呼叫方关联的电话号码。使用该信息,呼叫者的用户代理能够确定特定服务器来解析地址信息--这可能涉及网络中很多服务器。

SIP代理服务器接收请求,决定将这些请求传送到何处,并且将它们传送到下一服务器(使用下一跳路由原理)。在网络中可以有多跳。

有状态和无状态代理服务器的区别是有状态代理服务器记住它接收的入请求,以及回送的响应和它转送的出请求。无状态代理服务器一旦转送请求后就忘记所有的信息。这允许有状态代理服务器生成请求以并行地尝试多个可能的用户位置并且送回最好的响应。无状态代理服务器可能是最快的,并且是SIP结构的骨干。有状态代理服务器可能是离用户代理最近的本地设备,它控制用户域并且是应用服务的主要平台。

重定向服务器接收请求,但不是将这些请求传递给下一服务器而是向呼叫者发送响应以指示被呼叫用户的地址。这使得呼叫者可以直接联系在下一服务器上被呼叫方的地址。 三、SIP协议的实现机制

SIP是一个分层结构的协议,这意味着它的行为根据一组平等独立的处理阶段来描述,每一阶段之间只是松耦合。协议分层描述是为了表达,从而允许功能的描述可在一个部分跨越几个元素。它不指定任何方式的实现。当我们说某元素包含某层,我们是指它顺从该层定义的规则集。

不是协议规定的每个元素都包含各层。而且,由SIP规定的元素是逻辑元素,不是物理元素。一个物理实现可以选择作为不同的逻辑元素,甚至可能在一个个事务的基础上。

SIP的最底层是语法和编码。它的编码使用增强Backus-Nayr形式语法(BNF)来规定。 第二层是传输层。它定义了网络上一个客户机如何发送请求和接收响应以及一个服务器如何接收请求和发送响应。所有的SIP元素包含传输层。

第三层是事务层。事务是SIP的基本元素。一个事务是由客户机事务发送给服务器事务的请求(使用传输层),以及对应该请求的从服务器事务发送回客户机的所有响应组成。事务层处理应用层重传,

匹配响应到请求,以及应用层超时。任何用户代理客户机(UAC)完成的任务使用一组事务产生。用户代理包含一个事务层,有状态的代理也有。无状态的代理不包含事务层。事务层具有客户机组成部分(称为客户机事务)和服务器组成部分(称为服务器事务),每个代表有限的状态机,它被构造来处理特定的请求。

事务层之上的层称为事务用户(TU)。每个SIP实体,除了无状态代理,都是事务用户。当一个TU希望发送请求,它生成一个客户机事务实例并且向它传递请求和IP地址,端口,和用来发送请求的传输机制。一个TU生成客户机事务也能够删除它。当客户机取消一个事务时,它请求服务器停止进一步的处理,将状态恢复到事务初始化之前,并且生成特定的错误响应到该事务。这由CANCEL请求完成,它构成自己的事务,但涉及要取消的事务。

SIP通过EMAIL形式的地址来标明用户地址。每一用户通过一等级化的URL来标识,它通过诸如用户电话号码或主机名等元素来构造(例如:SIP:usercompany.com)。因为它与EMAIL地址的相似性,SIP URLs容易于用户的EMAIL地址关联。

SIP提供它自己的可靠性机制从而独立于分组层,并且只需不可靠的数据包服务即可。SIP可典型地用于UDP或TCP之上。

SIP提供必要的协议机制以保证终端系统和代理服务器提供以下业务: ● 用户定位 ● 用户能力 ● 用户可用性 ● 呼叫建立 ● 呼叫处理

● 呼叫前转,包括:(1)等效800类型的呼叫,(2)无应答呼叫前转,(3)遇忙呼叫前转,(4)无条件呼叫前转

● 呼叫号码传递,该号码可以是任何命名机制。

● 个人移动性,例如通过一个单一的、位置无关的地址来到达被呼叫方,即使被呼叫方改变了终端。

● 终端类型的协商和选择:呼叫者可以给出选择如何到达对方,例如通过因特网电话,移动电话或应答业务等。 ● 终端能力协商 ● 呼叫者和被呼叫者鉴权 ● 不知情和指导式的呼叫转移

● 多播会议的邀请

当一用户希望呼叫另一用户,呼叫者用INVITE请求初始呼叫,请求包含足够的信息用以被呼叫方参与会话。如果客户机知道另一方的位置它能够直接将请求发送到另一方的IP地址。如果不知道,客户机将请求发送到本地配置的SIP网络服务器。如果服务器是代理服务器它将解析被呼叫用户的位置并且将请求发送给它们。有很多方法完成上步,例如搜索DNS或访问数据库。服务器也可以是重定向服务器,它可以返回被呼叫用户的位置到呼叫客户机用以它直接与用户联系。在定位用户的过程中,SIP网络服务器当然能够代理或重定向呼叫到其它的服务器,直到到达一个明确地知道被呼叫用户IP地址的服务器。

一旦发现用户地址,请求就发送给该用户,此时将产生几种选择。在最简单的情况,用户电话客户机接收请求——也就是,用户的电话振铃。如果用户接受呼叫,客户机用客户机软件的指定能力响应请求并且建立连接。如果用户拒绝呼叫,会话将被重定向到语音邮箱服务器或另一用户。“指定能力”参照用户想启用的功能。例如,客户机软件可以支持视频会议,但用户只想使用音频会议,那则只会启用音频功能。

SIP还具有另外两个有重要意义的特征。第一个是有状态SIP代理服务器具有分割入呼叫或复制入呼叫的能力,从而可以同时运行几个扩展分支。第一个应答的分支接受呼叫。该特征在用户工作在两位置之间(例如实验室和办公室)或者同时对经理和其秘书振铃时是非常便利的。

第二个特征是SIP独特的返回不同媒体类型的能力。举个用户联系公司的例子。当SIP服务器接收到客户机的连接请求,它能够通过WEB交互式语音响应页面来返回到顾客的客户机,该页面具有可获得的部门分支或提供在列表上的用户。点击适当的链接后将发送一请求到所点击选择的用户从而建立起呼叫。

四、SIP消息的组成 有两种类型的SIP消息: ● 请求:从客户机发到服务器 ● 响应:从服务器发到客户机

SIP请求消息包含三个元素:请求行、头、消息体。 SIP响应消息包含三个元素:状态行、头、消息体。

请求行和头域根据业务、地址和协议特征定义了呼叫的本质,消息体独立于SIP协议并且可包含任何内容。

SIP定义了下述方法:

INVITE——邀请用户加入呼叫。

BYE——终止一呼叫上的两个用户之间的呼叫。

OPTIONS——请求关于服务器能力的信息。

ACK——确认客户机已经接收到对INVITE的最终响应。

REGISTER——提供地址解析的映射,让服务器知道其它用户的位置。 INFO——用于会话中信令。 五、结束语

SIP协议凭借其简单、易于扩展、便于实现等诸多优点越来越得到业界的青睐,它正逐步成为NGN(下一代网络)和3G多媒体子系统域中的重要协议,并且市场上出现越来越多的支持SIP的客户端软件和智能多媒体终端,以及用SIP协议实现的服务器和软交换设备。虽然SIP协议目前还不成熟,但可以预见SIP必定是将来网络多媒体通信中的明星。

SIP 所涉及到得相关协议

SIP 标准

1. RFC 3261: Session Initiation Protocol

2. RFC 3262: Reliability of Provisional Responses in SIP 3. RFC 3263: SIP: Locating SIP Servers

4. RFC 3264: An Offer Answer Model with Session Description 5. RFC 3265: SIP - Specific Event Notification 6. RFC 3311: The SIP UPDATE Method

7. RFC 3312: Integration of Resource Management and SIP

8. RFC 3313: Private Session Initiation Protocol (SIP) Extensions for Media

Authorization

9. RFC 3323: A Privacy mechanism for the Session Initiation Protocol 10. RFC 3325: Private Extensions to the Session Initiation Protocol (SIP) for

Asserted Identity with Trusted Networks

11. RFC 3326: The Reason Header for the Session Initiation Protocol 12. RFC 3327: Session Initiation Protocol (SIP) Extension Header Field for

Registering Non-Adjacent Contacts

13. RFC 3329: Security Mechanism Agreement for the SIP

14. RFC 3372: SIP for Telephones (SIP-T): Context and Architectures 15. RFC 3428: SIP Extensions for Instant Messaging

16. RFC 3486: Compressing the Session Initiation Protocol (SIP) 17. RFC 3515: The REFER Method

18. RFC 3608: Session Initiation Protocol (SIP) Extension Header Field for Service

Route Discovery During Registration 19. RFC 2806: URLs for Telephone Calls

20. RFC 2848: PINT - IP Access to Telephone Call Services 21. RFC 2915: The NAPTR DNS Resource Record 22. RFC 2976:The SIP INFO Method

23. RFC 3204: MIME media types for ISUP and QSIG Objects 24. draft-ieft-sipping-e164-02: Using ENUM for SIP Application 25. draft-ieft-sipping-cc-transfer-05: Call Transfer

26. draft-ieft-sip-referredby-00: The Referred-By Mechansim 27. draft-ieft-sip-replaces-03: The SIP Replaces Header 28. draft-ietf-session-timer-10: The SIP Session Timer

29. draft-ietf-sipping-3gpp-r5-requirements-00: 3rd Generation Partnership Project

(3GPP) Release 5 requirements on the Session Initiation Protocol 30. draft-ietf-sip-nat-02: An Extension to the Session Initiation Protocol for

Sysmmetric Response Routing

31. draft-ietf-sipping-mwi-02.txt: A Message Summary and Message Waiting

Indication Event Package for the Session Initiation Protocol. 32. draft-ietf-simple-presence-10: SIP Extensions for Presence

33. draft-ieft-simple-im-sdp-00: SIP-SDP Extensions for SIP Instant Message

Sessions

34. ITU-T Recommendation T.38: Procedures for real-time Group 3 facsimile

communication over IP networks

35. draft-yu-tel-trl-07: Extension to Tel URL to support Number Portabiltiy and

Freephone Service

36. draft-ietf-mmusic-sdp-qos-00: Establishing QOS and Security Preconditions for

SDP sessions

SIP 相关协议

1. RFC 1006: ISO transport services on top of the TCP Version 3

2. RFC 2030: Simple Network Time Protocol (SNTP) Version 4 for IPv4, IPv6 and

OSI

3. RFC 2246: The TLS Protocol Version 1.0 4. RFC 2327: SDP Session Description Protocol

5. RFC 3024: MIME media types of ISUP and QSIG Objects

SIP 学习入门范例 (1)

学习 SIP 协议最快捷的方法是通过范例来学习,因此我从 Understand SIP 上找了4个最简单呼叫过程来分析。通过对这些流程图以及每个呼叫所包含的消息体文本分析,尽快熟悉 SIP 呼叫原理。 PS. 如果有什么地方说明不妥,请告诉我

一、基本 SIP 会话建立范例

下面的流程图显示出最简单的 SIP 呼叫流程。它由两个呼叫终端组成(其实真正的系统并没有这么简单),呼叫终端可以为 SIP 电话机或者具备 SIP 功能的手机等终端设备。在这里我们假设它是能够连接到 IP 网的终端设备,并且它们已经知道对方的 IP 地址。

PS. 因为这是第一节,每个字段我们讲得会比较详细,后面章节如何字段意义差不多,我们将会省略。对于某些常用的,有重要意义的字段,我们还将在专门的地方说明。 INVITE

主叫方Tesla首先发起 INVITE 消息到被叫方Marconi。INVITE 消息包含会话类型和一些呼叫所必须的参数。会话类型可能是单纯的语音,也可能是网络会议所用的多媒体视频,还可能是游戏会话。下面是消息体范例,我们来详细分析各个字段的意义: INVITE sip:marconi@radio.org SIP/2.0

<= 请求方法、请求地址(Request-URI)、SIP 版本号(目前都是 SIP/2.0) <= 请求地址一般就是被叫方地址,跟 MSN 中好友 eMail 地址类似 Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b <=SIP 版本号(2.0)、传输类型(UDP)、呼叫地址、 <=branch是一随机码,它被看作传输标识

<=Via 字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成 <=传输类型可以为 UDP、TCP、TLS、SCTP Max-Forwards: 70

<=最大跳跃数,就是经过 SIP 服务器的跳跃次数,主要是防止循环跳跃 <=每尽管一台代理服务器,该整数减一 To: G. Marconi

From: Nikola Tesla ;tag=76341 <=表示请求消息的发送方和目标方

<=如果里面有用户名标签,地址要求用尖括号包起来

<=对于 INVITE 消息,可以在 From 字段中包含 tag,它也是个随机码 Call-ID: 123456789@lab.high-voltage.org

<=呼叫ID是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变

<=对于用户代理发送 INVITE 消息,本地将生成 From tag 和 Call-ID 全局唯一码,被叫方代理则生成 To tag 全局唯一码。这三个随机码做为整个对话中对话标识(dialog indentifier)

在通话双方使用。 CSeq: 1 INVITE

<=CSeq,又叫命令队列(Command Seqence),每发送一个新的请求,该数自动加1 * 以上几个字段是所有 SIP 消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须 Subject: About That Power Outage...

Contact:

<=Contact 是 INVITE 消息所必须的,它用来路由到被叫设备地址,也称为用户代理(UA) Content-Type: application/sdp Content-Length: 158

<=最后两位附属字段说明消息体类型以及字段长度 v=0 <=SDP版本号,目前都是 0

o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org <=主叫源地址,类型等 s=Phone Call <=主题

c=IN IP4 100.101.102.103 <=连接 t=0 0 <= 时间戳

m=audio 49170 RTP/AVP 0 <=媒体 a=rtpmap:0 PCMU/8000 <=媒体属性 <=从上面 SDP 消息体我们可以得出下面信息 <=连接 IP 地址:100.101.102.103 <=媒体格式:audio <=端口号:49170 <=媒体传输类型:RTP <=媒体编码:PCM u Law <=采样率:8000 Hz 180 Ringing

当被叫方接收到 INVITE 请求消息后,将回复 180 Ringing。顾名思义,就是发回铃音,提示主叫方电话已连接上了,正等待被叫应答。被叫方接收到 INVITE 消息后也会发生响铃或者其它有呼入提示,这由被叫方设定(我们可以把它想象成我们自己设定手机铃声)。对于 180 响应又被称为“消息及时响应”,它是一种用来测试被叫状态的一种响应。因此它所包含的信息不多,具体 180 响应消息如下:

SIP/2.0 180 Ringing

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b

;received=100.101.102.103 <=这里增加一个 received 参数,标识接收方 IP 地址 To: G. Marconi ;tag=a53e42 <=上已提到,To tag 做为被叫方标识

From: Nikola Tesla ;tag=76341 <=要求很发送方 From tag 一致

Call-ID: 123456789@lab.high-voltage.org CSeq: 1 INVITE

Contact:

Content-Length: 0

<=对于 180 Ringing 响应,基本上就是将 INVITE 的 Via、To、From、Call-ID 和 CSeq 内容复制过来,对于首行标出 SIP 版本号,响应代码(180)和动作原因(reason phrase) <=注意这里 From 和 To 地址,因为它们用来指定呼叫方向,因此这里的 200 OK 响应并没有将地址对调,仍然保持原样。一点不同的是 To 头字段添加了由被叫方 Marconi 生成的 tag 标识 200 Ok

被叫响铃后,如果被叫用户 Marconi 接起电话,则发出 200 OK 响应。这个响应除了做为接通指示之外,还有一个功能是用来指定被叫允许的连接媒体格式,让主叫方确认是否可以接收该媒体。 消息体如下: SIP/2.0 200 OK

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b ;received=100.101.102.103

To: G. Marconi ;tag=a53e42

From: Nikola Tesla ;tag=76341 Call-ID: 123456789@lab.high-voltage.org CSeq: 1 INVITE

Contact: Content-Type: application/sdp Content-Length: 155 <=头字段部分基本同上 v=0

o=Marconi 2890844528 2890844528 IN IP4 tower.radio.org s=Phone Call

c=IN IP4 200.201.202.203 t=0 0

m=audio 60000 RTP/AVP 0 a=rtpmap:0 PCMU/8000

<=从上面 SDP 消息体我们可以得出下面信息 <=终端 IP 地址:200.201.202.203 <=媒体格式:audio <=端口号:60000 <=媒体传输类型:RTP <=媒体编码:PCM u Law <=采样率:8000 Hz ACK

通话前最后一步是主叫方确认 200 OK响应。该项确认证明连接被允许,即将使用另一种协议开始媒体连接。这另一种协议是上面在 SDP 消息段中所协商好的 RTP 格式。该 ACK 响应内容如下:

ACK sip:marconi@tower.radio.org SIP/2.0

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g Max-Forwards: 70

To: G. Marconi ;tag=a53e42

From: Nikola Tesla ;tag=76341 Call-ID: 123456789@lab.high-voltage.org CSeq: 1 ACK Content-Length: 0 BYE

通话完毕后,由被叫方 Marconi 首先挂机,发送 BYE 请求命令。注意这回由 Marconi 做为主叫方了,因此 Via 字段和 From、To 与 INVITE 字段有所不同。其实也就是倒置。 BYE sip:n.tesla@lab.high-voltage.org SIP/2.0

Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf Max-Forwards: 70

To: Nikola Tesla ;tag=76341 From: G. Marconi ;tag=a53e42 Call-ID: 123456789@lab.high-voltage.org CSeq: 1 BYE Content-Length: 0 200 OK

BYE 之后,要求被叫方发 200 Ok 确认,也就是让主叫知道被叫已经知道你挂断了。(注意这里所说的主被叫角色已经倒过来了)打个比方,通话之后,有一方要求挂机,另一方需要知道它已经挂机了。

SIP/2.0 200 OK

Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf ;received=200.201.202.203

To: Nikola Tesla ;tag=76341 From: G. Marconi ;tag=a53e42 Call-ID: 123456789@lab.high-voltage.org CSeq: 1 BYE Content-Length: 0

到此,我们已经将最简单的呼叫过程讲完了。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方 IP 地址即可。现实生活中这种呼叫形式是很少见的。后面我们将继续介绍另一种利用代理方式进行呼叫连接。 留个疑问:为什么说这种点对点的方式比较少用?

SIP 学习入门范例 (2)

二、通过代理服务器的 SIP 呼叫

在前面一个例子中,我们事先假设两个终端知道对方 IP 地址。而在现实情况下,这种非常少见。因为 IP 地址不像是电话号码,基本上每个人都是固定的,大多数情况,我们只知道被叫方名字,而并不知道对方在哪,也不知道对方终端的 IP 地址。因此今天,我们继续介绍另一种呼叫方式,即通过代理服务器进行呼叫。通过代理服务器进行呼叫,和我们使用 HTTP 代理上网大同小异。我们这个例子,只有一个代理服务器。

PS. 因为这里有很多内容和第一节相似,我们大量列举内容,只在个别地方说明 M1:首先是主叫方Schroedinger发送Invite请求给代理服务器。 INVITE sip:werner.heisenberg@munich.de SIP/2.0

<=对于基于代理服务器的呼叫连接,代理服务器要处理 2 部分内容。\前的是用户,后面是终端设备地址,需要DNS解析成标准IP地址。

Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a Max-Forwards: 70

To: Heisenberg From: E. Schroedinger ;tag=42 Call-ID: 10@100.101.102.103 CSeq: 1 INVITE

Subject: Where are you exactly?

Contact: Content-Type: application/sdp Content-Length: 159 v=0

o=schroed5244 2890844526 2890844526 IN IP4 100.101.102.103 s=Phone Call t=0 0

c=IN IP4 100.101.102.103 m=audio 49170 RTP/AVP 0 a=rtpmap:0 PCMU/8000

代理服务器在它的定位数据库中查找 SIP 地址(sip:werner.heisenberg@munich.de)。这里有两个步骤:

1、首先UA查询DNS,确定代理服务器位置;然后由代理服务器查询定位被叫地址 2、代理服务器将 Invite 消息转发到被叫地址,在 Invite 消息中增加第二Via字段 M2:代理服务器转发 INVITE 消息

INVITE sip:werner.heisenberg@200.201.202.203 SIP/2.0

Via: SIP/2.0/UDP proxy.munich.de:5060;branch=z9hG4bK83842.1 <=这里增加了个新 Via,由代理服务器产生

Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a Max-Forwards: 69 <=经过一个跳跃,这里减 1 To: Heisenberg From: E. Schroedinger ;tag=42 Call-ID: 10@100.101.102.103 CSeq: 1 INVITE

Contact: Content-Type: application/sdp Content-Length: 159 v=0

o=schroed5244 2890844526 2890844526 IN IP4 100.101.102.103 s=Phone Call

c=IN IP4 100.101.102.103 t=0 0

m=audio 49172 RTP/AVP 0 a=rtpmap:0 PCMU/8000 M3:被叫放回铃 180 Ringing SIP/2.0 180 Ringing

Via: SIP/2.0/UDP proxy.munich.de:5060;branch=z9hG4bK83842.1 ;received=100.101.102.105

Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a To: Heisenberg ;tag=314159 From: E. Schroedinger ;tag=42 Call-ID: 10@100.101.102.103 CSeq: 1 INVITE

Contact: Content-Length: 0 M4:代理转发 180 Ringing SIP/2.0 180 Ringing

Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a To: Heisenberg ;tag=314159 From: E. Schroedinger ;tag=42 Call-ID: 10@100.101.102.103 CSeq: 1 INVITE

Contact: Content-Length: 0

M5:被叫接通电话,发 200 OK SIP/2.0 200 OK

Via: SIP/2.0/UDP proxy.munich.de:5060;branch=z9hG4bK83842.1 ;received=100.101.102.105

Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a To: Heisenberg ;tag=314159 From: E. Schroedinger ;tag=42 Call-ID: 10@100.101.102.103 CSeq: 1 INVITE

Contact: Content-Type: application/sdp Content-Length: 159 v=0

o=heisenberg 2890844526 2890844526 IN IP4 200.201.202.203 s=Phone Call

c=IN IP4 200.201.202.203 t=0 0

m=audio 49172 RTP/AVP 0 a=rtpmap:0 PCMU/8000 M6:代理转发 200 OK SIP/2.0 200 OK

Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a To: Heisenberg ;tag=314159 From: E. Schroedinger ;tag=42 Call-ID: 10@100.101.102.103 CSeq: 1 INVITE

Contact: Content-Type: application/sdp Content-Length: 159 v=0

o=heisenberg 2890844526 2890844526 IN IP4 200.201.202.203 c=IN IP4 200.201.202.203 t=0 0

m=audio 49170 RTP/AVP 0 a=rtpmap:0 PCMU/8000

M7:主叫收到 200 OK,直接发 ACK 到被叫

ACK sip:werner.heisenberg@200.201.202.203 SIP/2.0

Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKka42

Max-Forwards: 70

To: Heisenberg ;tag=314159 From: E. Schroedinger ;tag=42 Call-ID: 10@100.101.102.103 CSeq: 1 ACK Content-Length: 0 M8:被叫挂机,发 BYE

BYE sip:schroed5244@pc33.aol.com SIP/2.0

Via: SIP/2.0/UDP 200.201.202.203:5060;branch=z9hG4bK4332 Max-Forwards: 70

To: E. Schroedinger ;tag=42

From: Heisenberg ;tag=314159 Call-ID: 10@100.101.102.103 CSeq: 2000 BYE Content-Length: 0 M9:回 200 OK SIP/2.0 200 OK

Via: SIP/2.0/UDP 200.201.202.203:5060;branch=z9hG4bK4332 To: E. Schroedinger ;tag=42

From: Heisenberg ;tag=314159 Call-ID: 10@100.101.102.103 CSeq: 2000 BYE Content-Length: 0

SIP 学习入门范例 (3)

三、SIP 注册范例

今天开始讲注册部分。这个例子是及其简化的一个注册例子。以后还会详细介绍。

在本例中 Heisenberg 向注册服务器发送 REGISTER 请求,SIP 服务器接收到注册请求,该请求消息中 To 头字段是 Heisenberg SIP 请求,就好像是我们共用的 eMail 地址一样。后面 IP 地址是当前用户使用设备的 IP 地址。注册服务器将 SIP 地址和设备 IP 地址绑定起来,并保存到数据库中待用。(前面一个例子中所介绍的代理服务器就是通过查询注册服务器数据库信息,然后给 SIP 用户终端定位的。)

由 Heisenberg 发送的 REGISTER 消息内容如下: REGISTER sip:registrar.munich.de SIP/2.0

Via: SIP/2.0/UDP 200.201.202.203:5060;branch=z9hG4bKus19 Max-Forwards: 70

To: Werner Heisenberg

From: Werner Heisenberg ;tag=3431 Call-ID: 23@200.201.202.203 CSeq: 1 REGISTER

Contact: sip:werner.heisenberg@200.201.202.203 Content-Length: 0

首行中请求地址是注册服务器的地址,To 字段包含用户 SIP 地址,这里是

sip:werner.heisenberg@munich.de。除非出现第三方注册,一般来说,To和From内容一样。而Contact字段中的信息用来保存到注册服务器数据库中。

注册服务器确认成功后,发 200 Ok 回复终端,证明 Contact 字段已经保存成功。 SIP/2.0 200 OK

Via: SIP/2.0/UDP 200.201.202.203:5060;branch=z9hG4bKus19

To: Werner Heisenberg ;tag=8771 From: Werner Heisenberg ;tag=3431 Call-ID: 23@200.201.202.203 CSeq: 1 REGISTER

Contact: ;expires=3600 Content-Length: 0

注意这里 Contact 地址包含一个过期时间,也就是注册有效期。很容易理解。

SIP 学习入门范例 (4)

四、SIP 状态和及时短消息范例

这个实例最简单的说法就是,利用 SIP 获取好友状态信息以及发送及时消息。我们经常用的 QQ 或MSN 就是这种方式。一方用户可以获取另一方用户状态信息。状态信息用来表示该用户目前的工作状态,例如:工作中、休息中等等。目前新版本的聊天工具还可以显示个人消息的能力。

在 SIP 协议中,规定可以使用 SUBSCRIBE 来请求状态或者改写状态,用 NOTIFY 获得状态信息。在本例中,Chebychev 希望和 Possion 通信。为了能够知道 Possion 的状态情况,Chebychev 通过发送 SUBSCRIBE 订阅 Possion 状态信息,消息内容如下: SUBSCRIBE sip:poisson@probability.org SIP/2.0

Via SIP/2.0/TCP lecturehall21.academy.ru:5060;branch=z9hG4bK348471123 Max-Forwards: 70

To: M. Poisson

From: P. L. Chebychev ;tag=21171 Call-ID: 58dkfj34924lk34452k592520 CSeq: 3412 SUBSCRIBE Allow-Events: presence

Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE Contact: Event: presence Content-Length: 0

Poisson 接收到 SUBSCRIBE 消息后,发送 202 Accepted 响应返回到 Chebychev SIP/2.0 202 Accepted

Via SIP/2.0/TCP lecturehall21.academy.ru:5060 ;branch=z9hG4bK348471123;received=19.34.3.1

To: M. Poisson ;tag=25140

From: P. L. Chebychev ;tag=21171 Call-ID: 58dkfj34924lk34452k592520 CSeq: 3412 SUBSCRIBE Allow-Events: presence

Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE Contact: Event: presence Expires: 3600 Content-Length: 0

之后,Possion 向 Chebychev 发送 NOTIFY消息,表示其当前状态

NOTIFY sip:pafnuty@lecturehall21.academy.ru SIP/2.0

Via SIP/2.0/TCP dist.probablilty.org:5060;branch=z9hG4bK4321 Max-Forwards: 70

To: P. L. Chebychev ;tag=21171 From: M. Poisson ;tag=25140 Call-ID: 58dkfj34924lk34452k592520 CSeq: 1026 NOTIFY

Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE Allow-Events: dialog

Contact: Subscription-State: active;expires=3600 Event: presence

Content-Type: application/cpim-pidf+xml Content-Length: 244

closed

Chebychev 发送 200 OK 响应 NOTIFY SIP/2.0 200 OK

Via SIP/2.0/TCP dist.probablilty.org:5060 ;branch=z9hG4bK4321;received=24.32.1.3

To: P. L. Chebychev ;tag=21171 From: M. Poisson ;tag=25140 Call-ID: 58dkfj34924lk34452k592520 CSeq: 1026 NOTIFY Content-Length: 0

之后,当 Poisson 登陆后,再次发送 NOTIFY 消息

NOTIFY sip:pafnuty@lecturehall21.academy.ru SIP/2.0

Via SIP/2.0/TCP dist.probablilty.org:5060;branch=z9hG4bK334241 Max-Forwards: 70

To: P. L. Chebychev ;tag=21171 From: M. Poisson ;tag=25140 Call-ID: 58dkfj34924lk34452k592520 CSeq: 1027 NOTIFY

Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE Allow-Events: presence

Contact: Subscription-State: active;expires=1800 Event: presence

Content-Type: application/cpim-pidf+xml Content-Length: 325

open

sip:s.possion@dist.probability.org;transport=tcp

Chebychev 发 200 OK 确认 SIP/2.0 200 OK

Via SIP/2.0/TCP dist.probablilty.org:5060 ;branch=z9hG4bK334241;received=24.32.1.3

To: P. L. Chebychev ;tag=21171 From: M. Poisson ;tag=25140 Call-ID: 58dkfj34924lk34452k592520 CSeq: 1027 NOTIFY Content-Length: 0

现在 Chebychev 已经知道 Possion 在线了,开始发送及时消息。 MESSAGE sip:s.possion@dist.probability.org SIP/2.0

Via SIP/2.0/TCP lecturehall21.academy.ru:5060;branch=z9hG4bK3gtr2 Max-Forwards: 70

To: M. Poisson

From: P. L. Chebychev ;tag=4542 Call-ID: 9dkei93vjq1ei3 CSeq: 15 MESSAGE

Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE Content-Type: text/plain Content-Length: 9

Hi There!

注意到这里,MESSAGE 是独立与会话的,它不属于任何会话。每个消息都含有一个新的 Call-ID 和 From tag。200 OK 用来确认收到该信息。 SIP/2.0 200 OK Via SIP/2.0/TCP

lecturehall21.academy.ru:5060;branch=z9hG4bK3gtr2;received=19.34.3.1 To: M. Poisson ;tag=2321 From: P. L. Chebychev ;tag=4542 Call-ID: 9dkei93vjq1ei3 CSeq: 15 MESSAGE Content-Length: 0 Possion 开始回复消息

MESSAGE sip:chebychev@academy.ru SIP/2.0

Via SIP/2.0/TCP dist.probablilty.org:5060;branch=z9hG4bK4526245 Max-Forwards: 70

To: P. L. Chebychev

From: M. Poisson ;tag=14083 Call-ID: lk34452k592520 CSeq: 2321 MESSAGE

Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE Content-Type: text/plain Content-Length: 30

Well, hello there to you, too! 收到消息后,发 200 OK SIP/2.0 200 OK Via SIP/2.0/TCP

dist.probablilty.org:5060;branch=z9hG4bK4526245;received=24.32.1.3 To: P. L. Chebychev ;tag=mc3bg5q77wms From: M. Poisson ;tag=14083 Call-ID: lk34452k592520 CSeq: 2321 MESSAGE Content-Length: 0

SIP 编程开发介绍

我们的系统是建立在 Trillium TAPA 架构之上的,有关 TAPA 架构请参阅相关文档,这里就不具体介绍了。今天我们的任务是学习如何建立 SIP 网络构架,也就是如何编程开发。

SIP 协议是独立于下层协议的传输机制。它可以通过 TCP 传,也可以通过 UDP 传。它自己本身提供了一套可靠方案,而使用 UDP 允许将 SIP 消息做为广播形式发送。 SIP 网络主要由两个组件组成:

? ?

用户代理 (User Agent - UA) 网络服务 (Network Server - NS)

下面是一段关于两组件的英文说明,比较容易读懂。 User Agent

A SIP user agent is an entity capable of initiating and terminating calls. It consists of a SIP protocol client ( the User Agent Client - UAC ), and a SIP protocol server ( the User Agent Server - UAS ). The UAC initiates and sends SIP requests to a SIP server. The UAS returns responses to SIP requests received on behalf of a physical user. It may accept, redirect, or refuse a call. NetWork Server

A network server is forwarding entity in the network. A Network server can be a proxy, redirect, or a registrar server, or a combination of these.

A proxy server receives a request, determines which possible server(s) to send it to, and then forwards or services the request. It acts as an intermediate routing entity that receives requests and forwards them after suitable modifications. Other functions of the proxy may include call supplementary services, policy enforcement and record keeping, authentication and authorization, and firewall or NAT traversal support.

A redirect server receives a request, resolves the received address into one or more new addresses, and returns these addresses to the client. It does not initiate SIP requests or accept calls.

A registrar server records and maintains a database of SIP addresses associated with SIP endpoints and provides an address translation service to redirect and proxy servers. It is typically co-located with either a proxy or a redirect server. However, a stand-alone registrar implementation is also possible.

SIP 协议部署

基于 Trillium SIP 协议栈可以开发不同服务,包括 呼叫控制(call control),注册管理服务(registry management services),和 定位服务(location services)。 下面还是用英文说明这3类服务。

Call control on a UA initiates and terminates a call, including signalling and meida. It is reponsible for resource reservation, media management, authentication, security, encryption, and providing supplementry services. On SIP Gateways, it can support an interworking function to other kinds of networking protocols. On a proxy server, it additionally controls call routing and call state maintenances for the server controlling a firewall.

The registry management function is reponsible for registering all physical users at a SIP UA with the registrar server. At a registrar server, registry maintains the database of the endpoints ( or users logged on the endpoints ) and reponds to all address resolution requests for these users.

Location services provide user location services to the SIP layer. It can do this by either:

? ?

Calling on the database maintained by the registry management function Calling on one or more global location services ( finger, LDAP, rwhois, multicast-based protocols, or operating system-dependent mechanisms ) whether resident on the local server or on one or more remote location servers

SIP 编程模型

SIP 编程开发需要两个协议栈,SIP 和 TCP/UDP 协议栈

用户可以利用 SIP 协议栈编写终端接口应用程序、网关应用程序、防火墙,资源存储,认证以及及时消息应用程序,而 TCP/UDP 提供下层同操作系统的套接字接口。

本文来源:https://www.bwwdw.com/article/an83.html

Top