DHCP(动态主机配置协议)协议详细解析

引入

导入

我们知道,如果你得到了某台电脑的IP,就可以向这个IP发起连接请求,建立连接后就可以操作收发数据。

五层网络协议对应的消息体变化分析,如下图所示:

要发送的数据,会在网络层里加入IP头

这里面最重要的是发送端和接收端的IP地址。这个IP地址就像是一个门牌号一样,有了它,数据包就能在这个纷繁复杂的网络世界里找到该由谁来接收这个数据包。

所以说上面的网络通信离不开IP。

假设我有一台新买的电脑,还没联网呢,这时候拿着新买的网线,插入网线口,网线插口亮起来了。

然后就可以开始用它上网了。

那么问题来了。

刚插上网线,电脑怎么知道自己的IP是什么?怎么就突然能上网了呢?

新电脑插上网线之后,获得IP的方式主要有两种。

第一种是配置静态IP地址

第二种是DHCP(Dynamic Host Configuration Protocol,动态主机配置协议):

通过DHCP,在联网之后可以自动获取到本机需要的IP地址,子网掩码还有路由器地址

前言

①DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址,子网掩码,Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率

②DHCP(DynamicHost ConfigurationProtocol),动态主机配置协议,是一个应用层协议,具体可以参考《TCP/IP四层模型》文章。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。

③DHCP使用客户服务器方式。需要IP地址的主机在启动时就向DHCP服务器广播发送发现报文(将目的IP地址置为全1,即255.255.255.255),这时该主机就称为DHCP客户。(发送广播报文是因为现在还不知道DHCP服务器在什么地方,因此要发现DHCP服务器的IP地址。)这台主机目前还没有自己的IP地址,因此它将IP数据包的源IP地址设为全0,这样在本地网络上的所有主机都能收到这个广播报文,但只有DHCP服务器才对此广播报文进行回答。DHCP服务器先在其数据库中查找该计算机的配置信息。若找到则返回找到的信息。若找不到,则从服务器的IP地址池中取一个地址分配给该计算机。

④并不是每个网络上都设置一个DHCP服务器,因为这样会使DHCP服务器的数量太多。因此现在是使每个网络至少有一个DHCP中继代理(通常是一台路由器,它配置了DHCP服务器的IP地址信息。当DHCP中继代理收到主机A以广播形式发送的发现报文后,就以单播的方式向DHCP服务器转发此报文,并等待其回答。收到DHCP服务器回答的提供报文后,DHCP中继代理再把此提供报文发回给主机A)

⑤DHCP服务器分配给DHCP客户(需要被分配ip地址的主机)的IP地址是临时的,因此DHCP客户只能在一段有限的时间内使用这个分配到的IP地址。DHCP协议称这段时间为租用期。

⑥DHCP客户使用的UDP端口是68,而DHCP服务器使用的UDP端口是67。

⑦DHCP的作用:为客户机分发IP地址、子网掩码、网关、DNS服务器、租期等参数。

⑧DHCP的好处:简化客户机设置;防止用户误操作;避免局域网内主机的IP地址重复,提高IP地址的利用率。

⑨DHCP的架构:C/S架构,客户机/服务器架构(C-Client/S-Server);DHCP服务对应的是UDP协议,因为是C/S架构,所以DHCP服务是分为:客户机占用UDP 67号端口,DHCP服务器占用UDP 68号端口。

⑩DHCP的概念名词:

  • DHCPClient:DHCP客户端,通过DHCP协议请求IP地址的客户端。DHCP客户端是接口级的概念,如果一个主机有多个以太接口,则该主机上的每个接口都可以配置成一个DHCP客户端。交换机上每个Vlan接口也可以配置成一个DHCP客户端。
  • DHCPServer:DHCP服务端,负责为DHCP客户端提供IP地址,并且负责管理分配的IP地址。
  • DHCPRelay:DHCP中继器,DHCP客户端跨网段申请IP地址的时候,实现DHCP报文的转发功能。
  • DHCPSecurity:DHCP安全特性,实现合法用户IP地址表的管理功能。
  • DHCPSnooping:DHCP监听,记录通过二层设备申请到IP地址的用户信息。

DHCP工作原理

1、DHCP使用UDP协议工作采用67(DHCP服务器端)和68(DHCP客户端)两个端口号。(546号端口用于DHCPv6Client,而不用于DHCPv4,是为DHCPfailover服务)

2、DHCP客户端向DHCP服务器发送的报文称之为DHCP请求报文;而DHCP服务器向DHCP客户端发送的报文称之为DHCP应答报文。

3、DHCP交互过程共分为4步:

  • 第一步:Client端在局域网内发起一个DHCP Discover包,目的是想发现能够给它提供IP的DHCP Server。
  • 第二步:可用的DHCP Server接收到DHCP Discover包之后,通过发送DHCP Offer包给予Client端应答,意在告诉DHCP Client端它可以提供IP地址。
  • 第三步:DHCP Client端接收到DHCP Offer包之后,发送DHCP Request包请求分配IP。
  • 第四步:DHCP Server发送DHCP ACK数据包,确认信息。

4、DHCP协议工作原理的通俗理解:某台待入网的设备向某个管IP分配的服务器,也就是DHCP服务器,申请IP地址。

5、四种不同类型DHCP数据包的解释:

  • DHCP Discover:在联网时,本机由于没有IP,也不知道DHCP服务器的IP地址是多少,所以根本不知道该向谁发起请求,于是索性选择广播,向本地网段内所有人发出消息,询问"谁能给个IP用用"。

  • DHCP Offer:不是DHCP服务器的机子会忽略你的广播消息,而DHCP服务器收到消息后,会在自己维护的一个IP池里拿出一个空闲IP,通过广播的形式给回你的电脑。

  • DHCP Request:你的电脑在拿到IP后,再次发起广播,就说"这个IP我要了"。

  • DHCP ACK:DHCP服务器此时再回复你一个ACK,意思是"ok的"。你就正式获得这个IP在一段时间(比如24小时)里的使用权了。后续只要IP租约不过期,就可以一直用这个IP进行通信。

DHCP交互为什么会有第三个和第四个阶段

问:大家有没有发现,在DHCP Offer阶段,其实你的设备就已经拿到了IP了,为什么还要有后面的DHCP Request和DHCP ACK呢?是不是有些多此一举?

答:

这是因为本地网段内,可能有不止一台DHCP服务器,在你广播之后,每个DHCP服务器都有可能给你发DHCP Offer数据包。

本着先到先得的原则,你的设备一般会对第一个到的DHCP Offer响应DHCP Request,目的是为了确认DHCP offer,在你确认DHCP Offer这段时间内,DHCP服务器确认这个IP还没被分出去,你才可以安心使用这个IP。

类比投简历:

你海投简历(DHCP Discover),然后拿到了多个offer(DHCP Offer)。

这时候事情还没完,你一般会跟HR说:"你给我两天时间,我要跟家里人商量下"。

HR也会对你说:"那你尽快确认,我这边还有不少候选人等着"。

之后你考虑下来觉得不错,跟HR说要接这个Offer(DHCP Request),HR看了下这个岗位还在,才能确认让你第二天来上班(DHCP ACK)。如果这个公司的岗位已经招到其他候选人了,第四阶段的消息就会改为发DHCP NAK,意思是拒绝了你的接Offer请求。

DHCP工作过程

1、DHCP服务器被动打开UDP端口67,等待客户端发来的报文。

2、DHCP客户从UDP端口68发送DHCP发现报文。

3、凡收到DHCP发现报文的DHCP服务器都发出DHCP提供报文,因此DHCP客户可能收到多个DHCP提供报文。

4、DHCP客户从几个DHCP服务器中选择其中的一个,并向所选择的DHCP服务器发送DHCP请求报文。

5、被选择的DHCP服务器发送确认报文DHCPACK。从这时起,DHCP客户就可以使用这个IP地址了。这种状态叫做已绑定状态,因为在DHCP客户端的IP地址和硬件地址已经完成绑定,并且可以开始使用得到的临时IP地址了。DHCP客户现在要根据服务器提供的租用期T设置两个计时器T1和T2,它们的超时时间分别是0.5T和0.875T。当超时时间到了就要请求更新租用期。

6、租用期过了一半(T1时间到),DHCP发送请求报文DHCPREQUEST要求更新租用期。

7、DHCP服务器若同意,则发回确认报文DHCPACK。DHCP客户得到了新的租用期,重新设置计时器。

8、DHCP服务器若不同意,则发回否认报文DHCPACK。这时DHCP客户必须立即停止使用原来的IP地址,而必须重新申请IP地址(回到步骤2)。
若DHCP服务器不响应步骤6的请求报文DHCPREQUEST,则在租用期过了87.5%(T2时间到),DHCP客户必须重新发送请求报文DHCPREQUEST(重复步骤6),然后又继续后面的步骤。

9、DHCP客户可以随时提前终止服务器所提供的租用期,这时只需要向DHCP服务器发送释放报文DHCPRELEASE即可。

Wireshark抓包分析DHCP

链接:

提取码:lpg9

前提:要想抓取到DHCP包,先要保证有可用的DHCP服务器,然后将主机IP地址获取方式设置为自动获取。

测试环境:笔记本设置为DHCP模式,路由开启DHCP服务。由于笔记本在开机时想路由DHCP去获取IP,开机时无法迅速打开wireshark软件进行抓包,我们使用以下命令先断开主机的网络连接,然后再连接网络。

步骤:

①终端执行命令:ipconfig /release

断开当前的网络连接,主机IP变为0.0.0.0,主机与网络断开,不能访问网络。

②终端执行命令:ipconfig /renew

更新适配器信息,请求连接网络,这条命令结束之后,主机会获得一个可用的IP,再次接入网络。

③抓取的数据包如下:

④经过抓包分析,DHCP客户端获取IP地址的四个阶段如下:

DHCP Discover数据包

DHCP Offer包

当DHCP服务器收到一条DHCP Discover数据包时,用一个DHCP Offerr包给予客户端响应。 这一数据报中客户客户端获取到了最重要的IP地址信息。除此之外,服务器还发送了子网掩码,路由器,DNS,域名,IP地址租用期等信息。

DHCP服务器仍然使用广播地址作为目的地址,因为此时请求分配IP的Client并没有自己ip,而可能有多个Client在使用0.0.0.0这个IP作为源IP向DHCP服务器发出IP分配请求,DHCP也不能使用0.0.0.0这个IP作为目的IP地址,于是依然采用广播的方式,告诉正在请求的Client们,这是一台可以使用的DHCP服务器。

DHCP Request包

当Client收到了DHCP Offer包以后(如果有多个可用的DHCP服务器,那么可能会收到多个DHCP Offer包),确认有可以和它交互的DHCP服务器存在,于是Client发送DHCP Request数据包,请求分配DHCP Offer中的IP地址。

此时的源IP和目的IP依然是0.0.0.0和255.255.255.255。

DHCP ACK包

DHCP 服务器用DHCP ACK包对DHCP Request进行响应。

DHCP协议基于传输层UDP协议进行数据传输

另外,通过抓包,可以发现DHCP协议是应用层的协议,基于传输层UDP协议进行数据传输。

问:为什么DHCP用UDP,能不能改用TCP?

答:

按道理说,UDP能做到的,TCP一般也能做到。但这次真不行

主要原因还是因为TCP是面向连接的,而UDP是无连接的

所谓"连接",他就只有一个发送端和一个接收端,就跟水管一样。

而DHCP Client由于一开始并不知道要跟谁建立连接,所以只能通过广播的形式发送消息,注意,小细节,广播

同样是在本地网段内发广播消息,UDP协议只需要发给255.255.255.255它实际上并不是值某个具体的机器,而是一个特殊地址,这个地址有特殊含义,只要设了这个目的地址,就会在一定本地网段内进行广播

而TCP协议却不同,它需要先建立连接,但实际上255.255.255.255对应的机器并不存在,因此也不能建立连接。如果同样要做到广播的效果,就需要先得到本地网段内所有机器的IP,然后挨个建立连接,再挨个发消息。这就很低效了。

因此DHCP选择了UDP协议进行数据传输,而不是TCP

DHCP Offer阶段可以为广播的形式也可以为单播的形式(跟操作)

1、上面的例子《DHCP的工作过程》详细的介绍了DHCP Server给DHCP Client回复DHCP Offer数据包时使用广播的方式回复。

2、DHCP优化:DHCP Offer 阶段时,DHCP服务器也会选择使用单播的形式回复。

其实,这是DHCP协议的一个小优化:

原则上在DHCP offer阶段DHCP Server使用广播的形式进行回复,目标机器收到后自然就会进入第三阶段DHCP Request;而非目标机器,收到后解包后发现目的机器的MAC地址跟自己的不同(DHCP数据包中会包含目标机器的MAC地址),也会丢掉这个包。

但是问题就出在:非目标机器需要每次都在网卡收到包,并解完包,才发现原来这不是给它的消息,这。。。真的有被打扰到。 如果本地网段内这样的包满天飞,也浪费机器性能。

如果能用单播,那当然是最好的。但这时候目标机器其实并没有IP地址,有些操作系统在这种情况下能收单播包,有些操作系统则认为不能收,这个跟操作系统系统的实现有关。

因此,对于能收单播包的操作系统,DHCP客户端会在发DHCP Discover阶段设一个 Broadcast flag = 0 (unicast) 的标志位,告诉DHCP服务器,支持单播回复,于是DHCP服务器就会在DHCP Offer阶段以单播的形式进行回复

DHCP Discover数据包中要求DHCP Server使用单播的形式进行回复:

是不是设备的每次联网都要经历DHCP四个阶段?

只要想联网,就需要IP,要用IP,就得走DHCP协议去分配。

但大家也发现了,DHCP的第一阶段和第二阶段都可能会向当前网段发广播消息。对于家用电脑还好,插个网线,之后就雷打不动,不需要重新入网,也不需要去重新请求DHCP Server要求分配IP地址,当然IP地址也不会变。

但像手机这样的移动设备,是要带着到处跑的,坐个地铁,进个电梯,公司里到处走走,都可能会涉及到网络切换。移动设备每一次网络的切换IP地址可能也会改变而且每次改变都会重新请求DHCP Server重新分配IP地址。

这每次都要来一个完整的四阶段,各种广播消息满天飞,其实对网络环境不太友好。

以手机为例,场景为断开WIFI后再重新连接WIFI(手机会经历一个从无网络到有网络的过程)。抓包过程如下:

其实只发生了DHCP的第三和第四阶段。这是因为设备记录了曾经使用过 192.168.31.170这个IP,重新联网后,会优先再次请求这个IP,这样就省下了第一第二阶段的广播了。 

另外需要注意的是,抓包图里DHCP Request之所以出现两次,是因为第一次DHCP Request发出后太久没得到回应,因此重发。

DHCP分配下来的IP一定不会重复吗?

一般来说DHCP服务器会在它维护的IP池里找到一个没人用的IP分配给设备。

这个IP如果重复分配了,那本地网段内就会出现两个同样的IP,这个IP下面却对应两个不同的mac地址。但其他机器上的ARP缓存中却只会记录其中一条mac地址到IP的映射关系

于是,数据在传递的过程中就会出错。

因此本地网段内IP必须唯一。

问:那么DHCP分配下来的IP地址有没有可能跟别的舍比的IP地址是重复的?

答:

有两个常见的情况可能会导致出现IP重复的情况。

  • 配置静态IP地址,自己在设备入网的时候配置的静态IP地址可能跟其他DHCP服务器分配下来的IP地址是相同的。解决方案:尽量不要手动去为设备配IP地址,统一走DHCP方式自动为设备分配IP地址。或者在DHCP服务器中维护的IP地址范围里,将这条配置的静态IP地址剔除。(防止DHCP服务器又会将此IP地址分配给其他的主机)
  • 一个本地网段内,是可以有多个DHCP服务器的,而他们维护的IP地址范围是有可能重叠的,于是就有可能将相同的IP地址给到不同的设备。解决方案:修改本地网段多台DHCP服务器的维护的IP地址范围,让维护的IP地址不重叠。

DHCP Client在得到DHCP ACK之后立马就能使用这个IP了吗?

其实设备也一样。在得到DHCP ACK之后,设备不会立刻就使用这个IP进行通信。

而是会先发三条ARP消息。(ARP消息同样是以广播的方式发送给本地网段内所有的设备)

大家知道ARP消息的目的是通过IP地址去获得mac地址。所以普通的ARP消息里,是填了IP地址,不填mac地址的。(MAC地址由响应方响应给请求方)

但这三条ARP协议,比较特殊,它们叫无偿ARPGratuitous ARP),特点是它会把IP和mac地址都填好了,而且填的还是自己的IP和mac地址

目的有两个:

  • 一个是为了告诉本地网段内所有设备,从现在起,xx IP地址属于xx mac地址,让大家记录在ARP缓存中。

  • 另一个就是看下本地网段里有没有其他机子也用了这个IP,如果有冲突的话,那需要重新再走一次DHCP流程。

设备在本地网段发送三次无偿ARP消息之后,确认没有IP地址冲突后才会开始使用这个IP地址进行通信。

类比:

这就好像在问,拿到offer并得到hr的确认之后你是第一时间就去上班吗?

不。你会先告诉你的同事同学朋友,甚至会发朋友圈。

设备的这种行为,实际上就跟你拿了offer得到hr的确认之后发了这么个朋友圈没啥区别。而且,还连发了三条。 

DHCP缺点

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

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

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

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

DHCP应用实例

DHCP很适合于经常移动位置的计算机。
当计算机使用Windows操作系统时,点击"控制面板"的"网络"图标就可以找到某个连接中的网络下面的菜单,找到TCP/IP协议后点击其"属性"按钮,若选择"自动获得IP地址"和"自动获得DNS服务器地址",就表示是使用DHCP协议。

DHCP协议总结

  • 设备插上网线,联网后会通过DHCP协议动态申请一个IP地址,同时获得子网掩码,路由器地址等信息。

  • DHCP分为四个阶段,分别是 DHCP Discover,DHCP Offer, DHCP Request和DHCP ACK。如果曾经连过这个网,机器会记录你上次使用的IP,再次连接时优先使用原来的那个IP,因此只需要经历第三第四阶段。

  • DHCP是应用层协议,考虑到需要支持广播功能,底层使用的是UDP协议,而不是TCP协议。

  • DHCP分配下来的IP是有可能跟某台手动配置的IP地址重复的。

  • DHCP得到IP之后还会发3次无偿ARP通告,在确认没有冲突后开始使用这个IP。

 

参考:

https://www.jianshu.com/p/af20735a2df0

https://zhuanlan.zhihu.com/p/359943429

https://mp.weixin.qq.com/s/LEaA6fgEIprkb1ErIqLY-g

https://blog.csdn.net/weixin_60067160/article/details/125910146

https://coderup.cn/2022/08/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/arp%E5%92%8Cdhcp%E7%9A%84%E5%8C%BA%E5%88%AB%E4%BB%A5%E5%8F%8A%E8%AF%A6%E7%BB%86%E8%AF%B4%E6%98%8E/

 

posted @ 2022-11-07 14:08  习久性成  阅读(1735)  评论(0编辑  收藏  举报