SLP协议的扩展与改进

来源:互联网 发布:淘宝客服打字速度要求 编辑:程序博客网 时间:2024/05/16 09:22
SLP 虽然功能强大,但也有很多不足之处。本文就服务标示符,服务抽象和事件模拟三个方面来改进 SLP 的弱点,并在和原有协议兼容的情况下对协议进行扩展,增强其功能。

本系列的第 1 部分文章介绍了 SLP 功能和应用,并把它与目前现存的一些服务发现协议作了比较和优劣分析。从上面的分析来看,SLP 还是有不少缺陷,但是在局域网内的很多应用中,SLP 又确实是首选的解决方案。那么,我们是否可以对 SLP 做一些改进,让其功能更加强大呢?好在 SLP 协议本身的可扩展性非常强,我们可以在协议允许的范围内,对其进行扩展,既丰富了其功能,又使它来兼容标准的规范。本文就这方面问题进行了一些探讨。

服务标示符

UDDI 中使用 uuid 来唯一标示服务实体,类似的,SSDP 中用 usn 来唯一标示服务,但是在 SLP 中并没有这么一个属性。在某些场合中,我们可能想要知道两个属性不同的服务是来自两个不同的服务提供者还是一个服务提供者改变了它的属性,这时,有一个唯一服务标示符就会方便很多。

虽然 SLP 本身没有提供对于唯一服务标示符的支持,我们可以很容易自己构造一个,一个简单的方法是在服务中增加一个标示符属性,但是一个服务在属性的使用上是没有任何限制的,我们并不能保证服务提供者一定会提供这个属性。这时,我们可以利用 SLP 扩展消息来达到这个目的。SLP 扩展消息是由 SLP 协议定义的附在 SLP 标准消息之后的消息。其内容格式由通信双方事先约定,协议并不作要求。我们可以定义一种扩展消息,内容为一个属性列表,表示 SA 在服务中必须提供列表中的属性。当 SA 向 DA 注册时,DA 检查 SA 的属性,如果没有要求的属性,就可以在回复确认消息时附加这个扩展消息,当 SA 收到这则消息时,它就不得不在自己的属性中增加该属性并重新向 DA 注册。这样,我们就可以保证在 DA 中注册的服务都有指定的属性,当然可以包括唯一标示符属性。在没有 DA 的情况下,UA 可以在服务请求中把唯一标示符作为查询条件的一部分,这样虽然不能迫使 SA 添加这项属性,但是也能确保在网络中使用到的服务都有自己的唯一标示符。

这条扩展消息的格式参考如下:

0 1 2 3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Extension ID = 0x8000 | Next Extension Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Offset, contd.| Required Attribute List Length| Attribute List/
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

根据 SLP 协议规范,扩展消息 ID 从 0x0000--0x7FFF 为标准扩展消息,0x8000--0x8FFF 为私有扩展,剩下的编号保留。因此这里使用 0x8000 编号作为 ID。后面 24bits 为下一个扩展消息的偏移量,由于 SLP 标准消息后面可以跟多个扩展消息,因此需要该字段来标示下一个扩展在什么地方开始,如果该扩展为最后一条扩展消息,则这项为 0。协议规定,ID 字段和下一个扩展偏移量必须为扩展消息的前两项,后面才是扩展的自定义内容。接下来一项是必要属性列表长度,用于定位随后的属性列表。在这个列表中的所有属性即该 SA 必须提供的属性,列表中的属性只有属性名字,不需要提供值。

由于 SA 在向 DA 注册时通常会注册自己所有的属性,因此当 SA 收到上述扩展时,它自己难以处理这个问题,可以在 SA 端返回一个错误。这时需要人工添加必要的属性后再次向 DA 注册。再次说明,该扩展消息的使用只能保证 SA 的服务有唯一标示符,但是并不能给服务提供唯一标示符。

下面是一个使用这条扩展的示例,其中没有指明的字段值可以是任意合法的字段,假设要求的唯一标示符名字叫 uuid:

  1. SA 向 DA 发送注册消息

    Function-ID : 3 (SrvReg,标准注册消息 )

    Attr-list: (attr1=12),(attr2=abc)

  2. DA 发现没有 uuid,回复 SA

    Function-ID: 5 (SrvAck,标准注册回复消息 )

    Error Code: 3 (INVALID_REGISTRATION,协议定义的标准错误 )

    Extension-ID: 0x8000

    Required attribute list length: 4

    Attribute list: uuid

  3. SA 再次注册,加上 uuid 属性

    Function-ID : 3

    Attr-list: (attr1=12),(attr2=abc),(uuid=347a45cc24f65a4d)

  4. DA 确认

    Function-ID: 5

    Error Code: 0




本文转自IBM Developerworks中国

      请点击此处查看全文