首页 > 课堂 > 网络协议 > 正文

TCP/IP基础:DHCP协议

2020-04-18 13:04:13
字体:
来源:转载
供稿:网友
  经过了前面的学习,相信您不再认为设定与管理 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 还可以帮客户端指定 routernetmaskDNS ServerWINS 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 秒之外其余三次的等待时间分别是 91316 秒。如果都没有得到 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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表