当前位置:Linux教程 - Linux - Linux网络管理员手册(2)

Linux网络管理员手册(2)



         翻译:赵炯
    [email protected]


    第二章 TCP/IP网络的问题

    我们将转至讨论一些你将遇到的一些细节上,当你将你的Linux机器连接到TCP/IP网络时就会用到这些细节,它涉及到IP地址、主机名、以及有时是路由选择问题。这一章给出了你所需的背景资料,以用于理解你的设置需求,下一章将讨论涉及这些的一些工具。

    2.1 网络接口
    为了隐藏可能用于网络环境的设备的差异性,TCP/IP定义了一个抽象的接口(interface),通过这个接口来访问硬件。这个接口提供了一组操作,该组操作对所有的硬件类型是一样的,并且基本上是涉及发送和接收分组。
    对于每种你想用于连网的外围设备来说,必须在内核中有一个相应的接口。例如,Linux中以太网的接口称作eth0和eth1,SLIP的接口是sl0、sl1等等。这些接口名称是用于配置目的,那时你想给内核命名一个特定的物理设备。除了这别无它意。
    为了对TCP/IP连网有用,一个接口必须分配一个IP地址,当与其它地方通信时这个地址起到它的鉴定识别的作用。这个地址与上面提到的接口名称是不同的;如果你将接口比作一扇门的话,那么这个地址就象是门上钉的名牌一样。
    当然,可能还有其它一些设备参数需要设定;其中之一就是特定硬件能够处理的最大数据报的大小,也称为最大传输单元(Maximum Transfer Unit),或MTU。别的属性将在后面介绍。

    2.2 IP地址
    如上章所提到的,IP网络协议所能理解的地址是一个32比特的数字。每一台机器必须分配一个对于网络环境来说唯一的一个数字。如果你运行一个不与其它网络有TCP/IP通信的本地网络,你可以依据个人的爱好来分配这些数字。然而,对于Internet上的站点来说,这些数字是由一个中心权威机构,网络信息中心(Network Information Center或NIC)来分配的。[1]
    为了容易阅读,IP地址被分解成四个8比特数字称为八位位组(octets)。例如,quark.physics.groucho.edu有一个IP地址为0x954C0C04,它可以写成149.76.12.4。这个格式通常称作为点分四组表示法(Dotted quad notation)。[还有一种称呼为点分十进制表示法Dotted decimal notation—译者注]
    这种表示法的另一个原因是IP地址可以分成包含在开头(左面)的八位位组中的一个网络号(network number)和包含在剩余(右面)的八位位组中的一个主机号(host number)。当IP地址遵循NIC的规则使用时,并不是为你计划要使用的每台主机分配一个地址,而是给你一个网络号,并且允许你依照你的喜好,在你的网络上给各台主机分配在该网络号范围内的所有有效的任意IP地址。
    根据组成的网络规模的大小,IP地址的主机部分可大可小。为适应不同的需要,定义了几类网络,给出了IP地址的不同分割法。

    A类 A类由1.0.0.0到127.0.0.0的网络构成。网络号包含在第一个八位位组中。这样就提供了24比特位的主机部分,每个网络允许大约有160万台主机。

    B类 B类包括从128.0.0.0到191.255.0.0的网络;网络号由前两个八位位组构成。这样就可以有16320个网络,而每个网络可以有65024台主机。

    C类 C类网络的范围从192.0.0.0到223.255.255.0。网络号由前三个八位位组组成。可以有近200万个网络,而每个网络能容纳254台主机。

    D、E、F类的地址范围从224.0.0.0到254.0.0.0,用于试验用途或保留给将来使用,而没有分配给任何网络用。

    如果我们再参考前一章的例子,我们发现quark的地址149.76.12.4对应B类网络149.76.0.0的12.4的主机。
    你可能已经注意到,上面列出来的主机部分不是每个八位位组的所有数值都可以使用的。这是因为八位位组为全0或255的主机号是留作它用的。主机部分的所有比特位为全零的地址引用为一个网络,而主机部分的所有比特位为全1的地址称为广播地址。它同时指一个网络上的所有主机。因此,149.76.255.255不是一个有效地址,而是指网络149.76.0.0上的所有主机。
    还有两个网络地址0.0.0.0和127.0.0.0也是保留的。这第一个称为缺省路由(default route),后一个称为回送地址(loopback address)。缺省路由与IP路由数据报的方式有关,这将在下面讨论。
    网络地址127.0.0.0保留作你的主机内部IP通信用。通常,地址127.0.0.1将分配给主机上的一个特殊接口使用,称为回送接口(loopback interface),它的行为象一个闭合电路。从TCP或UDP送来的任何IP分组都将返送给它们,就好象这个分组是刚从某个网上传过来的。这允许你不必使用一个“真正”的网络就能开发并测试网络软件。它的另一种很有用的应用是在当你想在单机上使用网络软件时。这并不象听起来那么罕有;例如,许多UUCP站点根本就没有IP连通,但仍然要运行INN新闻系统。为了要正常的运作,INN需要回送接口。

    2.3 地址解析
    现在,你已经知道IP地址是如何形成的,你可能会觉得奇怪,它们在以太网上是如何用于编址不同的主机的。毕竟,以太网协议是用一个与IP地址完全不同的六个八位位组的数值来识别主机的,不是吗?
    对。这就是为什么需要一种将IP地址映射到以太网地址的机制了。这就是所谓的地址解析协议(Address Resolution Protocol),或ARP。实际上,ARP根本不限于以太网,它也可以应用于其它类型的网络,如业余无线电爱好者等。ARP的基本概念正象人们在一个150人的人群中寻找X. Ample先生时大多数人的做法一样:他们环绕着人群,叫喊着他的名字,并确信如果他在那里的话一定会应答的。
    当ARP想找出与给定IP地址相应的以太网地址时,它就利用了以太网的“广播”特性,此时一个数据报在网上同时寻址所有的站点。ARP所发送的广播数据报含有对相应IP地址的查询。每台主机将接收到的IP与自己的IP地址相比较,如果一致,就返回一个ARP响应给发出查询的主机。此时发出查询的主机就可以从响应数据报中提取发送者的以太网地址了。
    当然,你会觉得惊讶,一台主机怎么能知道在全世界数不清的以太网上它能找到所期望的主机呢?并且为什么一定是以太网呢?这些问题都涉及称为路由选择的操作,也即在网络上寻找出一台主机的物理位置。这将是下一节的主题。
    此时,让我们再多讨论一会ARP。一旦一台主机发现了一个以太网地址,该主机就将它存贮在ARP的缓冲中,这样主机在下一次想要发送数据报给所讨论的主机时就不要再次查询它的以太网地址了。然而,永久地保存这些信息是不明智的;例如,远程主机上的以太网卡有可能由于技术上的问题而被更换掉,此时ARP的登记项就变得无效了。为了强迫进行另一次IP地址的查询,ARP缓冲中的登记项因此在一段时间后就被丢弃。
    有时候,需要找出与给定以太网地址相对应的IP地址。当一台无盘机器想从网上的一台服务器上引导时就会有这种情况,这在局域网上是常有的情形。但是,一个无盘客户实际上并没有有关自身的信息—除了知道自己的以太网址外!所以它主要要做的是广播一条请求引导服务器告诉它它的IP地址的消息。针对于此,有另一个协议,命名为反向地址解析协议(Reverse Address Resolution Protocol),或RARP。与BOOTP协议一起,它用于规定在网上引导无盘站的过程。

    2.4 IP路由选择
    2.4.1 IP网络
    当你给某人写了一封信,通常会在信封上写上完整的收信人地址,列出了国家、州和邮政编码等等。当你把信放入邮箱时,邮政服务会把它送到目的地:它将被送到指定的国家中去,该国的邮政服务会把它分发到正确的州和地区,等等。这个分级方案的优点是显而易见的:不管你在哪里发出了这封信,当地的邮递员将会大概地知道该封信要投递的方向,但并不关心这封信在送达的国家中以什么方式来投递。
    IP网络的结构与之相似。整个互连网(Internet)是由许多专有网络构成,称为自治系统(autonomous systems)。每个这样的系统在其内部成员主机之间执行着各种路由选择,所以分发一个数据报的任务被简化成寻找一条到达目的主机网络的路径。这意味着,一旦数据报被传到那个特定的网络上的任何(any)主机上,网络本身会专门进行进一步的处理。

    2.4.2 子网(Subnetworks)
    这个结构是通过前面所述的将IP地址分成主机部分和网络部分来反映出来的。默认地,目的网络得自IP地址的网络部分。因此,有同样IP网络号的主机在同一个网络上,反之也然。[2]
    在网络内部使用类似的方案也同样合理,由于它本身可能有许多更小的网络组成,最小的单元可以是一个象以太网一样的物理网络。因此,IP允许你将一个IP网络分割成一些子网(subnets)。
    在子网所属的IP网上,子网接管了分发数据报到某个IP地址范围的职责。对于A类、B类或C类网,它是由IP地址的网络部分确定的。然而,现在把网络部分扩展成也包括主机部分的几个比特位。被解释为子网号的这几个比特位的位数是由称为子网掩码(subnet mask),或网络掩码(netmask)的数值指定的。这同样是一个32位的数值,它指定了IP地址网络部分的位掩码。
    图2.1 将B类网分成子网

    Groucho Marx大学的校园网就是这样一个网的例子。它的B类网络号是149.76.0.0,它的网络掩码也就是255.255.0.0。
    就内部而言,GMU的校园网由几个更小的网络组成,如各个系的局域网。所以IP地址的范围被分成254个子网,149.76.1.0到149.76.254.0。例如,理论物理系的分配的子网号是149.76.12.0。校园主干网本身就是一个网络,并给予子网号149.76.1.0。这些子网号共享同一个IP网络号,而第三个八位位组用于区别它们。因此,他们将使用一个子网掩码255.255.255.0。
    图2.1示出了guark的地址149.76.12.4作为一个普通的B类网和当使用子网技术时是如何有不同的解释的。
    子网(正如生成子网的技术声称)仅是网络的内部分割(internal division),并没有什么用。子网是由网络的拥有者(或管理员)生成的。常常,子网的建立是为了反映现存的物理上(如两个以太网之间)的、管理上(在两个系之间)的、或地理上的分界线,并且在这些子网上的权限被授权给某些联系人。然而,这个结构仅反映出网络的内部行为,对于外部世界它是完全不可见的。

    2.4.3 网关
    子网技术不仅有组织上的益处,它常常是一个自然的硬件分界线的结果。在一个给定的物理的(实际的)网络上,如以太网上,主机的通信范围是有限的:能够直接与之通信的主机是它所在网络上的主机。所有其它的主机仅能通过称为网关(gateways)的设备访问。网关是一台同时连接两个或多个物理网络的主机并配置成在这些网络之间交换分组。
    由于IP能够很容易地识别一台主机是否在一个本地物理网络上,不同的物理网络需要属于不同的IP网络。例如网络号149.76.4.0是保留给数学系局域网上的主机的。当给quark发送一个数据报时,erdos上的网络软件立刻会从IP地址149.76.12.4上看出,目的主机在另一个不同的物理网络上,因此可以通过一个网关(缺省的是sophus)到达那里。
    Sophus本身连接到两个不同的子网上:数学系和校园主干网上。它分别通过不同的接口,eth0和fddi0来访问这两个子网。现在,我们要给它分配那种IP地址呢?我们是否要给它一个在子网149.76.1.0的IP,或149.76.4.0网上的IP呢?
    答案是:两个都要。当与数学系局域网上的主机通信时,sophus就使用IP地址149.76.4.1,当与主干网上的主机通信时,它将使用ID地址149.76.1.4。
    因此,网关所连的每一个网络都要给网关分配一个IP地址。这些地址---及相应的网络掩码---被约束在相应的接口上,通过该接口子网可以进行访问。因此,sophus的接口与地址映射就看上去象这样的:
    iface address netmask
    eth0 149.76.4.1 255.255.255.0
    fddi0 149.76.1.4 255.255.255.0
    lo 127.0.0.1 255.0.0.0
    最后一个条目描述了回送接口lo,这在上面已介绍过。

    图2.2显示了Groucho Marx大学(GMU)的部分网络拓扑图。同时在两个子网上的主机有两个地址。
    图2.2 Groucho Marx大学(GMU)的部分网络拓扑图。

    一般来说,你可以忽略将地址附加到主机或它的接口之间的区别。对于仅在一个网上的主机,如erdos,你通常只需以这个以及那个地址来谈及主机,尽管严格地来说,是以太网接口有这个IP地址。然而,这种区别仅在谈论网关时显得重要。

    2.4.4 路由选择表
    我们现在将注意力集中在当分发一个数据报到远程网络时,IP是如何选择使用一个网关的。
    我们前面已经看到,当给quark发送一个数据报时,erdos检查目的地址并且发觉它不在本地网络上。Erdos因此将该数据报发送到缺省网关,sophus,它现在基本上面临同样的任务。Sophus注意到quark不在它直接连接的任何网络上,所以它必须找到另一个网关并通过该网关来转发数据报。正确的选择是到物理系的网关niels。此时,sophus需要一些信息将目的网络与适当的网关相联系。
    为此,IP所使用的路由选择信息基本上是一张表,该表将各网络与到达该网络要经过的网关链接在一起。还必须提供一个捕获所有分组的表项(缺省路由);这是与网络0.0.0.0相关的网关。所有发送到未知网络的分组都是通过该缺省路由器发送的。在sophus上,这张表看上去象这样:

    Network Gateway Interface
    149.76.1.0 - fddi0
    149.76.2.0 149.76.1.2 fddi0
    149.76.3.0 149.76.1.3 fddi0
    149.76.4.0 - eth0
    149.76.5.0 149.76.1.5 fddi0
    … …
    0.0.0.0 149.76.1.2 fddi0

    路由到sophus直接连接的网络是不需要路由器的;因此它们将网关条目显示为“-”。
    路由选择表可以通过各种方法来建立。对于小型局域网,在引导主机时通过手工使用路由器命令构造路由表,并将此表供给IP的做法通常是最有效的(见第五章)。对于大规模的网络,它们是通过路由选择后台服务程序在运行时刻建立并调整的;它们运行在网络的中央主机上并且与成员网络之间交换路由选择信息来确定“最佳”路由。
    根据网络大小的不同,将使用不同的路由选择协议。对于在自治系统内进行的路由选择(比如Groucho Marx校园),要使用内部路由协议(internal routing protocols)。最著名的一个是RIP,即路由信息协议(或称选路信息协议),它是由BSD的routed后台程序实现的。对于在自治系统之间的路由选择,必须使用外部路由协议(external routing protocols)象EGP(外部网关协议(External Gateway Protocol)),或BGP(边界网关协议(Border Gateway Protocol));这些(以及RIP)已经在Cornell大学的gated后台程序中实现。[3]

    2.4.5 度量值(Metric Values)
    基于RIP的动态选路(或路由选择)根据“跳数”选取到达某些目的主机或网络的最佳路径,也即,一个数据报在到达目的之前所经过的网关个数。路径越短,RIP性能越好。跳数多于或等于16的很长的路径被看作是无用的,并且被舍弃。
    要使用RIP来管理本地网络内部的路由信息,你必须在所有主机上运行gated。在启动引导时,gated会检测所有活动的(处于运行状态的)网络接口。如果有不止一个活动的接口(回送接口不算),就可假设主机在几个网络之间交换信息包,并且会积极地交换和广播路由信息。否则的话,主机只是被动地接收任何RIP更新信息,并且更新本地路由表。
    当在广播本地路由表中的信息时,gated从与路由表条目关联的称之为度量值(Metric value)的数值中计算路径的长度。这个度量值是系统管理员在配置路由时设定的,并且应该反映出这个路由的实际代价。因此,到主机直接连接的子网的路由的度量一定是零,而通过两个网关的路由的度量应该是2。然而,当你不使用RIP或gated时,就不必为度量而烦恼。

    2.5 互连网控制报文协议
    IP有一个相伴的协议我们至今还没有讨论,这就是互连网控制报文协议(Internet Control Message Protocol)(ICMP),用于内核中的网络代码与其它主机进行出错报文及其它的通信。例如,假设你又在erdos上并且想远程登录(telnet)到quark上的12345端口,但是并没有进程在侦听那个端口。当第一个TCP信息包到达quark的这个端口时,主机内的网络层将其识别出并且立刻给erdos返回一个ICMP报文,指出“端口不可达”。
    有相当多ICMP可以理解的报文,其中许多涉及到出错的情况。然而,有一个非常有趣的报文称为重定向报文(Redirect message)。它是由路由选择(选路)模块在检测到有其它主机正使用它作为一个网关时产生的,尽管可能存在一个更短的路由。例如,在主机引导后,sophus的路由选择表可能并不完整,含有到数学系网络的路由和到FDDI主干网的路由,并且缺省路由是指向Groucho 计算中心的网关(gcc1)。因此,任何发送到quark的信息包将被送至gcc1而不是送到物理系的网关niels。当接收到这样一个数据报时,gcc1将注意到这是一个不良的路由,并且会将这个信息包转发到niels,同时给sophus返回一个ICMP重定向报文告诉它这个更好的路由。
    现在,除了最基本的路由外,这好象是避免手工设置其它路由的聪明方法。然而,这里要给出警告,如果要依赖于RIP或ICMP重定向报文的动态选路方案,并不总是一个好主意。ICMP重定向以及RIP在验证某个选路信息是否需要权限方面很少提供或几乎不提供选择。这使得怀有恶意的无用之人能够中断你的整个网络的通信,或者更糟。由于这个原因,有些网络代码的版本将影响网络路由的重定向报文看作仅是主机路由的重定向。

    2.6 域名系统
    2.6.1 主机名解析
    如前所述,TCP/IP网络中的编址是围绕着32比特的数字的,然而,想多记住几个也是很难的。因此,通常主机都用“普通”的名字命名,如gauss或strange。这时,找出与名字相关的IP地址就是程序的职责了。这个过程称为主机名解析(host name resolution)。
    一个想要找出给定主机名的IP地址的应用程序不一定要提供自己的例程来查找主机以及IP地址。相反地,它依赖于显然是做这个工作的几个库函数,称为gethostbyname(3)和gethostbyaddr(3)。传统上,这些以及一些相关的过程被组合成一个独立的库,称为解析库(resolver library);在Linux上,这些是标准libc的部分。通俗地说,这个函数的集合因而被称为“解析器”(the resolver)。
    如今,在一个象以太网一样的小网上,或者甚至是一族以太网上,维护一张映射主机名到地址的表并不是十分困难的事。该信息通常被存放在文件/etc/hosts中。当增加或移走主机,或重新分配地址时,你所要做的就是更新所有主机上的hosts文件。很明显,当网络不仅仅是由少数几台机器组成时,这将成为繁重的负担。
    针对这个问题的一个解决方案是NIS,即有Sun Microsystems开发的网络信息系统(Network Information System),通俗地称为YP,或者黄页(Yellow Pages)。NIS在主主机上将hosts文件(以及其它信息)存储在一个数据库里,客户可以从中检索所需的信息。不过,这个方法只适应中等大小的网络如局域网,因为它涉及到集中地维护整个主机数据库,并且把它分发到所有服务器上。
    在互连网上,地址信息最初也是存储在一个HOSTS.TXT数据库中的。这个文件原是由网络信息中心(Network Information Center),即NIC,来维护的,并且所有参与站点都需要下载并安装。当网络增长时,这种方案带来了几个问题。除了涉及定期安装HOST.TXT的额外管理方面的开销外,分发这个库的服务器负荷变得太高了。更为严重的问题是所有的名字必须在NIC登记,它必须确定没有重名存在。
    这就是为什么在1984年采用了一个新的名字解析方案,即域名系统(Domain Name System)。DNS是由Paul Mockapetris设计的,同时能解决这两个问题。

    2.6.2 进入DNS
    DNS用域的层次结构来组织主机名。一个域是在某些方面相关的站点的一个集合---由于他们组成了一个特有的网络(例如,校园内的所有机器,或BITNET上的所有主机),因为它们都属于某个机构(就象美国政府),或者因为它们只是在地理位置上比较靠近。例如,大学被(组合)分组在edu域,每个大学或学院使用一个独立的子域(subdomain),在子域下面包含它们的主机。Groucho Marx大学可以给予groucho.edu域,数学系的局域网指定为maths.groucho.edu。系部网络上的主机将有这个域名附加在它们的主机名后;所以erdos被认为是erdos.maths.groucho.edu。这被称为全资域名(fully qualified domain name),或FQDN,它在世界范围内唯一地标识出该主机。

    图2.3 部分域名空间。

    图2.3示出了名字空间的一部分。这棵树的根的入口是用一个点(dot)来表示的,它被很恰当的称作根域(root domain),并且包含了所有其它域。为了指出一个主机名是一个全资域名,而不是一个与某个(隐含的)本地域相关的名字,有时会写上一个附加点。这表示这个名字的最后的组成部分是根域。
    依赖它在层次结构中的位置,一个域可以被称为是顶层、第二层、或第三层的。还可以再划分出分层,但很好这样做。你会常看到以下几个顶层域:

    edu (大部分在美国) 教育机构如大学等。

    com 商业机构、公司。

    org 非商业机构。常常是私有UUCP网络在这个域中。

    net 网络上的网关以及其它的管理主机。

    mil 美国军事机构。

    gov 美国政府机构。

    uucp 具官方称,以前用作无域名的UUCP名字的所有站点名,已被移入该域。

    技术上来说,以上的头四个属于Internet的美国部分,但你可能在这几个域中还是能见到不是美国的站点。Net域尤其是这样。然而,mil和gov是美国专有的。
    在美国以外的地方,每个国家通常在两字符国家代码(在ISO-3166中定义)后面使用一个她自己命名的顶层域。例如,芬兰(Finland)使用fi域,fr由法国(France)使用,de由德国(Germany)使用,au由澳大利亚(Australia)使用,cn由中国(China)使用等等。在这个顶层域下面,每个国家的NIC可以自由地以他们想要的方式组织主机名。例如,澳大利亚有一个与国际顶层域相似的次层域,命名为com.au,edu.au,等等。其他国家,如德国,不使用这一额外层,而是使用直接引用运行一特定域的机构的稍长些的名字。例如,象ftp.informatik.uni-erlangen.de这样的主机名并非少数。由此可见德国人的效率如何了。
    当然,这些国家的域并不意味着在该域下的主机实际上一定位于那个国家之中;这仅仅说明这台主机是在那个国家的NIC注册登记的。一个瑞典(Swedish)的厂商可能在澳大利亚有一分支机构,但他的所有主机仍然注册为se顶层域。
    现在,以域名的层次结构来组织名字空间很好地解决了名字的唯一性问题;利用DNS,一台主机的名字只需在它的域中是唯一的,就可以在世界范围内有一个与所有其它主机不同的名字了。此外,全资名称是很容易记忆的。就其本身而言,这些已是将大的域分割成几个子域的很好的理由了。
    但是,DNS甚至为你比这做得更多:它允许你将子域权限授权给它(子域)的管理者。例如,在Groucho 计算中心的维护者可以为每个系部创建一个子域;在上面我们已经遇见了maths和physics子域了。当他们发现物理系的网络太大了,而且从外界来看混乱而难以管理(总之,物理学家是一类不受拘束的人),他们就可以简单地将physics.groucho.edu域的控制权交给这个网络的管理员。这样,他们就可以自由地使用他们喜欢的无论什么样的主机名了,并且可以以各种方式在他们的网络中分配IP地址了,而不需要外界的干涉。
    在本小节结束时,我们还要说一下,名字空间可以分成区(zones),每个区根于一个域。请注意区与域的细微差别:域groucho.edu包括Groucho Marx大学的所有主机,而区仅包括计算中心直接管理的主机,例如那些在数学系的主机。在物理系的主机就属于一个不同的区,也即physics.groucho.edu。在图2.3中,区的开始是在域名的右侧用小圆圈标出的。

    2.6.3 用DNS进行名字查找
    第一眼看上去,所有这些域和区的麻烦似乎使得名字解析成为一件非常复杂的事情了。毕竟,如果没有中心权威控制什么名字分配给哪台主机的话,那么推知它将是一个多么粗陋的程序啊?!
    现在讨论有关DNS的真正精华(自然,坦白,直率)的部分了。如果你想找出erdos的IP地址,那么,DNS会说,去问管理它的人,他们会告诉你。
    实际上,DNS是一个巨大的分布式数据库。它是依靠所谓的名字服务器来实现的,名字服务器为一个给定的域或一组域提供信息。对于每一个区,起码有两个、最多有几个的名字服务器,在那个区的主机上掌握着所有的权威信息。为了得到erdos的IP地址,你所要做的只是联系groucho.edu区的名字服务器,名字服务器将返回你所期望的数据。
    你可能会想,说起来容易做起来难。那么我怎样知道如何达到Groucho Marx大学的名字服务器呢?如果你的计算机没有配备一个地址解析程序,DNS也能提供这个能力。当你的应用程序想要在erdos上查找信息时,它就会与本地名字服务器联系,该名字服务器会为它处理一个迭代查询。它首先向根域的名字服务器发出一个查询,询问erdos.maths.groucho.edu的地址。根名字服务器注意到这个名字不属于它的管理权限范围内,而是属于edu域下的某个。因此,它告诉你与edu区的名字服务器联系以取得更详细的信息,并且给了所有一张edu的名字服务器及其地址的列表。此时,你的本地名字服务器将继续执行并查询那些edu的名字服务器之一,例如a.isi.edu。和根名字服务器同样的方式,a.isi.edu知道groucho.edu运行于他们自己的区里,并且使你指向他们的服务器。现在,本地名字服务器将自己的查询发送到这些服务器之一上,这将最终认可这个属于它的区的名字,并且返回相应的IP地址。
    现在,看上去为了查找一个小小的IP地址为产生许多的通信量,但是,如果我们仍然使用HOSTS.TXT的话,所产生的数据传送量要比上述方法大的多。但是这个方案还有需要改进的地方。
    为了改善将来查询的响应时间,名字服务器将在其本地缓冲中存储所获得的信息。所以当下次你的本地网络上有任何人想要查找在groucho.edu域上主机的地址时,你的名字服务器就不用再次经历整个过程,而是会直接到groucho.edu名字服务器上。[4]
    当然,名字服务器并不会永远保留这个信息的,而是会在一定时间后放弃的。这个到期间隔时间称为存活期(time to live),或TTL。DNS数据库中的每一数据都有相应责任区的管理员指定的TTL。

    2.6.4 域名服务器
    拥有一个区内所有主机信息的名字服务器被称为该区授权的(authoritative),并且有时称之为主名字服务器(master name servers)。对该区内主机的任何查询都将最终绕回到这些主名字服务器之一上。
    为了提供与一个区一致的描述,它的主服务器必须很好地同步。这是通过使他们其中之一成为主要(最初、原始)的(primary)服务器来达到的,它从数据文件中装入区信息,并且使别的服务器成为次要(第二位)的(secondary)服务器,并从主要服务器中周期性地传入区数据。
    有几个名字服务器的一个原因是为了分散工作负荷,其它的原因是为了有容余备份。当一个名字服务器机器毫无准备地出了故障,如崩溃了或失去了网络连接,所有的查询都将回送到其它的服务器上。当然,这个方案并不会保护你免受服务器故障而产生对所有DNS请求的错误应答,例如,由于服务器程序本身的软件错误。
    当然,你也可以运行一个没有为任何域授权的名字服务器。[5] 不过这类服务器也是有用的,因为它还是可以为运行于本地网络上的应用程序管理DNS查询的,并缓冲所得信息。因此,它被称为只缓冲(caching-only)服务器。

    2.6.5 DNS数据库
    通过上面我们已经知道,DNS不仅仅是只处理主机的IP地址,而且还交换名字服务器上的信息。实际上,DNS数据库可以有许多不同类型条目。
    DNS数据库上的一条信息称为一个资源记录(resource record),或简写成RR。每一条记录都有一种与之关联的类型,描述了它所表示的数据,以及一个指明它所适用的网络类型的类。后者用于适应(或调节)不同编址方案的需要,象IP地址(IN类)、或Hesiod网络的地址(在MIT使用)、以及其它一些。原型资源记录类型是A记录,它将一个全资域名与一个IP地址相联合。
    当然,一台主机可以有不止一个名字。然而,其中一个名字必须指定为正式的,或者是正规主机名(canonical host name),而其它的名字只是前者的别名。它们之间的区别在于正规主机名是与一个A记录关联的,而其它名字只有一个指向正规主机名的CNAME类型的记录。
    这里我们将不讨论所有的记录类型,而是留在后面的章节中讨论。这里只给出一个简短的例子。图2.4显示出了装入physics.groucho.edu区的名字服务器中的域名数据库的一部分。

    ;
    ; Authoritative Information on physics.groucho.edu
    @ IN SOA {
    niels.physics.groucho.edu.
    hostmaster.niels.physics.groucho.edu.
    1034 ; serial no
    360000 ; refresh
    3600 ; retry
    3600000 ; expire
    3600 ; default ttl
    }
    ;
    ; Name servers
    IN NS niels
    IN NS gauss.maths.groucho.edu.
    gauss.maths.groucho.edu. IN A 149.76.4.23
    ;
    ; Theoretical Physics (subnet 12)
    niels IN A 149.76.12.1
    IN A 149.76.1.12
    nameserver IN CNAME niels
    otto IN A 149.76.12.2
    quark IN A 149.76.12.4
    down IN A 149.76.12.5
    strange IN A 149.76.12.6
    ...
    ; Collider Lab. (subnet 14)
    boson IN A 149.76.14.1
    muon IN A 149.76.14.7
    bogon IN A 149.76.14.12
    ...

    图2.4 物理系named.hosts文件的摘录。

    除了A和CNAME记录以外,在该文件的顶部还可以看到一条特殊的记录,延伸了几行。这是SOA资源记录,意思是授权的开始(Start of Authority),它保留着服务器授权的区的常用信息。例如,它包括所有记录缺省的存活期信息。
    注意,例子文件中所有不以点结尾的名字将被解释成是相对于groucho.edu域的。用于SOA记录的特别名字“@”是指域名本身。
    从上面我们已经知道,groucho.edu域的名字服务器必需知道有关物理系的区,这样它们就可以将查询传给它们的名字服务器了。这常常是通过一对记录来完成的:给出服务器的FQDN的NS记录、以及一个关联地址和那个名字的A记录。由于这两个记录一起控制着名字空间,它们常被称为粘合记录(glue records)。它们是仅有的记录实例,在该记录中父辈区保存着下属区中主机的信息。指向physics.groucho.edu的名字服务器的粘合记录见图2.5所示。

    ;
    ; Zone data for the groucho.edu zone.
    @ IN SOA {
    vax12.gcc.groucho.edu.
    hostmaster.vax12.gcc.groucho.edu.
    233 ; serial no
    360000 ; refresh
    3600 ; retry
    3600000 ; expire
    3600 ; default ttl
    }
    ....
    ;
    ; Glue records for the physics.groucho.edu zone
    physics IN NS niels.physics.groucho.edu.
    IN NS gauss.maths.groucho.edu.
    niels.physics IN A 149.76.12.1
    gauss.maths IN A 149.76.4.23
    ...

    图2.5 GMU的named.hosts文件的摘录。

    2.6.6 逆向查找(Reverse Lookups)
    除了查找属于一个主机的IP地址以外,有时也需要找出一个与地址相应的正规主机名来。这称为逆向映射(reverse mapping),被一些网络服务用于验证客户的身份。当使用单个hosts文件时,逆向查找只是简单地包括在文件中搜索拥有指定IP地址的主机。有了DNS,对名字空间进行一次彻底的搜索当然就不可能了。取而代之的是,已经创建了一个特殊的域,in-addr.arpa,它以reverted dotted-quad表示法包括所有主机的IP地址。例如,与IP地址149.76.12.4相应的名字是4.12.76.149.in-addr.arpa。连接这些名字到它们的正规主机名的资源记录类型是PTR。
    建立一个授权的区通常意味着给予它的管理员分配地址给名字的完全控制。由于他们手头上常常有一个或更多个IP网络或子网,在DNS区与IP网络之间是一个一对多的映射。例如,物理系是由子网149.76.8.0、149.76.12.0、149.76.14.0组成的。
    作为结果,必须在in-addr.arpa域中随同物理区一起建立新的区并且委派该系的网络管理员为代表:8.76.149.in-addr.arpa、12.76.149.in-addr.arpa、以及14.76.149.in-addr.arpa。否则的话在碰撞实验室(Collider Lab)安装一台新主机就需要与他们的上级域联系,将这个新的地址加入他们的in-addr.arpa区文件中。
    子网12的区数据库见图2.6所示。他们父辈区数据库中相应的粘合记录见图2.7所示。

    ;
    ; the 12.76.149.in-addr.arpa domain.
    @ IN SOA {
    niels.physics.groucho.edu.
    hostmaster.niels.physics.groucho.edu.
    233 360000 3600 3600000 3600
    }
    2 IN PTR otto.physics.groucho.edu.
    4 IN PTR quark.physics.groucho.edu.
    5 IN PTR down.physics.groucho.edu.
    6 IN PTR strange.physics.groucho.edu.

    图2.6 子网12的named.rev文件的摘录。

    ;
    ; the 76.149.in-addr.arpa domain.
    @ IN SOA {
    vax12.gcc.groucho.edu.
    hostmaster.vax12.gcc.groucho.edu.
    233 360000 3600 3600000 3600
    }
    ...
    ; subnet 4: Mathematics Dept.
    1.4 IN PTR sophus.maths.groucho.edu.
    17.4 IN PTR erdos.maths.groucho.edu.
    23.4 IN PTR gauss.maths.groucho.edu.
    ...
    ; subnet 12: Physics Dept, separate zone
    12 IN NS niels.physics.groucho.edu.
    IN NS gauss.maths.groucho.edu.
    niels.physics.groucho.edu. IN A 149.76.12.1
    gauss.maths.groucho.edu. IN A 149.76.4.23
    ...
    图2.7 网络149.76的named.rev文件的摘要。

    如此的一个重要结论是,只能以IP网络的超集来建立区,并且,更严重的是,这些网络的网络掩码必须以字节为界。Groucho Marx大学的所有子网的掩码都是255.255.255.0,据此,可以为每个子网建立一个in-addr.arpa区。然而,如果网络掩码是255.255.255.128,那么为子网149.76.12.128建立区是不可能的,因为没有办法告知DNS 12.76.149.in-addr.arpa域已被分成了两个授权的区,两个区的主机名范围分别是1到127,和从128到255。


    注释
    [1] 通常,IP地址是由你出资的IP连接提供者那里分配给你的。然而,通过给[email protected]发一个邮件,你也可以为你的网络直接向NIC申请一个IP地址。
    [2] 然而,自治系统稍微更通用些,他们可以由多于一个IP网络组成。
    [3] 许多人认为routed已停用。由于geted也支持RIP,因此最好选用它。
    [4] 如果它不这样,那么DNS就会象其它方法一样的糟糕,因为每次的查询都将包括根名字服务器。
    [5] 唔,几乎是这样。名字服务器至少应该为localhost以及127.0.0.1的反向查找提供名字服务。
    发布人:netbull 来自:Linux自由鸽