寻址(Addressing)是UPnP网络连接的第0步,通过寻址,设备和控制点将获得IP地址。UPnP设备和控制点可以只支持IPv4,也可以同时支持IPv4和IPv6。对于每个控制设备或控制点而言,如果自身没有实现DHCP服务器,则在它们首次接入UPnP网络时,必须通过DHCP客户端来搜寻DHCP服务器(如果它们自身实现了DHCP服务器,则可以给自己从地址池中分配IP地址)。如果存在DHCP服务器,例如托管网络中,那么设备和控制点必须使用分配到的IP地址;如果DHCP服务器不可用,例如在非托管网络中,那么设备或控制点必须使用Auto-IP来获得IP地址。
定义在RFC3927中的Auto-IP定义了设备或控制点:1)判断DHCP服务器是否可用;2)在链路本地的IP地址集合中选择一个IP地址。这种地址分配方式允许设备或控制点在托管网络和非托管网络间自由的移动。
1)判断是否使用Auto-IP
当设备或控制点既支持Auto-IP,又配置了动态地址分配,那么首先它会通过向DHCP服务器发送一条DHCPDISCOVER消息来请求一个IP地址。DHCP客户端监听DHCPOFFER响应的超时时间视具体实现而定。如果在超时时间内,设备或控制点收到了DHCPOFFER消息,则它们必须继续进行动态地址分配的操作。如果没有收到有效的DHCPOFFER消息,则它们必须使用Auto-IP来获得一个IP地址。
2)选择IP地址
为了使用Auto-IP自动配置一个IP地址,设备或控制点使用由具体实现定义的算法,在169.254/16范围内选择一个IP地址,需要注意的是,在这个范围中的最开始和最后256个地址是保留的,不能使用。
被选中的IP地址必须进行测试,来验证该地址是否已经被使用。如果该地址已经被其他设备或控制点使用了,那么就选择另外一个IP地址,重复上面的测试操作,直到达到了具体实现定义的重试次数为止。地址的选择机制必须是随机的,以保证多个设备或控制点分配的地址不会冲突。设备或控制点使用伪随机算法(使得地址取值分布在169.254.1.0和169.254.254.255之间),以尽可能减少同一时间接入UPnP网络的设备或控制点选择到同一个IP地址,并在冲突后重选到相同的IP地址序列。伪随机算法的种子可以使用设备或控制点的MAC地址。
3)测试IP地址
为了测试选择的IP地址是否发生冲突,设备或控制点使用ARP协议来探测。ARP探测通过发送带有设备或控制点硬件地址和IP地址(设为全0)的ARP请求来实现,并且必须进行ARP响应的监听。ARP探测可以多次重复发送,来最大可能的确定该IP地址没有被使用,建议ARP探测以间隔2s连续发送4次。
当成功配置了本地链路IP地址后,设备或控制点必须再发送两条免费的ARP请求,间隔2s,并填上配置的IP地址。这两条ARP请求的目的是刷新网络上其他主机过期的ARP缓存表。
配备了持久性存储器的控制设备或控制点可以记录它们选择过的IP地址,并在下次启动时使用该地址作为ARP探测的首选IP地址,这样能够增强寻址的稳定性,减少地址解析的冲突。
地址冲突检测并不仅仅在地址测试阶段使用,只要设备或控制点还在使用链路本地IP地址,那么地址冲突检测就会持续进行。在任何时候,只要设备或控制点接收到ARP包中的发送者IP地址和自己本地的IP地址冲突,且发送者的硬件地址和本地硬件地址不一样,那么地址冲突发生了,设备或控制点必须做出如下响应之一:
1)重新配置一个新的链路本地IP地址,如上面所述;
2)如果设备或控制点存在激活的TCP连接或者其他原因导致必须保持现有IP地址,并且在最近时间内(例如最近10s)还没有收到其他的冲突的ARP包,那么设备或控制点可以选择尝试保有现有地址一次。这是通过记录接收到冲突的ARP包的时间、广播一条包含本地IP地址和硬件地址作为源地址的免费ARP请求来实现的。但是,如果在收到一个冲突的ARP包之后,短时间内(例如10s内)又收到另一个冲突的ARP包,那么,设备或控制点必须马上重新通过Auto-IP方式分配新的IP地址。
设备或控制点必须使用上面两种方式之一来响应接收到的冲突ARP包,而不能忽略之。如果选择了新的IP地址,那么设备或控制点必须取消之前的通告,并以新的IP地址重新进行通告。
在成功配置了Auto-IP地址后,所有后续包含该IP作为源地址的ARP包(请求或者回复的),必须使用链路级广播而不是链路级单播来发送,这是为了及时发现重复的地址。
4)转发规则
源地址或目的地址在169.254/16范围内的IP包不能发送到路由器进行转发。相反,发送者必须通过ARP协议来获得目的硬件地址,并将数据包直接发送到位于同一链路上的目的地址。
带有多播目的地址的IP数据报以及Auto-IP源地址不能转发到本地链路之外。设备或控制点可以假定所有169.254/16范围内的目的地址是链路本地的,并且是可直达的。169.254/16范围的地址不能被子网化。
5)周期性检测可用的动态地址
通过Auto-IP机制自动配置IP地址的设备或控制点,必须周期性地检测DHCP服务器是否可用,这可以通过发送DHCPDISCOVER消息来实现。至于检测周期则是由具体实现定义,每5分钟检测一次可以保持网络带宽和连通性维护之间的平衡。如果收到DHCPOFFER响应消息,设备或控制点必须继续进行动态地址分配。一旦通过DHCP服务器分配到了IP地址,那么设备或控制点可以释放自动配置的IP地址,也可以选择持有自动分配的IP地址(持续一段时间或无限期)来保持现有的连接。
要切换到新的IP地址,设备应当取消任何在旧地址上发出的通告,并在新地址上重新通告一次。
对于具有多个IP地址的多宿主设备,该设备除了应当取消任何在旧地址上发出的通告,并在新地址上重新通告一次外,还必须在本机所有不受影响的IP地址上进行通告的更新。
6)设备命名和DNS交互
一旦设备在网络中具有有效的IP地址,它就能在网络中被定位和访问到。对于终端用户而言,设备的一个友好名称要比IP地址更易于使用。这时设备可以提供一个主机名给DHCP服务器,由DHCP服务器到DNS服务器中注册设备主机名和IP地址的映射关系,之后就可以使用主机名来访问该设备了。多数情况下,设备没有使用主机名,而是使用基于IP地址的URL链接。
7)名称到IP地址的解析
当一个设备要访问另一个以DNS名称来标识的设备时,它要通过给DNS服务器提交DNS查询请求,来获得该名称对应的IP地址。设备能够静态地使用DNS服务器列表进行预先配置,也可以通过DHCP服务器采用配置DNS服务器列表进行配置,又或者在IP地址分配后,通过发送一条DHCPINFORM消息进行配置。