面向IPv6局部无服务器DNS名称解析
局部无服务器的域名系统(LSLDNS) | |
LSLDNS的运作原理 | |
更多信息 |
局部无服务器的域名系统(LSLDNS)也称为多播DNS,它是Microsoft Windows CE 4.1或更新版本提供的IPv6协议中的一项新增功能。LSLDNS在标题为“局部无服务器的DNS(LSLDNS)查询解析”(draft-ietf-dnsext-mdns-07.txt)的Internet草案所有描述。
注意在多播Internet草案的最新修订版中,该协议的名称已改为链路局部多播名称解析(Linklocal Multicast Name Resolution,LLMNR),并且许多实施细节已作了改动。本文不打算描述LLMNR。
LSLDNS提供了一种用于在未包含有效DNS服务器的专用单子网上解析名称的方法。Windows TCP/IP中的IPv4通过使用TCP/IP之上的NetBIOS(NetBT)来解决这个问题,其中默认启用NetBT。通过NetBT,查询节点可向本地子网广播地址广播一条NetBIOS Name Query Request(NetBIOS名称查询请求)消息。拥有所查询的名称的节点向请求者发回一条单播NetBIOS Name Query Response消息来解析名称。
由于以下原因,这种方法不适用于IPv6:
• |
NetBIOS未定义用以在IPv6上进行运作。 |
• |
IPv6中没有广播地址。 |
LSLDNS是一种用于专用单子网的简单请求-应答机制,可允许IPv6节点在不具备DNS名称解析功能的情况下实现名称的相互解析。多子网应该具有有效的路由器和DNS服务器。由于广播不是对IPv6定义的,因而采用多播方式。
LSLDNS在以下几个方面和DNS类似:
• |
使用完全合格的域名(FQDN) |
• |
根据RFC 1035中的定义,它和DNS使用相同的消息和消息结构 |
LSLDNS在以下几个方面有别于DNS:
• |
LSLDNS消息发送到TCP和UDP端口5353,而不是发送到TCP和UDP端口53 |
• |
LSLDNS消息查询发送到多播地址,而不是发送到DNS服务器的单播地址 |
• |
LSLDNS名称缓存独立于DNS名称缓存 |
当DNS服务器处于以下情况时使用LSLDNS:
• |
未经配置 |
• |
未对查询返回响应 |
• |
含返回代码的响应(RCODE)被设为0,但无任何应答记录 |
• |
含RCODE的响应被设为3(不存在域名) |
DNS Name Query Request(DNS名称查询请求)消息的多播地址称为请求的名称多播地址,它是根据以下几个部分进行构造的:
• |
前缀:FF02::2:0:0/96。 |
• |
在FQDN或不合格的名称的主机名称部分中的Message Digest 5(MD5)hash计算的高序32位。例如,如果FQDN是officecomputer.example.com,则主机名称为officecomputer。 |
被赋予该主机名称的主机将侦听经请求的名称多播地址,而尝试对以该主机名称开头的FQDN进行名称解析的主机将使用经请求的名称多播地址作为DNS Name Query Request消息的目标地址。
在启动期间,支持LSLDNS的节点将计算它自己的经请求的名称多播地址,并指示IPv6侦听发送到该地址的数据包。
当应用程序使用getaddrinfo()Windows Sockets函数调用来将一个FQDN或不合格的名称解析为一个地址时,支持LSLDNS的节点将提取出主机名称,计算该主机名称的MD5 hash值,并把结果的高序32位附加到FF02::2:0:0/96前缀,以形成经请求的名称多播地址。
然后查询节点将构造并发送一条具有以下内容的DNS Name Query Request消息;
• |
IPv6报头 “Source Address”(源地址)字段被设置为查询节点的接口的链路局部地址 “Destination Address”(目标地址)字段被设置为经请求的名称多播地址 “Hop Limit”(跳限制)字段被设置为255 |
• |
UDP报头 “Source Port”(源端口)字段被设置为5353 “Destination Port”(目标端口)字段被设置为5353 |
• |
DNS报头 “Recursion Desired”(需要递归,RD)标记被设置为0 |
Question部分包含应用程序最初指定的完整名称和一个对getaddrinfo()函数调用中指定的记录类型的请求。
注意IPv6报头中的“Hop Limit”被设置为255。接收器将在对消息执行进一步的处理之前检验“Hop Limit”字段是否被设置为255。这种检查类似于对“Neighbor Discovery”(邻居发现)消息进行处理,其中接收器检验消息是否来自一个连接到局部链路的节点。如果该节点不在链路上,“Hop Limit”字段将被设置为一个小于255的值。
注意DNS报头中的RD标记被设置为0,表示请求器不希望接收器代表其执行递归查询。
多播“DNS Name Query Request”消息由正在侦听指定的经请求的名称多播地址(通常只有一个这样的地址)的节点接收。 它们首先检验“Hop Limit”字段是否被设置为255。如果不是,消息将自动被丢弃。
然后接收主机检查它对于消息中的“Question”部分中的名称是否具有权威性。与常规DNS行为相反,LSLDNS节点对于已分配给它们的特定名称(而不是对以分配的名称开头的名称空间的某个部分)具有权威性。使用传统DNS服务器术语来说,LSLDNS节点仅对与分配给它们的名称相对应的区域根(zone root)具有权威性(这里不严格地使用了区域,因为LSLDNS节点不是存储区域的DNS服务器)。例如,已被赋予名称ffice.example.com的LSLDNS节点对所有以ffice.example.com开头的名称也不具有权威性。
如果接收DNS Name Query Request消息的某个节点对消息的“Question”部分中的名称具有权威性,它将构造并发送一个具有以下内容的DNS Name Query Response消息:
• |
IPv6报头 Source Address字段被设置为响应者的发送接口的链路局部地址 Destination Address字段被设置为接收到的DNS Name Query Request消息的Source Address字段(请求者的链路局部地址) Hop Limit字段被设置为255 |
• |
UDP报头 Source Port字段被设置为5353 Destination Port字段被设置为5353 |
• |
DNS报头 Authoritative Answer (AA)标记被设置为1 Recursion Available(可用递归,RA)标记被设置为0 RCODE字段被设置为0 Question部分包括DNS Name Query Request消息中的 Question部分的字段 Answer部分包括针对DNS Name Query Request消息中所请求的名称及其类型的相应记录 |
如果整个DNS Name Query Response消息大于512字节,响应者将把“Truncation”(截断,TC)标记设置为1。然后请求者就能够使用基于TCP的单播DNS Name Query Request消息来重复查询,或者能够使用EDNS0(由RFC 2671所定义)来重试基于UDP的查询。
如果请求者没有接收到应答,它最多能够重传三次DNS Name Query Request消息。只有在没有接收到重传的查询的任何应答之后,LSLDNS才能得出结论认为要查询的名称在网络上不存在,并向调用getaddrinfo()函数的应用程序指出名称解析失败。
专用子网或单子网上的多个节点可以同时使用相同的主机名称。例如,一个节点被分配以FQDN officecomputer.example.com,另一个节点被分配以 FQDN officecomputer.upstairs.example.com。对于这两台计算机,经请求的名称多播地址是相同的。发送到与主机名称officecomputer相对应的请求名称多播地址的对名称officecomputer.example.com的查询将同时由这两台计算机进行处理。然而,只有被分配以officecomputer.example.com名称的计算机才会发送响应。
多个节点被分配以相同FQDN也是可能的。对于这两台计算机,请求的名称多播地址是相同的。发送到与FQDN中的主机名称相对应的请求的名称多播地址的查询将同时由这两台计算机处理,并且两台计算机都会发回响应。在这种情况下,请求者对多个响应的处理就像是它在单个应答中接收到多个应答。