深度分析DHCPV6协议,比较与DHCP的区别

一、DHCPV6产生的背景
随着全球IPV4地址逐渐枯竭,IPV6应运而生,IPV6是将来地址的趋势。地址转变了,当然相应在IPV4上运用的协议也要转变到IPV6中来,所以DHCPV4也要转到DHCPV6中来。所以本文就引出了DHCP V6协议。IETF在2003年重新制定了针对IPV6的DHCP协议,即DHCPV6,对比V4,它增加了一些特有的功能,如支持有状态和无状态地址分配服务,支持临时地址,非临时地址以及前缀地址的分配等,后面将会更加具体比较二者在选项、客户端与服务器行为、消息类型的差异。

二、DHCP6交互报文详细解析并分析与DHCPV4的区别
下面详细解析DHCP6中各种消息报的属性、行为内容以及需要填充的字段与选项。

Typeregistry code From To How and when to use Client behavior Server behavior
Solicit (1) 客户机 服务器/中继代理 客户机给服务器发送solicit消息,以便得到Ipv6地址,以及选项中所附带的配置参数 创建solicit消息报并将其发送给服务器 1. 首先验证solicit消息的有效性,若消息报中没有包含`client identifier`或者包含有`server identifier`选项,则该报无效并舍弃;2. 根据管理策略来验证服务器是否允许接收该报;3.若服务器拥有可以分配的地址,则回发Advertise消息报(状态码为成功),否则回发状态码为` NoAddrsAvail `的Advertise消息报。4. 若socilit消息报中包含有`rapid commit`选项,则返回一个Reply消息报.
Advertise (2) 服务器/中继代理 客户机 回应客户机发送的solicit消息报 1. 验证Advertise消息报的有效性: 若出现消息报中不含有`server identifier`字段和`client identifier`字段, `client identifier`字段中的DUID不匹配或者` transaction-id ``字段不匹配等情形,则该报无效并舍弃; 若包含状态码选项值为` NoAddrsAvail `,同样丢弃该报;2. 基于某种策略(后面将有详细介绍)选取Advertise消息报; 给客户机发送advertise消息报,报中包含一些设置的字段与选项
Request (3) 客户机 服务器/中继代理 客户机请求更多的配置参数 创建并发送request消息报给服务器 1. 首先验证request消息的有效性:若消息中不包含`client identifier`选项`和server identifier`选项,,或者选项中的DUID内容与服务器不匹配,则该报无效并舍弃;2.若无可用的地址分配,则返回一个状态码为` NoAddrsAvail `的Reply消息;3.  若服务器发现在IA选项中的地址前缀与自身不匹配,则返回一个状态码为`NotOnLink`的Reply消息报;4.创建一个Reply消息报,其中包括客户机所需要的地址以及其他参数配置信息。
Confirm (4) 客户机 服务器/中继代理 由于客户机的状态发生变化,发送confirm消息报去确认是否之前的配置是否还适合 当客户机出现以下情形时:重启,客户机改为有线连接,客户机改变了无线接入点。此时客户机需要发送confirm消息进行确认 1. 舍弃掉任何没有包含`server identifier`和`client identifier`选项的消息报;2. 判断消息报中的IA选项中的地址是否与自己同属一个链路,若是,返回一个状态码表示为为成功的Reply消息报; 否则返回一个状态码为NotOnLink的消息报;
Renew (5) 客户机 服务器/中继代理 要求服务器延长之前分配的租约以及升级其它的参数 创建并发送Renew消息报 1.  舍弃掉任何没有包含`server identifier`和`client identifier`选项,或者`server identifier`选项中的DUID与服务器不匹配的消息报;2.  验证消息保证中`IA`选项中地址是否与服务器中的存储信息吻合,若没找到对应信息,则返回状态码为`NoBinding`的Reply消息报;3. 返回包含新的lifetime, T1/T2值的Reply消息报给客户机
Rebind (6) 客户机 服务器/中继代理 要求服务器延长之前分配的租约以及升级其它的参数,注意这个消息报只有在之前客户机发送的Renew消息报没得到服务器响应后才产生 创建并发送Rebind消息报 1.舍弃掉任何没有包括`server identifier`和`client identifier`选项的Rebind消息报;2.若在服务器中没有找到与Rebind消息报中的IA选项中吻合的地址,或者发现地址但不再适合本链路,则服务器发回一个ilifetime置为0的Reply消息;3. 若找到吻合的地址信息,服务器发回一个包含新的lifetime以及T1/T2值的Reply消息报。
Reply (7) 服务器/中继代理 客户机 当服务器收到客户机发送的Solicit(含rapid commit选项),Request, Renew以及Rebind消息时,产生Reply消息报回应
Release (8) 客户机 服务器/中继代理 客户机发送Release消息报告知服务器自己所分配的一个或者多个地址不再使用时产生Release消息报 创建并发送Release消息报,值得注意的是,释放掉的地址不能再使用,若没有收到Reply反馈消息报,则实现重传。 1. 舍弃掉任何没有包含`server identifier`和`client identifier`选项,或者`server identifier`选项中的DUID与服务器不匹配的消息报;2. 服务器从Release消息报IA选项中的地址列表中找出有效的地址(即是由本服务器之前分配的),并将这些地址标记为available;3. 返回一个Reply反馈消息报;4.  服务器保留分配信息,以备下次直接将配置信息赋给这台客户机.
Decline (9) 客户机 服务器/中继代理 客户机发送Decline消息告知服务器自己所分配的地址已经被本链路的其它主机占用 创建并发送Decline消息报,注意Decline消息报的`IA`选项中一定含有被占用的地址信息 1. 舍弃掉任何没有包含`server identifier`和`client identifier`选项,或者`server identifier`选项中的DUID与服务器不匹配的消息报;2. 服务器检测Decline消息报中IA选项报告的地址,并将其删除,然后在本地做标记,下次将不再分配给其它客户机3. 处理完地址后,返回带有状态码的Reply消息
Reconfigure (10) 服务器/中继代理 客户机 服务器通过发送Reconfigure消息去告知客户机,服务器端出现新的配置参数或者某些参数已经更新,并触发客户机同服务器共同去完成Renew/Reply和Information-request/Reply 1. 首先验证消息报的有效性:若消息报不是单播传给客户机;没有包含`server identifier`和`client identifier`,消息中没有包含`Reconfigure message`选项,消息中包含`IA`选项并且`Reconfigure meaasge`选项的消息类型是` INFORMATION-REQUEST `,则将该消息报舍弃;2.客户机返回一个Renew或者Information-request消息报 创建并发送Reconfigure消息报,若在某个时间范围内,没有收到来自于客户机的Renew或者Information-request消息,则服务器重传该消息报
Information-request (11) 客户机 服务器/中继代理 客户机发送该消息报给服务器,仅仅为了得到配置参数,而不需要分配地址 创建并发送Information-request消息报,若没收到Reply反馈消息,则重传消息报 1. 验证消息报的有效性,若消息报中包含`server identifier`并且选项中的DUID与本地服务器不匹配,或者包含IA选项,则将该报舍弃;2.构造一个包含配置信息的Reply消息报并发送给客户机
Relay-forward (12)
Relay-reply (13)

上表详细列出了DHCP6消息报的属性以及行为内容,有几个特别需要说明的地方是:
◆     对比,DHCP消息报,DHCP6在中继代理方面增加了消息报,以及其它一些机制,这方面的知识将在后面还会比较到。
◆     在`IA_NA`选项中,定义了多种状态码,分别为:

Name Code description
Success 0 表示成功
UnspecFail 1 表示出现不知原因的失败
NoAddrsAvail 2 表示服务器没有可用的地址去分配客户机
NoBinding 3 表示服务器没有绑定客户机信息
NotOnLink 4 表示服务器与客户机的地址前缀不匹配,即二者不在同一链路上
UseMulticast 5 表示服务器强制客户机使用 All_DHCP_Relay_Agents_and_Servers多播地址去发送消息

◆     在DHCP6中,客户机去选取连接DHCP6服务器是基于某种策略的,具体跟服务器所返回消息报中的`prefere option`有关,在这个选项中定义了服务器参考值(server prefere value),它的最大值为255, 客户机正是根据服务器中的参考值不同选取目标服务器的,具体策略如下:
●     若某个服务器中的参考值为255,则它拥有最高优先级;
●     若服务器中的参考值正好相等,则根据对服务器返回的配置参数的兴趣而定;
●     客户机甚至会选取某些尽管参考值较低但返回更匹配的配置参数的服务器。 值得注意的是,在DHCP中,一般会选取最先返回配置参数的服务器!
下表列出了DHCP6消息报的填充字段以及选项。

Type Client Server
Solicit (1) 填充`msg-type`, ` transaction-id `字段,必须包含的选项有:` Client Identifier`,`IA-NA/TA`,可选的有:` Option Request`,` Reconfigure Accept ``rapid commit`.另外还有注意,客户机发送solicit消息时采用的是本地链路地址,而目的地址是” All_DHCP_Relay_Agents_and_Servers address”多播地址,即ff02::1:2 N/A
Advertise (2) N/A 填充`msg-type`字段,` transaction-id `字段来自于客户机发送的solicit消息报中的相应字段值。必须包含的选项有:`server identifier`, `client identifier`, `IA`选项(注意IA选项的数量由silicit消息报中的`IA`选项而定)以及客户机中的`optional request`选项中含有的一些选项。可选的有:` Preference `, ` Reconfigure Accept `, ``
Request (3) 填充`msg-type`, ` transaction-id `字段,必须包含的选项有:`server identifier`, `client identifier`, ` Option Request `,`IA-NA/TA`,可选的有:`Reconfigure Accept `以及其它选项,注意请求时的目的地址以及多播地址同solicit消息报。 N/A
Confirm (4) 填充`msg-type`字段,并产生` transaction-id `字段内容,必须包含的选项有:`client identifier`, `IA`(对于IA_NA选项,应该设置T1,T2域,以及preferred-lifetime and valid-lifetime域) N/A
Renew (5) 填充`msg-type`字段,并产生` transaction-id `字段内容,必须包含的选项有:`client identifier`, `server identifier`, `IA`, ` Option Request `以及其他可选项 N/A
Rebind (6) 填充`msg-type`字段,并产生` transaction-id `字段内容,必须包含的选项内容有:`client identifier`, `IA`, `option request` N/A
N/A 1.   若是对solicit消息报(包含`rapid commit`选项)的回复:必须填充字段`msg-type`和` transaction-id `字段(来自于solicit消息报),必须包含的选项有:server identifier`, `client identifier`, `IA`以及request消息报中所请求的参数选项, `rapid commit`。2.   若是对Request消息报的回复:必须填充字段`msg-type`和` transaction-id `字段(来自于request消息报),必须包含的选项有:`server identifier`, `client identifier`, `IA`以及request消息报中所请求的参数选项;3.   若是对Confirm消息的回复:填充`msg-type`字段,` transaction-id`字段来自于客户机发送的solicit消息报中的相应字段值。必须包含的选项有:`server identifier`, `client identifier`, `status code`4.   若是对Renew消息的回复:填充`msg-type`字段,` transaction-id `字段来自于客户机发送的solicit消息报中的相应字段值。必须填充的选项有:`server identifier`, `client identifier`,,`IA`
5.   若是对Rebind消息的回复:填充`msg-type`字段,` transaction-id `字段来自于客户机发送的solicit消息报中的相应字段值。必须填充的选项有:`server identifier`, `client identifier`,,`IA`
6.   若是对Release消息的回复:填充`msg-type`字段,` transaction-id`字段来自于客户机发送的solicit消息报中的相应字段值。必须填充的选项有:`server identifier`, `client identifier`, `IA`(包含状态码选项)
7.   若是对Decline消息的回复:填充`msg-type`字段,` transaction-id `字段来自于客户机发送的solicit消息报中的相应字段值。必须填充的选项是:`server identifier`, `client identifier`, `IA`(包含状态码选项)
Release (8) 填充`msg-type`字段,并产生` transaction-id `字段内容,必须包含的选项有:`client identifier`, `server identifier`, `IA` N/A
Decline (9) 填充`msg-type`字段,并产生` transaction-id `字段内容,,必须包含的选项有: `client identifier`, `server identifier`, `IA` N/A
Reconfigure (10) N/A 填充`msg-type`字段,并将` transaction-id `设置成0;必须包含的选项有:`server identifier`, `Reconfigure message`, `IA`, `Option request`则是可选的,其他的选项则都不能使用
Information-request (11) 填充`msg-type`字段,并产生` transaction-id `字段内容,必须包含的选项有:`option request`, `client identifier` N/A
Relay-forward (12)
Relay-reply (13)


从实际报文进行比较DHCPV4和DHCPV6的区别,下面两张图第一张对应的是正常情况下获取IPv4地址的过程示意图,从图可以看出,客户端首先利用0.0.0.0地址发送一个一个广播discover消息,接着多个服务器响应并发回了可供客户机使用的地址(参照offer消息),然后客户机从中选择某台服务器并向其发送request消息,最后被选中的服务器返回ACK确认消息,这样就完成了对客户机的地址分配。具体DHCPV4工作分析请见:《深度分析DHCP工作原理》一文。第二张,客户机利用本地链路地址发送一个solicit广播消息(广播地址是ff02::1:2), 之后一台服务器提供了advertise消息,并将IP地址以及客户机所需要的配置参数信息返回,然后客户机发送一个request消息,主要从服务器端索取自己所需要的请求参数信息,最后服务器响应请求。
从上面的DHCPV4和DHCP6两个报文交互过程,可以清楚的看出两者的差异。
当然今天在这里分析的只是DHCP6协议的冰山一角,在后面的文章中还会陆续给出DHCPV6协议的更深的内容,希望继续关注。
本文由数据中心农场原创,转载请说明出处。

weinxin
DC Farm小程序二维码
扫一扫添加博客小程序
Jim

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:14   其中:访客  9   博主  5

    • avatar 狂奔的蜗牛 2

      哈哈 蜗牛前来支持啦~~~~~~

      • avatar laoxie 1

        看不懂,太专业了

        • avatar laoxie 1

          不过挺喜欢你设计的这个主题的,感觉很清爽,赞。

          • avatar 疯爱表 0

            我也看不懂,技术盲啊。

            • avatar 红豆社区 0

              IPV6也喊了很多年了 何时真正使用上呢

                • 激劉勇靖 激劉勇靖 Admin

                  @红豆社区 IPV6 真正跑起来估计还需要一些年头,不过IPV4向IPV6过渡是迟早的事情。

                • avatar ipv6 1

                  我的win7 dhcpv6获取地址只发了一个Information-request (11) ,然后server回了一个Reply(7)就完了呢?

                    • 激劉勇靖 激劉勇靖 Admin

                      @ipv6 报文都有完整捕获吗???

                        • avatar ipv6 1

                          @激劉勇靖 有,我从拔了网线开始抓包,直到获取到地址所有的过程。

                            • 激劉勇靖 激劉勇靖 Admin

                              @ipv6 报文发一个到我的邮箱吧 我分析一下 邮箱地址:liujing3320254@163.com

                                • avatar ipv6 1

                                  @激劉勇靖 Thanks!

                                • 激劉勇靖 激劉勇靖 Admin

                                  @ipv6 看了一下你的报文,还有你描述的情况,dchpv6 租约期大概10分钟,所以你拔线马上就插上的话,它就直接用原来的地址去请求,不会重新申请,所以你看到的只有两个报文。你可以在cmd 下用ipconfig /release6 命令去释放掉,重新申请,这样就可以看到完整的四个报文了。

                                    • avatar ipv6 1

                                      @激劉勇靖 谢谢版主分析。
                                      环境是这样,我的pc接在一台设备A上。此设备A分别通过2种方式获取ip。
                                      1. 设备A通过dhcpv6方式获取ip地址,设备A上也开启dhcpv6 server,A下的pc将通过dhcpv6 client获取ipv6。在第一次插上网线后,可以正确的看到4个报文。
                                      2. 当设备A通过pppoe方式获取ip地址,设备A上也开启dhcpv6 server,A下的pc将通过dhcpv6 client获取ipv6。pc刚开机插上后,抓包发现只有2个报文。如我邮件给你发的那样。关键我是重启pc插上去的,dhcpv6的缓存应该都不存在了吧,但是我抓包看到只有2个dhcpv6报文。
                                      Thanks

                                      • 激劉勇靖 激劉勇靖 Admin

                                        @ipv6 请你试一下下面两种情况:
                                        1. 当你用pppoe方式获取ip后,发现只有两个报文。 能不能再试一下换回第一种情况,看看是否还能抓到4 个报文。
                                        2. 用ipconfig /release6 命令释放一下,看看重新获取地址,是否有4个报文。