1      ICMPv6

1.1    报文格式

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

0          7

15

31

Type

Code

Checksum

Message Body

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

Code:8bit,表明具体的原因;

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

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… …


Type:8bit,值为133

Code:8bit,值为0

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

前3字段为正常的ICMPv6报头

Reserved:32bit,保留为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… …



Type:8bit,134

Code:8bit,保留全0

Checksum:16bit,校验和

前3字段为ICMPv6报头

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

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

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

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

Reserved:6bit,保留

Router Lifetime:16bit,默认路由器关联生存时间,为单位,最大65535

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

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

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

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

1.4    NS消息

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

Type=135

Code=0

Checksum


Reserved


Target Address





Option… …



Type:8bit,135

Code:8bit,保留全0

Checksum:16bit,校验和

前3字段为ICMPv6报头

Reserved:32bit,保留

Target Address:128bit,目的IPv6地址,不能使用组播地址

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

1.5    NA消息

NA(Neighbor Advertisement)邻居通告消息)

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

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

Type=136

Code=0

Checksum


R

S

O

Reserved


Target Address





Option… …









 

Type:8bit,136

Code:8bit,保留全0

Checksum:16bit,校验和

前3字段为ICMPv6报头

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

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

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

Reserved:29bit,保留

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

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

1.6    Redirect消息

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

Type=137

Code=0

Checksum


Reserved


Target Address





Destination Address





Options..








 

Type:8bit,137

Code:8bit,保留全0

Checksum:16bit,校验和

前3字段为ICMPv6报头

Reserved:32bit,保留

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

Destination Address:128bit,需要被重定向的目的地址

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

2      NDP

NDP,Neighbor Discovery Protocol,邻居发现协议

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

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

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

NDP用到的地址:

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

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

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

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

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

NDP依靠5种ICMPv6报文实现:RS、RA、NS、NA、Redirect

2.1    无状态自动配置

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

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

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

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

 

2.2    路由器发现

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

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

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

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

 

2.3    地址解析

使用NS和NA完成链路层地址解析,类型IPv4的ARP。

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

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

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

3.        PC1收到PC2的NA后PC1将PC2的IPv6和MAC添加到本地邻居缓存表

2.4    DAD(重复地址检测)

Duplicate Address Detect

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

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

2.        PC1发出NS确定是否其他设备在使用该IP,IPv6报文的目的IP是2001::1的请求组播地址FF02::1:FF00:1,ICMPv6的Target Address是2001::1

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

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

2.5    NUD(邻居不可达检测)

Neighbor Unreachability Detection

与IPv4的ARP缓存表类似,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(空闲状态):表示节点上没有相关邻居缓存表项

ICMPv6与NDP_第1张图片


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

地址解析的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      实验测试https://blog.51cto.com/xxy12345/2510376