1 什么是DHCP

        DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server),68(DHCP client)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。

2 DHCP协议中的报文

DHCP报文共有一下几种:

(1)DHCP DISCOVER :客户端开始DHCP过程发送的包,是DHCP协议的开始
(2)DHCP OFFER :服务器接收到DHCP DISCOVER之后做出的响应,它包括了给予客户端的IP(yiaddr)、客户端的MAC地址、租约过期时间、服务器的识别符以及其他信息
(3)DHCP REQUEST :客户端对于服务器发出的DHCP OFFER所做出的响应。在续约租期的时候同样会使用。
(4)DHCP ACK :服务器在接收到客户端发来的DHCP REQUEST之后发出的成功确认的报文。在建立连接的时候,客户端在接收到这个报文之后才会确认分配给它的IP和其他信息可以被允许使用。
(5)DHCP NAK :DHCP ACK的相反的报文,表示服务器拒绝了客户端的请求。
(6)DHCP RELEASE :一般出现在客户端关机、下线等状况。这个报文将会使DHCP服务器释放发出此报文的客户端的IP地址
(7)DHCP INFORM :客户端发出的向服务器请求一些信息的报文
(8)DHCP DECLINE :当客户端发现服务器分配的IP地址无法使用(如IP地址冲突时),将发出此报文,通知服务器禁止使用该IP地址。

3 DHCP的4步租约过程

DHCP租约过程就是DHCP客户机动态获取IP地址的过程。DHCP租约过程分为4步:

① 客户机请求IP(客户机发DHCPDISCOVER广播包)

② DHCP服务器响应(DHCP服务器发DHCPOFFER广播包)

③ 客户机选择IP(客户机发DHCPREQUEST广播包)

④ DHCP服务器确定租约(DHCP服务器发DHCPACK/DHCPNAK广播包)

图1 DHCP的4步租约过程

图2 DHCP的4步租约过程抓包信息

(1)第一步:客户机请求IP

        客户机请求IP也称为DHCPDISCOVER。当一个DHCP客户机启动时,会自己主动将自己的IP地址配置成0.0.0.0。因为使用0.0.0.0不能进行正常通信,所以客户机就必须通过DHCP服务器来获取一个合法的地址。

        因为客户机不知道DHCP服务器的IP地址,所以它使用0.0.0.0的地址作为源地址,使用UDP68port作为源port,使用255.255.255.255作为目标地址,使用UDP67port作为目的port来广播请求IP地址信息。广播信息中包括了DHCP客户机的MAC地址和计算机名,以便使DHCP服务器能确定是哪个客户机发送的请求。

        DHCP客户机总是试图又一次租用它接收过的最后一个IP地址,这给网络带来一定的稳定性。

注意:这里客户机请求IP的数据包中Bootp flags = 0x0000

 图3 客户机请求IP(数据包详细信息)

(2)第二步:DHCP服务器响应

        DHCP服务器响应也称为DHCPOFFER。

        当DHCP服务器接收到客户机请求IP地址的信息时,它就在自己的IP地址池中查找是否有合法的IP地址提供给客户机。假如设有,DHCPserver就将此IP地址做上标记。增加到DHCPOFFER的消息中,然后DHCP服务器就广播一则包含下列信息的DHCPOFFER消息:DHCP客户机的MAC地址;DHCP服务器提供的合法IP地址;子网掩码;默认网关(路由);租约的期限。DHCP服务器的IP地址。

        由于DHCP客户机还没有IP地址,所以DHCP服务器使用自己的IP地址作为源地址,使用UDP67port作为源port,使用255.255.255.255作为目标地址。使用UDP68port作为目的port来广播DHCPOFFER信息。

补充:

(1)对于dhcp offer来说,是单播还是广播,取决于客户端发送的discover报文中的字段“Bootpflags“,它有两个字节,如果最高位为1,代表回复的offer为广播,如果为0,代表回复的offer为单播:① Bootp flags = 0x8000,offer为广播;② Bootp flags = 0x0000,offer为单播。 

(2)由于第一步客户机请求IP的数据包中Bootp flags = 0x0000,所以这里offer用的时单播,此时客户机虽然没有IP地址,但是有MAC地址,根据客户机的MAC地址,依然可以将offer送达目的客户机。

图4 DHCP服务器响应(数据包详细信息)

(3)第三步:客户机选择IP

        客户机选择IP,也称为DHCPREQUEST。DHCP客户机从接收到的第一个DHCPOFFER消息中选择IP地址。发出IP地址的DHCP服务器将该地址保留。这样该地址就不能提供给还有一个DHCP客户机。当客户机从第一个DHCP服务器接收DHCPOFFER并选择IP地址后,DHCP租约的第三过程发生。客户机将DHCPREQUEST消息广播到全部的DHCP服务器,表明它接受提供的内容。DHCPREQUEST消息包含为该客户机提供IP配置的server的服务标识符(IP地址)。DHCP服务器查看server标识符字段。以确定它自己是否被选择为指定的客户机提供IP地址,假设那些DHCPOFFER被拒绝。则DHCP服务器会取消提供并保留其IP地址以用于下一个IP租约请求。

        在客户机选择IP的过程中。尽管客户机选择了IP地址,可是还没有配置IP地址。而在一个网络中可能有几个DHCP服务器,所以客户机仍然使用0.0.0.0的地址作为源地址,使用UDP68port作为源port。使用255.255.255.255作为目标地址。使用UDP67port作为目的port来广播DHCPREQUEST信息。

图5 客户机选择IP(数据包详细信息)

(4)第四步:DHCP服务器确认租约

        DHCP服务器确认租约,也称为DHCPACK/DHCPNAK。DHCP服务器接收到DHCPREQUEST消息后。以DHCPACK消息的形式向客户机广播成功的确认,该消息包括有IP地址的有效租约和其它可能配置的信息。尽管DHCP服务器确认了客户机的租约请求,可是客户机还没有收到DHCP服务器的DHCPACK消息,所以DHCP服务器仍然使用自己的IP地址作为源地址。使用UDP67port作为源port,使用255.255.255.255作为目标地址。使用UDP68port作为目的port来广播DHCPACK信息。当客户机收到DHCPACK消息时,它就配置了IP地址。完毕了TCP/IP的初始化。

        假设DHCPREQUEST不成功,比如客户机试图租约先前的IP地址,但该IP地址不再可用。或者由于客户机移到其它子网,该IP无效时,DHCP服务器将广播否定确认消息DHCPNAK。当客户机接收到不成功的确认时,它将又一次開始DHCP租约过程。

        假设DHCP客户机无法找到DHCP服务器,它将从TCP/IP的B类网段169.254.0.0中挑选一个IP地址作为自己的IP地址,继续每隔5分钟尝试与DHCP服务器进行通讯,一旦与DHCP服务器取得联系。则客户机放弃自己主动配置的IP地址,而使用DHCP服务器分配的IP地址。

        假设一台DHCP客户机有两个或者多个网卡,则DHCP服务器会为每一个网卡分配一个唯一而有效的IP地址。

图6 DHCP服务器确认租约(数据包详细信息)

4 DHCP客户机续租过程

DHCP客户机续租:

图7 DHCP客户机续租过程

图8 DHCP客户机续租过程抓包信息

     DHCP客户机会在租期过去50%的时候,直接向为其提供IP地址的DHCP服务器发送DHCPREQUEST消息包。如果客户机接收到该服务器回应的DHCPPACK消息包,客户机就根据包中所提供的新的租期以及其他已经更新的TCP/IP参数更新自己的配置,IP租用更新完成。如果没有收到该服务器的回复,则客户机继续使用现有的ip地址,因为当前租期还有50%。

        如果在租期过去50%的时候没有更新,则DHCP客户机在租期过去87.5%的时候再次向为其提供IP地址的DHCP服务器联系,如果还不成功,到租约的100%的时候,DHCP客户机必须放弃这个IP地址,重新申请。如果此时无DHCP服务器可用,DHCP客户机会使用169.254.0.0/16中随机的一个地址,并且每隔5分钟再进行尝试。

补充:T1和T2时间的概念

        根据dhcp协议规定,默认情况下DHCP客户机需要在T1和T2这两个时间向DHCP服务器发送DHCPREQUEST来续租ip。其中T1=50%*租期,T2=87.5%*租期,这里租期是指default-lease-time变量的值。

5 配置DHCP服务器

[root@localhost dhcp]# pwd
/etc/dhcp
[root@localhost dhcp]# cat dhcpd.conf 
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.sample
#   see 'man 5 dhcpd.conf'
#
ddns-update-style none;
default-lease-time 7200;
max-lease-time 14400;
option domain-name "cac.com";
option domain-name-servers 192.168.40.10,192.168.40.20 ;
subnet 192.168.80.0 netmask 255.255.255.0
{
    range 192.168.80.10 192.168.80.100;
    option routers 192.168.80.1;
    # 在subnet{}大括号内default-lease-time为3600
    default-lease-time 3600;
}

补充:DHCP配置文件中的全局变量和局部变量

        如果已经设置了全局变量default-lease-time,然后在subnet{}内部又设置了局部变量default-lease-time,那么在subnet{}内只有局部变量起作用。

(1)全局设置(对所有网段都起作用)

ddns-update-style none;

        在没有DHCP情况下,计算机使用域名通信情况,见下图,DNS维护IP到域名映射表

图9 没有DHCP时计算机使用域名通信的情况

        在引入DHCP后,计算机一开机,由DHCP自动分配IP,导致DNS那一侧IP到域名映射关系失效,需要更新这份映射关系。可以由计算机自己更新(我们用的Windows就有这个功能),也可由DHCP代劳。ddns-update-style none;这句话的意思就是说,DHCP就不要管闲事更新DNS映射表了。见下图

图10 引入DHCP时计算机使用域名通信的情况

default-lease-time 7200;

        默认租约时间。客户机通过DHCP获取IP后,这个IP使用时间是多久,单位是秒。

max-lease-time 14400;

        最大租约时间。正常情况下,如果客户机在default-lease-time快到期时会向DHCP续租。如果在default-lease-time期间,客户机死机了,default-lease-time时间到了,DHCP服务器并不会立即回收这个IP,他还会再等等,等的这个时间就是max-lease-time。如果max-lease-time 这么长时间还不来续租,那就回收IP方便别人再使用。

option domain-name "cac.com";

        默认域名称。在一个局域网内,各个计算机之间通过名称访问,比如ftp服务器全名叫ftp.cac.com,其他客户机要想获取ftp服务就必须使用ftp.cac.com全名(DNS会把这个全名解析成IP)。使用这个字段就可以直接使用ftp通信了。

option domain-name-servers 192.168.40.10,192.168.40.20 ;

        指定域名解析服务器,多个域名解析服务器用逗号隔开

(2)子网设置

subnet 192.168.80.0 netmask 255.255.255.0

        标记哪个子网

range 192.168.80.10 192.168.80.100;

        DHCP分配IP地址范围

option routers 192.168.80.1;

        这个子网的网关是什么,每个子网的网关都不一样。子网也可以设置租约时长,如果和全局设置一样就没必要写了。

参考:

(1)DHCP的一些解释_经纬7度的博客-CSDN博客_dhcp nak

(2)图解DHCP的4步租约过程 - tlnshuju - 博客园 (cnblogs.com)

(3)DHCP服务——服务端 和 客户端 配置 - 克拉默与矩阵 - 博客园 (cnblogs.com)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐