ICMPv6 协议详解
在 IPv4 中,路由器使用 ICMP 向源节点报告向目的地传输 IP 报文过程中的错误和信息。它为诊断、信息通知和管理目的定义了一些消息,如目的不可达、报文超长、超时、回显请求和回显应答等。在 IPv6 中,ICMPv6 除了提供 ICMPv4 常用的功能之外,还作为其他一些功能的基础,如邻居发现、无状态地址配置(包括重复地址检测)、PMTU 发现等。
ICMPv6 的协议类型号(即 IPv6 报文中的 Next Header 字段的值)为 58。ICMPv6 报文的格式:
报文中部分各字段的含义如下:
Type:表明消息的类型,0~127 表示错误报文类型,128~255 表示消息报文类型。
Code:表示此消息类型细分的类型。
Checksum:表示 ICMPv6 报文的校验和。
ICMPv6 错误报文用于报告在转发 IPv6 报文过程中出现的错误。ICMPv6 目的不可达错误报文可以分为以下 5 种:
0:没有能到达目标的路由(路由表中,没有与目标相匹配的路由)
1:与目标的通信被管理策略禁止(与目标的通信被管理策略禁止,通常是被防火墙丢弃)
2:超出源站的地址范围(目标节点地址不在源站点地址的范围内。当数据包被一个不在源地址范围内的网络接口转发时,由路由器发送该类型报文)
3:地址不可到达(目的地址不可到达。在无法解析目标的链路层地址时,发送该类型报文)
4:端口不可到达(通常是由于包含 UDP 报文的 IPV6 数据包到达了目标,但是在目标中却没有应用程序侦听 UDP 端口)
ICMPv6 信息报文提供诊断功能和附加的主机功能,比如组播侦听发现和邻居发现。常见的 ICMPv6 信息报文主要包括 Echo Request(回显请求)报文和 Echo Reply(回显应答)报文,这两种报文也就是通常使用的 Ping 报文。
回显请求报文:将回显请求报文发送到目标节点,以使目标节点立即发回一个回显应答报文。回显请求报文的 Type 字段值为 128,Code 字段的值为 0。
回显应答报文:当收到一个回显请求报文时,ICMPv6 会用回显应答报文响应。回显应答报文的 Type 字段的值为 129,Code 字段的值为 0。
在 IPv4 中,报文如果过大,必须要分片进行发送,所以在每个节点发送报文之前,设备都会根据发送接口的 MTU 来对报文进行分片。但是在 IPv6 中,为了减少中间转发设备的处理压力,中间转发设备不对 IPv6 报文进行分片,报文将由发送者进行分片。当中间转发设备的接口收到一个报文后,如果发现报文长度比转发接口的 MTU 值大,则会将其丢弃;同时将转发接口的 MTU 值通过 ICMPv6 的报文过大错误报文发给源端主机,源端主机以该值重新发送 IPv6 报文,这样带来了额外流量开销。PMTU 发现协议可以动态地收集整条传输路径上各链路的 MTU 值,减少由重传带来的额外流量开销。
PMTU 协议是通过 ICMPv6 的报文过大错误报文来完成的。首先源节点假设 PMTU 就是其出接口的 MTU,发出一个试探性的报文,当转发路径上存在一个小于当前假设的 PMTU 时,转发设备就会向源节点发送报文过大错误报文,并且携带自己的 MTU 值,此后源节点将 PMTU 的假设值更改为新收到的 MTU 值,然后继续发送报文。如此反复,直到报文到达目的地之后,源节点就能获得到达目的地的 PMTU 了。
PMTU 的工作过程如图下图所示:
该示例中,整条传输路径包含了 4 条链路,每条链路的 MTU 分别是 1500 Byte、1400 Byte 和 1300 Byte,当源节点发送一个分片报文的时候,首先按照 PMTU 为 1500 Byte 进行分片并发送分片报文,当到达 MTU 为 1400 Byte 的出接口时,设备返回报文过大错误报文,同时携带 MTU 值为 1400 Byte 的信息。源节点接收到之后会将报文重新按照 PMTU 为 1400 Byte 进行分片,并再次发送一个分片报文,当分片报文到达 MTU 值为 1300 Byte 的出接口时,同样返回报文过大错误报文,携带 MTU 值为 1300 Byte 的信息。之后源节点重新按照 PMTU 为 1300 Byte 进行分片并发送分片报文,最终到达目的地,这样就找到了该路径的 PMTU。
由于 IPv6 要求链路层所支持的最小 MTU 为 1280 Byte,所以 PMTU 的值必须大于等于 1280 Byte。建议将 1500 Byte 作为链路的 PMTU 值。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/2c98df897bf63c000fd9584f4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论