dhcp

本文详细介绍了DHCP的工作原理、通信过程及DHCP报文格式。DHCP允许客户端自动获取IP地址和配置信息,通过DHCPDiscover、DHCPOffer、DHCPRequest和DHCPACK等报文交互完成地址分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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服务工作在C/S(客户端/服务器)模式,但两者进行报文传输时所使用的UDP传输端口是不一样的,DHCP客户端使用68号UDP端口发送请求报文;DHCP服务器使用67号UDP端口发送应答报文。DHCP客户端向DHCP服务器发送的报文称之为DHCP请求报文,而DHCP服务器向DHCP客户端发送的报文称之为DHCP应答报文。

1.1 DHCP报文

DHCP报文是承载于UDP上的高层协议报文,采用67(DHCP服务器)和68(DHCP客户端)两个端口号。DHCP报文的格式如下图所示。

图1 DHCP报文格式

         

报文中各字段的描述如下:

  •     op,报文类型,1表示请求报文,2表示回应报文。
  •     htype,硬件地址类型,1表示10Mb/s的以太网的硬件地址。
  •     hlen,硬件地址长度,以太网中该值为6。
  •     hops,跳数。客户端设置为0,也能被一个代理服务器设置。
  •     xid,事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户     端设置并由服务器返回,为32位整数。
  •     secs,由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。
  •     flags,标志字段。这个16比特的字段,目前只有最左边的一个比特有用,该位为0,表示单播,为1表示广播。
  •     ciaddr,客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。
  •     yiaddr,"你自己的"或客户端的IP地址。
  •     siaddr,表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
  •     giaddr,DHCP中继器的IP地址。//注意:不是地址池中定义的网关
  •     chaddr,客户端硬件地址。客户端必须设置它的"chaddr"字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网     帧 首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。
  •     sname,可选的服务器主机名,该字段是空结尾的字符串,由服务器填写。
  •     file,启动文件名,是一个空结尾的字符串。DHCP Discover报文中是"generic"名字或空字符,DHCP Offer报文中提供有效的目录路径全名。 
  •     options,可选参数域,格式为"代码+长度+数据"。

       DHCP Options

Option id

Length(字节)

描述

1

4

Subnet Mask

3

n*4

Router(网关)

6

n*4

DNS Server

7

n*4

Log Server

26

2

Interface MTU

33

n*8

Static route

35

4

ARP cache timeout

42

n*4

NTP servers

51

4

IP address lease time

53

1

Message type 1-DHCPDISCOVER 2-DHCPOFFER 3-DHCPREQUEST 4-DHCPDECLINE 5-DHCPACK 6-DHCPNAK 7-DHCPRELEASE 8-DHCPINFORM

54

4

DHCP Server Identifier




1.3 DHCP报文类型

DHCP类型

 报文类型说明

DHCP Discover

因为DHCP客户端在请求IP地址时并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送Discover请求报文,以发现网络中的DHCP服务器。所有收到Discover报文的DHCP服务器都会发送应答报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置

DHCP Offer

DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给DHCP客户端,告知用户本服务器可以为其提供IP地址。但这个报文只是告诉DHCP客户端可以提供IP地址,最终还需要客户端通过ARP来检测该IP地址是否重复<只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复>

DHCP Request

DHCP客户端可能会收到很多Offer请求报文,所以必须在这些应答中选择一个。通常是选择第一个Offer应答报文的服务器作为自己的目标服务器,并向该服务器发送一个广播的equest请求报文,通告选择的服务器,希望获得所分配的IP地址。另外,DHCP客户端在成功获取IP地址后,在地址使用租期过去1/2时,也会向DHCP服务器发送单播Request请求报文请求续延租约,如果没有收到ACK报文,在租期过去3/4时,会再次发送广播的Request请求报文以请求续延租约

DHCP ACK

DHCP服务器收到Request请求报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK应答报文,通知用户可以使用分配的IP地址

DHCP NAK

如果DHCP服务器收到Request请求报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则向DHCP客户端发送NAK应答报文,通知用户无法分配合适的IP地址

DHCP Release

当DHCP客户端不再需要使用分配IP地址时,就会主动向DHCP服务器发送RELEASE请求报文,告知服务器用户不再需要分配IP地址,请求DHCP服务器释放对应的IP地址

DHCP Decline

DHCP客户端收到DHCP服务器ACK应答报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则会向DHCP服务器发送Decline请求报文,通知服务器所分配的IP地址不可用,以期获得新的IP地址

DHCP Inform

DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则向DHCP服务器发送Inform请求报文;DHCP服务器在收到该报文后,将根据租约进行查找到相应的配置信息后,向DHCP客户端发送ACK应答报文。目前基本上不用了<极少用到>


二、工作原理

2.1 首次登陆

DHCP是一个基于广播的协议,它的操作可以归结为四个阶段,这些阶段是IP租用请求、IP租用提供、IP租用选择、IP租用确认。

      

1、IP租用请求:在任何时候,客户计算机如果设置为自动获取IP地址,那么在它开机时,就会检查自己当前是否租用了一个IP地址,如果没有,它就向DCHP请求一个租用,由于该客户计算机并不知道DHCP服务器的地址,所以会用255.255.255.255作为目标地址,源地址使用0.0.0.0,在网络上广播一个DHCPDISCOVER消息,消息包含客户计算机的媒体访问控制(MAC)地址(网卡上内建的硬件地址)以及它的NetBIOS名字。

2、IP租用提供:当DHCP服务器接收到一个来自客户的IP租用请求时,它会根据自己的作用域地址池为该客户保留一个IP地址并且在网络上广播一个DHCP OFFER来实现,该消息包含客户的MAC地址、服务器所能提供的IP地址、子网掩码、租用期限,以及提供该租用的DHCP服务器本身的IP地址(因为DHCP客户端目前还没有IP地址,所以DHCP服务器同样使用广播进行通讯:源IP地址为DHCP服务器的IP地址,而目的IP地址为255.255.255.255。同时,DHCP服务器为此客户保留它提供的IP地址,从而不会为其他DHCP客户分配此IP地址。如果有多个DHCP服务器给予此DHCP客户端回复DHCPOFFER消息,则DHCP客户端接受它接收到的第一个DHCPOFFER消息中的IP地址。 )

3、IP租用选择:如果子网还存在其它DHCP服务器,那么客户机在接受了某个DHCP服务器的DHCPOFFER消息后,它会广播一条包含提供租用的服务器的IP地址的DHCPREQUEST消息,在该子网中通告所有其它DHCP服务器它已经接受了一个地址的提供,其他DHCP服务器在接收到这条消息后,就会撤销为该客户提供的租用。然后把为该客户分配的租用地址返回到地址池中,该地址将可以重新作为一个有效地址提供给别的计算机使用(由于还没有得到DHCP服务器最后确认,DHCP客户端仍然不能使用租约中提供的IP地址,所以在数据包中仍然使用0.0.0.0作为源IP地址,广播地址255.255.255.255作为目的地址。)

4、IP租用确认 DHCP服务器接收到来自客户的DHCPREQUEST消息,它就开始配置过程的最后一个阶段,这个确认阶段由DHCP服务器发送一个DHCPACK包给客户,该包包括一个租用期限和客户所请求的所有其它配置信息,至此,完成TCP/IP配置。

2.2  地址获取状态

当客户机使用DHCP获取其IP地址时,它处于六个状态之一,如图所示:

     

当客户机第一次启动时,它进入INITIALIZE 初始化状态。为了开始获取一个IP地址,客户机先与本地网络上所有DHCP服务器联系,为此,客户机广播一个dhcpdiscover报文,并转移到SELECT 选择状态。由于协议是对BOOTP的扩充,客户机在一个UDP数据报中发送DHCPDISCOVER报文,UDP数据报中目的端口设为BOOTP端口(即端口67),本地网上所有DHCP服务器接收报文那些被设计成能响应特定客户机的服务器发送一个DHCPOFFER报文。因此,客户机可能收到零个或多个响应。

处于SELECT状态时,客户机从DHCP服务器收集DHCPOFFER响应。每个响应提供了用于客户机的配置信息,还有服务器可提供租用给客户机的一个IP地址,客户机必须选择其中一个响应(如第一个到达的响应),并与服务器协商租用。为此,客户机发送给服务器一个DHCPREQUEST报文,并进入REQUEST状态。服务器为确认已接受请求并开始租用,服务器响应发出一个DHCPACK报文。客户机收到确认后转移到BOUND (已绑定)状态,此时客户机可开始使用此地址。

2.3 续约

   当一个DHCP客户机获取地址时,它就转移到绑定状态.进入绑定状态以后,客户机设置三个定时器:控制租约更新(继续原来分配的地址)、重新绑定(可能使用新的地址)和到期。一个DHCP服务器给客户机分配地址时,可为定时器指定确定的值。如果服务器未指定定时器值,客户机就使用默认值。第一个定时器的默认值通常是总租约期的一半,当第一个定时器到期,客户机必须尝试更新租约期,为请求更新,客户机发送一个DHCPREQUEST报文到获得租约处的服务器,转移到更新状态等待响应。DHCPREQUEST包含一个客户机正使用的IP地址,并请求服务机延长对此地址的租用。服务器可以用两种方式之一响应客户机的更新请求,指示客户机停止使用该地址或同意客户机继续使用此地址。如果服务器同意就发送DHCPACK ,在DHCPACK中也可含有客户机定时器的新的数值。如果服务器不同意继续使用它就发送一个DHCPNAK ,使客户机立即停止地址的使用。客户机收到DHCPACK报文则返回到绑定状态继续使用地址,如果收到DHCPNAK就立即停止使用地址并返回初始化状态。

第二个定时器在客户机进入绑定状态后开始设置,默认值为总租约期的87.5% ,客户机发送请求报文后保持在更新状态等待服务器的响应,如果在第二个定时器到期之前还没有收到服务器的响应,则第二个定时器到期时使客户机从更新状态转移到重新绑定状态,在转移时,客户机假定原来的服务器不可用,开始广播DHCPREQUEST报文到本地网上的任意服务器。可为客户机提供服务的任意服务器可能响应肯定(即延长租约),或否定(即拒绝继续使用地址)。如果客户机收到一个肯定响应,它就返回到绑定状态并重置两个定时器。如果客户机收到否定响应,它就转移到初始化状态,并且停止使用IP地址,在继续使用IP地址前必须重新获取一个新地址。

如果客户机在重新绑定状态广播请求报文后在第三个定时器超时前还没有从任何一个服务器收到响应,则客户机必须停止使用IP地址,返回到初始化状态,并开始申请一个新地址,发起DHCPDISCOVER进程以寻求IP地址。

2.4  DHCP中继(代理)

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

三、DHCP通信过程

首先是用户端发现本机上没有任何IP数据的设定,它会向网络发出一个DHCP discover的广播包。在一般情况下,DHCP discover的等待时间预设为4秒,也就是说当客户端将第一个DHCP discover广播包发出去之后,在4秒之内没有得到响应的话,就会进行第二次DHCP discover广播。

与此同时,DHCPserver收到客户端发来的discover后就会向网络发出ARP请求,试探有没有用户在使用DHCP server即将分配的地址。

当DHCP server发现没有用户在使用这个预分配的地址时,那么DHCP server会发一个offer报文给客户端。此报文包含了分配给主机的IP地址、网关地址、子网掩码、租期时间、域名服务器地址。

客户端收到server回的offer报文时会再次向网络中发广播包,即request报文。用以响应server端发来的offer报文,告诉DHCP server客户端已经收到服务器分配的信息。

最后DHCP server会单播给客户端一个ACK报文,明确客户端可以使用分配到的数据。到此客户端才真正获得了IP地址和相关的配置信息。

当DHCP分配完成后,客户端会发出免费ARP,确认网络中没有用户使用与我相同的IP地址。

故此一套完整的流程结束,一般情况下只出现discover、offer、request、ack这四个报文。但DHCP一共有6个报文,这些类型是通过DHCP报文option53来识别。option53的值为1是discover;2为offer;3为request;4为declient用来通告DHCPserver,你所分配的地址不可用,如IP地址发生冲突时;5为ack;6为nak,是server拒绝响应request报文,一般出现nak时DHCP流程将重新开始。

用一个抓包实例来说明:

1序号6的包是DHCP过程开始的第一个报文,即用户发现自己没有IP信息,于是向网络中发出一个DHCP discover的广播包,option53中的value值为1表明是discover报文         

     

2、序号7的包是DHCPserver 发出的ARP请求,server即将分配192.168.1.109这个地址,于是就问网络中谁使用这个地址。

    

    注:序号8的包是客户端没有收到server回应的offer,但是时间已经过去了4秒,于是再次广播discover。

    序号9是server收到第二次discover后,发出的ARP请求。 

3、当没有用户回应server发出的ARP,则表明网络中没有用户使用192.168.1.109这个地址。那么server此时回应一个offer报文给客户端。offer报文序号11,如下图。

     

4、序号12的包是request报文。用以响应server端发来的offer报文,告诉DHCPserver客户端已经收到服务器分配的信息。

5、 序号13是server给客户端的一个ack报文。明确客户端可以使用分配到的数据。

     

6、序号14、15、16是客户端发出的免费ARP,确认网络中没有用户使用与我相同的IP地址。
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值