当一台机器新加入一个网络时,只知道自己的 MAC 地址。怎么办?先吼一句,我来啦,有人吗?这一步称为DHCP Discover。
新来的机器使用 IP 地址 0.0.0.0 发送了一个广播包,目的 IP 地址为 255.255.255.255。广播包封装了 UDP,UDP 封装了 BOOTP。其实 DHCP 是 BOOTP 的增强版,但是如果你去抓包的话,很可能看到的名称还是 BOOTP 协议。
在这个广播包里面,新人大声喊:我是新来的(Boot request),我的 MAC 地址是这个,我还没有 IP,谁能给租给我个 IP 地址!
格式就像这样:
如果网络管理员在网络里面配置了DHCP Server,它就相当于这些 IP 的管理员,能知道来了一个“新人”。这时我们可以体会 MAC 地址唯一的重要性了。当一台机器带着自己的 MAC 地址加入一个网络时,MAC 是它唯一的身份,如果连这个都重复了,就没办法配置了。
只有 MAC 唯一,IP 管理员才能知道这是一个新人,需要租给它一个 IP 地址,这个过程称为DHCP Offer。
DHCP Offer能单播和广播,这里先以广播为例,结尾详细讲解。
DHCP Offer 的格式就像这样,里面有给新人分配的地址。
DHCP Server 分配了一个可用的 IP,除此之外,服务器还发送了子网掩码、网关和 IP 地址租用期等信息。
如果有多个 DHCP Server,这台新机器会收到多个 IP 地址。它会选择其中一个 DHCP Offer,一般是最先到达的那个,并向网络发送一个 DHCP Request 广播数据包,包中包含客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器地址等,并告诉其他 DHCP 服务器,谢谢你们的接纳,并请求撤销它们提供的 IP 地址,以便提供给下一个 IP 租用请求者。
由于还没有得到 DHCP Server 的最后确认,客户端仍然使用 0.0.0.0 为源 IP 地址、255.255.255.255 为目标地址进行广播。在 BOOTP 里面,接受某个 DHCP Server 的分配的 IP。
当 DHCP Server 接收到客户机的 DHCP request 之后,会广播(和Offer一样也可单播)返回给客户机一个 DHCP ACK 消息包,表明已经接受客户机的选择,并将这一 IP 地址的合法租用信息和其他的配置信息都放入该广播包,发给客户机,欢迎它加入网络大家庭。
IP 地址的收回和续租
如果不用的话,收回就收回了。就像租房子一样,如果要续租的话,不能到了时间再续租,而是要提前一段时间给房东说。DHCP 也是这样。
客户机会在租期过去 50% 时直接向为其提供 IP 地址的 DHCP Server 发送 DHCP request 消息包。客户机接收到该服务器回应的 DHCP ACK 消息包,会根据包中所提供的新的租期以及其他已经更新的 TCP/IP 参数,更新自己的配置。这样,IP 租用更新就完成了。
DHCP Offer的单播或广播
DHCP在设计之初,充分考虑到TCP/IP协议实现的多样性:TCP/IP协议栈没有完成IP地址配置前,是否可以接受单播报文?
有些协议栈在完成IP地址的配置前,可以接收Destination IP = Any的IP报文,只要该IP报文能够被硬件网卡接收并过滤给IP协议栈。
而有些IP协议栈在完成IP地址的配置前,是不会接收任何单播IP报文的,只会接收广播IP报文,即Destination IP = 255.255.255.255。
DHCP为了增强协议的健壮性,是这样规定的:
如果协议栈在初始化时,不接收单播IP报文,请在DHCP Discovery / Request报文的Flags里明确告知服务器,通过设置“BROADCAST flag = 1”,那么服务器就使用广播来和客户端通信。
如果可以接收单播IP报文,在报文的Flags里设置“BROADCAST flag = 0”,那么服务器就使用单播来和客户端通信。
单播最大的优点:通信是点对点方式,不会影响到广播域的其它主机。
广播的特点:通信是点对所有点的方式,会影响到广播域里其它所有主机。
当主机收到广播报文时,网卡会产生一次硬件中断CPU,CPU会暂停手头的工作来处理这个中断,处理完中断,CPU继续工作。IP协议栈取走数据,一检查和自己无关,丢了。废了那么多功夫,最后的报文和自己无关,这不是资源浪费吗?
如果广播域里的广播报文满天飞,主机们会疲于处理无关的广播报文,不仅浪费网络资源,同时也浪费主机的CPU资源。所以在协议的设计中,要尽可能地避免使用广播。