细谈DHCP

DHCP简介

DHCP(Dynamic Host Configration Protocol),动态主机配置协议是一种针对于IP地址进行动态管理和分配的技术。显而易见,DHCP可以动态为主机分配地址,但是也可以静态的分配地址给主机,也就是说给某个主机分配一个固定的地址。使用DHCP的好处在于:降低了维护成本,可以远程进行控制,并且可以集中对网络进行管理。

DHCP的典型组网

请添加图片描述
在DHCP中,主要包括三种角色:

  • DHCP服务器
    DHCP服务器负责从地址池中选择IP地址分配到DHCP客户端,还可以为DHCP客户端提供其它网络参数,好比默认网关地址,DNS服务器或者WINS服务器地址等。DHCP服务器可以接收来自本网段或者是跨网段由DHCP中继转发的DHCP请求报文。
  • DHCP客户端
    客户端可以理解为请求IP地址的设备,好比:IP电话,手机,PC等。DHCP客户端发送DHCP请求报文进行IP地址的请求。
  • DHCP中继
    很多时候,DHCP服务器并不与DHCP客户端在同一网段,因此就需要一个代理,也就是这里的中继,及逆行帮助跨网段转发。过程具体如下:
    DHCP客户端首先发送广播范围的请求的报文(目的地址为255.255.255.255),这样的话位于同一网段的DHCP服务器可以接收到广播的请求报文,但是如果不在一个网段,那就无法接收到DHCP客户端的请求报文,这个时候就需要DHCP中继进行转发DHCP报文。在DHCP中继这里,收到DHCP客户端发送的消息之后不会原样进行转发,而是会修改格式,然后生成一个新的DHCP报文再进行转发。

DHCP租期和地址池

  • 租期:
    DHCP服务器为每一个DHCP客户端分配的地址都定义了一个使用期限,这个期限就叫做租期。在租期到期之前,如果DHCP客户端仍然需要使用这个IP地址,那么可以请求进行延长租期;但是在租期到期之前,如果不需要这个地址了,那就可以主动释放掉这个IP地址。在没有其他空余可用的IP地址的情况下,DHCP服务器就会把这个被释放掉的IP地址分配给其它客户端。就是说,被用过的IP地址优先级不如没有使用过的IP地址,分配的话首先分配未使用过的IP地址,如果原来的用户重新向服务器请求,就可以使用原来自己使用的那个IP地址。其中静态分配的地址是没有租期限制的,也就是永久有效。
  • 地址池
    地址池是指DHCP服务器可以为客户端分配的IP地址的集合。除了IP地址之外,地址池中还可以分配租期,子网掩码,默认网关等等,这些参数在地址进行分配的时候,一块分配给客户端。
    根据创建的方式不同,地址池分为基于接口的地址池和基于全局的地址池:
  • 基于接口的地址池:在DHCP服务器与客户端相连的接口上进行配置,地址池跟接口地址是一个网段,并且地址池中的地址只能分配给这个接口下的客户端。这种方式见到那,但是只适用于DHCP服务器与客户端在同一个网段的场景。
  • 基于全局方式的地址池:在系统视图下创建指定网段的地址池,并且地址池中的地址可以分配给设备所有接口下的客户端,当DHCP服务器与客户端不在同一个网段的时候,需要部署DHCP中继。
    地址池中的地址分为多种状态:已使用的(Used)、空闲的(Idle)、冲突的(Conflict)、不能使用的(Disable)和静态绑定的(Static-bind)等。

DHCP报文介绍

DHCP客户端与DHCP服务器之间通过DHCP报文进行通信。DHCP报文是基于UDP协议进行传输的。DHCP客户端向DHCP服务器发送报文的时候采用68端口,DHCP服务器端向DHCP客户端发送报文的时候采用67端口号。没以前有八种类型的报文。

  • DHCP DISCOVERY:DHCP客户端首次登录网络时进行DHCP交互发送的第一个报文,用来寻找DHCP服务器。
  • DHCP OFFER:DHCP服务器用来相应DHCP DISCOVERY报文,这个报文用于响应DHCP DISCOVERY报文。
  • DHCP REQUEST:此报文用于以下三种用途:
    客户端初始化之后,发送广播的DHCP REQUEST报文来回应服务器的DHCP OFFER报文。
    客户端重启之后,发送广播的DHCP REQUEST报文来确认先前被分配的IP地址等配置信息
    当客户端已经和某个IP地址绑定之后,发送DHCP REQUEST单播或者是广播来绑定新的IP地址的租约
  • DHCP ACK:服务器对客户端的DHCP REQUEST报文进行确认响应报文,客户端收到这个报文之后,才真正的获取了IP地址和相关的配置信息。
  • DHCP NAK:服务器对客户端的DHCP Request报文的拒绝相应报文,例如DHCP服务器收到DHCP Request保温之后,没有找到相应的租约记录,那就发送DHCP NAK作为应答,告知DHCP客户端无法分配合适IP地址。
  • DHCP DECLINE:客户端发现服务器分配给他的IP地址冲突时会通过发送此报文来通知服务器,并且重新向服务器申请地址。
  • DHCP RELEASE:客户端发送这个报文主动释放服务器给他分配的IP地址,服务器收到这个保温之后,就可以将这个IP地址分配给其它客户端。
  • DHCP INFORM:DHCP客户端获得IP地址后,如果需要向DHCP服务器获得更加详细的配置,那么客户端就向服务器发送DHCP INFORM请求报文。

DHCP报文格式

DHCP报文的格式是在BOOTP报文格式的基础之上发展而来的,因此,DHCP服务器支持与BOOTP客户端之间进行交互。请添加图片描述

  • OP字段:1字节:标识报文类型,取值为1或2,1表示客户端,2表示服务器端。
  • Htype:1字节:表示硬件类型。最常见的是1,表示以太网。
  • hlen:1字节:表示硬件长度。
  • hops:1字节:表示当前的DHCP报文经过的DHCP中继的数目。这个字段由客户端或者服务器设置为0,没经过一个DHCP中继,这个字段就会加一。DHCP中继数目不能超过16个,也就是HOP不能超过16,否则DHCP报文就会被丢弃。
  • secs:2字节:表示客户端从开始获取地址或地址续租更新之后所用的时间,单位是s。
  • flags:2字节:最高位才有意义,其余15位都被置为0,为0时,客户端请求服务器以单播的形式发送响应报文。为1时,客户端请求服务器以广播形式发送响应报文。
  • ciaddr:4字节:表示客户端的IP地址。
  • yiaddr:4字节:表示服务器分配给客户端的IP地址。
  • siaddr:4字节:DHCP客户端获得启动配置信息的服务器的IP地址。
  • giaddr:4字节:表示第一个DHCP中继的IP地址。
  • chaddr:16字节:表示客户端的MAC地址。
  • sname:64字节:表示客户端获取配置信息的服务器的名字。
  • options:可变:DHCP通过这个字段包含了DHCP报文类型,服务器分配给中断的配置信息,网关IP地址,DNS服务器的IP地址,客户端可以使用的IP地址的有效租期等。

DHCP原理描述

只有跟DHCP客户端在同一个网段的DHCP服务器才能收到DHCP客户端广播的DHCP DISCOVER报文。如果客户端与服务器不在一个网段,那就必须部署中继来转发DHCP客户端和DHCP服务器之间的DHCP报文。

  • 无中继场景的DHCP客户端首次接入网络的工作原理
    请添加图片描述

第一步:发现阶段:
首次接入网络的DHCP客户端不知道DHCP服务器的IP地址,为了学习到DHCP服务器的IP地址,DHCP客户端以广播的方式发送DHCP DISCOVER报文,目的IP地址为255.255.255.255,发送给同一网段内设备,包括DHCP服务器或者中继等等。DHCP DISCOVER保温里面携带了客户端的MAC地址(chaddr字段)等信息。
第二步:提供阶段:
与DHCP客户端位于同一网段内的服务器都会接收到DHCP DISCOVER报文,DHCP服务器选择跟接收DHCP DISCOVER报文接口的IP地址处于同一网段的地址池,并且从中选择一个可以用的IP地址,然后通过DHCP OFFER报文发送给DHCP客户端。
通常,DHCP服务器的地址池中会指定IP地址的租期,如果DHCP客户端发送的DHCP DISCOVER报文中携带了期望租期,服务器会将客户端请求的期望租期与指定租期进行比较,选择其中时间较短的租期分配给客户端。
DHCP 服务器在地支持给客户分配IP地址的顺序如下:

  1. DHCP服务器上已配置的与客户端MAC地址静态绑定IP地址。
  2. 客户端发送DHCP DISCOVER报文中指定地址。
  3. DHCP服务器上记录的而曾经分配给客户端的IP地址。
  4. 在地址池中随机查找一个idle状态的IP地址。
  5. 如果没有找到可以分配的IP地址,那就以此查询超过租期处于冲突的IP地址,如果找到了可用的IP地址,那就进行分配;否则,DHCP客户端等待应答超时之后,重新发送DHCP DISCOVER报文进行申请IP地址。

为了防止分配出去的IP地址跟网络中的其它客户端的IP地址冲突,DHCP服务器在发送DHCP OFFER报文之前,通过发送源地址为DHCP服务器的IP地址,目的地址为预分配出去的IP地址的ICMP ECHO REQUEST报文对分配的IP地址进行地址冲突检测。如果在指定时间之内没有收到应答报文,说明网络中没有客户端使用这个IP地址,可以分配给客户端;如果在指定时间之内收到了应答报文,表示网络中已经存在了使用这个IP地址的客户端,则把这个地址列为冲突地址,然后重新等待再次收到DHCP DISCOVER报文之后按照前面的顺序再次重新进行分配。

第三步:选择阶段:
如果有多个DHCP SERVER向DHCP 客户端回应DHCP OFFER报文,那么DHCP 客户端一般只接收第一个收到的DHCP OFFER报文,然后以广播的方式发送DHCP REQUEST报文,这个报文里面包含了客户选要选择的DHCP想要使用的DHCP 服务器的标识符和客户端的地址。然后其它的DHCP服务器就可以重新将曾经分配给客户端的IP地址分配给其它的客户端。
第四步:确认阶段:
当DHCP 服务器收到客户端发送的DHCP REQUEST报文之后,DHCP 客户端回应DHCP ACK报文,表示DHCP REQUEST报文中请求的IP地址分配给客户端使用。
DHCP客户端收到DHCP ACK保温之后,会发送广播的免费ARP,探测本网段是否有其他终端使用服务器分配的地址,如果在指定时间之内没有收到回应,那就证明没有设备使用这个IP地址,但是如果收到了回应,那就会向DHCP 服务器发送DHCP DECLINE报文,并且重新向服务器申请IP地址。停驶,DHCP 服务器会将此地址列为冲突地址。当DHCP 服务器没有空闲地址可以分配的时候,在选择冲突地址进行分配,尽量减少分配出去的地址冲突。
当DHCP服务器收到DHCP客户端发送的DHCP REQUEST报文之后,如果DHCP服务器由于某些原因(好比协商出错,或者是已经把地址分配给了别的设备)无法分配IP地址,那就回复DHCP NAK报文作为应答,通知DHCP客户端无法分配这个IP地址。DHCP客户端需要重新发送DHCP DISCOVER报文来申请新的IP地址。

有中继场景的DHCP客户端首次接入网络的工作原理

与没有中继的工作原理基本相同。主要差异就在于DHCP中继在DHCP服务器和DHCP客户端之间转发DHCP报文,以保证DHCP服务器和DHCP客户端可以正常交互。
请添加图片描述

第一步:发现阶段:
DHCP中继接收到DHCP客户端广播发送的DHCP DISCOVER报文之后:

  1. 检查DHCP报文中的hops字段,如果大于16,那就丢弃DHCP报文,否则,将hops字段加一(表示经过了一次DHCP中继,并且进行下面的操作)。
  2. 检查DHCP报文中的giaddr字段,如果是0,将giaddr字段设置为接收DHCP DISCOVER报文的接口IP地址,如果不是0,那就不修改这个字段,继续进行下面的操作。giaddr:4字节:表示第一个DHCP中继的IP地址。
  3. 将DHCP报文你的目的IP地址改为DHCP服务器或者是吓一跳中继的IP地址,源地址改成中继链接客户端的接口地址,通过路由转发DHCP报文单播发送带DHCP服务器或者下一跳中继。

如果DHCP客户端与DHCP服务器之间存在多个DHCP中继,那后面中继接收到的DHCP DISCOVER报文的处理流程跟之前所述一致。
第二步:提供阶段:
DHCP服务器收到DHCP DISCOVER保温之后,选择与报文中giaddr字段在同一网段的地址池,并且为客户端分配IP地址等参数,然后向giaddr字段标识的DHCP中继单播发送DHCP OFFER报文。
DHCP中继收到DHCP OFFER保温之后,会进行如下处理:
1 检查报文中的guaddr字段,如果不是接口的地址,那就丢弃该报文,否则执行下面的操作
2 DHCP中继检查报文的广播标志位,如果广播标志位为1,那就将DHCP OFFER报文发送给DHCP客户端;否则将DHCP OFFER单播报文发送给DHCP客户端。
第三步:选择阶段:
同无中继的步骤
第四步:确认阶段:
同无中继的第四步

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘不忙!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值