IPv6网络协议技术
目 录
第1章.简介 ........................................................................................................... 1 第2章.IPV6报文格式 .......................................................................................... 2 第3章.ICMPV6协议 ........................................................................................... 3 第4章.IPV6地址发现协议 .................................................................................. 6
4.1
邻居发现协议的功能 ................................................................................................................ 9
第5章.IPV6地址 ............................................................................................... 12 第6章.IPV6寻址模型 ........................................................................................ 14 第7章.IPV6地址类型 ........................................................................................ 15
7.1 7.2
单播........................................................................................................................................15 组播........................................................................................................................................19
第8章.IPV6扩展头 ............................................................................................ 22
8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8
扩展头 ....................................................................................................................................22 扩展头的用法..........................................................................................................................22 扩展头的标识..........................................................................................................................23 扩展头的顺序..........................................................................................................................23 选项........................................................................................................................................25 逐跳扩展头 .............................................................................................................................25 选路扩展头 .............................................................................................................................26 分段扩展头 .............................................................................................................................27
8.9 目的地扩展头..........................................................................................................................28
第1章. 简介
随着IP网络规模和业务的迅速发展,IP网络的用户数急剧增加,正因为如此,IP网络也暴露出越来越多的问题,如地址空间不足、QoS、安全问题等。为了解决Internet的这些问题,尤其是解决地址空间不足的问题,IETF于1992年在IPv4的基础上定义了下一代的Internet协议,被称之为“Ipng”或“IPv6”。
IPv6解决的最大问题是扩大了地址空间,另外,它与IPv4相比在其它许多方面都具有优势,例如安全性、服务质量、移动性等。IPv6的一个显著特点就是它具有“即插即用”功能。即插即用使节点直接连接到网络后,不需要经过任何人工配置就能够使用,即插即用使网络的管理和控制变得更加简单;其次,节点只需要知道自己的链路层地址及本地网络的子网前缀,就能够通过IPv6的无状态或者全状态自动配置得到惟一的IPv6地址,从而成为网络的一部分;另外,IPv6还实现了更好的对节点移动性的支持。这些功能都是通过邻居发现协议来实现的,同一个子网内的所有主机和路由器之间的交互也都是通过邻居发现协议来实现的。
本章主要是介绍IPv6协议的基本原理。 本章主要内容:
IPv6报文格式 ICMPv6协议 IPv6地址发现协议 IPv6地址 IPv6 寻址模型 IPv6 扩展头
第2章. IPv6报文格式
在IPv6中,包头以64位为单位,且包头的总长度是40字节。IPv6协议为对其包头定义了以下字段:
版本。长度为4位,对于IPv6,该字段必须为6。
类别。长度为8位,指明为该包提供了某种“区分服务”。RFC 1883中最初定义该字段只有4位,并命名为“优先级字段”,后来该字段的名字改为“类别”,在最新的IPv6Internet草案中,称之为“业务流类别”。该字段的定义独立于IPv6,目前尚未在任何RFC中定义。该字段的默认值是全0。
流标签。长度为20位,用于标识属于同一业务流的包。一个节点可以同时作为多个业务流的发送源。流标签和源节点地址唯一标识了一个业务流。在RFC 1883中这个字段最初被设计为2 4位,但当类别字段的长度增加到8位后,流标签字段被迫减小长度来作补偿。
净荷长度。长度为16位,其中包括包净荷的字节长度,即IPv6头后的包中包含的字节数。这意味着在计算净荷长度时包含了IPv6扩展头的长度。
下一个头。这个字段指出了IPv6头后所跟的头字段中的协议类型。与IPv4协议字段类似,下一个头字段可以用来指出高层是TCP还是UDP,但它也可以用来指明IPv6扩展头的存在。
跳极限。长度为8位。每当一个节点对包进行一次转发之后,这个字段就会被减1。如果该字段达到0,这个包就将被丢弃。IPv4中有一个具有类似功能的生存期字段,但与IPv4不同,人们不愿意在IPv6中由协议定义一个关于包生存时间的上限。这意味着对过期包进行超时判断的功能可以由高层协议完成。
源地址。长度为128位,指出了IPv6包的发送方地址。
目的地址。长度为128位,指出了IPv6包的接收方地址。这个地址可以是一个单播、组播或任意点播地址。如果使用了选路扩展头(其中定义了一个包必须经过的特殊路由),其目的地址可以是其中某一个中间节点的地址而不必是最终地址。
第3章. ICMPv6协议
IP节点需要一个特殊的协议来交换报文以了解与IP相关的情况。ICMP正好适用于这种需求。在IPv4升级到IPv6的过程中,ICMP也经历了一定的修改。ICMPv6最新的定义在RFC 2463中定义。ICMP报文可以用来报告错误和信息状态,以及类似于包的Internet探测(Ping)和跟踪路由的功能。
ICMP报文的产生来源于一些错误情况。例如,如果一个路由器由于某些原因不能处理一个IP包,它就可能会产生某种类型的ICMP报文,并直接回送到包的源节点,然后源节点将采取一些办法来纠正所报告的错误状态。例如,如果路由器无法处理一个IP包的原因是由于包太长而无法将其发送到网络链路上,则路由器将产生一个ICMP错误报文来指出包太长,源节点在收到该报文后可以用它来确定一个更加合适的包长度,并通过一系列新的IP包来重新发送该数据。
RFC 2463中定义了以下报文类型(没有包括该文档中定义的有关组的报文): 目的地不可达。 包太长。 超时。 参数问题。 回声请求。 回声应答。
下面将详细介绍这些报文。 目的地不可达
这个报文由路由器或源主机在由于除业务流拥塞之外的原因而无法转发一个包的时候产生。这种错误报文有五个代码,包括:
0:没有到达目的地的路由。这个报文在路由器没有定义IPv6包的目的地路由时产生,通常在路由器没有设置默认路由时会产生这种错误。
1:与目的地的通信被管理员禁止。当被禁止的某类业务流欲到达防火墙内部的一个主机时,包过滤防火墙将产生该报文。
2:地址不可达。这个代码指出在把IPv6目的地址解析到链路层地址时遇到了一些问题,或者在目的地网络的链路层上去往其目的地时遇到了问题。
3:端口不可达。这种情况发生在高层协议(如UDP)没有侦听包目的端口,且传输层协议又没有其他办法把这个问题通知源节点时。
包太长
当接收某包的路由器由于包长度大于将要转发到的链路的MTU,而无法对其进行转发时,将会产生包太长报文。该ICMPv6错误报文中有一个字段指出导致该问题的链路的MTU值。在路径MTU发现过程中这是一个有用的错误报文。
超时
当路由器收到一个跳极限为1的包时,它必须在转发该包之前减小这个数值。如果在路由器减小该数值后,跳极限字段的值变为0 (或者是路由器收到一个跳限制字段为0的包),那么路由器必须丢弃该包,并向源节点发送ICMPv6超时报文。源节点在收到该报文后,可以认为最初的跳限制设置得太小(包的真实路由比源节点想象的要长),也可以认为有一个选路循环导致包无法交付。在“跟踪路由”功能中这个报文非常有用。这个功能使得一个节点可以标识一个包在从源节点到目的节点的路径上的所有路由器。它的工作方式如下:首先,一个去往目的地的包的跳极限被设置为1。它所到达的第一个路由器将跳极限减小到0,并回送一个超时报文,这样一来源节点就标识了路径上的第一个路由器。然后如果该包必须经过第二个路由器的话,源节点会再发送一个跳极限为2的包,该路由器将把跳极限减小到0,并产生另一个超时报文。这将持续到包最终到达其目的地为止,同时源节点也获得了从每个中间路由器发来的超时报文。
参数问题
当IPv6头或扩展头中的某些部分有问题时,路由器由于无法处理该包而会将其丢弃。路由器的实现中应该可以产生一个ICMP参数错误报文来指出问题的类型(如错误的头字段、无法识别的下一个头类型或无法识别的IPv6选项),并通过一个指针值指出在第几个字节遇到这种错误情况。
ICMPv6回声功能
ICMPv6中包含了一个与错误情况无关的功能。所有IPv6节点都需要支持两种报文:回声请求和回声应答。回声请求报文可以向任何一个正确的IPv6地址发送,并在其中包含一个回声请求标识符、一个顺序号和一些数据。尽管二者都是可选项,但回声请求标识符和顺序号可以用来区分对应不同请求的响应。回声请求的数据也是一个选项,并可用于诊断。当一个IPv6节点收到一个回声请求报文后,它必须回送一个回声应答报文。在应答中包含相同的请求标识符、顺序号和在最初的请求报文中携带的数据。
ICMPv6回声请求/应答报文对是ping功能的基础。ping是一个重要的诊断功能,因为它提供了一种方法来决定一个特定的主机是否与其他一些主机连接在相同的网络上。
第4章. IPv6地址发现协议
邻居发现协议是IPv6协议的一个基本的组成部分,它实现了在IPv4中的地址解析协议(ARP)、控制报文协议(ICMP)中的路由器发现部分、重定向协议的所有功能,并具有邻居不可达检测机制。 邻居发现协议实现了路由器和前缀发现、地址解析、下一跳地址确定、重定向、邻居不可达检测、重复地址检测等功能,可选实现链路层地址变化、输入负载均衡、泛播地址和代理通告等功能。 邻居发现协议采用5种类型的IPv6控制信息报文(ICMPv6)来实现邻居发现协议的各种功能。这5种类型消息如下。
(1) 路由器请求(Router Solicitation):当接口工作时,主机发送路由器请求消息,要求路由器立即产生路由器通告消息,而不必等待下一个预定时间。
(2) 路由器通告(Router Advertisement):路由器周期性地通告它的存在以及配置的链路和网络参数,或者对路由器请求消息作出响应。路由器通告消息包含在连接(on-link)确定、地址配置的前缀和跳数限制值等。
(3) 邻居请求(Neighbor Solicitation):节点发送邻居请求消息来请求邻居的链路层地址,以验证它先前所获得并保存在缓存中的邻居链路层地址的可达性,或者验证它自己的地址在本地链路上是否是唯一的。
(4) 邻居通告(Neighbor Advertisement):邻居请求消息的响应。节点也可以主动发送邻居通告以快速的通告链路层地址的变化。
(5) 重定向(Redirect):路由器通过重定向消息通知主机。对于特定的目的地址,如果不是最佳的路由,则通知主机到达目的地的最佳下一跳。
IPv6的一个设计要求是:即使在一个受限制的网络内,主机也必须正确工作,可以不需要存储像路由器上的路由表,也可以不需要有固定的配置。因此主机必须能进行自动配置,必须能学习到如何将数据发送到目的地的相关信息。这些信息储存的存储器叫做缓存,这些数据结构是一系列记录的排列,称作表项。每个表项储存的信息有一定的有效期,需要周期性地清除缓存中的表项,以保证缓存的空间大小。
主机需要为每一接口维护以下信息。
邻居缓存:一组有关单个邻居的表项,这些邻居接收到了最新的数据流。表项是连接单播地址的关键,它包括的信息有:其链路层地址、指示邻居是路由器还是主机的标志、指向任何排队等待完成地址解析数据包的指针等。邻居缓存表项还包括由邻居不可达检测算法所使用的信息,如可达状态、探测无应答的次数以及下一次邻居不可达检测发生的时间。
目的地缓存:一组有关最近收到数据流的目的地节点表项。目的地缓存包括“在连接(on-link)”和“非连接(off-link)”目的地,并在其中提供一定程度的间接寻址。目的地缓存能把目的地IP地址映射成下一跳邻居的IP地址,该缓存通过重定向消息进行信息更新。如果在目的地缓存表项中存储与邻居发现没有直接关系的附加信息,例如路径MTU(PMTU)以及由传输协议设定的往返时间,则执行时会更加方便。
前缀列表:规定一组“在连接(on-link)”地址的前缀组成的列表。前缀列表表项产生于路由器通告接收到的信息。每一个表项都有一个相关的失效计时器值(由通告信息确定),它用于在前缀失效时废弃这些前缀。除非在后续通告中收到了一个新的(有限)值,否则特殊的“无限”计时器值规定前缀永久有效。本地链路(1ink-local)前缀位于带有无限失效计时器的前缀列表,而不管路由器是否正在向其通告前缀。接收的路由器通告不应该修改本地链路前缀的失效计时器。
缺省路由器列表:接收数据包的路由器列表。路由器列表的表项指向邻居缓存中的相应的表项。缺省路由器的选择算法是:选择那些已知可达的路由器,而不选择可达性还不确定的路由器。每一个表项还有一个相关的失效计时器值(从路由器通告信息中得到),它的作用是删除不再通告的表项。
上述数据结构可以用不同的方法实现。其中一种实现方法是对所有数据结构使用单个最长匹配路由表。不管采用哪种特定的实现方法,为了防止重复性的邻居不可达检测,路由器的邻居缓存表项可以由使用该路由器的所有目的地缓存表项共享。
邻居缓存包含有邻居不可达检测算法维护的信息。邻居可达性状态是最关键的信息,它的取值是下列的5个值之一:
不完整性(INCOMPLETE):正在进行地址解析,邻居的链路层地址还没确定。 可达性(REACHABLE):邻居在最近处于可达状态(在小于10s以前)。
失效性(STALE):在数据流发送给该邻居以前邻居是不可达的,并无法验证其可达性。
延迟(DELAY):邻居不再是可达的,同时数据流在最近已经发送给邻居,但不立即对该邻居进行探
测,而在一个短时延后发送探测信息,这样就可以为上层协议提供可达性确认。
探测(PROBE):邻居不再是可达的,同时发送单播邻居请求探测以验证可达性。 数据包的发送算法
节点向目的地发送数据包时,使用目的地缓存、前缀列表、默认路由器列表确定合适的下一跳的IP地址,然后路由器查询邻居缓存确定邻居的链路层地址。
IPv6单播地址的下一跳确定操作如下:发送者使用前缀列表中的前缀进行最长前缀匹配,确定包的目的地是在连接的还是非连接的。如果下一跳是在连接的,下一跳地址就和目的地地址相同,否则发送者从默认路由器列表中选择下一跳。如果默认路由器列表为空,则发送者认为目的地是在连接的。
下一跳确定的信息存储在目的地缓存中,下一个包可以使用这些信息。当路由器发送包时,首先检查目的地缓存,如果目的地缓存没有相关信息存在,就激活下一跳确定过程。
在学习到下一跳路由器的IPv6地址后,发送者检查邻居缓存以决定链路层地址。如果没有下一跳IPv6地址的表项存在,路由器的工作如下:
创建一个新表项,并设置其状态为不完全。 开始进行地址解析。 对传送的包进行排队。
当地址解析结束时,获得链路层地址,存储在邻居缓存中。此时表项到达新的可达状态,排队的包能够传送。
对于组播包,下一跳总是认为在连接,确定组播IPv6地址的链路层地址取决于链路类型。 当邻居缓存开始传送单播包时,发送者根据邻居不可达检测算法检测相关的可达性信息,验证邻居的可达性。当邻居不可达时,再次执行下一跳确定,验证到达目的地的另一条路径是否是可达的。
如果知道了下一跳节点的IP地址,发送方就检查邻居缓存中有关邻居的链路层信息。如果没有表项存在,发送方就创建一条,并设置其状态为“不完整性”,同时启动地址解析,然后对没有完成地址解析的数据包进行排队。对具有组播功能的接口来说,地址解析的过程是发送一个邻居请求信息,以及等待一个邻居通告。当收到一个邻居通告应答时,链路层地址被表项在邻居缓存中,同时发送排队的数据包。
在传输单播数据包期间每次读取邻居发现缓存的表项,发送方根据邻居不可达性检测的算法检查邻居不可达性检测的相关信息,但不可达性检测会使发送方发出单播邻居请求,以验证该邻居还是可达的。
数据流第一次送往目的地时就执行下一跳确定的操作,随后该目的地如果仍能正常通信,目的地缓存的表项就可以继续使用。如果邻居不可达算法决定在某一点终止通信,则需要重新执行下一跳确定,例如故障路由器的流量应该切换到正常工作的路由器,流向移动节点的数据流可能要重新路由到“移动代理”。
当节点重做下一跳确定时,不需要丢弃整个目的地缓存的表项,其中PMTU和往返计时器值的信息是很有用的。
4.1 邻居发现协议的功能
1、 路由器和前缀发现
路由器必须无条件丢弃不满足有效性检查的路由器请求和路由器通告消息。
路由器发现功能用来标识与给定链路相连的路由器,并获取与地址自动配置相关的前缀和配置参数。 作为对请求消息的响应,路由器应周期地发送组播路由器通告消息,来通告链路上节点的可达性。每个主机从链路上相连的路由器上接收路由器通告消息,并建立默认路由器列表(当到达目的地的路径不可知时所使用的路由器)。如果路由器很频繁地产生路由器通告消息,那么主机就能在几分钟内学习到路由器的存在,否则就要使用邻居不可达检测。
路由器通告消息应包含用来确定在连接可达性的前缀列表。主机通过使用从路由器通告消息中提取的前缀,来确定目的地是否在连接,能否直接可达,或者是否非连接,还是仅通过一个路由器就可达。目的地是在连接的,但这个目的地没有被路由器通告消息学到的前缀覆盖,在这种情况下,主机认为目的地是非连接的,路由器发送重定向消息给发送者。
路由器通告消息应包含一些标志位,这些标志位通知主机怎样执行地址的自动配置,例如路由器能指定主机是使用有状态地址配置还是无状态地址配置。
另外,路由器通告消息中还应包含简化网络集中管理的参数,例如主机产生的数据包中使用的跳数限制参数的缺省值,或链路MTU值。
当主机向路由器发出路由器请求消息时,路由器应立刻发送路由器通告消息,通过这种方式能加速节点的配置过程。
2、 地址解析
IPv6节点通过邻居请求和邻居通告消息将IPv6地址解析成链路层地址,对组播地址不执行地址解
析。
节点通过组播邻居请求消息来激活地址解析过程,邻居请求消息用来请求目标路由器返回它的链路层地址。源路由器在邻居请求消息中包含了它的链路层地址,并将邻居请求消息组播到与目标地址相关的请求节点组播地址,目标路由器在单播的邻居通告消息中返回它的链路层地址。这一对消息使源和目标路由器能解析出相互的链路层地址。
3、 重定向功能
当包必须发送到一个非连接的目的地时,需要选择转发包的路由器。当选择的路由器作为消息传送的下一跳并不是最好的下一跳时,路由器需产生重定向消息,通知源节点到达目的地存在一个更佳的下一跳路由器。
路由器必须能够确定每个邻居路由器的本地链路(1ink-local)地址,以保证重定向消息里的目标地址根据本地链路地址来识别邻居路由器。
在源端没有正确应答重定向消息,或者源端选择忽略没有被验证的重定向消息的情况下,为了节省频带和处理的费用,路由器必须限定发送重定向消息的速率。
在收到重定向消息时,路由器不能更新路由表。 4、 邻居不可达检测
任何时候通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热拔插等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。因此节点应该主动跟踪数据包发向邻居的可达性状态。
主机与邻居节点之间所有路径都应进行邻居不可达性检测,包括主机到主机、主机到路由器以及路由器到主机之间的通信,也可用于路由器之间,以检测邻居或邻居前向路径发生的故障。
如果路由器最近收到确认,邻居的IP层已经收到最近发送到它的数据包,那么该邻居是可达的。邻居不可达检测使用两种方法进行确认:一种是从上层协议来的提示,提供“连接正在处理”的确认;另一种是路由器发送单播邻居请求消息,收到了应答的邻居通告消息。为了减少不必要的网络流量,探测消息仅发送到邻居。
邻居不可达性检测与向邻居发送数据包同时进行。在邻居可达性确认期间,路由器继续向缓存链路层地址的邻居发送数据包;如果没有数据包发向邻居,则不发送检测。
自从IETF在1998年12月制定了邻居发现协议的标准文本RFC2461后,邻居发现就成为IPv6节点
使用的重要协议,它解决了连接在同一条链路上的所有节点之间的互操作问题。
虽然目前IPv6的标准已经比较稳定,国内外厂商研制的相关产品和设备也已经成熟,但由于IPv6技术在我国的市场需求还不是很明朗,因此IPv6技术在我国还处于试验网的实践和运行阶段。随着IPv6网络应用商业化进程的加快,邻居发现协议的使用将会越来越广泛。
第5章. IPv6地址
IPv4与IPv6地址之间最明显的差别在于长度: IPv4地址长度为32位,而IPv6地址长度为128位。RFC 2373中不仅解释了这些地址的表现方式,同时还介绍了不同的地址类型及其结构。IPv4地址可以被分为2至3个不同部分(网络标识符、节点标识符,有时还有子网标识符),IPv6地址中拥有更大的地址空间,可以支持更多的字段。
IPv6地址有三类、单播、组播和泛播地址。单播和组播地址与IPv4的地址非常类似;但IPv6中不再支持IPv4中的广播地址,而增加了一个泛播地址。
地址表达方式
IPv6地址长度4倍于IPv4地址,表达起来的复杂程度也是IPv4地址的4倍。IPv6地址的基本表达方式是X:X:X:X:X:X:X:X,其中X是一个4位十六进制整数( 16位)。每一个数字包含4位,每个整数包含4个数字,每个地址包括8个整数,共计128位( 4×4×8 = 128 )。例如,下面是一些合法的IPv6地址:
CDCD:910A:2222:5498:8475:1111:3900:2020 1030:0:0:0:C9B4:FF12:48AA:1A2B 2000:0:0:0:0:0:0:1
请注意这些整数是十六进制整数,其中A到F表示的是10到1 5。地址中的每个整数都必须表示出来,但起始的0可以不必表示。这是一种比较标准的IPv6地址表达方式,此外还有另外两种更加清楚和易于使用的方式。某些IPv6地址中可能包含一长串的0 (就像上面的第二和第三个例子一样)。当出现这种情况时,标准中允许用“空隙”来表示这一长串的0。换句话说,地址
2000:0:0:0:0:0:0:1 可以被表示为:
2000::1
这两个冒号表示该地址可以扩展到一个完整的128位地址。在这种方法中,只有当16位组全部为0时才会被两个冒号取代,且两个冒号在地址中只能出现一次。
在IPv4和IPv6的混合环境中可能有第三种方法。IPv6地址中的最低32位可以用于表示IPv4地址,该地址可以按照一种混合方式表达,即X:X:X:X:X:X:d.d.d.d,其中X表示一个16位整数,而d表示一
个8位十进制整数。例如,地址
0:0:0:0:0:0:10.0.0.1
就是一个合法的IPv4地址。把两种可能的表达方式组合在一起,该地址也可以表示为:
::10.0.0.1
由于IPv6地址被分成两个部分—子网前缀和接口标识符,因此人们期待一个IP节点地址可以按照类似CIDR地址的方式被表示为一个携带额外数值的地址,其中指出了地址中有多少位是掩码。即,IPv6节点地址中指出了前缀长度,该长度与IPv6地址间以斜杠区分,例如:
1030:0:0:0:C9B4:FF12:48AA:1A2B/60 这个地址中用于选路的前缀长度为60位。
第6章. IPv6寻址模型
每个单播地址标识一个单独的网络接口。IP地址被指定给网络接口而不是节点,因此一个拥有多个网络接口的节点可以具备多个IPv6地址,其中任何一个IPv6地址都可以代表该节点。尽管一个网络接口能与多个单播地址相关联,但一个单播地址只能与一个网络接口相关联。每个网络接口必须至少具备一个单播地址。这里有一个非常重要的声明和一个非常重要的例外。这个声明与点到点链路的使用有关。在IPv4中,所有的网络接口,其中包括连接一个节点与路由器的点到点链路(用许多拨号Internet连接中),都需要一个专用的IP地址。随着许多机构开始使用点到点链路来连接其分支机构,每条链路均需要其自己的子网,这样一来消耗了许多地址空间。在IPv6中,如果点到点链路的任何一个端点都不需要从非邻居节点接受和发送数据的话,它们就可以不需要特殊的地址。即,如果两个节点主要是传递业务流,则它们并不需要具备IPv6地址。
为每个网络接口分配一个全球唯一的单播地址的要求阻碍了IPv4地址的扩展。一个提供通用服务的服务器在高需求量的情况下可能会崩溃。因此, IPv6地址模型中又提出了一个重要的例外:如果硬件有能力在多个网络接口上正确地共享其网络负载的话,那么多个网络接口可以共享一个IPv6地址。这使得从服务器扩展至负载分担的服务器群成为可能,而不再需要在服务器的需求量上升时必须进行硬件升级。
第7章. IPv6地址类型
IP地址有三种类型:单播、组播和任意点播。广播地址已不再有效。RFC2373中定义了三种IPv6地址类型:
单播:一个单接口的标识符。送往一个单播地址的包将被传送至该地址标识的接口上。
泛播:一组接口(一般属于不同节点)的标识符。送往一个泛播地址的包将被传送至该地址标识的接口之一(根据选路协议对于距离的计算方法选择“最近”的一个)。
组播:一组接口(一般属于不同节点)的标识符。送往一个组播地址的包将被传送至有该地址标识的所有接口上。
7.1 单播
单播地址标识了一个单独的IPv6接口。一个节点可以具有多个IPv6网络接口。每个接口必须具有一个与之相关的单播地址。单播地址可被认为包含了一段信息,这段信息被包含在128位字段中:该地址可以完整地定义一个特定的接口。此外,地址中数据可以被解释为多个小段的信息。但无论如何,当所有的信息被放在一起后,将构成标识一个节点接口的128位地址。
IPv6地址本身可以为节点提供关于其结构的或多或少的信息,这主要根据是由谁来观察这个地址以及观察什么。例如,节点可能只需简单地了解整个128位地址是一个全球唯一的标识符,而无须了解节点在网络中是否存在。另一方面,路由器可以通过该地址来决定,地址中的一部分标识了一个特定网络或子网上的一个唯一节点。
例如,一个IPv6单播地址可看成是一个两字段实体,其中一个字段用来标识网络,而另一个字段则用来标识该网络上节点的接口。网络标识符可被划分为几部分,分别标识不同的网络部分。IPv6单播地址功能与IPv4地址一样受制于CIDR,即,在一个特定边界上将地址分为两部分。地址的高位部分包含选路用的前缀,
而地址的低位部分包含网络接口标识符。
最简单的方法是把IPv6地址作为不加区分的一块128位的数据,而从格式化的观点来看,可把它分为两段,即接口标识符和子网前缀。接口标识符的长度取决于子网前缀的长度。两者的长度是可以变化
的,这取决于谁对它进行解释。对于非常靠近寻址的节点接口(远离骨干网)的路由器可用相对较少的位数来标识接口。而离骨干网近的路由器,只需用少量地址位来指定子网前缀,这样,地址的大部分将用来标识接口标识符。
IPv6单播地址包括下面几种类型: 可集聚全球地址。 未指定地址或全0地址。 回环地址。
嵌有IPv4地址的IPv6地址。
基于供应商和基于地理位置的供应商地址。 OSI网络服务访问点( NSAP )地址。 网络互联包交换( IP X )地址。
单播地址格式
RFC 2373改变和简化了IPv6的地址分配。其中之一是取消了基于地理位置的地址分配,基于供应商的单播地址改变成可集聚全球单播地址。从名字的改变上就可看出,对于基于供应商的地址,允许前面定义的集聚以及基于交换局的新型集聚。这也反映了一种更平衡的地址分类。NSAP和IPX地址空间仍然保留着,且八分之一的地址分配给可集聚地址。另外,除了组播地址和某类保留地址外, IPv6地址空间的其余部分都是未分配的地址,为将来的发展预留了足够的空间。
1. 接口标识符
在IPv6寻址体系结构中,任何IPv6单播地址都需要一个接口标识符。接口标识符非常像48 位的介质访问控制(MAC)地址,MAC地址由硬件编码在网络接口卡中,由厂商烧入网卡中,而且地址具有全球唯一性,不会有两个网卡具有相同的MAC地址。这些地址能用来唯一标识网络链路层上的接口。IPv6主机地址的接口标识符基于IEEE EUI-64格式。该格式基于已存在的MAC地址来创建64位接口标识符,这样的标识符在本地和全球范围是唯一的。RFC 2373包括的附录解释了如何创建接口标识符。
这些64位接口标识符能在全球范围内逐个编址,并唯一地标识每个网络接口。这意味着理论上可多达264个不同的物理接口,大约有1.8×1019个不同的地址,而且这也只用了IPv6地址空间的一半。这
至少在可预见的未来是足够的。
2. 可集聚全球单播地址
可集聚全球单播地址是另一种类型的集聚,它是独立于ISP的。基于供应商的可集聚地址必须随着供应商的改变而改变,而基于交换局的地址则由IPv6交换实体直接定位。由交换局提供地址块,而用户和供应商为网络接入签订合同。这样的网络接入或者是直接由供应商提供,或者通过交换局
间接提供,但选路通过交换局。这就使得用户改换供应商时,无需重新编址。同时也允许用 户使用多个ISP来处理单块网络地址。可集聚全球单播地址包括地址格式的起始3位为001的所有地址(此格式可在将来用于当前尚未分配的其他单播前缀)。
包括下列字段:
FP字段: IPv6地址中的格式前缀, 3位长,用来标识该地址在IPv6地址空间中属于哪类地址。目前该字段为“001”,标识这是可集聚全球单播地址。
TLA ID字段:顶级集聚标识符,包含最高级地址选路信息。这指的是网络互连中最大的选路信息。目前,该字段为13位,可得到最大8192个不同的顶级路由。
RES字段:该字段为8位,保留为将来用。最终可能会用于扩展顶级或下一级集聚标识符字段。 NLA ID字段:下一级集聚标识符, 2 4位长。该标识符被一些机构用于控制顶级集聚以安排地址空间。换句话说,这些机构(可能包括大型ISP和其他提供公网接入的机构)能按照他们自己的寻址分级结构来将此2 4位字段切开用。这样,一个实体可以用2位分割成4个实体内部的顶级路由,其余的2 2位地址空间分配给其他实体(如规模较小的本地ISP )。这些实体如果得到足够的地址空间,可将分配给它们的空间用同样的方法再子分。
SLA ID字段:站点级集聚标识符,被一些机构用来安排内部的网络结构。每个机构可以用与IPv4同样的方法来创建自己内部的分级网络结构。若16位字段全部用作平面地址空间,则最多可有65 535个不同子网。如果用前8位作该组织内较高级的选路,那么允许255个高级子网,每个高级子网可有多达255个子子网。
接口标识符字段:64位长,包含IEEE EUI-64接口标识符的64位值。
3. 特殊地址和保留地址
在第一个1/256 IPv6地址空间中,所有地址的第一个8位:0000 0000被保留。大部分空的地址空间
用作特殊地址,这些特殊地址包括:
未指定地址:这是一个“全0”地址,当没有有效地址时,可采用该地址。例如当一个主机从网络第一次启动时,它尚未得到一个IPv6地址,就可以用这个地址,即当发出配置信息请求时,在IPv6包的源地址中填入该地址。该地址可表示为0:0:0:0:0:0:0:0,也可写成::。
回环地址:在IPv4中,回返地址定义为127.0.0.1。任何发送回返地址的包必须通过协议栈到网络接口,但不发送到网络链路上。网络接口本身必须接受这些包,就好像是从外面节点收到的一样,并传回给协议栈。回返功能用来测试软件和配置。IPv6回返地址除了最低位外,全为0,即回返地址可表示为0:0:0:0:0:0:0:1或::1。
嵌有IPv4地址的IPv6地址:有两类地址,一类允许IPv6节点访问不支持IPv6的IPv4节点,另一类允许IPv6路由器用隧道方式,在IPv4网络上传送IPv6包。
4. 嵌有IPv4地址的IPv6地址
不管人们是否愿意,逐渐向IPv6过渡已成定局。这意味着IPv4和IPv6节点必须找到共存的方法。当然两个不同IP版本最明显的一个差别是地址。最早由RFC 1884定义,然后被带入RFC 2373中,IPv6提供两类嵌有IPv4地址的特殊地址。这两类地址高阶8 0位均为0,低价32位包含IPv4地址。当中间的16位被置为FFFF时,则指示该地址为IPv4映象的IPv6地址。
IPv4兼容地址被节点用于通过IPv4路由器以隧道方式传送IPv6包。这些节点既理解IPv4又理解IPv6。IPv4映象地址则被IPv6节点用于访问只支持IPv4的节点。
5. 链路本地和站点本地地址
对于不愿意申请全球唯一性的IPv4网络地址的一些机构,通过采用网络10型地址对IPv4网络地址进行翻译,可以为这些机构提供一个选项。位于机构之外,但由机构使用的路由器不应该转发这些地址,但是不能阻止转发这些地址,也不能区分这些地址和其他有效的IPv4地址。可以相对容易地配置路由器,使其能转发这些地址。
为实现这一功能, IPv6从全球唯一的Internet空间中分出两个不同的地址段。链路本地地址用于单网络链路上给主机编号。前缀的前10位标识的地址即链路本地地址。
路由器在它们的源端和目的端对具有链路本地地址的包不予处理,因为永远也不会转发这些包。该地址的中间54位置成0。而64位接口标识符同样用的IEEE结构,地址空间的这部分允许个别网络连接
多达(264 - 1)个主机。
7.2 组播
像广播地址一样,组播地址在类似老式的以太网的本地网中特别有用,在这种网中,所有节点都能检测出线路上传输的所有数据。每次传输开始时,每个节点检查其目的地址,如果与本节点接口地址一致,节点就拾取该传输的其余部分。这使节点拾取广播和组播传输相对比较简单。如果是广播,节点只要侦听,无须做任何决定,因此简单。对组播来说,稍复杂一些,节点要预订一个组播地址,当检测出目的地址为组播地址时,必须确定是否是节点预定的那个组播地址。
IP组播就更为复杂。一个重要的原因是IP并不是不加鉴别就将业务流放在Internet上转发至所有节点,这是IP成功之处。如果要这样做的话,它将迫使大多数甚至所有连接的网络屈服。这就是为什么路由器不应该转发广播包的原因。不过,对组播而言,只要路由器以其他节点的名义预订组播地址,就能有选择地转发它。当节点预订组播地址时,它声明要成为组播的一个成员。于是任何本地路由器将以该节点的名义预订组播地址。同一网络上的其他节点要发送信息到该组播地址时, IP组播包将被封装到链路层组播数据传输单元中。在以太网上,封装的单元指向以太网组播地址;在其他用点对点电路传输的网络上(如ATM ),通过其他某些机制将包发送给订户,通常通过某类服务器将包发送给每个订户。从本地网以外来的组播,用同样方法处理,只是传递给路由器,由路由器把包转发给预订节点。
1. 组播地址格式
IPv6组播地址的格式不同于IPv6单播地址。组播地址只能用作目的地址,没有数据报把组播地址用作源地址。地址格式中的第1个字节为全“1”,标识其为组播地址。组播地址格式中除第1字节外的其余部分,包括如下三个字段:
标志字段:由4个单个位标志组成。目前只指定了第4位,该位用来表示该地址是由Internet编号机构指定的熟知的组播地址,还是特定场合使用的临时组播地址。如果该标志位为“0”,表示该地址为熟知地址;如果该位为“1”,表示该地址为临时地址。其他3个标志位保留将来用。
范围字段:长4位,用来表示组播的范围。即,组播组是只包括同一本地网、同一站点、同一机构中的节点,还是包括IPv6全球地址空间中任何位置的节点。该4位的可能值为
组标识符字段:长112位,用于标识组播组。根据组播地址是临时的还是熟知的以及地址的范围,
同一个组播标识符可以表示不同的组。永久组播地址用指定的赋予特殊含义的组标识符,组中的成员既依赖于组标识符,又依赖于范围。
所有IPv6组播地址以FF开始,表示地址的第1个8位为全“1”。目前,因为标志的其余位未定义,所以地址的第3个十六进制数字若为“0”,则表示熟知地址;若为“1”,则表示临时地址。第4个十六进制数字表示范围,可以是未分配的值或保留的值。
2. 组播组
IPv4已具备使用组播的应用,由于这种应用将同样的数据发送到多个节点。用分配的组播地址和组播范围进行组合,可以表现出多种含义,并用在其他应用上。一些早期注册的组播地址,包括成组的路由器、DHCP服务、音频和视频服务以及网络游戏服务,详情请参阅RFC 2375(IPv6组播地址分配)。
泛播
组播地址在某种意义上可以由多个节点共享。组播地址成员的所有节点均期待着接收发给该地址的所有包。一个连接5个不同的本地以太网网络的路由器,要向每个网络转发一个组播包的副本(假设每个网络上至少有一个预订了该组播地址)。泛播地址与组播地址类似,同样是多个节点共享一个泛播地址,不同的是,只有一个节点期待接收给泛播地址的数据报。泛播对提供某些类型的服务特别有用,尤其是对于客户机和服务器之间不需要有特定关系的一些服务,例如域名服务器和时间服务器。名字服务器就是个名字服务器,不论远近都应该工作得一样好。同样,一个近的时间服务器,从准确性来说,更为可取。因此当一个主机为了获取信息,发出请求到泛播地址,响应的应该是与该泛播地址相关联的最近的服务器。
1. 泛播地址的分配及其格式
泛播地址被分配在正常的IPv6单播地址空间以外。因为泛播地址在形式上与单播地址无法区分开,一个泛播地址的每个成员,必须显式地加以配置,以便识别泛播地址。
2. 泛播选路
了解如何为一个单播包确定路由,必须从指定单个单播地址的一组主机中提取最低的公共选路命名符。即,它们必定有某些公共的网络地址号,并且其前缀定义了所有泛播节点存在的地区。比如一个ISP可能要求它的每一个用户机构提供一个时间服务器,这些时间服务器共享单个泛播地址。在这种情况下,定义泛播地区的前缀,被分配给ISP作再分发用。发生在该地区中的选路是由共享泛播地址的主机的分发来定义的。在该地区中,一个泛播地址必定带有一个选路项:该选路项包括一些指针,指向共享该泛播
地址的所有节点的网络接口。上述情况下,地区限定在有限范围内。泛播主机也可能分散在全球Internet 上,如果是这种情况的话,那么泛播地址必须添加到遍及世界的所有路由表上。
第8章. IPv6扩展头
8.1 扩展头
为简化的IPv6头,由工作在无选项方式的大多数网络业务流所采用,同时它提高了网络对确实需要选项的包的处理能力。这种新的IPv6扩展头包括:
逐跳选项头:此扩展头必须紧随在IPv6头之后,它包含包所经路径上的每个节点都必须检查的可选数据。到目前为止,只定义了一个选项:巨型净荷选项。该选项指明,此包的净荷长度超出了IPv6的16位净荷长度字段。只要包的净荷(包括逐跳选项头)超出65535字节,就必须包含该选项。如果节点不能转发此包,则必须返回一个ICMPv6出错报文。
选路头:此扩展头指明包在到达目的地途中将经过的特殊的节点。它包含包沿途经过的各节点的地址列表。IPv6头的最初目的地址不是包的最终目的地址,而是选路头中所列的第一个地址。此地址对应的节点接收到该包后,对IPv6头和选路头进行处理,然后将包发送到选路头列表中的第二个地址。如此继续,直至该包到达最终目的地。
分段头:此扩展头包含一个分段偏移值、一个“更多段”标志和一个标识字段,用于源节点对长度超出源端和目的端间路径MTU的包进行分段。
目的地选项头:此扩展头包含只能由最终目的地节点所处理的选项。目前,只定义了填充选项,将该头填充为64位边界,以备将来所用。
身份验证头(AH):此扩展头提供了一种机制,对IPv6头、扩展头和净荷的某些部分进行加密的较验和计算。
封装安全性净荷(ESP)头:这是最后一个扩展头,不进行加密,它指明剩余的净荷已经加密,并为已获得授权的目的节点提供足够的解密信息。
8.2 扩展头的用法
将IPv4选项合并到标准IPv4头比较复杂。IPv4头最短为20字节,最长为60字节,附加数据包含IPv4选项,必须由路由器翻译以对IP包进行处理。这种方法有两个影响:其一,路由器实现时往往对附加选项的包进行分流处理,因此导致处理效率降低;其二,由于选项导致性能下降,应用开发者倾向
于不使用选项。
使用IPv6扩展头,可以在不影响性能的前提下实现选项。开发者可以在必要时使用选项,而无须担心路由器会对带扩展选项的包区别对待,除非是设置了选路扩展头或逐跳选项。即使设置了这两个选项,路由器仍可以进行必要的处理,比使用IPv4选项容易。
8.3 扩展头的标识
所有的IPv6头长度都一样,并且看起来几乎相同,唯一的区别在于下一个头字段。在没有扩展头的IPv6包中,此字段的值表示上一层协议。即,若IP包中含有TCP段,则下一个头字段的8位二进制值是6 (源自RFC 1700(已指派号码) );若IP包中含有UDP数据报,这个值就是17。下一个头字段值指明是否有下一个扩展头及下一个扩展头是什么,因此, IPv6头可以链接起来,从基本的IPv6头开始,逐个链接各扩展头。
8.4 扩展头的顺序
一个IPv6包可以有多个扩展头,但是,只有一种情况允许同一类型的扩展头在一个包中多次出现,而且各扩展头在链接时有一个首选顺序。RFC 1883规定,扩展头应该依照如下顺序:
(1) IPv6头。 (2) 逐跳选项头。
(3) 目的地选项头(应用于IPv6目的地址字段的第一个目的地和选路头中所列的附加目的地中)。 (4) 选路头。 (5) 分段头。 (6) 身份验证头。 (7) ESP头。
(8) 目的地选项头(当使用选路头时,仅应用于包的最终目的地)。 (9) 上层头。
从以上顺序可知,在同一个IP包中只有目的地选项扩展头可以多次出现,并且仅限于包中包含选路扩展头的情况。上述顺序并不是绝对的。例如,前面已提及,在包的其余部分要加密时,ESP头必须是
最后一个扩展头。同样,逐跳选项优先于所有其他扩展头,因为每个接收IPv6包的节点都必须对该选项进行处理。
建立新的选项
扩展头必须通过IPv6头的下一个头字段来确认。这意味着由于这个字段为8位,最多只能有256个不同值。即使将来该字段的可能取值的个数有所减少,也必须支持上一层头的所有可能值。即,该值不仅对扩展头进行标识,还标识着封装在IP包内的所有其他协议。因此,目前已经指派了很多值,未指派的值相当有限。
IPv6用于扩展头的某些协议标识符沿自IPv4,例如身份验证头和ESP头。到目前为止,已指派了很多扩展头,但也允许通过逐跳选项扩展头和目的地选项扩展头来建立新的选项。除了为下一个头字段保存协议值以外,通过使用这些选项头扩展,很容易健壮地实现新选项。如果使用一个全新的头类型来发送IP包,若目的节点支持新的头类型,则一切顺利;反之,如果新的头类型对目的节点是未知的,则目的节点只能丢弃该包。另一方面,所有的IPv6节点都必须支持逐跳选项扩展头、目的地选项扩展头以及一些基本选项(参见下节)。此时,如果目的节点收到带有目的地选项扩展头的包,即使不支持该扩展头中的选项,它也能够响应。选项也可以请求目的节点发回一个ICMP出错报文,以指明目的节点不理解此选项。
选项扩展头
逐跳选项扩展头和目的地选项扩展头可以包含特定的选项。RFC 1883中定义了两个填充选项,用于确保扩展头字段符合边界要求。即,如果选项使用3个8位字段后接一个32位字段,就必须插入(即填充)附加的8位,以确保在越过一个32位字边界时,选项中的32位字段不会被拆开。如果无需填充,则只定义一个功能选项,即逐跳选项扩展头中使用的巨型净荷选项。
所有的选项扩展头—逐跳选项扩展头和目的地选项扩展头都有类似的帧格式。这些扩展头只有两个预定义的字段:下一个头字段和头扩展长度字段。所有IPv6头都包含下一个头字段。头扩展长度字段占8位,指明该选项头的长度。该长度以8字节为单位,不包含扩展头的第一个8字节,即如果选项扩展头只有8字节长,该字段值即为0。该字段限制了扩展头最多为2048字节。扩展头的其余部分为该扩展头所包含的选项。
8.5 选项
IPv6选项包含如下三个字段:
选项类型:该字段为8位标识符,指明选项的类型。即使目的节点不能够识别选项,也可以由该字段的前3位编码翻译出选项的类型。
选项数据长度:该字段为8位整数,表示选项数据字段的长度。该字段最大值为255。
选项数据:该字段包含选项特定的数据,最大长度为255字节。选项类型字段的前2位表示目的节点在不能识别特定的选项时应该采取的动作,共有如下四种选项类型:
00:忽略此选项,完成对扩展头其余部分的处理。 01:丢弃整个包。
10:丢弃包,不论该包的目的地址是否是组播地址,都向该包的源地址发送一个ICMP报文。 11:丢弃包,如果该包的目的地址是单播地址或任意点播地址(即非组播地址),则向该包的源地址发送一个ICMP报文。
选项类型的第3位指明在包从源地址到目的地址的传送过程中,选项数据的值是否可以改变。若为0,则不允许改变;若为1,则选项数据是可变的。逐跳选项扩展头和目的地选项扩展头都包含的相同选项是两个填充选项:填充选项1和填充选项N。填充选项1很特别,它只有8位,全部置为0,没有选项数据长度字段和其他选项数据。
而填充选项N是由前面的四种选项类型之一来标识的,它使用多个字节来填充扩展头。如果扩展头需要N字节填充,则选项数据长度字段值为N - 2,即选项数据字段占N - 2个字节,全部置为0。再加上1字节的选项类型字段、1字节的选项数据长度字段,一共填充了N字节。
8.6 逐跳扩展头
从源节点到目的节点的路由上的每个节点,即每个转发包的路由器都检查逐跳选项中的信息。到目前为止,只定义了一个逐跳选项:巨型净荷选项。
与其他选项扩展头相同,前两个字段指明了下一个头协议和扩展头的长度(此时,由于整个选项只有8位,扩展头长度的字段值为0 )。巨型净荷选项从扩展头的第三个字节开始。第三个字节为扩展头类型,其值为194;第四个字节,即巨型净荷选项数据长度的值为4。选项的最后一个字段为巨型净荷长度,指
明包括逐跳选项扩展头在内, IP包中所包含的实际字节数,但不包括IPv6头。只有沿途每个路由器都能够处理时,节点才能使用巨型净荷选项来发送大型IP包。因此,该选项在逐跳扩展头中使用,要求沿途的每个路由器都必须检查此信息。巨型净荷选项允许IPv6包净荷长度超过65 535字节,超过了40亿字节。如果使用该选项,要求IPv6头的16位净荷长度字段值必须为0,扩展头中的巨型净荷长度字段值不小于65 535。如果不满足这两个条件,接收包的节点应该向源节点发送ICMP出错报文,通知有问题发生。此外还有一个限制:如果包中有分段扩展头,就不能同时使用巨型净荷选项,因为使用巨型净荷选项时不能对包进行分段。
8.7 选路扩展头
选路头代替了IPv4中所实现的源选路。源选路允许用户指定包的路径,即到达目的地沿途必须经过的路由器。在IPv4源选路中,使用IPv4选项,对用户可以指定的中间路由器的个数有一定限制:带扩展的IPv4头有40个附加字节,最多只能填入10个32位地址。此外,由于路径上的每个路由器都必须处理整个地址列表,而不论该路由器是否在列表中,因而对源路由包的处理很慢。IPv6定义了一个通用的选路扩展头,有两个字段,各占1字节:选路类型字段和剩余段数段。其中选路类型字段表示所使用的选路头的类型;而剩余段数字段表示扩展头的其余部分所列出的附加路由器的个数,这些路由器是在到达最终目的地的途中包必须经过的。扩展头的其余部分为类型特定的数据,与选路头类型相关。RFC 1883中定义了一种类型,即类型0选路头。
类型0选路扩展头解决了IPv4源选路的主要问题。只有列表中的路由器才处理选路头,其他路由器则不必处理。而且列表中最多可以指定2 5 6个路由器。对选路头的操作过程如下:
由源节点构造包必须经过的路由器的列表,并构造类型0选路头,头中包括路由器的列表、最终目的节点地址和剩余段数,剩余段数( 8位整数)指明在包向目的节点交付之前所必须经过的特定路由器的数目。
源节点发送包时,将IPv6头目的地址设置为选路头列表中的第一个路由器的地址。
该包一直转发,直到到达路径中的第一站,即IPv6头的目的地址(选路头列表中的第一个路由器),只有该路由器才检查选路头,沿途的中间路由器都忽略选路头。
在第一站和所有后续其他站,路由器检查选路头以确保剩余段数与地址列表一致。若剩余段数的值等于0,则表示此路由器节点实际上是该包的最终目的地,节点将继续对包的其他部分进行处理。
假定此节点不是该包的最终目的地,它将自己的地址从IPv6头的目的地址字段取出,并以选路头列表中的下一个节点地址来替代。同时,节点将剩余段数字段的值减1。然后将包发送往下一站。列表中的其他节点重复此过程,直到包到达最终目的地。
8.8 分段扩展头
IPv6只允许源节点对包进行分段,简化了中间节点对包的处理。而在IPv4中,对于超出本地链路允许长度的包,中间节点可以进行分段。这种处理方式要求路由器必须完成额外的工作,并且在传输过程中包可能被多次分段。当一个节点要发送的包对于本地链路的单个数据传送单元来说太大时,就需要分段。例如,以太网允许传送的MTU为1500字节,要发送一个4000字节的IP包,如果不分成三段,每段均小于1500字节,就无法在以太网链路上传送。前方有些链路可能具有更小的MTU,比如5 7 6字节,这种链路上的路由器就必须将已经分成1500字节的IP包分段,再次分成更小的段。IPv4中的分段很令人烦恼,它使得中间节点和目的节点都必须增加处理分段的必要开销。通过使用路径MTU发现机制,源节点可以确定源节点到目的节点之间的整个链路中能够传送的最大包长度,从而可以避免中间路由器的分段处理。RFC 1883规定最小的MTU为576字节,但在将用来代替RFC 1883的文档草案中,最小的MTU要求已增加到1280字节,并建议将链路配置为应该至少可以传送1500字节长的包。
上述规定表明,源节点可以发送长达1280字节的包,而不必顾虑这些包会被分段。长达1500字节的包也很可能不被分段。但是, IPv6规范建议所有节点都执行路径MTU发现机制,并只允许由源节点分段。换言之,在发送任意长度的包之前,必须检查由源节点到目的节点的路径,计算出可以无需分段而发送的最大长度的包。如果要发送超出此长度的包,就必须由源节点进行分段。在IPv6中,分段只发生在源节点,并使用分段头来表示。
下一个头字段:此8位字段对所有的IPv6头是共同的。 保留:此8位字段目前未用,设置为0。
分段偏移值字段:与IPv4的分段偏移值字段很相似。此字段共1 3位,以8字节为单位,表示此包(分段)中数据的第一个字节与原来整个包中可分段部分的数据的第一个字节之间的位置关系。换言之,若该值为1 7 5,表示分段中的数据从原包的第1 40 0字节开始。
保留字段:此2位字段目前未用,设置为0。
M标志:此位表示是否还有后续字段。若值为1,表示后面还有后续字段;若值为0则表示这是最
后一个分段。
标识字段:该字段与IPv4的标识字段类似,但是为32位,而在IPv4中为16位。源节点为每个被分段的IPv6包都分配一个32位标识符,用来唯一标识最近(在包的生存期内)从源地址发送到目的地址的包。
整个IPv6包中只有部分可以被分段,可分段的部分包括:净荷和只能在到达最终目的地时才处理的扩展头。对于IPv6头和在发往目的节点的途中必须由路由器处理的扩展头,如选路头或逐跳选项头,则不允许进行分段。
8.9 目的地扩展头
类似逐跳选项头,目的地选项头提供了一种随着IPv6包来交付可选信息的机制。其余的扩展头选项,如分段头、身份验证头和ESP头,都是每次出于某一个特定的理由而定义的,而目的地选项扩展头则是允许为目的节点而定义的新选项。目的地选项将使用前面所描述的构造选项的格式。
因篇幅问题不能全部显示,请点此查看更多更全内容