SSDP 簡單服務發現協議,是應用層協議,是構成UPnP(通用即插即用)技術的核心協議之一。它爲網絡客戶端(network client)提供了一種發現網絡服務(network services)的機制,採用基於通知和發現路由的多播方式實現。html
SSDP多播地址:239.255.255.250:1900(IPv4),FF0x::C(IPv6)緩存
兩種類型的SSDP請求消息會經過SSDP多播地址發送:網絡
1. 發現請求(Discovery request 或查詢請求)。SSDP客戶端向此地址發送HTTP UDP 發現請求,查詢某種類型的服務。SSDP服務在此地址上監聽服務發現請求。當服務監聽到的HTTP UDP 發現請求和它本身提供的服務匹配時,它以單播方式發送HTTP UDP 響應。ui
2. 存在通知(notification)。SSDP服務向此多播地址發送HTTP UDP 通知消息來宣佈本身的存在。操作系統
發現結果(discovery results)和存在通知消息(presence announcements)提供的信息包括:.net
服務的類型URIhtm
服務名稱USN:惟一標識一種服務實例。blog
位置信息:發現結果和存在通知可包含一個或多個位置URI,客戶端利用位置信息能夠找到它須要的服務。ci
期限信息:客戶端在本身的cache中保存此服務多長時間。若是期限過了,關於此服務的信息會被從cache中拿掉。當客戶端接收到的發現結果或存在通知包含的USN和cache中的某條匹配,則更新。路由
客戶端的服務緩存像下面這樣:
【SSDP發現請求】ssdp:discover
ssdp:discover 必須包含一個ST頭,客戶端使用ST頭來代表他們想發現的服務類型。ssdp:discover 必須包含一個帶 * 的請求URI。
M-SEARCH * HTTP/1.1
S: uuid:ijklmnop-7dec-11d0-a765-00a0c91e6bf6
Host: 239.255.255.250:1900
Man: "ssdp:discover"
ST: ge:fridge
MX: 3
各HTTP協議頭的含義:
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組織定義。
SSDP服務發現本身的服務類型和ST中指明的服務類型匹配時,能夠向ssdp:discover來自的IP地址/端口響應。響應消息應該包含服務的位置信息(Location 或AL頭),ST和USN頭。響應消息應該包含cache控制信息(max-age 或者 Expires頭),若是二者都包含了,Expires 頭優先,若是二者都缺失,那麼這條服務消息不能被cache。
HTTP/1.1 200 OK
S: uuid:ijklmnop-7dec-11d0-a765-00a0c91e6bf6
Ext:
Cache-Control: no-cache="Ext", max-age = 5000
ST: ge:fridge
USN: uuid:abcdefgh-7dec-11d0-a765-00a0c91e6bf6
AL: <blender:ixl><http://foo/bar>
各HTTP協議頭的含義簡介:
CACHE-CONTROL:max-age指定通知消息存活時間,若是超過此時間間隔,控制點能夠認爲設備不存在
DATE:指定響應生成的時間
EXT:向控制點確認MAN頭域已經被設備理解
LOCATION:包含根設備描述得URL地址
SERVER:飽含操做系統名,版本,產品名和產品版本信息
ST:內容和意義與查詢請求的相應字段相同
USN:表示不一樣服務的統一服務名,它提供了一種標識出相同類型服務的能力。
【SSDP存在通知消息】
SSDP服務經過存在通知消息來向客戶端宣佈本身的存在,更新期限信息,更新位置信息。
ssdp:alive 消息必須將 NT 設置成本身的服務類型,USN頭設置成本身的USN。ssdp:alive 應該包括Location或者AL頭,若是沒有DNS支持的話,使用SSDP服務的IP地址來表明位置。ssdp:alive還應該包括cache控制信息,max-age或者Expires頭。
NOTIFY * HTTP/1.1
Host: 239.255.255.250:reservedSSDPport
NT: blenderassociation:blender
NTS: ssdp:alive
USN: someunique:idscheme3
AL: <blender:ixl><http://foo/bar>
Cache-Control: max-age = 7393
ssdp:alive 沒有響應消息。
SSDP服務能夠發送ssdp:byebye 來宣佈本身下線。ssdp:byebye 必須將NT設置成本身的服務類型,將USN頭設置成本身的USN。ssdp:byebye 也沒有響應消息。當客戶端接收到ssdp:byebye 消息,刪掉cache裏面的相關條目。
NOTIFY * HTTP/1.1
Host: 239.255.255.250:reservedSSDPport
NT: someunique:idscheme3
NTS: ssdp:byebye
USN: someunique:idscheme3
【SSDP Auto-Shut-Off Algorithm】
A mechanism is needed to ensure that SSDP does not cause such a high level of traffic that it overwhelms the network it is running on.
【ssdp:all】
A mechanism is needed to enable a client to enumerate all the services available on a particular SSDP multicast channel/port.
【參考】
SSDP 協議原文:http://tools.ietf.org/html/draft-cai-ssdp-v1-03
http://www.cnblogs.com/debin/archive/2009/12/01/1614543.html