定义
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个应用层网络协议,使用UDP协议工作, 通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址(一般是动态地分配私有IP地址),使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率(因为可以动态分配IP)。
功能
DHCP协议采用客户端/服务器模型,主机地址的动态分配任务由网络主机驱动(客户机主动发出IP申请)。当DHCP服务器接收到来自网络主机申请地址的信息时,才会向网络主机发送相关的地址配置等信息,以实现网络主机地址信息的动态配置。
DHCP具有以下功能:
保证任何IP地址在同一时刻只能由一台DHCP客户机所使用。
DHCP应当可以给用户分配永久固定的IP地址。
DHCP应当可以同用其他方法获得IP地址的主机共存(如手工配置IP地址的主机)。
DHCP服务器应当向现有的BOOTP(自举协议,是DHCP协议的前身)客户端提供服务。
DHCP有三种机制分配IP地址:
自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。
动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。
手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。DHCP消息的格式是基于BOOTP(Bootstrap Protocol)消息格式的,这就要求设备具有BOOTP中继代理的功能,并能够与BOOTP客户端和DHCP服务器实现交互。BOOTP中继代理的功能,使得没有必要在每个物理网络都部署一个DHCP服务器。
产生原因
如果没有DHCP,TCP/IP协议在初始化过程中,需要用户提供IP地址、网络掩码、默认网关、DNS服务器,以此来完成各个协议模块的初始化工作,对于广大用户来说,这绝对是一种很糟糕的体验。而有了DHCP,TCP/IP协议在初始化时,会自动调用DHCP模块,DHCP通过广播的方式去发现(Discover)DHCP服务器,如果本广播域没有服务器,通常会在网关上配置一个DHCP Relay + DHCP 服务器IP,一句话,肯定可以找到一个可以分配IP(Offer)的服务器。通过四次消息交互,最后电脑获得了所有上网的的IP参数:IP地址、网络掩码、默认网关、DNS服务器,TCP/IP所有模块完成初始化,比如IP模块、DNS模块。用户无需任何配置即可上网,这是TCP/IP对用户友好的一面。
通信过程
UDP的整个数据包:
(1)最前面的"以太网标头",设置发出方(本机)的 MAC 地址和接收方(DHCP 服务器)的 MAC 地址。前者就是本机网卡的 MAC 地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
(2)后面的"IP 标头",设置发出方的 IP 地址和接收方的 IP 地址。这时,对于这两者,本机都不知道。于是,发出方的 IP 地址就设为0.0.0.0,接收方的 IP 地址设为 255.255.255.255。
(3)最后的"UDP 标头",设置发出方的端口和接收方的端口。这一部分是 DHCP 协议规定好的,发出方是 68 端口,接收方是 67 端口。
DHCP的通信过程
Discovery
数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的 MAC 地址是 FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的 IP 地址,才能确定是不是发过自己的。
Offer
当看到发出方 IP 地址是0.0.0.0,接收方是 255.255.255.255,于是 DHCP 服务器知道"这个包是发过我的",而其他计算机就可以丢弃这个包。接下来,DHCP 服务器读出这个包的数据内容,分配好 IP 地址,发送回去一个"DHCP 响应"数据包。这个响应包的结构也是类似的,以太网标头的 MAC 地址是双方的网卡地址,IP 标头的 IP 地址是 DHCP 服务器的 IP 地址(发出方)和 255.255.255.255(接收方),UDP 标头的端口是 67(发出方)和 68(接收方),分配给请求端的 IP 地址和本网络的具体参数则包含在 Data 部分。
Request
新加入的计算机收到这个响应包,于是就知道了自己的 IP 地址、子网掩码、网关地址、DNS 服务器等等参数。然后回应服务器
ACK
服务器确认刚刚分配的这个IP还有效(因为IP分配使动态的,所以需要确认有效性,以有效利用IP资源)
常见问题
为什么是四次握手
第一次:首先client一开始是什么都不知道,所以肯定得一个广播去问
第二次:收到广播的server就给client发offer
第三次:server不知道client要不要啊,不要还得给别人呢,所以client必须要确认offer
第四次:但是这个offer有可能在client确认之前就已经失效了,所以server要告诉client这个offer是否依然有效,如果offer有效那么client就可以用这个ip了
和NAT的联系和区别
区别
DHCP:通过动态分配地址提高IP地址利用率。此外,其主要功能还有简化主机上网配置的功能。
NAT:通过私有IP向公网IP转换提高IP地址利用率。此外,其还可以有保障安全的功能。
NAT的安全功能:一些因为历史关系获得一个或者多个整个A网段的公司,
比如IBM或者HP,内网的机器会被直接分派一个A网的IP地址,这种情况下,
NAT有时候还是会被用到,因为安全因素考虑,即便是公网IP,
也会在访问外网时被转到某个特定IP段。
联系
由于一般企业网、家庭网络,DHCP服务器分配给电脑的都是私有IP,诸如 10/8、172.16/12、192.168/16,这些私有IP在企业网内部还可以混混,但不能到Internet上去浪。所以必须在企业网与Internet的边界网关,做私有IP与公网IP的转换(NAT),即由于公网IP可能只有一个或几个,需要使用NAT网关的端口号来识别一个个用户session。也就是说,DHCP和NAT需要搭配使用。
DHCP是如何确定适合客户端网段的IP地址的
客户端此时还没有IP地址的时候,肯定是通过MAC地址与DHCP通讯的。在一个复杂的网络环境中会有多个网段,DHCP是如何确定适合客户端网段的IP地址的呢?
跨广播域的dhcp,会有一个dhcp中继。dhcp中继在收到dhcp请求广播后,将广播改为单播,单播封装的源ip就是其收到这个广播的接口地址。dhcp服务器根据这个接口地址选择dhcp池。
参考文献
https://baike.baidu.com/item/DHCP DHCP的定义
https://www.zhihu.com/question/66893227 DHCP和NAT的区别,产生原因
https://www.zhihu.com/question/23337642 DHCP通信过程
https://www.zhihu.com/question/263584277 DHCP是如何确定适合客户端网段的IP地址的