中查找“DHCP协议”更多相关内容
中查找“DHCP协议”更多相关内容
- ·上一篇文章:POP3协议命令原始码及工作原理
- ·下一篇文章:关于UDP协议的介绍
DHCP协议
作者:佚名 来源:本站整理 发布时间:2012-01-23-19:31:02
什么是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 封包中,此栏填写开机程式码所在 server 之位址。
giaddr
若需跨网域进行 DHCP 发放,此栏为relay agent 的位址,否则为 0 。
chaddr
Client 之硬体位址。
sname
Server 之名称字串,以 0x00 结尾。
file
若 client 需要透过网路开机,此栏将指出开机程式名称,稍后以 TFTP 传送。
options
容许厂约定议选项(Vendor-Specific Area),以供给更多的设定资讯(如:Netmask、Gateway、DNS、等等)。其长度可变,同时可携带多个选项,每一选项之第一个 byte 为资讯代码,其后一个 byte 为该项材料长度,最后为项目内容。
DHCP 的选项非常多,有空请查阅 RFC 或相干文献,并好好懂得,这里不再叙述了。
DHCP 协议之 RFC 文件
RFC-951﹑RFC-1084﹑RFC-1123﹑RFC-1533﹑RFC-1534﹑RFC-1497﹑RFC-1541
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 封包中,此栏填写开机程式码所在 server 之位址。
giaddr
若需跨网域进行 DHCP 发放,此栏为relay agent 的位址,否则为 0 。
chaddr
Client 之硬体位址。
sname
Server 之名称字串,以 0x00 结尾。
file
若 client 需要透过网路开机,此栏将指出开机程式名称,稍后以 TFTP 传送。
options
容许厂约定议选项(Vendor-Specific Area),以供给更多的设定资讯(如:Netmask、Gateway、DNS、等等)。其长度可变,同时可携带多个选项,每一选项之第一个 byte 为资讯代码,其后一个 byte 为该项材料长度,最后为项目内容。
DHCP 的选项非常多,有空请查阅 RFC 或相干文献,并好好懂得,这里不再叙述了。
DHCP 协议之 RFC 文件
RFC-951﹑RFC-1084﹑RFC-1123﹑RFC-1533﹑RFC-1534﹑RFC-1497﹑RFC-1541