DHCP工作原理简析
引言
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工作原理简析的更多相关文章
- virtIO之VHOST工作原理简析
2017-07-19 一.前言 之前有分析过虚拟化环境下virtIO的实现,virtIO相关于传统的虚拟IO在性能方面的确提高了不少,但是按照virtIO虚拟网卡为例,每次虚拟机接收数据包的时候,数据 ...
- tomcat 工作原理简析
https://github.com/HappyTomas/another-tutorial-about-java-web/blob/master/00-08.md 在00-02.理解HTTP中给出了 ...
- Spring 核心组件工作原理简析
Spring Framework 的核心组件有三个: Spring Core,Spring Context 和 Spring Beans,它们奠定了 Spring 的基础并撑起了 Spring 的框架 ...
- Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
- PHP的错误报错级别设置原理简析
原理简析 摘录php.ini文件的默认配置(php5.4): ; Common Values: ; E_ALL (Show all errors, warnings and notices inclu ...
- DHCP 工作原理
DHCP 详解 DHCP 工作原理 一.什么是DHCP? DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server), ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- [转载] Thrift原理简析(JAVA)
转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...
- Spring系列.@EnableRedisHttpSession原理简析
在集群系统中,经常会需要将Session进行共享.不然会出现这样一个问题:用户在系统A上登陆以后,假如后续的一些操作被负载均衡到系统B上面,系统B发现本机上没有这个用户的Session,会强制让用户重 ...
随机推荐
- scrollview 嵌套imageview显示长图
起初使用代码如下:但是图片显示不全,上半截被截 <ScrollView android:layout_width="match_parent" android:layout_ ...
- flask学习(一)
特点: 短小精悍,可扩展性强 依赖wsgi:werkzurg werkzurg示例: from werkzeug.wrappers import Request, Response from werk ...
- VMware使两台windows虚拟机能够互相ping通
1.关闭防火墙 cmd命令行里输入:netsh firewall set opmode disable 2.测试如果还不能ping通,就把网络类型选nat类型 3.测试:vmware网关默认是.2
- Laravel-google-authenticator--Google验证码
开发前的准备 安装Laravel 安装二维码生成器QrCode,没有安装也可以,接下来会安装 安装拓展 1.运行如下代码安装拓展包: composer require "earnp/lara ...
- .Net 入门资料推荐 (编辑中)
1.首先推荐 网易云课堂上的一个付费课程:常老师带你学ASP.NET MVC ,价格199元 2. 一个.net的框架,ABP,中文介绍如下 http://www.cnblogs.com/farb/p ...
- 《剑指offer》和为S的两个数字
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- python爬取安居客二手房网站数据(转)
之前没课的时候写过安居客的爬虫,但那也是小打小闹,那这次呢, 还是小打小闹 哈哈,现在开始正式进行爬虫书写 首先,需要分析一下要爬取的网站的结构: 作为一名河南的学生,那就看看郑州的二手房信息吧! 在 ...
- 使用Python批量下载Plus上的Podcast
Plus是一个介绍数学之美与实际应用的网络杂志,其中包含了数学知识.轶闻趣事.历史典故等许多精彩的内容.该杂志恰好有一个Podcast栏目,提供了不少采访与讲座的mp3音频.于是, 我使用Python ...
- RAID磁盘阵列及CentOS7系统启动流程
磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意,,数据读取无影响.将数据切割成许多区段,分别存放在各个硬盘 ...
- brew本地安装包
brew --cache # 输出本地缓存 一般位置 ~/Library/Caches/Homebrew # 将下载下来文件mv到缓存路径 download目录 # 重命名成没有下载下来的文件名 xx ...