XCAP协议中的幂等性(idempotency)研究
************************************************************************
作者:胡家辉/雨水 转载请注明出处http://blog.csdn.net/gobitan
************************************************************************
XCAP(XML Configuration Access Protocol,XML配置访问协议),也称XML配置接入协议。它是IETF制定的一个协议,前面陆续发布了一系列草案,于2007年5月正式成为RFC规范。
该协议允许客户端读、写、修改存放在服务器中的XML格式的应用配置数据。XCAP将XML文档中的节点映射到HTTP URIs中,使得这些组件能够直接通过HTTP访问。
该协议中有一个极为重要的概念—幂等性,英文为idempotency。如果读者最先没有接触过相关协议,初次遇到这个概念难免不知所云。本文结合XCAP协议对这个概念做出解释。
首先,我们来看一下XCAP协议的原文,看看协议怎么说。原文摘自RFC 4825。
7. Client Operations
HTTP also specifies that PUT and DELETE requests are idempotent. This means that, if the client performs a PUT on a document and it succeeds, it can perform the same PUT, and the resulting document will look the same(HTTP也要求PUT和DELETE请求满足幂等性。这意味着,如果一个客户端在一个文档上执行了PUT操作,并且执行成功。那么在该文档上再次执行同样的PUT操作,操作后的文档跟操作前是一样的(即内容没有发生改变)). Similarly, when a client performs a DELETE, if it succeeds, a subsequent DELETE to the same URI will generate a 404; the resource no longer exists on the server since it was deleted by the previous DELETE operation(同样地,当客户端执行一个DELETE,如果成功了,那么接下来的具有同样URI的DELETE操作将返回404,这是因为先前的DELETE已经将该资源删除,该资源已经不存在了) . To maintain this property, the client SHOULD construct its URIs such that, after the modification has taken place, the URI in the request will point to the resource just inserted for PUT (i.e., the body of the request), and will point to nothing for DELETE(为了维护这个属性,客户端构造的URI应该满足:修改发生之后,请求中的URI对于PUT来说将指向刚刚插入的资源(如请求消息体),对于DELETE则指向空). If this property is maintained, it is the case that GET to the URI in the PUT will return the same content (i.e., GET(PUT(X)) == x). This property implies idempotency(如果满足该属性,那么对PUT请求中的URI执行GET操作将返回与PUT请求消息体中同样的内容(即GET(PUT(X)==X))这个属性就被称为幂等性). Although a request can still be idempotent if it does not possess this property, XCAP does not permit such requests. If the client's request does not have this property, the server will reject the request with a 409 and indicate a cannot-insert error condition.(尽管不拥有这个属性的请求也可能是幂等的,但是XCAP不允许这样的请求。如果客户的请求不具有这个属性,那么服务器将以409拒绝,并指示不能插入错误。)
从上面协议中的描述可以看出,这里的幂等性主要与修改操作有关,即PUT和DELETE方法。对于PUT来说,就是同样的PUT操作无论执行多少次,其结果都跟第一次执行的结果相同,后面会介绍一个例子。
而对于DELETE操作来说,一次删除之后资源就不存在了。这里举一个不满足幂等性的DELETE例子,如某个DELETE操作指示删除XML文档中某个根元素下的第一个元素,如果该根元素下不只一个元素,那么显然该操作不满足幂等性。因为第一次该根元素下的第一个元素被删除了,但是第二个元素自动成为了该根元素的第一个元素,第二次执行DELETE时并不返回404,因此不满足幂等性的规定。
下面我们再看看协议中7.4节对幂等性的描述,它提到了幂等性对操作所带来的限制以及解决办法。
7.4. Create or Replace an Element
To be certain that element insertions have the GET(PUT(x))==x property, the client can check that the attribute predicates in the final path segment of the URI match the attributes of the element in the body of the request. As an example of an request that would not have this property and therefore not be idempotent, consider the following PUT request (URIs are line-folded for readability):
(为了确保元素插入满足幂等性,客户端应该检查URI路径中的属性谓词,看它是否与请求消息体中元素的属性值向匹配。一个不具有该属性的请求,它是非幂等的,来看下面的请求(URI折行是为了便于阅读))
PUT
/rls-services/users/sip:bill@example.com/index/~~/rls-services/
service%5b@uri=%22sip:good-friends@example.com%22%5d
HTTP/1.1
Content-Type:application/xcap-el+xml
Host: xcap.example.com
<service uri="sip:mybuddies@example.com">
<resource-list>http://xcap.example.com/resource-lists/users /sip:joe@example.com/index/~~/resource-lists/list%5b@name=%22l1%22%5d
</resource-list>
<packages>
<package>presence</package>
</packages>
</service>
This request will fail with a 409. The Request URI contains a final path segment with a predicate based on attributes - @uri="sip:good-friends@example.com". However, this will not match the value of the "uri" attribute in the element in the body (sip:mybuddies@example.com)(请求将以409失败。该请求的URI中包含了@uri="sip:good-friends@example.com"。然而它与请求消息体中元素的属性值sip:mybuddies@example.com不匹配).
也就是说,上面例子中URI中属性指示的值与请求消息体中不匹配,因此不满足幂等性。下面的协议部分讲述了幂等性的局限性。
The GET(PUT(x))==x property introduces some limitations on the types of operations possible. It will not be possible to replace an element with one that has a new value for an attribute that is the sole unique element identifier, if the URI contained a node selector which was using the previous value of that attribute for purposes of selecting the element. This is exactly the use case in the example above(GET(PUT(x))==x属性给某些操作带来了一些限制。对于用一个新的属性值去替换一个元素,而该属性是该元素的唯一标识,这操作是可能执行的。因为如果URI的节点选择符中包含了先前的属性值,那么这正好是上面例中的情况). To get around this limitation, the selection can be done by position instead of attribute value, or the parent of the element to be replaced can be selected, and then the body of the PUT operation would contain the parent, the child to be replaced, and all other siblings.
(为了解决这个限制问题,可以通过基于位置的属性值替换。或者通过选择元素的父元素替换,这样它的子元素和所有其他兄弟都将被替换。)
下面对上面协议的描述做一个解释。幂等性带来的限制就是如果该属性唯一标识该元素,那么无法用新的属性值去替换一个元素。比如下面的例子,假设XML文档中含有如下元素:
<book id=”1234567”>Inside the C++ Object Model</book>
这个时候你以如下的元素来替换上面的元素将是无法办到的,即
<book id=”7654321”>Unix Network Programming</book>
原因在于,你如果要替换该元素那么首先要通过id=”1234567”来把该元素标识出来,即指明你要替换这个元素。然而你的PUT请求消息体中的id却是”7654321”,这就恰恰违背了幂等性操作的约束。这就使幂等性所带来的限制。
参考文献: http://www.ietf.org/rfc/rfc4825.txt
分享到:
相关推荐
### XCAP协议在SIP/SIMPLE呈现系统中的应用研究 #### 1. 引言 随着互联网技术的发展,即时通信(Instant Communication, IC)已成为人们日常生活中不可或缺的一部分。其中,呈现(Presence)业务作为IC的重要组成...
通过对OMA和IETF相关标准的研究,我们设计了一个基于XCAP协议的XML文档管理系统,该系统能够有效地支持PoC业务、Presence业务和多媒体会议业务中的XML文档管理需求。此外,该系统还为系统开发者提供了一个可参考的...
XCAP常用于VoIP(Voice over IP)和IMS(IP Multimedia Subsystem)环境中的用户配置,例如个性化铃声设置、联系人列表管理、呼叫过滤规则等。此外,它还可以应用于任何需要远程配置和管理的场景,如智能家居设备的...
XCAP协议的关键特性之一是幂等性,它指的是无论相同的操作被执行多少次,最终服务器上的资源状态都是一致的。这意味着,即使操作因为某种原因重复执行,也不会造成数据不一致或应用状态的错误。例如,在网络延迟、...
提供的"xcap-tutorial.ppt"可能是一个关于XCAP协议的教程,包含了XCAP的基本概念、操作示例以及如何在实际项目中应用XCAP等内容。通过阅读这个教程,开发者可以更深入地理解XCAP的工作原理,并学习如何在自己的系统...
《IETFdra_POC_xcap_xcap_ie:深入理解XCAP协议在3G POC业务中的应用》 在信息技术领域,尤其是移动通信和互联网融合的3G业务中,交互式呼叫控制(POC,Push-to-Talk over Cellular)是一项重要的服务。POC允许用户...
7. **教育与研究**:对于网络协议学习和教学,xcap也是一把利器。学生和研究人员可以借助它来深入理解网络协议的工作原理,通过实际操作加深理论知识的理解。 在【xcap_1.0.3_XiaZaiBa】这个压缩包中,很可能包含了...
XCAP是一种基于XML的协议,用于管理和操作网络中的用户数据,特别是与在线状态(Presence)相关的数据。这个压缩包可能包含了规范文档、实现指南、示例代码或者测试用例等内容,帮助开发者理解和应用XCAP协议。 ...
在使用xcap时,可能涉及的技术包括网络编程、协议栈原理、数据包结构、网络安全和网络故障排查等。对于开发者和网络管理员来说,熟练掌握xcap的使用可以极大地提高工作效率。 在压缩包文件列表中,"xcap-gr"可能是...
7. **测试工具**:为了帮助开发者更好地理解和测试XCAP协议,libxcap项目通常会附带一个测试服务器(如openxcap),开发者可以通过这个服务器模拟各种XCAP操作,验证客户端代码的正确性。 在实际应用中,libxcap库...
5. **教学与研究**:在教育和研究领域,XCap是学习网络协议和分析网络行为的重要工具。 总结,XCap作为一款强大的网络封包分析工具,其自定义数据包构建和抓包功能使得它在多种网络环境中都能发挥重要作用。通过...
XCAP设计时充分考虑了安全性,采用了OAuth、Digest Authentication等安全机制,确保了数据传输的安全性。此外,权限服务器的访问控制策略也保证了只有授权的用户才能进行相关操作。 7. **XCAP与IMS的关系** 在IMS...
RFC 4825中详细讨论了XCAP的安全机制,包括使用HTTP认证、资源访问控制、签名和加密等方法,以确保数据的安全性和完整性。这些机制防止未经授权的访问和篡改,保证了配置数据的可靠性。 5. **XCAP的应用场景:** ...
以太网发包工具(xcap)正式版是款能够从系统中读取所有网络接口的工具。xcap发包工具可以从指定的接口发送构造的报文,支持两种简单的发送策略,一是发送选中的(用鼠标选中),二是循环发送复。 1、构造报文 支持...
XCAP(eXtensible Configuration and Provisioning Protocol)是一种网络配置和数据管理协议,常用于IMS(IP Multimedia Subsystem)系统中。它允许客户端通过HTTP或HTTPS与服务器交互,实现对用户数据、业务逻辑...
《xcap_v1.1.0版本:深入解析以太网发包...总的来说,xcap_v1.1.0是一款强大且实用的以太网发包工具,适用于网络调试、性能测试和教育研究等多个领域。掌握它的使用方法,对于提升网络技术水平和解决问题能力大有裨益。
这对于模拟网络通信、测试网络服务的响应性、查找网络问题或研究网络协议的行为都有着极大的帮助。 在实际操作中,xcap可能包含以下几个主要功能: 1. **报文构造**:用户可以通过图形化界面或者直接编辑报文结构...
虽然Wireshark功能更为全面,支持更多协议解析和高级过滤功能,但Xcap以其简洁的界面和易操作性,对初学者和需要快速分析的场景更为友好。对于一些基础的网络分析任务,Xcap完全可以胜任,而且其构造包功能是...