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
定位方式:
Manual Allocation
网络管理员为某些少数特定的
Host
绑定固定
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
的工作形式会有所不同。
第一次登录的时候:
寻找
Server
。当
DHCP
客户端第一次登录网络的时候,也就是客户发现本机上没有任何
IP
数据设定,它会向网络发出一个
DHCP DISCOVER
封包
。因为客户端还不知道自己属于哪一个网络,所以封包的来源地址会为
0.0.0 .0
,而目的地址则为
255.255.255.255
,然后再附上
DHCP discover
的信息,向网络进行广播。
在
Windows
的预设情形下,
DHCP discover
的等待时间预设为
1
秒,也就是当客户端将第一个
DHCP discover
封包送出去之后,在
1
秒之内没有得到响应的话,就会进行第二次
DHCP discover
广播。若一直得不到响应的情况下,客户端一共会有四次
DHCP discover
广播
(
包括第一次在内
)
,除了第一次会等待
1
秒之外,其余三次的等待时间分别是
9
、
13
、
16
秒。如果都没有得到
DHCP
服务器的响应,客户端则会显示错误信息,宣告
DHCP discover
的失败。之后,基于使用者的选择,系统会继续在
5
分钟之后再重复一次
DHCP discover
的过程。
提供
IP
租用地址
。当
DHCP
服务器监听到客户端发出的
DHCP discover
广播后,它会从那些还没有租出的地址范围内,选择最前面的空置
IP
,连同其它
TCP/IP
设定,响应给客户端一个
DHCP OFFER
封包。
由于客户端在开始的时候还没有
IP
地址,所以在其
DHCP discover
封包内会带有其
MAC
地址信息,并且有一个
XID
编号来辨别该封包,
DHCP
服务器响应的
DHCP offer
封包则会根据这些资料传递给要求租约的客户。根据服务器端的设定,
DHCP offer
封包会包含一个租约期限的信息。
接受
IP
租约
。如果客户端收到网络上多台
DHCP
服务器的响应,只会挑选其中一个
DHCP offer
而已
(
通常是最先抵达的那个
)
,并且会向网络发送一个
DHCP request
广播封包,
告诉所有
DHCP
服务器它将指定接受哪一台服务器提供的
IP
地址。
同时,客户端还会向网络发送一个
ARP
封包,查询网络上面有没有其它机器使用该
IP
地址;如果发现该
IP
已经被占用,客户端则会送出一个
DHCPDECLINE
封包给
DHCP
服务器,拒绝接受其
DHCP offer
,并重新发送
DHCP discover
信息。
事实上,并不是所有
DHCP
客户端都会无条件接受
DHCP
服务器的
offer
,尤其这些主机安装有其它
TCP/IP
相关的客户软件。客户端也可以用
DHCP request
向服务器提出
DHCP
选择,而这些选择会以不同的号码填写在
DHCP Option Field
里面:
换一句话说,在
DHCP
服务器上面的设定,未必是客户端全都接受,客户端可以保留自己的一些
TCP/IP
设定。而主动权永远在客户端这边。
租约确认
。当
DHCP
服务器接收到客户端的
DHCP request
之后,会向客户端发出一个
DHCPACK
响应
,以确认
IP
租约的正式生效,也就结束了一个完整的
DHCP
工作过程。
如上的工作流程如下图:
DHCP
发放流程第一次登录之后:
一旦
DHCP
客户端成功地从服务器哪里取得
DHCP
租约之后,除非其租约已经失效并且
IP
地址也重新设定回
0.0.0 .0
,否则就无需再发送
DHCP discover
信息了,而会直接使用已经租用到的
IP
地址向之前之
DHCP
服务器发出
DHCP request
信息,
DHCP
服务器会尽量让客户端使用原来的
IP
地址,如果没问题的话,直接响应
DHCPack
来确认则可。如果该地址已经失效或已经被其它机器使用了,服务器则会响应一个
DHCPNACK
封包给客户端,要求其从新执行
DHCP discover
。
至于
IP
的租约期限却是非常考究的,并非如我们租房子那样简单,
以
NT
为例子:
DHCP
工作站除了在开机的时候发出
DHCP request
请求之外,在租约期限一半的时候也会发出
DHCP request
,如果此时得不到
DHCP
服务器的确认的话,工作站还可以继续使用该
IP
;然后在剩下的租约期限的再一半的时候
(
即租约的
75%)
,还得不到确认的话,那么工作站就不能拥有这个
IP
了。至于为什么不是到租约期限完全结束才放弃
IP
呢?,只知道要回答
MCSE
题目的时候,您一定要记得
NT
是这么工作的就是了。
要是您想退租,可以随时送出
DHCPLEREASE
命令解约
,就算您的租约在前一秒钟才获得的。
跨网络的
DHCP
运作
从前面描述的过程中,我们不难发现:
DHCDISCOVER
是以广播方式进行的,其情形只能在同一网络之内进行,因为
router
是不会将广播传送出去的。但如果
DHCP
服务器安设在其它的网络上面呢?由于
DHCP
客户端还没有
IP
环境设定,所以也不知道
Router
地址,而且有些
Router
也不会将
DHCP
广播封包传递出去,因此这情形下
DHCP DISCOVER
是永远没办法抵达
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
DHCP REQUEST
时产生的数值,以作
DHCPREPLY
时的依据。
SECONDS
Client
端启动时间
(
秒
)
。
FLAGS
从
0
到
15
共
16 bits
,最左一
bit
为
1
时表示
server
将以广播方式传送封包给
client
,其余尚未使用。
ciaddr
要是
client
端想继续使用之前取得之
IP
地址,则列于这里。
yiaddr
从
server
送回
client
之
DHCP OFFER
与
DHCPACK
封包中,此栏填写分配给
client
的
IP
地址。
siaddr
若
client
需要透过网络开机,从
server
送出之
DHCP OFFER
、
DHCPACK
、
DHCPNACK
封包中,此栏填写开机程序代码所在
server
之地址。
giaddr
若需跨网域进行
DHCP
发放,此栏为
relay agent
的地址,否则为
0
。
chaddr
Client
之硬件地址。
sname
Server
之名称字符串,以
0x00
结尾。
file
若
client
需要透过网络开机,此栏将指出开机程序名称,稍后以
TFTP
传送。
options
允许厂商定议选项
(Vendor-Specific Area)
,以提供更多的设定信息
(
如:
Netmask
、
Gateway
、
DNS
、等等
)
。其长度可变,同时可携带多个选项,每一选项之第一个
byte
为信息代码,其后一个
byte
为该项数据长度,最后为项目内容。
CODE LEN VALUE
此字段完全兼容
BOOTP
,同时扩充了更多选项。其中,
DHCP
封包可利用编码为
0x53
之选项来设定封包类别:项值
类别
1 DHCP DISCOVER
2 DHCP OFFER
3 DHCP REQUEST
4 DHCPDECLINE
5 DHCPACK
6 DHCPNACK
7 DHCPRELEASE DHCP
的选项非常多,有空请查阅
RFC
或相关文献,并好好理解,这里不再叙述了。
DHCP
协议之
RFC
文件
RFC-951
、
RFC-1084
、
RFC-1123
、
RFC-1533
、
RFC-1534
、
RFC-1497
、
RFC-1541
DHCP
是可自动将
IP
位址指派给登入
TCP/IP
网络的用户端的一种软件,
(
此种
IP
位址称为「动态
IP
位址」
)
。这种软件通常是在路由器及其他网络设备上执行的。依照预先设定,您的
GateLock
路由器设定为使用
DHCP
,因此就无须手动指派永久
IP
位址给网络上的每个设备。建议不要改变这个设置,这样您的个人电脑就可以被分辨为
DHCP
服务器。