##简介 DHCP,即Dynamic Host Configuration Protocol(动态主机设置协议),是一个局域网协议,用于给内部网络或者网络服务供应商自动分配IP给用户。缓存
##DHCP原理 DHCP运行分四个阶段,分别是服务器
发现阶段
客户在物理子网上发送广播来寻找可用的DHCP服务器。该客户实现生成一个源地址为0.0.0.0(还没分配IP),目的地址为255.255.255.255(有限广播地址)或者一个子网广播地址的UDP包。SA能够配置一个本地路由来转发DHCP包给另外一个子网上的DHCP服务器。 客户也能够申请它使用的最后一个IP地址。若是该客户所在的网络中此IP仍然可用,服务器就能够准许该申请(续租)。不然,就要看该服务器是受权的仍是非受权的。 受权服务器会拒绝请求,使得客户马上申请一个新的IP。非受权服务器仅仅忽略掉请求,致使一个客户端请求的超时,因而客户端就会放弃此请求而去申请一个新的IP地址。网络
提供阶段
当DHCP服务器收到一个来自客户的IP租约请求时,它会提供一个IP租约(从IP池之中)。DHCP为客户保留一个IP地址,而后经过网络单播/广播(取决于BROADCAST为为1仍是为0)一个DHCPOFFER消息给客户(客户端接收端口为UDP 68)。该消息包含客户的MAC地址(是客户端的MAC地址才接受)、服务器提供的IP地址、子网掩码、租期以及提供IP的DHCP服务器的IP。若是收到多个DHCP服务器的offer,客户端默认只接受第一个到的。并发
选择阶段 即客户端选择IP地址的阶段。当客户端收到一个IP租约提供时,它必须告诉全部其余的DHCP服务器它已经接受了一个租约提供。所以,该客户会发送一个DHCP REQUEST消息(从UDP 68端口发送),源地址为0.0.0.0,目标地址为255.255.255.255,其中包含提供租约的服务器的IP,已经分配的IP地址。。当其余DHCP服务器收到了该消息后(从UDP 67端口接收),它们会收回全部可能已提供给客户的租约。而后它们把曾经给客户保留的那个地址从新放回到可用地址池中,这样,它们就能够为其余计算机分配这个地址。任意数量的DHCP服务器均可以响应同一个IP租约请求,可是每个客户网卡只能接受一个租约提供。tcp
4.确认阶段 当DHCP服务器收到来自客户的REQUEST消息后,它就开始了配置过程的最后阶段。这个响应阶段包括发送一个DHCP ACK包给客户,单播或者广播,仍是取决于BROADCAST位。这个包包含租期和客户可能请求的其余全部配置信息。这时候,TCP/IP配置过程就完成了。 该服务器响应请求并发送响应给客户。整个系统指望客户来根据选项来配置其网卡。.net
关于受权DHCP服务器:code
DHCP受权是为了应对一个网络中有多台DHCP服务器的时候,用于肯定接收那一台DHCP服务器服务。blog
##DHCP续约路由
若是使用动态IP策略,则DHCP服务器在续约期满后又会收回已分配给客户端的IP。若是客户端须要继续使用原有的IP就须要续约:get
若是上述过程失败,DHCP客户端仍然会在租期到达7/8时再次以广播方式发送DHCP。
深刻参考: DHCP包格式
后记: 试图用tcpdump -i wlan0 -w DHCP.cap 'udp and port 67 and port 68'
去抓取DHCP过程当中的四个包(经过断开wlan0的链接,再链接),结果抓来抓去只有两个包(REQUEST和ACK)。看了一下客户端的IP地址,一直没有变过。 猜想:彷佛Linux的NetworkManager对于客户端的网络有记忆行为,当网络断开以后,这个网络的IP会被缓存,当再次链接到这个网络以后,并不向DHCP服务器请求,而是直接发送续约请求。因此没有DISCOVER包和OFFER包。