DHCP协议:动态主机配置协议
DHCP是基于C/S架构的协议
- C/S架构:Client/Server --- 客户端/服务端
- B/S架构:browser/server ---浏览器/服务器
DHCP的客户端的端口号是:68,服务端的端口号是:67
HDCP数据帧结构:
OP:op=1,客户端发送给服务端的封包;op=2,服务端发送给客户端的封包;还有一个特殊的情况,就是客户端request时的特殊标识
HTYPE: 硬件类别
HLEN: 硬件地址长度
HOPS: 跳数,每经过一次转发+1,若在同一网内,为0(客户端的初始设置为0)
FLAGS:(从0到15共16 bits)
最左1Bit为1时表示:服务端将以广播方式传送封包给客户端
最左1Bit为0时表示:服务端将以单播方式传送封包给客户端
HDCP的工作流程:
首次连接:(这个时候有四个阶段)
①发现阶段 (这个阶段主要发送方为客户端。客户端 ---> 服务端)
此时是以客户端为主要发送者,以广播形式发送 DHCP-Discover包给服务端
②提供阶段 (这个阶段主要发送方为服务端。服务端 ---> 客户端)
服务器在收到客户端发来的请求后,以单播/广播形式发送DHCP-offer包 给客户端
(offer包内会携带一个有效的ip地址,服务器会暂时为DHCP客户端保留这个ip)③选择阶段(这个阶段主要发送方为客户端。客户端--->服务端)
客户端在收到服务器发来的信息后,客户端以广播形式发送DHCP-request包给服务端,请求使用这个ip地址
(当客户端获得多个offer的包时,会选择第一个获取的offer包中的ip地址作为请求ip)④确认阶段 (这个阶段主要发送方为服务端。服务端--->客户端)
服务端在收到客户端的请求后,会以单播/广播包发送DHCP-ACK包/DHCP-NCK包给客户端 (DHCP-ACK包表示允许客户端使用此ip,DHCP-ACK包则为拒绝客户端使用这个ip)
再次连接:
客户端因为一些特殊原因断开了DHCP连接,此时需要重新向服务器申请ip地址(最好是上一次链接的ip),所以再次连接时,会直接从选择阶段开始
①客户端以广播形式向服务器发送DHCP-request包
- 请求获取上次使用的ip地址
②服务器以单播/广播包形式发送DHCP-ACK包/DHCP-NAK包
- DHCP-ACK表示允许使用request请求的ip地址(上次断开连接使用的地址)
- DHCP-NAK表示需要重新获取新的ip地址(此时服务器重新发送offer包)
特殊的包:DHCP-Release数据包 ---- 客户端主动释放ip地址
DHCP的几个数据包:
DHCP Discover:客户端开始DHCP过程发送的包,是DHCP协议的开始。以广播的方式发送DHCP DISCOVER报文。来寻找局域网中的DHCP服务器。源地址为0.0.0.0 目的地址为255.255.255.255, 网络上所有支持TCP/IP的主机都会收到该DHCP DISCOVER报文,但是只有DHCP Server会响应该报文。
DHCP Offer:服务器接收到DHCP DISCOVER之后做出的响应,通过解析报文,查询dhcpd.conf配置文件,如果在地址池中能找到合适的IP地址,DHCP Server会给DHCP Client发送Offer报文。它包括了给予客户端的IP(yiaddr)、客户端的MAC地址、租约过期时间、服务器的识别符自己其他信息。
如果存在多个DHCP服务器,单个服务器依然会发送多个DHCP OFFER报文。
DHCP Request:客户端对于服务器发出的DHCP OFFER所做出的响应,在续约租期的时候同样会使用。Client根据先收到的Offer报文来决定使用哪个服务器提供的DHCP的地址。(优先先到的offer报文)然后根据这个Offer提供的地址信息,发送Request报文请求。
- 客户端初始化时,发送广播的DHCP Request报文来回应服务器的DHCP Offer报文
- 客户端重启初始化后,发送广播的DHCP的DHCP Request报文来确认先前被分配的IP地址等配置信息。
- 当客户端已知和某个IP地址绑定后,发送单播的DHCP Request报文来延长IP地址租期。
DHCP ACK:服务器在接收到客户端发来的DHCP REQUEST之后发出的成功确认的报文。在建立连接的时候,客户端在接收到这个报文之后才会确认分配给他的IP和其他信息可以被允许使用。服务器接收到request报文以后,确认地址池中的这个地址没有被分配,如果没有被分配就回复ACK报文,如果被分配了,就会回复DHCP-NAK报文,告诉Client地址已经被分配了
DHCP NAK :表示服务器拒绝了客户端的请求
DHCP RELEASE :一般出现在客户端关机、下线等情况。这个报文将会使DHCP服务器释放发出此报文的客户端的IP地址,当服务器收到此报文后,可将这个IP地址分配给其他客户端
DHCP INFORM:客户端发出的服务器请求一些信息的报文。如DNS, 网关
DHCP DECLINE:客户端发现服务器分配的IP地址无法使用(IP地址冲突),将发出此报文,通知服务器禁止使用该IP地址
关于DHCP的租期问题:(租期24H)
①:T1 --- 租期的50%(12h) DHCP客户端(PC) ---> DHCP服务器 发送DHCP-request包(单播) <续约请求>
②:T2 --- 租期的87.5%(21h)DHCP客户端(PC) ---> DHCP服务器 发送DHCP-request包(广播) <续约请求>
如果时间结束服务端无条件释放ip地址,服务端重新获取ip地址DHCP服务器按照如下优先次序为客户端选择IP地址:
- DHCP服务器的数据库中与客户端MAC地址静态绑定的IP地址
- 客户端以前曾经使用过的IP地址,即客户端发送的DHCPDISCOVER报文中请求IP地址选项的地址
- 在DHCP地址池中,在顺序查找可供分配的IP地址中,最先找到的IP地址
- 如果在DHCP地址池中未找到可供分配的IP地址,则依次查询超过租期、发生冲突的IP地址,如找到可用IP地址,则分配否则报告错误
DHCP客户端申请续约的步骤:
- 在DHCP客户端的IP地址租约期限达到50%时,DHCP客户端会向为它分配IP地址的DHCP服务器以单播方式发送DHCPREQUEST请求报文,以期进行IP租约的更新
- 如果DHCP服务器同意续约,则DHCP服务器向客户端以单播方式返回DHCP ACK报文,通知DHCP客户端已经获得新IP租约,可继续使用此IP地址;相反,如服务器不同意续约,则DHCP服务器以单播方式返回DHCP NAK报文,通知DHCP客户端不能获得新的租约。此IP地址不可以再分配给该客户端。
- 如上面的续约申请失败,则DHCP客户端还会在租约期限达到87.5%时,再次以单播方式发送REQUEST请求报文进行续约。
在linux上的具体操作:
-
DHCP的安装
//DHCP的安装
[root@localhost /]# yun clean all --- 清理缓存
[root@localhost /]# yun makecache --- 建立缓存
[root@localhost /]# yum install dhcp-server -y
//在DHCP装载完成后,查看/etc/dhcp
[root@localhost ~]# cd /etc/dhcp/
[root@localhost dhcp]# ls
dhclient.conf dhclient.d dhcpd6.conf dhcpd.conf
//此时会发现有四个拓展包
//通常我们使用的dhcp.conf进行dhcp的分配划分
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf
//相关的参考文件在/usr/share/doc/dhcp-server/dhcpd.conf.example 下有模板
[root@localhost ~]# cd /usr/share/doc/dhcp-server/
[root@localhost dhcp-server]# ls
dhcpd6.conf.example dhcpd.conf.example dhcp-lease-list.pl ldap
-
DHCP的配置模板
//设置最短存活时间和最大存活时间
default-lease-time 600;
max-lease-time 7200;
//设置为dns不更新,且不主动更改主机名
ddns-update-style none;
ignore client--updates;
//设置dhcp网络段192.168.220.0 而255.255.255.0为反掩码
subnet 192.168.220.0 network 255.255.255.0{
option routers 192.168.220.2; //网关
option subnet-mask 255.255.255.0; //反掩码
range 192.168.220.100 192.168.220.120 //dhcp获得的网络主机位范围
}
subnet 192.168.230.0 network 255.255.255.0{
option routers 192.168.230.2;
option subnet-mask 255.255.255.0;
range 192.168.230.200 192.168.230.220
}
//配置固定网络位
host XX{
hardware ethernet “shebeiming” //配置ens设备号
fixed-address 192.168.220.200 //设置固定主机位
}
练习:
-
单网端dhcp配置
//在dhcp.conf配置单网段
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf
//设定不主动更改地址
ddns-update-style none;
ignore client--updates;
//设置租期
default-lease-time 600;
max-lease-time 7200;
//设置网段192.168.220.XXX
subnet 192.168.220.0 network 255.255.255.0{
option routers 192.168.220.2;
option subnet-mask 255.255.255.0;
range 192.168.220.100 192.168.220.120
}
//此时绑定的是nat
-
增加网卡,多网段dhcp配置
//设置网段信息,第一个为192.168.220.XXX(nat),一个为192.168.230.XXX(网卡)
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client--updates;
default-lease-time 600;
max-lease-time 7200;
//配置192.168.220.XXX
subnet 192.168.220.0 network 255.255.255.0{
option routers 192.168.220.2;
option subnet-mask 255.255.255.0;
range 192.168.220.20 192.168.220.30
}
//这个绑定的是nat
//配置192.168.230.XXX,需要配置一个新网段接口设备
subnet 192.168.230.0 netmask 255.255.255.0 {
range 192.168.230.20 192.168.225.30;
}
//这个绑定的是网卡
-
固定主机dhcp配置
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client--updates;
default-lease-time 600;
max-lease-time 7200;
//配置固定地址192.168.220.200,并设置固定的设备
host XX{
hardware ethernet “XXX”
fixed-address 192.168.220.200
}
//XXX:网卡的mac地址
问题 :
问题1:在练习增加网卡,多网段dhcp配置这个题目时,会出现一个问题.
此时命名为192.168.230.XXX网段,如果此时断开连接,重新DHCP连接,会发现这个时候网络连接耗时很长,原因:客户端在请求原来网段192.168.220.XXX,此时服务器发现并没有这个网段,于是重新进行DHCP协议(赋予新网段192.168.230.XXX)
[这也是很多时候,在断开DHCP连接后,发现重新获得网段时间较快]
问题2:如果使用DHCP获取完地址后,关闭DHCP,此时地址会不会断开?
DHCP主要是提供地址协议,作用就是提供一个ip地址,所以在获得地址后,断掉dhcp,此时地址并不会消失,还能连接