DHCP (Dynamic Host Configuration Protocol ,动态主机配置协议)是IETF为实现IP的自动配置而设计的协议,它可以为客户端自动分配IP地址,子网掩码以及缺省网关,DNS服务器的IP地址等TCP/IP参数。DHCP是BOOTP的一种扩展。
DHCP协议在网络协议中所属的位置:
DHCP -------------应用层
UDP -------------传输层
IP -------------网络层
链路层
首先看下DHCP的报文格式。
报文格式:
- op,和BOOTP兼容,报文类型,BOOTREQUEST=1,表示请求报文;BOOTREPLY=2,表示回应报文。
- htype,硬件地址类型,1表示10Mb/s的以太网硬件。
- hlen,硬件地址长度,目前系统只对10Mb/s的以太网支持,硬件地址长度固定为6。
- hops,跳数。客户端设置为0,也能被一个DHCP中继代理服务器设置。
- xid,事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。
- secs,由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。
- flags,标志字段。这个16比特的字段,目前只有最左边的一个比特有用,该位为0,表示单播,为1表示广播。
- ciaddr(client ip address),客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。
- yiaddr(your Ip address),有DHCP服务器分配给DHCP客户端的IP地址。
- siaddr,表明DHCP协议流程的下一个阶段要使用的服务器的IP地址,通常在PXE,BOOTP时候指定下一站TFTP服务器的IP地址。
- giaddr(gataway Ip address),DHCP中继器的IP地址。
- chaddr(clent hardware address),客户端硬件地址(Mac地址)。客户端必须设置它的"chaddr"字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。
- sname,可选的服务器主机名,该字段是空结尾的字符串,由服务器填写。
- file,启动文件名,是一个空结尾的字符串。DHCP Discover报文中是"generic"名字或空字符,DHCP Offer报文中提供有效的目录路径全名。
- options,可选参数域,格式为"代码+长度+数据"。
关于报文中的Options的可选项:
DHCP与BOOTP兼容Option。RFC中定义了很多Option,但是不同的设备上可能支持一部分。
下面链接是RFC中定义的BOOTP/DHCP的Option。两百多种。
http://www.networksorcery.com/enp/protocol/bootp/options.htm
有几个理解:
1、Option 53 : DHCP message type. DHCP报文的类型,包含以下类型:
[1-DHCPDISCOVER;2-DHCPOFFER; 3-DHCPREQUEST; 4-DHCPDECLINE; 5-DHCPACK; 6-DHCPNAK; 7-DHCPRELEASE; 8-DHCPINFORM]
2、Option 55: Parameter request list. 客户端请求的时候会带一个参数列表,其实这个列表也是一个Option的列表。但是服务端并不是必须按照客户端的参数列表完全填充该参数列表的option。
参考:
RFC,TCP/IP详解
bootp/dhcp option:http://www.networksorcery.com/enp/protocol/bootp/options.htm