DHCP协议工作流程剖析
DHCP 服务是用来分配 IP 地址的,所以 DHCP 服务器必须使用静态分配方式设置 IP 地址。而 DHCP 客户端可以从 DHCP 服务器上获取使用的 IP 地址。DHCP 服务器使用的是 UDP 67 端口,DHCP 客户端使用的是 UDP 68 端口。
本节将详细讲解 DHCP 工作方式的 4 个阶段,即发现阶段、提供阶段、选择阶段和确认阶段。
整个发现阶段的工作方式如图所示。
其中,DHCP 客户端向 DHCP 服务器 A 和 B 都发送了 DHCP Discover 广播包。
整个提供阶段的工作方式如图所示。
其中,DHCP 服务器 A 和 B 都会向 DHCP 客户端提供自己管理的地址。
整个选择阶段的工作方式如图所示。
其中,DHCP 客户端向 DHCP 服务器 A 和 B 都发送了 DHCP Request 消息广播包,告诉自己选择了 DHCP 服务器 B 的地址租约。
整个确认阶段的工作方式如图所示。
其中,服务器 B 向客户端返回了地址租用的 DHCP ACK 包,对客户端的请求进行确认。DHCP 服务器 A 没有返回信息,因其地址没有被租用。
假设,租约期为 8 天。当到达 T1 定义的时间(4 天)期限时,客户端会向提供租约的原始服务器发送 DHCP Request 包,对租约进行更新。如果服务器接受此请求,则回复 DHCP ACK 消息,包含更新后的租约期限;如果不接受租约更新请求,就不会发送 DHCP ACK 包。
此后,DHCP 客户端会定时发送 DHCP Request 包。如果一直都没有得到确认,则继续使用此 IP 地址,直到 T2 定义的时间(7 天)限制。此时,客户端会广播发送 DHCP Request 包,对租约进行更新。
如果租期到达时,客户端既不能更新自己的租期,也无法从其他的 DHCP 服务器获得新的租期,客户端必须停止使用这个 IP 地址,从而停止常规的 TCP/IP 网络操作。
本节将详细讲解 DHCP 工作方式的 4 个阶段,即发现阶段、提供阶段、选择阶段和确认阶段。
发现阶段(DHCP Discover)
DHCP 客户端向所有 DHCP 服务器的 UDP 67 端口发送广播数据包以获取 IP 地址租约,这个数据包被称为 DHCP Discover 消息。任何收到这个包的 DHCP 服务器都可以响应这个请求。整个发现阶段的工作方式如图所示。
提供阶段(DHCP Offer)
DHCP 服务器收到 DHCP Discover 广播包后会检查自己的配置,并发起 DHCP Offer 广播消息进行响应,为 DHCP 客户端提供可用的 IP 地址。该响应包以广播的形式发送到 DHCP 客户端的 UDP 68 端口上。整个提供阶段的工作方式如图所示。
选择阶段(DHCP Request)
DHCP 客户端收到地址信息后,会选择第一个到达的租约地址信息。然后发起 DHCP Request 广播消息,告诉所有 DHCP 服务器,自己已经做出选择,接受了第一个 DHCP 服务器的地址。整个选择阶段的工作方式如图所示。
确认阶段(DHCP ACK)
DHCP 服务器 A 和 B 都收到客户端发来的 DHCP Request 消息广播包。DHCP 服务器 B 查看信息后,发现客户端选择了自己的地址租约,将返回 DHCP ACK 广播消息进行最后的确认。DHCP 服务器 A 查看信息以后,发现客户端没有选择自己的地址,将不返回信息。整个确认阶段的工作方式如图所示。
IP 续期
客户端从服务器租用 IP 地址会有一个固定的租约期。除了租约期限外,还有两个时间值 T1 和 T2。其中,T1 定义为租约期限的一半,而 T2 定义为租约期限的 7/8。假设,租约期为 8 天。当到达 T1 定义的时间(4 天)期限时,客户端会向提供租约的原始服务器发送 DHCP Request 包,对租约进行更新。如果服务器接受此请求,则回复 DHCP ACK 消息,包含更新后的租约期限;如果不接受租约更新请求,就不会发送 DHCP ACK 包。
此后,DHCP 客户端会定时发送 DHCP Request 包。如果一直都没有得到确认,则继续使用此 IP 地址,直到 T2 定义的时间(7 天)限制。此时,客户端会广播发送 DHCP Request 包,对租约进行更新。
如果租期到达时,客户端既不能更新自己的租期,也无法从其他的 DHCP 服务器获得新的租期,客户端必须停止使用这个 IP 地址,从而停止常规的 TCP/IP 网络操作。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算