动态主机配置协议DHCP

当某组织获得一块地址后,就可以为本组织内的主机或者路由器分配IP地址。这个分配工作可以由系统管理员手动通过网络管理工具来完成。也可以由动态主机配置协议(Dynamic Host Congfiguration,DHCP)来完成。现在,主机通常是使用DHCP自动获取IP地址。
当然,网络管理员也可以配置DHCP,使得一台主机一直使用相同的IP地址,或者某主机被分配一个临时的IP地址(即每次都可以是不同的IP地址)。
除了为主机分配IP地址外,DHCP还允许主机得知关于它的其他信息。如子网掩码、默认网关、本地DNS服务器的地址

因为DHCP使主机自动获取IP地址等网络配置信息并使主机接入网络,所以DHCP也被称为即插即用协议(plug-and-play protocol)。这个协议大大的方便了网络管理人员,还被广泛地应用于有主机频繁加入和离开网络的住宅英特网接入网与无线局域网中。

当有主机加入或离开时,DHCP服务器就要更新其可用的IP地址。

当有一台主机加入时,DHCP服务器从其当前可用的地址池中分配一个任意地址给它;当一台主机离开时,其地址便被收回到这个池中。

DHCP运行过程

DHCP是一个客户--服务器协议。客户为主机。

在一个网络中新加入的主机会向DHCP服务器申请地址和得到相关网络配置信息。最简单情况是每个子网都配备一台DHCP服务器,如果某子网中没有服务器,那么就需要一个DHCP中继代理(通常为一台路由器),这个代理知道DHCP服务器的地址。

下图展示了DHCP客户--服务器的一个场景。图中有一台DHCP服务器和一台提供中继代理服务的路由器。

   

DHCP是一个4步骤的过程。

DHCP四步骤

DHCP服务器发现

一台新加入网络的主机首要任务便是找到与其能够交互的DHCP服务器。主机使用UDP分组向端口67发送DHCP发现报文(DHCP discover message)来完成该任务。

由于主机新加入该网络,并不知道该网络的IP地址也不知道DHCP服务器的地址。于是该主机在发送包含DHCP发现报文的IP数据报时,使用目的地址为255.255.255.255的广播地址和使用代表“本主机”的0.0.0.0作为源地址。

DHCP客户将该数据报传递给链路层,链路层然后将该帧广播到所有与该子网连接的子网。

DHCP服务器提供

DHCP服务器收到一个DHCP发现报文时,将使用DHCP提供报文(DHCP offer message)向客户做出响应。,这里仍然会使用广播地址255.255.255.255作为目的地址(现在客户主机并没有地址)。

一个子网中可能会存在好几台DHCP服务器,于是客户可能会在几个提供者之间进行优越选择。

每台服务器的提供报文会包含:发现报文的事务ID、向客户推荐的IP地址、网络掩码、以及IP地址租用期(address lease time),也是就IP地址的有效时间量。租用期通常为几小时或者几天。记为T,这个时间也表示在不更新租约的情况下地址可被租用的时间上限。

也包含更新时间(T1):客户从获得租约到尝试要求服务器更新租约的时间。
以及重绑定时间(T2):客户尝试要求DHCP服务器更新其地址的时间。默认情况下,T1 = T/2;T2 = 7T/8

DHCP请求

DHCP服务提供报文到达客户后,客户便知道了DHCP服务器的信息。这时,客户从一个或者多个提供者中选择一个,并向选择的服务器发送DHCP请求报文(DHCP request message),进行响应,回显配置参数。

此时的数据报目的地址IP地址仍为广播地址,除了被客户选中的服务器外,其余服务器若收到该报文发现报文选项中的服务器IP地址与自己的不同便不做任何响应,并清除相应地IP分配记录。

DHCP ACK

服务器使用DHCP ACK报文(DHCP ACK message)对DHCP请求报文进行响应,证实所要求的参数。如果服务器无法分配包含在DHCPREQUEST消息中的地址,该服务器将会响应一个DHCPNAK消息。

一旦客户收到DHCP ACK报文后,交互便完成了,客户可以在租用期内使用这个IP地址。

更新租约或获得其他消息

若一个主机已有一个IP地址并希望更新其租约,那么它便可跳过最初的DHCPDISCOVER/DHCPOFFER消息,直接通过DHCPREQUSEST消息请求当前当前正在使用的地址。然后协议运作流程如前所述,服务器可能同意也可能拒绝该要求。

客户需要配置其他信息,可使用DHCPINFORM消息代替DHCPREQUEST消息向服务器发出请求,表明想获取其他配置信息。此消息导致服务器会返回一个DHCPACK消息,其中包含请求的额外信息。

以图示例

下面以《计算机网络自顶向下方法》中的图,介绍DHCP协议运行过程(DHCP客户与服务器交互过程)。

yiaddr(意为“你的因特网地址”)指示被分配给新到达客户的地址

       

  • 新到达的客户向DHCP服务器发送发现报文。源地址为0.0.0.0,目的地址为广播地址255.255.255.255,源端口号为68,目的端口为67。事务ID为654。

  • 服务器收到该发现报文后响应提供报文,提供报文包含了上文介绍的发现报文的事务ID、向客户推荐的IP地址、IP地址租用期等信息。

  • 客户选择了提供报文然后做出响应发送请求报文。注意这里发送的IP数据报目的地址仍为广播地址,源地址仍为0.0.0.0。报文包含了客户需要的配置参数,现在的事务ID为原事务ID增加1。

  • 服务器发送DHCP ACK报文进行响应,并证实客户要求的参数。

附图一张客户机的DHCP状态机

   

DHCP协议在客户机和服务器中都会运行一个状态机。状态用于指出协议下一个处理的消息类型。上图中,状态之间的转换源于消息的接收和发送或者超时。

需要注意上图中,从选择到INIT的箭头。这个箭头表示客户机可能接收来自不需要的地址的ACK。如果它没有发现所需要的地址,便会发送一个DHCPDECLINE消息,并转换到INIT状态。


本篇学习笔记主要介绍的是DHCP协议的主要作用以及整个运作流程,许多细节并未涉及。并且,本篇中的DHCP是针对于IPv4,IPv6使用的DHCP版本DHCPv6可能会在后面介绍。

【网络协议】动态主机配置协议DHCP的更多相关文章

  1. 【RL-TCPnet网络教程】第25章 DHCP动态主机配置协议基础知识

    第25章      DHCP动态主机配置协议基础知识 本章节为大家讲解DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),通过前面章节对TCP和UDP ...

  2. 动态主机配置协议DHCP

    一.什么是DHCP DHCP,动态主机配置协议,提供一种称为“即插即用连网”的机制,允许一台计算机加入新的网络和获取IP地址而不用手工配置. 二.DHCP工作原理和工作流程 DHCP服务器被动打开UD ...

  3. 计算机网络之动态主机配置协议DHCP

    为了将软件协议做成通用的和便于移植,协议软件的编写者不会把所有细节都固定在源代码中,而是把协议软件参数化,这就使得在很多台计算机上使用同一个经过编译的二进制代码成为可能. 一台计算机和另一台计算机的区 ...

  4. <TCP/IP>DHCP动态主机配置协议

    坚持是一种好习惯 大家都知道,为了上网我们是需要提交一些配置信息的,如IP地址,子网掩码,DNS服务器等,这些是一个主机能够在Internet上运行并给用户提供常用服务(比如web和Email)的基本 ...

  5. 第9章 应用层(2)_动态主机配置协议(DHCP)

    2. 动态主机配置协议(DHCP) 2.1 静态地址和动态地址的应用场景 (1)静态地址应用场景 ①IP地址不经常更改的设备(如服务器地址) ②使用有规律的IP地址以便于管理(如学校机房为方便教师管理 ...

  6. DHCP:动态主机配置协议

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...

  7. DHCP(动态主机配置协议)工作流程

    一.DHCP的作用 我们先来看一下什么是DHCP,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)它可以为客户机自动分配IP地址.子网掩码以及缺省网 ...

  8. DHCP动态主机配置协议

    1.DHCP简述 某组织一旦获得了一个地址,它就可以为本组织内的主机与路由器接口逐个分配IP地址.系统管理通常可以手工配置路由器中的IP地址(静态分配).但这项任务目前通常更多是使用动态主机配置协议( ...

  9. 动态主机配置协议-DHCP

    一.DHCP 概述 当局域网中有大量的PC时.如果我们逐个为每台PC去手动配置IP.那这就是一个吃力也未必讨好的办法 累死你 而DHCP 刚好可以解决这个问题.DHCP全称(动态主机配置协议).使用的 ...

随机推荐

  1. 搭建hadoop2.4.1

    前期准备: 1.系统基本形况: ip hostname role server loginName 192.168.1.101 h1 NameNode,ResourceManager centos7_ ...

  2. 【VS开发】【计算机视觉】OpenCV读写xml文件《C++版本》

    OpenCV FileStorage类读写XML/YML文件 在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XM ...

  3. 【并行计算-CUDA开发】CUDA shared memory bank 冲突

    CUDA SHARED MEMORY shared memory在之前的博文有些介绍,这部分会专门讲解其内容.在global Memory部分,数据对齐和连续是很重要的话题,当使用L1的时候,对齐问题 ...

  4. kubernetes的namespaces总是Terminating

    0.尝试强制删除不行 删除时带上–force --grace-period=0参数 ,无法删除:kubectl delete namespace rook-ceph --force --grace-p ...

  5. python之函数对象、名称空间、嵌套、作用域、闭包

    函数对象 # 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象​# 函数对应的原因# 1 可以直接被引用# 2 可以当作函数参数传递# 3 可以作为函数的返回值 ...

  6. python列表的切片与复制

    切片,即处理一个完整列表中部分数据. 语法 变量[起始索引:终止索引:步长] 首先创建一个字符串列表 >>> cars = ['toyota', 'honda', 'mazda', ...

  7. js报Uncaught SyntaxError: Unexpected token <错误 解决方法

    js报Uncaught SyntaxError: Unexpected token <错误 解决方法 错因 js被shiro的拦截器拦下,访问不了 #shiro的配置 shiro: hash-a ...

  8. SpringBoot起飞系列-拦截器和统一错误处理(七)

    一.前言 在前边部分我们已经学会了基本的web开发流程,在web开发中,我们通常会对请求做统一处理,比如未登录的用户要拦截掉相关请求,报错页面统一显示等等,这些都需要配置,可以大大简化我们的代码,实现 ...

  9. table+ajax加载数据

    //ajax加载notice $(function() { //${pageContext.request.contextPath}/ /** var res = [ {noticeTitle:'必答 ...

  10. dij 费用流

    #include <bits/stdc++.h> using namespace std; typedef long long lld; const int MAXN = 50010, M ...