DHCP (Dynamic Host Configuration Protocol )协议的探讨与分析

问题背景

最近在工作中遇到了连接外网的交换机在IPv6地址条件下从运营商自动获取的DNS地址与本机手动输入配置的IPv4地址下的DNS发生冲突的问题,这个问题在实际的生产网上会带来业务的中断和不稳定,在进入到生产环境中的本地终端发送给数据中心的网络流量会因为IPv4IPv6 下的DNS冲突而导致无法正确的发送流量。

在终端中,默认的IPv6 的优先级会大于IPv4的优先级,这样就会带来冲突问题,解决的问题就是将连接外网的网络线从与连接内网的交换机中断开即可以解决。下边的图片说明了该问题的发生的场景:

从上边的图看出,业务终端连接着“本地业务网核心交换机”来获取和转发网络流量到数据中心生产网络中的服务器,在正常的条件下,“本地业务网核心交换机”和“本地运营商交换机”是不能通过网络跳线连接在一起并配置到同一个Vlan中的。在本次问题中,因为“本地运营商交换机”和“本地业务网核心交换机”连接在了同一个Vlan,导致了业务终端的业务流量从数据中心生产网络来源的不稳定,而造成了业务不稳定。

在这个解决问题的过程中,有DHCPARP在实际网络环境下的运用场景和背景模糊不清的问题,故而撰写这篇博客来复习和巩固DHCP协议。

DHCP 概念

1. 什么是 DHCP 网络协议

网络是非常复杂且抽象的,网络中的硬件设备比如 路由器、交换机、集线器、网线、网卡、网桥共同组成了核心网络,在硬件设备上流通的网络流量,做到怎么去引导网络流量正确得流向到正确的网络设备上,需要TCP/IP 协议作为网络流量的核心协议。

但是如果一个网络管理员想要正确地让TCP/IP协议正确运行,需要给网络中的主机和路由器配置一些关键信息,比如说接口的IP地址。我们可以轻易地在电脑上输入 ipconfig 命令去显示当前网络设备的网络地址信息,那么这个地址到底是怎么被分配到当前的设备上的?

对于一个网络设备(终端)的核心IP信息主要有: IP地址子网掩码DNS服务器地址

而获取网络设备的 TCP/IP信息主要有这几个方面:

  • 手动配置 - 通过终端上的配置界面根据业务的要求进行手动配置。
  • 动态获取 - 例如 windows 上的手动配置选项上的动态获取选项。
  • 特定的算法进行计算。

一般来说,对于服务器端的采用手动配置方式来适应业务的核心需求,对于客户端比如连接网络拓扑上的个人终端那么采用动态获取方式来获取相关信息。

原因有以下几个方面:

  • 客户端与服务器端的交互会更加频繁,并且客户端可能会在网络中发生迁移。
  • 服务器端的配置服务要求客户端的网络一定必须是固定的。

在这个场景下,客户端需要从服务器端动态地获取服务器端的信息并配置到本地中,这个时候 DHCP就派上了用场。在本文中,主机 == 客户端,即任何需要从网络中获取地址的设备( 不包括 网络中的路由器),请区别开这个方面的概念。服务器 = 服务端,有时候并不一定是一个独立的设备,而是一个应用程序(在大多数条件下),希望能将这些方面的概念区别出来。

DHCP,从英文的含义来说,Dynamic Host Configuration Protocol,是用来动态地配置主机的相关状态,从DHCP的发展来说,DHCP是继承于BOOTP 协议 ( Bootstrap Protocol ),后者在设计协议的过程中仅仅提供了有限的主机信息配置,并且主机的信息一旦从远程服务器端分配之后,就很难再被修改;DHCP的出现改变了这种局面,DHCP几乎提供了所有的主机配追信息,并且引入了租约的概念,使得主机信息能够动态地产生变化和进行更改。此外,作为可以动态地更改主机的配置的协议,

DHCP 是一个基于 Client/Server 模式的网络协议。

DHCP 是基于UDP/IP协议进行传输,服务器端使用端口 67, DHCP客户端使用端口号 68

2. DHCP 协议内容

DHCP主要分为两个部分: 网络IP地址的管理配置信息的传递

  • 网络IP地址的管理: 地址管理处理 IP 地址的动态分配, 并且为每一个主机 (Host) 提供地址的租约
  • 配置信息传递: 从服务器端向主机端传递报文 和 状态机的配置。

3.DHCP 地址管理

地址池地址租约

如果用户在客户端中申请配置一个 动态网络地址配置,那么 DHCP客户端(Host) 会向 DHCP服务器 发送一个 IP地址请求。 这个时候在远程的 DHCP服务器 就会维护一个 IP地址池,并且从这个地址池来取出一个IP回应给 DHCP客户端。 在地址分配的过程中,DHCP服务器也会指定回应给 DHCP客户端的IP地址的租约期,在租约期中,这个地址可以被客户端使用,租约期到之后这个IP地址被 DHCP服务器自动收回。客户端可以在租约期内请求延长租约。

DHCP 报文内容

DHCP的组成从网上有很多解释,下图来自网络:

  • Op: 报文类型,分为 两大类: Request(1)Reply(2)
  • HW Type: 硬件类型,一般是以太网:1
  • HW Len: 硬件地址长度,单位字节。对应以太网:6(mac地址长度为6字节48bit)
  • Transaction ID:事务ID,随机数,有客户端生成,服务器Reply时,会把Request中的Transaction拷贝到Reply报文中。
  • Secs: 距离第一次发射IP请求或Renew请求过去的秒数
  • Flags:标志位,目前仅第一个bit有使用,置1 标明广播
  • Client IP Address:当前客户端的IP地址,如果当前客户端没有IP地址,则置0
  • Your IP Address: 服务器想客户端提供IP地址时,会把IP地址填入本字段
  • (Next)Server IP Address:客户端引导时需要的另一个服务器的IP地址
  • Gateway (Relay) IP Address: 网关(中继)IP地址,有DHCP 中继器在转发DHCP报文的时候填入
  • Server Name: Server名字,有64bytes,一般不使用,填充为0
  • Boot File name: boot file的路径,128bytes, 一般不使用,填充为0
  • Option: 选项,不定长度。 DHCP报文中比较重要的字段

DHCP Option 内容

之前介绍过,因为DHCP是从Bootp 协议继承和拓展过来的,因此很多不能在Bootp实现的内容都放到了Option 来实现。通俗来说,DHCP协议其实就是携带许多OptionBootp

报文中的Option遵循以下的形式:

  • 如果Option没有值,则只有标志位之类的内容,则以一个字节表示
  • 如果Opiton有值,即Opiton是以下name-value对,则Opiton需要多个字节表示,其中第一个字节表示 option的名字,第二字节表示value的长度,第三个字节开始表示value。

常见的Option类型情参照下图:

4.DHCP 工作原理

主机加入到一个新的网络中

DHCP 将一台从未分配过的主机加入到网络需要经历四个阶段: 1. 发现阶段,2.提供阶段,3.请求阶段,4.确认阶段。

发现阶段

新的Client加入网络时,会使用0.0.0.0作为源地址,发送discover广播报文,查询网络上有哪些DHCP Server,以及这些DHCP ServerOffer哪些IP地址。这个广播帧的MAC地址为新的ClientMAC地址,类型字段为 0x0800,载荷数据为一个广播 IP 报文,该报文的目的IP地址 为有限的广播地址: 255.255.255.255, 协议字段值为 0x11, 载荷数据是一个 UDP报文,消息为 DHCPDISCOVER

在该阶段中,与客户端所在二层网络中的所有设备都会接收到这个广播帧,并将这个广播帧洪泛出去,在其他设备接收到这个数据帧的时候会将相关的载荷按照网络分层逐层上传。在设备的传输层UDP模块在接收网络层上传的数据包之后会解析数据包的端口号。 对于一个DHCP服务器来说,67 作为独特的端口号,会被打开,而对于其他的设备来说这个端口不被打开,那么这个数据包就被丢弃。

在华为的数通教材中,给出的例子是路由器上运行了 DHCP服务器 , 但是链路中可能有多个设备也运行了DHCP服务器,这个时候所有收到该请求包的服务器都会给请求客户端回复一个数据包来证明自己已经接收到了请求信息。

对于DHCP的传输模式 - UDP协议,是一种面向无连接的、不需要可靠传输的通信方式,因此 DHCP 需要依赖自己的一种可靠的传输传输方式,其中包括:什么情况下需要重复发送已经发送过的请求,重复请求的间隔时间是多少,最大重复次数是多少等等...

提供阶段

DHCP Server接收到DHCP Discover报文后,回应Offer报文,提供IP地址(可能包含DNS等其他信息)给Client。这个阶段中,不涉及客户端是否接受服务端给出的 IP 地址,只是服务器端给客户端的一个响应。 每个接收到 DHCPDISCOVER 消息的服务器,都从自己维护的 IP 地址池分配出一个有效的且未被使用的 IP地址,并通过 DHCPOFFER 消息将这个IP地址分配发送给客户端。

对于一个 DHCPOFFER 消息来讲,消息被封装在客户端预留端口号为68,源端口号67的一个UDP报文中,该UDP报文又是被上层封装到一个被广播的IP报文中。 这个IP报文的目的地址是一个有限广播地址:255.255.255.255,源地址为DHCP服务器端所对应的单播地址,其中协议字段为0x11,该IP报文又被上层封装到了一个广播帧中,这个广播帧的源MAC地址为 DHCP Server 所对应的单播MAC地址,类型字段的值为 0x0800

在传输的过程中,与请求客户端所在同一个二层网络中的所有设备都会接收到这个请求数据包,只有开启了 DHCP Client 服务的客户端才会接收到这个数据包的载荷数据(DHCPOFFER),并上传至应用层上的 DHCP Client 中。

但是在同一个二层网络中可能存在着其他同样打开 DHCP Client 服务的客户端,终端如何区分是不是自己发出的DHCPDISCOVER请求呢?其实可会断在发送 DHCPDISCOVER 请求的时候就已经创建了一个用于区别请求且独一无二的交易号(Transaction ID) ,这个交易号会在服务端向客户端发送DHCPOFFER回执的时候

3.Client 根据收到的Offer报文,选择一个DHCP Server,并选择它提供的IP地址。然后广播Request报文,向DHCP Server请求该IP地址,同时向本地网络(尤其是其他DHCP Server)公告自己已经选择了某个DHCP Server的某个IP地址。

4.DHCP Server 回应ACK报文,将IP地址分配给client端 (特殊情况:DHCP Server在发送Offer报文和接收到Request的短暂时间内把IP分配给了其他主机)。

5.DHCP Client 收到ACK报文后,会针对获得的IP地址发送ARP Request,进行IP地址冲突检测

6.如果IP地址已经被其他主机使用,则Client放弃该IP地址,向Server发送DHCP DECLINE报文告诉Server该地址不能使用。然后一段时间后(一般10s)再此尝试获取该IP地址

7.如果Client仍然无法使用该IP地址,则发送DHCP RELEASE报文,放弃该地址。

主机已经有IP地址,只想更新租约

1.此时可以跳过DHCP Discover报文DHCP Offer报文

2.Client发送携带当前IP地址Request报文

3.如果Server同意Client续约,则发送DHCP ACK报文。如果拒绝续约,则发送DHCPNAK报文

下边有一个图来具体的说明 DHCP 的工作原理以及建立相关网络联系的流程和原理:

【未完待续.... 下一部分将加上华为模拟设备上的】

DHCP (Dynamic Host Configuration Protocol )协议的探讨与分析的更多相关文章

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

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

  2. DHCP完整过程详解及Wireshark抓包分析

    DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,简单来说就是主机获取IP地址的过程,属于应用层协议. DHCP采用UDP的68(客户端)和67(服务 ...

  3. SIP (Session Initiation Protocol) 协议

    Session Initiation Protocol 介绍 SIP是VoIP技术最常使用的协议,它是一种应用程序层协议,可与其他应用程序层协议配合使用,以控制Internet上的多媒体通信会话. V ...

  4. Objective-C( protocol协议)

    protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> ...

  5. ISO 基础之 (十三) protocol 协议

    一 简绍 protocol,简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现.这种模式一般称为代理(delegation)模式.通过Protocol定义各种行为,在不同的场景采 ...

  6. 【转】iOS开发-Protocol协议及委托代理(Delegate)传值

    原文网址:http://www.cnblogs.com/GarveyCalvin/p/4210828.html 前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来 ...

  7. No redirect found in host configuration file (C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet.config).

    Configuration Error Description: An error occurred during the processing of a configuration file req ...

  8. protocol(协议)

      可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了   //定义一个名叫MyProtocol的 ...

  9. OC语法10——@protocol协议,

    参考资料:博客 @protocol,协议: OC中protocol的含义和Java中接口的含义是一样的,它们的作用都是为了定义一组方法规范. 实现此协议的类里的方法,必须按照此协议里定义的方法规范来. ...

随机推荐

  1. 解决 ThinkPHP5 RCE 在PHP7下,不能使用包含的问题

    今天朋友遇到一个ThinkPHP5 _method 的RCE漏洞,环境是:tp5014开启debug,linux,PHP7,日志,Session都写不进去,没办法包含的情况. 思路就是使用反序列化,回 ...

  2. react报错 TypeError: Cannot read property 'setState' of undefined

    代码如下: class test extends Component { constructor(props) { super(props); this.state = { liked: false ...

  3. js打开新窗口并且居中显示

    function openwindow(url,name,iWidth,iHeight) { var url; //转向网页的地址; var name; //网页名称,可为空; var iWidth; ...

  4. Python3列表、元组及之间的区别和转换

    文章目录 1. 列表(list) 1.1 列表创建.切片.删除.检索 1.2 列表常用函数 2. 元组(tuple) 3. 列表与元组区别及转换 1. 列表(list) 1.1 列表创建.切片.删除. ...

  5. SQL(replace)替换字段中指定的字符

    语法:update 表名 set 字段名=REPLACE(字段名,'修改前的字符','修改后的字符') 例 Product商品表中Name 名字字段中描述中将'AAA' 修改成 'BBB' SQL语句 ...

  6. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) E. Let Them Slide(数据结构+差分)

     题意:问你有n个长度总和为n的数组 你可以移动数组 但不能移出长度为w的矩形框 问你每一列的最大值是多少? 思路:只有一次询问 我们可以考虑差分来解决 然后对于每一行数组 我们可以用数据结构维护一下 ...

  7. [AHOI2009] [BZOJ1799] 月之迷 (数位DP)

    给出两个数a,ba,b,求出\([a,b]\)中各位数字之和能整除原数的数的个数. 我们按照模板的做法来想,枚举到第pos位时,要确定这一位的数字,可以更新现在所填数字的和,但对于最终的和无从得知,是 ...

  8. 2020Nowcode多校 Round9 B.Groundhog and Apple Tree

    题意 给一棵树 初始\(hp=0\) 经过一条边会掉血\(w_{i}\) 第一次到达一个点可以回血\(a_{i}\) 在一个点休息\(1s\)可以回复\(1hp\) 血不能小于\(0\) 每条边最多经 ...

  9. 2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage(11/12)

    2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage A. Coffee Break 排序之后优先队 ...

  10. zoj2112 Dynamic Rankings (主席树 || 树套树)

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...