一文搞懂DHCP协议
更多文章欢迎关注个人微信公众号:极客熊猫
何为DHCP?
DHCP是Dynamic Host Configuration Protocol的首字母缩写,即动态主机配置协议。
任何连接到的互联网的主机或路由器都需要IP地址、子网掩码、默认网关、DNS服务器等配置信息,当一个网络中的主机或路由器数量很多时,采用人工来配置这些信息显然是低效且易错的。DHCP就是解决这个问题的。
DHCP的主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、子网掩码、默认网关、DNS服务器地址等信息,并能够提升IP地址的使用率。
DHCP采用客户端/服务器模型。客户端主机的IP地址等配置信息的动态分配任务由其自身发起,当DHCP服务器接收到来自客户端主机申请地址的信息时,才会向客户端主机发送相关的地址配置等信息,以实现客户端主机地址信息的动态配置。
DHCP位于五层网络模型中的应用层,其传输层采用UDP协议。客户端端口号为68,服务器端口号为67。
DHCP服务器可提供三种地址分配:自动分配、动态分配、手动分配。三者区别在于地址分配是否基于客户端的身份以及该地址是否可撤销或变更。我们只关注动态分配。
动态分配:客户端从服务器的地址池中获得一个可撤销的IP地址。
地址池和租用期
动态分配中,DHCP客户端请求分配一个IP地址时,DHCP服务器从其地址池中选择一个地址作为响应。
地址池:专门为DHCP用途而分配的一个连续的IP地址范围。
租用期:分配给客户端的IP地址只在一段特定时间内有效,这段时间称为租用期。
租用期是可以延长的,即客户端可以续约。
DHCP消息格式
- Op:标识消息是请求消息(1)还是应答消息(2);
- HW类型:硬件类型,基于ARP使用的值,对于以太网,该值为1;
- HW长度:存放硬件(MAC)地址的长度,对于以太网MAC地址,该值为6;
- 跳步数:保存消息传输过程中的中继次数。消息发送方将该值设置为0,并在每次中继时递增;
- 事务ID:由客户机选择的随机数,服务器将它复制到响应中,用于将请求和应答匹配起来;
- 秒数:由客户机设置,它是第一次尝试申请或重新申请地址经过的秒数;
- 标志:该字段16位中,目前只用了1位,称为广播标志。客户机可以在请求中设置该位,表示它们不能或不愿处理单播IP数据报,但可处理广播数据报(例如,客户机还没有IP地址的情况)。通过设置该位通知服务器和中继代理,广播地址可用于响应中。
- ciaddr:如果客户机已有IP地址的话,客户机在发送请求时将自己的IP地址放在此处;
- yiaddr:由服务器填写,服务器把想要分配给客户机的IP地址放在此处;
- siaddr:一般是DHCP服务器的IP地址;
- giaddr:如果需要跨子网进行DHCP地址分配(DHCP服务器与客户机不在同一子网),则在此处填写经过的路由器的IP地址;
- chaddr:客户机的硬件地址,即MAC地址;
- sname:并非每次都要填写,表示服务器名;
- file:并非每次都要填写,表示启动文件路径;
- 选项:常见选项见下。
常见选项:
子网掩码(1)、路由器地址(3)、域名服务器(6)、请求的IP地址(50)、地址租用期(51)、DHCP消息类型(53)、租约更新时间(58)、租约重新绑定时间(59)。
选项可由DHCP选项字段携带,也可由sname和file字段携带,由sname和file携带时,称为选项超载。
DHCP消息类型(53)是1字节长的选项,其常见可能值如下:
DHCPDISCOVER(1)、DHCPOFFER(2)、DHCPREQUEST(3)、DHCPACK(5)、DHCPNAK(6)
DHCP协议操作
接下来我将通过一个实际场景描述DHCP协议的基本工作流程。
场景:小明在学校有一台笔记本电脑,一直用着学校的校园网。现在五一假期了,小明打算把笔记本带回家连上家里的网络打英雄联盟。我们假定校园网与小明家的网不是同一子网。
小明的笔记本由校园网切换到家里的网络,其IP地址等配置信息自然要发生变化,这个过程就是由DHCP来完成的,下面来看一下DHCP如何完成这项工作。
注:链路层以以太网为例。假定小明笔记本MAC地址为00:13:02:20:b9:18。
DHCPREQUEST
由于小明的笔记本电脑会记住之前在校园网中使用的IP地址(假定为172.16.1.34),所以在连接到新的网络(小明家的网络)时,它首先通过一个DHCPREQUEST消息尝试继续使用该地址。该DHCPREQUEST消息封装如下图所示。
Op为1代表这是一个DHCP请求;
htype为1代表是以太网;
hlen为6是MAC地址的长度(以字节为单位);
跳步数设置为0,每次中继时递增;
事务ID为随机生成,这里假定为0xdb23247d;
标志为0x8000,即最高位为1,意味着该消息的响应应该通过广播地址发送。
ciaddr、yiaddr、siaddr、giaddr均为0.0.0.0;
chaddr为小明笔记本的MAC地址00:13:02:20:b9:18;
sname、file未指定;
选项中指明了DHCP消息类型为DHCPREQUEST以及请求的IP地址为172.16.1.34。
该DHCP消息被封装在UDP用户数据报中,其中UDP头部中源端口号填写为68,目的端口号填写为67;
然后该UDP用户数据报被封装到IP数据报中,其中IP头部中的源IP地址填写为0.0.0.0,目的IP地址填写为广播地址255.255.255.255;
然后该IP数据报被封装到以太网帧中,其中以太网帧中源MAC地址填为00:13:02:20:b9:18,目的MAC地址填为ff:ff:ff:ff:ff:ff:ff。
由于客户机不知道它请求的地址是否分配成功,也不知道它所连接的新网络的网络前缀,所以它不得不使用这些广播地址。
DHCPNAK
附近的DHCP服务器会收到客户机的DHCPREQUEST消息,由于连接到了新网络,172.16.1.34不在当前网络中,所以当前的DHCP服务器无法给小明的笔记本分配其请求的IP地址(172.16.1.34)。因此服务器会发送一个DHCPNAK消息,拒绝客户机的请求。
Op为2代表这是一个DHCP应答;
xid与之前的DHCPREQUEST消息中的一样,代表这是对该DHCPREQUEST消息的应答;
选项中指明了DHCP消息类型为DHCPNAK、DHCP服务器标识符10.0.0.1、以及一个表示错误类型的文本字符串“wrong address”。
该DHCP消息被封装在UDP用户数据报中,其中UDP头部中源端口号填写为67,目的端口号填写为68;
然后该UDP用户数据报被封装到IP数据报中,其中IP头部中的源IP地址填写为10.0.0.1,目的IP地址填写为广播地址255.255.255.255;
然后该IP数据报被封装到以太网帧中,其中以太网帧中源MAC地址填为00:04:5a:9f:9e:80,目的MAC地址填为ff:ff:ff:ff:ff:ff:ff。
这里假定该DHCP服务器的IP地址为10.0.0.1,MAC地址为00:04:5a:9f:9e:80。
DHCPDISCOVER
对IP地址172.16.1.34的请求被拒绝,所以此后客户机不再使用该IP地址,而是通过一个DHCPDISCOVER消息重新寻找新的IP地址。
Op为1代表这是一个DHCP请求消息;
xid为0x3a681b0b,是新的事务ID;
选项中指明DHCP消息类型为DHCPDISCOVER;
选项中还包含了之前使用的已请求的IP地址172.16.1.34;
选项中的Parameter Request List客户机需要的配置信息,通常包含子网掩码、默认网关、DNS服务器地址等。
该DHCP消息被封装在UDP用户数据报中,其中UDP头部中源端口号填写为68,目的端口号填写为67;
然后该UDP用户数据报被封装到IP数据报中,其中IP头部中的源IP地址填写为0.0.0.0,目的IP地址填写为广播地址255.255.255.255;
然后该IP数据报被封装到以太网帧中,其中以太网帧中源MAC地址填为00:13:02:20:b9:18,目的MAC地址填为ff:ff:ff:ff:ff:ff:ff。
DHCPOFFER
在接收一个DHCPDISCOVER消息后,DHCP服务器会响应一个IP地址、租约和其他配置信息的确认,它们包含在一个DHCPOFFER消息中。(在本例中,DHCP服务器同时也是路由器和DNS服务器)
Op为2代表这是一个DHCP应答消息;
xid为0x3a681b0b,代表该应答与上一个DHCPDISCOVER请求消息所匹配;
yiaddr为10.0.0.57,表示DHCP服务器计划分配给客户机的IP地址;
siaddr为10.0.0.1,是该DHCP服务器的IP地址;
选项中指明了消息类型为DHCPOFFER,同时包含了服务器提供给客户机的配置信息,包括:
- 提供的IP地址的租用期、更新、重新绑定的超时时间,分别为12小时、6小时、10.5小时;
- 子网掩码255.255.255.128;
- 默认网关10.0.0.1;
- DNS服务器10.0.0.1。
该DHCP消息被封装在UDP用户数据报中,其中UDP头部中源端口号填写为67,目的端口号填写为68;
然后该UDP用户数据报被封装到IP数据报中,其中IP头部中的源IP地址填写为10.0.0.1,目的IP地址填写为广播地址255.255.255.255;
然后该IP数据报被封装到以太网帧中,其中以太网帧中源MAC地址填为00:04:5a:9f:9e:80,目的MAC地址填为ff:ff:ff:ff:ff:ff:ff。
DHCPREQUEST
当客户机收到一个DHCPOFFER消息,并决定租用服务器提供的IP地址10.0.0.57,它会发送第二个DHCPREQUEST消息。
Op为1代表这是一个DHCP请求消息;
xid与之前相同,代表该消息与之前的匹配;
ciaddr、yiaddr、siaddr、giaddr均为0.0.0.0;
选项中指明DHCP消息类型为DHCPREQUEST、请求的IP地址10.0.0.57、DHCP服务器标识符10.0.0.1。
该DHCP消息被封装在UDP用户数据报中,其中UDP头部中源端口号填写为68,目的端口号填写为67;
然后该UDP用户数据报被封装到IP数据报中,其中IP头部中的源IP地址填写为0.0.0.0,目的IP地址填写为广播地址255.255.255.255;
然后该IP数据报被封装到以太网帧中,其中以太网帧中源MAC地址填为00:13:02:20:b9:18,目的MAC地址填为ff:ff:ff:ff:ff:ff:ff。
该DHCPREQUEST消息仍采用广播方式发送,选项中的服务器标识符字段用于避免其他DHCP服务器提交地址绑定。
DHCPACK
当选中的DHCP服务器接收到DHCPREQUEST消息并同意绑定,它会使用一个DHCPACK消息来响应。
DHCPACK消息与之前的DHCPOFFER消息非常相似。
该DHCP消息被封装在UDP用户数据报中,其中UDP头部中源端口号填写为67,目的端口号填写为68;
然后该UDP用户数据报被封装到IP数据报中,其中IP头部中的源IP地址填写为10.0.0.1,目的IP地址填写为广播地址255.255.255.255;
然后该IP数据报被封装到以太网帧中,其中以太网帧中源MAC地址填为00:04:5a:9f:9e:80,目的MAC地址填为ff:ff:ff:ff:ff:ff:ff。
检测冲突
至此,小明的笔记本电脑已获得了IP地址10.0.0.57。但是在使用这个IP地址之前,为了避免该IP地址已被其他主机使用,还要进行冲突检测。冲突检测有两种方法:免费ARP和ACD。
免费ARP
DHCP客户端(小明的笔记本)会向网络中发送一条用于IP地址冲突检测的ARP请求消息,称为免费ARP。
该ARP消息中:
源IP地址和目标IP地址都是客户机自己的IP地址(10.0.0.57);
源MAC地址为DHCP客户端的MAC地址(00:13:02:20:b9:18);
目标MAC地址为广播地址(ff:ff:ff:ff:ff:ff)。
我们不希望这个ARP请求得到回应,因为是自己请求解析自己,如果网络上没有一个相同的自己(冒牌货,实际上就是地址冲突),那么这个ARP请求永远不可能得到回应;如果有主机回应了这个ARP请求,就表示网络上有两台主机正在使用相同的IP地址,即发生IP冲突。此时,DHCP客户端不会使用该IP地址(10.0.0.57),并会给DHCP服务器发送一个DHCPDECLINE的消息,通知该地址不可使用。
ACD
ACD即IPv4地址冲突检测,相较于免费ARP,ACD是一种更先进的IP冲突检测方法。
ACD定义了ARP探测分组和ARP通告分组。
在获得候选IP地址10.0.0.57后,小明的笔记本发送一个ARP探测分组,用于查看候选IP地址是否被其他主机所使用。
ARP探测分组是一个ARP请求分组,其消息格式中:
源IP地址填为0.0.0.0(避免候选IP地址被另一台主机使用时的缓存污染);
源MAC地址为小明笔记本的MAC地址(00:13:02:20:b9:18);
目的IP地址为候选IP地址(10.0.0.57);
目的MAC地址为广播地址(ff:ff:ff:ff:ff:ff)。
该ARP探测分组封装到以太网帧中,通过广播地址向网络中的所有主机发送,相当于小明的笔记本向网络中的主机发问“谁有IP地址10.0.0.57对应的MAC地址啊?有的话告诉我!”。
在发送ARP探测分组时,小明的笔记本可能接收到ARP应答或请求。如果收到了ARP探测分组对应的ARP应答,说明候选IP地址已经被其他主机占用了;如果收到了其他主机发送的ARP探测请求,且其目的IP地址中包含相同的候选地址,表明存在其他主机也正在尝试获得候选IP地址。在这两种情况下,系统会显示地址冲突,并尝试其他可选IP地址。
如果小明的笔记本没有发现冲突,它会发送ARP通告分组,以表明它现在使用这个候选IP地址。
ARP通告分组中:
源IP地址填为10.0.0.57;
源MAC地址为小明笔记本的MAC地址(00:13:02:20:b9:18);
目的IP地址为候选IP地址(10.0.0.57);
目的MAC地址为广播地址(ff:ff:ff:ff:ff:ff)。
ACD是一个持续的过程,当小明的笔记本通告它正使用的IP地址后,它会继续检查收到的ARP请求或应答,查看自己的IP地址是否出现在这些ARP消息的源IP地址字段中,如果是,说明其他主机与自己在使用相同的地址,然后采取进一步措施,或放弃IP或保留IP并防御,当然也可能不理会冲突。
DHCP状态机
下面附上DHCP客户机的状态机。
虚线和INIT状态表示协议开始。
租用时间(T):在不更新租约的情况下地址可被租用的时间上限。
更新时间(T1):客户机从获得租约到尝试要求服务器更新租约的时间。
重新绑定时间(T2):客户机尝试要求DHCP服务器更新其地址的时间。
在默认情况下,T1=T/2,T2=7T/8。