`

[转]RFC3428 IM(即时消息)

    博客分类:
  • SIP
阅读更多
即时消息(IM)指的是近似实时的消息交互。即时消息通常很短,虽然并不要求这样。IM通常用于会话模式,也就是说,消息的交互是一来一回的,并且很快,近似于交互式的会话。
     提出了MESSAGE方法,扩展了SIP协议以传送IM消息。由于MSEEAGE是SIP消息,所以它继承了SIP协议所有的路由和安全特性。 MESSAGE用MIME格式的body携带具体内容。MESSAGE本身并不建立dialog;在多数应用里,每条IM消息都是独立的,颇似分页消息。 MESSAGE也可以在dialog内发送。

1.简介
    IM的历史。
    SIP协议提供了在线功能,也提供了面向会话的通信应用,但还没有提供即时消息功能。
本规范提出了一个新的方法:MESSAGE,用于在body里携带即时消息的内容。

2.适用范围
    用SIP传递即时消息,有两种模式:
    pager模式,用信令传递IM,消息之间没有明确的联系,或者说“会话”的概念仅存在于用户的想象中。
    session模式,用INVITE建立,用BYE结束的一个会话,IM是其中的媒体流。
    两种模式都有存在的价值(设想一下腾讯公司QQ的普通消息和UDP直连的对话模式)。本文只关心pager模式。
     为什么MESSAGE消息之间不关联。试想一下先创建一个dialog,MESSAGE在dialog内进行传递。这样所有的消息必然走相同的路由,由于 IM消息的流量通常很大,这样势必会引起拥塞问题。另一个问题是,如果MESSAGE必须走in dialog,那么IM的目的地就势必和会话的目的地一 样,而这种限制是不合理的。(阐述发消息的对象可以与打电话的对象不同的事实,所以消息不应该从Dialog中走)
一个MESSAGE走in dialog的例子:voice会话的一个参与者想同其中的一人进行IM交互(即想给正在通话的人发消息),这时把IM和该会话联系在一起是比较合理的。但是纯粹是为了把几个IM联系在一起而让MESSAGE都走in dialog是不允许的。

3.操作简介
    当一个人想给另外一个人发IM消息时,构造一个MESSAGE,发出去即可。请示URI可以是SIP URI,也可以是其它类型的地址。要发的即时消息放
在body里。body可以是任何MIME格式。可能用message/cpim会好一点,因为已有的IM系统标准是message/cpim格式。
    MESSAGE请求到达目的地之前可能经过多个SIP proxy。
    像SIP其它请求一样,收到MESSAGE应回临时应答和最终应答。200-OK只说明消息成功到达了目的地,并不代码用户已经阅读。
MESSAGE不创建dialog。

4.UAC的操作
    SIP相关的操作参照rfc3261。
    MESSAGE body必须支持plain/text格式。可以选择支持message/cpim格式。
    由于不创建一个dialog,所以MESSAGE不应该包含contact头域。
    MESSAGE可以在in dialog里发送,此时代表这个消息和某个dialog有关联关系(即发消息的URI为SIP URI)。
最终应答的含义,
200-OK:消息已成功送达目的地,但不保证对方用户已阅;
202-Accept:消息已成功发送到某网关,但不保证网关一定能把该消息送达目的地。
外发proxy有可能把MESSAGE分叉,可以加Expire头域,Date头域表明消息的生存时间。

5.使用IM URI
    Request URI,From头域,To头域可以填SIP URI,实在不行也可以填IM URI,此时会有proxy解析成SIP URI。
和路由相关的头域中的URI必须是SIP URI。

6.代理的操作
和SIP相关的操作参见rfc3261,需要注意的是,代理可以对MESSAGE进行分叉(fork)。

7.UAS的操作
    和SIP相关的操作参见rfc3261。
    200-OK:UAS收到MESSAGE,应立即回200-OK,但是是否把消息的内容显示给用户与本地策略有关 (是不是可以用来制作黑名单功能?) 。200-OK不能带body,,也不能携带Contact头域。
    202-Accepted:如果自己不是MESSAGE的最终用户,就回202-Accepted。意味着该MESSAGE会被尽力转发,但不保证一定能到达目的地。
4xx, 5xx :4xx, 5xx表示消息未被成功发送。
6xx :6xx表示消息虽被成功发送,但已被拒收。
    支持MESSAGE就必须支持text/plain格式的MIME type。也可以选择支持message/cpim格式。
如果消息携带有Expire头域,就处理超时,否则没有超时的概念。
如果UAS收到消息时该消息已经超时,可以选择处理该消息这和本地策略有关。例如可以选择丢弃,也可以正常显示给用户(标明超时),或采取其它策略。
如果消息不能被正确中继,如何处理该消息也与本地策略有关。

8.拥塞控制
    MESSAGE用信令携带媒体,所以流量会很大,需要特殊考虑。
    如果可能,MESSAGE最好使用有拥塞控制的传输层协议,如TCP,SCTP。
    消息本身的大小不一不要超过1300个字节,除非你知道确切的PMTU大小。
    对于不采用Dialog方式的消息,发往同一个目的URI的MESSAGE,如果上一个transaction还没有结束,就不允许发送下一个MESSAGE;而且如果不是路由设置每一跳在传输中采用拥塞控制,用Dialog传送的MESSAGE也禁止这么做。
有人曾建议为了减少拥塞,MESSAGE不必回临时应答。实际上没有必要规定这个。因为很多代理服务器根本就不关心是否是MESSAGE方法,他们只管转发。

9.方法定义
MESSAGE

10.例子
描述User1向处于一个Domain(domain.com)中的User2,发送即时消息的过程,经过一个简单代理Proxy。
   |  F1 MESSAGE        |                      |
   | -----------------〉|    F2 MESSAGE        |
   |                    |--------------------〉|
   |                    |                      |
   |                    |    F3 200 OK         |
   |                    |<-------------------- |
   |    F4 200 OK       |                      |
   |<-------------------|                      |
User1                 Proxy                  User2

1. User 1向domain.com的服务器发送请求信令F1,
MESSAGE SIP:user2@domain.com SIP/2.0
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
Max-Forwards:70
From: sip:user1@domain.com;tag=49583
To: sip:user2@domain.com
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Type:text/plain
Content-Length: 18

Method type为MESSAGE,使用TCP协议发送(有拥塞控制),Body类型 text/plain,body长度18。

2. 代理Proxy收到请求F1,确认是从domain.com的服务器来的请求,到数据库中查询User2(注册过程中生成数据库),User2@domain.com匹配User2@User2pc.domain.com,生成信息F2 ,

MESSAGE SIP:user2@domain.com SIP/2.0
Via: SIP/2.0/TCP proxy.domain.com;branch=z9hG4bK123dsghds
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
                                            received=1.2.3.4
Max-Forwards:69
From: sip:user1@domain.com;tag=49394
To: sip:user2@domain.com
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Type:text/plain
Content-Length: 18

3. User2收到F2,显示,向Proxy产生响应消息F3
SIP/2.0 200 OK
Via: SIP/2.0/TCP proxy.domain.com;branch=z9hG4bK123dsghds;
                                      received=192.0.2.1
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
                                            received=1.2.3.4
From: sip:user1@domain.com;tag=49394
To: sip:user2@domain.com;tag=ab8asdasd9
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Length:0

直接回应 没有Body(200-OK不能带body,,也不能携带Contact头域)

4. 服务器收到F3 去掉最顶端的Via,向下一个Via标识的地址(User1)发送F4
SIP/2.0 200 OK
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse;
                                            received=1.2.3.4
From: sip:user1@domain.com;tag=49394
To: sip:user2@domain.com;tag=ab8asdasd9
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Length:0


11.安全性考虑
    多数情况下,SIP请求是用来建立和修改会话的,但MESSAGE方法却用SIP请求传送媒体本身。因此安全性的问题需要特殊考虑。一般还要考虑端到端(end-to-end)的安全性。
    11.1.代理认证
    11.2.使用SIPS URI
    11.3.端到端加密
分享到:
评论

相关推荐

    SIP-RFC3428.doc

    《SIP协议RFC3428中文翻译:即时消息MESSAGE方法扩展详解》 SIP(Session Initiation Protocol)协议是一种用于控制多媒体通信会话(如语音和视频通话)的信令协议,它允许用户发起、修改和终止多媒体会话。然而,...

    RFC3920可扩展消息出席协议

    XMPP是一种基于XML的即时消息(IM)和出席协议,最初由Jabber开源社区在1999年开发,随后在2002年由XMPP工作组进行标准化工作,使之符合IETF的即时消息与出席技术标准。 #### 核心特性与功能 XMPP的核心特性在于其...

    SIP SIMPLE协议及相关RFC文档

    SIP SIMPLE协议通过RFC 3428和RFC 2778等文档为即时通讯和存在状态服务提供了标准化的SIP扩展。它使得用户可以在互联网上无缝地进行语音、视频通话、文字聊天以及分享自己的在线状态。了解并掌握SIP SIMPLE协议对于...

    基于IMS的即时消息业务接口规范

    4. **引用标准**:本规范引用了多项国内外标准,如中国移动的IMS即时消息、Presence和Group业务总体技术要求,以及IETF(互联网工程任务组)的相关RFC(请求评论)文档,确保遵循行业最佳实践。 5. **附录**:包含...

    中文版 xmpp协议之 可扩展消息出席协议:核心 RFC3920

    它主要用于构建满足即时消息(Instant Messaging,IM)和出席(Presence)需求的应用程序。XMPP为交换XML数据提供了一种通用的、可扩展的框架,使得几乎可以进行实时的消息交换,以及出席状态信息的共享。XMPP协议...

    IM聊天代码

    IM即时通讯系统是一种常见的在线交流工具,用于实时的文字、语音、视频聊天以及文件传输等功能。在本提供的资源中,"IM聊天代码"是基于XMPP(Extensible Messaging and Presence Protocol)协议实现的一个聊天框架,...

    RFC 3921中文版(XMPP协议)

    XMPP(Extensible Messaging and Presence Protocol,可扩展消息传递及存在协议)是一种基于XML的开放标准,用于即时通讯(IM)和实时通信。RFC 3921是XMPP的核心规范之一,它详细定义了XMPP的用户存在与消息交换...

    WebSocket长连接实现聊天IM 接收发送消息,百分百能用

    在聊天即时通讯(IM)场景中,WebSocket是理想的通信机制,因为它可以实现低延迟、高效率的消息传递。 在Android平台上,WebSocket的实现通常依赖于第三方库,如OkHttp、Socket.IO或环信等。下面将详细解释如何利用...

    xmpp之RFC3921

    XMPP是一种基于XML的即时消息(IM)协议,它不仅提供了基本的即时通讯功能,还支持丰富的扩展特性,如多用户聊天、文件传输、语音和视频通话等。这一标准由Jabber软件基金会提出,并在2004年由网络工作组的Philip ...

    RFC6121 - Jabber_XMPP中文翻译计划

    本文定义提供了遵循RFC2779要求的基本的即时消息(IM)和出席信息功能的可扩展的消息和出席信息协议(XMPP)的核心功能的扩展. 本文取代了 RFC 3921

    即时通讯IM

    即时通讯(Instant Messaging,简称IM)是一种实时在线通信技术,让用户可以快速地交换文本消息、文件、音频和视频等信息。在iOS平台上实现即时通讯,通常会借助特定的框架,如本例中提到的XMPP(Extensible ...

    XMPP-RFC3921(中文)

    - **概览**:XMPP是一种用于实时通讯的协议,旨在提供即时消息(Instant Messaging, IM)和出席信息(Presence)服务。 - **需求**:该文档定义了一系列的需求,确保XMPP协议能够满足特定的功能性和非功能性要求。...

    使用开源协议软件搭建即时通讯服务器

    随着信息技术的发展,即时通讯(Instant Messaging,简称 IM)已成为企业内部沟通的重要工具之一。它不仅能够提高工作效率,还能加强团队之间的协作与交流。本篇文章将详细介绍如何利用 Openfire 和 XMPP 协议来搭建...

    RFC3920:核心协议.doc

    10. **参考文献**:文档引用了其他的RFC,如RFC2779,用于即时消息和出席信息的需求,以及后续的RFC3921(XMPP-IM),定义了即时消息和出席信息的扩展。 11. **Nodeprep和Resourceprep**:这两个部分分别定义了节点...

    RFC3920(XMPP)中文翻译版

    - **RFC3920**定义了XMPP 1.0的核心功能,其中即时消息和出席信息的功能则由**XMPP-IM协议**进行扩展定义。 ##### 2.2 术语 - 文档中提到的关键字如"MUST"、"SHALL"等遵循**BCP14**、**RFC2119**的规定,用于明确...

    即时通信XMPP协议

    此外,XMPP协议的扩展需求,如即时消息和出席功能,是在RFC2779中定义的,并由XMPP即时消息与出席(XMPP-IM)进一步具体化。 总的来说,XMPP协议是一个强大且灵活的框架,支持实时通信应用的构建,包括但不限于即时...

    即时通讯协议(PRIM)

    它不仅满足了即时消息和在线状态协议(IMPP)的要求[RFC2779],还遵循了即时消息通用配置文件(CPIM)的规范,后者是在IMPP工作组中制定的一项标准。 ##### 2.1 设计目标与假设 PRIM的设计目标在于提供一种高效、...

    XMPP正式RFC标准3920

    2002年,IETF成立XMPP工作组继续开发和完善Jabber协议以满足更广泛的即时消息和出席信息需求。最终,**RFC3920**文档定义了XMPP 1.0的核心部分,而更多具体的应用则定义在XMPP-IM协议中。 #### 2. 通用的架构 ####...

    基于xmpp协议的多端即时通讯

    XMPP(Extensible Messaging and Presence Protocol,可扩展消息与出席协议)是一种开放的XML协议,用于即时消息传递(IM)和在线状态呈现(Presence)。它的前身是Jabber项目,最早由Jabber社区开发,后来被标准化...

    XMPP中文文档

    XMPP(可扩展消息和出席协议)是一种基于XML的开放即时消息传递技术,最初由Jabber开源社区开发,并于2002年成为IETF即时消息与出席(IM)的官方标准。它利用XML元素在任意两个网络端点间近实时地交换结构化信息,并...

Global site tag (gtag.js) - Google Analytics