WS-Discovery消息标准格式
Two modes of WS-Discovery
设备发现定义了多播发现协议来定位服务。
Ad Hoc模式:该模式是设备发现的首选协议。客户端会发送探测消息到多播组,目标服务如果匹配
探测消息里的内容,就直接发送一个单播的探测匹配消息给客户端。为了可以根据名称发现目标服
务,客户单可以发送一个多播解析消息到多播组,同样,如果目标服务匹配该解析消息,则直接发
送一个单播解析匹配给客户端。
Managed模式:如果Endpoint的数量扩大了,且超出了ad hoc网络的范围之外,而且在网络中可
以使用Discovery Proxy(DP,发现代理),则应该采用Managed操作模式,以禁止多播的行为。
在Managed模式下,DP会检测多播的探测和解析请求,当DP检测到后,DP朝自身发送一个
announcement消息,而客户端会一旦监听到DP上的announcement消息,就切换为managed
模式。如果客户端一直监听不到,就采用Ad Hoc模式。
Hello
当下列两种情形中发生任意一种时,NVT必须发送Hello消息:
1. Target Service加入到一个网络时
2. Target Service的元数据发生变化时。元数据是指TargetService的相关信息,包括
TargetService的传输和其使用的协议,TargetService实现的类型和TargetService所
存在的范围。
为了降低网络风暴的风险,当出现上述任意一种情况时,Target Service需要等一段时间后再发
送Hello消息。
而在Managed模式中,Discovery Proxy(DP)会监听多播的Probe或Resolve消息,监听到客
户端的多播Probe或Resolve消息后,DP会以单播的方式发送Hello消息到客户端,这时发送的
Hello消息可以直接发送,无需等待。
Hello消息例子
xmlns:d=
xmlns:s=
http://schemas.xmlsoap.org/ws/2005/04/discovery/Hello
uuid:73948edc-3204-4455-bae2-7c7d0ff6c37c 机器识别号,从网卡MAC地址获得
//发送目的的属性
urn:schemas-xmlsoap-org:ws:2005:04:discovery 一个匿名的地址,
给网络提供了一个固定的标示符 ,指的就是target service地址
uuid:98190dc2-0890-4ef8-ac9a-5940995e6119
75965
UUID 让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨
识资讯的指定。UUID由以下几部分的组合:
(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生
成一个UUID,则第一个部分不同,其余相同。
(2)时钟序列
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式 获得。
UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的
GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单
的生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每
个 x 是0-9或a-f范围内的一个十六进制的数字。而标准的UUID格式为:
xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12),可以从cflib下载
CreateGUID() UDF进行转换。
To:是发送目的地的属性值,此处的地址urn:schemas-xmlsoap-org:ws:2005:04:discovery说明了发
送到了一个well-known地址。由于网络范围被大量占用,许多部署都不能给Endpoint赋予一个全球唯
一的有意义的URI地址,为了让匿名的Endpoint初始化消息交换模式和接收回应,WS-Addressing定
义了一个匿名的地址http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
Application Sequencing header 可以让接收方有序排列顺序混乱的消息。
InstanceId在服务每次gone down, lost state, and came back up again的时候
每次都增加>=1,MessageNumber在每次消息发送后都增加>=1。
Body/EndpointReference是给网络提供了一个固定的标示符,使message能够定向到该地
址,这里的EndpointReference指的就是target service地址。
当targetservice的元数据发生变化时,该MetadataVersion的值都会增加>=1。
元数据是指TargetService的相关信息,包括TargetService的传输和其使用的协议,TargetService
实现的类型和TargetService所存在的范围。
[WS-Discovery]2.1: Information about the Target Service; includes, but is not
limited to, transports and protocols a Target Service understands, Types it implements,
and Scopes it is in.
Bye
当Target Service将要离开一个网络时,应该发送一个多播的Bye消息
Bye消息例子
xmlns:a=
xmlns:d=
xmlns:s=
http://schemas.xmlsoap.org/ws/2005/04/discovery/Bye
uuid:337497fa-3b10-43a5-95c2-186461d72c9e 机器号
urn:schemas-xmlsoap-org:ws:2005:04:discovery
uuid:98190dc2-0890-4ef8-ac9a-5940995e6119
AppSequence InstanceId与上述的Hello消息的相同,则说明该Bye消息在排序时将会在排
在Hello之后。
EndpointReference中的Address与hello消息中的一致,说明这时同一个Target Service
发出的消息,发出Bye消息之后则该目标不提供服务了。
Probe
为了在托管目标服务的范围内查找目标服务,根据Target Service的类型或其所在的范围找到
该服务,客户端发送探测消息。
ProbeMatch包括一个Target Service,当且仅当Probe中的所有类型和范围匹配该Target
Service。
如何判断匹配:
当Probe中的类型T1与一个TargetService中的类型T2的QNames相同,则这两个类型是匹
配的。具体来说T1与T2匹配需满足:
T1与T2的命名空间【Namespaces in XML 1.1】相同
T1的local name与T2的相同
Scope S1与Scope S2匹配的规则:(任意一条不满足,都是不匹配的)
S1与S2的schema和Authority是相同的
S1的path_segments是S2的path_segments的一个segmens-wise前缀,S1和S2都不含
有”.”或”..”
以上两条规则都对大小写敏感
客户端发送一个Probe查找给定Type或Scope的Target Services,如果没有给定的Type
或Scope信息,客户端也可以发送Probe消息去查找Target Services。
Probe消息例子
xmlns:a=
xmlns:d=
xmlns:i=
xmlns:s=
http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe
uuid:0a6dc791-2be6-4991-9af1-454778a1917a
urn:schemas-xmlsoap-org:ws:2005:04:discovery 发送目的属性
i:PrintBasic
MatchBy=
客户端在发送探测消息时为了针对所有的Target Services,通常会忽略d:Probe中的Types和Scopes(范围),当Types和Scopes被忽略时,即为任何类型和任何范围。
ProbeMatch
xmlns:a=
xmlns:d=
xmlns:i=
xmlns:s=
http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches
uuid:e32e6863-ea5e-4ee4-997e-69539d1ff2cc
uuid:0a6dc791-2be6-4991-9af1-454778a1917a
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:98190dc2-0890-4ef8-ac9a-5940995e6119
i:PrintBasic i:PrintAdvanced
ldap:///ou=engineering,o=examplecom,c=us
ldap:///ou=floor1,ou=b42,ou=anytown,o=examplecom,c=us
http://itdept/imaging/deployment/2004-12-04
http://prn-example/PRN42/b42-1668-a
75965
RelatesTo与Probe消息的MessageID值一致
To:如果Probe回应的是Probe源IP和端口号,则该处的值就是:
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
XAddrs:该传输地址可能会被用来与Target Service通信
LDAP是一个用来发布目录信息到许多不同资源的协议,是一个得到关于人或者资源的集中、静态数据的快速方式。
Types:Target Service实现的Types的无序集合。
Scopes:Target Service中存在的多个URI scheme的无序集合。如果包含这个元素,URI地址不应该包含空格。
Resolve
为了定位一个Target Service,获得它的传输地址,客户端发送Resolve消息
Onvif7.3.5 大多数情况下,resolve和resolve match不是必须的,但是为了与ws-Discovery协议兼容,NVT should实现之。
Endpoint
一个Endpoint是一个实体,或处理器,或资源,该终端可以用来接收或发送web服务的消息。
/wsa:EndpointReference/wsa:Address
必须元素,该地址可能是个逻辑地址,也可能是个唯一标示符。
/wsa:EndpointReference/wsa:ReferenceProperties/
可选元素,包含了传输reference properties的元素
/wsa:EndpointReference/wsa:ReferenceProperties/{any}
可选元素,每个子元素代表了一个reference property
/wsa:EndpointReference/wsa:ReferenceParameters/
可选元素,包含了传输reference parameters的元素
/wsa:EndpointReference/wsa:ReferenceParameters/{any}
可选元素,每个子元素代表了一个reference parameter
/wsa:EndpointReference/wsa:PortType
可选元素,指明了终端引用的selected port type值
/wsa:EndpointReference/wsa:ServiceName
可选元素,指明了终端引用到的wsdl文件的描述
/wsa:EndpointReference/wsa:ServiceName/@PortName
This OPTIONAL attribute (of type xs:NCName) specifies the name of the definition that corresponds to the endpoint being
referenced.
可选属性,指明了 定义的名称
/wsa:EndpointReference/wsp:Policy
This OPTIONAL element specifies a policy that is relevant to the
interaction with the endpoint.
可选元素,该元素指定了一个策略,该策略与终端的交互有关联
/wsa:EndpointReference/{any}
This is an extensibility mechanism to allow additional elements to be
specified.
/wsa:EndpointReference/@{any}
This is an extensibility mechanism to allow additional attributes to be
specified.
WS-Policy中重要的概念
断言(Assertion)
它是策略(Policy)的基本组成单元,每个断言可以通过它们的限定名 ( QName) 来识别。断言可以是一个简单的字符串或带多个子元素和属性的复杂对象。断言是要表示服务行为的个性化要求、能力或其他特性。例如,可以创建一个断言,定义这样一个安全要求:必须使用受信任的X.509证书签名SOAP消息主体。
替代(Alternative)
替代只是对于断言的另外形式的表现,或者说是断言的组合形式。
标准化(Normalization)
标准化的目的是为了进行融合(Merge)和交集(Intersection)的操作,把策略简化为标准格式。
融合(Merge)
融合是将多个子策略组合在一起形成一个单一策略的过程。
交集(Intersection)
交集是比较用于公用替代的2个Web服务策略的过程。只有双方至少对一个策略替代达成一致,才会产生交集。
Message Information Headers
消息头包含一系列属性,通过这些属性可以知道确定一个交互中终端的“身份”和位置。
属性:
[destination] : URI (mandatory)
消息接收方的地址
[source endpoint] : endpoint reference (0..1)
消息源头的引用
[reply endpoint] : endpoint reference (0..1)
回应该消息的终端引用(接收方)
[fault endpoint] : endpoint reference (0..1)
该终端引用用来确定接收方在处理消息出错情况
[action] : URI (mandatory)
一个唯一标示符来说明该消息的语义,推荐使用URI来说明该属性,该URI在wsdl端口类型中指明了输入,或输出,或错误信息
[message id] : URI (0..1)
一个可以唯一标示该消息的URI
[relationship] : (QName, URI) (0..unbounded)
一对值,指明该消息如何与另外一个消息关联
/wsa:MessageID
可选项,一个可以唯一标示该消息的URI。如果wsa:ReplyTo 或wsa:FaultTo 元素存在,则该元素必须存在
/wsa:RelatesTo
可选项,描述了一个以(URI, QName) 方式的抽象relationship属性值。它的子属性会描述与之相关的消息的message id。如果该消息是一个应答,该元素是必须的。
/wsa:RelatesTo/@RelationshipType
可选项,该属性以QName的形式表达了关系的类型。
/wsa:ReplyTo
可选项,reply终端的属性。如果header中有该项,则message ID是必须的。 /wsa:From
可选项,源终端的属性
/wsa:FaultTo
可选项,错误终端的属性
/wsa:To
必须项,指向目标
/wsa:Action
必须项,要采取的action