- 经验
- 1257
- 分贝
- 0
- 家园分
- 1453
- 在线时间:
- 342 小时
- 最后登录:
- 2016-4-14
- 帖子:
- 174
- 精华:
- 0
- 注册时间:
- 2015-6-17
- UID:
- 1129278
注册:2015-6-172
|
发表于 2015-8-26 09:20:35
|显示全部楼层
3.2.6 UPnP
我们继续本周开头的故事。传递室大爷分拣信件时,收到一封收件人为“XXX年级年级长”的信件。大爷可犯难了,因为这个年级长是每月竞选轮换的,他可不知道当月的年级长在哪个班级,所以不知道该把信件放到哪个班级的信箱。小U给大爷出了一招,让年级长的评选负责组织及时把对应的同学姓名和班级号报送给大爷,这样大爷就知道把信件放到哪个班级的信箱了。
其实,NAT设备也存在类似的烦恼。前面我们曾说过,为解决外网设备主动访问NAT内网设备的问题,需要在NAT设备上手工配置NAT表项映射。但如果内网设备的服务IP地址或端口号会发生变更,手工静态配置显然是不合适的,需要有一个动态交互的机制。解决这个问题的特性叫通用即插即用UPnP(Universal Plug and Play)。
UPnP最大的愿景是任何设备一旦连接入网络,所有在网设备马上就能相互知道;这些设备彼此通信,能直接利用对方提供的服务,无需人工干预设置,达到即插即用的效果。
下图是一个典型的广域监控应用示例。NVR通过SOHO路由器连接到Internet网,Internet上的其它终端设备(比如手机、PC)需要查看NVR上的视频监控画面。根据前面的NAT知识,管理员需要在SOHO路由器手工配置端口映射,否则Internet网上的终端设备就无法主动访问内网的NVR。手工配置端口映射,不仅繁琐而且容易出错,有了UPnP,这个问题就迎刃而解了。
UPnP是如何领会管理员意图的呢?我们来以一个实际例子学习下UPnP的运行过程。
图3-15 老U驿站UPnP特性示意图
UPnP运行可分为三大步骤,如下:
NVR和路由器等设备连入网络后,通过协议交互发现对方的存在;
发现对方的存在后,NVR和路由器都需要报告自己的身份以及有什么样的资源,即能为其他设备提供什么服务;
NVR知道路由器的资源(能够提供端口映射服务)后,于是请求路由器为NVR提供端口映射服务,路由器会将成功与否的结果反馈给NVR。
我们来看下具体的交互过程。
第一步:路由器上电获取到IP地址后,就会向网络报告自己的存在,以组播(组播的细节后面章节会详细讨论,基本的功能特点是:IP报文的目的IP地址或MAC地址为组播地址,UPnP用的是239.255.255.250这一固定组播地址,其他设备只要启用了对应的功能,就能够侦听并接收该报文)的方式向外发送报文,报文里携带有设备名称和设备类型、设备IP地址等信息,用wireshark来分析报文,截图如下:
图3-16路由器发出的报文解析
NVR上电或接入到网络后,与路由器一样,会向网络发送报文报告自己的存在,也是以组播的方式下网发送。
第二步:支持UPnP的NVR会侦听网络中目的地址是239.255.255.250的组播报文。NVR发现了路由器后,根据报文里的内容(即路由器的URL信息)继续向该路由器询问其设备类型以及能提供的服务,路由器就向NVR反馈它具有连接internet的服务、可以提供端口映射功能等。
第三步:NVR通过上述交互后明白了路由器是一台可以连接到Internet的设备,具有提供端口映射功能。刚好NVR就需要这样的服务,需要把端口映射出去。于是,NVR告诉路由器,请帮忙提供地址端口映射服务。下列是用Wireshark的Follow TCP Stream来解析NVR与路由器之间的查询交互报文。从解析出来的报文可以看到,NVR明确告诉路由器,请你在公网接口上侦听,如果在WAN口收到目的端口是50443的TCP报文,请帮忙转换报文,并送给内网IP地址是202.8.20.116、目的端口是443的主机。
POST /ipc HTTP/1.1HOST: 202.8.20.119:1900CONTENT-LENGTH: 588CONTENT-TYPE: text/xml; charset="utf-8"SOAPACTION: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"USER-AGENT: Linux/3.4.35_hi3535, UPnP/1.0, Portable SDK for UPnP devices/1.6.19
<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>50443</NewExternalPort> ——公网接口需要侦听的端口号<NewProtocol>TCP</NewProtocol> ——需要映射的协议是TCP
<NewInternalPort>443</NewInternalPort> ——映射到内网的端口号
<NewInternalClient>202.8.20.116</NewInternalClient> ——转发到内网设备的IP地址
<NewEnabled>1</NewEnabled>
图3-17NVR发出的报文解析
此外,NVR还向路由器发起查询,询问WAN口的公网IP地址是多少。路由器收到后没有丝毫犹豫,很爽快的告诉NVR,它的公网IP地址是64.0.236.2。
在老U的驿站里,由于路由器和NVR支持UPnP特性,就无需手工进行路由器的端口映射操作。配置很简单,在NVR和路由器的web页面上勾选/开启UPnP即可。
老U可以在NVR以及路由器的web界面上看到UPnP运行成功后的显示页面。
路由器上的截图:
图3-18路由器的配置示意图
NVR上的截图:
图3-19 NVR的配置示意图
以上配置可以形象扼要的用如下对话来解释:
NVR:呼叫路由器,我是NVR,我现在的IP地址是202.8.20.116,我想要对外提供端口号为80、554、7070、6060、443的TCP服务,麻烦路由器你帮我映射出去。
路由器:我是路由器,收到NVR的呼叫,我已经帮你把端口号为80、554、7070、6060、443的TCP服务映射出去了。映射出去后对应的公网端口号分别是:50080、50554、57070、56060、50443。我的外网IP地址是64.0.236.2。
此时,web页面上可以清晰的看到UPnP特性带来的自动端口映射已经生效。例如,在上面的路由器截图中的第二条表项代表的含义是: 路由器在外网接口上收到目的端口号为50554的TCP报文会被转发到内部的202.8.20.116的NVR,目的端口号会被转换成554。与此同时,NVR上也“自动”的知道了自己所连接的路由器的外网IP地址(64.0.236.2)以及相应的映射端口号(50554)。
UPnP,即插即用,无需人为干预,就是这么任性! |
-
总评分: 经验 + 20
家园分 + 20
查看全部评分
|