﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++乐园-随笔分类-UPNP技术学习</title><link>http://www.cppblog.com/killsound/category/5837.html</link><description>C/C++ 交流</description><language>zh-cn</language><lastBuildDate>Fri, 23 May 2008 17:22:59 GMT</lastBuildDate><pubDate>Fri, 23 May 2008 17:22:59 GMT</pubDate><ttl>60</ttl><item><title>UPnP协议简介</title><link>http://www.cppblog.com/killsound/archive/2007/12/19/39054.html</link><dc:creator>小不懂^_^</dc:creator><author>小不懂^_^</author><pubDate>Wed, 19 Dec 2007 08:47:00 GMT</pubDate><guid>http://www.cppblog.com/killsound/archive/2007/12/19/39054.html</guid><wfw:comment>http://www.cppblog.com/killsound/comments/39054.html</wfw:comment><comments>http://www.cppblog.com/killsound/archive/2007/12/19/39054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/killsound/comments/commentRss/39054.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/killsound/services/trackbacks/39054.html</trackback:ping><description><![CDATA[<p>UPnP协议<br>统一即插即用英文是Universal Plug and Play，缩写为UPnP。要说计算机外设的即插即用(Plug and Play（缩写PnP）)，大家可能很熟悉，但对统一即插即用，多数人会感到是一头雾水。由于windows xp加入对UPnP的支持，并且被查出存在很严重的安全问题，所以，一时间，使得UPnP名声大噪。巧的是，本人原来查阅过关于UPnP的技术白皮书，而且也较为详细地看了关于此次发现的安全缺陷的介绍。因此，趁着这个机会，将UPnP以及引起安全缺陷的详情披露出来。</p>
<p>一、 UPnP是用来干什么的？</p>
<p>网络发展到现在，已经可以使我们在网上冲浪、收发邮件、听到远方传送来的声音、搜索感兴趣的内容、下载软件、点播节目、即时聊天&#8230;&#8230;实现的功能好像已经不少，但，人的欲望无止境，享福人还想更享福，还有许多目标没有达到：例如，怎样才能使我们在网络上，像平时用遥控器那样，操作空调器、电风扇、厨房电器，或网络远端的电器设备呢？如何利用网络上的计算机资源，使这种&#8220;遥控&#8221;更具智能化？甚至，将一系列相关的控制写到一个脚本中，以便用户定制自己所喜爱的控制流程&#8230;&#8230;实现诸如此类的效果，将是有巨大需求的应用技术。如果实现通过网络用UPnP控制家用设备，将给我们的生活带来很大的方便和很多新的体验。例如：</p>
<p>1.你在下班之前，或在回去的路上，就可以先打开家里的空调器和厨房设备，等进入家门，立刻就是一个温度宜人的环境――厨房里的饭也做好了。房间温度的高低和厨房内煮饭的过程，都是根据事先设计好的&#8220;脚本&#8221;程序进行的，绝对可靠。</p>
<p>2.你若是一位上档次的音乐发烧者，肯定对聆听音乐的环境要求很严：音箱位置高低、音量大小、灯光明暗、窗帘拉不拉上都有讲究。手动控制随好，毕竟不方便。你要使用上UPnP，一切都会为你代劳。还能将你习惯的音响音量、灯光亮度、音箱的高度等等，以你认为最佳的参数写到执行脚本中，以后可以都以此为准。如果你拥有自己的专门听音室，只要你打开听音室的门，上述的环境就会立刻设置好。曲终人散，只管放心离开好了，UPnP系统会自己关闭音响，熄灭电灯，拉上窗帘。</p>
<p>3.你人在办公室，心里却放不下家里的孩子。用上UPnP，只要在家里安装摄像头，建立好与网络的连接。在办公室内，启用桌面电脑的WEBTV，连通网络后，可以即时监视孩子在家里的一举一动。</p>
<p>凡此种种的方便和诱人之处还很多，不胜枚举。</p>
<p>其实，这已经不是科学幻想、也不是专家预言。目前用UPnP协议就可以实现这些操作！这正是windows xp系统急于加入UPnP的原因。正因为UPnP是一个协议，UPnP的使用可跨越各种操作系统平台，开发应用程序也没有开发语言的局限。可工作于各种形式的网络结构。且仅以现在的网络设施为基础，仅仅加上这个UPnP协议，既不用添加新的设施，也不用重新架设网络介质就可以投入使用！</p>
<p>UPnP协议具有下述特色：</p>
<p>1. 以网络为应用环境，不考虑&#8220;孤岛&#8221;中的计算机。</p>
<p>2. 以TCP/IP和整个Internet为基础。这样是&#8220;中立&#8221;的，不依附于任何操作系统或应用程序，不使用特定的API函数，不受程序设计语言的局限。可以无缝地接入传统网络。</p>
<p>3. 设备可以动态地进入网络中，随后获得IP地址，&#8220;学习&#8221; 或查找自己应当进行的操作和服务的信息；&#8220;感知&#8221;别的设备是否存在以及它们的作用和当前的状态 。所有这些，都应当是可自动完成的。</p>
<p>4. 每个设备都可读取属于自己的、特定的状态和参数；完成控制操作后应当发出&#8220;操作完成&#8221;的响应信号。如果失败，则应发出控制失败的信号。</p>
<p>二、UPnP协议的层：</p>
<p>UPnP协议的最终目的，是建立一个可用的设备模型， 因篇幅这里不对整个结构进行详细的分析，但你应当记住下面的主要特征：</p>
<p>1. UPnP是一个多层协议构成的框架体系，每一层都以相邻的下层为基础，同时又是相邻上层的基础。直至达到应用层为止。该图中的最下面是就是IP和TCP，共两层，负责设备的IP地址。</p>
<p>2. 三层是HTTP、HTTPU、HTTPMU，这一层，大家应当是熟悉的，属于传送协议层。传送的是内容都经过&#8220;封装&#8221;后，存放在特定的XML文件中的。对应的SSDP、GENA、SOAP指的是保存在XML文件中的数据格式。到这一层，已经解决了UPnP设备的IP地址和传送信息问题。</p>
<p>3. 第四层是UPnP设备体系定义，仅仅是一个抽象的、公用的设备模型。任何UPnP设备都必须使用这一层。</p>
<p>4. 第五层是UPnP论坛的各个专业委员会的设备定义层，在这个论坛中，不同电器设备由不同的专业委员会定义，例如：电视委员会只负责定义网络电视设备部分，空调器委员会只负责定义网络空调设备部分&#8230;&#8230;依此类推。所有的不同类型的设备都被定义成一个专门的架构或者模板，供建立设备的时候使用。可以推知，进入这一层，设备已经被指定了明确用途。当然，这些都必须遵守标准化的规范。从目前看，UPnP已经可以支持大部分的设备：从电脑、电脑外设，移动设备和家用消费类电子设备等等，无所不包，随着这个体系的普及，将可能有更多的厂家承认这一标准，最终，可能演化为公认的行业标准。</p>
<p>5. 最上层，也就是应用层，由UPnP设备制造厂商定义的部分。这一层的信息是由设备制造厂商来&#8220;填充&#8221; 的，这部分一般有设备厂商提供的、对设备控制和操作的底层代码，然后，就是名称序列号呀，厂商信息之类的东西。</p>
<p>三、协议内部的详细情况</p>
<p>仅仅有这样五层UPnP协议，也只不过有了一个共同遵守的框架，实际的UPnP系统究竟是如何构成的呢？</p>
<p>完整的UPnP服务系统由支持UPnP的网络和符合UPnP规范的设备共同构成的。</p>
<p>整个系统是由设备、服务、和控制指针三部分所构成。</p>
<p>设备：</p>
<p>这里是指符合UPnP规范的设备。一个UPnP设备可以看成一个包含服务并嵌套了常规设备的&#8220;容器&#8221; 。例如，一个UPnP的VCR（录像机）设备可以包含磁带传送服务、调谐服务和时钟服务。就是说，UPnP之下的设备不能仅仅理解为硬件意义上的设备，而应当包括服务功能。</p>
<p>不同种类的UPnP设备将关联不同的设置、服务和嵌入设备。如打印机和VCR属于不同用途的设备，服务就不可能定义成一样的。</p>
<p>服务：</p>
<p>设备执行用户请求的控制过程，可划分成一个个很小的阶段或单位，每个单位就称为一个服务。每一个服务，对外都表现为具体的行为和模式，而行为和模式又可以用状态和变量值进行描述。只要可以用数值描述，在计算机里面就容易处理了。例如，模仿一个时钟，它只有一个工作模式：这个模式就是模拟并显示当前的时间。而一个时钟的行为共有两种（也只有两种）：</p>
<p>1. 设置时间（用来&#8220;即平时说的对表&#8221;）.</p>
<p>2. 得到时间（用于显示时间）。</p>
<p>其它设备服务，也是用这样思路来描述和定义的，一个设备也可以被定义多个服务。不论是设备的定义信息和服务的描述信息，都保存在一个XML文件中，这个文件也是UPnP协议构成的一部分。当设备建立和使用服务的时候，XML文件可以与它们进行关联。</p>
<p>XML文件中还有一个很关键的&#8220;状态表&#8221;，状态表可进一步分为&#8220;服务状态表&#8221;和&#8220;事件状态表&#8221;。整个UPnP设备运行的全过程内，状态表贯穿始终，当设备状态改变的时候，例如发生参数变化或状态刷新的时候，立即就在&#8220;状态表&#8221;中反映出来。如控制服务器在接收到设置时间的行为请求时，就立即执行请求（对时操作），并给出响应，同时更新状态表中的有关数据。相应地，事件服务器负责向对此事件感兴趣的设备公布所发生的状态改变。例如，一个火灾事件发生后，事件服务器就向火灾报警器发布这个事件，导致报警器动作产生报警信号。</p>
<p>控制指针：</p>
<p>在UPnP网络中，用户请求设备执行的控制是通过控制指针实现的，控制指针首先是一个有能力控制别的设备的控制者，还要具有在网络中 &#8220;发现&#8221;控制目标的能力。在发现（控制目标）之后，控制指针应当：</p>
<p>①取得设备的描述信息并得到所关联的服务列表。</p>
<p>②取得相关服务的描述。</p>
<p>③调用控制服务行为。</p>
<p>④确定服务的事件 &#8220;源&#8221;，不论何时，只要服务状态发生改变，事件服务器会立即向控制指针发送一个事件信息。</p>
<p>从上面说到的各种信息，都保存在XML文件中，不同用途的信息，格式不同。保证可以各取所需，不会混淆。</p>
<p>那么，UPnP的完整工作过程是怎样的呢？</p>
<p>UPnP在控制指针和被控制设备之间提供通讯功能。而网络介质、TCP/IP协议、HTTP仅提供基本的连接和IP地址分配。整个工作过程需要处理六个方面的内容，即地址分配、发现设备、对设备的描述、设备控制、设备事件、设备表达。</p>
<p>地址问题：</p>
<p>地址是整个UPnP系统工作的基础条件，每个设备都应当是DHCP（Dynamic Host Configuration Protocol 动态主机配置协议）的客户。当设备首次与网络建立连接后，利用DHCP服务，使设备得到一个IP地址。这个IP地址可以是DHCP系统指定的，也可以是由设备选择的，当然，有能力自己选择IP地址的设备，必然是那些&#8220;聪明&#8221;的设备才行！这也就是所谓的&#8220;自动&#8221;IP地址。</p>
<p>如果遇到本地DHCP管理范围之外的IP地址请求，还需要解决&#8220;友好设备&#8221;</p>
<p>的地址分配问题，这个问题通常由域名服务器来解决。</p>
<p>发现设备：</p>
<p>可分成两种情况，一种是在有控制请求之后，在当前的网络中查找有无对应的可用设备；另一种情况是某一设备接入网络、取得IP地址之后，就开始向网络&#8220;广播&#8221;自己已经进入网络，即寻找控制请求。</p>
<p>设备的描述：</p>
<p>简单说，这是声明&#8220;自己&#8221;是什么样的设备，例如名称、制造厂商、序列号码等等。刚开始&#8220;发现&#8221;设备后，控制指针对这个设备的&#8220;了解&#8221;还很少，需要依据ULR找到该设备的描述文件，从这些文件中读取更多的描述信息。描述信息的范围很广，一般都是由设备的制造厂商提供的。主要的描述项目有：控制的模式名称和模式号码、设备序列号、制造厂商名称、厂商的WEB的ULR等等。这些一般都存放在特定的XML文件中；</p>
<p>设备控制：</p>
<p>控制指针找到设备描述之后，会从描述中&#8220;提炼&#8221;出要进行的操作并获悉所有的服务；对每个UPnP设备来说，这些描述必须是很确切、很详细的，描述中可能包含有命令或行为列表、服务响应信息、用到的参数等等。对于服务的每个行为，也伴有描述信息：主要是整个服务进行期间的变量、变量的数据类型、可用的取值范围和事件的特征。</p>
<p>要控制某个设备，控制指针必须先发送一个控制行为请求，要求设备开始服务，然后再按设备的ULR发送相应的控制消息，控制消息就是放置在XML文件中的那些SOAP格式的信息。最后，服务会返回响应信息，指出服务是成功或是失败。</p>
<p>设备事件：</p>
<p>在服务进行的整个时间内，只要变量值发生了变化或者模式的状态发生了改变，就产生了一个事件，系统将修改上述提到的事件列表的内容。随之，事件服务器把事件向整个网络进行广播。另一方面，控制指针也可以事先向事件服务器预约事件信息，保证将该控制指针感兴趣的事件及时准确地传送过来。</p>
<p>广播或预约事件，传送的都是事件消息，事件消息也放在XML文件中，使用的格式是GENA。</p>
<p>设备投入工作之前的准备―――初始化过程，也是一个事件，初始化需要的各种信息也是用事件消息传送的。包括的内容主要是：变量初始值，模式的初始状态等等。</p>
<p>设备表达：</p>
<p>只要得到了设备的ULR，就可以取得该设备表达页面的ULR，然后可以将此表达纳入用户的本地浏览器上。这部分还包括与用户对话的界面，以及与用户进行会话的处理。</p>
<p>整个UPnP系统，是在&#8220;中枢神经&#8221;的指挥下协同工作的。其大致情形如下：</p>
<p>凡是具备IP地址的的设备都必须直接使用网络的IP地址，但有些设备可能并不具备直接使用网络IP地址的能力，例如，电灯开关的控制就是这样，这是非IP设备；非IP设备通过网桥（UPnP Bridge）来与控制指针交换信息。</p>
<p>直接使用IP地址的有：控制指针（可在口袋电脑和远程设备上发出控制）、本地设备，例如VCR和时钟；以及网桥。非IP设备有所谓轻设备（如温度控制器）和非UPnP的设备（如电灯控制开关等）。</p>
<p>上述介绍属于硬件方面，下面再说作为控制灵魂的软件：</p>
<p>在上面的叙述中，多次提到用XML文件存放需要的信息，因为无论是控制指针或设备服务，都需要很多信息，有读出的，有传出的，UPnP协议约定这些都存放在特定的文件XML中。用途不同的信息，在XML文件中的格式不同。所以，相关的XML文件是控制服务的灵魂。</p>
<p>四、关于UPnP隐藏的安全缺缺陷：</p>
<p>这次发现的安全缺陷共有两个，其中第一个缺陷是对缓冲区（Buffer）的使用没有进行检查和限制。外部的攻击者，可以通过这里取得整个系统的控制特权！由于UPnp功能必须使用计算机的端口来进行工作，取得控制权的攻击者，还有可能利用这些端口，达到攻击者的目的。这个缺陷导致的后果很严重，不论那个版本的windows 系统，只要运行UPnP，就都存在这个危险！但严格地说，这并不完全是UPnP技术本身的问题，更多的是程序设计的疏忽。</p>
<p>第二个缺陷就与UPnP的工作机理有关系了！</p>
<p>该缺陷存在于UPnP工作时的&#8220;设备发现&#8221;阶段。发现设备可以分为两种情况：如果某个具备UPnP功能的计算机引导成功并连接到网络上，就会立刻向网络发出&#8220;广播&#8221;，向网络上的UPnP设备通知自己已经准备就绪，在程序设计这一级别上看，该广播内容就是一个M-SEARCH（消息）指示。该广播将被&#8220;声音所及&#8221;范围之内的所有设备所&#8220;听到&#8221;。并向该计算机反馈自己的有关信息，以备随后进行控制之用。</p>
<p>相类似，如果某个设备刚刚连接到网络上，也会向网络发出&#8220;通知&#8221;，表示自己准备就绪，可以接受来自网络的控制，在程序设计这一级别上看，该通知就是一个NOTIFY（消息）指示。也将被&#8220;声音所及&#8221;范围之内的所有计算机接受。计算机将 &#8220;感知&#8221;该设备已经向自己&#8220;报到&#8221;。实际上，NOTIFY（消息）指示也不是单单发送给计算机听的，别的网络设备也可以听到。</p>
<p>就是在上述的一播一听之间，出现了问题！</p>
<p>如果某个黑客向某个用户系统发送一个NOTIFY（消息）指示，该用户系统就会收到这个NOTIFY（消息）指示并在其指示下，连接到一个特定服务器上，接着向相应的服务器请求下载服务―――下载将要执行的服务内容。服务器当然会响应这个请求。UPnP服务系统将解释这个设备的描述部分，请求发送更多的文件，服务器又需要响应这些请求。这样，就构成一个&#8220;请求――响应&#8221;的循环，大量占用系统资源，造成UPnP系统服务速度变慢甚至停止。所以，这个缺陷将导致&#8220;拒绝服务&#8221;攻击称为可能！</p>
<p>结束语</p>
<p>UpnP正在向我们一步步走近，现在已经是足声可闻了。不久的将来，必然对我们的工作和生活产生巨大影响。也蕴含着无限商机。尽管现在存在问题，也难保以后就不会再出现新的问题，但这既然体现了人的需求意向，就会有巨大的生命力，暂时的挫折不会使得它停下前进的脚步！&nbsp; <br></p>
<img src ="http://www.cppblog.com/killsound/aggbug/39054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/killsound/" target="_blank">小不懂^_^</a> 2007-12-19 16:47 <a href="http://www.cppblog.com/killsound/archive/2007/12/19/39054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>