UPnP Universal Plug and Play,中文是 “通用即插即用”茬理解 UPnP 之前,我们先了解一下传统的 PnP 技术因为 UPnP 是对于传统 PnP(即插即用)概念的扩展。
传统的 PnP “即插即用”是指 PC 电脑在添加硬件设备时可鉯自动处理的一种标准在 PnP 技术出现以前,当需要为 PC 电脑安装新的硬件(比如:声卡CD-ROM,打印机)时这些设备需要用到 PC 电脑的 DMA 和 IRQ 等资源,为了避免硬件设备对计算机这些资源使用上的冲突我们就需要手工为新添加的硬件设备设置中断和 I/O
端口(比如,想要为添加的声卡占鼡中断 5就找一个小跳线在卡上标着中断 5的针脚上一插)。这样的操作需要用户了解中断和 I/O 端口的知识并且能够自己分配中断地址而不發生冲突,对普通用户提出这样的要求是不切实际的
PnP “即插即用”技术出现以后,可以自动为新添加的硬件分配中断和 I/O 端口用户无须洅做手工跳线,也不必使用软件配置程序唯一的要求就是操作系统需要支持 PnP 标准,同时所安装的新硬件也符合 PnP 规范的
现在我们讲 UPnP,在網络世界里当一个主机加入网络时,其行为模式跟我们上述的添加和删除设备是类似的尤其是在私有网络和公网交互的时候,私有网絡中的主机使用的是内网 IP 地址是无法被外网的主机直接访问的。必须借助 NAT 网关设备(本地路由器)把内网地址映射到网关的公网地址上
网关的数据包都会被转发给内网的该主机,从而实现了内网中的主机与外部主机的通信
当内网中的主机想要被外界主机直接访问(比洳开放 80 端口,对外提供 HTTP 服务)我们就需要在 NAT 设备中为当前主机手工配置端口映射,如果内网中有多台主机都想要被外界主机直接访问的話我们必须在同一个 NAT 设备上为这些主机分别做端口映射,它们之间不能使用有冲突的端口这个过程需要用户手工一一配置,显然给用戶带来了很大的麻烦
UPnP 技术标准的出现就是为了解决这个问题,只要 NAT 设备(路由器)支持 UPnP并开启。那么当我们的主机(或主机上的应鼡程序)向 NAT 设备发出端口映射请求的时候,NAT 设备就可以自动为主机分配端口并进行端口映射这样,我们的主机就能够像公网主机一样被網络中任何主机访问了
UPnP 典型的应用场景就是家庭智能设备的互联,还有目前在网络应用比如 BitTorrent, eMule,IPFSEthereum 等使用 P2P 技术的软件,UPnP 功能为它们带来極大的便利比如:利用 UPnP 能自动的把它们侦听的端口号映射到公网地址上,这样公网上的用户也能对当前的 NAT 内网主机直接发起连接。
必須同时满足三个条件:
- NAT 网关设备必须支持 UPnP 功能;这是因为它需要扮演控制点(239.255.255.250:1900)的角色控制点提供的是 SSDP 服务。
- 操作系统必须支持 UPnP 功能;仳如 Windows 系列操作系统;
以上三个条件必须同时满足缺一不可。
注:大多数路由器都是支持 UPnP 的有的是默认开启,有的需要手工开启
UPnP 这么恏,那么我们应该立即开启吗
非也,如果我们的电脑并不需要 UPnP 所提供的功能比如,我们的电脑并不想要对外直接提供服务也不运行仩述 P2P 软件,那么我们就无需开启 UPnP因为一旦开启 UPnP,就意味着我们把自己的主机暴露在公网环境中任何主机都可以向我们的电脑发起连接,NAT 设备会对所有收到的数据包不进行任何 authentication
认证而转发给我们的主机这样,路由防火墙就会完全失效我们的主机就很容易受到恶意的网絡窥探,感染病毒或者恶意程序的几率也大大增加
注:上述 NAT 设备通常就是指我们本地的路由器。
介绍完了 UPnP 的概况为了完整性,现在再介绍一下 UPnP 规范下的 SSDP 协议SSDP 全称是 Simple Service Discover Protocol 简单服务发现协议,这个协议是 UPnP 的核心在 UPnP 中定义了一组协议框架,其中有控制点根设备等概念,UPnP 设备通过 SSDP 协议与根设备(用户设备)进行交互SSDP 是应用层协议,使用
SSDP 协议的请求消息有两种类型第一种是服务通知,设备和服务使用此类通知消息声明自己存在;第二种是查询请求协议客户端用此请求查询某种类型的设备和服务。
当一个客户端接入网络的时候它可以向一個特定的多播地址的 SSDP 端口使用 M-SEARCH
方法发送 “ssdp:discover” 消息。当设备监听到这个保留的多播地址上由控制点发送的消息的时候设备将通过单播的方式直接响应控制点的请求。
典型的设备查询请求消息格式:
响应消息应该包含服务的位置信息(Location 或AL头)ST和USN头。响应消息应该包含cache控制信息(max-age 或者 Expires头)
在设备加入网络时,它应当向一个特定的多播地址的 SSDP 端口使用 NOTIFY 方法发送 “ssdp:alive” 消息以便宣布自己的存在,更新期限信息哽新位置信息。
由于 UDP 协议是不可信的设备应该定期发送它的公告消息。在设备加入网络时它必须用 NOTIFY 方法发送一个多播传送请求。NOTIFY 方法發送的请求没有回应消息
典型的设备通知消息格式如下:
当一个设备计划从网络上卸载的时候,它也应当向一个特定的多播地址的 SSDP 端口使用 NOTIFY 方法发送 “ssdp:byebye” 消息但是,即使没有发送 “ssdp:byebye” 消息控制点也会根据 “ssdp:alive” 消息指定的超时值,将超时并且没有再次收到的 “ssdp:alive” 消息对應的设备认为是失效的设备
典型的设备卸载消息格式如下:
2、UPnP协议框架: