浅谈DHCP协议

栏目: 服务器 · 发布时间: 5年前

内容简介:本文从分配方式、工作过程、租约、数据包格式、中继代理等几个方面介绍了DHCP协议对IPV4地址的分配过程。上篇文章回顾:GO interface实现分析本文首发于公众号“小米运维”,点击查看原文。

本文从分配方式、工作过程、租约、数据包格式、中继代理等几个方面介绍了DHCP协议对IPV4地址的分配过程。

上篇文章回顾:GO interface实现分析

概要

DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,使用udp协议进行工作,可以为局域网的客户端动态的分配IP地址。DHCP协议有常用的三个端口,分别为67,68和546。其中67和68号端口为DHCP Server和DHCP Client的端口,546用于DHCP Failover,需要单独开启,主要用于双机热备。

DHCP分配方式

DHCP的分配方式分为三种,分别是静态分配,自动分配和动态分配。

静态分配: 管理员选择分配的IP地址,由DHCP服务器发送给客户端。这种方式为永久分配,DHCP服务器通过相关的配置将客户端MAC地址与分配的IP地址对应。

DHCP服务器配置如下:

浅谈DHCP协议

自动分配: 服务器从其IP池内分配一个IP地址给客户端,在firewall,如果租期被指定为 Unlimited 则意味着该IP地址为永久分配,此种分配方式下客户端第一次向DHCP服务器申请到该IP地址后,便可永久使用该IP地址,该地址不可分配给其他客户端。

动态分配: DHCP收到客户端的IP地址后从IP pool中选择一个IP地址进行分配,该IP地址只在租约期内有效,超出租约期后若不再续约则会被收回,此种方式可以很好的自动重复使用IP地址。

DHCP服务器配置如下:

浅谈DHCP协议

DHCP工作过程

1、DHCP Discover: 客户端以广播形式发送DHCP Discover报文,该局域网内的所有DHCP服务器都可以收到此报文。

2、DHCP Offer: DHCP服务器收到客户端发送的DHCP Discover报文后,会从配置的地址池中选择一个IP地址预分配给客户端,该IP地址封装在DHCP offer报文内以广播形式发送给客户端。

3、DHCP Request: 客户端会在收到的DHCP offer报文中选择一个IP,一般为第一个收到的DHCP offer报文,但此时客户端并不能使用该IP,需要以广播形式发送DHCP Request报文给DHCP服务器。

4、DHCP Ack: DHCP服务器收到后会查看客户端选择的是否为自己分配的IP地址,如果不是,则将IP地址放回地址池,等待下一次的客户端的申请。如果选择的是自己分配的IP地址,则广播发送DHCP ACK报文给客户端,并在服务端将客户端的MAC地址和IP地址进行绑定。

5、客户端收到该报文后不会立即使用,而是利用ARP进行探测该地址是否被其他客户端所使用,如果在超时时间内没有得到回应,则客户端使用该IP地址,如果得到ARP回应,则发送DHCP DECLINE包给DHCP服务器,然后重复上述流程,向DHCP服务器申请IP地址。

DHCP客户端重新启动后不需要再发送DHCP Discover报文进行地址申请,它进行和续约类似的操作。

上述工作过程通过tcpdump抓取到的报文如下:

浅谈DHCP协议

浅谈DHCP协议

浅谈DHCP协议

浅谈DHCP协议

DHCP租约

自动续约

动态分配的IP地址有租期的限制,客户端如果在租约结束后仍要使用该IP地址,则需要进行续约申请,申请过程如下:

此外动态分配的IP地址有租期的限制,在租约剩余50%的时候,客户端会发送DHCP REQUEST报文向DHCP服务器申请租约更新,若服务器返回DHCP ACK报文则客户端成功续约,但是如果申请的IP地址已经不能再使用,则会发送DHCP NAK报文给客户端,此时客户端会以广播形式发送DHCP Discover报文给局域网内的所有DHCP服务器,在该报文中request IP为自己正在使用的IP,如果没有收到DHCP ACK报文则继续使用当前IP地址,到租约期的87.5%时重复上述过程,如果在租约期结束时仍未成功续约,则客户端要释放该IP地址,重新进行IP地址的申请。

浅谈DHCP协议

手动释放IP以及重新申请IP

DHCP手动进行IP地址释放或者申请IP的命令如下(分别为windows与 linux 的操作命令):

ipconfig /release| dhclient -r   #将当前的IP地址与其他配置信息释放复制代码
ipconfig /renew | dhclient   eth0     #向DHCP服务器申请一个IP地址复制代码

DHCP数据包格式

DHCP的数据包格式如下:

浅谈DHCP协议

各字段含义如下:

op: 报文类型,取值为1或2

1:客户端请求报文

2:服务器响应报文

Htype: 硬件类型,1则表示以太网

Hlen: 硬件地址长度,以太网的为6

Hops: 表示当前客户端经过的中继数目,默认值为0,该值要小于等于16,大于16则会被标记为不可达。

Xid: 为客户端随机挑选的随机数,用于与服务端发送的报文相对应

Secs: 表示客户端获取地址或者地址租用后所用的时间,单位为s

Flags: 标志为,前15为均为0,第16位表示该报文为广播还是多播

0:客户端以单播的形式发送报文给服务端

1:客户端以广播的形式发送报文给服务端

Ciaddr(client ip address): 客户端IP地址。可以是服务端分配的IP地址也可以是客户端已有的IP地址,在客户端初始化状态该值为0.0.0.0。

Yiaddr(your client ip address): 服务端即将分配给客户端的IP地址。在服务端进行响应时填充该字段。

Siaddr(server ip addr): 客户端获取启动配置信息的IP地址。

Giaddr(gateway ip addr): 第一个DHCP中继的IP地址。客户端和DHCP服务器不在同一个网段时,当客户端发送DHCP请求给第一个DHCP Relay服务器时,该服务器将自己的IP地址填充至该字段,服务器也是根据该地址进行响应报文的发送。

Chaddr(client hardware address): 客户端的MAC地址。

Sname: 可选,由服务器端填写,填充的为客户端获取配置信息的服务器名称。

file: 可选,由服务器填写,该字段填充的是客户端需要获取的配置文件名称。

Options: DHCP选项字段。

由于DHCP协议具有局限性,只能与存在于同一网段的客户端进行通信并分配IP,为了解决这一问题,我们可以采用DHCP代理的方式,由其服务客户端和服务器端之间的报文中转。在客户端看来,DHCP代理服务器就是DHCP服务器,对于DHCP服务器来说代理服务器就是一个申请IP分配的客户端,下面简单介绍一下代理服务器进行中转报文的过程以及相关配置。

DHCP中继代理

DHCP中继代理应用于DHCP服务器和客户端不在同一网段的情况下IP地址的分配。DHCP Relay在收到客户端的DHCP Discover报文后会修改该报文中相应字段,并将报文由广播改为单播发送给指定的DHCP Server,其余报文的发送也由DHCP Relay服务器进行转发。对于客户端来说DHCP Relay服务器与DHCP Server服务器之间的通信是透明的,对于DHCP服务器来说DHCP Relay服务器与客户端之间的通信也是透明的。

架构图如下所示:

浅谈DHCP协议

配置如下

DHCP中继服务器配置

1、修改/etc/sysctl.conf,开启linux路由转发功能

# Controls IP packet  forwarding
net.ipv4.ip_ forward = 1复制代码

2、使配置生效

#sysctl -p复制代码

3、配置dhcprelay

#vim /etc/sysconfig/dhcrelay复制代码

浅谈DHCP协议

4、启动中继服务

#service dhcrelay start复制代码

DHCP服务器配置

浅谈DHCP协议

DHCP协议缺陷

DHCP可以很好的进行IP地址的分配,但是DHCP协议已存在一些缺点,如:

1、DHCP协议不支持跨网段进行地址分配

2、DHCP协议不能获取非DHCP客户端的IP地址,在地址池设置不合理的情况下可能会造成地址冲突。

基于上述的缺陷,我们需要合理对IP地址池进行设置,并预留一些IP地址,分配给需要固定IP的服务器。

以上就是DHCP协议的介绍啦,希望能够帮助你对DHCP协议有一个简单的认识。

本文首发于公众号“小米运维”,点击查看原文。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++ Primer Plus

C++ Primer Plus

Stephen Prata / 张海龙、袁国忠 / 人民邮电出版社 / 2012-6-19 / 99.00元

C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言,是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的。通过大量短小精悍的程序详细而全面地阐述了C++的基本概念和技术。全书分为18章和10个附录,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系表达式、分支语句和逻辑操作符、函数重载和函数模板、内存模型和名称空间、类......一起来看看 《C++ Primer Plus》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试