DHCP协议
一、什么是DHCP?
定义
DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server),68(DHCP client)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。
DHCP的前身是BOOTP协议(Bootstrap Protocol)
作用
动态分配IP地址,过程自动化,终端无需一一手工配置,配置信息统一管理(DNS,网关),IP地址有限、需要大量配置IP地址、经常移动终端。
二、DHCP协议中的报文
DHCP报文共有一下几种:
- DHCP DISCOVER :客户端开始DHCP过程发送的包,是DHCP协议的开始
- DHCP OFFER :服务器接收到DHCP DISCOVER之后做出的响应,它包括了给予客户端的IP(yiaddr)、客户端的MAC地址、租约过期时间、服务器的识别符以及其他信息
- DHCP REQUEST :客户端对于服务器发出的DHCP OFFER所做出的响应。在续约租期的时候同样会使用。
- DHCP ACK :服务器在接收到客户端发来的DHCP REQUEST之后发出的成功确认的报文。在建立连接的时候,客户端在接收到这个报文之后才会确认分配给它的IP和其他信息可以被允许使用。
- DHCP NAK :DHCP ACK的相反的报文,表示服务器拒绝了客户端的请求。
- DHCP RELEASE :一般出现在客户端关机、下线等状况。这个报文将会使DHCP服务器释放发出此报文的客户端的IP地址
- DHCP INFORM :客户端发出的向服务器请求一些信息的报文
- DHCP DECLINE :当客户端发现服务器分配的IP地址无法使用(如IP地址冲突时),将发出此报文,通知服务器禁止
使用该IP地址。
DHCP 协议包的组成
- Xid :随机生成的一段字符串,两个数据包拥有相同的xid说明他们属于同一次会话
- Ciaddr :客户端会在发送请求时将自己的ip地址放在此处
- Yiaddr :服务器会将想要分配给客户端的ip地址放在此处
- Siaddr :一般来说是服务器的ip地址.但是注意!根据 openwrt 源码给出的注释,当报文的源地址、siaddr、option>server_id字段不一致(有经过跨子网转发)时,通常认为option>srever_id字段为真正的服务器ip,siaddr有可能是多次路由跳转中的某一个路由的ip (下图中wireshark抓包中也有标明siaddr为nextserver ip address)
- Chaddr :客户端的mac地址
- Giaddr :如果需要跨子网进行DHCP地址发放,则在此处填入经过的路由器的ip地址
- Sname :服务器主域名
- Options :可以自由添加的部分,用于存放客户端向服务器请求信息和服务器的应答信息

三、DHCP 的 工作流程
(一般情况下:说明)

Client开始DHCP过程发送的包,是DHCP协议的开始。以广播的方式发送DHCP DISCOVER报文。
来寻找局域网中的DHCP服务器。源地址为0.0.0.0 目的地址为255.255.255.255,
而服务器回返回客户端报文时需注意:源地址是Servers地址 ,目标地址是Client地址
报文摘要:

可以分为两部分,一部分是 左边DHCP ,一部分是 右边Type
左边有且只有两个类型,要么是Request ,要么是Reply
报文1和报文3是request,报文2和报文4是reply
Type类型有四种
**
DISCOVER、OFFER、REQUEST、ACK**
这条信息
DHCP:---------------DHCP Header--------------
DHCP:Boot record type = 2(Reply)
相当于:
_
DHCP:Request
_
Boot record type = 1(Request)
_
DHCP:Reply
_
Boot record type = 2(Reply)____
**
其中:1表示request,2表示reply**
(执行ipconfig/all用户获取参数信息)

(续约:执行ipconfig /renew)

这里需注意的是源地址和目的地址因为之前是 已经建立过连接 的,所以知道了客户端地址和服务器地址,因此发的是单播

(释放并重新获取地址:执行ipconfig /release 和ipconfig /renew)

第一个步骤是客户端向服务器发送release报文,特别注意它的源地址和目的地址都是已知的,而后面的步骤就和一般情况下的步骤是一样的。
总结

DHCP完整过程
DHCP DISCOVER :客户端开始DHCP过程发送的包,是DHCP协议的开始。以广播 的方式发送
DHCP DISCOVER报文。来寻找局域网中的DHCP服务器。
源地址为0.0.0.0 目的地址为255.255.255.255 , 网络上所有支持TCP/IP的主机都会收到该DHCP DISCOVER报文,但是只有DHCP Server会响应该报文。
DHCP OFFER :服务器接收到DHCP DISCOVER之后做出的响应 ,通过解析报文,查询 dhcpd.conf 配置文件,如果在地址池中能找到合适的IP地址,DHCP Server会给DHCP Client发送Offer报文。它包括了给予客户端的IP(yiaddr)、客户端的MAC地址、租约过期时间、服务器的识别符、自己其他信息。
如果存在多个DHCP服务器,依然会发送多个DHCP OFFER报文。
DHCP REQUEST :客户端对于服务器发出的DHCP OFFER所做出的响应,在续约租期的时候同样会使用。
Client根据先收到的Offer报文来决定使用哪个服务器提供的DHCP的地址。(优先先到的offer报文)
然后根据这个Offer提供的地址信息,发送Request报文请求。
a.客户端初始化时 ,发送广播的
DHCP Request报文来回应服务器的DHCP Offer报文b.客户端重启初始化后 ,发送广播的DHCP的
DHCP Request报文来确认先前被分配的IP地址等配置信息。c.当客户端已知和某个IP地址绑定后 ,发送单播的
DHCP Request报文来延长IP地址租期。
DHCP ACK :服务器在接收到客户端发来的
DHCP REQUEST之后发出的成功确认的报文。在建立连接的时候,客户端在接收到这个报文之后才会确认分配给他的IP和其他信息可以被允许使用。服务器接收到request报文以后,确认地址池中的这个地址没有被分配,如果没有被分配就回复ACK报文,如果被分配了,就会回复
DHCP-NAK报文,告诉Client地址已经被分配了。DHCP NAK :DHCP ACK的相反报文,表示服务器拒绝了客户端的请求。
当Client收到服务器分配到的地址后,会向这个广播域内发送一个免费的ARP的请求,如果没有人响应这个请求,Client才正式使用这个IP,如果有人回应的话,会返回一个
DHCP-DECLINE报文,要求客户端重新获取IP。
当Client的IP租期到达一半时,会单播发送
DHCP-REQUEST报文,请求服务器更新租期,服务器收到以后,如果可以继续使用IP地址的话,会响应Client DHCP-ACK,如果该IP不能继续分配,则响应Client DHCP-NAK。此时Client会在租期的75%再次询问server进行续约,如果该IP地址可用则回复ACK,反则回复NAK。
如果客户端重启后,会自动发送
DHCP REQUEST广播给DHCP服务器以便请求继续租用原来使用的IP地址如果服务器收到这个消息,确认客户端可以使用该地址,则回答一个
DHCP ACK确认消息,如果此IP地址已经无法再分配,则返回一个DHCP NAK否认信息,客户端收到这个信息以后,则必须重新发送DHCP Discover消息获取新的地址。若没有得到响应,则尝试与网关通信,如果通信正常,这个租期还没到期的话,则可以继续使用,但是不能和网关通信的话,则会获得169.254.0.1~169.254.255.254之间的IP地址,然后每隔5min尝试更新租约。
DHCP RELEASE :一般出现在客户端关机、下线等情况。这个报文将会使DHCP服务器释放发出此报文的客户端的IP地址。
当客户端可通过DHCP RELEASE报文主动释放服务器分配给它的地址,当服务器收到此报文后,可将这个IP地址分配给其他客户端。
DHCP INFORM :客户端发出的服务器请求一些信息的报文。如DNS, 网关。
DHCP DECLINE : 当客户端发现服务器分配的IP地址无法使用(IP地址冲突),将发出此报文,通知服务器禁止使用该IP地址。
