网络基础知识笔记04:DHCP基本原理与配置(上)
网络基础知识笔记04 DHCP基本原理与配置(上)
由于本笔记有借鉴其他博文的内容,但仅做学习使用。已在下方给出原文链接,如有侵权,请联系本人进行删除,谢谢。
前言 -- 动态主机配置协议(Dynamic Host Configuration Protocol)
在大型企业网络中,会有大量的主机或设备需要获取IP地址等网络参数。如果采用手工配置,工作量大且不好管理,如果有用户擅自修改网络参数,还有可能会造成IP地址冲突等问题。
使用动态主机配置协议DHCP(Dynamic Host Configuration Protocol)来动态分配IP地址等网络参数,不仅可以减少管理员的工作量,而且避免用户手工配置网络参数时造成的地址冲突。
本节笔记主要介绍DHCP主要原理(协商过程),报文类型,应用场景以及DHCP地址池。
DHCP应用场景
在一般的企业网络中,一般会有大量的主机等终端设备,每个终端都需要配置IP地址等网络参数才能接入网络。在小型网络中,终端数量很少,可以手动配置IP地址。但是在大中型网络中,终端数量很多,手动配置IP地址工作量大,而且配置时容易导致IP地址冲突等错误。
为了解决这个问题,于是提出了DHCP协议。DHCP可以为网络终端动态分配IP地址,解决了手工配置IP地址时的各种问题。只要在网络中部署DHCP服务器(可以是主机,交换机,防火墙等等的设备),DHCP服务器就能够为大量主机分配IP地址,并能够集中管理。
DHCP报文类型
DHCP协议中,产生的报文类型有6种,如下表所示:
报文类型 |
含义 |
DHCP DISCOVER |
客户端用来寻找DHCP服务器。 |
DHCP OFFER |
DHCP服务器用来响应DHCP DISCOVER报文,此报文携带了各种配置信息。 |
DHCP REQUEST |
客户端请求配置确认,或者续借租期。 |
DHCP ACK |
服务器对REQUEST报文的确认响应。 |
DHCP NAK |
服务器对REQUEST报文的拒绝响应。 |
DHCP RELEASE |
客户端要释放地址时用来通知服务器。 |
关于这些不同类型的DHCP报文,以下是详尽的解释:
①DHCP Discover
DHCP客户端初次接入网络时,会发送DHCP发现报文(DHCP Discover),用于查找和定位DHCP服务器。
②DHCP Offer
DHCP服务器在收到DHCP发现报文后,会发送DHCP提供报文(DHCP Offer),此报文中包含要分配给客户端的IP地址等配置信息。
③DHCP Request
在DHCP客户端收到服务器发送的DHCP提供报文后,会发送DHCP请求报文(DHCP Request),另外在DHCP客户端获取IP地址并重启后,同样也会发送DHCP请求报文,用于确认分配的IP地址等配置信息。DHCP客户端获取的IP地址租期快要到期时,也会发送DHCP请求报文,向服务器申请延长IP地址租期。
④DHCP Ack
收到DHCP客户端发送的DHCP请求报文后,DHCP服务器会回复DHCP确认报文(DHCP Ack)。客户端收到DHCP确认报文后,会将获取的IP地址等信息进行配置和使用。
⑤DHCP Nak
如果DHCP服务器收到DHCP-REQUEST报文后,没有找到相应的租约记录,则发送DHCP-NAK报文作为应答,告知DHCP客户端无法分配合适IP地址。
⑥DHCP Release
DHCP客户端通过发送DHCP释放报文(DHCP Release)来释放IP地址。收到DHCP释放报文后,DHCP服务器知道这个IP地址已经无人使用,已经可以把该IP地址分配给其他DHCP客户端使用了。
DHCP地址池
一般来说,路由器支持两种地址池:全局地址池和接口地址池。
DHCP服务器的地址池是用来定义分配给主机的IP地址范围,有以下两种形式:
接口地址池为连接到同一网段的主机或终端分配IP地址。可以在服务器的接口下执行dhcp select interface命令,配置DHCP服务器采用接口地址池的DHCP服务器模式为客户端分配IP地址。
全局地址池为所有连接到DHCP服务器的终端分配IP地址。可以在服务器的接口下执行dhcp select global命令,配置DHCP服务器采用全局地址池的DHCP服务器模式为客户端分配IP地址。
接口地址池的优先级比全局地址池高。配置了全局地址池后,如果又在接口上配置了地址池,客户端将会从接口地址池中获取IP地址。有些交换机只能在VLANIF逻辑接口上配置接口地址池。
DHCP工作原理
为了动态获取IP地址等配置信息,DHCP客户端需要和DHCP服务器进行报文交互。而这个获取的过程,也可以认为是客户端向DHCP服务器端请求一个IP地址的租约。
DHCP租约主要分为以下4步:
Step 1:客户端请求IP(客户端发DHCP Discover广播包)
当一个DHCP客户端启动时,会自动将自己的IP地址配置成0.0.0.0,由于使用0.0.0.0不能进行正常通信,所以客户端就必须通过DHCP服务器来获取一个合法的地址。
由于客户端不知道DHCP服务器的IP地址,所以它使用0.0.0.0的地址作为源地址,使用UDP 68端口作为源端口,使用255.255.255.255(这是一个广播地址)作为目标地址,使用UDP 67端口作为目的端口来广播请求IP地址信息(如下图所示)。广播信息中包含了DHCP客户端的MAC地址和计算机名,以便使DHCP服务器能确定是哪个客户端发送的请求。
DHCP客户端总是试图重新租用它接收过的最后一个IP地址,这给网络带来一定的稳定性。
Step 2:服务器响应(服务器发DHCP Offer单播包)
当DHCP服务器接收到客户端请求IP地址的信息时,它就在自己的IP地址池中查找是否有合法的IP地址提供给客户端。如果有,DHCP服务器就将此IP地址做上标记,并加入到DHCP Offer的消息中,然后DHCP服务器就单播一则包括下列信息的DHCP Offer消息(如下图所示):
①DHCP客户端的MAC地址
②DHCP服务器提供的合法IP地址
③DHCP服务器的IP地址
④子网掩码
⑤默认网关(路由)
⑥租约的期限
因为DHCP客户端还没有IP地址,所以DHCP服务器使用自己的IP地址作为源地址,使用UDP 67端口作为源端口,使用要分配给客户端的IP地址作为目标地址,使用UDP 68端口作为目的端口来单播DHCP Offer信息。
Tips:关于DHCP Offer的一点小疑问
当笔记做到这里的时候,我发现了一个奇怪的问题:
Q1:为什么在华为官方的教学课件上,会在DHCP Offer上标注其为一个单播数据包呢?
Q2:在实际抓包测试中,当服务器发送DHCP Offer数据包给客户端时,客户端还没有将IP实际配置到设备中,那么服务器在发送DHCP Offer包时是怎么通过目的地址准确发送回客户端的呢?
带着这个疑问,我专门上网搜寻了一下。这里贴出知乎答主“车小胖”的回答。
链接为:https://www.zhihu.com/question/280872108/answer/438845996
其回答内容大义是这样的:
综上所述, DHCP Discover报文可以通过报文中的“Broadcast flag”字段设置DHCP Offer是用单播还是广播的形式,所以DHCP Offer报文既可以说是单播,也可以说是广播,取决于怎么设置。
另外,DHCP服务器端在回复DHCP Offer包给客户端时,依据并不是目的IP地址,而是目的MAC地址。客户端的MAC地址来源于客户端发来的DHCP Discover的“chaddr”字段,而不是来自于ARP请求(因为此时客户端还未拥有IP地址)。
Step 3:客户端选择IP(客户端发DHCP Request广播包)
DHCP客户端将会从接收到的第一个DHCP Offer消息中选择IP地址。而已经发出IP地址的DHCP服务器会将该地址保留,这样该地址就不能提供给另一个DHCP客户端。当客户端从第一个DHCP服务器接收DHCP Offer并选择IP地址后,DHCP租约的第三过程发生。
客户端将DHCP Request消息广播到所有的DHCP服务器,表明它接受某一台DHCP服务器提供的内容。DHCP Request消息包括为该客户端提供IP配置的服务器的服务标识符(IP地址)。DHCP服务器查看服务器标识符字段,以确定它自己是否被选择为指定的客户端提供IP地址,如果发现其中的服务器标识字段不是自己的IP,说明客户端没有采用自己提供的IP。自己的DHCP Offer被拒绝,则DHCP服务器会取消提供并保留其IP地址以用于下一个IP租约请求。
在客户端选择IP的过程中,虽然客户端选择了IP地址,但是还没有配置IP地址。而在一个网络中可能有几个DHCP服务器,所以客户端仍然使用0.0.0.0的地址作为源地址,使用UDP 68端口作为源端口,使用255.255.255.255作为目标地址,使用UDP 67端口作为目的端口来广播DHCP Request信息。
Step 4:服务器确定租约(服务器发DHCP Ack/DHCP Nak广播包)
DHCP服务器接收到DHCP Request消息后,以DHCP Ack消息的形式向客户端发送确认成功的消息,该消息包含有IP地址的有效租约和其他可能配置的信息。
虽然服务器确认了客户端的租约请求,但是客户端还没有收到服务器的DHCP Ack消息,表明客户端还没有配置IP地址。所以服务器仍然使用自己的IP地址作为源地址,使用UDP 67端口作为源端口,使用分配给客户端的IP地址作为目标地址,使用UDP 68端口作为目的端口来单播DHCP Ack信息。当客户端收到DHCP Ack消息时,它会将自己成功从DHCP成功租到的IP信息配置上去,完成了TCP/IP的初始化。
DHCP客户端收到DHCP Ack报文后,会发送免费ARP报文,检查网络中是否有其他主机使用分配的IP地址。如果指定时间内没有收到ARP应答,DHCP客户端会使用这个IP地址。如果有其他主机使用该IP地址,DHCP客户端会向DHCP服务器发送DHCP拒绝报文,通知服务器该IP地址已被占用。然后DHCP客户端会向服务器重新申请一个IP地址。
Tips:什么是免费ARP?
免费ARP(Gratuitous ARP)包是一种特殊的 ARP 请求。它并非期待得到 IP 对应的 MAC 地址,而是当主机启动的时候,发送一个免费ARP请求,不是请求其他主机IP的MAC地址,而是请求自己的 IP 地址的 MAC 地址。
免费ARP主要起到以下3个作用:
①该类型报文起到一个宣告作用。它以广播的形式将数据包发送出去,不需要得到回应,只为了告诉其他计算机自己的IP地址和MAC地址。
②可用于检测IP地址冲突。当一台主机发送了免费ARP请求报文后,如果收到了ARP响应报文,则说明网络内已经存在使用该IP地址的主机。
③可用于更新其他主机的ARP缓存表。如果该主机更换了网卡,而其他主机的ARP缓存表仍然保留着原来的MAC地址。此时就可以发送免费的ARP数据包。其他主机收到该数据包后,将更新ARP缓存表,将原来的MAC地址替换为新的MAC地址。
参考链接:
https://blog.51cto.com/yuanbin/109574
https://www.zhihu.com/question/280872108/answer/438845996
http://c.biancheng.net/view/6420.html
关于ARP协议的更多内容,以后也会开一期笔记进行详细的介绍。