DHCP实现原理DHCP定义DHCP(DynamicHostConfigurationProtocol,动态主机配置协议)是一种局域网网络协议,采用UDP协议工作。它是一种流行的Client/Server协议,一般用于指定主机或路由器的相关配置信息。DHCP服务在企业和家庭中得到了广泛的应用。它可以自动分配ip地址和其他一些相关信息,整个过程对客户是透明的。DHCP分配方式自动分配方式(AutomaticAllocation),DHCP服务器为主机分配一个永久的IP地址,一旦DHCP客户端第一次成功从DHCP服务器租用IP地址,就可以永久使用该地址。动态分配方式(DynamicAllocation),DHCP服务器为主机分配一个有时间限制的IP地址,当时间到期或主机明确放弃该地址时,该地址可以被其他主机使用。在手动分配方式(ManualAllocation)下,客户端的IP地址由网络管理员指定,DHCP服务器只是将指定的IP地址告诉客户端主机。DHCP工作过程DHCP客户端启动时,会搜索网络中是否有DHCP服务器。如果找到,则会向DHCP服务器发送请求。DHCP服务器收到请求后,为DHCP客户端选择TCP/IP配置的参数,并将这些参数发送给客户端。如果配置了冲突检测设置,DHCP服务器在将租约中的地址提供给客户端之前使用Ping测试范围内每个可用地址的连接性。这可确保提供给客户的每个IP地址都不会被另一台使用手动TCP/IP配置的非DHCP计算机使用。DHCP的工作方式因客户端是否是首次登录网络而异。首次登录DHCP工作包括四个步骤1.查找DHCP服务器当DHCP客户端第一次登录网络时,计算机发现本机没有设置IP地址,会发送DHCP的“discover发现信息”广播模式。寻找DHCP服务器,即向255.255.255.255发送特定的广播信息。网络上每台安装了TCP/IP协议的主机都会收到这个广播信息,但只有DHCP服务器会响应。2.分配IP地址。网络中接收到DHCPdiscover发现信息的DHCP服务器会做出响应。它选择一个未分配的IP地址池并将其分配给DHCP客户端,并向DHCP客户端发送包含分配的消息。DHCP提供了IP地址和其他设置的信息。3、接受IP地址DHCP客户端收到DHCPoffer提供的信息后,选择最先收到的offer信息,然后以广播的方式响应一个DHCPrequest请求报文,其中包含对DHCP服务器的请求selectedIP地址的内容。4、IP地址分配确认当DHCP服务器收到DHCP客户端应答的DHCP请求信息后,向DHCP客户端发送一个包含IP地址和其他设置的DHCPack确认报文,告诉DHCP客户端它可以使用它提供的IP地址。然后,DHCP客户端计算机将其TCP/IP协议绑定到网卡。另外,除了DHCP客户端计算机选择的DHCP服务器外,其他DHCP服务器一旦提供IP地址,就会收回。DHCP客户端重新登录后,不需要每次重新登录网络都发送DHCPdiscover发现信息,而是直接发送包含上次分配的IP地址的DHCPrequest请求信息。当DHCP服务器收到这个信息后,会尝试让DHCP客户端继续使用原来的IP地址,并回复一个DHCPack确认信息。如果这个IP地址不能再分配给原来的DHCP客户端,DHCP服务器就会回复一个DHCP-nackdeny报文给DHCP客户端。原DHCP客户端收到DHCPnack报文后,必须重新发送DHCPdiscover报文,请求新的IP地址。1、如果客户端DHCP请求中的IP地址没有在服务器端使用,DHCP服务器会回复一个DHCPACK继续使用该IP。2、如果客户端DHCP请求中的IP地址在服务器端已经被使用,DHCP服务器会回复DHCPNACK,告诉客户端该IP地址已经被使用。3、回复NACK后,重新启动第一次DHCP登录的过程,续租。DHCP服务器租给DHCP客户端的IP地址一般都有租期。到期后,DHCP服务器将收回租用的IP地址。如果DHCP客户端想要延长其IP租约,它必须更新其IP租约。当DHCP客户端启动时,当IP租期达到租约的50%时,DHCP客户端会自动向DHCP服务器发送信息,续订其IP租约。CentOS7安装DHCP包[root@jhr-hub~]#yum-yinstalldhcp[root@jhr-hub~]#cat/etc/dhcp/dhcpddhcpd6.confdhcpd.conf[root@jhr-hub~]#cat/etc/dhcp/dhcpd.conf##DHCP服务器配置文件。#see/usr/share/doc/dhcp*/dhcpd.conf.example#seedhcpd.conf(5)manpage#[root@jhr-hub~]#[root@jhr-hub~]#cp/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example/etc/dhcp/dhcpd.confcp:overwrite'/etc/dhcp/dhcpd.会议'?y[root@jhr-hub~]#修改DHCP配置文件[root@jhr-hub~]#vim/etc/dhcp/dhcpd.conf[root@jhr-hub~]#[root@jhr-hub~]#[root@jhr-hub~]#[root@jhr-hub~]#cat/etc/dhcp/dhcpd.conf#dhcpd.conf##ISCdhcpd##选项定义通用的示例配置文件...optiondomain-name"example.org";optiondomain-name-servers3.7.191.1;#设置当前IP地址的有效期,单位sdefault-lease-time60;#设置应用最大有效期max-lease-time60;#使用它全局启用/禁用动态dns更新。#ddns-update-style无;#如果这个DHCP服务器是官方的DHCPse本地#网络的rver,权威指令应该取消注释。#authoritative;#使用它来将dhcp日志消息发送到不同的日志文件(你还#必须破解syslog.conf以完成重定向)。log-facilitylocal7;#不会在该子网上提供任何服务,但声明它有助于#DHCP服务器了解网络拓扑。#声明IP地址段和子网密码subnet192.168.1.0netmask255.255.255.0{#地址池:设置一个地址段范围192.168.1.100192.168.1.200;#指定网关optionrouters3.7.191.1;#获取DNSoptiondomain-name-servers192.168.1.1;}#这是一个非常基本的子网声明。subnet10.254.239.0netmask255.255.255.224{range10.254.239.1010.254.239.20;optionroutersrtr-239-0-1.example.org,rtr-239-0-2.example.org;}#此声明允许BOOTP客户端获取动态地址,#我们并不真正推荐。子网10.254。239.32网络掩码255.255.255.224{范围动态bootp10.254.239.4010.254.239.60;选项b广播地址10.254.239.31;optionroutersrtr-239-32-1.example.org;}#内部子网的配置略有不同。subnet10.5.5.0netmask255.255.255.224{range10.5.5.2610.5.5.30;选项域名服务器ns1.internal.example.org;选项域名“internal.example.org”;选项路由器10.5.5.1;选项广播地址10.5.5.31;默认租用时间600;max-lease-time7200;}#需要特殊配置选项的主机可以在#host语句中列出。如果未指定地址,地址将#动态分配(如果可能),但主机特定信息#仍将来自主机声明。hostpassacaglia{hardwareethernet0:0:c0:5d:bd:95;文件名“vmunix.passacaglia”;server-name"toccata.fugue.com";}#主机也可以指定固定IP地址。这些地址#不应该也被列为可用于动态分配。#固定IP地址的主机已指定es可以使用#BOOTP或DHCP进行引导。没有指定固定地址的主机只能#使用DHCP启动,除非BOOTP客户端连接到的子网#上有一个地址范围,该地址范围具有动态引导标志#set.hostfantasia{hardwareethernet08:00:07:26:c0:a5;fixed-addressfantasia.fugue.com;}#你可以声明一类客户,然后根据它进行地址分配#。下面的示例显示了这样一种情况,其中某个类中的所有客户端都在10.17.224/24子网上获得地址,而所有其他客户端在10.0.29/24子网上获得地址。class"foo"{matchifsubstring(optionvendor-class-identifier,0,4)="SUNW";}shared-network224-29{subnet10.17.224.0netmask255.255.255.0{optionroutersrtr-224.example.org;}subnet10.0.29.0netmask255.255.255.0{optionroutersrtr-29.example.org;}pool{允许“foo”的成员;范围10.17.224.1010.17.224.250;}水池{拒绝“foo”的成员;范围10.0.29.1010.0.29.230;}}[root@jhr-hub~]#Startservice[root@jhr-hub~]#systemctlstartdhcpd[root@jhr-hub~]#systemctlstatusdhcpddhcpd.service-DHCPv4ServerDaemonLoaded:loaded(/usr/lib/systemd/system/dhcpd.service;已禁用;供应商预设:已禁用)活动:活动(运行)自周四2021-12-0911:25:37CST;2s前Docs:man:dhcpd(8)man:dhcpd.conf(5)MainPID:142669(dhcpd)Status:"Dispatchingpackets..."Memory:5.0MCGroup:/system.slice/dhcpd.service└─142669/usr/sbin/dhcpd-f-cf/etc/dhcp/dhcpd.conf-userdhcpd-groupdhcpd--no-pidLinux运维交流社区Linux运维交流社区,互联网新闻与技术交流71原创内容公众号https://blog.csdn.net/qq_3392...https://my.oschina.net/u/3981543https://www.zhihu.com/people/...https://segmentfault。com/u/hp...https://juejin.cn/user/331578...https://space.bilibili.com/35...https://cloud.tencent.com/dev...知乎、CSDN、开源中国、私服、掘金、哔哩哔哩、腾讯云本文使用文章同步助手进行同步
