DHCP(Dynamic Host Configuration Protocol)动态主机配置协议,用于分配IP地址。先向Server设置一批可用的IP地址,当Client向Server请求IP地址时,Server能自动地将IP分配给Client。手工配置IP地址麻烦不说,还容易出错,比如分配了重复的IP地址,当Client端不用IP地址时,该IP地址也不能被及时回收。DHCP解决了这些问题,能保证IP地址不重复分配,能及时回收IP地址以提高IP地址的利用率。管理方便,省时省力。
DHCP工作原理:(4步握手)
1.Client发送DHCP广播(DHCPDISCOVER)来寻找DHCP Server。网段里所有安装了TCP/IP协议的主机都能收到,但只有DHCP Server会响应
2.接收到DHCPDISCOVER的所有DHCP Server都会做出响应,回复DHCPOFFER(表示我可以为你提供IP),里面包含被分配的一个IP地址
3.Client会根据先来先到的原则(ARP是后来先到),选择收到的第一条DHCPOFFER,并广播DHCPREQUEST向该DHCP Server其请求IP地址。之所以用广播而非单播,是因为能顺便通知其他DHCP Server,它已经决定使用某台DHCP Server提供的IP地址了
4.DHCP Server收到Client的DHCPREQUEST后,回复DHCPACK
补充以下两点:
1.以后Client每次重新登录网络时,就不需要再发送DHCPDISCOVER重新寻找DHCP Server了,直接发送前一次DHCPREQUEST(内含IP地址)。DHCP Server收到后,如果该IP还能用,将让Client继续使用,回复一个DHCPACK。如果该IP不能用了(以被回收并分配给了他人),将回复一个DHCPNACK。Client收到DHCPNACK后,就需要重新从第一步开始发送DHCPDISCOVER来重新寻找DHCP Server重新获取新IP地址。
2.DHCP Server分配给Client的IP地址有一个租借期限(默认为1天),期满后DHCP Server会回收该IP地址。当Client启动时间为租约的50%时,Client会自动向DHCP Server发送更新租约的请求。如果DHCP Server应答,则延期租约。如果DHCP Server没应答,在租约的87.5%时间点,Client应该与任何一个其它的DHCP Server通信,并请求更新它的配置信息。如果Client不能和所有的DHCP Server取得联系,租约到期后,它必须放弃当前的IP地址。并重新从第一步开始发送DHCPDISCOVER来重新寻找DHCP Server重新获取新IP地址。当然,Client不想用该IP地址时,可以主动向DHCP Server发出DHCPRELEASE,将当前的IP地址释放。
DHCP报文:
OP :0x01是Client的请求,0x02是Server的应答
HTYPE:硬件类型,1为以太网,15为帧中继,20为串行线路等
HLEN:硬件地址的长度,以太网为6
HOPS:跳数,当前的DHCP数据包每经过一个路由器会加1,作用是限制DHCP数据包不要经过太多的路由器
TRANSACTION ID:由Client产生的32位标识符,用来将请求和从DHCP Server得到的回复匹配
SECONDS:从Client开始尝试获取或更新租约用。当有多个Client请求未得到处理时,DHCP Server用该值来确定回复的优先顺序
FLAGS 标志:只使用16位中的左边的最高位,代表广播标志
ciaddr:当Client想继续使用之前的IP地址就将其放到这里,否则为0
yiaddr:DHCP Server分配给Client的IP地址
siaddr:DHCP Server的IP地址
giaddr:网关的IP地址。跨网段发送DHCP时,需要设置。可以帮助位于不同子网或网络的Client与DHCP Server间传输请求和回复
chaddr:Client的硬件地址
sname:DHCP Server名,发送DHCPOFFER或DHCPACK时可以选择性地将其名称放在此处
file:启动文件名,Client可以选择性地在DHCPDISCOVER中使用它来请求特定类型的启动文件。在DHCP中使用它来完整指定启动文件目录和文件名。
Options:包括基本DHCP运作所需的几个参数(如Netmask / Gateway / DNS等)。该字段长度不定,最长312字节
DHCP配置:
将R1配置为DHCP Server,其他路由器或终端都从R1中自动获取IP地址:
配置命令:
先配置一下R1的基本配置:
R1(config)#inter f0/0
R1(config-if)#ip addr 10.1.1.1 255.255.255.0
R1(config-if)#no shutdown
R1(config-if)#inter f2/0
R1(config-if)#ip addr 12.1.1.1 255.255.255.0
R1(config-if)#no shutdown
现在将R1配置为DHCP Server:
R1(config)#service dhcp //启动DHCP服务,默认是开启的
R1(config)#ip dhcp pool pool-1 //新建一个dhcp池,起名pool-1
R1(dhcp-config)#network 10.1.1.0 255.255.255.0 //池中可分配的地址
R1(dhcp-config)#default-router 10.1.1.1 //默认网关,即和左边网络连接的以太口f0/0的IP地址
R1(dhcp-config)#dns-server 8.8.8.8 //DNS
现在R3可以从R1(DHCP Server)中自动获取IP地址了:(Client不必非是路由器,如果R3是PC的话,就不必如下配置了,直接将IP地址设置为自动获取即可)
R3(config)#inter f0/0
R3(config-if)#ip addr dhcp //client直接搜索DHCP Server并获取IP
R3(config-if)#no shutdown
现在可以在DHCP Server上和Client上查看当前DHCP信息:
R1#show ip dhcp pool //DHCP Server端这两条命令查看,IP地址池中信息,哪些已分配掉了
R1#show ip dhcp bingding //分配给了哪些Client
R3#show dhcp server //Client端这两条命令查看,Client从哪台Server获取IP
R3#show dhcp lease //IP租约
R3(Client)从R1(DHCP Server)自动获取到IP地址,如果你不想IP地址经常变,想固定R3的IP地址(如固定为10.1.1.13),可以:
R1#show ip dhcp bingding //找到R3的标识
R1(config)#ip dhcp pool pool-R3 //新建一个dhcp池,起名pool-R3
R1(dhcp-config)#client-identifier XXX //把R3的标识贴进去
R1(dhcp-config)#host 10.1.1.133 255.255.255.0 //为R3分配固定的IP地址,此处已经不是network是host
R1(dhcp-config)#default-router 10.1.1.1 //默认网关
R1(dhcp-config)#dns-server 8.8.8.8 //DNS
//这样R3每次接入网络,从R1哪里能获得固定的IP地址(10.1.1.13)
DHCP Server可以保留不想被分配出去的IP,比如1-100都不想分配出去,希望从101开始分配:
R1(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.100
//这样左边网络中10.1.1.1-10.1.1.100都将被保留,收到DHCPDISCOVER后,会从10.1.1.101开始分配。
从DHCP Server分配出去的IP地址,租期默认都是1天,可以修改:
R3(dhcp-config)#lease 2 //改成2天
DHCP Relay(中继):
上例中R3(Client)从R1(DHCP Server)处于同一网段,用广播没问题。但现实中Client和DHCP Server几乎肯定处于不同网段中。假设上图中R1和R2间是处于12.1.1.0/24网段,但R2和R6处于30.1.1.0/24网段,这样R6就无法直接从R1(DHCP Server)获取到IP地址,因为R6发出的广播R1收不到。这就需要DHCP Relay,即将广播转为单播:
先配置R2:
R2(config)#inter f0/0
R2(config-if)#ip addr 30.1.1.1 255.255.255.0
R2(config-if)#ip helper-address 12.1.1.1 //配helper地址,收到30.1.1.0的广播,将转发给12.1.1.1(即R1的f2/0口)
R2(config-if)#no shutdown
R2(config-if)#inter f1/0
R2(config-if)#ip addr 12.1.1.2 255.255.255.0
R2(config-if)#no shutdown
再配置
R1(config)#ip dhcp pool pool-2 //新建一个dhcp池
R1(dhcp-config)#network 30.1.1.0 255.255.255.0 //池中可分配的地址
R1(dhcp-config)#default-router 30.1.1.1 //默认网关
R1(dhcp-config)#dns-server 8.8.8.8 //DNS
R1(config)#ip router 30.1.1.1 255.255.255.0 12.1.1.2 //还需要配一条R1去往发送helper地址的静态路由,这样R6发广播向R1请求IP后,R1才能响应回去
这样R6就能经由R2将广播转为单播,想R1(DHCP Server)请求IP地址了