浅谈DHCP协议

本文从分配方式、工作过程、租约、数据包格式、中继代理等几个方面介绍了DHCP协议对IPV4地址的分配过程。
上篇文章回顾: GO interface实现分析


概要

DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,使用udp协议进行工作,可以为局域网的客户端动态的分配IP地址。DHCP协议有常用的三个端口,分别为67,68和546。其中67和68号端口为DHCP Server和DHCP Client的端口,546用于DHCP Failover,需要单独开启,主要用于双机热备。

DHCP分配方式

DHCP的分配方式分为三种,分别是静态分配,自动分配和动态分配。

静态分配:管理员选择分配的IP地址,由DHCP服务器发送给客户端。这种方式为永久分配,DHCP服务器通过相关的配置将客户端MAC地址与分配的IP地址对应。

DHCP服务器配置如下:

自动分配:服务器从其IP池内分配一个IP地址给客户端,在firewall,如果租期被指定为 Unlimited 则意味着该IP地址为永久分配,此种分配方式下客户端第一次向DHCP服务器申请到该IP地址后,便可永久使用该IP地址,该地址不可分配给其他客户端。

动态分配:DHCP收到客户端的IP地址后从IP pool中选择一个IP地址进行分配,该IP地址只在租约期内有效,超出租约期后若不再续约则会被收回,此种方式可以很好的自动重复使用IP地址。

DHCP服务器配置如下:

DHCP工作过程

1、DHCP Discover:客户端以广播形式发送DHCP Discover报文,该局域网内的所有DHCP服务器都可以收到此报文。

2、DHCP Offer:DHCP服务器收到客户端发送的DHCP Discover报文后,会从配置的地址池中选择一个IP地址预分配给客户端,该IP地址封装在DHCP offer报文内以广播形式发送给客户端。

3、DHCP Request:客户端会在收到的DHCP offer报文中选择一个IP,一般为第一个收到的DHCP offer报文,但此时客户端并不能使用该IP,需要以广播形式发送DHCP Request报文给DHCP服务器。

4、DHCP Ack:DHCP服务器收到后会查看客户端选择的是否为自己分配的IP地址,如果不是,则将IP地址放回地址池,等待下一次的客户端的申请。如果选择的是自己分配的IP地址,则广播发送DHCP ACK报文给客户端,并在服务端将客户端的MAC地址和IP地址进行绑定。

5、客户端收到该报文后不会立即使用,而是利用ARP进行探测该地址是否被其他客户端所使用,如果在超时时间内没有得到回应,则客户端使用该IP地址,如果得到ARP回应,则发送DHCP DECLINE包给DHCP服务器,然后重复上述流程,向DHCP服务器申请IP地址。

DHCP客户端重新启动后不需要再发送DHCP Discover报文进行地址申请,它进行和续约类似的操作。

上述工作过程通过tcpdump抓取到的报文如下:

DHCP租约

自动续约

动态分配的IP地址有租期的限制,客户端如果在租约结束后仍要使用该IP地址,则需要进行续约申请,申请过程如下:

此外动态分配的IP地址有租期的限制,在租约剩余50%的时候,客户端会发送DHCP REQUEST报文向DHCP服务器申请租约更新,若服务器返回DHCP ACK报文则客户端成功续约,但是如果申请的IP地址已经不能再使用,则会发送DHCP NAK报文给客户端,此时客户端会以广播形式发送DHCP Discover报文给局域网内的所有DHCP服务器,在该报文中request IP为自己正在使用的IP,如果没有收到DHCP ACK报文则继续使用当前IP地址,到租约期的87.5%时重复上述过程,如果在租约期结束时仍未成功续约,则客户端要释放该IP地址,重新进行IP地址的申请。

手动释放IP以及重新申请IP

DHCP手动进行IP地址释放或者申请IP的命令如下(分别为windows与linux的操作命令):

ipconfig /release| dhclient -r   #将当前的IP地址与其他配置信息释放复制代码
ipconfig /renew | dhclient   eth0     #向DHCP服务器申请一个IP地址复制代码

DHCP数据包格式

DHCP的数据包格式如下:

各字段含义如下:

op:报文类型,取值为1或2

1:客户端请求报文

2:服务器响应报文

Htype:硬件类型,1则表示以太网

Hlen:硬件地址长度,以太网的为6

Hops:表示当前客户端经过的中继数目,默认值为0,该值要小于等于16,大于16则会被标记为不可达。

Xid:为客户端随机挑选的随机数,用于与服务端发送的报文相对应

Secs:表示客户端获取地址或者地址租用后所用的时间,单位为s

Flags:标志为,前15为均为0,第16位表示该报文为广播还是多播

0:客户端以单播的形式发送报文给服务端

1:客户端以广播的形式发送报文给服务端

Ciaddr(client ip address):客户端IP地址。可以是服务端分配的IP地址也可以是客户端已有的IP地址,在客户端初始化状态该值为0.0.0.0。

Yiaddr(your client ip address):服务端即将分配给客户端的IP地址。在服务端进行响应时填充该字段。

Siaddr(server ip addr):客户端获取启动配置信息的IP地址。

Giaddr(gateway ip addr):第一个DHCP中继的IP地址。客户端和DHCP服务器不在同一个网段时,当客户端发送DHCP请求给第一个DHCP Relay服务器时,该服务器将自己的IP地址填充至该字段,服务器也是根据该地址进行响应报文的发送。

Chaddr(client hardware address):客户端的MAC地址。

Sname:可选,由服务器端填写,填充的为客户端获取配置信息的服务器名称。

file:可选,由服务器填写,该字段填充的是客户端需要获取的配置文件名称。

Options:DHCP选项字段。

由于DHCP协议具有局限性,只能与存在于同一网段的客户端进行通信并分配IP,为了解决这一问题,我们可以采用DHCP代理的方式,由其服务客户端和服务器端之间的报文中转。在客户端看来,DHCP代理服务器就是DHCP服务器,对于DHCP服务器来说代理服务器就是一个申请IP分配的客户端,下面简单介绍一下代理服务器进行中转报文的过程以及相关配置。

DHCP中继代理

DHCP中继代理应用于DHCP服务器和客户端不在同一网段的情况下IP地址的分配。DHCP Relay在收到客户端的DHCP Discover报文后会修改该报文中相应字段,并将报文由广播改为单播发送给指定的DHCP Server,其余报文的发送也由DHCP Relay服务器进行转发。对于客户端来说DHCP Relay服务器与DHCP Server服务器之间的通信是透明的,对于DHCP服务器来说DHCP Relay服务器与客户端之间的通信也是透明的。

架构图如下所示:

配置如下

DHCP中继服务器配置

1、修改/etc/sysctl.conf,开启linux路由转发功能

# Controls IP packet  forwarding
net.ipv4.ip_ forward = 1复制代码

2、使配置生效

#sysctl -p复制代码

3、配置dhcprelay

#vim /etc/sysconfig/dhcrelay复制代码

4、启动中继服务

#service dhcrelay start复制代码

DHCP服务器配置

DHCP协议缺陷

DHCP可以很好的进行IP地址的分配,但是DHCP协议已存在一些缺点,如:

1、DHCP协议不支持跨网段进行地址分配

2、DHCP协议不能获取非DHCP客户端的IP地址,在地址池设置不合理的情况下可能会造成地址冲突。

基于上述的缺陷,我们需要合理对IP地址池进行设置,并预留一些IP地址,分配给需要固定IP的服务器。

以上就是DHCP协议的介绍啦,希望能够帮助你对DHCP协议有一个简单的认识。


本文首发于公众号“小米运维”,点击查看原文。


你可能感兴趣的:(浅谈DHCP协议)