DHCP 客户端在通信链路上发起 DHCP 请求包,请求包主要是告诉 DHCP 服务器,它想要用上一步提供的网络设置,然后 DHCP 服务器向 DHCP 客户端发送确认包,表示允许 DHCP 客户端使用第二步发送的网络设置。
至此,DHCP 的网络设置就结束了,然后通信链路上的主机之间就可以进行 TCP/IP 通信了。
当不需要 IP 地址时,可以发送 DHCP 解除包(DHCP RELEASE)进行解除。另外,DHCP 的设置中通常会有一个租期时间的设定,DHCP 客户端在这个时限内可以发送 DHCP 请求包通知想要延长这个期限。
DHCP 状态机我们上面知道 DHCP 会发送几种请求包,我们知道,动作肯定伴随着状态的更改,DHCP 也是一样的,在 DHCP 发送/接收各种包的时候,其状态也在发生相应的改变。DHCP 协议可以在客户端和服务器上运行状态机。状态决定了协议接下来要处理的消息类型。
状态之间的转换(箭头)是由于接收和发送消息或者计时器到期才发生的转换。下面是 DHCP 的状态轮转图。
客户端在开始时没有消息,此时处于 INIT 状态,然后客户端会在通信链路上发起一个广播 DHCP DISCOVER。
在 Selecting 选择状态下,客户端会收集 DHCPOFFER 消息,直到确定要使用的地址和服务器为止。
一旦 DHCP 客户端做好选择后,它就会发送 DHCPREQUEST 消息并进入 Requesting 状态,在这个状态下它很可能收到并不需要的 ACK 响应,如果这个状态下没有找到合适的地址的话,那么客户端就会发送DHCPDECLINE 并恢复为 INIT 状态,但是这种发生的概率比较小。
在处于 Requesting 状态下的客户端很可能接受发送过来的 DHCPACK 消息,获取超时时间 T1 和 T2,然后进入 Bound 绑定状态,在这个状态下可以使用地址直到地址过期。
在第一个计时器 T1 到期时,客户端会进入 renewing 续订状态,并重新尝试建立租约时间,如果收到新的 ACK 消息就表示续订成功,然后就恢复为 Bound 状态。
如果没有收到 ACK 那么 T2 会最终过期进入 Rebinding 状态,进入这个状态的客户端会重新尝试获取地址,如果最终的租约到期,那么客户端必须放弃租约地址,并且如果没有其他地址或网络连接要使用,客户端将断开连接。
DHCP 冲突现在我们讨论一下 DHCP 冲突的问题,DHCP 冲突其实就是 IP 重了,当一个子网中两个或者更多主机配置了相同的 IP 地址时,就会发生 IP 冲突的现象。发生这种情况可能导致的后果是两个冲突的主机混在一起,一台主机可能接收了另一台主机的数据包。
那么造成这种情况的原因是啥呢?
造成这种情况的原因有很多,这里我列举两个可能出现的情况:
第一种情况是一台主机配置了静态 IP 地址,这台主机联网后,其 IP 地址不会在 DHCP 服务器中,然后另外一个主机入网,DHCP 服务器给这台主机自动分配了相同的 IP 地址,这两个地址就产生了 IP 冲突。
第二种情况是,客户端从 DHCP 服务器获得了 IP 地址,然后这台主机下线了,随着租约到期,DHCP 会将这个 IP 地址又分配给了其他主机,等到这个主机重新上线后,由于某种原因,计算机无法访问 DHCP 服务器,这种情况下会造成 IP 冲突。
当检测到 IP 冲突时,通常 Windows 系统和 Mac 系统会弹出 IP 冲突的弹窗。
DHCP 中继代理常规家庭网络(土豪除外)中大多数都只有一个以太网,也就是 LAN 网段,一个 DHCP 服务器完全可以满足 LAN 中的客户机使用。但是,在更复杂的网络中,比如企业或者学校,一台 DHCP 服务器显然就无法满足了。因此,这种情况下,往往需要 DHCP 的统一管理,具体实现方式可以通过 DHCP 中继代理 来转发 DHCP 流量,如下图所示。
如上图所示,存在两个网段 A 和网段 B,DHCP 客户机和 DHCP 服务器不在一个网段内,所以我们在通信链路上架设了一个中继代理,DHCP 客户机通过访问中继代理以达到访问 DHCP 服务器的目的。
使用这种方式,我们不再需要在每个网段都设置一个 DHCP 服务器,只需要在每个网段架设一个中继代理即可。它可以设置 DHCP 服务器的 IP 地址,从而可以在 DHCP 服务器上为每个网段注册 IP 地址的分配范围。