1、DHCP简介

动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或网络服务供应商自动分配IP地址;给用户用于内部网管理员作为对所有计算机作中央管理的手段。

DHCP是一个典型的Client/Server模型的协议,使用UDP传输

DHCP Server端,使用UDP端口:67DHCP Server可以在很多设备上部署,如Cisco、H3C、Juniper、Windows、Linux……都可以

DHCP Client端,使用UDP端口:68客户端(主机、路由器、交换机、网络打印机、网络摄像头……都可以作为DHCP客户端)

DHCP有三种机制分配IP地址:

自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。

动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。

手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。

三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。

2、DHCP状态机

如下图所示是比较常见的DHCP状态机

DHCP的实现分为4步,分别是:

第一步:Client端在局域网内发起一个DHCP Discover包,目的是想发现能够给它提供IP的DHCP Server。

第二步:可用的DHCP Server接收到Discover包之后,通过发送DHCP Offer包给予Client端应答,意在告诉Client端它可以提供IP地址。

第三步:Client端接收到Offer包之后,发送DHCP Request包请求分配IP。

第四步:DHCP Server发送ACK数据包,确认信息。

第五步:重新请求获取

第六步:重新发送ack包,确认信息

3、wireshake抓包分析

正常来说,一次DHCP过程只需要上面状态机的前四步,后面的续约是在DHCP的租期到达1/2和7/8的时候进行的。

打开任意一个数据包,我们可以看到wireshark已经把里面的数据分层显示。

从上到下依次为物理层、数据链路层、网络层、传输层和应用层。

tcpdump抓包命令:

tcpdump -i eth0 -c 8 -s 0 -w /mnt/sdcard/dhcp.pcap ‘udp and port 67 and port 68’ &

-i 选择网卡

-c 数据包个数

-s 数据包长度,默认只抓包头,0代表完整数据包

-w 写入文件

udp and port 67 and port 68:dhcp报文的过滤条件,udp协议,端口67和68

&使进程后台运行

3.1 发现阶段——DHCP Discover(广播)

3.1.1 DHCP Discover 理论分析

DHCP Discover(广播)是第一个阶段即DHCP客户端寻找DHCP服务端的阶段。

由于DHCP服务端的IP地址等信息对于DHCP客户端来说是未知,此时就需要使用广播的方式进行发送消息,基于UDP的源端口号68,目的端口号67来发送DHCP Discover发现信息来寻找DHCP服务器。

由于是广播包,在同一个广播域中的每一台安装了TCP/IP协议的主机都会接收到这种广播信息,但只有DHCP服务器才会做出响应。

在二层中,广播地址是12个f即ff:ff:ff:ff:ff:ff

在三层中,广播地址是4个255(IPv4)即255.255.255.255

换算成二进制,即全为1。

3.1.2 DHCP Discover 物理层

物理层给出的有用信息并不多,但是我们能够看到网卡相关信息和这个是DHCP的数据包且使用了UDP协议。

3.1.3 DHCP Discover 数据链路层

数据链路层中我们可以看到本机的MAC地址和目标MAC地址(广播)。

3.1.4 DHCP Discover 网络层

网络层的参数较多,我们对其进行一一解析:

版本(Version):4,表明这里使用IPv4

头部长度(Header Length):20 bytes,即20个字节

区分服务字段(Differentiated Services Field):0x00,十六进制,换算成二进制正好是下面的8个0,表明当前的IP数据报中没有使用服务类型字段,采用默认的“尽力传输”优先级别

总长度(Total Lenth):328,表明该数据报的总长度是328个字节

标识(Identification):0xe752,十六进制,换算成十进制正好是括号中的59218,表明该数据报的标识为0xe752

分段标识(Flags):保留位(Reserved bit)为0,Don’t fragment为0表示该数据报可以被分段,More fragments为0表明后面没有分段

分段偏移(Fragment offset):0,表明没有被分段

生存时间(Time to live):128,表明该数据报最多可以经过128个路由

上层协议(Protocol): UDP,值为17

头部校验(Header checksum): validation disabled,表示没有进行校验

校验状态(Header checksum status):Unverified,同上,没有进行校验

源IP地址(Source):0.0.0.0,表明当前尚未获得DHCP服务端分配的IP地址,只能使用0.0.0.0

目标IP地址(Destination):255.255.255.255,广播IP地址,对同一广播域内的所有TCP/IP协议客户端进行广播

3.1.5 DHCP Discover 传输层

传输层这里可以看到源端口为68,目的端口为67,且校验状态为未校验。

2.1.6 DHCP Discover 应用层

应用层的报文也有很多重要数据,我们截取重要的进行分析。

Bootp flags:0表示单播,1表示广播,这里为0,即DHCP服务端回复的DHCP Offer报文应为单播形式

部分书上讲述的DHCP四个包都是使用广播的方式进行,实际上DHCP Offer和DHCP Ack这两个数据包是广播还是单播是由DHCP的客户端发送的数据包来决定的。

Ciaddr即客户端IP地址(Client IP address)、

Yiaddr即被分配的DHCP客户端IP地址( Your(client) IP address)、

Siaddr即下一个为DHCP客户端分配IP地址的DHCP服务器地址(Next server IP address )、

Giaddr即DHCP中继IP地址(Relay agent IP address)、

这四个IP地址均为0.0.0.0,因为此时还处于DHCP的发现阶段,DHCP客户端对这些信息还是一无所知。

我们还可以看到请求信息里面需要请求获取包括子网掩码(Subnet Mask)、路由网关(Router)、 DNS服务器(Domain Name Server) 、以及域名(Domain Name)等信息

3.2 提供阶段——DHCP Offer(单播/广播)

3.2.1 DHCP Offer 理论分析

提供阶段,即DHCP服务器向DHCP客户端提供预分配IP地址的阶段。网络中的所有DHCP服务器接收到客户端的DHCP Discover报文后都会根据自己的DHCP地址池中IP地址分配的优先次序选出一个IP地址,然后与其他参数一起通过传输层的UDP67号端口在DHCP Offer报文中以单播/广播方式发送给客户端的UDP68号端口。

DHCP服务器在分配这个地址之间会ping一下这个分配的ip地址,如果没有Response就才会预分配这个地址

客户端通过封装在帧中的目的MAC地址(也就是DHCP Discover报文中的CHADDR字段值)的比对来确定是否接收该帧。但这样以来,理论上DHCP客户端可能会收到多个DHCP Offer报文(当网络中存在多个DHCP服务器时),但DHCP客户端只接收第一个到来的DHCP Offer报文。

3.2.2 DHCP Offer 数据链路层

这时可以看到根据之前的DHCP报文,这里使用了单播的形式。而源MAC地址就是DHCP服务器的MAC地址且目的MAC地址是之前发送DHCP Discover报文的客户端MAC地址。

3.2.3 DHCP Offer 网络层

网络层报文中我们可以看到这时候目的IP地址和源IP地址都已经有了数据,10.22.25.118就是即将要分配的IP地址,而10.22.25.254就是DHCP服务器的地址又或者是DHCP中继代理服务器的IP地址,具体要看应用层的报文。

通过DHCP中继代理服务,与DHCP服务器不在同一子网的DHCP客户端可以通过DHCP中继代理(通常是路由器或三层交换机设备开启DHCP中继功能)与位于其他网段的DHCP服务器通信,最终是DHCP客户端获取到从DHCP服务器上分配而来的IP地址。

此时的DHCP中继代理就位于DHCP客户端和DHCP服务器之间,负责广播DHCP报文的转发。

3.2.4 DHCP Offer 应用层

这个时候我们再看应用层的报文:

Ciaddr即客户端IP地址(Client IP address):此时还没有分配,所以还是0.0.0.0

Yiaddr即被分配的DHCP客户端IP地址( Your(client) IP address):10.22.25.118,这个IP即将分配给该客户端

Siaddr即下一个为DHCP客户端分配IP地址的DHCP服务器地址(Next server IP address ):192.168.112.240,这个是分配IP地址的DHCP服务器

Giaddr即DHCP中继IP地址(Relay agent IP address):10.22.25.254,这个是DHCP的中继代理服务器的IP地址,在这里应该是一个开启了DHCP中继的三层交换机

子网掩码(Subnet Mask)、路由网关(Router)、 DNS服务器(Domain Name Server) 、以及域名(Domain Name)等信息均已经包含在里面

租约时间是需要注意的一个问题,这里我们可以看到DHCP租约时间(IP Address Lease Time)实际上是8天,单位是s,wieshark换算成了天方便我们查看

而Renewal Time Value就是初次续约的时间,这个时间是租约时间的1/2,这里就是4天,这个时候一般客户端会以单播的方式向DHCP服务器发送报文请求续约

而Rebinding Time Value就是第二次续约时间,这个时间是租约时间的7/8,这里也就是7天,只有在初次续约失败之后,才会在这个时间以广播的方式向网络中的DHCP服务器再次申请IP地址

3.3 选择阶段——DHCP Request(广播)

2.3.1 DHCP Request 理论分析

选择阶段,即DHCP客户端选择IP地址的阶段。

如果有多台DHCP服务器向该客户端发来DHCPOFFER报文,客户端只接收第一个收到的DHCP Offer报文,然后以广播方式发送DHCP Request报文。在该报文的Requested Address选项中包含DHCP服务器在DHCP Offer报文中预分配的IP地址、对应的DHCP服务器IP地址等。

这样也就相当于同时告诉其他DHCP服务器,它们可以释放已提供的地址并将这些地址返回到可用的地址池中。

在DHCP REQUEST报文封装的IP协议头部中,客户端的Source Address仍然是0.0.0.0,数据包的Destination仍然是255.255.255.255。但在DHCP Request报文中Ciaddr、Yiaddr、Siaddr、Giaddr 字段的地址均为0.0.0.0

3.3.2 DHCP Request 数据链路层

这时候又变回了广播。

3.3.3 DHCP Request 网络层

由于是广播,所以目标IP地址是255.255.255.255,而源IP地址还是0.0.0.0是因为还没有完成整个DHCP过程,本机尚未获取到IP地址。

3.3.4 DHCP Request 应用层

Bootp flags:0表示单播,1表示广播,这里为0,即DHCP服务端回复的报文应为单播形式

Ciaddr、Yiaddr、Siaddr、Giaddr 字段的地址均为0.0.0.0

3.4 确认阶段——DHCP Ack(单播/广播)

3.4.1 DHCP Ack 理论分析

确认阶段,即DHCP服务器确认分配级DHCP客户端IP地址的阶段。

某个DHCP服务器在收到DHCP客户端发来的DHCP REOUEST报文后,只有DHCP客户端选择的服务器会进行如下操作:如果确认将地址分配给该客户端,则以单播/广播方式返回DHCP ACK报文;否则返回DHCP NAK报文,表明地址不能分配给该客户端。

3.4.2 DHCP Ack 数据链路层

可以看到这里是单播,源MAC地址是DHCP服务器(此处为中继代理)的MAC地址,目标MAC地址是DHCP客户端的MAC地址。

3.4.3 DHCP Ack 网络层

10.22.25.118就是即将要分配的IP地址,而10.22.25.254就是DHCP服务器的地址(此处为DHCP中继代理服务器)

3.4.4 DHCP Ack 应用层

在DHCPACK报文中Yiaddr字段包含要分配给客户端的IP地址,而Chaddr和DHCP:Client Identifier字段是发出请求的客户端中网卡的MAC地址。

同时,在选项部分也会把在DHCPOFFER报文中所分配的IP地址的子网掩码、默认网关、DNS服务器、租约期、续约时间等信息加上。

4、DHCP的IP地址租约更新

3.1 DHCP服务IP地址租约更新原理

如果采用动态IP地址分配策略,则DHCP服务器分配给客户端的IP地址都是有一定租约期限的,当租约期满后DHCP服务器又会收回原来分配的这个IP地址。

如果DHCP客户端希望继续使用该地址,则需要向DHCP服务器提出更新IP地址租约的申请,也就是前面所说到的“续约”。

IP地址租约更新或者IP地址续约也就是更新服务器端对IP地址的租约信息,使其恢复为初始状态。

3.2 申请续约的方法

在DHCP客户端的IP地址租约期限达到1/2时,由DHCP客户端向为它分配IP地址的DHCP服务器以单播方式发送DHCP REOUEST请求报文,以期进行IP租约的更新。

如果DHCP服务器同意续约,则DHCP服务器向客户端以单播方式返回DHCP ACK报文,通知DHCP客户端已经获得新IP租约,可以继续使用此IP地址;相反,如果DHCP服务器不同意续约,则DHCP服务器以单播方式返回DHCP NAK报文,通知DHCP客户端不能获得新的租约,此IP地址不可以再分配给该客户端。

如果上面的续约申请失败,则DHCP客户端还会在租约期限达到7/8时再次以广播方式发送DHCP REQUEST请求报文进行续约。DHCP服务器的处理方式同上,不再赘述。

如果第二次续约请求还是失败,则原来租约的IP地址将被释放。

4、DHCP中继代理服务

在前面我们已经说过,在DHCP客户端初次从DHCP服务器获取IP地址的过程中,所有从DHCP客户端发出的请求报文均是以广播方式(目的地址为255.255.255.255)进行发送的,所以DHCP服务只适用于DHCP客户端和DHCP服务器处于同一个子网(也就是DHCP服务器至少有一个端口与DHCP客户端所在的子网是直接连接的)的情况,因为广播包是不能穿越子网的。

基于DHCP服务的以上限制,这样一来,如果DHCP客户端与DHCP服务器之间隔了路由器设备,不在同一子网,就不能直接通过这台DHCP服务器获取IP地址,即使DHCP服务器上已配置了对应的地址池。这也就意味着,如果想要让多个子网中的主机进行动态IP地址分配,就需要在网络中的所有子网中都设置一个DHCP服务器。这显然是很不经济的,也是没有必要的。

DHCP中继功能可以很好地解决DHCP服务的以上难题。通过DHCP中继代理服务,与DHCP服务器不在同一子网的DHCP客户端可以通过DHCP中继代理(通常也是由路由器或三层交换机设备担当,但需要开启DHCP中继功能)与位于其他网段的DHCP服务器通信,最终使DHCP客户端获取到从DHCP服务器上分配而来的IP地址。此时的DHCP中继代理就位于DHCP客户端和DHCP服务器之间,负责广播DHCP报文的转发。

从前面的报文分析我们可以轻松的看出10.22.25.118和192.168.112.240是明显不属于同一个子网的,他们之间通信肯定需要使用路由器进行路由,而10.22.25.254就是担任着DHCP中继代理的角色。

至于和DHCP服务器之间经过了多少个路由,我们可以tracert一下。

从图中我们可以看到,从10.22.25.254这个DHCP中继代理到DHCP服务器之间需要经过5个路由节点。

而实际上,在很多的大型园区网络中,都会使用一个DHCP服务器集群+多个DHCP中继代理这样的方式进行DHCP分配。

ref:

https://tinychen.com/20190609-wireshark-dhcp/

https://developer.aliyun.com/article/278172

https://blog.csdn.net/qq_24421591/article/details/50936469

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: