参考
http://tcpipguide.com
在 IPv6 中广播被移除了。
IPv4 存在的一个很大的问题便是地址空间太小了,即使后来我们用了如 NAT 的方法去解决他,但用 NAT 也使得一些功能被限制了,不管用什么方法也是无法解决 IPv4 地址空间太小,而人们的需求日益增加的基本问题。最简单有效的方法就是在下一代中扩大地址空间。
用一个字来概括 IPv6 的地址空间就是大!非常大!
IPv4 的地址长度为 32bits,所以最多有 4,294,967,296 个地址,而 IPv6 的地址长度达到了惊人的 128bits,最多可以有 340,282,366,920,938,463,463,374,607,431,768,211,456 个地址!
128bits 的长度使得 IPv6 地址写起来很长,即使用十进制表示也很长,所以一般用十六进制来表示 IPv6 地址。
Mixed Notation 用于表示最后 32bits 为嵌入式 IPv4 地址的 IPv6 地址,前 96bits 用冒号六进制表示,后 32bits 用 IPv4 的点十进制表示。
IPv6 地址通过开始的若干 bits 来指示地址类型 (用于指示的位数称为 FP, format prefix),这和 IPv4 分类寻址中使用前 1~4 bits 来区分的方式很像,但 IPv6 中的 FP 范围为 3~10。
IPv6 地址分配计划:
开头 | 配给 |
---|---|
0000 0000 | 未分配(包括环回地址等) |
0000 0001 | 未分配 |
0000 001 | 为 NSAP 地址分配保留 |
0000 01 | 未分配 |
0000 1 | 未分配 |
0001 | 未分配 |
001 | 全球单播地址 |
010 | 未分配 |
011 | 未分配 |
100 | 未分配 |
101 | 未分配 |
110 | 未分配 |
1110 | 未分配 |
1111 0 | 未分配 |
1111 10 | 未分配 |
1111 110 | 未分配 |
1111 1110 0 | 未分配 |
1111 1110 10 | 链路本地地址 (Link-Local Unicast Addresses) |
1111 1110 11 | 站点本地地址 (Site-Local Unicast Addresses) |
1111 1111 | 多播地址 |
字段名 | 长度 (bits) | 描述 |
---|---|---|
Prefix | 48 | Global Routing Prefix:含网络号用于路由,前三位为 001 表示为单播地址。 |
Subnet ID | 16 | Subnet Identifier:标识站点内部的子网。 |
Interface ID | 64 | Interface ID:一个接口的唯一标识。 |
从上面可以发现单播地址中最后 64bits 用作接口标识符,这么长的接口标识符当然不能随便浪费,因为几乎所有设备接口的物理地址长度都为 64bits 或更少,所以可以基于接口的物理地址来指定这个接口标识符,而不是用没有意义的数字作为接口标识符,这样做的好处有:使得网络更容易管理,我们不需要记录接口标识符和设备的对应关系,可以通过 MAC 地址得知 IP 地址,也可以通过 IP 地址得知其 MAC 地址。
从数据链路层地址到 IP 接口标识符的实际映射取决与特定的算法。当然,同一网络下所用的映射算法是相同的。
从 EUI-64 地址映射到 IP 接口标识很简单,只要将 EUI-64 的第七位从 0 改成 1 即可。
从 IEEE 802 MAC 地址映射到 IP 接口标识要先转换成 EUI-64 再将第七位改为 1。怎么将 IEEE 802 MAC 地址改成 EUI-64 呢?在 IEEE 802 MAC 地址的制造商 ID 和底板 ID 中间插入 1111 1111 1111 1110 (“FFFE” in hexadecimal) 即可。
不像 IPv4 中有很多小的保留地址块分布在整个地址空间中,IPv6 的保留地址在整个地址空间的“最前面”:开头为 “0000 0000” 的地址。之后要说的特殊地址有些就来自与这里。
私人地址的开头为 “1111 1110 1”,有两种类型:链路本地地址 (Link-Local Unicast Addresses) 和站点本地地址 (Site-Local Unicast Addresses) 。
这个地址的作用范围比站点本地地址小,它只在特定的物理网络中。路由器不会使用链路本地地址传输数据报。它可以用于地址配置或 ND 操作如地址识别 (address resolution) 和邻居发现 (neighbor discovery)。地址前缀为 “1111 1110 10”
这个地址可以在整个站点或组织范围内使用,路由器将在站内使用站点本地地址传输数据报,不会传到公共网络。地址前缀为 “1111 1110 11”。
和 IPv4 不同,IPv6 只有一个环回地址不再是一个地址块。地址为 0:0:0:0:0:0:0:1 (缩写 ::1)。
在 IPv4 中全为零的地址有特殊的含义:它指主机自己,在主机不知道自己的地址时使用。在 IPv6 中这一概念被正式化,全为零的地址称为未指定地址 (0:0:0:0:0:0:0:0,缩写为 “::” )。往往出现在设备配置自己的 IP 时询问的数据报的源地址。
因为不可能突然全球都使用 IPv6,需要一段时间来从 IPv4 过渡到 IPv6,这段时间里,IPv4 和 IPv6 是共存的。所以我们需要一个方法使得 IPv6 可以向下兼容 IPv4,于是就开发出了一种方案,允许 IPv4 地址嵌入到 IPv6 地址中,使得 IPv6 设备识别 IPv4 设备实现通信。因为 IPv6 的地址空间比 IPv4 的地址空间大得多,所以将 IPv4 嵌入进 IPv6 地址很容易实现。这种嵌入式地址是上面提到的保留地址块中的一部分,所以以 “0000 0000” 开头。有两种不同格式的嵌入式地址,两种地址的前 80bits 都为 0,并将 IPv4 嵌入进最后 32bits。不同之处在于中间剩余的 16bits。
组播允许一个设备发送数据报给一组接收者。组播地址开头为 “1111 1111” 。
字段名 | 长度 (bits) | 描述 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(Indicator) | 8 | 前 8bits 总为 "1111 1111" 表示这个地址为多播地址。 | ||||||||||||||||
Flags | 4 | 表明这个多播地址的一些特性。在现阶段前 3bits 未使用设为 0,第四位为 "T"(Transient) Flag,如果值为 0 则表明此多播地址永久分配,即众所周知的地址。如果设为 1 则表明此多播地址为临时地址,不是永久分配的。 | ||||||||||||||||
Scope ID | 4 | 这 4bits 用于定义此多播地址的作用范围,16 个不同的值,从 0 到 15。
|
||||||||||||||||
Group ID | 112 | 定义在每个不同范围级别的特殊组号 |
如下表所示,其中地址中的 “x” 为组播地址的 scope ID 字段。
组播地址模型 | Scope ID 可用值 | 名称 | 描述 |
---|---|---|---|
FF0x::0 | 0 ~ 15 | Reserved | Group ID 全为 0 的组播地址 |
FF0x::1 | 1, 2 | All Nodes | 当 Group ID 为 1 时,此地址为 scope ID 范围内所有节点的组播地址 |
FF0x::2 | 1, 2, 5 | All Routers | 当 Group ID 为 2 时,此地址为 scope ID 范围内所有路由器的组播地址 |
除了常规的组播地址以外,每个单播地址都有一个特殊的组播地址,叫做被请求节点组播地址。该地址是通过设备的单播地址特殊映射得到的。当同一网络的其他设备需要访问此设备时可以使用。用于邻居发现协议 (Neighbor Discovery, ND) 以提供比 IPv4 中 ARP 更高效的地址解析。
所有被请求节点组播地址的 T flag 值为 0,scope ID 为 2。Group ID 中前 80bits 为 0:0:0:0:1,接着 8bits 全为 1 (FF),最后 24bits 为其单播地址的最后 24bits。
任播是出现在 IPv6 的一种新的 IP 地址。我们可以认为是一种介于单播和组播之间的地址。单播是将数据报发送到一个接口;组播是将数据报发送到一个组的所有成员;而任播是将数据报发送到一个组的随便一个成员。实际上是发送到组里最容易到达的成员,即最近的那个成员。
组成部分 | 长度 (bytes) | 描述 |
---|---|---|
Main Header | 40 | 每个数据报包含源地址、目的地址和一些必须的重要信息 |
Extension Headers | 可变的 | 每个 Extension Headers 都包含一种类型的扩展信息,以支持各种功能,如分片、源路由、安全性和各种选项 |
Data | 可变的 | 装载来自上层要传输的信息 |
字段名 | 长度 (bytes) | 描述 |
---|---|---|
Version | 0.5 | 生成该数据报所用 IP 协议的版本。IPv6 中值为 6 (二进制 0110)。 |
Traffic Class | 1 | 指示 IPv6 数据流通信类别或优先级,与 IPv4 中的 TOS 相似,但使用 Differentiated Services (DS)。 |
Flow Label | 2.5 | 该标签为实时数据传输和服务质量功能提供额外支持。路径上的路由器可以根据该标签对数据流进行区分和处理。不是所有路由器和设备都支持流标签处理,该字段是可选的。 |
Payload Length | 2 | 该字段代替了 IPv4 中的 Total Length,但和 Total Length 不同,它测量的不是整个数据报的长度,而只是扩展头和荷载的字节数,即整个数据报的长度减去 40bytes 的主头部。 |
Next Header | 1 | 该字段代替了 IPv4 中的 Protocol。有两个用处,当数据报有扩展头时,该字段指向地一个扩展头,当数据报没有没有扩展头时,该字段和 IPv4 中的 Protocol 一样。 |
Hop Limit | 1 | 该字段代替了 IPv4 中的 TTL。这个名字更好的反映了 TTL 的实际工作方式,因为 TTL 实际上是计算跳数,而非时间。 |
Source Address | 16 | 源地址 |
Destination Address | 16 | 目的地址 |
下一报头是 IPv6 数据报中新加入的一个重要字段。该字段包含一个表示第一个扩展头的标识符,扩展头又有自己的下一报头字段指向它的下一个扩展头,最后一个扩展头的下一报头字段则指出上层协议。
值(十六进制) | 协议 / 扩展头 |
---|---|
00 | 逐跳选项 (Hop-By-Hop Options) 扩展头 |
01 | ICMPv4 |
02 | IGMPv4 |
04 | IP in IP Encapsulation |
06 | TCP |
08 | EGP |
11 | UDP |
29 | IPv6 |
2B | 路由 (Routing) 扩展头 |
2C | 分片 (Fragmentation) 扩展头 |
2E | 资源预留协议 (RSVP) |
32 | ESP 扩展头 |
33 | AH 扩展头 |
3A | ICMPv6 |
3B | 没有下一报头 |
3C | 目的选项 (Destination Options) 扩展头 |
IPv6 数据报扩展头通过下一报头字段形成一个链式结构。所有扩展头的长度必须为 8bytes 的整数倍。
下一报头值(十进制) | 扩展头名 | 长度 (bytes) | 描述 |
---|---|---|---|
0 | Hop-By-Hop Options | 可变的 | 定义一组选项,这些选项用于传输路径上所有设备进行检查 |
43 | Routing | 可变的 | 指定数据报传输的路由,相当与 IPv4 中的 loose source routing option。 |
44 | Fragment | 8 | 当数据报仅为原始消息的片段时,包含此扩展头,它包含 IPv6 主报头去除的 Fragment Offset, Identification 和 More Fragment 字段的信息。 |
50 | ESP | 可变的 | 携带用于安全通信的加密数据。 |
51 | AH | 可变的 | 包含确保加密数据可靠性的信息。 |
60 | Destination Options | 可变的 | 定义一组选项,这些选项仅用于检查目的。 |
字段名 | 长度 (bytes) | 描述 |
---|---|---|
Next Header | 1 | 同主报头的下一报头字段。 |
Header Extension Length | 1 | 以 8-byte 为一单位,指出该扩展头的长度,不包含该头的前 8bytes。 |
Routing Type | 1 | 该字段允许定义多种路由类型,现阶段唯一使用值为 0。 |
Segments Left | 1 | 指定到目的之前路由中剩余的显式命名节点数。 |
Reserved | 4 | 还未使用,设为 0。 |
Address1 ~ AddressN | 可变的(16 的倍数) | 一组用于指定路由的 IPv6 地址。 |
字段名 | 长度 (bits) | 描述 |
---|---|---|
Next Header | 8 | 同上 |
Reserved | 8 | 保留,还未使用,设为 0。 |
Fragment Offset | 13 | 指定数据报片段在原始信息中的偏移量或位置,以 8bytes 为一单位,和 IPv4 中的 Fragment Offset 字段相同。 |
Res | 2 | 保留,还未使用,设为 0。 |
M Flag | 1 | 同 IPv4 中的 More Fragments Flag。当设为 0 时表示该片段为原始信息的最后一个片段,反之则表示后面还有其他片段。 |
Identification | 32 | 同 IPv4 中的 Identification 字段,不同的是扩展到 32bits。 |
每个扩展头在任何数据报中之出现一次(Destination Options 例外)。当有多个扩展头时,它们在主报头之后和数据报的上一层协议报头之前按以下顺序排列:
IPv6 通过用扩展头包装选项的方式实现了 IPv4 报头中的选项字段。
IPv6 中有两种选项扩展头:Hop-By-Hop Options 和 Destination Options。它们仅在包含的选项如何由设备处理方面有所不同,它们的格式和使用方式都是相同的。
IPv6 Hop-By-Hop Options and Destination Options Header Formats:
子字段名 | 长度 (bytes) | 描述 | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Option Type | 1 | 表示该选项的类型
|
||||||||||||||||||||||
Opt Data Len | 1 | 指出接下来的 Option Data 字段的长度 | ||||||||||||||||||||||
Option Data | 可变的 | 选项数据 |
IPv6 与 IPv4 在 MTU,分片和重组上的不同:
IPv6 数据报被分为两部分:
数据报碎片: