DHCP Option 82详细讲解[通俗易懂]

DHCP Option 82详细讲解[通俗易懂]option82是dhcp报文中的中继代理信息选项(relayagentinformationoption)。当dhcpclient发送请求报文到dhcpserver时,若需要经过dhcp中继,则由dhcp中继将option82添加到请求报文中。option82包含很多sub-option,本文中的option82只支持sub-option1、sub-option2和sub-

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

option 82是dhcp报文中的中继代理信息选项(relay agent information option)。当dhcp client发送请求报文到dhcp server时,若需要经过dhcp中继,则由dhcp中继将option 82添加到请求报文中。option 82包含很多sub-option,本文中的option 82只支持sub-option 1、sub-option 2和sub-option 5。sub-option 1中定义了代理电路id(即circuit id),sub-option 2中定义了代理远程id(即 remote id),sub-option 5为链路选择(link selection)子项,该选项中包含了dhcp中继添加的ip地址。

 

   option 82实现了dhcp客户端和dhcp中继设备的地址信息在dhcp服务器上的记录,与其他软件配合使用可以实现dhcp分配的限制和计费功能。

    1. 概念介绍

    option

    dhcp报文中的一个选项,该选项在dhcp报文中为可变长的字段,option选项中包含了部分租约信息、报文类型等。option选项中最多可以包括255个option,最少为1个option。

    option 82

    option 82又称为中继代理信息选项(relay agent information option),是dhcp报文中option内容的一部分。rfc3046中定义了option 82,其位置在option 255之前而在其他option之后。option 82中可以包含最多255个sub-option,若定义了option 82,至少要定义一个sub-option。目前option 82中常用的sub-option 1、sub-option 2和sub-option 5。

    sub-option 1

    sub-option 1是option 82的一个子选项,为代理电路id(即circuit id)子项。子选项通常在dhcp中继设备上配置,定义了在传输报文的时候要携带dhcp客户端所连接交换机端口的vlan-id及二层端口号。通常sub-option 1与sub-option 2子选项要共同使用来标识dhcp源端的信息。

    sub-option 2

    sub-option 2也是option 82的一个子选项,为代理远程id(即remote id)子项。该子选项也通常在dhcp中继设备上配置,定义了在传输报文的时候要携带中继设备的mac地址信息。通常与sub-option 1子选项要共同使用来标识dhcp源端的信息。

    sub-option 5

    sub-option 5也是option 82的一个子选项。为链路选择(link selection)子项,该选项中包含了dhcp中继添加的ip地址。这样dhcp server在分配ip地址给dhcp客户端的时候就可以分配与该地址同网段的ip地址。

    2. option 82报文组成
    
    在dhcp报文中有一个options字段,该字段可以为空,也可以为某一个特性的option,option 82就是其中的一种option,可以有多个sub-option 组成。

    code:标识了中继代理信息选项的序号。本报文中序号为82,即option 82。option 82 在其他option之后,在option 255 之前。

    len:为代理信息域(agent information field)的长度。

    agent information field:代理信息域。在该字段中指定了使用的sub-option。

    sub-option报文结构

    subopt:子选项序号,本报文中为sub-option 1、sub-option 2和sub-option 5。各子选项含义如下:

    1表示代理电路id(circuit id)子项

    2表示代理远程id(remote id)子项

    5表示链路选择(link selection)子项

    len:标识sub-option value域的长度。

    sub-option value:sub-option的值。例如sub-option 1对应的值为circuit id。

    3. 标准模式与华为固网模式

    dhcp relay支持option 82,在收到从client到server的请求报文中添加option 82,以标识用户的位置信息。现在只添加sub-option 1和sub-option 2,不添加sub-option5。在标准模式,sub-option 1是接收报文的二层端口号和vlan号,sub-option 2是接收报文设备的mac地址。

    为了更加精确地定位用户位置信息,我司针对dslam应用提出ip dslam用户物理位置定位解决方案,定义了dhcp option 82的华为固网模式,其中option 82的sub-option1表示“节点标识+框号/槽号/子槽/端口号+vlan”;sub-option2没有改变,表示的是的relay系统mac地址;sub-option5 relay不添加。

    option 82的sub-option1中的节点标识为字符串,缺省可以采用设备的管理接口mac地址,形如:00-e0-fc-0d-dc-ec。为了提高维护的方便性,也允许网络管理者通过配置修改用户节点标识,可以选择是用relay的桥mac或设备名(通过sysname配置的),也可以由用户自行输入字符串。

    华为固网模式option 82中sub-option 1的标识格式:

    accessnodeidentifier eth frame/slot/subslot/port:vlan

    对各段的解释如下:

    accessnodeidentifier:接入节点标识,长度不超过50个字符的字符串,缺省为桥mac

    frame:框号,不支持的为0

    eth:以太端口类型

    slot:槽号

    subslot:子槽号

    port:端口号

    vlan:vlan标识

    4. 相关规范

    与dhcp中继支持option 82相关的协议规范有:

    rfc2131 dynamic host configuration protocol

    rfc3046 dhcp relay agent information option

    5. dhcp 中继支持option 82工作机制

    dhcp客户端通过dhcp中继从dhcp服务器获取ip地址的过程与同网段的dhcp获取过程完全相同,都要经历发现、提供、选择和确认四个阶段,详细的过程请参考本手册“网络层协议”的dhcp部分。这里将只介绍dhcp中继支持option 82时的工作机制,具体如下:

    dhcp客户端在初始化时以广播的形式发送请求报文;

    若本地网络存在dhcp服务器,则客户端可以直接从该服务器获取ip地址。

    若本地网络没有dhcp服务器,则与本网络相连的dhcp中继设备对该广播报文进行相应的处理。dhcp中继设备将检查报文中是否已有option 82选项,进行相应的处理。

    如果报文中已有option 82,设备按照配置的策略对该报文进行处理(丢弃、用中继设备本身的option 82项替代报文中原有的option 82项或保持报文原有的option 82项),然后将请求报文转发给dhcp服务器。

    若请求报文中没有option 82选项,则dhcp中继设备将option 82选项添加到报文中后转发给dhcp服务器。此时,请求报文中将包含了dhcp客户端所连接的交换机端口的mac地址、所属的vlan以及dhcp中继设备本身的mac地址。

    dhcp服务器收到dhcp中继设备转发的dhcp请求报文后,将记录报文中option选项所携带的信息,然后将带着dhcp配置信息以及option 82信息的报文发给dhcp中继。

    dhcp中继收到dhcp服务器的返回报文后将剥离报文中的option 82信息,然后将带有dhcp配置信息的报文转发给dhcp客户端。

    dhcp客户端发送的请求报文有四种,分别为dhcp_discover报文、dhcp_request报文、dhcp_release报文和dhcp_inform报文,dhcp中继设备将在四种报文中都添加option 82选项,因为不同厂商生产的dhcp服务器设备对请求报文的处理机制不同,有些设备处理dhcp_discover报文中的option 82信息,而有些处理dhcp_request报文中的option 82信息。




DHCP报文

DHCP报文是承载于UDP上的高层协议报文,采用67(DHCP服务器)和68(DHCP客户端)两个端口号。DHCP报文的格式如下图所示。

图1 DHCP报文格式

DHCP Option 82详细讲解[通俗易懂]

< 所有DHCP提供的配置信息都在options字段中,这才是精华部分 >

报文中各字段的描述如下:

  • op,报文类型,1表示请求报文,2表示回应报文。
  • htype,硬件地址类型,1表示10Mb/s的以太网的硬件地址。
  • hlen,硬件地址长度,以太网中该值为6。
  • hops,跳数。客户端设置为0,也能被一个代理服务器设置。
  • xid,事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。
  • secs,由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。
  • flags,标志字段。这个16比特的字段,目前只有最左边的一个比特有用,该位为0,表示单播,为1表示广播。
  • ciaddr,客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。
  • yiaddr,”你自己的”或客户端的IP地址。
  • siaddr,表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
  • giaddr,DHCP中继器的IP地址。//注意:不是地址池中定义的网关
  • chaddr,客户端硬件地址。客户端必须设置它的”chaddr”字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。
  • sname,可选的服务器主机名,该字段是空结尾的字符串,由服务器填写。
  • file,启动文件名,是一个空结尾的字符串。DHCP Discover报文中是”generic”名字或空字符,DHCP Offer报文中提供有效的目录路径全名。
  • options,可选参数域,格式为”代码+长度+数据”。

    DHCP Options

Option id

Length(字节)

描述

1

4

Subnet Mask

3

n*4

Router(网关)

6

n*4

DNS Server

7

n*4

Log Server

26

2

Interface MTU

33

n*8

Static route

35

4

ARP cache timeout

42

n*4

NTP servers

51

4

IP address lease time

53

1

Message type 1-DHCPDISCOVER 2-DHCPOFFER 3-DHCPREQUEST 4-DHCPDECLINE 5-DHCPACK 6-DHCPNAK 7-DHCPRELEASE 8-DHCPINFORM

54

4

DHCP Server Identifier

60

n

华为自定义:可配置该终端设备在发起DHCP请求时,通过Option 60携带域信息。ME60收到DHCP报文时,可根据Option 60中携带的域信息来分配IP地址。

82

n

华为自定义:ME60作为DHCP Relay,在中继用户DHCP报文时,可在Option 82中填写用户的物理位置信息,通知DHCP服务器按物理位置信息对为用户分配IP地址

DHCP报文类型

DHCP共有八种报文,分别为DHCP Discover、DHCP Offer、DHCP Request、DHCP ACK、DHCP NAK、DHCP Release、DHCP Decline、DHCP Inform。各报文类型功能如表1所述。

DHCP报文类型

描述

DHCP Discover

DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送请求报文,这个报文成为Discover报文,目的是发现网络中的DHCP服务器,所有收到Discover报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。

DHCP Offer

DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给用户,告知用户本服务器可以为其提供IP地址。< 只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复>

DHCP Request

DHCP客户端可能会收到很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器。DHCP客户端成功获取IP地址后,在地址使用租期过去1/2时,会向DHCP服务器发送单播Request报文续延租期,如果没有收到DHCP ACK报文,在租期过去3/4时,发送广播Request报文续延租期。

DHCP ACK

DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址。

DHCP NAK

如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。

DHCP Release

当用户不再需要使用分配IP地址时,就会主动向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约。

DHCP Decline

DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用。

DHCP Inform

DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端。< 极少用到>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181448.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 如何查看CUDA版本和CUDNN版本

    如何查看CUDA版本和CUDNN版本cuda一般安装在/usr/local/cuda/路径下,该路径下有一个version.txt文档,里面记录了cuda的版本信息cat/usr/local/cuda/version.txt即可查询同理,cudnn的信息在其头文件里cat/usr/local/cuda/include/cudnn.h|grepCUDNN_MAJOR-A2即可查询另附我…

  • JS和H5做一个音乐播放器,附带源码

    JS和H5做一个音乐播放器,附带源码

    2021年10月10日
  • c语言实现二叉树层序遍历

    c语言实现二叉树层序遍历 按层序遍历原则,应打印ABCDEFG,如何实现?1.使用队列,队列是先进先出,首先把A放进去,然后如果队列有元素,就出队A,然后把出队元素A的左右BC节点入队,然后B出队,把B的左右节点放进去(没有就继续出队C),C出队,把DE放进去,D出队,E出队,把FG放进去,然后出FG(因为FG左右节点没有数据,不用入队),循环条件是队列不能为空(才能实现出队操作)核心源码:voidLev…

  • volatile关键字在Android中到底有什么用?

    volatile关键字在Android中到底有什么用?当一个程序运行的时候,数据是保存在内存当中的,但是执行程序这个工作却是由CPU完成的。那么当CPU正在执行着任务呢,突然需要用到某个数据,它就会从内存中去读取这个数据,得到了数据之后再继续向下执行任务。这是理论上理想的工作方式,但是却存在着一个问题。我们知道,CPU的发展是遵循摩尔定律的,每18个月左右集成电路上晶体管的数量就可以翻一倍,因此CPU的速度只会变得越来越快。但是光CPU快没有用呀,因为CPU再快还是要从内存去读取数据,而这个过程是非常缓慢的,所以就大大限制了CPU的发展

  • HTML—标签总结

    HTML—标签总结

  • linux 安装 redis服务

    linux 安装 redis服务redis官网地址:http://www.redis.io/最新版本:2.8.3在Linux下安装Redis非常简单,具体步骤如下(官网有说明):1、下载源码,解压缩后编译源码。$wgethttp://download.redis.io/releases/redis-2.8.3.tar.gz$tarxzfredis-2.8.3.tar.g

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号