引言

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. Windows10安装Debug

    1. 什么是Debug? Debug是DOS.Windows都提供的实模式(8086方式)程序的调试工具. 使用它,可以查看CPU各种寄存器中的内容.内存的情况和在机器码级别跟踪程序的运行. 2. 常 ...

  2. c++ 常用头文件

    1.#include<iostream> iostream 的意思是输入输出流.#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头 ...

  3. iTOP-4418/6818开发板用户使用手册内容有哪些

                    更多内容分享,请继续期待 iTOP-6818开发板与4418开发板共兼容同一底板: 核心板:::::: 尺寸:50mm*60mm 高度:核心板连接器组合高度1.5mm ...

  4. 软件测试为什么需要学习Linux的知识?Linux学到什么程度?-log5

    ​软件测试为什么需要学习Linux的知识?学到什么程度?-log5 Dotest软件测试学堂-董浩 公司目前90%的服务器操作系统不是Windows,而是Linux(RedHat.Debian.Cen ...

  5. 分布式系列十: Redis安装和命令

    redis是一个开源的, 内存数据结构存储, 一般用来作为数据库,缓存和消息代理. Redis的优势 多种数据结构 字符类型String 散列类型Hash 列表类型List 集合类型Set 有序集合类 ...

  6. hyperledger fabric部署总结

    之前在有道云笔记上分享过,但想想还是搬到这里来吧,以后统一方便整理自己的知识进入正题.... 之前在调研 hyperledger fabric,其实部署说明官网都有,只是东西都是国外的照着操作也会遇到 ...

  7. Non-decreasing Array

    Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...

  8. WPF UserControl响应窗体的PreviewKeyDown事件

    目的 在UserControl页面实现通过快捷键打开新建窗口 实现过程 监听Window窗体的PreviewKeyDown 其实,使用KeyDown事件也是可以的 页面代码 <Window x: ...

  9. ASP.NET 异步返回的Action (编辑中。。。)

    新学.net,最近用到了ABP框架,发现了如下代码: public override async Task<UserDto> Get(EntityDto<long> input ...

  10. C# 高级编程03----细节内容

    一.名称空间 1.C#使用Using关键字可以列出所需类的名称控件. 它和C/C++ 中的#include不一样.using语句并没有在这些文件之间建立物理连接 2.使用using给名称空间指定别名 ...