一、SSDP协议简介
SSDP(简单服务发现协议)是应用层协议,是构成UPnP(通用即插即用)技术的核心协议之一。它为网络客户端(network client)提供了一种发现网络服务(network services)的机制,采用基于通知和发现路由的多播方式实现。
二、SSDP实现
简单服务发现协议是在HTTPU和HTTPMU的基础上实现的协议。
按照协议的规定,当一个控制点(客户端)接入网络的时候,它可以向一个特定的多播地址的SSDP端口使用M-SEARCH方法发送“ssdp:discover”消息。当设备监听到这个保留的多播地址上由控制点发送的消息的时候,设备会分析控制点请求的服务,如果自身提供了控制点请求的服务,设备将通过单播的方式直接响应控制点的请求。
类似的,当一个设备接入网络的时候,它应当向一个特定的多播地址的SSDP端口使用NOTIFY方法发送“ssdp:alive”消息。控制点根据自己的策略,处理监听到的消息。考虑到设备可能在没有通知的情况下停止服务或者从网络上卸载,“ssdp:alive”消息必须在HTTP协议头CACHE-CONTROL里面指定超时值,设备必须在约定的超时值到达以前重发“ssdp:alive”消息。如果控制点在指定的超时值内没有再次收到设备发送的“ssdp:alive”消息,控制点将认为设备已经失效。
当一个设备计划从网络上卸载的时候,它也应当向一个特定的多播地址的SSDP端口使用NOTIFY方法发送“ssdp:byebye”消息。但是,即使没有发送“ssdp:byebye”消息,控制点也会根据“ssdp:alive”消息指定的超时值,将超时并且没有再次收到的“ssdp:alive”消息对应的设备认为是失效的设备。
在IPv4环境,当需要使用多播方式传送相关消息的时候,SSDP一般使用多播地址239.255.255.250和UDP端口号1900。
根据互联网地址指派机构的指派,SSDP在IPv6环境下使用多播地址FF0X::C,这里的X根据scope的不同可以有不同的取值。
三、SSDP请求类型
两种类型的SSDP请求消息会通过SSDP多播地址发送:
1. 发现请求(Discovery request 或查询请求)。SSDP客户端向此地址发送HTTP UDP 发现请求,查询某种类型的服务。SSDP服务在此地址上监听服务发现请求。当服务监听到的HTTP UDP 发现请求和它自己提供的服务匹配时,它以单播方式发送HTTP UDP 响应。
2. 存在通知(notification)。SSDP服务向此多播地址发送HTTP UDP 通知消息来宣布自己的存在。
发现结果(discovery results)和存在通知消息(presence announcements)提供的信息包括:
服务的类型URI
服务名称USN:唯一标识一种服务实例。
位置信息:发现结果和存在通知可包含一个或多个位置URI,客户端利用位置信息可以找到它需要的服务。
期限信息:客户端在自己的cache中保存此服务多长时间。如果期限过了,关于此服务的信息会被从cache中拿掉。当客户端接收到的发现结果或存在通知包含的USN和cache中的某条匹配,则更新。
四、SSDP协议消息
1、设备查询消息
当一个控制点加入到网络中时,设备发现过程允许控制点寻找网络上感兴趣的设备。发现消息包括设备的一些特定信息或者某项服务的信息,例如它的类型、标识符、和指向XML设备描述文档的指针。从设备获得响应从本质上说,内容与多址传送的设备广播相同,只是采用单址传送方式。设备查询通过HTTP协议扩展M-SEARCH方法实现的。典型的设备查询请求消息格式:
HOST:设置为协议保留多播地址和端口,必须是:239.255.255.250:1900(IPv4)或FF0x::C(IPv6)
MAN:设置协议查询的类型,必须是:ssdp:discover
MX:设置设备响应最长等待时间,设备响应在0和这个值之间随机选择响应延迟的值。这样可以为控制点响应平衡网络负载。
ST:设置服务查询的目标,它必须是下面的类型:
ssdp:all 搜索所有设备和服务
upnp:rootdevice 仅搜索网络中的根设备
uuid:device-UUID 查询UUID标识的设备
urn:schemas-upnp-org:device:device-Type:version 查询device-Type字段指定的设备类型,设备类型和版本由UPNP组织定义。
urn:schemas-upnp-org:service:service-Type:version 查询service-Type字段指定的服务类型,服务类型和版本由UPNP组织定义。
在设备接收到查询请求并且查询类型(ST字段值)与此设备匹配时,设备必须向多播地址239.255.255.250:1900回应响应消息。典型:
各HTTP协议头的含义简介:
CACHE-CONTROL |
max-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认为设备不存在 |
DATE |
指定响应生成的时间 |
EXT |
向控制点确认MAN头域已经被设备理解 |
LOCATION |
包含根设备描述得URL地址 |
SERVER |
饱含操作系统名,版本,产品名和产品版本信息 |
ST |
内容和意义与查询请求的相应字段相同 |
USN |
表示不同服务的统一服务名,它提供了一种标识出相同类型服务的能力。 |
2、设备通知消息
在设备加入网络,UPnP发现协议允许设备向控制点广告它的服务。它使用向一个标准地址和端口多址传送发现消息来实现。控制点在此端口上侦听是否有新服务加入系统。为了通知所有设备,一个设备为每个其上的嵌入设备和服务发送一系列相应的发现消息。每个消息也包含它表征设备或服务的特定信息。
2.1、ssdp:alive消息
在设备加入系统时,它采用多播传送方式发送发现消息,包括告知设备包含的根设备信息,所有嵌入设备以及它包含的服务。每个发现消息包含四个主要对象:
1. 在NT头中包含的潜在搜索目标。
2. 在USN头中包含的复合发现标识
3. 在LOCATION头中关于设备信息的URL地址
4. 在CACHE-CONTROL头中表示的广告消息的合法存在时间。
对于根设备,存在三种发现消息:
NT |
USN |
根设备的UUID |
根设备的UUID |
设备类型:设备版本 |
根设备的UUID,设备类型:设备版本 |
upnp:rootdevice |
根设备的UUID,设备类型和upnp:rootdevice |
对于根设备,存在两种发现消息:
NT |
USN |
嵌入设备的UUID |
嵌入设备的UUID |
设备类型:设备版本 |
嵌入设备的UUID,设备类型和设备版本 |
对于每个服务:
NT |
USN |
服务类型:服务版本 |
相关设备的UUID,服务类型和服务版本 |
如果一个根设备有n个嵌入设备,m个嵌入服务,而且包含k个不同的服务类型,这将会发出3 + 2n + k次请求。这些广告消息像控制点描述了设备的所有信息。这些消息必须作为一系列一起发出,发送的顺序无关紧要,但是不能对单个消息进行刷新或取消的操作。选择一个适当的持续期是在最小化网络通讯和最大化设备状态及时更新之间求得一个平衡,相对较短的持续时间可以保证控制点在牺牲网络流量的前提下获得设备的当前状态;持续期越长可以大大减少设备刷新造成的网络流量。一般而言,设备制造商应该选择一个适当的持续时间值。
由于UDP协议是不可信的,设备应该发送多次设备发现消息。而且为了降低控制点无法收到设备或服务广告消息的可能性,设备应该定期发送它的广告消息。在设备加入网络时,它必须用NOTIFY方法发送一个多播传送请求。NOTIFY方法发送的请求没有回应消息,典型的设备通知消息格式如下:
各HTTP协议头的含义简介:
HOST |
设置为协议保留多播地址和端口,必须是239.255.255.250:1900。 |
CACHE-CONTROL |
max-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认为设备不存在 |
LOCATION |
包含根设备描述得URL地址 |
NT |
在此消息中,NT头必须为服务的服务类型。 |
NTS |
表示通知消息的子类型,必须为ssdp:alive |
USN |
表示不同服务的统一服务名,它提供了一种标识出相同类型服务的能力。 |
一个发现响应可以包含0个、1个或者多个服务类型实例。为了做出分辨,每个服务发现响应包括一个USN:根设备的标识。在同样的设备里,一个服务类型的多个实例必须用包含USN:ID的服务标识符标识出来。例如,一个灯和电源共用一个开关设备,对于开关服务的查询可能无法分辨出这是用于灯的。UPNP论坛工作组通过定义适当的设备层次以及设备和服务的类型标识分辨出服务的应用程序场景。这么做的缺点是需要依赖设备的描述URL。
2.2、ssdp:byebye消息
在设备和它的服务将要从网络中卸载时,设备应该对于每个未超期的ssdp:alive消息多播方式传送ssdp:byebye消息。但如果设备突然从网络卸载,它可能来不及发出这个通知消息。因此,发现消息必须在CACHE-CONTROL包含超时值,如果不重新发出广告消息,发现消息最后超时并从控制点的缓存中除去。典型的设备卸载消息格式如下:
专有设备或服务可以不遵循标准的UPNP模版。但如果设备或服务提供UPNP发现、描述、控制和事件过程的所有对象,它的行为就像一个标准的UPNP设备或服务。为了避免命名冲突,使用专有设备命名时除了UPNP域之外必须包含一个前缀"urn:schemas-upnp-org"。在与标准模版相同时,应该使用整数版本号。但如果与标准模版不同,不可以使用设备复用和徽标。
简单设备发现协议不提供高级的查询功能,也就是说,不能完成某个具有某种服务的设备这样的复合查询。在完成设备或者服务发现之后,控制点可以通过设备或服务描述的URL地址完成更为精确的信息查询。