1.DHCP共有八种报文,不同报文之间的区别除了DHCP数据包本身之外,在封包上(UDP头,IP头、链路层头)也有一些差别
1)DHCP Discover
DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送请求报文,这个报文成为Discover报文,目的是发现网络中的DHCP服务器,所有收到Discover报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。
2)DHCP Offer
DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给用户(可以广播、也可以单播),告知用户本服务器可以为其提供IP地址。(注意,只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复)
3)DHCP Request
客户端会在两种情况下发送DHCP Request
a)DHCP客户端可能会收到来自DHCP服务器的很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器。注意,"Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器"这里存在一个安全问题,如果我们的伪DHCP服务器能比原始DHCP服务器先发送Offer数据包,就能达到欺骗的目的,从而劫持目标用户的流量
b)获取DHCP客户端成功获取IP地址后,在地址使用租期过去1/2时,会向DHCP服务器发送单播Request报文续延租期,如果没有收到DHCP ACK报文,在租期过去3/4时,会再次发送广播Request报文续延租期。
4)DHCP ACK
DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录(即之前的预分配过程中登记的那个MAC),如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址。
5) DHCP NAK
如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。
6)DHCP Release
当用户不再需要使用分配IP地址时,就会"主动"向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约(在数据库中清除某个MAC对某个IP的租约记录,这样,这个IP就可以分配给下一个请求租约的MAC)
7. DHCP Decline
DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用,我们在手工设置静态IP、或者DHCP分配中有时会遇到"检测到IP冲突"的提示就是因为客户端利用ARP机制来在当前内网中确认当前指定的IP是否已经被占用
8)DHCP Inform
DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端。
2. DHCP协议数据包帧
学习DHCP协议不能单纯学习协议本身,还必须连带了解它的封包结构,之所以这么说,是因为DHCP是一个特殊的"服务发现"类型的协议,它用于客户端"获取某种资源",所以它的封包格式具有一定的特殊性
其中:
1. 链路层头: 承载报文的链路层信息头,常见的有Ethernet_II格式、802.1Q格式、 IEEE802.3格式、令牌环链路层头格式等。
2. IP头: 标准的IP协议头,IPV4中长度为20bytes,包括了SrcIp,DstIp等信息。
3. UDP头: 8bytes,包括了SrcPort,DstPort,报文长度及UDP校验和等信息。
4. DHCP报文:具体的DHCP报文内容。
3.DHCP协议使用的端口
1)UDP67: DHCP Server服务端口
2)UDP68: DHCP Client服务端口
3)UDP546: 用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做"双机热备"的
4.DHCP协议报文格式
1. OP:
1.1) client发送给server的封包,设为1
1.2) server发送给client的封包,设为2
2. HTYPE: 硬件类别
2.1) 1表示10Mb/s的以太网(Ethernet)的硬件地址
3. HLEN: 硬件地址长度、
3.1) Ethernet为6(字节)
4. HOPS: 跳数,若封包需经过router传送,每站加 1,若在同一网内,为0(客户端的初始设置为0)
5. XID: TRANSACTION ID(事务ID),DHCP REQUEST 时产生的数值,服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。以作 DHCPREPLY 时的依据
5. SECONDS: 由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数
6. FLAGS:
从0到15共16 bits
6.1) 最左1Bit为1时表示 server将以广播方式传送封包给client
6.2) 最左1Bit为0时表示 server将以单播方式传送封包给client
其余尚未使用。
7. ciaddr:
客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。即要是 client 端想继续使用之前取得的IP地址,则这个字段会被填充
8. yiaddr: 从server送回client的DHCP OFFER与DHCPACK封包中,此栏填写分配给client的IP地址。
9. siaddr:
表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
10. giaddr:若需跨网域进行DHCP获取,此栏为 relay agent的地址,否则为0
11. chaddr:
客户端硬件地址。客户端必须设置它的"chaddr"字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。
12. sname:
Server的名称字符串,由DHCP服务器填写,以0x00结尾。
13. file:
启动文件名,是一个空结尾的字符串。DHCP Discover报文中是"generic"名字或空字符,DHCP Offer报文中提供有效的目录路径全名。
14. options:
允许厂商定议选项(Vendor-Specific Area),以提供更多的设定信息。
格式为CODE(占1字节)+LEN(占1字节)+VALUE(长度由LEN而定)
1) 1、4、Subnet Mask
2) 3、n*4、Router(网关)
3) 6、n*4、DNS Server
4) 7、n*4、Log Server
5) 26、2、Interface MTU
6) 33、n*8、Static route
7) 35、4、ARP cache timeout
8) 42、n*4、NTP servers
9) 51、4、IP address lease time
10) 53、1、Message type
10.1) 1: DHCPDISCOVER
10.2) 2: DHCPOFFER
10.3) 3: DHCPREQUEST
10.4) 4: DHCPDECLINE
10.5) 5: DHCPACK
10.6) 6: DHCPNAK
10.7) 7: DHCPRELEASE
10.8) 8: DHCPINFORM
11) 5、4、DHCP Server Identifier
12) 60、n、华为自定义: 可配置该终端设备在发起DHCP请求时,通过Option 60携带域信息。ME60收到DHCP报文时,可根据Option 60中携带的域信息来分配IP地址。
13) 82、n、华为自定义:ME60作为DHCP Relay,在中继用户DHCP报文时,可在Option 82中填写用户的物理位置信息,通知DHCP服务器按物理位置信息对为用户分配IP地址