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(空闲状态):表示节点上没有相关邻居缓存表项
邻居状态跟踪与地址解析的区别
地址解析的NS目的是被请求节点组播地址,而邻居状态跟踪的NS目的是单播
邻居状态跟踪的NA消息中S位必须置位,表示是可达性确认
2.6 重定向原理
路由器发送重定向消息需要满足一下规则
1. 检查收到的数据包源地址,必须是本设备的邻居表中的邻居;
2. 目的下一跳接口等于收到数据包的接口;
3. 数据包的目的不是一个组播地址。
主机接受到的重定向消息必须满足以下条件,否则丢弃:
1. 报文的源地址必须是link local地址,路由器必须使用link local地址作为RA消息已经重定向消息的源地址,以便主机唯一识别路由器
2. Hop Limit字段必须等于255,报文不可能被路由器转发;
3. ICMP校验和有效
4. ICMP Code为0
5. ICMP报文的长度为40Byte或以上
6. 所包含的选项长度必须大于0
3 实验测试https://blog.51cto.com/xxy12345/2510376