网络协议之SSDP

概述

SSDP(Simple Service Discovery Protocol,简单服务发现协议)是 UPnP(Universal Plug and Play,通用即插即用)架构中的核心协议之一 ,用于在局域网(LAN)中实现设备与服务的自动发现。它基于 UDP 协议,采用多播(Multicast)机制,无需事先配置 IP 地址或端口即可完成设备识别和服务通告。

常见应用场景:

  • 智能家居设备发现(如 Philips Hue、Sonos 音响)
  • 网络打印机自动识别
  • DLNA 媒体服务器(如 Plex、Kodi)
  • 路由器 UPnP 端口映射服务
  • IoT 设备快速配网

SSDP与UPnP

UPnP 是一个完整的网络互操作框架

UPnP 是由 UPnP 论坛制定的一套标准,旨在让不同厂商的网络设备(如打印机、摄像头、智能电视、路由器等)在局域网中无需人工配置即可自动发现、交互和协同工作

UPnP 的完整工作流程分为 5 个阶段

阶段 协议/技术 功能
1. 寻址(Addressing) DHCP / Auto-IP 设备获取 IP 地址
2. 发现(Discovery) SSDP 设备广播自身或搜索其他设备
3. 描述(Description) HTTP + XML 获取设备能力和服务详情
4. 控制(Control) SOAP over HTTP 调用设备提供的动作(如“播放”、“开关灯”)
5. 事件通知(Eventing) GENA(General Event Notification Architecture) 订阅状态变化(如“音量改变”)

🔍 关键点:SSDP 仅负责第 2 步——“发现”,但这是整个 UPnP 流程的起点。

二、SSDP 在 UPnP 中的具体作用

  • 当一台新设备(如智能音箱)接入网络:
    • 它会通过 SSDP 发送 NOTIFY 消息(ssdp:alive),宣告:“我在这儿!我能提供音乐播放服务!”
  • 当控制点(如手机 App)想查找媒体服务器:
    • 它通过 SSDP 发送 M-SEARCH 请求:“谁是 MediaServer?请举手!”
    • 匹配的设备单播回复响应,包含其描述文件 URL(LOCATION 字段)

没有 SSDP,UPnP 就无法知道“网络里有哪些设备”,后续的描述、控制、事件都无法进行。

SSDP 的设计目标

  • 零配置发现:设备接入网络后可自动被其他设备发现。
  • 轻量高效:使用 UDP + HTTP-like 报文格式,开销小。
  • 支持动态加入/退出:设备可随时上线或下线,网络能及时感知。
  • 跨平台兼容:适用于各种操作系统和嵌入式设备。

技术基础

传输层

  • 协议:UDP(User Datagram Protocol)
  • 目的地址:IPv4 多播地址 239.255.255.250
  • 端口1900

注:IPv6 使用地址 FF0X::C(X 表示作用域),同样使用端口 1900。

报文格式

SSDP 使用类似 HTTP/1.1 的文本格式,但 通过 UDP 传输,不建立连接

核心工作机制

SSDP 支持两种主要操作模式:

(1)主动搜索(M-SEARCH)

控制点(如手机 App、PC 软件)向多播地址发送 M-SEARCH 请求,寻找特定类型的服务。

请求示例

M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 3
ST: urn:schemas-upnp-org:device:MediaServer:1

关键字段说明:

  • HOST:固定为 SSDP 多播地址和端口
  • MAN:必须为 "ssdp:discover",表示发现请求
  • MX:最大等待时间(秒),设备在此时间内随机延迟响应以避免拥塞
  • ST(Search Target):指定搜索目标,常见值包括:
    • ssdp:all:发现所有设备和服务
    • upnp:rootdevice:根设备
    • urn:schemas-upnp-org:device:InternetGatewayDevice:1:网关设备
    • 自定义设备/服务类型(如打印机、摄像头等)

(2)服务通告(NOTIFY)

设备主动广播自身状态变化:

  • 上线时:发送 NTS: ssdp:alive
  • 下线时:发送 NTS: ssdp:byebye

通告示例(设备上线)

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age=1800
LOCATION: http://192.168.1.100:8000/description.xml
NT: urn:schemas-upnp-org:device:MediaServer:1
NTS: ssdp:alive
USN: uuid:00112233-4455-6677-8899-aabbccddeeff::urn:schemas-upnp-org:device:MediaServer:1

关键字段说明:

  • LOCATION:指向设备描述文件(XML)的 URL,包含详细功能信息
  • NT(Notification Type):设备或服务类型
  • NTS(Notification Sub-type):ssdp:alivessdp:byebye
  • USN(Unique Service Name):唯一标识该服务实例
  • CACHE-CONTROL:缓存有效期(秒),过期后需重新发现

抓包示例

典型工作流程

  1. 设备启动 → 发送 NOTIFYssdp:alive)广播
  2. 控制点启动 → 发送 M-SEARCH 多播请求
  3. 匹配设备响应 → 单播回复 HTTP/1.1 200 OK,包含 LOCATION 等信息
  4. 控制点获取描述 → 通过 LOCATION 下载 XML 描述文件
  5. 后续交互 → 基于 SOAP 调用设备提供的服务(属于 UPnP 其他阶段)

调试与工具

  • Wireshark:过滤 udp.port == 1900 查看 SSDP 流量
  • 命令行测试(Linux/macOS):
    echo -e "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: ssdp:all\r\n\r\n" | nc -u 239.255.255.250 1900
  • Python 库async-upnp-clientfritzconnection

总结

SSDP 是实现“零配置网络发现”的关键技术,极大简化了局域网内设备互联的复杂度。然而,其无状态、无认证的设计也带来了显著的安全隐患。在享受便利的同时,务必注意关闭非必要服务,并加强网络安全防护。