Technorati 标签: IPv6,ICMPv6,CCIE,路由,ICMP差错

概要

--ICMPv6 (Internet Control Message protocol for the IPv6)是IPv6的基础协议之一.定义在RFC2463中.

--用于传递报文转发中产生的信息或者错误.

--ICMPv6定义的报文被广泛的应用在其他协议中.包括:NDP(neighbor discovery protocol, PathMTU路径发现机制,MLD协议[替代IPv4中组播的IGMP协议]等等)

ICMPv6包头是属于上层协议的报头.他一定会处于所有的扩展报头后面.

在指明ICMPv6的报头的时候,基本包头或者是扩展报头中的"Next header=58"[Next-header=0x3a],这样IPv6的基本包头或者扩展报头才能和ICMPv6报头进行关联.

2016-4-18 ICMPv6协议[RFC2463]--报文详解_第1张图片

下面的报文,就是一个ICMPv6的报文.

这里面,有一个IPv6的基本包头,在Next-header里面指定的是0x3a.指定的就是ICMPv6的协议报头.

附件是相关的抓包.

2016-4-18 ICMPv6协议[RFC2463]--报文详解_第2张图片

ICMPv6type类:

2016-4-18 ICMPv6协议[RFC2463]--报文详解_第3张图片

1, 错误类消息(error message),也称为差错报文,最高bit0,也就是ICMPv6 type=[0-127].

2016-4-18 ICMPv6协议[RFC2463]--报文详解_第4张图片

NOTES:如果是错误消息的话,那么ICMPv6报头中的type会是在0-127之间.

差错报文:

---1,差错报文(RFC2463)

~~~~目的不可达Destination unreachable (type=1)

Code=0: 没有达到目标的路由

如果在网络中,R1--R2--R3.

R1 ping "R5"的环回口,保证这个"R5"在所有网络中都没有路由存在.

那么R1会把ICMP送向R2这个默认网关,但是R2会给R1回应一个差错报文,code=0.标示没有达到目标的路由.

R1--R2--R3

在R1上面ping 2055::1,这个环回口没有任何路由有这个路由.

 clip_p_w_picpath010

通过抓包来看,R1 ping 2055:1,把ICMPv6报文甩给R2的e0/0 input,结果因为R2收到了以后没有路由信息,就直接R2给R1回应ICMPv6的差错报文.Type=1, code=0,没有路由.

2016-4-18 ICMPv6协议[RFC2463]--报文详解_第5张图片

Code=1: 与目标的通信被管理策略禁止

这种情况,一般是在中途链路做了ACL等策略禁止ICMP报文通行.

下面就是一个做了ACL的策略ping包的抓包.

R1---[e0/0]R2---R3

在R2上面的e0/0的input方向应用了一个ACL.禁止R1发送的所有ICMP报文.

下面红色框中就是R2回应R1的一个ICMP差错报文,code=1.与目标的通信被管理策略禁止.  
2016-4-18 ICMPv6协议[RFC2463]--报文详解_第6张图片

●Code=2: 未指定

Code=3: 地址不可达

这里先还是要说一下,地址不可达,和code=0,路由不可达..有什么区别.code=3,是说我有Destination的路由,但是地址通不了.Code=0是说完全没有路由.

模拟过程:这里是说,R1--R2---2023::x/64---R3

这里R2和R3相互连接的接口地址分别是:2023::2/64和2023::3/64

但是,在R1上面去ping 2023::10/64这个完全不存在的地址.数据从R1甩到R2以后,R2有路由,但是这个"2023::10/64"是完全不可达的.

模拟拓扑图为:R1---2012::x/64---R2(2023::2/64)-----(2023::3/64)R3

在R1上面ping 2023::10这个不存在的地址.

在R1上面debug的信息如下:

*Apr 18 16:31:24.045: ICMPv6: Sent echo request, Src=2012::1, Dst=2023::10.

*Apr 18 16:31:27.265: ICMPv6: Received Unreachable code 3, Src=2012::2, Dst=2012::1

PS.R2在返回ICMP报文code=3的时候,会有一定的时延,因为R2收到报文以后,因为有路由,所以R2还要花时间进行地址查找,发送NS出去,等待NA回来.如果NA连续不会超时,这个时候R2才会反馈ICMPv6的差错报文.

2016-4-18 ICMPv6协议[RFC2463]--报文详解_第7张图片

Code=4: 端口不可达

关于这点,用traceroute 工具即可.

R1---R2---R3

登陆到R1上面traceroute R3的环回口.这个时候会相应端口不可达.

R1: traceroute 2033::1

这个时候在R1上面收到ICMP差错报文,code=4的报文.

*Apr 18 17:32:23.110: ICMPv6: Received Time Exceeded, Src=2012::2, Dst=2012::1

*Apr 18 17:32:23.116: ICMPv6: Received Time Exceeded, Src=2012::2, Dst=2012::1

*Apr 18 17:32:23.121: ICMPv6: Received Time Exceeded, Src=2012::2, Dst=2012::1

*Apr 18 17:32:23.127: ICMPv6: Received Unreachable code 4, Src=2023::3, Dst=2012::1

*Apr 18 17:32:23.132: ICMPv6: Received Unreachable code 4, Src=2023::3, Dst=2012::1

*Apr 18 17:32:23.137: ICMPv6: Received Unreachable code 4, Src=2023::3, Dst=2012::1

2016-4-18 ICMPv6协议[RFC2463]--报文详解_第8张图片

~~~~数据包超长Packet Too Big (Type=2)

●Code=0

~~~~超时Time Exceeded (Type=3)

●Code=0: 在传输中超越了跳数限制(hot-limit超时,IPv4的TTL超时)

●Code=1: 分片重组时超时

~~~~参数问题Parameter Problem (Type=4)

●Code=0: 遇到错误的报头字段

●Code=1: 遇到无法识别的Next-header

●Code=2: 遇到无法识别的IPv6选项




---2,信息类消息(information message),也称为信息报文,最高bit1,也就是ICMPv6 Type=[128-255].

NOTES:如果是信息类的消息,那么type的值会在128-255之间.

信息类报文(RFC2463),我们用得最多的就是type=128 Echo request和129, echo reply.

~~~~回送请求报文(Echo Request)

●Type=128, Code=0.

 2016-4-18 ICMPv6协议[RFC2463]--报文详解_第9张图片

~~~~回送应答报文(Echo Reply)

●Type=129, Code=0.

2016-4-18 ICMPv6协议[RFC2463]--报文详解_第10张图片

附件有我做实验的相关ICMP6的抓包,有需要的朋友可以下载对比进行梳理概念.