DHCP:Dynamic Host Configurtion Protocol
DHCP的工作原理(UDP)
1.客户端:首先会发送给一个dhcp discovery(广播)报文,报文中的2层和3层都是广播地址。
2.服务器:收到客户端发来的discovery报文后,单播回复一个dhcp offer(单播)报文(包含IP地址、租约信息、dns等),同时dhcp服务器也会生成一个租期表格(ip地址、租期、mac)。ps:此处为单播主要是原因是交换机有这client的mac列表,所以可以单播回复,减少资源消耗。
3.客户端:收到服务器来的dhcp offer报文后,广播发送一个dhcp request报文。包含自己的IP地址信息,目的是为了①:告诉别的DHCP服务器,我已经有地址了,你们之前准备分给我的地址,你们可以收回了。②告诉选中的DHCP,我选择你了,你的地址我准备用了。
4.服务器:收到客户端发来的dhcp request报文后,会发送一个dhcp ack或dhcp nak.服务器检测后可以用,就回复ACK,如果地址冲突或者无效就回复NAK,客户端重新获取地址。
5.客户端:获取地址成功后,会发送1~3个DAD(免费ARP),确保地址在广播网中可以使用。
DHCP租期
客户端:当客户端的地址租期到50%的时候,会主动发送一个dhcp request(单播),请求续租地址。如果服务器不回复,时间到达87.5%的时候,客户端会再发送一个dhcp request(广播)报文,请求续租地址。华为默认是1天(24h)。
dhcp报文
-
discovery:client发现DHCPserver报文
-
offer:server给客户端分配的地址
-
request:client请求报文(①一开始请求地址②后来续租地址)
-
ack:server对client报文的确认
- nak:Server对Client的DHCPREQUEST报文的拒绝响应报文,Client收到此报文后,一般会重新开始新的DHCP过程。
-
release:client释放地址发送的报文
- inform:client获取更多的地址信息,例如后期需要获取DNS(之前手动)。
- decline:Client发现Server分配给它的IP地址无法使用,如IP地址冲突时,将发出此报文,通知Server禁止使用IP地址
DHCP-request发送时间
从抓包来看,应该是0s、2s、5s、10s
DHCP中继
原理:
-
发现阶段
DHCP中继接收到DHCP客户端广播发送的DHCP DISCOVER报文后,进行如下处理:- 检查DHCP报文中的hops字段,如果大于16,则丢弃DHCP报文;否则,将hops字段加1(表明经过一次DHCP中继),并继续下面的操作。
DHCP报文中的hops字段表示DHCP报文经过的DHCP中继的数目,该字段由客户端或服务器设置为0,每经过一个DHCP中继时,该字段加1。hops字段的作用是限制DHCP报文所经过的DHCP中继的数目。目前,设备最多支持DHCP客户端与服务器之间有存在16个中继。 - 检查DHCP报文中的giaddr字段。如果是0,将giaddr字段设置为接收DHCP DISCOVER报文的接口IP地址。如果不是0,则不修改该字段,继续下面的操作。
DHCP报文中的giaddr字段标识客户端网关的IP地址。如果服务器和客户端不在同一个网段且中间存在多个DHCP中继,当客户端发出DHCP请求时,第一个DHCP中继会把自己的IP地址填入此字段,后面的DHCP中继不修改此字段内容,DHCP服务器会根据此字段来判断出客户端所在的网段地址,从而为客户端分配该网段的IP地址。 - 将DHCP报文的目的IP地址改为DHCP服务器或下一跳中继的IP地址,源地址改为中继连接客户端的接口地址,通过路由转发将DHCP报文单播发送到DHCP服务器或下一跳中继。
如果DHCP客户端与DHCP服务器之间存在多个DHCP中继,后面的中继接收到DHCP DISCOVER报文的处理流程同前面所述。
- 检查DHCP报文中的hops字段,如果大于16,则丢弃DHCP报文;否则,将hops字段加1(表明经过一次DHCP中继),并继续下面的操作。
- 提供阶段
DHCP服务器接收到DHCP DISCOVER报文后,选择与报文中giaddr字段为同一网段的地址池,并为客户端分配IP地址等参数,然后向giaddr字段标识的DHCP中继单播发送DHCP OFFER报文。
DHCP中继收到DHCP OFFER报文后,会进行如下处理:
- 检查报文中的giaddr字段,如果不是接口的地址,则丢弃该报文;否则,继续下面的操作。
- DHCP中继检查报文的广播标志位。如果广播标志位为1,则将DHCP OFFER报文广播发送给DHCP客户端;否则将DHCP OFFER报文单播发送给DHCP客户端。
报文格式
重点关注2个字段
Giaddr:该字段表示第一个DHCP中继的IP地址(注意:不是地址池中定义的网关)。当客户端发出DHCP请求时,如果服务器和客户端不在同一个网络中,那么第一个DHCP中继在转发这个DHCP请求报文时会把自己的IP地址填入此字段。服务器会根据此字段来判断出网段地址,从而选择为用户分配地址的地址池。服务器还会根据此地址将响应报文发送给此DHCP中继,再由DHCP中继将此报文转发给客户端。若在到达DHCP服务器前经过了不止一个DHCP中继,那么第一个DHCP中继后的中继不会改变此字段,只是把Hops的数目加1。
chaddr:该字段表示客户端的MAC地址,此字段与前面的"Hardware Type"和"Hardware Length"保持一致。当客户端发出DHCP请求时,将自己的硬件地址填入此字段。对于以太网,当"Hardware Type"和"Hardware Length"分别为"1"和"6"时,此字段必须填入6字节的以太网MAC地址。