1. IPv6 的分组结构:
IPv6 包由 IPv6 基本包头(40 字节固定长度)、扩展包头和上层协议数据单元三部分组成。
(1) IPv6 的基本包头。
IPv6 包头长度固定为 40 字节,去掉了 IPv4 中一切可选项,只包括 8 个必要的字段。因此,尽管 IPv6 地址长度为 IPv4 的四倍,但 IPv6 包头长度仅为 IPv4 包头长度的两倍。基本头部的格式如图 3-18 所示。
各个字段具体如下。
版本号(Version):4 位,IP 协议版本号,值=6。
● 通信类别(Traffic Class):8 位,指示 IPv6 数据流通信类别或优先级。功能类似于 IPv4 的服务类型(TOS)字段。
● 流标记(Flow Label):20 位,IPv6 新增字段,标记需要 IPv6 路由器特殊处理的数据流。该字段用于某些对连接的服务质量有特殊要求的通信,诸如音频或视频等实时数据传输。在 IPv6 中,同一信源和信宿之间可以有多种不同的数据流,彼此之间以非“0”流标记区分。如果不要求路由器做特殊处理,则该字段值置为“0”。
● 有效负荷长度(Payload Length):16 位负荷长度。有效负荷长度包括扩展头和上层 PDU,16 位最多可表示 65535 字节负荷长度。超过这一字节数的负荷,该字段值置为“0”,使用扩展头逐个跳段(Hop-by-Hop)选项中的巨量负荷(Jumbo Payload)选项。
● 下一报头(Next Header):8 位,识别紧跟 IPv6 头后的包头类型,如扩展头(有的话)或某个传输层协议头(诸如 TCP、UDP 或 ICMPv61)。
● 跳限制(Hop Limit):8 位,类似于 IPv4 的 TTL(生命期)字段,用包在路由器之间的转发次数来限定包的生命期。包每经过一次转发,该字段减 1,减到 0 时就把这个包丢弃。
● 源地址(Source Address):128 位,发送方主机地址。
● 目标地址(Destination Address):128 位,在大多数情况下,目标地址即信宿地址。但如果存在路由扩展头的话,目的地址可能是发送方路由表中下一个路由器接口。
(2) IPv6 的扩展头部。
IPv6 包头对原 IPv4 包头的一项重要改进是将所有可选字段移出 IPv6 包头,置于扩展头中。除 Hop-by-Hop 选项扩展头外,其他扩展头不受中转路由器检查或处理,从而提高路由器处理包含选项的 IPv6 分组的性能。
通常,一个典型的 IPv6 包,没有扩展头。仅当需要路由器或目的节点做某些特殊处理时,才由发送方添加一个或多个扩展头。与 IPv4 不同,IPv6 扩展头长度任意,不受 40 字节限制,以便于日后扩充新增选项,这一特征加上选项的处理方式,使得 IPv6 选项能得以真正的利用。为了提高处理选项头和传输层协议的性能,扩展头总是 8 字节长度的整数倍。
目前,RFC2460 中定义了以下 6 个 IPv6 扩展头:Hop-by-Hop(逐个跳段)选项包头、目的地选项包头、路由包头、分段包头、认证包头和 ESP 协议包头。
① Hop-by-Hop 选项包头:包含分组传送过程中,每个路由器都必须检查和处理的特殊参数选项。其中的选项描述一个分组的某些特性或用于提供填充。这些选项具体如下。
Padl 选项(选项类型为 0),填充单字节。
PadN 选项(选项类型为 1),填充 2 个以上字节。
Jumbo Payload 选项(选项类型为 194),用于传送超大分组。使用 Jumbo Payload 选项时,分组有效载荷长度最大可达 4294967295 字节。负载长度超过 65535 字节的 IPv6 包称为“超大包”。
路由器警告选项(选项类型为 5),提醒路由器分组内容需要做特殊处理。路由器警告选项用于组播收听者发现和 RSVP(资源预定)协议。
② 目的地选项包头,指名需要被中间目的地或最终目的地检查的信息。有两种用法。
● 如果存在路由扩展头,则每一个中转路由器都要处理这些选项。
● 如果没有路由扩展头,则只有最终目的节点需要处理这些选项。
③ 路由包头。
类似于 IPv4 的松散源路由。IPv6 的源节点可以利用路由扩展包头指定一个松散源路由,即分组从信源到信宿需要经过的中转路由器列表。
④ 分段包头。
提供分段和重装服务。当分组大于链路最大传输单元(MTU)时,源节点负责对分组进行分段,并在分段扩展包头中提供重装信息。
⑤ 认证包头。
提供数据源认证、数据完整性检查和反重播保护。认证包头不提供数据加密服务,需要加密服务的数据包,可以结合使用 ESP 协议。
⑥ ESP 协议包头。
提供加密服务。
(3) IPv6 数据包。
上层协议数据单元。上层数据单元即 PDU,全称为 Protocol Data Unit。PDU 由传输头及其负载(如 ICMPv6 消息或 UDP 消息等)组成。而 IPv6 包有效负载则包括 IPv6a 扩展头和 PDU,通常所能允许的最大字节数为 65535 字节,大于该字节数的负载可通过使用扩展头中的 Jumbo Pay load 选项进行发送。
2. IPv6 地址的表示方法:
IPv6 地址有 3 种表示方法:冒号十六进制表示法(首选格式),由所有 32 个十六进制字符组成一个 IPv6 地址,是书写形式最长的表示方法;IPv6 地址的零压缩表示法,当 IPv6地址中有 0 值时的表示方法;内嵌 IPv4 的 IPv6 地址表示法。
(1) 冒号十六进制表示法(首选表示法)。
冒号十六进制表示法(Colon Hexadecimal)是 IPv6 地址的完全形式,又称 IPv6 地址的首选表示法。这种方法用冒号将 128 位分割成 8 个 16 位的段,每段被转换成一个 4 位十六进制数,并用冒号隔开。也就是说,这种表示方法有 8 个字段,每个字段有 4 个十六进制数,
共有 32 个十六进制数。
格式为 X:X:X:X:X:X:X:X。
其中,X 代表十六进制数值。
例如,2254:cade:23ef:cdae:ad54:cda3:3340:bacd。
(2) 零压缩表示法。
当 IP 地址中有 0 值时,有两种压缩表示法。这两种方法可以分别使用,也可以同时使用。
① 一种零压缩表示法。
若在一个以冒号十六进制表示法表示的 IPv6 地址中有多个连续字段的值都是 0,这些0 可以简记为“::”,表示有多组 16 位零。这种零压缩法又称为双冒号法(Double Colon)。“::”只能在一个地址中出现—次,可用于压缩一个地址中的前导、末尾或相邻的 16 位零。
例如,IP 地址 ace5:1:0:0:0:0:0:36cd,可以表示为 ace5:1::36cd。
注意:若 IPv6 地址是一个全为 1 的地址,则不能压缩。
② 第二种零压缩表示法。
当 IPv6 地址中存在一个或多个前导 0 的 16 位十六进制字段时,可以使用 16 位字段的前导压缩法,即第二种零压缩表示法。用这种方法表示 IPv6 地址时,每个字段的前导 0可以简单去除,以缩短 IPv6 地址的书写长度。但是,如果 16 位字段的每个十六进制数都是 0,则至少要保留一个 0。
例如,IPv6 地址 0000:0000:0000:0000:0000:0000:0000:0000,可表示为 0:0:0:0:0:0:0:0;
IPv6 地址 0000:0000:0000:0000:0000:0000:0000:0001,可表示为 0:0:0:0:0:0:0:1。
③ 两种压缩表示法的结合。
将两种零压缩表示法相结合,即同时压缩连续的 0 的 16 位字段和压缩 16 位字段中的前导 0,可以缩短 IPv6 地址的书写长度。
例如,IPv6 地址 0000:0000:0000:0000:0000:0000:0000:0000,
可表示为:::IPv6 地址 0000:0000:0000:0000:0000:0000:0000:0001,
可表示为::1。