网络知识

DHCP的工作原理

DHCP(Dynamic Host Configuration Protoco,动态主机配置协议)通常被应用在大型的局域网络环境中。

作用:动态的给局域网主机分配ip地址,网关、DNS等,可以将手动地址配置量,自动分配解决地址冲突问题。

什么意思?我们说电脑上网需要三个要素,分别是IP、网关、DNS三个要素。而刚刚插上的电脑没有IP网关和DNS,这时候我们可以通过DHCP这个协议让它去获取到三个要素,这样就可以实现上网。那么DHCP是怎样去获取到这些地址呢?我们先看一下DHCP的报文类型,报文就像网络协议的语言一样,有了语言才能交流工作。

各位小伙伴们,你们有没有遇到过对静态配置IP地址的种种困扰,比如:

  • 在终端规模较大的网络中手工配置IP地址时,为避免IP地址重复,需要事先规划每个终端的IP地址,导致工作量大且容易出错。
  • 当终端位置经常变更时(例如企业出差人员的便携电脑),每次变更都需要重新手工配置IP地址,烦神又烦力呀~~~
  • 某些特殊的无盘工作站,无法手工配置IP地址,该如何与网络实现互通?

解决办法 so easy!有了动态主机配置协议DHCP(Dynamic Host Configuration Protocol),上面的问题都可以解决了。小伙伴们再也不用担心手工配错,费神费力了。DHCP能够实现动态为主机分配IP地址,而且是目前应用很广泛的一种技术。例如,办公室,网吧里的固定PC;咖啡厅,机场等提供WIFI接入的地方用手机上网,这些都会用到DHCP。

DCHP一共有六种报文类型,我们平常只用到了四种。

  • DHCP Discover:客户端用来寻找
  • DHCP服务器:广播
  • DHCP Offer:DHCP服务器用来响应,此报文携带了IP地址等配置信息(单播)
  • DCHP Request:客户端请求地址续租,重启之后也会发,用于确认分配的信息(广播)(续租单播)
  • DHCP Ack:服务器对request报文的确认响应(单播)
  • DHCP NAK:服务器对request报文的拒绝响应
  • DCHP Release:客户端要释放地址时用来通知服务器

那么电脑是如何使用这些报文去获取IP地址的呢 ?

DHCP的工作过程:

DHCP的工作过程大概可分为四步:

  • 1.客户端发广播寻找DHCP服务器
  • 2.DHCP服务器单播回复客户端Offer
  • 3.客户端广播请求这个ip,发广播一方面是为了请求这个地址,另一个方面也是告诉其他的dhcp服务器自己有地址用了
  • 4.服务器发送ACK包

经过以上四个步骤之后客户端就获得了IP地址等信息,客户端在获得IP地址之后发送GARP检测IP地址有没有冲突。

举个例子来说:

​以上图为例子:

  • 1.主机a是刚刚接入网络中的一台主机,在主机a接入之后,就会广播发送Discover包,寻找网络中的DHCP服务器。
  • 2.当dhcp服务器收到a的discover包之后,会单播回复给a一个offer包,里面包含着一个ip地址和一些配置信息比如,网关,租期,dns等。
  • 3.当主机a收到这个offer包之后确认要使用,就广播发送request请求这个IP地址,发广播的原因可能网络中还有其他的DHCP服务器,告诉他们自己有了IP地址。
  • 4.当dhcp服务器收到a的request之后单播发送一个ACK,a收到ack之后就开始使用这个IP地址。
  • 以上就是DHCP的工作过程,我们看到从主机寻找到获取地址一共只用到了四种数据包,那么其他两种数据包是在那种情况下被用到的呢?这就扯到了DHCP协议的一个小细节,叫做租期。

DHCP的租期

DHCP服务器给客户端分配到的地址,就会有一个默认的租期为一天,也就是说过了这个租期之后DHCP服务器就会把这个地址收回,客户端就无法使用这个ip进行上网了。租期范围内客户端通过三个定时器来实现续租和释放IP地址。

  • 1.租期更新

​以上图为例,主机a从DHCP服务器获取得到了一个IP地址,ip租约期限到达50%时,主机a会单播发送dhcp request包,来申请延长ip地址的租期,服务器向主机a发送确认报文,给主机a一个新的租期。

  • 2.租期重绑定

以上图为例,在主机a在租期达到87.5%时,还没收到服务器的响应报文,会认为dhcp服务器不可用,广播重新发送request申请重绑定。网络上任何一台DHCP服务器都可以应答ack或者nak。

如果收到ack回复主机复位自己的租期为一天,重新更新计时器。如果收到了NAK,客户端会立即停用现有IP,重新申请ip地址。

  • 3.租期失效

以上图为例,在ip租期到达之后,如果没有收到服务器回应,就会发送release报文,释放这个IP地址

客户端不再使用分配地址也会发release,来释放改地址释放之后客户端重新发送discover。

此时我们思考一个问题,客户端在请求地址的时候发送一个广播包,我们都知道广播包是无法跨越三层设备的,如果这时候dhcp服务器与客户主机不在同一个网段应该怎么做?

以上图为例,可以看到电脑和服务器不在同一个网段,还想从dhcp服务器获得地址,这时候就用到了dhcp中继

dhcp中继的作用是可以让路由器转发dhcp的数据报文,这样就可以实现客户端和服务器在不同网段也能获得地址。


图文并茂的看一下dhcp的工作过程

这是一台华为路由器,加两台PC机,路由器来充当PC的DHCP服务器。

既然充当服务器,我们在路由器上,开启dhcp服务,并建立两个地址池。

然后,在接口上,启用dhcp

再然后,到PC机上查看,怎么得不到地址呢,明明已经配置好dhcp了啊?

接下来,给路由器的0口和1口,分别配置上地址

再来PC这边看

已经获得了地址

先回答一个疑问,这台DHCP服务器有两个地址池,10段和20段,那么当他收到1个dhcp请求,如何判断应该从哪个地址池分地址?

答案是,根据他收到dhcp请求的接口,哪个接口收到的,就去拿个和该接口相同网段的地址发下去。

一开始为什么不发地址,因为接口没地址啊,接口没地址就无法判断从哪个池下发地址啊。

再来分析DHCP获得地址时的四个过程,在这四个过程中,将解答题主的所有疑问

现在拿右边的全新PC来看,打开抓包工具wireshark。

捕获的dhcp discover报文

可以看出,PC获取地址总共做了7个动作,分别来看

第一步,以广播的形式,发出一个dhcp discover报文,顾名思义,是为了寻找dhcp服务器

因为pc这时候还没ip,所以源ip是4个0

pc这时候也不知道dhcp服务器的ip,所以目标ip是广播,4个255

mac地址的话,源mac是pc自己,目标mac也是广播

捕获的dhcp discover报文

第二步,dhcp服务器会回复dhcp offer

offer报文可以通过单播来发送,使用单播可以减少网络中报文的数量,提高网络的性能

但是等等,不是说PC还没地址吗,单播必须写明确的地址,写什么地址??

PC是没有ip地址,但是PC有mac地址啊,写明mac地址,这样单播报文就可以正常送达了

捕获的dhcp discover报文

第三步,PC会向服务器申请使用这个地址,回应一个dhcp request

因为在网络中可能不止存在一台dhcp服务器,所以PC机也是可能从多个服务器中都获得地址的,就像咱们在找工作的时候,可能多家公司都发来了offer,咱们需要回应别人的offer,才算确定接受了这个岗位。

所以PC收到offer后,也是一样的,再像服务器发一个request,表示接受这个地址。

request包的目标地址是广播,也是告诉其他服务器,pc已经心有所属了。

捕获的dhcp request报文

第四步,服务器会回应一个确认包,dhcp ack

确认这个地址分配给了PC,这个就比较好理解了,无需做太多说明。

第五步,检测一下有没有地址冲突

这个步骤,其实和dhcp没有太大关系了,主要是PC机测试一下,自己刚拿到的新地址,在网络中是不是独一无二的,有没有冲突。

连发3个无故arp,用来检测网络中是否还存在相同的地址,如果没收到回应就正常,收到回应的话,会找dhcp服务器再申请个新的。