WS-Discovery(网络服务动态发现)协议再解读

文章目录


之前学习Onvif协议的时候我们已经了解到客户端进行设备搜索的时候就是基于WS-Discovery协议的,而当我们对部分设备添加设备搜索服务方便对该设备进行统一的设备网络管理时就需要着重再学习一下WS-Discovery协议了。(其中部分内容可能需要VPN查看)

1、概述

以下内容来自Wiki翻译:

Web服务动态发现WS-Discovery)是一项技术规范,定义了​​多播​​​发现协议以在本地网络上定位服务。它工作在​​TCP​​​和​​UDP​​​端口3702和使用​​IP组播​​​地址239.255.255.250或者FF02中:C。顾名思义,节点之间的实际通信是使用​​Web服务​​​标准(尤其是​​SOAP-over-UDP)完成的​​。

Microsoft ​​Windows Vista​​​操作系统中的各种组件都使用WS-Discovery,例如“我附近的人”。​​Windows 7​​​和更高版本中的组件WSDMON使用WS-Discovery自动发现启用​​WSD的​​​网络打印机,该打印机在Windows资源管理器的“网络”中显示,并且可以通过双击它们进行安装。在​​Windows 8​​​或更高版本中,安装是自动的。自2008年以来,默认情况下在联网的​​HP​​​打印机中启用WS-Discovery 。[​​1] ​​​[​​2]​​​ WS-Discovery是​​Windows Rally​​​技术和​​Web Services设备配置文件​​的组成部分。

该协议最初由​​BEA Systems​​​,​​佳能​​​,​​英特尔​​​,​​微软​​​和​​WebMethods开发​​​。2009年7月1日,它被​​OASIS​​​批准为标准。[​​3]​

2、协议资料

协议资料,目前只有英文的,但是可以在其中看到ws-discovery的soap probe,用于结合分析我们抓包到的ws-discovery信息:

​https://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf​

3、协议介绍

主要来源于上述pdf文档,将部分内容翻译如下,用于对该协议做进一步了解:

这个规范定义了一个多播发现协议来定位服务。发现的主要模式是搜索一个或多个目标服务的客户机。为了根据目标服务的类型、目标服务所在的范围或两者都找到目标服务,客户端向多播组发送探测消息;与探测匹配的目标服务直接向客户机发送响应。为了根据名称定位目标服务,客户端向相同的多播组发送解析请求消息,匹配的目标服务也直接向客户端发送响应。

为了减少轮询的需要,当目标服务加入网络时,它会向同一个多播组发送一条通知消息。通过侦听这个多播组,客户端可以检测新可用的目标服务,而无需重复探测。

为了扩展到大量的端点,如果发现代理在网络上可用,该规范定义了多播抑制行为。具体来说,当发现代理检测到通过多播发送的探测或解析请求时,发现代理为自己发送通知。通过侦听这些通知,客户端检测发现代理,并切换到使用特定于发现代理的协议。但是,如果发现代理没有响应,客户端将恢复使用本文描述的协议。

为了使用明确的网络管理服务(如DHCP、DNS、域控制器、目录等)来支持网络,本规范承认客户端和/或目标服务可能被配置为与本文定义不同的行为。例如,另一个规范可能定义了一个知名的DHCP记录,其中包含一个发现代理的地址,并且符合该规范可能要求端点将消息发送到这个发现代理,而不是发送到一个多播组。虽然此类配置的具体方法超出了本规范的范围,但预计任何此类配置都将允许客户端和/或目标服务在精心管理的和自组织的网络之间顺利迁移。

(1)、适用范围

本规范旨在满足以下要求:

  • 允许发现ad hoc网络中具有最少网络服务的服务(如不提供DNS服务或目录服务)。
  • 在存在网络服务的托管网络中,利用网络服务来减少网络流量。
  • 启用自组织网络和托管网络之间的平滑转换。
  • 启用发现资源受限的服务实现。
  • 支持引导到其他Web服务协议以及其他传输。
  • 支持按类型和范围发现服务。
  • 利用其他Web服务规范实现安全、可靠、经事务处理的消息传递。
  • 为更复杂和/或当前未预料到的场景提供可扩展性。
  • 同时支持SOAP 1.1​​SOAP 1.1​​​和SOAP 1.2​​SOAP 1.2​​协议。

(2)、不适用

本规范不打算满足以下要求:

  • 提供服务的活动信息。
  • 为服务描述定义一个数据模型,或者为该描述定义丰富的查询。
  • 支持网际网路规模的发现。

4、协议示例及wireshark抓包分析

(1)、客户端探针消息示例

表1列出了一个客户机搜索打印机的探测消息多播示例。

table 1:

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"
xmlns:i="http://printer.example.org/2003/imaging"
xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action>
http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe
</a:Action>
<a:MessageID>
uuid:0a6dc791-2be6-4991-9af1-454778a1917a
</a:MessageID>
<a:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</a:To>
</s:Header>
<s:Body>
<d:Probe>
<d:Types>i:PrintBasic</d:Types>
<d:Scopes MatchBy="http://schemas.xmlsoap.org/ws/2005/04/discovery/ldap"> ldap:///ou=engineering,o=examplecom,c=us
</d:Scopes>
</d:Probe>
</s:Body>
</s:Envelope>

通过xml工具分析如下:

WS-Discovery(网络服务动态发现)协议再解读_客户端

表1中的07-09行表示该消息是一个探针,第13行表示它被发送到一个众所周知的地址RFC 2141。因为没有显式的回复SOAP报头块​WS-Addressing​,对该探测的任何响应都将作为UDP包发送到探测传输头的源IP地址和端口​SOAP/UDP​。行(17-21)在探测上指定了两个约束:行(17)约束对实现基本打印类型的目标服务的响应;行(18-21)约束工程部门范围内对目标服务的响应。只有同时满足这两个约束的目标服务才会响应。虽然本例中包含了这两个约束,但探测不需要包含其中任何一个。

(2)、服务端探针回复消息示例

表2列出了响应表1中的探测而发送的探测匹配消息示例。

table 2:

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"
xmlns:i="http://printer.example.org/2003/imaging"
xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action>
http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches
</a:Action>
<a:MessageID>
uuid:e32e6863-ea5e-4ee4-997e-69539d1ff2cc
</a:MessageID>
<a:RelatesTo>
uuid:0a6dc791-2be6-4991-9af1-454778a1917a
</a:RelatesTo>
<a:To>
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
</a:To>
<d:AppSequence InstanceId="1077004800" MessageNumber="2" />
</s:Header>
<s:Body>
<d:ProbeMatches>
<d:ProbeMatch>
<a:EndpointReference>
<a:Address>
uuid:98190dc2-0890-4ef8-ac9a-5940995e6119
</a:Address>
</a:EndpointReference>
<d:Types>i:PrintBasic i:PrintAdvanced</d:Types>
<d:Scopes> 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
</d:Scopes>
<d:XAddrs>http://prn-example/PRN42/b42-1668-a</d:XAddrs>
<d:MetadataVersion>75965</d:MetadataVersion>
</d:ProbeMatch>
</d:ProbeMatches>
</s:Body>
</s:Envelope>

xml工具分析结果:

WS-Discovery(网络服务动态发现)协议再解读_搜索_02

表2中的行(07-09)表示该消息是一个探测匹配,行(13-15)表示它是对表1中的探测的响应。因为探针没有显式的ReplyTo SOAP头块,所以行(16-18行)表明响应被发送到探针的传输头的源IP地址和端口。第19行包含实例标识符和消息号;此信息允许接收方重新排序从目标服务接收到的发现消息。行(23-37)描述了单个目标服务。行(24-28)包含目标服务的稳定的、唯一的标识符,该标识符在网络接口、传输地址和IPv4/v6中是不变的。在本例中,该值是一个UUID方案URI,但如果它满足稳定性和唯一性要求,它可能是一个传输URI(如第35行)。第29行列出了目标服务实现的类型(参见,例如WSDL 1.1),在本例中,是匹配探测的基本打印类型以及高级打印类型。行(30-34)列出了三个管理范围,一个匹配探针(第31行),一个特定于特定物理位置(第32行),还有一个包含切换到新的基础设施时有用的数据(第33行)。在这种情况下,作用域可能是部署相关信息的异构集合。第(35)行表示目标服务可能到达的传输地址;在本例中,为单个HTTP传输地址。第36行包含目标服务的元数据版本;如下所述,如果目标服务的元数据发生更改(包括第29-34行),则此版本将增加。

(3)、客户端探针报文

下面我们使用本地onvif客户端搜索网络摄像头来进行抓包分析探针报文和探针回复报文。

前面我们知道对IPC摄像头搜索时的多播地址一般是239.255.255.250,所以我们搜索摄像头时可以直接搜索该IP对应的UDP内容获取客户端发送探测消息的报文:

WS-Discovery(网络服务动态发现)协议再解读_WS-Discovery_03

如果在不知道该地址的情况下我们搜索客户端的IP加上UDP流来分析也可以,比如我们测试时用的电脑上的Onvif客户端搜索摄像头,那客户端地址就是本地电脑的地址:

WS-Discovery(网络服务动态发现)协议再解读_搜索_04

格式化后的xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope"
xmlns:soap-enc="http://www.w3.org/2003/05/soap-encoding"
xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<soap-env:Header>
<a:Action mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</a:Action>
<a:MessageID>uuid:1ebd6b0f-9f4b-438b-937e-49d7fe0f7ff1</a:MessageID>
<a:ReplyTo>
<a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address>
</a:ReplyTo>
<a:To mustUnderstand="1">urn:schemas-xmlsoap-org:ws:2005:04:discovery</a:To>
</soap-env:Header>
<soap-env:Body>
<Probe xmlns="http://schemas.xmlsoap.org/ws/2005/04/discovery">
<d:Types xmlns:dn="http://www.onvif.org/ver10/network/wsdl"
xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery">dn:NetworkVideoTransmitter</d:Types>
</Probe>
</soap-env:Body>
</soap-env:Envelope>

(4)、服务端探针回复报文

在局域网下打开wires hark,然后根据客户端IP,比如我这里的40.40.40.101,搜索

ip.addr == 40.40.40.101

找到UDP右键追踪UDP流:

WS-Discovery(网络服务动态发现)协议再解读_客户端_05

由于没有中文,所以ASCII或者UTF8都可以:

WS-Discovery(网络服务动态发现)协议再解读_WS-Discovery_06

报文xml内容格式化后如下:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tt="http://www.onvif.org/ver10/schema"
xmlns:tds="http://www.onvif.org/ver10/device/wsdl"
xmlns:trt="http://www.onvif.org/ver10/media/wsdl"
xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl"
xmlns:tev="http://www.onvif.org/ver10/events/wsdl"
xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl"
xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl"
xmlns:tst="http://www.onvif.org/ver10/storage/wsdl"
xmlns:ter="http://www.onvif.org/ver10/error"
xmlns:dn="http://www.onvif.org/ver10/network/wsdl"
xmlns:tns1="http://www.onvif.org/ver10/topics"
xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl"
xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http"
xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"
xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"
xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2"
xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2"
xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2"
xmlns:trc="http://www.onvif.org/ver10/recording/wsdl"
xmlns:tse="http://www.onvif.org/ver10/search/wsdl"
xmlns:trp="http://www.onvif.org/ver10/replay/wsdl"
xmlns:tnshik="http://www.hikvision.com/2011/event/topics"
xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl"
xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema"
xmlns:tas="http://www.onvif.org/ver10/advancedsecurity/wsdl"
xmlns:tr2="http://www.onvif.org/ver20/media/wsdl"
xmlns:axt="http://www.onvif.org/ver20/analytics">
<env:Header>
<wsadis:MessageID>urn:uuid:720a0000-9664-11b4-8325-1012fb824255</wsadis:MessageID>
<wsadis:RelatesTo>uuid:1ebd6b0f-9f4b-438b-937e-49d7fe0f7ff1</wsadis:RelatesTo>
<wsadis:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsadis:To>
<wsadis:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches</wsadis:Action>
<d:AppSequence InstanceId="1617190918"
MessageNumber="1390" />
</env:Header>
<env:Body>
<d:ProbeMatches>
<d:ProbeMatch>
<wsadis:EndpointReference>
<wsadis:Address>urn:uuid:720a0000-9664-11b4-8325-1012fb824255</wsadis:Address>
</wsadis:EndpointReference>
<d:Types>dn:NetworkVideoTransmitter tds:Device</d:Types>
<d:Scopes>onvif://www.onvif.org/type/video_encoder onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/Profile/G onvif://www.onvif.org/Profile/T onvif://www.onvif.org/type/audio_encoder onvif://www.onvif.org/type/ptz onvif://www.onvif.org/MAC/10:12:fb:82:42:55 onvif://www.onvif.org/hardware/DS-2DE7220IW-D onvif://www.onvif.org/name/HIKVISION%20DS-2DE7220IW-D onvif://www.onvif.org/location/city/hangzhou</d:Scopes>
<d:XAddrs>http://40.40.40.101/onvif/device_service http://[fe80::1212:fbff:fe82:4255]/onvif/device_service</d:XAddrs>
<d:MetadataVersion>10</d:MetadataVersion>
</d:ProbeMatch>
</d:ProbeMatches>
</env:Body>
</env:Envelope>

5、最后

这样的话我们就可以结合SOAP/UDP实现简单的WS-Discovery客户端和服务端了。