引言

DHCP是网络体系结构中应用层的一个重要协议,它可以帮助我们对要连接到互联网的计算机进行IP地址等信息的配置。本文从DHCP的原理出发,就DHCP的工作过程 进行详细的探讨。

主要报文

  • 发现报文 DHCPDISCOVER
  • 提供报文 DHCPOFFER
  • 请求报文 DHCPREQUEST
  • 确认报文 DHCPACK
  • 否认报文 DHCPNAK
  • 释放报文 DHCPRELEASE

工作过程

DHCP使用客户服务器方式。根据客户与服务器之间的报文交互情况,我们可以把整个DHCP协议工作过程简单地分成以下4 个步骤:

Step1(发现阶段)

DHCP客户以广播(broadcast)的形式发送DHCP发现报文DHCPDISCOVER到本地网络。为什么是以广播的方式呢?因为现在并不知道DHCP服务器在什么地方,所以要发现(DISCOVER)它的IP地址。此时的DHCP客户还没有自己的IP地址,因此它将自己IP数据报的源 IP地址 设为全 0 。而将目的 IP地址 设为全 1 ,也就是我们说的广播地址255.255.255.255。这样,本地网络上所有安装了TCP/IP协议的主机都可以收到这个报文,但只有DHCP服务器才对这个报文进行应答。

Step2(提供阶段)

凡收到DHCP发现报文的DHCP服务器都发出DHCP提供报文。DHCP服务器先在其数据库中 查找该计算机的配置信息。若找到,则返回找到的信息;若找不到,则从服务器的地址池(address pool)中取一个地址分配给该计算机。这里存在的疑问是,为什么要先在数据库里查找?这是因为数据库中可能存在与客户端MAC地址静态绑定的IP地址,而这个地址优先分配。这个阶段DHCP服务器发出的应答报文叫做DHCPOFFER,表示“提供”了IP地址等信息。

Step3(选择阶段)

DHCP客户可能收到多个 DHCP提供报文,它从几个DHCP服务器中选择其中的一个,通常是收到的第一个 ,并向所选择的DHCP服务器发送请求报文,请求(REQUEST)使用对方提供的IP地址和其他配置数据。

Step4(确认阶段)

被选择的DHCP服务器发送确认报文DHCPACK给DHCP客户。DHCP客户收到报文后,就可以使用刚才提供的IP地址了。这种状态称为“已绑定 ”。

说明

1. DHCP使用的协议和端口

DHCP数据报采用UDP协议进行封装,DHCP客户使用的UDP端口是68,而DHCP服务器使用的UDP端口是67。

2. DHCP的租期和计时器

DHCP分配给DHCP客户的IP地址是临时 的,DHCP客户只能在一段时间内使用这个分配的IP地址。DHCP协议称这段时间为租期(Lease Time),这个时间可以在DHCP服务器上设置。RFC2132对Lease Time的要求如下 :

The time is in units of seconds, and is specified as a 32-bit
unsigned integer.

时间以秒为单位,并指定为32位无符号整数 。可以设置的时间范围从1秒到136年(232秒),DHCP客户也可以在自己发送的报文中提出对租期的要求。

因此,DHCP客户现在要根据服务器提供的租期T设置两个计时器T1和T2,它们的超时时间分别0.5T和0.875T,来提醒自己更新租期

当超时时间到达T1时,DHCP客户发送请求报文DHCPREQUEST要求更新租期。

  • DHCP服务器若同意,则发回确认报文DHCPACK。DHCP客户得到了新的租用期,重新设置计时器。
  • DHCP服务器若不同意,则发回否认报文DHCPNAK。这时DHCP客户必须立即停止使用原来的IP地址,回到发现阶段重新申请IP地址。
  • DHCP服务器若不响应,则在超时时间到达T2时,重新发送请求报文DHCPREQUEST要求更新租期,然后重复前面的步骤。

DHCP客户可以随时提前终止服务器提供的租期,这时只需向DHCP服务器发送释放报文DHCPRELEASE即可。

结束语

以上介绍了DHCP协议的详细工作过程,对DHCP使用的端口、协议、租期和计时器等重要概念进行了说明。

DHCP工作原理简析的更多相关文章

  1. virtIO之VHOST工作原理简析

    2017-07-19 一.前言 之前有分析过虚拟化环境下virtIO的实现,virtIO相关于传统的虚拟IO在性能方面的确提高了不少,但是按照virtIO虚拟网卡为例,每次虚拟机接收数据包的时候,数据 ...

  2. tomcat 工作原理简析

    https://github.com/HappyTomas/another-tutorial-about-java-web/blob/master/00-08.md 在00-02.理解HTTP中给出了 ...

  3. Spring 核心组件工作原理简析

    Spring Framework 的核心组件有三个: Spring Core,Spring Context 和 Spring Beans,它们奠定了 Spring 的基础并撑起了 Spring 的框架 ...

  4. Java Android 注解(Annotation) 及几个常用开源项目注解原理简析

    不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...

  5. PHP的错误报错级别设置原理简析

    原理简析 摘录php.ini文件的默认配置(php5.4): ; Common Values: ; E_ALL (Show all errors, warnings and notices inclu ...

  6. DHCP 工作原理

    DHCP 详解 DHCP 工作原理 一.什么是DHCP? DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server), ...

  7. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  8. [转载] Thrift原理简析(JAVA)

    转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...

  9. Spring系列.@EnableRedisHttpSession原理简析

    在集群系统中,经常会需要将Session进行共享.不然会出现这样一个问题:用户在系统A上登陆以后,假如后续的一些操作被负载均衡到系统B上面,系统B发现本机上没有这个用户的Session,会强制让用户重 ...

随机推荐

  1. 盒子取球C语言 蓝桥杯

    盒子取球方法二今盒子里有 n 个小球,A.B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个, 也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定:每个人从盒子中取出 ...

  2. oracle参数MEMORY_TARGET太小无法启动的解决过程

    环境: windows server datacenter 4G,4x2=8处理器 oracle 11g 错误如下 ORA-: Specified value of MEMORY_TARGET is ...

  3. kafka 重新分配partition

    登陆kafka manager 进入相关topic 点击generate partition assignments 点击reassign partirons

  4. Linux代理搭建TinyProxy

    操作系统:阿里云CentOS 7.4 64位 安装方法: yum install tinyproxy 配置: vi /etc/tinyproxy/tinyproxy.conf Port 8888 // ...

  5. 深入Java虚拟机:多态性实现机制——静态分派与动态分派

    方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这个特性给Java带来了更强大的动态扩 ...

  6. 【原创】大叔经验分享(49)hue访问hdfs报错/hue访问oozie editor页面卡住

    hue中使用hue用户(hue admin)访问hdfs报错: Cannot access: /. Note: you are a Hue admin but not a HDFS superuser ...

  7. Python3学习十四

    1.  JS基本概念 网景和sun联合开发javascript javascript 三个部分:ECMAScript 语法    DOM(document object model)    BOM(b ...

  8. mysql explain结果含义

    在SQL语句前面加上EXPLAIN即可 各字段含义 id SELECT识别符.这是SELECT的查询序列号 select_type SELECT类型,可以为以下任何一种: SIMPLE:简单SELEC ...

  9. HashMap 学习 (JDK8)

    1.hashmap中hash函数的实现中,异或运算操作的结果是什么,为什么要做这样的异或运算 static final int hash(Object key) { int h; return (ke ...

  10. macos 命令行安装 ipa

    macos 命令行安装 ipa 苹果发神经后itunes已经无法在安装app了,如果有知道的兄弟可以告诉我啊 ideviceinstaller 使用这个开源项目可以在macos下安装app brew ...