DHCP:IP 并非与生俱来
初识 DHCP
众所周知,因特网上的每台设备都规定了其全世界唯一的地址,也就是说 “IP 地址”,正是由于有了 IP 地址,才保证了用户在连网的计算机上操作时,能够高效而且方便地从千千万万台计算机中选出自己所需的对象来。
IP 地址就好像电话号码(地址码):有了某人的电话号码,你就能与他通话了。同样,有了某台主机的 IP 地址,你就能与这台主机通信了。
But,如果逐一为每一台主机设计 IP 地址那不得累死,不说全世界可能上百亿台计算机的存在,就说一台笔记本电脑,每移动到一个地方,就需要重新配置 IP 地址。
显然,手动分配 IP 地址不是我们人类中的那些顶级大脑能够做出来的事情,为了实现自动配置 IP 地址、统一管理 IP 地址分配,DHCP 协议(Dynamic Host Configuration Protocol,动态主机配置协议)就被创造了出来,这是一个应用层协议。
在没有 DHCP 服务的网络中,计算机接入到网络时必须先被设置 IP 地址、子网掩码、默认路由等等,并且,为了保证所有的主机 IP 地址都是唯一的,管理员必须清楚的知道该如何分配 IP 地址以避免冲突。
而在提供 DHCP 服务的网络中,管理员的负担大幅度减轻,只要在 DHCP 服务器上做一些必要的设置即可,计算机一旦接入到网络,就会自动获取 TCP/IP 通信所必须的设置(IP 地址等信息),并且 DHCP 服务器会保证其 IP 地址的唯一性。
可以看出,DHCP 实际上提供的是一种即插即用的网络,就是说只要某台计算机物理上一连通,无需专门的设置,就可以直接使用这台物理设备。
DHCP 的工作原理
DHCP 不仅可以为接入互联网的计算机配置 IP 地址,还可以配置子网掩码、默认路由等信息,那这些信息当然是不会凭空变出来的,它们都需要被提前配置到 DHCP 服务器上。
从 DHCP 获取 IP 地址的流程和 ARP 有一点相似不过还是存在不同的,客户端主机和 DHCP 服务器之间基于 UDP 协议采用广播形式进行交互,主机发送请求消息到 DHCP 服务器的 67 号端口,DHCP 服务器回应应答消息给主机的 68 号端口。具体流程如下:
1)客户端主机广播 DHCP Discover 包:主机请求 DHCP 服务器为自己设置 IP 地址、子网掩码等信息
说的通俗一点,当一台设备新加入一个网络的时候,它只知道自己的 MAC 地址,那么为了获取一些必要的信息,它会先大吼一句(广播,目标地址 255.255.255.255):“我是新来的,我的 MAC 地址是这个,我还没有 IP 地址(或者说 IP 地址是 0.0.0.0,表示未知),有没有 DHCP 服务器能租给我一个 IP 地址呀?”,这个过程称为 “DHCP Discover”。
想必看到这里各位也就能知道 MAC 地址的重要性了,它是与生俱来的,而 IP 地址并不是。
2)DHCP 服务器广播 DHCP Offer 包:DHCP 服务器通知主机哪些网络设置是可以使用的
如果这个网络中存在多个 DHCP 服务器,它们都听到了新人的大吼,并且都愿意租给这位新人一个 IP 地址等信息,那么这个新人主机就会收到多个可用的 IP 地址等信息。这个过程称为 “DHCP Offer”。
3)客户端主机广播 DHCP Request 包:主机通知服务器自己想要使用在(2)中通知的设置
主机在它收到的多个 Offer 中,选择其中一个,一般是最先到达的那个。并且会向网络广播一个 DHCP Request 包,包中包含客户端主机的 MAC 地址、接受的 Offer 中的 IP 地址、提供此 Offer 的 DHCP 服务器地址等,并告诉所有 DHCP 服务器,它将要接受哪一台服务器提供的 IP 地址,告诉其他的 DHCP 服务器,撤销它们提供的 IP 地址,以便提供给下一个 IP 租用请求者。
4)DHCP 服务器广播 DHCP ACK 包:服务器通知主机允许(3)的设置,即正式将 IP 地址等信息分配给主机
在完成第(4)步之前,主机还没有得到 DHCP 服务器的最后确认,所以它还没有 IP 地址,DHCP 服务器想
要给这个主机发送消息,仍然只能采取广播的方式,广播包中包含分配给这台主机的 IP 地址等信息。
至此,DHCP 的网络设置结束,可以进行正常的 TCP/IP 通信了。
DHCP 设置中通常会有一个时间的限制,租期到了,分配的这个 IP 就会被收回。当然,就这好比租房子,你要续约也是可以的,只要你提前说就行,客户端主机可以在这个时间限之前,发送 DHCP Request 包通知想要延长租用时间。
另外,当客户端主机不再需要这个 IP 地址的时候,随时可以通过发送 DHCP Release 报文释放自己的 IP 地址,DHCP 服务器收到 DHCP Release 报文后,会回收相应的 IP 地址并重新分配。
DHCP 的三种机制
我们上述所说的工作机制是一种动态分配 IP 地址的方式,事实上,DHCP 有三种机制分配 IP 地址:
1)自动分配方式(Automatic Allocation),DHCP 服务器为主机指定一个永久性的 IP 地址,一旦 DHCP 客户端第一次成功从 DHCP 服务器端租用到 IP 地址后,就可以永久性的使用该地址。
2)动态分配方式(Dynamic Allocation),DHCP 服务器给主机指定一个具有时间限制的 IP 地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
3)手工分配方式(Manual Allocation),客户端的 IP 地址是由网络管理员指定的,DHCP 服务器只是将指定的 IP 地址告诉客户端主机。
很明显,三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。
DHCP 服务器如何保证分配的 IP 地址不冲突
可以看出,DHCP 服务的正常运转极度依赖于 DCHP 服务器,如果 DHCP 服务器发生故障了,将导致无法自动分配 IP 地址,也就是说该网段内所有主机之间都无法进行正常的 TCP/IP 通信。
为此,人们通常会在一个网段内设置两台或以上的 DHCP 服务器,这不可避免的产生一个问题:每个 DHCP 服务器内记录的都是这个网段的 IP 地址分配情况的信息,各自分配的 IP 地址相互冲突在所难免。
为了避免冲突,DHCP 服务器具备这样的功能:
- 在分配 IP 地址之前发送 ICMP 回送请求包(关于 ICMP 协议详见 所谓 ICMP,不过将军与士卒而已),如果收到了返回应答报文,那不用说,这个 IP 地址已经被人用了。
同样的,客户端主机也得确认下 DCHP 服务器分配的 IP 地址是否正在被人使用:
- 针对从 DHCP 那里获得的 IP 地址发送 ARP 请求报文(关于 ARP 协议详见 5 幅图拿下 ARP 协议),如果收到了返回应答,那显然,根据这个 IP 地址都能找到 MAC 地址了,你说这个 IP 我还能不能用?
🎉 关注公众号 | 飞天小牛肉,即时获取更新
- 博主东南大学硕士在读,携程 Java 后台开发暑期实习生,利用课余时间运营一个公众号『 飞天小牛肉 』,2020/12/29 日开通,专注分享计算机基础(数据结构 + 算法 + 计算机网络 + 数据库 + 操作系统 + Linux)、Java 技术栈等相关原创技术好文。本公众号的目的就是让大家可以快速掌握重点知识,有的放矢。关注公众号第一时间获取文章更新,成长的路上我们一起进步
- 并推荐个人维护的开源教程类项目: CS-Wiki(Gitee 推荐项目,现已累计 1.7k+ star), 致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习 ~ 😊
- 如果各位小伙伴春招秋招没有拿得出手的项目的话,可以参考我写的一个项目「开源社区系统 Echo」Gitee 官方推荐项目,目前已累计 800+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。公众号后台回复 Echo 可以获取配套教程,目前尚在更新中。