精华内容
下载资源
问答
  • 本文为你讲解如何使用UPnP协议实现网络设备自动配置路由器进行端口映射
  • upnp 端口映射

    万次阅读 2018-07-10 15:34:25
    简介 处于内网的机器,因为没有一个公有的Ip,外面是无法主动连接到内网的设备。...UPNP端口映射将一个外部端口映射到一个【内网Ip:端口】,当然也指明了使用的协议是UDP,TCP,还是此映射同时适应UDPTCP。 UPN...

    简介

    处于内网的机器,因为没有一个公有的Ip,外面是无法主动连接到内网的设备。如果希望外面可以连接到处于内网的指定设备。UPNP端口映射是一个较简易的方案。当然这并不是唯一方案,穿透和转发也是一个较普遍的方式,本文只讨论UPNP端口映射的实现方式。UPNP端口映射将一个外部端口映射到一个【内网Ip:端口】,当然也指明了使用的协议是UDP,TCP,还是此映射同时适应UDP和TCP。

     

    UPNP使用的常用命令:

         "GetStatusInfo",
         "GetExternalIPAddress",
         "AddPortMapping",
         "GetSpecificPortMappingEntry",

     

    1. 建立UDP socket,并绑定到一个自定的端口

    2、通过UDP发送组播包:M-search,端口1900,包的内容如下所示

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

    3、接收M-search的回应,并做相应的处理

    HTTP/1.1 200 OK
    CACHE-CONTROL: max-age=100
    DATE: Thu, 01 Jan 1970 21:39:02 GMT
    EXT:
    LOCATION: http://192.168.1.1:1900/igd.xml
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
    USN: uuid:6ec73f58-1dd2-11b2-9465-e6838914e4d9::urn:schemas-upnp-org:device:InternetGatewayDevice:1

    1》获取path(lacation) ,此为 : /igd.xml                                        #path#

         端口为: 1900 (有些路由并不一定是UPNP的端口1900)          #ServerPort#

         ip:192.168.1.1 (有时候我们的内网中可能存在多个路由,并且都开启了upnp服务,这时候我们要判断哪一个才是网关路由,并且只处理网关路由的回应)

    2》获取ST,此为:urn:schemas-upnp-org:device:InternetGatewayDevice:1       #ST#

    4、建立tcp连接,--》【网关:ServerPort】

    注意:有些路由不支持keep-alive特性,做每一次交互都做一次连接

    5、获取path位置的xml数据:

    GET /igd.xml HTTP/1.1
    Host: 192.168.1.1:1900
    Connection: Close
    User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6

    6、接收并分析得到的xml数据

    HTTP/1.1 200 OK
    CONTENT-LENGTH: 2733
    CONTENT-TYPE: text/xml
    DATE: Thu, 01 Jan 1970 21:39:02 GMT
    LAST-MODIFIED: Tue, 28 Oct 2003 08:46:08 GMT
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    CONNECTION: close

    <?xml version="1.0"?>
    <root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
    <major>1</major>
    <minor>0</minor>
    </specVersion>
    <URLBase></URLBase>
    <device>
    <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType>
    <presentationURL>http://192.168.1.1:80       </presentationURL>
    <friendlyName            >Mercury Router MR804</friendlyName>
    <manufacturer                         >Mercury</manufacturer>
    <manufacturerURL    >http://www.mercurycom.com.cn</manufacturerURL>
    <modelDescription                       >MR804 8.0</modelDescription>
    <modelName                           >MR804</modelName>
    <modelNumber                             >8.0</modelNumber>
    <UDN>uuid:6ec73f58-1dd2-11b2-9465-e6838914e4d9</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:L3Forwarding1</serviceId>
    <controlURL>/l3f</controlURL>
    <eventSubURL>/l3f</eventSubURL>
    <SCPDURL>/l3f.xml</SCPDURL>
    </service>
    </serviceList>
    <deviceList>
    <device>
    <deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType>
    <friendlyName>WAN Device</friendlyName>
    <manufacturer                         >Mercury</manufacturer>
    <manufacturerURL    >http://www.mercurycom.com.cn</manufacturerURL>
    <modelDescription>WAN Device</modelDescription>
    <modelName>WAN Device</modelName>
    <modelNumber>1</modelNumber>
    <modelURL></modelURL>
    <serialNumber>12345678900001</serialNumber>
    <UDN>uuid:80104052-1dd2-11b2-a699-e6838914e4d9</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:WANCommonInterfaceConfig</serviceId>
    <controlURL>/ifc</controlURL>
    <eventSubURL>/ifc</eventSubURL>
    <SCPDURL>/ifc.xml</SCPDURL>
    </service>
    </serviceList>
    <deviceList>
    <device>
    <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType>
    <friendlyName>WAN Connection Device</friendlyName>
    <manufacturer                         >Mercury</manufacturer>
    <manufacturerURL    >http://www.mercurycom.com.cn</manufacturerURL>
    <modelDescription>WAN Connection Device</modelDescription>
    <modelName>WAN Connection Device</modelName>
    <modelNumber>1</modelNumber>
    <modelURL></modelURL>
    <serialNumber>12345678900001</serialNumber>
    <UDN>uuid:8c99e7b0-1dd2-11b2-8291-e6838914e4d9</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:WANIPConnection</serviceId>
    <controlURL>/ipc</controlURL>
    <eventSubURL>/ipc</eventSubURL>
    <SCPDURL>/ipc.xml</SCPDURL>
    </service>
    </serviceList>
    </device>
    </deviceList>
    </device>
    </deviceList>
    </device>
    </root>

    获取端口映射服务<serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>

    的控制路径<controlURL>:/ipc               #ControlUrl#

    7、发送获取外网IP的命令请求:GetExternalIPAddress

    POST /ipc HTTP/1.1
    Host: 192.168.1.1:1900
    User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
    Content-Length: 285
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache

    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body></s:Envelope>

    8、分析接收数据

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    CONTENT-LENGTH: 404
    CONTENT-TYPE: text/xml; charset="utf-8"

    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewExternalIPAddress>113.119.126.148</NewExternalIPAddress></u:GetExternalIPAddressResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

     

    解析得到NewExternalIPAddress标签中的外网ip:113.119.126.148

    9、发送命令获取指定的外部端口的详细信息{内部端口,ip,协议,外部端口,。。。}

    使用命令GetSpecificPortMappingEntry,并在NewExternalPort指定要查询的外部端口

    POST /ipc HTTP/1.1
    Host: 192.168.1.1:1900
    User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
    Content-Length: 399
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetSpecificPortMappingEntry"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache

    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetSpecificPortMappingEntry xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>5500</NewExternalPort><NewProtocol>TCP</NewProtocol></u:GetSpecificPortMappingEntry></s:Body></s:Envelope>

    10、接收数据并并分析指定的端口有没有被映射

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    CONTENT-LENGTH: 574
    CONTENT-TYPE: text/xml; charset="utf-8"

    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:GetSpecificPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewInternalPort>80</NewInternalPort><NewInternalClient>192.168.1.83</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>JUAN UPNP</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:GetSpecificPortMappingEntryResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    如上所示:外部端口5500已经做了映射,映射到{192.168.1.83:80,TCP}

    1.1》映射到期望的客户端

    1.2》没有映射到期望的客户端,如映射到别的ip

    2》未映射,会返回500错误:HTTP/1.0 500 Internal Server Error

    HTTP/1.1 500 Internal Server Error
    CONTENT-LENGTH: 481
    CONTENT-TYPE: text/xml; charset="utf-8"
    DATE: Thu, 01 Jan 1970 00:00:02 GMT
    EXT:
    SERVER: Mercury Router MR804 Router, UPnP/1.0

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
    <faultcode>SOAP-ENV:Client</faultcode>
    <faultstring>UPnPError</faultstring>
    <detail>
    <UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
    <errorCode>402</errorCode>
    <errorDescription>Invalid ExternalPort</errorDescription>
    </UPnPError>
    </detail>
    </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    如果已经做了期望的映射,则进入等待下一轮的更新

    否则做端口映射

    11、发送命令添加端口映射:

    POST /ipc HTTP/1.1
    Host: 192.168.1.1:1900
    User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
    Content-Length: 589
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache

    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>5500</NewExternalPort><NewProtocol>TCP</NewProtocol><NewInternalPort>80</NewInternalPort><NewInternalClient>192.168.1.83</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>JUAN UPNP</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:AddPortMapping></s:Body></s:Envelope>

    12、接收并分析是否映射成功:

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    CONTENT-LENGTH: 332
    CONTENT-TYPE: text/xml; charset="utf-8"

    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:AddPortMappingResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:AddPortMappingResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    返回HTTP/1.1 200 OK,可见操作成功,进入等待下一轮的更新

    展开全文
  • 使用UPnP协议不需要设备驱动程序,因此使用UPnP建立的网络是介质无关的,它可以运行在几乎所有的操作系统平台之上,可以使用任何开发语言,使得在办公室、家庭其他公共场所方便地构建设备相互联通的网络环境。UPnP...

    UPnP是通用即插即用(Universal Plug and

    Play)的缩写,它主要用于实现设备的智能互联互通。使用UPnP协议不需要设备驱动程序,因此使用UPnP建立的网络是介质无关的,它可以运行在几乎

    所有的操作系统平台之上,可以使用任何开发语言,使得在办公室、家庭和其他公共场所方便地构建设备相互联通的网络环境。UPnP实际上是扩展了传统单机的设备和计算机系统的概念,在"零配置"的前提下提供了连网设备之间的发现、接口声明和其他信息的交换等互动操作功能。

    从UPnP的定义来看,它的功能不仅仅是能够实现端口映射。但是实现端口映射是它的一项重要的功能,也是我们最常利用的功能。端口映射,可以理解为就是网络地址的转换,即NAT,那么UPnP是如何实现这种转换的呢?

    要实现UPnP,首先要操作系统支持这种协议,不过现在的操作系统,WinXP, Win2K, Vista都支持这个功能,不过系统默认不安装,需要手动安装。其次,路由器要支持UPnP协议,不过,现在的主流路由器都支持这个功能。最后,在程序中实现UPnP。下面的过程是程序利用UPnP协议实现端口映射:

    1. 寻找UPnP设备

    首先通过广播的形式发送UDP数据报,如果收到了应答消息,根据应答消息可以得到UPnP设备的端口和地址。

    这里面的广播数据格式有严格的规定,可以查询相关的资料。成功的找到UPnP设备,会收到类似

    HTTP/1.1 200 OK 的消息响应。

    2. 根据第一步获得的路由器的IP和端口,和路由器建立Socket连接,获取路由器的控制URL.

    3. 根据第二步的控制URL, 向路由器发送添加端口映射的控制信息。

    4. 如果第3步添加成功,则可以向路由器发送查询映射项的信息。

    5. 当程序退出的时候,需要发送删除端口映射的控制信息,删除端口映射。

    参考资料:

    http://www.ibm.com/developerworks/cn/linux/other/UPnP/part1/index.html

    http://www.ibm.com/developerworks/cn/linux/other/UPnP/part2/index.html

    http://blog.bc-cn.net/user22/155472/archives/2007/7520.shtml

    阅读(1158) | 评论(0) | 转发(0) |

    展开全文
  • UPNP端口映射

    2012-02-15 22:27:26
    1、对于一台内网电脑,UPnP功能可以使网关或路由器的NAT模块做自动端口映射,将你程序所监听的端口从网关或路由器映射到内网电脑上。 2、网关或路由器的网络防火墙模块开始对Internet上其他电脑开放这个端口。 3、...
  • 需要做端口映射的一定很想下载这个软件把,自己找了好久才下载到的,有需要的可以下载,绝对可以用,本人自己就用过,所以大家分享
  • 从接到任务,到实现了 UPnP 在家用路由器上进行端口映射的时间总共花费了 1个半月,下面大概讲讲从资料搜集到设计实现的经过,好给有同样需求的人一些线索(不论及具体实现代码)。 所谓 UPnP ,就是“通用的即插即...

    自己动手实现UPnP进行端口映射的经过

        从接到任务,到实现了 UPnP 在家用路由器上进行端口映射的时间总共花费了 1个半月,下面大概讲讲从资料搜集到设计实现的经过,好给有同样需求的人一些线索(不论及具体实现和代码)。
        所谓 UPnP ,就是“通用的即插即用” ,注意是通用的,虽然很容易和 Windows 的即插即用混淆,但这肯定不是微软的专利!现在大部分的路由器都支持这个功能,只是默认情况下没有打开而已(基于安全考虑)。请管理员手动打开这个支持选项。

        这是用来干什么用的?如果我们要写 P2P 软件,那就用的着了,电骡不是有所谓的 LowID 和 highID 吗? 为了提高自己的共享能力(我为别人共享,别人也为我共享),我们(软件)要使用公网 IP 地址监听和建立连接,但是我们(软件)不是路由器,如何监听? 只好请路由器帮我们做一个端口映射,然后我们(软件)在内网监听,效果跟在公网上监听一样,也就是所谓 电骡的 HighID 了。 现在越来越多的用户都是内网用户的上网形式(NAT),如网吧。能够把自己的 LowID 提升为 HighID ,那么肯定会有更多的备选数据源啊,这样下载就被加速了!
    不说那么多废话了,如何开始?所有资料都是在http://upnp.org/ 上,着重看 《Internet Gateway Device (IGD) V 1.0》文档就行,其他都不是我们所关注的。这些文档的打包里,实际上对我真正有用的是一个叫做 《UPnP_IGD_WANIPConnection 1.0.pdf》 的文档,其它的内容实在太多了,我偷懒都没看。不过就算这篇文档也不用急着看,先下载保存好,以后会用的到的。
    后续的开发需要对报文抓包分析的,建议对自己用的顺手的网络报文分析工具先熟悉一下,我用的是 wireShark (前身是 Ethereal ),这个很重要。
    碰巧是,我得知,原来微软有那么一个 COM 组件是支持 UPnP 功能的,当时一个想法就是想直接用微软的那个 API 实现了功能就是。上网搜,打开 MSDN 搜,终于给我发现,原来 Platform 2003 SDK 里面有个例子,是专门用来执行 upnp 功能的,虽然不是直接用来做 端口映射的,但已经非常具备参考意义了。 下面那个就是我安装 Paltform 2003 后的 Sample 目录:  "D:/ProgramFiles/PaltformSDK/Samples/netds/upnp/GenericUCP" 请调整好您的 VC6 ,加载这个工程吧。
        既然编译好了这个工程,那就要找一个试验的环境了,我在网络里加了一个家庭网关(小型路由器),并打开了它的 uPnP 功能,使用该工具体验了一下如何找到一个 uPnP 设备(及指定service),并获取它的状态参数,向它发出 action 指令! 这时候,之前让下载的 .pdf 文档终于排上用场了。打开他,发现他里面有一些参数(STATE VARIABLES)可以 Get 、 也有某些 action 可以执行(当然要带上指定参数),那篇 pdf 文档里面都说的非常清楚。不说那么多,先执行最简单的 action | (GetExternalIPAddress),参数全为空就行了。
    经过测试,抛开STATE VARIABLES 不用(因为要向网关注册我所监听的 event 地址的,而 action 则不用),只用 action 实现了自动端口映射,要用到的 action 有如下列几个(参数不列出了,可以查文档得知):
     ● GetExternalIPAddress
     ● GetGenericPortMappingEntry
     ● AddPortMapping
     ● DeletePortMapping

        好了,这几个足已。这就是 uPnP 模块的雏形了,不过这还不能直接拿来用的。把里面能抄的东西都搬到自己的终端软件当中,果然在简单组网的环境里还非常好用,不过,拿到广州电信研究院进行复杂组网测试的时候,灾难发生了,网络里竟然有超过一个小型网关!最后,软件竟然在别人的小型网关里建立端口映射! 完蛋了,怎么会这样呢? 抓包分析,错误定位,这样一步一步下来,也终于搞清楚了 uPnP 的整个交互流程,也萌生了自己实现 uPnP 功能模块的念头,实际上就是特定格式的 xml 交互嘛(http方式)。进行了完备的抓包分析之后,搞清楚所执行的 action 的特定 xml 命令的格式。我重新开始了编程,一个星期后重写模块完毕,抛弃了微软那套操作 uPnP 的 API 以及烦人的头文件包含,并且也不用担心 Win2000 下不支持该 COM 组件了。
    下面简单讲讲整个 uPnP 的交互流程,如果有兴趣的就姑且作为一个开发过程的线索吧,具体报文内容请自行抓包GenericUCP 例程和家庭网关的交互则一目了然 :

      ① 一开始,程序随便绑定一个 UDP 端口,向组播地址 "239.255.255.250:1900" 发送探测报文(查找的设备类型是WANConnectionDevice:1 ), 并在超时时间内 recvfrom( ) 等待回应报文。如果网络上的设备有满足搜索条件的,都会直接回应 UDP 报文到该 socket 处。
      // -----------------  UDP 交互结束  -----------------------

      ② 如果回应报文是正确的,那么从中应该可以看到对端 uPnP 设备监听的 Location 了, 一个 http 地址,向这个 http 地址发出 TCP 的 http GET 请求,得到一个 xml 说明页 (可直接用 Iexplore.exe 打开来看),在里面确认到有没有 "WANConnectionDevice:1" 这个子设备,其下应该会有 "WANIPConnection:1" 的这个 service,把其中的 <controlURL> 取出来就行了。

      ③ 在取得 <controlURL> 以后,要做的事情就是向这个 http 地址发送 POST 请求,带上相应 action 的控制命令 xml 就行了,具体可以用GenericUCP 做一遍,然后抓包后原样照抄并做一些参数替换即可。

      - ④ – 可选的,如果想从 uPnP 设备那里获得一些参数变化的通告(比方有第三者新增或者删掉了某端口映射,引起 "PortMappingNumberOfEntries" 参数的变化),可以向(从 Location 处 GET 回来的说明页中的) <eventSubURL> 发出注册请求,说明自己正在监听的 http 地址,这样的话最新参数变化后 uPnP 设备都会主动发到这个地址来,不过别忘了在程序退出前取消掉注册哦。(为了减少代码量,我没做这方面的支持)。 

    展开全文
  • 文章开始之前让我们设想下面的几个情形:我们在办公室内就能访问到生产车间的网络摄像机,而无需到监控室查看生产情况;...端口映射就是路由器将外网某一个端口与内网中某个设备的IP地址和端口号建立起一一对应关
    

    文章开始之前让我们设想下面的几个情形:我们在办公室内就能访问到生产车间的网络摄像机,而无需到监控室查看生产情况;在下班之前,或在回去的路上,就可以先打开家里的空调器和厨房设备,等进入家门,立刻就是一个温度宜人的环境――厨房里的饭也做好了;我们想在电视机上回味一下几天前在景区拍的照片,把相机或者DV联网就可以了,无需再去拷贝。工作生活都如此方便,将是一个很惬意的事情。

    实现这些场景的网络设备都要基于一种叫端口映射的网络技术。端口映射就是路由器将外网某一个端口与内网中某个设备的IP地址和端口号建立起一一对应关系。内网主动访问外网时,路由器主动建立了映射关系,内外网间就可以通信。但是外网要主动访问内网是不可行的,因为不知道内网的设备IP和端口,只能和路由器外网通信。路由器可以进行手动配置端口映射,但是便携式设备经常移动,内网的IP地址也是不是固定的,每次使用都要手动配置路由器显然是个麻烦的事情。本文就为你讲解如何使用UPnP协议实现网络设备自动配置路由器进行端口映射。

    一、UPnP协议简介

    UPnPUniversal Plug and Play,即插即用)是各种各样的智能设备、无线设备和个人电脑等实现遍布全球的对等网络连接(P2P)的结构。使用UPnP达到的效果是任何设备一旦连接上网络,所有在网络上的设备马上就能知道有新设备加入,这些设备彼此之间能互相通信,更能直接使用或者控制它,一切都不需要人工设置。

    1.1 UPnP结构

    服务、设备和控制点是UPnP网络的基本组件,如图1

     图片2

    1 UPnP组件图

    • 设备(Device):家电、手机、智能设备、无线设备、电脑等等都可以称之为设备。
    • 服务(Service):是指设备在不同情况下的动作和设备的状态。
    • 控制点(Control Point):指的是可以发现并控制其他设备的控制设备。在UPnP网络中,设备可以和控制点合并为同一台设备。

       

      1.2  UPnP工作流程

    UPnP定义了设备之间、设备和控制点、控制点之间通信的协议。完整的UPnP有设备寻址、设备发现、设备描述、设备控制、事件通知和基于HTML的描述等几部分构成。UPnP协议最底层是TCP/IP协议,UPnP实现的工作流程如图2所示:

    图片1

    2 UPnP实现的工作流程

    寻址:就是找个可用IP地址。一般都采用DHCP服务,使设备自动得到一个IP地址。

    发现:加入到网络中,设备会定期的以组播的方式表明自身的存在以及告知(Advertise)它提供的服务;控制点则是网络中广播search packets来发现具有某些服务的设备,具有该服务的设备以单播的方式应答。

    描述:控制点可以从发现消息中得到设备描述的URL(可以认为是浏览器地址),通过URL取回设备描述的信息。

    控制、事件和展示则是控制点获取描述之后进行的各种通信交互。其中控制是控制点对设备进行的操作;事件为设备向控制点定期发送其感兴趣的信息,展示可以认为是设备的一个功能,它给控制点一个URL,可以登录到设备的网页服务器。

    二、UPnP路由器端口映射控制点在W5500实现

    2.1 实验硬件平台和实验目的

    通过以上讲解,相信大家对UPnP也有一定认识了,下面就让我们开始我们实验之旅。我们选用的实验平台为WIZnet W5500EVB,它使用USB口进行供电和调试,单片机为STM32F103RCT6,网络芯片为WIZnet硬件TCP/IP的以太网芯片W5500

    我们的实验目的就是让W5500Control Point)控制路由器(Device)执行端口映射服务(Service),让外网中的PC2可以与内网中的W5500EVB板建立连接。如图3所示 PC2往路由器36.36.141.53:12222 发送的信息,将被转发到内网192.168.1.110:5000

    图片3

    3端口映射网络图

    2.2  UPnP自动端口映射软件实现流程

    本文中W5500将作为控制点的角色出现,并不需要实现展示的功能,在UPnP协议上仅实现了Search的过程,对网络中的Advertise消息不做处理。下面让我看看程序是如何实现的,首先看一下整个程序流程图如图4,对整个程序有个大致的了解:

     图片4

    4 主程序流程图

    如图所示:

    程序首先进行初始化,初始化CPU资源和W5500然后使用DHCP协议自动获取IP,如果获取失败就设定为固定IPDHCP的过程在此不再详细介绍。

    获取IP地址后,先使用SSDP发现设备。W5500打开本地一个socket,再使用UDP组播地址(255.255.255.255)发送SSDP M-SEARCH信息搜索在相同子网中的IGDInternet Gateway Device),设备收到SSDP M-SEARCH信息后会回复数据包。如图5 所示:

    图片5

    5发送SSDP广播包和收到回复信息

    通过解析收到数据包我们可以得到:LOCATION:设备描述文件的URL。通过Location信息,我们能够获得IGDIP地址和端口号。利用这个IP地址和端口号生成HTTP GET HeaderW5500重新打开一个Socket,然后再将其发送给IGD来获取IGD的服务描述。当IGD接收到HTTP GET Header后,IGD将会让W5500_Control_Piont获知它的设备描述和服务描述。发送的数据包如图6

    6还显示了设备回复的部分信息,从中我们可以看到设备描述和服务描述,WANIPConnection对应端口映射服务,可以看到该路由设备有该项服务。在WANIPConnection服务描述中可以得到Control URLeventSubURL,一个用来控制,一个用来订阅。

     图片6

    6发送获取描述单播包和收到的回复信息

    执行完上面的发现设备后在串口上为用户提供了一个菜单页面,通过在菜单中输入命令,我们可以交互添加端口和删除端口。

    首先是添加端口,利用IGDIP地址、端口号以及控制URL来完成XML,然后通过HTTP POST method-basedSOAP执行AddPortMapping操作。其执行过程如图7流程图所示:

    图片7

    7 AddPortProcess()函数流程图

    SOAP描述中可以看到ExternalPortProtocolInternalPort以及控制点IP地址等信息,如图8 AddPort的报文所示。

    IGD在收到这样的控制请求后,会给出一系列应答,如果应答中包含收到“<UDN>uuidAddPort Success!!”后,表明端口映射添加成功。添加端口映射成功后,就可以在外网访问内网中指定IP地址和端口了,如果添加了TCP端口映射,可以建立连接并发送数据测试。

     图片8

     

    8 AddPort的报文

    删除端口与添加端口格式一样,都是通过HTTP POST method-basedSOAP执行DeletePortMapping操作,只需要ExternalPortProtocol两个参数即可。在此不再详细叙述,请参考我们的程序代码下载链接:http://pan.baidu.com/s/1roc70

    自动端口映射功能测试

    程序讲解完毕后将讲解如何测试我们写的W5500EVB程序,看是不是能够达到我们的实现目的,实现控制路由器端口映射功能。

    第一步:开启路由器UPnP。登陆路由器控制界面,打开“转发规则->UPnP 设置”,如果UPnP状态没有开启,则需要开启一下。

    第二步:将编译好的可执行文件下载到开发板中,接网线到路由器上,接USB调试线到PC端,打开串口助手对应的COM口以便查看调试信息和进入串口命令菜单。按复位键,程序开始执行,经过串口打印信息,我们看到DHCP获取正确IP地址,发现UPnP设备、获得描述,设置事件都已完成,如图9所示:

     图片9

    9 UPnP执行成功打印输出

    接下来就是我们的串口操作菜单,如图10

    图片10

    10 程序完成初始化后的菜单界面

    第三步:基本命令输入。按照菜单提示进行命令输入,在此1-4就是基本的串口命令操作:打开/关闭led,设置/查看网络配置;5 6步就是开启TCP UDP回环测试。TCP回环实际上就是开启了一个TCP Server,同一网段的TCP Client可以直接与其建立通信,可发送数据到此TCP ServerTCP Server会回复相同的数据。串口基本配置和内网回环测比较简单,在此不再贴图查看。

    第四步:配置TCP端口映射。在串口调试助手上输入 7,进行配置选项,按照菜单提示,我们端口映射,外网端口号为12222,内网端口号为5000,添加成功后会提示AddPortSuccess。如图11所示:

     图片11

    11添加端口映射成功后串口打印出信息

    刷新第一步进入的UPnP状态设置和设备列表,可发现控制节点W5500_Control_Point 已经加入内部端口号为5000,外部端口53F712222。可见我们已经成功用UPnP协议对路由器端口进行了映射。而且看到Thunder5在这里也有UDP /TCP 端口映射列表。如图12所示。在这里也说一下,我们常用的P2P软件,Thunder PPlive等都支持UPnP端口映射。

     图片12

    12添加端口映射后路由器端口映射表

    第五步,用外网测试配置好的端口映射。

    如图3端口映射网络图,W5500PC2不在同一个网络中,如果不进行端口映射,PC2不可能连接到W5500 TCP Server。首先我们在串口界面上输入5进入TCP Server回环程序。接下来查看路由器的外网IP可见外网IP为“36.36.141.53”,其为公网IP。我们任意找一台PC用网络调试助手建立一个TCP Client ,去连接我们刚才配置好的服务器IP为“36.36.141.53”端口为“12222”。连接成功后,发送LED_ON(红色为发送的数据),通过网络调试助手我们可以看到收到LED_ON(黑色为收到的数据),证明回环已建立。这就如同,无论我们在什么地方都能对我们的设备进行连接和控制。如图13所示:

     图片13

    13外网连接到内网并进行数据回环测试

             同时通过EVB上的LED,我们可以发现,LED灯可以根据我们输入的指令执行亮灭动作。如图14 所示:

     图片14

    14 LED根据命令进行亮灭

    第六步:删除已添加的端口。在菜单界面中输入8,然后按指示删除刚才的端口,刷新路由器映射表,发现已经没有这个应用了。

    总结

    目前,实现各种设备的互联互通已经成为人们的迫切需求,而实现这一目的的关键是家庭网络的中间件技术,最有前景的就是今天讲的UPnP,因此支持UPnP标准的设备越来越多。本文通过UPnP部分协议实现了设备的自动端口映射,方便设备直接部署在内网中,无需客户去配置,就能在外网中直接访问内网设备,查看或者配置设备信息。作为一个UPnP协议的一个简单应用,希望能给大家一个思路。

    展开全文
  • 在现实网络环境下,经常遇到企业内网服务器需要开放给外网用户访问等问题,最直接的做法就是将WEB服务器的端口映射出去,但是现实场景中,经常会看到有端口映射、DMZ和UPnP等方式实现映射的效果,也都能达到端口映射...
  • 支持UPnP,很多地方都有说明,这里就不细说,简而言之就是网关可以不需手动设置即自动为某个软件进行端口映射。如果该网关具有该功能,那么他就可以称作支持UPnP。 而允许UPnP框架通过,则是另一个概念。 操作...
  • 端口映射UPnP

    2009-05-14 09:59:00
    端口映射UPnP UPnP是通用即插即用(Universal Plug and Play)的缩写,它主要用于实现设备的智能互联互通。使用UPnP协议不需要设备驱动程序,因此使用UPnP建立的网络是介质无关的,它可以运行在几乎所有的操作系统...
  • P2P端口映射 UPnP设置功能使用详解

    千次阅读 2011-11-30 16:57:22
    P2P端口映射 UPnP设置功能使用详解      在网上看了很多关于如何打开UPnP功能的文章,发现竟然没有一篇文章能把整个UPnP的设置过程介绍全的,都是只讲到一部分。所以...
  • 目录: 1、 环境搭建 2、 DMZ主机映射测试 3、 Upnp端口映射测试 一、环境搭建 硬件准备:两台电脑AB,两个路由器(无线路由器A,有线路由器B)。 1、A、B两个路由器WAN直接连接,两台电脑A、B分别接A、B路由器任意...
  • · UPnP的概念:通用即插即用 (UPnP) 是一种用于 PC 机智能设备(或仪器)的常见对等网络连接的体系结构,尤其是在家庭中。UPnP 以 Internet 标准技术(例如 TCP/IP、HTTP XML)为基础,使这样的设备彼此可...
  • P2P端口映射UPnP功能使用详解

    千次阅读 2007-06-24 20:39:00
    在网上看了很多关于如何打开UPnP功能的文章,发现竟然没有一篇文章能把整个UPnP的设置过程介绍全的,都是只讲到一部分。所以决定写篇文章,至少把设置UPnP的整体思路理一下,因为涉及到不同的操作系统以及不同型号的...
  • NAT端口映射: napt,upnp以及nat-pmp

    万次阅读 2018-05-04 21:12:05
    我喜欢用很简单的话来概括:natp是内部机器通过路由器也就是网关向外部发送网络请求时,路由器记住内部机器的ip和端口,同时跟真正发送数据的外网端口绑定,产生一个临时映射表,当收到外网数据以后通过这个映射表将...
  • 路由器端口映射工具

    2012-04-02 20:18:18
    NSW UPNP路由器端口映射工具 是一款免费的绿色版路由器TCP端口映射设置软件。 支持UPNP功能的路由器(一般路由器均支持此功能),无需管理帐号密码,也不 需进入路由器管理界面,可以直接通过本软件,进行端口映射...
  • 路由端口映射

    2011-09-29 14:52:00
    UPnP即Universal Plug and Play通用即插即用简称UPNPUPnP使用标准的TCP/IP网络协议,使它能够无缝的融入现有网络。这个软件就是利用NPUP技术将内网端口映射到router上
  • UPNP NAT映射 VS2008

    2011-07-14 12:44:41
    支持大多数路由器设备,可以添加UPNP 端口映射和删除端口映射,目前只测试了这两个功能,其他功能还没有测试。如果有问题请与我联系。谢谢
  • 答:通用即插即用 (UPnP) 是一种用于 PC 机智能设备(或仪器)的常见对等网络连接的体系结构,尤其是在家庭中。UPnP 以 Internet 标准技术(例如 TCP/IP、HTTP XML)为基础,使这样的设备彼此可自动连接...
  • upnp

    千次阅读 2016-12-05 17:39:56
    简介 处于内网的机器,因为没有一个公有的Ip,外面是无法主动连接到内网的设备。...当然这并不是唯一方案,穿透转发也是一个较普遍的方式,本文只讨论UPNP端口映射的实现方式。UPNP端口映射将一个外部端口映射到一
  • Go语言upnp和socket编程

    2019-08-24 13:06:04
    在内网中运行一台server,利用UPnP协议发现设备构造端口映射
  • UPnP

    千次阅读 2019-05-30 13:31:43
    UPnPUPnP简介启动UPnP服务 UPnP简介 ...对于一台内网电脑,UPnP功能可以使网关或路由器的NAT模块做自动端口映射,将监听的端口从网关或路由器映射到内网电脑上。 网关或路由器的网络防火墙模块开...

空空如也

空空如也

1 2 3 4 5
收藏数 86
精华内容 34
关键字:

upnp和端口映射