为您推荐:
精华内容
最热下载
问答
  • 5星
    345KB hongfa7 2012-03-11 21:05:30
  • 441KB sangsi 2021-02-04 08:39:27
  • 394KB weixin_38585666 2020-08-08 15:02:35
  • 434KB leavemyleave 2021-09-15 23:23:26
  • 355KB pk996sc2006 2011-10-07 09:07:15
  • UPNP的全称是 Universal plug-and-play( 通用即插即用).UPnP 是针对智能家电、无线设备以及各种外观尺寸的个人电脑的普遍对等(peer-to-peer)网络连接而设计的一种... 我们这里用到的自动端口映射只是UPNP的一个小
    UPNP的全称是
     Universal plug-and-play( 通用即插即用).UPnP 是针对智能家电、无线设备以及各种外观尺寸的个人电脑的普遍对等(peer-to-peer)网络连接而设计的一种架构。它旨在为家庭、小型企业、公共场 所中或连接到互联网的ad-hoc 网或未管理网络提供易于使用、灵活且基于标准的连接。
    (引自
    这里
    .) 
    

      我们这里用到的自动端口映射只是UPNP的一个小应用。按照UPNP的相关规范,UPNP网络的第0步是寻址(获得一个IP地址,在我要解决的问题中这不是一个问题。)       
        第1步是发现,控制点在网上搜索感兴趣的设备,而设备向网络中的控制点宣告其服务。对于自动端口映射来说就是发现带UPNP功能的路由器。

     发现这个过程主要有两步。第一,使用数据报套接字向239.255.255.250:1900,发送一条多播请求,格式如下

    M-SEARCH * HTTP/1.1
    HOST: 239.255.255.250:1900
    MAN:"ssdp:discover"
    MX:3
    ST:UPnP:rootdevice

          这个多播请求的含义如下:M-SEARCH SSDP协议定义的搜索请求方法。HOST必须是这个多播地址。MAN的值也必须是"ssdp:discover" 不可少了双引号。MX的含义是最长等待时间,可以自己设置。ST表示search target 搜索目标。我们在这里用找根设备。另外在编程中我们要在每一行后面加上"rn" 表示换行。(详见源码 UPNPNAT.discovery()).

          第二步,如果你的网络存在一个UPNP设备的话,为了被找到,设备必须向发送查找请求的多播通道的源 IP 地址与端口发送响应信息。所以你可以从239.255.255.250:1900这个地址接收到响应消息。类似下面的消息。

    HTTP/1.1 200 OK
    CACHE-CONTROL: max-age=100
    DATE: Sun, 15 Jan 2006 06:51:02 GMT
    EXT:
    LOCATION: http://192.168.14.1:1900/igd.xml
    SERVER: TP-LINK Wireless Router WR541G/5, UPnP/1.0
    ST: upnp:rootdevice
    USN:uuid:upnp-InternetGatewayDevice-192168141678900001::upnp:rootdevice

          接下来我们要从里面获得我们要的消息。首先,我们必须找到" 200 OK ",说明没有错误发生,否则一切免谈。接着,我们要找到LOCATION项,获得设备描述URL。(程序中的处理归根到底就是一个子字符的查找。)

           到这里,我们的第一步“发现”完成。


       第2步是描述。在第1步中我们往往能获得一个设备的描述URL,在第2步中我们要通过一个URL,下载一个XML文件。并从中找到有关设备的类型,服务类型,控制URL,事件触发URL等。

    我们同样分两步进行,首先下载设备描述文件。(请看源码中UPNPNAT::get_description()函数)
        1.解析描述文件的URL,获得主机(host)、端口(port)、路径(path).(parseUrl函数) 
        2.连接到host:port (tcp_connect 函数)
        3.构造类似

                                                    GET path HTTP/1.1
                                                    Host: host:port
    的信息(第二行下要一个空行),并通过刚才的TCP 套接字,发送到路由器。(sprintf ,send 函数).
        4.接收数据,我使用flag为 MSG_WAITALL的recv函数,函数一直阻塞直到数据全部读完。 数据最终保存在std::string description_info中。
        我想通过浏览器下载这个文件的过程是类似的吧。
     
        然后,解析这个XML文件。(请看 源码 中UPNPNAT:: parser_description()函数)
    我们找到"root"的"deviceType"是 "urn:schemas-upnp-org:device:InternetGatewayDevice:1"的"device" childNode ,获得这个"device"的"deviceList",记为A。
        找到A的"deviceType"是 "urn:schemas-upnp-org:device:WANDevice:1"的"device" childNode ,获得这个"device"的"deviceList",记为B。
        找到B的"deviceType"是 "urn:schemas-upnp-org:device:WANConnectionDevice:1"的"device" childNode ,获得这个"device"的"serviceList",记为C。
        找到C的"serviceType"是 "urn:schemas-upnp-org:service:WANIPConnection:1" 或 "urn:schemas-upnp-org:service:WANPPPConnection:1" 的"service"  childNode ,记为D.
        获得D的"controlUrl"保存在std::string control_url中。
        但是这里获得control_url一般为相对URL,所以要从"root"下面,找到"URLBase"的值,(如果是空,则用describe_url的"htpp://xxx.xxx.xxx.xxx:xxxx"部分代替.)
        最后在相对的control_url前加上URLBasr 获得完整的control_url.
     
        至此,第二步“获得控制URL”完成。
                                          

        第3步是控制。通过第2步获得的控制URL,通过向其发送控制消息(同样用XML描述)来实现某些功能。对于自动端口映射来说就是查看、增加、删除等。

    在这里我先把各种控制信息的格式说明一下。(下面的rn都是表示换行,我输入不了反斜杠。)

    • 增加端口映射。 "AddPortMapping"
    • "<NewRemoteHost></NewRemoteHost>rn"                              "<NewExternalPort>ExternalPort</NewExternalPort>rn"                               "<NewProtocol>Protocol</NewProtocol>rn"                                      "<NewInternalPort>InternalPort</NewInternalPort>n"
      "<NewInternalClient>InternalClient</NewInternalClient>rn"                 
      "<NewEnabled>1</NewEnabled>rn"
      "<NewPortMappingDescription>PortMappingDescription"       "</NewPortMappingDescription>rn"       
      "<NewLeaseDuration>LeaseDuration</NewLeaseDuration>rn"
    • 删除端口映射 "DeletePortMapping"
    • "<NewRemoteHost></NewRemoteHost>rn" "<NewExternalPort>ExternalPort</NewExternalPort>rn"   "<NewProtocol>Protocol</NewProtocol>rn"
    • 获得端口映射信息 "GetGenericPortMappingEntry"
    • "<NewPortMappingIndex>PortMappingIndex</NewPortMappingIndex>"  "<NewRemoteHost></NewRemoteHost>rn"   "<NewExternalPort></NewExternalPort>rn" "<NewProtocol></NewProtocol>rn"     "<NewInternalPort></NewInternalPort>rn" "<NewInternalClient></NewInternalClient>rn" "<NewEnabled>1</NewEnabled>rn"  "<NewPortMappingDescription>"                                          "</NewPortMappingDescription>rn"            "<NewLeaseDuration></NewLeaseDuration>rn"

         其中斜体部分需要在编程是填入的。ExternalPort 外部端口。InternalPort内部端口。这 两者一般就填映射的端口。Protocal 填TCP或UDP。InterClient 一般就是本地IP地址。PortMappingDescription 填写端口映射的描述,比如什么程序建立了这个端口。LeaseDuration 是映射的持续时间,用0表示不永久。PortMappingIndex 是端口映射索引,路由上第几个映射。

         我们再来看下面这个XML文档结构。

         "<?xml version="1.0" encoding="utf-8"?>rn" 
         "<s:Envelope xmlns:s="
         ""http://schemas.xmlsoap.org/soap/envelope/" "
         "s:encodingStyle="                                   
         ""http://schemas.xmlsoap.org/soap/encoding/">rn"
         "<s:Body>rn" 
         "<u:actionName xmlns:u="serviceType">rn"
         "actionParams</u:actionName>rn" 
         "</s:Body>rn"
         "</s:Envelope>rn"

         我们在actionName 处填入"AddPortMapping" "DeletePortMapping" "GetGenericPortMappingEntry"。serviceType 处填入设备的服务类型。"urn:schemas-upnp-org:service:WANIPConnection:1"或"urn:schemas-upnp-org:service:WANPPPConnection:1"。actionParams 填入上面的各种控制信息。

        最后在前面加上HTTP头。

        "POST path HTTP/1.1rn"
        "HOST: host:portrn"      
        "SOAPACTION:"serviceType#actionName"rn"  
        "CONTENT-TYPE: text/xml ; charset="utf-8"rn"
        "Content-Length: contentLength rnrn"

        path host port 意思很明显。contentLength面那个XML文档的长度。

      然后连接到host:port,发送到整个信息即可完成控制            

        第4步事件触发和第5步展示在自动端口映射没用用到。

    展开全文
    swanabin 2016-07-30 16:55:49
  • 5星
    345KB panweixia 2010-04-10 10:50:21
  • 345KB ming8704 2010-07-04 12:26:55
  • 4星
    712KB shenty 2010-03-07 13:20:38
  • 355KB xsw2009 2009-12-05 20:56:22
  • 文章目录0 简介1 寻址2发现2.1 广播2.2 响应3 描述3.1 GET描述文件3.2 获取并解析XML描述文件4 控制4.1 获取状态信息4.2 获取外网IP4.3 获取端口映射信息4.4端口映射5 一些疑问5.1 端口映射的有效期是多久?...


    参考文档:
    1.RFC 6970
    https://www.rfc-editor.org/info/rfc6970

    2.《UDA1.0-ChinesePDF.pdf》
    http://read.pudn.com/downloads37/doc/comm/125876/UDA1.0-ChinesePDF.pdf

    3.UPnP基本原理以及在NAT中的应用
    https://blog.csdn.net/wuruixn/article/details/23920871

    4.UPnP的介绍和理解
    https://blog.csdn.net/be_happy_mr_li/article/details/52919759

    5.UPnP的工作过程
    https://blog.csdn.net/ocean181/article/details/7406816

    6.upnp协议简介(一)
    https://blog.csdn.net/braddoris/article/details/41646789

    一些词语:
    control point(控制点):在本文中可以理解为需要端口映射的设备,比如内网的一些子设备
    root device(根设备):提供服务的设备,在本文中可以简单理解为路由器
    IGD(Internet Gateway Device):网络网关设备,比如路由器

    0 简介

    参考文档介绍了UPNP的相关原理,接下来进行一个简单的实战,用于练练手。
    我们在内网的设备只有内网的IP:PORT,因此公网设备无法主动和内网的设备进行主动连接。一个简单的方法便是使用UPNP端口映射,将内网设备的PORT(P1)映射到公网的PORT(P2),当其他公网设备主动和P2通信后,路由会将数据转发到P1上。

    下面就UPNP的端口映射功能整个流程做个梳理。

    1 寻址

    所谓的寻址,简单来说就是设备能够连上网络,能够获取IP。

    2发现

    发现设备,在《UDA1.0-ChinesePDF.pdf》中,有如下描述:

    当设备被添加到网络后, UPnP 发现协议允许该设备向网络中的控制点宣告其服务。同样,当一个控制点被添加到网络后,UPnP 发现协议允许该控制点在网上搜索感兴趣的设备。

    所以当控制点添加到网络中后,会搜索局域网内支持UPNP协议的设备。在本文中,可理解为发现支持UPNP端口映射的路由器。

    2.1 广播

    设备需要向239.255.255.250:1900发送多播信息,用于搜索周围支持UPNP的设备多播信息如下:

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

    各个字段含义如下:

    SEARCH:SSDP定义的搜索请求方法
    HTTP/1.1: HTTP版本
    HOST: 由IANA为SSDP保留的多播信道和端口,必须为239.255.255.250:1900
    MAN: 固定为"ssdp:discover",注意双引号不可少
    MX: 最长等待时间,设备会在0和这个值之间随机选择延迟的值,用于均衡负载。
    ST: 搜索目标,有以下类型:
    	ssdp:all
    		搜索所有设备和服务。
    	UPnP:rootdevice
    		只搜索根设备。
    	uuid:device-UUID
    		搜索特殊设备。设备 UUID 由 UPnP 厂商指定。
    	urn:schemas-UPnP-org:device:deviceType:v 
    		搜索同类设备。设备类型与版本由 UPnP 论坛工作委员会定义。 
    

    2.2 响应

    当设备收到多播消息后,会向控制点发送多播消息的源IP:PORT发送UDP响应,并回复给控制点信息。

    HTTP/1.1 200 OK
    CACHE-CONTROL: max-age=100
    DATE: Wed, 04 Jan 2006 00:58:36 GMT
    EXT:
    LOCATION: http://192.168.2.1:1900/igd.xml
    SERVER: Wireless N Router WR745N, UPnP/1.0
    ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
    USN: uuid:upnp-InternetGatewayDevice-192168123178900001::urn:schemas-upnp-org:device:InternetGatewayDevice:1
    

    各个字段含义如下:

    CACHE-CONTROL: 表示宣告有效持续时间,如果超过此时间,控制点可以认为设备或服务不再可用
    DATE: 响应生成时间,此字段可以不使用
    EXT:表示上面discover中的MAN标头已经被理解
    LOCATION: 表示设备的UPNP描述的URL  
    SERVER:记录设备的版本信息
    ST: 搜索目标,取值如下:
    	ssdp:all
    		如果根设备带有 d 种嵌入式设备与 s 种嵌入服务且只有 K 种不同服务类型,那么其响应次数为 3+2d+k。 ST 标头值必须与采用ssdp:alive 的 NOTIFY 消息中的 NT 标头保持统一。
    	UPnP:rootdevice
    		向根设备响应一次。必须是 UPnP:rootdevice。
    	uuid:device-UUID 
    		向每种设备(根设备或嵌入式设备)响应一次。必须是uuid:device-UUID。设备 UUID 由 UPnP 厂商指定。
    	urn:schemas-UPnP-org:device:deviceType:v
    		向每种设备(根设备或嵌入式设备)响应一次。必须是urn:schemas-UPnP-org:device:deviceType:v。设备类型与版本由 UPnP 论坛工作委员会定义。 
    	USN:服务名称,取值如下:
    		uuid:device-UUID::UPnP:rootdevice
    			向根设备发送一次。设备 UUID 由 UPnP 厂商指定。
    		uuid:device-UUID 
    			向每种设备(根设备或嵌入式设备)发送一次。 设备 UUID 由 UPnP厂商指定。
    		uuid:device-UUID::urn:schemas-UPnP-org:device:deviceType:v
    			向每种设备(根设备或嵌入式设备)发送一次。 设备 UUID 由 UPnP厂商指定。设备类型与版本由 UPnP 论坛工作委员会定义。 
    

    在上面信息中心,有一个比较重要的便是LOCATION,在下面我们会通过这个设备描述URL来获取设备的服务。

    至此,整个发现过程便结束了,控制点已经获取到了局域网内的设备信息。

    3 描述

    在发现设备之后,我们只是发现了设备,但是并不知道设备有什么服务,有什么功能等等。因此我们需要从上面设备发现的消息中获取设备描述URL,从而来获取设备的描述。

    3.1 GET描述文件

    控制点会和设备描述URL中的IP:PORT建立TCP连接,并GET获取xml数据。请求如下:

    GET /igd.xml HTTP/1.1
    Host: 192.168.2.1:1900
    Connection: Close
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    

    3.2 获取并解析XML描述文件

    控制点会收到如下描述文件:

    HTTP/1.1 200 OK
    CONTENT-LENGTH: 2746
    CONTENT-TYPE: text/xml
    DATE: Wed, 04 Jan 2006 00:58:40 GMT
    LAST-MODIFIED: Tue, 28 Oct 2003 08:46:08 GMT
    SERVER: Wireless N Router WR745N, 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.2.1:80 </presentationURL>
    <friendlyName >Wireless N Router WR745N</friendlyName>
    <manufacturer >TP-LINK</manufacturer>
    <manufacturerURL >http://www.tp-link.com.cn</manufacturerURL>
    <modelDescription >TL-WR745N 1.0</modelDescription>
    <modelName >TL-WR745N</modelName>
    <modelNumber >1.0</modelNumber>
    <UDN>uuid:upnp-InternetGatewayDevice-192168123178900001</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 >TP-LINK</manufacturer>
    <manufacturerURL >http://www.tp-link.com.cn</manufacturerURL>
    <modelDescription>WAN Device</modelDescription>
    <modelName>WAN Device</modelName>
    <modelNumber>1</modelNumber>
    <modelURL></modelURL>
    <serialNumber>12345678900001</serialNumber>
    <UDN>uuid:upnp-WANDevice-192168123178900001</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 >TP-LINK</manufacturer>
    <manufacturerURL >http://www.tp-link.com.cn</manufacturerURL>
    <modelDescription>WAN Connection Device</modelDescription>
    <modelName>WAN Connection Device</modelName>
    <modelNumber>1</modelNumber>
    <modelURL></modelURL>
    <serialNumber>12345678900001</serialNumber>
    <UDN>uuid:upnp-WANConnectionDevice-192168123178900001</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>
    

    部分字段含义如下:

    UDN:全球唯一设备标识符
    serviceType:UPNP服务类型。 
    

    在上面的报文中,有WANIPConnection/Layer3Forwarding/WANCommonInterfaceConfig等服务类型。其中,WANIPConnection便是我们下面端口映射需要的服务,关于这个描述,有如下定义:

    此服务类型使UPnP控制点能够配置和控制符合UPnP的InternetGatewayDevice的WAN接口上的IP连接。
    可以支持IP连接的任何类型的WAN接口(例如,DSL或电缆)都可以使用此服务。
    […]
    为WANConnectionDevice上的每个实际Internet连接实例激活WANIPConnection服务的实例(请参阅状态变量表)。
    WANIPConnection服务为LAN上的联网客户端提供了与ISP的IP级连接。

    SCPDURL: 服务描述URL
    

    WANIPConnection的服务描述URL是/ipc.xml,因此我们可以在浏览器中输入设备的URL, http://192.168.2.1:1900/ipc.xml, 便可以看到详细的信息,里面包含了许多动作,如下:
    在这里插入图片描述

    controlURL:控制的URL
    

    WANIPConnection的控制URL是/ipc

    至此,描述结束。在这个阶段中,我们找到了需要的服务WANIPConnection,并且获取到了控制URL:/ipc

    4 控制

    在上面的过程中,我们获取了设备的服务,因此接下来便可以控制设备。在本文中,我们控制设备进行端口映射,相关的控制如下:

        AddPortMapping:增加端口映射
        DeletePortMapping:删除端口映射
        GetGenericPortMappingEntry:获得端口映射信息
    	GetExternalIPAddress:获取外网IP
    	GetStatusInfo: 获取状态信息
    

    4.1 获取状态信息

    交互过程如下:

    POST /ipc HTTP/1.1
    Host: 192.168.2.1:1900
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    Content-Length: 271
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo"
    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:GetStatusInfo xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetStatusInfo></s:Body></s:Envelope>
    

    上面信息中有几个需要关注的点:
    POST /ipc HTTP/1.1, 其中/ipc便是路径控制URL
    SOAPACTION:必须是要调用的服务类型、散列符号和动作名称

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Wireless N Router WR745N, UPnP/1.0
    CONTENT-LENGTH: 480
    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:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewConnectionStatus>Connected</NewConnectionStatus><NewLastConnectionError>ERROR_NONE</NewLastConnectionError><NewUptime>3 Days, 01:46:46</NewUptime></u:GetStatusInfoResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    4.2 获取外网IP

    POST /ipc HTTP/1.1
    Host: 192.168.2.1:1900
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    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>
    
    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Wireless N Router WR745N, UPnP/1.0
    CONTENT-LENGTH: 402
    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>192.168.100.34</NewExternalIPAddress></u:GetExternalIPAddressResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    NewExternalIPAddress中的值便是外网IP,因为我的路由器是多级路由,所以并没有获取到真正的公网IP

    4.3 获取端口映射信息

    POST /ipc HTTP/1.1
    Host: 192.168.2.1:1900
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    Content-Length: 341
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetGenericPortMappingEntry"
    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:GetGenericPortMappingEntry xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewPortMappingIndex>0</NewPortMappingIndex></u:GetGenericPortMappingEntry></s:Body></s:Envelope>
    
    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Wireless N Router WR745N, UPnP/1.0
    CONTENT-LENGTH: 687
    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:GetGenericPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>10154</NewExternalPort><NewProtocol>TCP</NewProtocol><NewInternalPort>554</NewInternalPort><NewInternalClient>192.168.2.137</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>MasonUpnp_554_10154</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:GetGenericPortMappingEntryResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    4.4端口映射

    POST /ipc HTTP/1.1
    Host: 192.168.2.1:1900
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    Content-Length: 604
    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>26780</NewExternalPort><NewProtocol>TCP</NewProtocol><NewInternalPort>554</NewInternalPort><NewInternalClient>192.168.2.138</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>MasonUpnp_554_26780</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:AddPortMapping></s:Body></s:Envelope>
    

    上面有几个值需要关注一下:
    NewExternalPort:需要映射的外网端口
    NewProtocol:TCP/UDP
    NewInternalPort:内部端口
    NewInternalClient:内部IP,即控制点IP
    NewPortMappingDescription:端口映射的描述
    NewLeaseDuration:控制点活动状态持续时间,0表示无限制

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Wireless N Router WR745N, 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>
    

    设备返回200 OK,表示映射成功。如果是通过路由器上映射的话,我们便可以在路由器WEB页面看到相关信息。
    在这里插入图片描述
    以上便是UPNP端口映射的流程,本文只是简单介绍了端口映射。所以对UPNP后续的事件/展示等过程没有进行研究。

    5 一些疑问

    5.1 端口映射的有效期是多久?

    关于端口映射的有效期是多久,了解时间太短,没有找到有效的信息。不过在miniUPnP的官网上找到了一些信息,在控制点进行端口映射的时候会有NewLeaseDuration字段,表示控制点活动状态持续时间,将这个值设置为0则表示无限制。

    5.2 多级路由如何映射成功

    由于UPNP只能穿透一层网络,所以如果遇到多级路由这样的复杂网络环境,虽然端口映射成功,但是并没有真正映射到公网。但是查询了一圈资料,并没有找到如何能在多级路由中映射到真正的公网,如果有了解的,麻烦告知一下,共同探讨。

    6 开源库

    网上有一些开源的UPNP库,可以将我们从这些繁杂的交互过程中独立出来,专注于应用。虽然了解了轮子的构造过程,但是就不需要重新造轮子了。
    MiniUPnP:
    https://github.com/miniupnp/miniupnp
    Libupnp:
    http://pupnp.sourceforge.net/

    展开全文
    u011003120 2019-12-01 17:00:39
  • 340KB c94668104l 2011-07-01 16:54:05
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼所列如没你需要的猫,可留言实达_ADSL_2110EH详细端口映射的设置假设内网IP为:192.168.10.2在IE中用...NATRuleEntry→Add→进入端口映射添加页面2、添加:RuleF...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    所列如没你需要的猫,可留言

    实达_ADSL_2110EH 详细端口映射的设置

    假设内网IP为:192.168.10.2

    在IE中用http://192.168.10.1打开实达ADSL管理配置页面

    用户名:ROOT

    密码:GROUTER

    1、选择Service→NAT Options: NAT Rule Entry→Add→进入端口映射添加页面

    2、添加:

    Rule Flavor: RDR

    Rule ID: 2

    IF Name: All

    Protocol: TCP

    Local Address From: 192.168.10.2

    Local Address To: 192.168.10.2

    Global Address From: 0.0.0.0

    Global Address To: 0.0.0.0

    Destination Port From: 4662

    Destination Port To: 4662

    Local Port: 4662

    3、选择Submit提交

    4、选择主窗口菜单的Admin→Commit & Reboot→Commit→重起Modem

    再建一个UDP映射端口

    1、(同上)

    2、添加:

    Rule Flavor: RDR

    Rule ID: 3

    IF Name: All

    Protocol: UDP

    Local Address From: 192.168.10.2

    Local Address To: 192.168.10.2

    Global Address From: 0.0.0.0

    Global Address To: 0.0.0.0

    Destination Port From: 4672

    Destination Port To: 4672

    Local Port: 4672

    3、4步同上。OK保证高ID

    祝各位好运。

    版本不一样,密码不一样,大家可以试试:

    2110ehr v3.20 用户:admin 密码:conexant

    2110ehr v3.21 用户:admin 密码:conexant

    2110ehr v3.51 用户:admin 密码:conexant

    2110ehr v4.5 用户:root 密码:grouter

    2110eh v3.51 用户:admin 密码:starnetadsl (中文web界面)

    我的连接方式是:网卡→集线器→实达2110EH/ROUTER→ISP连接(另3台计算机同此连接)。公网用户。ADSL配置是:

    ADSL 连线状态:

    当前下行速度为(INTERLEAVED) 6144Kbps

    当前上行速度为(INTERLEAVED) 640Kbps

    ADSL 信息

    机器名称 : ADSL ROUTER

    版本信息 : VIK-1.38.030131a13

    MAC 地址 : 000:F8:2D:C0:C2

    线路类型 : ITU MULTITONE

    DHCP Server : USED AS SERVER

    DHCP IP RANGE : 192.168.10.2 to 192.168.10.32

    DHCP DNS : 192.168.10.1

    ADSL 协议配置:

    ADSL 协议: RFC2516(PPPOE)

    ADSL 以太网IP: 192.168.10.1

    ADSL 封装类型: LLC/SNAP封装

    ADSL VPI: 0

    ADSL VCI: 35

    DNS RELAY: ON

    按需拨号: 关闭

    PPP Status: Connected

    WAN_IP: 218.75.225.131

    EHv1.xx:无用户名,密码为password。

    EHv2.xx:无用户名,密码为password。

    EHv3.xx:modem版普通用户名为user,密码为password;高级用户名为admin,密码为conexantmodem。

    router版普通用户名为user,密码为password;高级用户名为admin,密码为conexant。

    中文web界面的固化,不分modem还是router,用户名为admin,密码为starnetadsl。

    EH S5:用户名为admin,密码为conexantsoho。

    EHv4.xx:modem版普通用户名为user,密码为password;高级用户名为root,密码为root。

    router版普通用户名为user,密码为password;高级用户名为root,密码为grouter。

    EHv5.xx:只提供bridge功能,lan口无ip,免管理。

    Ehv7.xx:用户名为root,密码Admin。

    2110ehr v1.x/2.x 的方法

    把modem的管理/配置端口映射到内网IP上即可!

    1. telnet 192.168.10.1(这是省缺地址,实际中的地址可能不一样,可以看看你的网关设置!) 提示输入,输入password即可。

    2. nat inbound add [i/f] [port]/[protocol] 192.168.10.5

    这里[i/f]为接口名,RFC1483+NAT 接口为 bridge

    RFC1483Router 接口为rfc1483

    RFC1577接口为ipoa

    RFC2364 接口为ppp_device

    RFC2516接口为 ppp_device

    [port]是要映射的端口,主要做80/21/23/65这几个端口即可

    3. config save

    4、重起modem即可

    举例说明:如果你用的是2516 pppoe 方式 要映射4662端口, 那么telnet 192.168.10.1后按下面的做:

    展开全文
    weixin_31565723 2021-03-21 09:08:50
  • 5KB weixin_42676824 2021-09-28 21:43:37
  • 39KB weixin_38686153 2020-10-01 06:48:30
  • 4星
    1.19MB lvj_158 2012-09-07 16:26:27
  • 4星
    598KB wjabbz 2010-02-03 03:25:29
  • weixin_34019929 2015-04-13 10:41:00
  • pyl88429 2019-12-23 14:47:34
  • WIZnet2012 2015-03-12 10:54:38
  • 3.23MB langlinsen516 2016-09-19 17:15:37
  • wsxwang 2021-06-08 14:48:36
  • 15KB weixin_42121754 2021-05-12 21:20:58
  • weixin_42227736 2021-02-28 10:25:23
  • fengfengdiandia 2018-12-14 21:06:44
  • ypbsyy 2018-11-08 19:41:15
  • 4星
    34KB haibao637 2013-09-07 17:46:17
  • 432KB wangdingyong 2010-12-08 22:08:03

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,088
精华内容 835
关键字:

upnp自动端口映射