1. 简介
- 计算机要互联通信自身肯定需要网络 ,如IP地址、子网掩码、DNS服务器地址等。而为了实现IP地址的自动设置与统一分配,DHCP就这样孕育而生了。
- 动态主机配置协议(DHCP)是一个应用层协议,也就是位于TCP/IP 5层协议模型的第5层,同时它也是一个客户机-服务器协议。
- DHCP的设计基于早期的Internet引导程序协议(BOOTP),使用UDP/IP协议,客户端使用端口68,服务端使用端口67。
- DHCP服务器可提供三种地址分配:
-
手动分配
由网络管理员在DHCP服务器手工配置DHCP客户机的IP地址。 -
自动分配
当DHCP客户机第一次向DHCP服务器请求到IP地址后,这个地址就永久地分配给了该DHCP客户机,不可撤销。 -
动态分配(最常见)
与自动分配采用相同的方法,只不过获得的IP地址是有租约期限的,一旦租约到期,地址就会被回收,不过可以通过续订租约以延长期限。
-
手动分配
2. 消息格式
DHCP扩展了BOOTP,DHCP消息格式的定义也采用了扩展BOOTP的方式以保持两种协议之间的兼容性。消息格式由一个固定大小的初始部分和一个可变长度的选项部分组成。
字段说明
初始部分
字段 | 说明 |
---|---|
Op | 消息类型,1表示请求,2表示响应 |
HW Type | 硬件地址类型,1表示以太网 |
HW Len | 硬件地址长度,如以太网地址长度6个字节值就为6 |
Hops | 保存消息传输过程中继的的次数,默认为0 |
Transaction ID | 事物ID。客户机所选择的一个随机数,服务器把它复制到响应消息中,用于将应答和请求匹配 |
Secs | 获取到IP地址或者续约过程开始到现在所消耗的时间,以秒为单位。在没有获得IP地址前该字段始终为0 |
Flags | 标志字段。该16位比特字段的最左边的位为 0 ,表示单播,为 1 表示广播 |
Client IP address | 客户机IP地址 |
"Your" IP address | DHCP服务器为客户机提供的IP地址存放在此字段 |
(Next) Server IP address | 下一个为DHCP客户端分配IP地址等信息的DHCP服务器IP地址。仅在DHCP Offer 、DHCP ACK 报文中显示,其他报文中显示为0。 |
Gateway (Relay) IP address | 由DHCP 或BOOTP 中继器填写,如果消息没有经过中继器则此字段为0 |
Client Hardware address | 客户机硬件地址 |
Server Name | 可选的服务器主机名,是一个null 结尾的字符串,由服务器填写 |
Boot File Name | 引导文件名。是一个null 结尾的字符串,DHCP OFFER 报文中提供有效的文件路径,其他消息中不显示, 一般不使用 |
Options | 选项字段。可变字段,格式为"代码+长度+数据",是DHCP消息和BOOTP消息的区别之处 |
选项部分
代码 | 字段名称 |
---|---|
1 | 子网掩码 |
3 | 路由器地址 |
6 | 域名服务器 |
15 | 域名 |
50 | 请求的IP地址 |
51 | 地址租用期 |
53 | DHCP消息类型 |
54 | 服务器标识符 |
55 | 参数请求列表 |
56 | DHCP错误信息 |
58 | 租约更新时间 |
59 | 租约重新绑定时间 |
61 | 客户机标识符 |
119 | 域搜索列表 |
255 | 结束 |
其中53(DHCP消息类型选项)有多个可能的值:
- DHCP DISCOVER
- DHCP OFFER
- DHCP REQUEST
- DHCP ARK
- DHCP NAK
- DHCP DECLINE
- DHCP RELEASE
- DHCP INFORM
- DHCP FORCERENEW
- DHCP LEASEQUERY
- DHCP LEASEUNASSIGNED
- DHCP LEASEUNKNOWN
- DHCP LEASEACTIVE
3. 操作和状态
操作过程
DHCP协议操作过程上图显示的是当一个DHCP客户端向DHCP服务器新请求一个IP地址的过程:
Wireshark抓包结果
获取过程
-
发现阶段
- 由于不知DHCP服务器的IP地址和Mac地址,DHCP客户机通过向本地网络广播一个
DHCP DISCOVER
请求报文以向网络中的DHCP服务器请求网络配置信息。 - 最后本地网络上每个DHCP服务器都会接收到DHCP发现报文,而同时其他主机也会收到此报文,只不过当拆包后发现源IP地址是
0.0.0.0
后就会抛弃这个包。
- 由于不知DHCP服务器的IP地址和Mac地址,DHCP客户机通过向本地网络广播一个
-
提供阶段
- 当DHCP服务器收到发现报文,它就从它的地址池中选出一个空闲IP填充到
DHCP OFFER
的"Your" IP address字段,并在选项字段加上子网掩码,路由器,DNS,服务器标识,IP地址租用时间等字段。再广播此报文(因为此时还不知客户机的IP地址)
- 当DHCP服务器收到发现报文,它就从它的地址池中选出一个空闲IP填充到
-
请求阶段
- 最后客户机可能会收到多个DHCP服务器的
DHCP OFFER
报文,一般是选最先到达那个报文并作出回应请求,即广播发出一个 包含服务器选项字段的DHCP REQUEST
报文。这里还使用广播的目的是因为要让所有的DHCP服务器知道客户机选择了哪个服务器提供的IP。
- 最后客户机可能会收到多个DHCP服务器的
-
DHCP服务器收到来自客户机的
DHCP REQUEST
报文,而只有符合服务器标识这个选项字段的DHCP服务器才会对此作出响应:- 如果服务器可以分配此IP则以
DHCP ACK
报文进行响应。 - 如果服务器无法分配此IP则以
DHCP NAK
报文进行响应。
其他DHCP服务器则清除与此请求相关的状态。响应方式还是跟提供阶段一样广播此报文。
- 当DHCP客户机收到的响应是
DHCP NAK
报文,则会重新发送DHCP DISCOVER
报文。 - 若收到的是
DHCP ACK
报文则会执行地址冲突检测(ACD)探测获得的IP地址是否未被使用。- 如果已经被使用则向DHCP服务器发送一个
DHCP DECLINE
报文以通知该地址已经不能被使用。之后经过默认的10秒延时后客户机可再次重试。 - 如果未被使用则获得了该IP地址在租用期间的使用权。
- 如果已经被使用则向DHCP服务器发送一个
- 如果服务器可以分配此IP则以
成功获取后的所有网络配置信息可以通过一条命令查看
Windows下:
ipconfig /all
Linux下:
ifconfig
租约更新过程
因为实在获得可以使用是IP地址的基础上进行租约时间的更新,所以不必向获取过程那么麻烦,只需要向DHCP服务器发送DHCP REQUEST
报文,DHCP服务器收到请求报文如果响应一个DHCP ACK
则更新成功。
同样这个更新租约时间的过程也可以用一条命令来实现
Windows下:
ipconfig /renew
Linux下:
dhclient
租约的释放
如果想在租约结束前释放以获取的IP地址,可以向DHCP服务器发送DHCP RELEASE
报文。同样这个释放操作也可以用一条命令来实现
Windows下:
ipconfig /release
Linux下:
dhclient -r
网友评论