+-
网络协议——IPv6从初始到详解,协议包头说明


网络协议——IPv6从初始到详解,协议包头说明

IPv6地址的显示规则


32位的ipv4地址的表示方式了,IPv4地址被分割为4个8位段,其中每个8位段的数字大小在0~255之间,并且每个8位段之间使用英文符号句点“.”来分开,因此有时也使用术语“点分十进制表示法”来专指IPv4地址的这种表示法。

而128位的IPv6地址则被分割成8个16位段来表示,其中每个16位段书写为大小在0x0000~0xFFFF之间的十六进制的数字表示,并且每个16位段之间使用英文符号冒号“:”来分开。例如,下面就是一个IPv6地址的书写方式:3ffe:1944:0100:000a:0000:00bc:2500:0d0b

有2条规则来简化书写规则:

1.任何一个16位段中起始的0不必写出来;任何一个16位段如果少于4个十六进制的数字,就认为忽略书写的数字是起始的0;

即之前的ipv6地址可以简写为:

3ffe:1944:0100:000a:0:bc:2500:d0b

这里需要注意的是,只有起始的0才可以被忽略掉,末尾的0是不能忽略的;

2.任何由全0组成的1个或多个16位段的单个连续的字符串都可以用一个双冒号“::”来表示;

例如:

ff02:0000:0000:0000:0000:0000:0000:0005

简写为:

ff02::5

这条规则仅对于单个连续不间断的全0字符传分段部分可以使用双冒号"::"来表示;并且不能使用使用两次双冒号;

IPv6 地址掩码

ipv6 协议的前缀始终通过位计数的方式标识。通过在ipv6地址后面加一个斜线'/',随后再跟一个十进制的数字来标识一个ipv6地址的起始位有多少位是前缀位。

eg:

3ffe:1944:100:a::bc:2500:d0b/64

当需要书写一个IPv6地址的前缀时,也可以使用和IPv4地址一样的书写方式将所有的主机位设置为0。例如:3ffe:1944:100:a::/64

## IPv6 的地址类型

ipv6地址存在以下3种类型:

单播  Unicast

任意播 Anycast

多播 Multicast

ipv6没有广播地址,但是ipv6地址协议提供了一个包含“全部节点”的多播地址,用来实现与ipv4 地址协议中广播同样的目的;

1.全球单播地址

单播地址用来表示单台设备的地址。一个全球单播地址是指这个单播地址是全球唯一的;

早期ipv6 单播地址的通用格式如下:

...

地址的主机部分被称作接口ID(Interface ID);之所以取这个名字是因为一台主机可以拥有不止一个的IPv6接口,因而使用这样的地址标识主机的一个接口比标识一台主机本身更加准确。

但是,它的精确性也就仅仅到此为止:单个接口也能够拥有多个IPv6地址,并且能够拥有一个附加的IPv4的地址,在这样的实例中,接口ID仅仅表示该接口的几个标识符的其中一个。

除了长度不同外,IPv6地址与IPv4地址协议之间最显着的不同就是子网标识符的位置不同。IPv6地址的子网标识符的位置是地址的网络域的一部分,而不是该地址的主机域的一部分。

在IPv4地址分类体系结构的传统概念中,一个地址的子网部分来自于该地址的主机部分,减少了地址的主机位。结果是,IPv4地址的主机部分不仅仅使它的分类产生变化,而且导致用于子网标识的位数产生变化。

使用地址的网络部分作为IPv6子网ID的一个直接的好处就是,所有IPv6地址的接口ID都有大小一致的位数,这就大大地简化了地址的解析复杂度。而且,使用地址的网络部分作为子网ID,会产生一个更加清楚的分工,功能更加清晰:网络部分提供了一台设备到下行专用数据链路的定位,而主机部分提供这条数据链路上该设备的标识。

除了极少数的例外,全球IPv6地址的接口ID都是64位二进制位的长度。同样,除了极少数的例外,子网ID字段都是16位二进制位(如图22所示)。一个16位的子网ID字段可以提供65536个不同的子网。使用固定长度大小的子网ID看起来好像有些浪费,因为在大多数实例中远没有使用到这么大容量的子网数。但是,考虑到使用IPv6地址空间的总长度和容易分配、设计、管理以及解析地址的好处,使用固定长度大小的子网ID所带来的浪费也是可接受的。

...


Internet地址授权委员会(Internet Assigned Numbers Authority,IANA)和地区Internet注册机构(Regional Internet Registries,RIR)通常把长度为/32或/35的IPv6前缀分配给本地Internet注册机构(Local Internet Registries,LIR)。然后,本地Internet注册机构LIR——通常是大型的Internet服务提供商(ISP),他们再把更长的前缀分配给他们各自的客户。在大多数的实例中,本地Internet注册机构LIR分配的前缀长度都是/48。正如前面所提及的,有一些例外的情况,LIR也可能会分配不同长度的前缀;

2.标识IPv6的地址类型

ipv6地址起始的一些二进制指明了该地址的类型;eg,目前所有的全球单播地址的前三位是001;所有的全球单播地址都是以2或3开头的,这根据全球路由选择前缀的第四位的值而定;

...

3.本地单播地址

当我们谈论全球单播地址的时候,我们就认为这个地址是全球范围使用的。也就是说,这样的地址是全球惟一的,并且能够在全球范围内被路由而无需进行更改。

IPv6也拥有链路本地单播地址(link-local unicast address),这种地址是使用范围限定在单条链路上的地址。它的惟一性是仅仅限于所在的链路,并且相同的地址也可能存在于另一条链路上,因此这样的地址离开所在的链路是不可路由的。正如读者在表21中所看到的,链路本地单播地址的起始10位永远是1111111010(FE80::/10)。

4.任意播地址

一个任意播地址(Anycast address,也可称为任播地址或泛播地址)表示的更像一种服务,而不是一台设备,并且相同的地址可以驻留在提供相同服务的一台或多台设备中。如图2-3所示,某些服务是由3台服务器提供的,但却是通过IPv6地址3ffe:205:1100::15来进行该服务的所有通告的。

接收到包含该地址通告的路由器不会知道是由3台不同的设备通告给它的。相反,路由器会假定有3条路由到达相同的目的地,并会选择一条代价最低的路由。如图2-3所示,这条路由是到达服务器C的,它的代价是20。

...

使用任意播地址的好处就是,路由器总是选择到达“最近的”或“代价最低的”服务器的路由。因此,提供一些通用服务的服务器能够通过一个大型的网络进行传播,并且流量可以由本地传送到最近的服务器,这样就可以使网络中的流量模型变得更有效。而且,如果其中一台服务器变得不可用时,路由器能够把路由指向下一台最近的服务器。举例来说,如图2-3所示,如果服务器C因为网络或服务器本身出现故障而变得不可用了,那么路由器就会选择到达服务器A的路径,因为到达服务器A是倒数第二个代价最低的路由。从路由器的角度来看,它选择的是到达同一个目的地最优的路由。

任意播地址仅是根据它们提供的服务功能而定义的,而不是根据它们的格式,而且理论上来说可能是任何范围内的任何一个IPv6单播地址。但是,在RFC2526中定义了一个保留的任意播地址的格式。任意播地址在IPv4协议的网络中已经使用了一段时间,但是在IPv6协议中它们的定义才被正式化。

5.多播地址

多播地址标识的不是一台设备,而是一组设备——一个多播组(multicast group,或称为多播群)。发送给一个多播组的数据包可以由单台设备发起。因此,一个多播数据包通常包括一个单播地址作为它的源地址,一个多播地址作为它的目的地址。在一个数据包中,多播地址从来不会作为源地址出现。

一个多播组的成员可能只有一台单个的设备,也可能甚至是该网络上所有的设备。事实上,IPv6协议并不像IPv4协议那样有一个保留的广播地址,而是有一个保留的包含所有节点的多播组,实际上做相同的事情:所有接收它的设备都是属于该多播组。

多点传送实际上是IPv6协议的一个基本的操作,特别是对于即插即用特性的一些功能,例如路由器发现和地址自动配置等,这些功能是邻居发现协议的一部分。

IPv6多播地址的格式如图2-4所示。多播地址起始的8位总是全1,并且后跟的4位被指定作为标记位。这些标记位的前3位目前没有使用,全部设置为0。第4位用来指出这个地址是一个永久的、公认的地址(设为0),还是一个管理分配使用的暂时性的地址(设为1)。接下来的4位数字表示该地址的范围,如表2-2所示。表2-3中显示了几个保留的、公认的IPv6多播地址,所有这些地址都属于链路本地的范围。由于多播组总是一组独立的节点,因而在多播地址中的子网字段是不需要的,或者说是没有意义的。而最后的112位是用来作为zu组id(group id),标识各个不同的多播组。目前的用法是设置前面的80位为0,而只使用后面的32位。

... ... ...

6.嵌入的IPv4地址

有几种转换技术,将ipv4地址的网络转换成ipv6地址的技术,或者另外一种让两者共存的技术---要求ipv4的地址在ipv6地址环境中进行通信。

这里具体就不展开了;没遇到过;

IPv6包头格式

IPv6包头(Paekct Header)的格式如图2-5所示。这和IPv4的数据包头部有些明显的相像,也有些或明显的或细微的不同之处,IPv4的数据包头部请参见之前的文章。

...

• 版本(Version)——和IPv4的报头(Header)一样,是一个4位的字段,用来指出IP协议的版本。当然,在这里它被设置为0110,表明是版本6。

• 流量类别(TrafficClass)——是一个8位的字段,这相当于IPv4协议中的ToS字段。但是,考虑到ToS字段这些年的发展,现在都用来做区分服务等级(Differentiated Class of Service,DiffServ)了。所以,即使这个字段和旧的ToS字段有些相似,它们的名字要比所传送的值更能确切地反映目前的用处。

• 流标签(Flow Label)——是IPv6协议独有的字段,长度为20位。这个字段的设置目的是允许为特定的业务流打上标签;也就是说,数据包不仅仅始发于相同的源和到达相同的目的地,而且在源和目的地都属于相同的应用。区分不同的流可以带来几方面的优点,从可以提供更精细的服务类别区分的颗粒,到在平衡业务流量通过多条路径时可以确保属于同一个流的数据包能够总是转发到相同的路径上去,以便避免对数据包进行重新排序。流(或更精确地称为微分流,microflows)可以用源地址、目的地址加上源和目的端口的组合来确定。但是,为了识别源和目的端口,路由器必须能够看到IP报头的上层——TCP或UDP(或其他传输层协议)报头——这就增加了转发处理的复杂性,并可能会影响路由器的性能。由于IPv6的扩展报头,在IPv6的数据包里搜索传输层报头尤其会产生问题。一台IPv6的路由器比较分步通过可能存在的多个扩展报头来搜索传输层报头。

在发起一个数据包时,加上合适的流标签字段,路由器就能识别一个流,而不必进一步的查找数据包头部。

尽管如此,它还是作出了这样一个许诺——允许IPv6可以为像IP语音(VoIP)这样的应用提供比IPv4更好的服务质量保证(QoS)。

目前有关使用流标签字段的完整说明仍在争论,因此目前路由器,交换机还是忽略该字段。

• 有效载荷长度(Payload Length)——用来指定数据包所封装的有效载荷的长度,以字节计数。因为IPv4的报头包含可选字段和填充字段,因而它的报头长度是可变的。因此,为了得到IPv4数据包的有效载荷长度,必须用总长度字段的值减去报头长度字段的值。而另一方面,IPv6数据包头部长度总是固定的40字节,而且单从有效载荷长度字段就足以能得到有效载荷的起始和结尾了。在这里也请读者注意,尽管IPv4的总长度字段是16位的,但是IPv6的有效载荷长度字段却是20位。这意味着该字段能够指定更长的有效载荷(1048575字节,相对IPv4中只有65535字节)。因此,IPv6数据包本身在理论上来说具有传送更大的有效载荷的能力。

• 下一报头(Next Header)——指出了跟随该IPv6数据包头部后面的报头。在这里,这个字段和IPv4协议报头中的协议字段非常类似。事实上,当下一报头字段是一个上层协议报头时,其将用于同样的目的。与IPv4中的字段一样,这个字段也是8位的。但是,在IPv6协议中,跟随在该数据包头部后面的报头可能不是一个上层协议报头,而是一个扩展的头部(在下一节中讲述)。因此,从下一头部字段的命名上就可以反映出它具有更广泛的功能范围。

• 跳数限制(Hop Limit)——这个字段和IPv4协议中生存时间(TTL)字段在长度(都是8位)和功能上都是非常一致的。TTL字段的最初设想是,在数据包转发过程期间,当在路由器上排队等待时就用该字段的值减去相应的以等待的秒数为单位的计数值,但这一功能从来没有实现过。相反,路由器直接对TTL值进行减1,而不管该数据包在这台路由器上排队等待了多长时间(况且,在现代网络中,数据包在任何一个地方排队等待接近1s的时间都是非常不正常的)。因此,TTL事实上总是被用来作为衡量一个数据包到达目的地的路径中所能跨越的最大路由器跳数的工具。如果TTL值减少为0,那么该数据包就被路由器丢弃。跳数限制的功能也完全相同,但它的命名更加贴近了它的功能特点。

• 源地址和目的地址(Source and Destination Address)——这和IPv4协议中的源地址和目的字段是一样的,当然,在IPv6协议中,这些字段是128位的长度而已。

在IPv6报头中,很明显缺少的一个字段是IPv4报头中包含的校验和字段。在现代传输介质的可靠性全面提高的今天——当然无线传输或许是例外——由于上层协议通常携带它们自己的错误校验和恢复机制,IPv6报头本身的校验和就体现不出太多的价值了,因而就被去掉了。

IPv6扩展报头

... ...


对比IPv4和IPv6的报头,虽热原地址和目的地址字段的长度都是报头的4倍,但是IPv6报头本身的长度并不比IPv4报头长:IPv6报头长度为40字节,而IPv4报头最小长度为20字节。如果IPv4的可选字段也用来扩展应用,那么IPv4报头长度实际上比IPv6报头大;

除了可选项字段,其他的字段并不是很常用到,例如那些与分段有关的字段,从而在IPv6报头里就去掉了那些字段。因此,给定了固定长度并且排除了所有不携带每个数据包转发时所必要信息的字段,IPv6报头变得更加简洁和有效。但是,如果我们需要使用这些IP特性的某个可选项,例如分段、源路由选择或认证,我们又该怎么做呢?于是就在IPv6协议中,提供了一项可选的功能——扩展报头(extension header),在需要提供这些功能时可以添加在报头之后。例如,如果需要使用源路由选择、分段和认证等可选功能,那么就可以把它们各自需要增加的功能信息加载到3个扩展报头当中,就像图2-6所显示的那样。因为这些报头,IPv6数据包可以在以下两个方面提高效率:

• 数据包仅仅需要传送各自数据包所需要的信息,不需要传送用不到的字段。

• 可以通过定义新的扩展报头添加到IPv6数据包中来增加新的可选功能。

每一个扩展报头都像IPv6报头一样,有一个下一报头字段。因此,每一个报头都会告知是哪一个报头跟在它的后面。表2-4中显示了当前定义的扩展报头和它们下一报头的值。

... ...

例如,如图2-7所示,IPv6报头中下一报头字段的值表明它的下一个报头是一个路由选择扩展报头(43),这个报头的下一报头字段表示它的下一个报头是一个分段扩展报头(44),依此类推。最后一个扩展报头AH表示它的下一个报头是一个TCP报头(协议号为6)。

...

在RFC1883中描述了每一个扩展报头的格式。但是概括来说,每个扩展报头的功能如下:

• 逐跳可选项(Hop-By-Hop Options)——传送必须被转发路径中的每一个节点都检验处理的信息。例如,路由器告警和超大包有效载荷选项等。

• 路由选择(Routing)——通过列出在到达目的地的路径中数据包所要经过的节点列表来提供源路由选择的功能。

• 分段(Fragment)——是指在一个数据包被分段时用来为接收节点重组数据包提供必要的信息。在IPv4和IPv6数据包中有一个重要的不同是,只有发起该数据包的节点能够对数据包进行分段;而IPv6路由器对数据包并不分段。因此,发起该数据包的节点要么必须使用路径MTU发现(Path MTU Discovery,PMD)来得到该数据包到达目的地的路径上最小的MTU值,要么就从不发出大于1280字节的数据包。PMD将在后面讲述。IPv6协议规定运行IPv6的所有链路都必须能够支持最小1280字节大小的数据包。因此,发起数据包的节点如果可以选择的话,可以利用最小长度大小选项,而不用PMD。

• 封装安全有效载荷(Encapsulating Security Payload,ESP)——用于有效载荷的加密封装。

• 认证报头(Authentication Header,AH)——用于数据包必须在源与目的节点之间进行认证的情况。

• 目的地可选项(Destination Options)——用于传送仅仅被目的节点,或者可能是路由选择报头中列出的节点检验处理的信息。

如果使用扩展报头的话,在RFC1883中也规定了它们应该出现的顺序。这里严格规定,如果使用逐跳可选项的话,它必须直接跟在IPv6报头的后面,以便于它能够被必须处理它的传输节点很容易的发现。

建议的扩展报头顺序如下:

1.IPv6报头。

2.逐跳可选项。

3.目的地可选项(只有在路由选择报头中指定的中间路由器才必须处理这个报头)。

4.路由选择。

5.分段。

6.认证。

7.封装安全有效载荷。

8.目的地可选项(只有最后的目的节点必须处理这个报头)。

9.上层报头。