一、功能描述
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址,Gateway地址,DNS服务器地址等信息,并能够提升地址的使用率。DHCP协议使用UDP协议工作,采用C/S模型,主机地址的动态分配任务由网络主机驱动。
二、申请IP工作过程
1.DHCP客户机初始化TCP/IP,通过UDP端口67向网络中发送一个
DHCPDISCOVER广播包,请求租用IP地址。该广播包中的源IP地址为0.0.0.0, 目标IP地址为255.255.255.255,包中还包含客户机的MAC地址和计算机名。
2.DHCP服务器都会通过UDP端口68给客户机回应一个
DHCPOFFER广播包,提供一个IP地址,该广播包的源IP地址为DHCP服务器IP,目标IP地址为255.255.255.255,包中还包含提供的IP地址,子网掩码及租期等信息。
3.客户选择IP租用报文,
客户机从不止一台DHCP服务器接收到提供之后,
会选择第一个收到的DHCPOFFER包,
并向网络中广播一个 DHCPREQUEST消息包,
表明自己已经接受了一个DHCP服务器提供的IP地址。
该广播包中包含所接受的IP地址和服务器的IP地址,
所有其他的DHCP服务器撤消它们的提供以便将IP地址提供给下一次IP租用请求。
4.
DHCP服务器发出IP租用确认报文,
被客户机选择的DHCP服务器在收到DHCPREQUEST广播后,
会广播返回给客户机一个DHCPACK消息包,
表明已经接受客户机的选择,
并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户机。
客户配置成功后发出的公告报文,
客户机在收到DHCPACK包,会使用该广播包中的信息来配置自己的TCP/IP,
则租用过程完成,客户机可以在网络中通信。
三、DHCP报文
DHCP
报文格式如下所示:
op(1) | htype(1) | hlen(1) | hops(1) |
xid(4) | |||
secs(2) | flags(2) | ||
ciaddr(4) | |||
yiaddr(4) | |||
siaddr(4) | |||
giaddr(4) | |||
chaddr(4) | |||
sname(4) | |||
file(4) | |||
options (variable) |
报文中各字段的描述如下:
op,报文类型,1表示请求报文,2表示回应报文。
htype,硬件地址类型,1表示10Mb/s的以太网的硬件地址。
hlen,硬件地址长度,以太网中该值为6。
hops,跳数。客户端设置为0,也能被一个代理服务器设置。
xid,事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。
secs,由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。
flags,标志字段。这个16比特的字段,目前只有最左边的一个比特有用,该位为0,表示单播,为1表示广播。
ciaddr,客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。
yiaddr,"你自己的"或客户端的IP地址。
siaddr,表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
giaddr,DHCP中继器的IP地址。//注意:不是地址池中定义的网关
chaddr,客户端硬件地址。客户端必须设置它的"chaddr"字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。
sname,可选的服务器主机名,该字段是空结尾的字符串,由服务器填写。
file,启动文件名,是一个空结尾的字符串。DHCP Discover报文中是"generic"名字或空字符,DHCP Offer报文中提供有效的目录路径全名。
options,可选参数域,格式为"代码+长度+数据"。
htype,硬件地址类型,1表示10Mb/s的以太网的硬件地址。
hlen,硬件地址长度,以太网中该值为6。
hops,跳数。客户端设置为0,也能被一个代理服务器设置。
xid,事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。
secs,由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。
flags,标志字段。这个16比特的字段,目前只有最左边的一个比特有用,该位为0,表示单播,为1表示广播。
ciaddr,客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。
yiaddr,"你自己的"或客户端的IP地址。
siaddr,表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
giaddr,DHCP中继器的IP地址。//注意:不是地址池中定义的网关
chaddr,客户端硬件地址。客户端必须设置它的"chaddr"字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。
sname,可选的服务器主机名,该字段是空结尾的字符串,由服务器填写。
file,启动文件名,是一个空结尾的字符串。DHCP Discover报文中是"generic"名字或空字符,DHCP Offer报文中提供有效的目录路径全名。
options,可选参数域,格式为"代码+长度+数据"。
DHCP options
Option ID | Length(字节) | 描述 |
1 | 4 | Subnet Mask |
3 | n*4 | Router(网关) |
6 | n*4 | DNS Server |
7 | n*4 | Log Server |
26 | 2 | Interface MTU |
33 | n*8 | Static route |
35 | 4 | ARP cache timeout |
42 | n*4 | NTP servers |
51 | 4 | IP address lease time |
53 | 1 | Message type 1-DHCPDISCOVER 2-DHCPOFFER 3-DHCPREQUEST 4-DHCPDECLINE 5-DHCPACK 6-DHCPNAK 7-DHCPRELEASE 8-DHCPINFORM |
54 | 4 | DHCP Server Identifier |
因源代码较多, 全部详细源码实现见链接