TCPIP基础:DNS DHCP ICMP和ARP协议

TCP/IP基础:DNSDHCPICMP和ARP 协议DNS 的来由如果您为您的机器设定过 internet 连线﹐那么您一定接触过 DNS 了﹐但 DNS 又是什么东东呢﹖说穿了﹐DNS 是用来帮助

TCP/IP基础:DNSDHCPICMP和ARP 协议

DNS 的来由

如果您为您的机器设定过 internet 连线﹐那么您一定接触过 DNS 了﹐但 DNS 又是什么东东呢﹖说穿了﹐DNS 是用来帮助记忆网路位址的﹐完全是为了迁就人类的记忆思维而设的。

DNS 的全称是 Domain Name System(或 Service) ﹐当您连上一个网址﹐在URL 打上﹕www.google.com 的时候﹐可以说就是使用了 DNS 的服务了。但如果您知道这个 www.google.com 的 IP 位址﹐直接输入 216.239.53.101 也同样可以到达这个网址。其实﹐电脑使用的只是 IP 位址而已(最终也是 0 和 1 啦) ﹐这个 www.google.com 只是让人们容易记忆而设的。因为我们人类﹐对一些比较有意义的文字记忆(如﹕www.google.com) ﹐比记忆那些毫无头绪的号码(如﹕216.239.53.101) ﹐往往容易得多。DNS 的作用就是为我们在文字和 IP 之间担当了翻译﹐而免除了强记号码的痛苦。

假如您的电话有名字记忆功能﹐您只需知道对方的名字﹐就可以拨号给友人了﹐我们可以说﹐这电话也具备如 DNS 的功能了呢﹗但是﹐我们在网路中使用的 DNS 系统﹐就是这么简单吗﹖非也﹐复杂得很呢﹗下面﹐就让我们一起去探索一下 DNS 的奥秘﹕

在早期的 IP 网路世界里面﹐每台电脑都只用 IP 位址来表示﹐不久人们就发现这样很难记忆﹐于是﹐一些Unix 的管理者﹐就建立一个 HOSTS 对应表﹐将 IP 和主机名字对应起来﹐这样﹐用户只需输入电脑名字﹐就可以代替 IP 来进行沟通了。如果你安装了 Linux 系统﹐在 /etc下面就可以找到这个 hosts 档案﹔在 NT 的系统里﹐你也可以在 winntsystem32driversetc下面找到它。不过这个 HOSTS 档是要由管理者手工维护的﹐最大的问题是无法适用于大型网路﹐而且更新也是件非常头痛的事情。这就是 DNS 大派用场的时候了。 DNS 的结构

DNS 是一个分层级的分散式名称对应系统﹐有点像电脑的目录树结构﹕在最顶端的是一个“root”﹐然后其下分为好几个基本类别名称﹐如﹕com ﹑org ﹑edu 等﹔再下面是组织名称﹐如﹕IBM ﹑Microsoft ﹑intel 等﹔继而是主机名称﹐如﹕www ﹑mail ﹑ftp 等。因为当初 internet 是从美国发展起的﹐所以当时并没有国域名称﹐但随着后来 internet 的蓬勃发展﹐DNS 也加进了诸如tw ﹑hk ﹑cn 等国域名称。所以一个完整的dns 名称就好象是这样的﹕www.xyz.com.tw ﹐而整个名称对应的就是一个(或多个) IP 位址了。 在早期的设计下﹐root 下面只有六个组织类别﹕

,

不过﹐自从组织类别名称开放以后﹐各种各样五花八门的名称也相继涌现出来了﹐但无论如何﹐取名的规则最好尽量适合网站性质。除了原来的类别资料由美国本土的 NIC(Network Information Center) 管理之外﹐其它在国域以下的类别分别由该国的 NIC 管理(比方说台湾的 DNS 将授权给twnic 来管理) 。这样的结构看起来就像这样﹕

在结构中﹐各组织的 DNS 经过申请后由该组织或其委托主机管理(通常当您申请注册一个 domain 域名称的时候﹐都要指定两台 DNS 主机负责该域名的 DNS 管理) 。

DNS 的运作

在我们设定 IP 网路环境的时候﹐都要告诉每台主机关于 DNS 伺服器的位址(我们可以手动的在每一台主机上面设置﹐也可以使用 DHCP 来指定) 。但这设定的义意何在呢? 从前面的介绍我们或可知道:其目的就是请 DNS 帮忙解析主机名称与 IP 位址啦。在这个设定过程中,DNS 被称为 resolver (也就是负责解析的 DNS Server),而被设定主机,则只是单纯的 DNS Client 了,也就是提出解析请求的主机。

下面让我们看看 DNS 是怎样运作的﹕

,

1. 当被询问到有关本域名之内的主机名称的时候﹐DNS 伺服器会直接做出回答﹔

2. 客户端向伺服器提出查询项目﹔

3. 当被询问到有关本域名之内的主机名称的时候﹐DNS 伺服器会直接做出回答﹔

4. 如果所查询的主机名称属于其它域名的话﹐会检查快取记忆体(Cache)﹐看看有没有相关资料﹔

5. 如果没有发现﹐则会转向 root 伺服器查询﹔

6. 然后 root 伺服器会将该域名之下一层授权(authoritative)伺服器的位址告知(可能会超过一台) ﹔

7. 本地伺服器然后会向其中的一台伺服器查询﹐并将这些伺服器名单存到记忆体中﹐以备将来之需(省却再向 root 查询的步骤) ﹔

8. 远方伺服器回应查询﹔

9. 若该回应并非最后一层的答案,则继续往下一层查询,直到获的客户端所查询的结果为止﹔

10. 将查询结果回应给客户端﹐并同时将结果储存一个备份在自己的快取记忆里面﹔

11. 如果在存放时间尚未过时之前再接到相同的查询﹐则以存放于快取记忆里面的资料来做回应。

从这个过程我们可以看出﹐没有任何一台 DNS 主机会包含所有域名的 DNS 资料﹐资料都是分散在全部的 DNS 伺服器中﹐而 NIC 只需知道各 DNS 伺服器位址就可以了。

为了更好地理解一下 DNS 的运作﹐让我们用下图看看查询

www.home.netman.com.tw 这台主机位址的过程﹕

,

在这个例子中﹐www.home.netman.com.tw 台主机的 DNS 对应资料﹐是由负责 home.netman.com.tw 这个域名的 DNS 伺服器管理的。(在 DNS 术语中﹐我们称一个域名为“zone”﹐这个 zone 可以是您从 NIC 申请回来的域名﹐也可以是从该域名之下延伸出来的“sub-zone”)。在这台 DNS 伺服器上面﹐必须有一个关于 home.netman.com.tw 这个 zone 的档案﹐而这档案里面必须有一笔关于 www 的记录(任何主机都是以“记录”来表示,称为 Resource Record) 。这个记录可以为一个 IP 位址﹐也可以以别名形式来对应一台主机名称﹐但无论如何﹐所对应的主机名称最终是要被一个 IP 位址所对应着就是了。 同时﹐DNS 还能提供“反查询”(reverse lookup) 功能﹐也就是以 IP 来查询主机名称。网路上面的许多服务﹐如﹕FTP, SMTP﹑等等﹐都需要到这个功能。其实﹐DNS 服务本身就必须要使用反查询功能﹐而且在设定上﹐也必须要为每个网路建立起 reverse zone。虽然有些人发觉即使没有 reverse zone 也可以使用到 DNS 服务﹐但其中弊端却不容易被察觉到﹐在这个(中文) 网页﹕

DNS 的名称记录

事实上﹐DNS 不仅仅是用来解释位址用的﹐而且还可以回答更多关于网路和主机的其它信息﹐其中很重要的一个功能就是可以供邮件系统进行路由。这些资料﹐通常会以不同的“记录”名称出现在DNS 的资料档案中。下面让我们参考一个 Linux 的 DNS 档案﹐看看这些记录是如何表示的﹕

,

;; Zone file for siyongc.domain;; Then full zone file;$TTL 86400@ IN SOA RedHat 52.siyongc.domain. netman.siyongc.domain. (1999092801 ;

serial8H ; refresh2H ; retry1W ; expire1D ) ; minimun;IN TXT "A test domain, created by Netman"IN NS RedHat 52IN NS debian.homeIN MX 10

redhat52.siyongc.domain.IN MX 20 debian.home;localhost IN A 127.0.0.1﹔gw IN A 192.168.0.17IN HINFO "Redhat" "MASQ"IN TXT "The masquerade

gateway to internet"﹔redhat52 IN A 192.168.0.17IN MX 10 redhat52IN MX 20 debian.homeIN HINFO "Dell PII 266" "Linux RedHat"www IN CNAME

redhat52mail IN CNAME redhat52ftp IN CNAME redhat52news IN CNAME redhat52smtp IN CNAME redhat52﹔pii266 IN A 192.168.0.15IN MX 10 redhat52.siyongc.domain.IN MX 20 debian.home.﹔slware36 IN A

192.168.0.18IN MX 10 redhat52.siyongc.domain.IN MX 20 debian.home.﹔rhroute IN A 192.168.0.4IN MX 10 redhat52.siyongc.domain.IN MX 20

debian.home. ﹔home IN ns debian.home.siyongc.domain.debian.home IN A 10.0.2.101

我们姑且不理会开头那几行的意思﹐那是给 DNS 系统本身使用的(我将会在“学习 Linux”文章里面再详细讨论) ﹐这里我们只是看看几个记录名称而已﹕

分擔 DNS 工作

由於 DNS 的重要性日益顯著,為提高其容錯能力及查詢效能,我們在架設某一單一 zone 的時侯,常以多台伺服器來負責該 zone 的服務。其中,我們必需指定一台 Primary(master) DNS 伺服器,它是架設在某一個網域下被主要授權並控制所有名稱記錄的主控伺服器﹐管轄著該網域的所有記錄資料﹐這些記錄資料只有 primary(master) 可以修改。

,

但如果在一個比較大型的網路中﹐DNS 伺服器就會變得很繁忙﹐所以您可以設定多個 DNS 來分擔 master 的工作﹐但您或許不願意到每一個 DNS 伺服器去更新資料吧﹖而且就算您願意這樣做﹐也容易出現錯誤或資料不同步的情形。這樣您可以設定其它的伺服器為 secondary (slave) DNS 來複製 master 上面的記錄資料﹐這樣﹐其它的電腦可以被分派到不同的 DNS 做查詢﹐既可以分擔 master 的工作﹐而且資料也可以自動進行同步工作。為確保資料的一致性,master 每次更新過資料後會以 notify 機制主動通知 slave 前來同步。此外,您可以設定 DNS 資料同步的時間間隔﹐在dns 檔案中的 Refresh 設定就是了。 经过了前面的学习,相信您不再认为设定与管理 TCP/IP 网路是件轻松的事情。要成功的将您的网路用 TCP/IP 连接起来,您就得为每台电脑设定 IP 、mask 、gateway 、等等繁琐的事情。

要是您想管理好一个比较大的网路﹐或是电脑节点经常改变(如手提电脑或拨接) ﹐这样的工作可以说是非常令人讨厌的﹐而且出错的机会也比较多。要是,万一日后要进行 IP 重新规划﹐其工作量也是相当惊人的。

面对这些情形﹐DHCP 可以说您的菩萨了﹕它不但救苦救难﹐而且神通广大。

什么是 DHCP?

DHCP 是 Dynamic Host Configuration Protocol 之缩写﹐它的前身是 BOOTP 。BOOTP 原本是用于无磁碟主机连接的网路上面的﹕网路主机使用 BOOT ROM 而不是磁碟起动并连接上网路﹐BOOTP 则可以自动地为那些主机设定 TCP/IP 环境。但 BOOTP 有一个缺点:您在设定前须事先获得客户端的硬体位址,而且,与 IP 的对应是静态的。换而言之,BOOTP 非常缺乏 " 动态性" ,若在有限的 IP 资源环境中,BOOTP 的一对一对应会造成非常可观的浪费。

DHCP 可以说是 BOOTP 的增强版本﹐它分为两个部份﹕一个是伺服器端﹐而另一个是客户端。所有的 IP 网路设定资料都由 DHCP 伺服器集中管理﹐并负责处理客户端的 DHCP 要求﹔而客户端则会使用从伺服器分配下来的IP 环境资料。比较起 BOOTP ,DHCP 透过 " 租约" 的概念,有效且动态的分配客户端的 TCP/IP 设定,而且,作为兼容考量,DHCP 也完全照顾了 BOOTP Client 的需求。

DHCP 的分配形式

首先﹐必须至少有一台 DHCP 工作在网路上面﹐它会监听网路的 DHCP 请求﹐并与客户端搓商 TCP/IP 的设定环境。它提供两种 IP 定位方式﹕ Automatic Allocation

,

自动分配﹐其情形是﹕一旦 DHCP 客户端第一次成功的从 DHCP 伺服器端租用到 IP 位址之后﹐就永远使用这个位址。

Dynamic Allocation

动态分配﹐当 DHCP 第一次从 HDCP 伺服器端租用到 IP 位址之后﹐并非永久的使用该位址﹐只要租约到期﹐客户端就得释放(release)这个 IP 位址﹐以给其它工作站使用。当然﹐客户端可以比其它主机更优先的延续(renew)租约﹐或是租用其它的 IP 位址。

动态分配显然比自动分配更加灵活﹐尤其是当您的实际 IP 位址不足的时候﹐例如﹕您是一家 ISP ﹐只能提供 200 个IP 位址用来给拨接客户﹐但并不意味着您的客户最多只能有 200 个。因为要知道﹐您的客户们不可能全部同一时间上网的﹐除了他们各自的行为习惯的不同﹐也有可能是电话线路的限制。这样﹐您就可以将这 200 个位址﹐轮流的租用给拨接上来的客户使用了。这也是为什么当您查看 IP 位址的时候﹐会因每次拨接而不同的原因了(除非您申请的是一个固定 IP ﹐通常的 ISP 都可以满足这样的要求﹐这或许要另外收费) 。当然﹐ISP 不一定使用 DHCP 来分配位址﹐但这个概念和使用 IP Pool 的原理是一样的。

DHCP 除了能动态的设定 IP 位址之外﹐还可以将一些 IP 保留下来给一些特殊用途的机器使用﹐它可以按照硬体位址来固定的分配 IP 位址﹐这样可以给您更大的设计空间。同时﹐DHCP 还可以帮客户端指定 router ﹑netmask ﹑DNS Server﹑WINS Server﹑等等项目﹐您在客户端上面﹐除了将 DHCP 选项打勾之外﹐几乎无需做任何的 IP 环境设定。

DHCP 的工作原理

视乎客户端是否第一次登录网路﹐DHCP 的工作形式会有所不同。 第一次登录的时候﹕

1. 寻找 Server 。当 DHCP 客户端第一次登录网路的时候﹐也就是客户发现本机上没有任何 IP 资料设定﹐它会向网路发出一个 DHCPDISCOVER 封包。因为客户端还不知道自己属于哪一个网路﹐所以封包的来源位址会为 0.0.0.0 ﹐而目的位址则为 255.255.255.255 ﹐然后再附上Dhcpdiscover 的信息﹐向网路进行广播。

在Windows 的预设情形下,Dhcpdiscover 的等待时间预设为 1 秒﹐也就是当客户端将第一个Dhcpdiscover 封包送出去之后﹐在 1 秒之内没有得到回应的话﹐就会进行第二次Dhcpdiscover 广播。若一直得不到回应的情况下﹐客户端一共会有四次Dhcpdiscover 广播(包括第一次在内) ﹐除了第一次会等待 1 秒之外﹐其余三次的等待时间分别是 9﹑13﹑16 秒。如果都没有得到 DHCP 伺服器的回应﹐客户端则会显示错误信息﹐宣告Dhcpdiscover 的失败。之后﹐基于使用者的选择﹐系统会继续在 5 分钟之后再重复一次Dhcpdiscover 的过程。

,

2. 提供 IP 租用位址。当 DHCP 伺服器监听到客户端发出的Dhcpdiscover 广播后﹐它会从那些还没有租出的位址范围内﹐选择最前面的的空置 IP ,连同其它 TCP/IP 设定,回应给客户端一个 DHCPOFFER 封包。

由于客户端在开始的时候还没有 IP 位址﹐所以在其Dhcpdiscover 封包内会带有其 MAC 位址信息﹐并且有一个 XID 编号来辨别该封包﹐DHCP 伺服器回应的Dhcpoffer 封包则会根据这些资料传递给要求租约的客户。根据伺服器端的设定﹐Dhcpoffer 封包会包含一个租约期限的信息。

3. 接受 IP 租约。如果客户端收到网路上多台 DHCP 伺服器的回应﹐只会挑选其中一个Dhcpoffer 而已(通常是最先抵达的那个) ﹐并且会向网路发送一个Dhcprequest 广播封包﹐告诉所有 DHCP 伺服器它将指定接受哪一台伺服器提供的 IP 位址。

同时﹐客户端还会向网路发送一个 ARP 封包﹐查询网路上面有没有其它机器使用该 IP 位址﹔如果发现该 IP 已经被占用﹐客户端则会送出一个 DHCPDECLINE 封包给 DHCP 伺服器﹐拒绝接受其Dhcpoffer ﹐并重新发送Dhcpdiscover 信息。

事实上﹐并不是所有 DHCP 客户端都会无条件接受 DHCP 伺服器的 offer ﹐尤其这些主机安装有其它 TCP/IP 相关的客户软体。客户端也可以用

Dhcprequest 向伺服器提出 DHCP 选择﹐而这些选择会以不同的号码填写在 DHCP Option Field 里面﹕

换一句话说﹐在 DHCP 伺服器上面的设定﹐未必是客户端全都接受﹐客户端可以保留自己的一些 TCP/IP 设定。而主动权永远在客户端这边。

4. 租约确认。当 DHCP 伺服器接收到客户端的Dhcprequest 之后﹐会向客户端发出一个 DHCPACK 回应﹐以确认 IP 租约的正式生效﹐也就结束了一个完整的 DHCP 工作过程。

如上的工作流程如下图:

,

DHCP 发放流程

第一次登录之后﹕

一旦 DHCP 客户端成功地从伺服器哪里取得 DHCP 租约之后﹐除非其租约已经失效并且 IP 位址也重新设定回 0.0.0.0 ﹐否则就无需再发送

Dhcpdiscover 信息了﹐而会直接使用已经租用到的 IP 位址向之前之 DHCP 伺服器发出Dhcprequest 信息﹐DHCP 伺服器会尽量让客户端使用原来的 IP 位址﹐如果没问题的话﹐直接回应Dhcpack 来确认则可。如果该位址已经失效或已经被其它机器使用了﹐伺服器则会回应一个 DHCPNACK 封包给客户端﹐要求其从新执行Dhcpdiscover 。

至于 IP 的租约期限却是非常考究的﹐并非如我们租房子那样简单﹐以 NT 为例子﹕DHCP 工作站除了在开机的时候发出dhcprequest 请求之外﹐在租约期限一半的时候也会发出dhcprequest ﹐如果此时得不到 DHCP 伺服器的确认的话﹐工作站还可以继续使用该 IP ﹔然后在剩下的租约期限的再一半的时候(即租约的75)﹐还得不到确认的话﹐那么工作站就不能拥有这个 IP 了。至于为什么不是到租约期限完全结束才放弃 IP 呢﹖﹐对不起﹐小弟也是不学无术之人﹐没有去深究了﹐只知道要回答 MCSE 题目的时候﹐您一定要记得 NT 是这么工作的就是了。

要是您想退租,可以随时送出 DHCPLEREASE 命令解约﹐就算您的租约在前一秒钟才获得的。

跨网路的 DHCP 运作

从前面描述的过程中,我们不难发现:DHCDISCOVER 是以广播方式进行的,其情形只能在同一网路之内进行﹐因为 router 是不会将广播传送出去的。但如果 DHCP 伺服器安设在其它的网路上面呢﹖由于 DHCP 客户端还没有 IP 环境设定﹐所以也不知道 Router 位址﹐而且有些 Router 也不会将 DHCP 广播封包传递出去﹐因此这情形下 DHCPDISCOVER 是永远没办法抵达 DHCP 伺服器那端的,当然也不会发生 OFFER 及其他动作了。要解决这个问题,我们可以用 DHCP Agent (或 DHCP Proxy )主机来接管客户的 DHCP

请求﹐然后将此请

,

求传递给真正的 DHCP 伺服器﹐然后将伺服器的回复传给客户。这里﹐Proxy 主机必须自己具有路由能力,且能将双方的封包互传对方。

若不使用 Proxy ,您也可以在每一个网路之中安装 DHCP 伺服器﹐但这样的话﹐一来设备成本会增加﹐而且﹐管理上面也比较分散。当然啰﹐如果在一个十分大型的网路中﹐这样的均衡式架构还是可取的。端视您的实际情况而定了。 DHCP 封包格式

以下为各栏位的简要说明:

OP

若是 client 送给 server 的封包,设为 1 ,反向为 2 。

HTYPE

硬体类别,Ethernet 为 1 。

HLEN

硬体位址长度, Ethernet 为 6 。

HOPS

若封包需经过 router 传送,每站加 1 ,若在同一网内,为 0 。 TRANSACTION ID

DHCPREQUEST 时产生的数值,以作 DHCPREPLY 时的依据。

SECONDS

标签: