本文翻译者:weicq2000RFC4443(中文)IPv6标准的ICMPv6(2006年3月)本文件废止了RFC-2463和其升级版本RFC-2780。本文件描述了一组在ICMPv6(InternetControlMessageProtocol)中使用的控制消息格式。ICMPv6是互联网控制消息协议(InternetControlMessageProtocol)的IPv6版本。目录第1章序言第2章ICMPv62-1消息通用格式2-2消息源地址确定2-3消息校验和计算2-4消息处理规则第3章ICMPv6出错消息3-1目的地不可达消息3-2分组太大消息3-3超时消息3-4参数问题消息第4章ICMPv6指示消息4-1回显请求消息4-2回显响应消息第5章安全考虑5-1ICMPv6消息的认证和加密5-2ICMP攻击第6章IANA考虑IANA6-1新ICMPv6类型值和代码值分配程序6-2本文件的分配第7章参考文献7-1标准性参考文献7-2信息性参考文献第8章致谢附录ARFC2463颁布以来的变化撰写者通讯录第1章序言ICMP(InternetControlMessageProtocol)是为IPv4定义的[RFC-792],IPv6使用时做了不少改动。最终称为ICMPv6,有IPv6下一个首部(NextHeader)值58。本文件描述一组在ICMPv6中使用的控制消息格式。本文件没有描述使用这些消息实现诸如PathMTU发现功能的过程;这些过程在其他文件(例如[PMTU])中描述。其他文件也有可能引入附加ICMPv6消息类型,诸如NeighborDiscovery消息[IPv6-DISC],但要遵从本文件第2章给出的ICMPv6消息一般规则。在IPv6标准[IPv6]中定义的术语和IPv6路由和寻址标准[IPv6-ADDR]也适用于本文件。本文件废止了RFC-2463[RFC-2463]和其升级版本RFC-2780[RFC-2780]。本文件中,关键词“MUST”、“MUSTNOT”、“REQUIRED”、“SHALL”、“SHALLNOT”、“SHOULD”、“SHOULDNOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”的含义遵从[RFC-2119]规定。第2章ICMPv6ICMPv6由IPv6节点使用,用于报告在分组处理过程中出现的错误,以及执行其他网络互连层功能,诸如诊断(ICMPv6“ping”)。ICMPv6是IPv6的整体部分,是基础协议,本标准规定的所有消息和行为每个IPv6节点必须无条件执行。2-1消息通用格式IPv6首部和零个或多个IPv6扩展首部位于每个ICMPv6消息之前。ICMPv6首部由其值为58的NextHeader值标识,NextHeader位于紧靠ICMPv6首部的前一个首部中。(这与用于标识ICMPv4的值不同)ICMPv6消息有图1所示通用格式:0012345678901234567890123456789011类型代码23消息体校验和图1ICMPv6消息通用格式类型字段指出消息类型。它的值决定其余数据格式。代码字段依赖于消息类型。它用于生成消息粒度的附加层。校验和字段用于检测ICMPv6消息和IPv6首部部分中的数据错误。ICMPv6消息分为两类:出错消息和指示消息。出错消息由在它们的消息Type字段的二进制值的高阶位取0标识。于是,出错消息的消息类型值从0到127;指示消息的消息类型值从128到255。本文件为下述ICMPv6消息定义了消息格式:ICMPv6出错消息(及消息类型值):1目的地不可达(参阅第3-1节)2分组太大(参阅第3-2节)3超时(参阅第3-3节)4参数问题(参阅第3-4节)100私有试验101私有试验127保留用于ICMPv6出错消息扩展ICMPv6指示消息(及消息类型值):128回显请求(参阅第4-1节)129回显响应(参阅第4-2节)200私有试验201私有试验255保留用于ICMPv6指示消息扩展消息类型值100、101、200和201保留用于私有试验,不作为一般应用。当采用同一类型值,多个试验同时进行时可用到此类类型值。任何大规模和/或非受控应用应当得到实际分配,参阅第6章定义。消息类型值127和255保留用于将来扩展类型值范围,着眼于将来类型值出现短缺情况。这方面的详细操作留待将来解决。扩展类型值而又不对现在的实现造成任何影响的方法是:如果类型值等于127或255,代码字段应当用于新分配的类型值。目前的实现忽略新分配的类型值,参阅第2-4节(b)规定。使用这些扩展类型值的新消息,能够在消息体中为它的代码值分配字段。第3章和第4章描述ICMPv6出错消息类型1到4,指示消息类型128和129的消息格式。至少,包括调用分组的启动是打算让导致ICMPv6出错消息的分组的发起者,标识发送该分组的上层协议和进程。2-2消息源地址确定发起ICMPv6消息的节点,在计算校验和前必须确定IPv6首部中SourceIPv6Address和DestinationIPv6Addresses。如果节点有不止一个单播地址,它必须按如下要求选择消息的SourceAddress:(a)如果消息用于响应发送给节点的单播地址之一的消息,响应的SourceAddress必须是那个相同的地址。(b)如果消息是对发送给任何其他地址的某个消息的响应,诸如多播组地址,由该节点实现的任播地址,或不属于该节点的单播地址ICMPv6分组的SourceAddress必须是属于该节点的单播地址。应当按照规则选择地址,规则用于为任何其他源于该节点的分组选择源地址,以及给定分组的目的地地址。然而,可以用替代方法选择地址,如果这样做有助于根据ICMPv6分组目的地选择可达地址。2-3消息校验和计算校验和是整个ICMPv6消息的1的补码取和的16位1的补码,以ICMPv6消息类型字段开始,并用IPv6首部字段的“伪-首部”预先设置,如[IPv6,第8-1节]所述。在伪-首部中NextHeader值是58。(在ICMPv6校验和中包括伪-首部,这相对IPv4是个变化;作此改动的考虑参阅[IPv6])。为了计算校验和,校验和字段首先被设置为0。2-4消息处理规则当处理ICMPv6消息(根据[RFC-1122])时,实现中必须遵守下述规则:(a)如果在消息的目的地收到类型未知的ICMPv6出错消息,该消息必须传递给发起那个引起出错的分组的上层进程,在那里出错能够被识别(参阅第2-4节(d))。(b)如果收到类型未知的ICMPv6指示消息,必须静默抛弃该消息。(c)每个ICMPv6出错消息(类型值128)必须包括尽可能多的IPv6违规(调用)分组(该分组引起出错),同时不能使出错消息分组超过最小IPv6MTU[IPv6]。(d)在要求网络互连层协议传递ICMPv6出错消息给上层进程情况,上层协议类型从起源分组(包含在ICMPv6出错消息体中)中抽取,用于选择处理该出错的适当上层进程。在不可能根据ICMPv6消息恢复上层协议类型情况,经完成任何IPv6层处理后,静默抛弃ICMPv6消息。此情况的一个例外是,具有非常多扩展首部的ICMPv6消息,它由于为了满足最小IPv6MTU[IPv6]限制,裁短了起源分组,没有携带上层协议类型信息。另一个例子是带有ESP扩展首部的ICMPv6消息,对于这样的消息,由于裁短,或由于不能得到解码分组必须的状态,不可能解码起源分组。(e)ICMPv6出错消息必须不因收到下述内容而发起:(e-1)ICMPv6出错信息。(e-2)ICMPv6重定向消息[IPv6-DISC]。(e-3)目标为IPv6多播地址的分组。(此规则有两个例外:(1)PacketTooBig消息(参阅第3-2节)使PathMTU发现为IPv6多播工作;(2)代码为2的ParameterProblemMessage(参阅第3-4节)报告不能识别的IPv6选项(参阅[IPv6]第4-2节),该选项有OptionType最高阶两位设置为10)。(e-4)作为链路层多播发送的分组(e-3的例外也适用此)。(e-5)作为链路层广播发送的分组(e-3的例外也适用此)。(e-6)一个分组,它的源地址不是唯一标识单一节点,例如,IPv6UnspecifiedAddress,IPv6多播地址,或ICMP消息发起者知道的、是IPv6任播地址的地址。(f)最后,为了限制由起源ICMPv6出错消息引起的带宽成本和转发成本,IPv6节点必须限制由它发起的ICMPv6出错消息发送速率。当发送出错分组流的源疏于提防产生的ICMPv6出错消息时,这种情况可能发生。转发ICMP消息的速率限制超出本标准范围。推荐采用的实现速率限制功能的方法是令牌桶,该方法限制对于N的平均传送速率,N可以是分组/秒,或是占用链路带宽的函数,但是允许一个突发中最多传送B个出错消息,只要长期平均值不超过即可。不推荐不能抗衡突发流量(例如,跟踪路由)的速率限制机制;例如,基于计时器的简单实现,允许每T毫秒发送一个出错消息(甚至取较低T值),是不合理的。速率限制参数应当是可配置的。在采用令牌桶的实现中,最优默认值取决于希望实现在哪里部署(例如,高端路由器还是嵌入式主机)。例如,在小型/中型设备中,可能的默认值是B=10,N=10/秒。注意:上述(e)和(f)项下的限制,优先于本文件中其他地方对于起源ICMP出错消息的任何要求。下面各章描述上述ICMPv6消息格式。第3章ICMPv6出错消息3-1目的地不可达消息目的地不可达(DestinationUnreachable)消息格式如图2所示。0012345678901234567890123456789011类型代码23尽可能多的调用分组,同时ICMPv6分组不超过最小IPv6MTU[IPv6]校验和未使用图2目的地不可达消息格式IPv6字段:目的地地址复制自调用分组的SourceAddress字段。ICMPv6字段:类型(Type)1代码(Code)0没有去目的地的路由1管理上禁止与目的地通信2超出源地址范围3地址不可达4端口不可达5源地址与入境/出境策略抵触6去目的地的拒绝路由未使用(Unused)此字段未用于所有代码值。它必须被发起者初始化为0,被接收者忽略。描述DestinationUnreachable消息应当由路由器生成,或者由起源节点内IPv6层生成,用于响应除拥塞原因以外的、不能被交付到其目的地地址的分组。(如果分组因拥塞被抛弃,必须不生成ICMPv6消息。)如果不能交付的原因是转发节点的路由表中缺少匹配条目,Code字段设置为0。(此出错仅在这样的节点中发生,节点没有在它们的路由表中保存“默认路由”。)如果不能交付的原因是管理上禁止(例如,“防火墙过滤”),Code字段设置为1。如果不能交付的原因是目的地超出源地址范围,Code字段设置为2。仅当源地址范围小于目的地地址范围(例如,分组有链路本地源地址和全球范围目的地地址时)时,以及当没有脱离源地址范围而分组不能交付到目的地时,这个条件满足。如果不能交付的原因是不能映射到任何其他代码,Code字段设置为3。例如不能将IPv6目的地地址解析为相应的链路地址,或某种链路特定问题。有一种特殊情况,在那里DestinationUnreachable消息采用代码3发送,用于响应路由器从点对点链路收到的分组,该分组预定地址为分配给那个相同链路子网内的地址(不是接收路由器自己的地址之一)。在此情况,分组必须不被转发回该分组的到达链路。如果传输协议没有通知发送者的替代方法,目的地节点应当发起具有代码4的DestinationUnreachable消息,以响应传输协议(例如,UDP)没有听众的分组。如果不能交付的原因是入境或出境过滤策略使得采用这个源地址的分组不被允许,Code字段设置为5。如果不能交付的原因是去目的地的路由是拒绝路由,Code字段设置为6。如果路由器被配置拒绝所有特定前缀的流量,会发生此情况。Code5和Code6是Code1的提供更详细