一、为什么需要DHCP?

手工配置ip地址可以通过ifconfig eth0 10.0.0.1/24 或者 ip addr add 10.0.0.1/24 dev eth1 设置ip地址。但是手动配置ip地址,会存在IP冲突的情况,IP冲突会导致通信异常。

二、DHCP (Dynamic Host Configuration Protocol)

DHCP采用中心化租约的形式,首先局域网中有DHCP server,在家中,通常由路由器扮演这种角色。当你的计算机接入路由器,如果路由器采用的是DHCP协议,计算机会向整个局域网广播Boot request,因为你的计算机刚开始,也不知道DHCP server的地址在哪,因此只能广播,报文格式如下所示:
image.png
DHCP是应用层协议,搭载在UDP头上,因为UDP不面向连接,很适合广播,可以看到不但2层是广播支持,3层也是广播地,这样在这个局域网所有的网络设备都能收到这个请求。当然了除了DHCP server,其他节点当然不会回这个消息。当DHCP server收到Boot request,首先会看这个MAC存不存在,如果MAC都重了,DHCP也没办法了,DHCP会将IP地址分配给这个MAC,会做记录,确保这个IP地址不会分给其他设备。
DHCP offer 报文格式如下: image.png
可以看到2层是继续广播,为啥2层继续广播呢?因为这个消息不仅仅是发给目标机器的,也是发给其他DHCP server的,也要让其他DHCP server收到,如果还没有分配ip地址,就不要分配了。

计算机收到DHCP offer之后,还需要再发一次确认报文,格式如下:
image.png
同样的也是2、3层广播,也是需要让所有DHCP服务器知道,该IP他已经使用了,不要再提供给其他租用者了。

最后DHCP服务器收到request,会回一个ack。报文格式如下:
image.png
继续广播所有DHCP服务器,同步一下消息。

二、总结

  1. 为啥都是广播呢,因为一个局域网可能存在多个DHCP server,广播之后,可以选择一个最快的来申请。
  2. 广播的目的还有同步给其他DHCP server 一次租约的情况,其他DHCP server可以将信息记录一下,来实现DHCP的一致性。
  3. 正常情况下,一旦有了IP地址,DHCP Server还是希望通过单播的方式发送OFFER和ACK。但是不幸的是,有的客户端协议栈的实现,如果还没有配置IP地址,就使用单播。协议栈是不接收这个包的,因为OFFER和ACK的时候,IP地址还没有配置到网卡上。