IP节点需要一个非凡的协议来交换报文以了解与IP相关的情况。ICMP正好适用于这种需求。在IPv4升级到IPv6的过程中,ICMP也经历了一定的修改。ICMPv6在RFC1885中定义。ICMP报文可以用来报告错误和信息状态,以及类似于包的Internet探询(Ping)和跟踪路由的功能。
IGMP一开始就包含在ICMPv6规范中,并且在1997年11月发表的RFC2236中得到更新,1998年初秋,IGMP第3版也开始了讨论。IGMP可以用来支持组播传输,它为主机提供了向本地路由器报告其属于某个组播组的方法。
ICMPv6报文
ICMP报文的产生来源于一些错误情况。例如,假如一个路由器由于某些原因不能处理一个IP包,它就可能会产生某种类型的ICMP报文,并直接回送到包的源节点,然后源节点将采取一些办法来纠正所报告的错误状态。例如,假如路由器无法处理一个IP包的原因是由于包太长而无法将其发送到网络链路上,则路由器将产生一个ICMP错误报文来指出包太长,源节点在收到该报文后可以用它来确定一个更加合适的包长度,并通过一系列新的IP包来重新发送该数据。
RFC1885中定义了以下报文类型(没有包括该文档中定义的有关组的报文):
•目的地不可达。
•包太长。
•超时。
•参数问题。
•回声请求。
•回声应答。下面将具体介绍这些报文。
1.目的地不可达
这个报文由路由器或源主机在由于除业务流拥塞之外的原因而无法转发一个包的时候产生。这种错误报文有五个代码,包括:
•0:没有到达目的地的路由。这个报文在路由器没有定义IP包的目的地路由时产生,路由器将采用默认路由来发送无法利用路由器的路由表进行转发的包。
•1:与目的地的通信被治理员禁止。当被禁止的某类业务流欲到达防火墙内部的一个主机时,包过滤防火墙将产生该报文。
•2:不是邻居。当使用IPv6选路扩展头并严格限定路由时,将使用这个代码。当列表中的下一个目的地与当前正执行转发的节点不能共享一个网络链路时,将会产生该报文。
•3:地址不可达。这个代码指出在把高层地址解析到链路层(网络)地址时碰到了一些问题,或者在目的地网络的链路层上去往其目的地时碰到了问题。
•4:端口不可达。这种情况发生在高层协议(如DP)没有侦听包目的端口的业务量,且传输层协议又没有其他办法把这个问题通知源节点时。
2.包太长
当接收某包的路由器由于包长度大于将要转发到的链路的MTU,而无法对其进行转发时,将会产生包太长报文。该ICMPv6错误报文中有一个字段指出导致该问题的链路的MTU值。在路径MTU发现过程中这是一个有用的错误报文。
3.超时
当路由器收到一个跳极限为1的包时,它必须在转发该包之前减小这个数值。假如在路由器减小该数值后,跳极限字段的值变为0(或者是路由器收到一个跳限制字段为0的包),那么路由器必须丢弃该包,并向源节点发送ICMPv6超时报文。源节点在收到该报文后,可以认为最初的跳限制设置得太小(包的真实路由比源节点想象的要长),也可以认为有一个选路循环导致包无法交付。
在“跟踪路由”功能中这个报文非常有用。这个功能使得一个节点可以标识一个包在从源节点到目的节点的路径上的所有路由器。它的工作方式如下:首先,一个去往目的地的包的跳极限被设置为1。它所到达的第一个路由器将跳减少极限,并回送一个超时报文,这样一来源节点就标识了路径上的第一个路由器。然后假如该包必须经过第二个路由器的话,源节点会再发送一个跳极限为2的包,该路由器将把跳极限减小到0,并产生另一个超时报文。这将持续到包最终到达其目的地为止。同时源节点也获得了从每个中间路由器发来的超时报文。
4.参数问题
当IPv6头或扩展头中的某些部分有问题时,路由器由于无法处理该包而会将其丢弃。路由器的实现中应该可以产生一个ICMP参数错误报文来指出问题的类型(如错误的头字段、无法识别的下一个头类型或无法识别的IPv6选项),并通过一个指针值指出在第几个字节碰到这种错误情况。
5.ICMPv6回声功能
ICMPv6中包含了一个与错误情况无关的功能。所有IPv6节点都需要支持两种报文:回声请求和回声应答。回声请求报文可以向任何一个正确的IPv6地址发送,并在其中包含一个回声请求标识符、一个顺序号和一些数据。尽管二者都是可选项,但回声请求标识符和顺序号可以用来区分对应不同请求的响应。回声请求的数据也是一个选项,并可用于诊断。
当一个IPv6节点收到一个回声请求报文后,它必须回送一个回声应答报文。在应答中包含相同的请求标识符、顺序号和在最初的请求报文中携带的数据。ICMP回声请求/应答报文对是ping功能的基础。ping是一个重要的诊断功能,因为它提供了一种方法来决定一个特定的主机是否与其他一些主机连接在相同的网络上。