经过了前面的学习,相信您不再认为设定与管理 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
Client 端启动时间(秒)。
FLAGS
从 0 到 15 共 16 bits ,最左一 bit 为 1 时表示 server 将以广播方式传送封包给 client ,其余尚未使用。
ciaddr
要是 client 端想继续使用之前取得之 IP 位址,则列于这里。
yiaddr
从 server 送回 client 之 DHCPOFFER 与 DHCPACK 封包中,此栏填写分配给 client 的 IP 位址。
siaddr
若 client 需要透过网路开机,从 server 送出之 DHCPOFFER、DHCPACK、DHCPNACK 封包中,此栏填写开机程式码所在 se