ICMPv6与NDP

时间秒杀一切 提交于 2020-10-03 07:39:16

1      ICMPv6

1.1    报文格式

ICMPv6协议号为58,即next header值为58,除了IPv4的作用外,还增加了邻居发现、无状态自动配置、PMTU等功能,报文格式如下:

0          7

15

31

Type

Code

Checksum

Message Body

Type8bit,表明消息类型,0~127代表错误报文(即最高位为0)128~255代表消息报文(即最高位为1)

Code8bit,表明具体的原因;

Checksum16bit,校验和,验证报头完整性

Message Body:可变长,数据部分。

Typer类型表

Type

Code

备注

1(目的不可达)

0

没有去往目的地的路由

1

与目的地的通信被管理员禁止

2

超出源地址范围

3

地址不可达

4

端口不可达

5

源地址在进出策略中拒绝

6

拒绝去目的地的路由

2(数据包过大)

0

此报文必须是路由器发送,用于响应数据包大于出接口MTU情况时不能被转发,此报文会携带本接口MTU发给源端,是PMTU发现的基础

3(超时)

0

超出TTL限制

1

分片重组超时

4(参数错误)

1

基本头或者扩展头有错误的字段

2

有不可识别的next header字段

3

扩展头中有未知的选项

128

0

Echo Request

129

0

Echo Reply

133

0

RS(router solicitation)消息

134

0

RA(router advertisement)消息

135

0

NS(Neighbor Solicitation)消息

136

0

NA(Neighbor Advertisement)

137

0

Redirect消息

 

1.2    RS消息

主机刚接入网络并配置为自动获取地址,主机需要自动获取前缀、前缀长度、默认网关等信息时就会发送RS(router solicitation )消息。

IP为发送接口的Link Local地址或未指定,目的FF02::1(所有节点组播相当于广播)FF02::2(所有路由器),路由器收到RS后立即回复RA

 

Type=133

Code=0

Checksum

Reserved

Option… …

Type8bit值为133

Code8bit,值为0

Checksum:校验和,验证报头完整性

3字段为正常的ICMPv6报头

Reserved32bit,保留为0

Option:选项值,目前只定义了发送者的链路层地址(MAC),如果未指定则不包含该选项

1.3    RA消息

RA(router advertisement)消息由路由器周期性发送或者收到RS后立即发送,为主机提供前缀、前缀长度、默认网关等编址和配置信息,源IP为发出消息接口的Link Local地址,目的为FF02::1(所有节点)

Type=134

Code=0

Checksum

Cur Hop Limit

M

O

Reserved

Router Lifetime

Reachable Time

Retrans Timer

Options… …

Type8bit134

Code8bit,保留全0

Checksum16bit,校验和

3字段为ICMPv6报头

Cur Hop Limit8bit,路由器建议采用无状态自动配置的主机在IP包里的跳数限制为该字段的值,0表示不推荐,由主机自行设置

M1bit,管理地址配置位,0表示使用无状态自动配置,1表示告诉主机使用DHCPv6来获取配置,当M位为1O位无意义,因为所有参数都可以通过DHCPv6获取

O1bit,其他配置标志位,0表示DHCPv6服务器没有其他可用信息,1表示其他参数使用DHCPv6服务器获取,包括路由器生存时间、邻居可达时间、邻居重传时间、链路MTUDNS

如果MO位都不设置(0),表示无法通过DHCPv6获取配置信息

Reserved6bit,保留

Router Lifetime16bit,默认路由器关联生存时间,为单位,最大65535

华为确实1800s,表示主机把该路由器当作默认网关的有效时间,0表示主机不将该路由器作为默认网关,主机每次收到RA将刷新该计时器

Reachable Time32bit毫秒为单位,表示通告邻居可达时间,用作邻居不可达检测,0表示未指定

Retrans Timer32bit,重传计时器,毫秒为单位,表示主机在主机重传邻居请求消息前等待时间,用作地址解释和邻居不可达检测,0表示未指定

RSRA消息可完成无状态自动配置和路由器发现

1.4    NS消息

NSNeighbor Solicitation)邻居请求消息用于完成类似IPv4ARP解析功能,查找目标的链路层地址,源地址接口的Global地址,目标地址是被访问的地址所对应的被请求节点的组播地址,消息中包含源链路层地址(一般指MAC)NS还可以用来检测邻居可达性和地址冲突,在进行地址冲突检测时源地址为未指定地址(0)

Type=135

Code=0

Checksum

Reserved

Target Address

Option… …

Type8bit135

Code8bit,保留全0

Checksum16bit,校验和

3字段为ICMPv6报头

Reserved32bit,保留

Target Address128bit,目的IPv6地址,不能使用组播地址

Option:选项,发送者的链路层地址(一般指MAC),当源IP为未指定地址时不能有该选项,在有IPv6地址的链路层上,必须包含此选项,即发送源IP不是全0(接口上有IP)

1.5    NA消息

NANeighbor Advertisement)邻居通告消息)

1.      收到NS消息后回复NA消息,单播形式,源IPNS的目的IP,目的IPNS的源IP,如果收到的NS源为未指定IP,则目的IPFF02:1(所有节点)。类似ARP响应;

2.      节点需快速传播新的信息(类似免费ARP),目的地址为FF02:1(所有节点)

Type=136

Code=0

Checksum

R

S

O

Reserved

Target Address

Option… …

 

Type8bit136

Code8bit,保留全0

Checksum16bit,校验和

3字段为ICMPv6报头

R路由器(Router)位1bit,路由器标记位,1表示该节点为路由器,在邻居不可达检测中检测路由器是否变为主机

S被请求(Solicited)位1bit,请求标记位,1表示收到NS后回应的NAS位在邻居不可达检测中用作可达性确认,在组播的NADAD)和主动发送的 NA 中,S 比特一定不能置 1

O重载(Override)位1bit,替代标记位,1表示替代当前已缓存的IPv6地址的链路层地址,从而更新邻居缓存表项;0表示不更新,如果没有相应的链路层地址则添加新的表项

Reserved29bit,保留

Target Address128bit,如果是NS回应的NA消息,该字段为收到的NS消息中的Target Address,如果非响应的NA消息,该字段为链路层地址发生变化的IPv6地址

Option:选项,包含此NA消息发送者的链路层地址,回应组播NSNA必须包含此选项,回应单播NSNA可以不包含此选项,因为单播NS请求发送者有证券的链路层地址

1.6    Redirect消息

Redirect重定向消息用于通知主机去往目的有更优的下一跳,只对主机有效,对路由器无效,消息的源地址为发送接口的链路本地地址,目的地址是触发次重定向报文的源地址

Type=137

Code=0

Checksum

Reserved

Target Address

Destination Address

Options..

 

Type8bit137

Code8bit,保留全0

Checksum16bit,校验和

3字段为ICMPv6报头

Reserved32bit,保留

Target Address128bit,通知到主机的最优下一跳路由器,必须是下一跳路由器的link local地址,当目的地市邻居时,Target Address必须是Destination Address,否则重定向后的下一跳路由器地址

Destination Address128bit,需要被重定向的目的地址

Option:重定向后使用的下一跳路由器的链路层地址

2      NDP

NDPNeighbor Discovery Protocol,邻居发现协议

l  对于主机,使用NDP发现相邻的路由器、自动配置地址、地址前缀即路由等。

l  对于路由器,公告路由器的相关参数、路由及链路的地址前缀。

l  对于节点,解析IPv6数据包将被转发到的邻居节点的链路层地址、获取邻接点的可达性、确定邻接点的链路层地址什么时候发生变化。

NDP用到的地址:

Ø  未指定地址(::):表示发送者暂时无地址

Ø  链路本地地址:只在链路范围内的单播地址

Ø  FF02::1(所有节点):到本链路范围的所有节点地址

Ø  FF02::2(所有路由器):到本链路范围的所有路由器地址

Ø  被请求节点组播地址:一个IPv6接口会通过自动映射技术为自己的每个单播地址(包括链路本地地址)创建一个请求节点组播地址,由固定的FF02::1FF00:0/104和单播地址的最后24组成

NDP依靠5ICMPv6报文实现:RSRANSNARedirect

2.1    无状态自动配置

1.        PC接入网络发出RS消息(Type 133ICMPv6),想路由器进行请求,目标地址FF02::2

2.        路由器回应RA,该消息包括PC所需要的前缀、前缀长度等,目的地址FF02::1

3.        PC收到RA后,使用消息中的前缀和前缀长度等完成自动配置,并将RA中宣告的链路本地地址添加到默认路由器列表作为默认网关

4.        使用该地址前会进行DAD(重复地址检测)

 

2.2    路由器发现

局域网中的路由器会定期发送RA报文,目的为所有节点FF02::1,为主机提供网络配置信息,如网中有多台路由器,则会根据优先级(Router Preference)选择默认路由器,优先级使用的是MO位后的保留字段。

另外RA消息中还有两个有效期:优选生存期(Preferred Llifetime)和有效生存期(Valid Lifetime),主机以无状态自动配置拿到的地址进行DAD后并且无冲突视为优选地址

1.        优选生存期就是指优选地址的时间,主机通过优选地址与其他设备通信,优选生存期到期,将不再使用该地址新建链接

2.        有效生存期是指主机收到RA消息前缀可以使用的时间,必须大于优选生存期,优选生存期到期后有效生存期到期前已建立的链接可以用,直到有效生存期到期

 

2.3    地址解析

使用NSNA完成链路层地址解析,类型IPv4ARP

PC1访问PC2PC1不知道PC2的链路层地址,这时候发送NS消息请求PC2的链路层地址。步骤如下:

1.        PC1发送NS消息(Type135IMCPv6)IPv6报文的目标地址PC2的接口IPv6单播地址转换后的被请求节点组播地址ICMPv6Target AddressPC2IP,为什么目的地址是被请求节点组播地址?(RFC 2461RFC4861

2.        PC2收到NS后,识别目标地址是自己接口的请求组播地址,并检查Target Address是自己的IP单播方式回应NA,该消息包含PC2MAC地址同时PC2PC1IPv6MAC添加到邻居缓存表。

3.        PC1收到PC2NAPC1PC2IPv6MAC添加到本地邻居缓存表

2.4    DAD(重复地址检测)

Duplicate Address Detect

一个接口配置IPv6单播地址,无论是链路本地地址或全局单播地址,手动配置或无状态获取或DHCPv6获取,使用前都必须进行DAD。步骤如下:

1.        比如PC1配置了IPv6地址2001::1,进行DAD前该地址称为试验(tentative地址

2.        PC1发出NS确定是否其他设备在使用该IPIPv6报文的目的IP2001::1的请求组播地址FF02::1:FF00:1ICMPv6Target Address2001::1

3.        如果PC2IPv6地址也是2001::1,那么PC2收到NS后会回应NA,告诉PC1该地址正在使用,否则不回应

4.        PC1在发送NS后会设定定时器,如果定时器超时后没有收到NA,说明该地址可以使用,切换到已分配(assigned)状态

2.5    NUD(邻居不可达检测)

Neighbor Unreachability Detection

IPv4ARP缓存表类似,NDP会将已发现的邻居信息存入邻居缓存表,包括IPv6地址和二层地址(一般指MAC)NDP会维护邻居缓存表会通过NS消息定期跟踪邻居状态,RFC4861定义了5种邻居状态,NUD利用这些状态和状态间的切换来检测和解析邻居的可达性

Ø  Incomplete(未完成状态):表示解析还在进行,本机已发出NS,还未收到NA

Ø  Reachable(可达状态):本机已收到对方的NA,获得对端的链路层地址

Ø  Stale(过期状态):邻居可达时间超时,表示未知是否可达。或者收到了邻居的非请求NA,携带的链路层地址和本地表项的地址不一致,该邻居立即变为Stale

Ø  Delay(延迟状态)Delay不是一个稳定的状态,而是一个延时等待状态,当向Stale状态的邻居发送报文时,该邻居变为Delay状态,并发送NS消息

Ø  Probe(探测状态):节点向处于Probe状态的邻居持续发送单播NS报文,如持续收不到NA回应,将删除表项,如收到NA,邻居变为Reachable

Ø  Empty(空闲状态):表示节点上没有相关邻居缓存表项

IPv6NUD状态

邻居状态跟踪与地址解析的区别

地址解析的NS目的是被请求节点组播地址,而邻居状态跟踪的NS目的是单播

邻居状态跟踪的NA消息中S必须置位,表示是可达性确认

2.6    重定向原理

路由器发送重定向消息需要满足一下规则

1.        检查收到的数据包源地址,必须是本设备的邻居表中的邻居;

2.        目的下一跳接口等于收到数据包的接口

3.        数据包的目的不是一个组播地址。

主机接受到的重定向消息必须满足以下条件,否则丢弃:

1.        报文的源地址必须是link local地址,路由器必须使用link local地址作为RA消息已经重定向消息的源地址,以便主机唯一识别路由器

2.        Hop Limit字段必须等于255,报文不可能被路由器转发;

3.        ICMP校验和有效

4.        ICMP Code0

5.        ICMP报文的长度为40Byte或以上

6.        所包含的选项长度必须大于0

3      实验测试

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!