DHCP协议应用之动态地址分配

地址分配实际只在客户端在初始状态并且发送一个 DHCPDISCOVER信息时完成。如果客户端认为它有一个有效的租约并且发送了一个DHCPREQUEST信息来初始化或者更新租约,服务器就只有3个选择:1)它可以忽略DHCPREQUEST信息,并且返回一个DHCPNAK 信息来告诉客户端,要求客户端停止使用这个地址,2)或者发送一个DHCPACK信息,告诉客户端继续再使用这个地址一段时间,如果服务器找到客户端要求的地址,并且这个地址对于这个客户也是可用的,服务器会发送一个DHCPACK信息,如果这个地址已经不能用了,客户端就不能使用它,此时服务器将会发送一个DHCPNAK信息,3)如果服务器不知道这个地址,它会先保持沉默,除非这个地址对于客户端依附的地址段是不正确的,这种情况下服务器会发送一个DHCPNAK,即便它完全不知道这个地址。

如果有一个host语句定义了客户端,同时host语句中包含了固定地址fixed-address),这个IP地址对于客户端实际连接的网段也是合法的,此时DHCP协议的服务器不动态分配地址,而是发送host语句指明的地址。如果此时用户发送了DHCPREQUEST信息来获得其它地址,服务器会回应一个DHCPNAK信息,来拒绝为用户分配其它地址。

当一个DHCP服务器为客户端分配一个新的地址时(记住,这只发生在客户端发送DHCPDISCOVER信息时),它首先查找lease文件,看客户机是否存在一个有效的地址租约,或者此客户机原来是否有一个地址这个地址已经过期),如果有,服务器就会检查那个地址,看客户端是否被允许使用这个地址,如果客户端已经不被允许使用这个地址通常是客户机从另外一个子网登录了,或者此地址被其它客户端占用),并且服务器lease文件中显示原来的租约还存在,服务器就释放这个租约,事实上,此时是客户端发送的DHCPDISCOVER信息,它已经证明客户端实际并没有使用这个租约。如果没有找到存在的租约,或者客户端被强迫接收一个已经存在的租约,那么服务器就会查找客户端所在网段的地址池,找一个允许客户端使用而又没有使用的地址,它会按顺序遍历每个地址池(所有地址池外的“范围”range定义语句都组成一个没有允许列表的单独的池)。如果地址池的允许列表允许客户端得到一个池中的地址,这个地址池会被检查是否有可用的地址,如果有,客户端将会得到这个地址;否则,会检查下一个地址池。如果一直都没有找到可用的地址,服务器就不发送回应。如果找到一个地址,这个地址以前从未被任何客户端使用过,这个地址将立即分配给这个客户,如果这个地址曾经分配给另一个客户端,服务器会尝试查找一个从未分配的地址给客户端。

DHCP服务器使用哈希表(hash table)来产生一组可用的IP地址,这意味着地址不以任何特定的顺序存放,这样也就不能预测DHCP服务器下一个要分配的地址。前一个版本的ISC DHCP服务器使用降序来分配地址,现在不是了,并且在这个版本里也没有办法配置服务器分发地址的顺序 (ISC DHCP 3)。

DHCP协议应用之防止IP地址冲突

DHCP服务器在分配IP地址前检查它们是否被使用来防止冲突。它通过向准备分配的IP地址发送ICMP Echo请求信息来完成,如果1秒内没有接收到ICMP Echo reply信息,就假定这个地址是可用的。这只对在range语句中指明的租约,并且租约被DHCP服务器认为可用时有效。例如,DHCP服务器或者它的热备机没有列出这个租约在使用中。如果收到ICMP Echo回应,DHCP服务器会假定出现了配置错误――IP地址被网络上的主机使用了,然后它标记这个地址为“废弃地址”,不再把它分配给客户端。如果DHCP协议的客户端试图得到一个地址,但是却没有可用的地址,服务器会随机)标记一个“废弃地址”为“可用”,然后向这个地址发送同样的ICMP Echo 请求,如果没有得到 ICMP Echo reply回应,这个地址就会分配给这个客户。

如果要收回的第一个IP地址是可用的,DHCP服务器不会去循环使用“废弃地址”。而且,当下一个客户的DHCPDISCOVER信息到达时,它会用相同的方法开始一个新的分配,并且尝试分配一个新的IP地址。


相关内容

    暂无相关文章