IPv6地址格式
IPv6地址是一个128比特的无符号整数,用来标识一个或多个网络接口,如240c::0001、fe80::28ae:d1b2:da61:102a等。
与IPv4不同,一个网络接口可以存在一个或多个IPv6地址。
IPv6前缀对应IPv4子网掩码。
IPv6地址表示
IPv6地址传统的文本表示是以十六进制书写的,用“:”分割的8个16比特段来表示。
如:12:34:56:78:9A:BC:DE:FF
RFC4291中表示:
-
十六进制与大小无关。
如:12: 34: 56: 78: 9A: BC: DE: F0与12: 34: 56: 78: 9a: bc: de: f0一致。
-
可以将连续的全零字段合并,写成压缩的“::”形式,避免二义性,“::”只能出现一次。
如:2001:0:0:1:0:0:2:2,可以写成2001::1:0:0:2:2或2001:0:0:1::2:2,但不能写成2001::1::2:2。
-
IPv6网络前缀的文本表示为IPv6地址/前缀长度。前缀长度是一个十进制,用来表示前缀的前导比特长度。
如:2001:0:0:1:0:0:2:2/64。仅表示前缀(非地址)时,等价与2001:0:0:1::/64。
基于RFC4291的文本灵活性(即单个地址有多种表示方式)导致数据筛选困难、部分应用不兼容等问题,引入RFC5952进行补充。
-
必须抑制前导零。
如:2001:0db8::0001 是不可接受,必须表示为 2001:db8::1。单个16位 0000 字段必须表示为 0。
-
“::”的用法
-
必须最大限度地使用符号“::”。
如:2001:db8:0:0:0:0:2:1,必须缩短为 2001:db8::2:1。同样,2001:db8::0:1 也是不可接受的,因为符号“::”可以用来生成更短的表示 2001:db8::1。
-
符号“::”不得仅用于缩短一个 16 位 0 字段。
如:2001:db8:0:1:1:1:1:1,表示2001:db8::1:1:1:1:1 是不正确的。 -
当“::”的位置有其他选择时,最长的连续 16 位 0 字段必须缩短。
如:2001:0:0:1:0:0:0:1,具有三个连续零字段,表示2001:0:0:1::1是正确的,但2001::1:0:0:0:1是不正确的。
-
当连续 16 位 0 字段的长度相等(即),第一个零序列位必须缩短。
如:2001:db8:0:0:1:0:0:1,表示2001:db8::1:0:0:1 是正确的,表示2001:db8:0::0:1::1 是不正确的。
-
-
IPv6 地址中的字符“a”、“b”、“c”、“d”、“e”和“f”必须以小写形式表示。
-
其他请参考RFC5952:A Recommendation for IPv6 Address Text Representation
IPv6地址分类
-
单播(unicast):标识一个网络接口;目标为一个单播地址的分组会被传送到一个网络接口上去。
其中单播地址分为3中类型范围:链路本地(link-local)、站点本地(site-local)和全局(global)范围。
-
任播(anycast):标识一组网络接口,但目标为一个任播地址的分组只会被送到那组中的一个接口去。
-
多播(multicast):标识一组网络接口,指网络中一个节点发出的信息被多个节点收到,这些接口可能属于不同的节点。目标为多播地址的分组会被传送给那个组中的所有的成员。不能作为源地址使用。
-
环回地址(Loopback):不分配给任何物理接口。它被视为具有
Link-Local 范围,并且可以被认为
是虚拟接口(通常称为“环回
接口”)的 Link-Local 单播地址,连接到无处可去的假想链路 -
不确定地址(Unspecified):不确定地址不能分配给任何节点,它表示没有地址。其使用的一个示例是在初始化主机通过DAD获知自己的地址之前发送的任何 IPv6 数据包的源地址字段中。
注意:IPv6没有广播地址。原因之一:网络层的广播地址通常会造成链路级的广播,这样影响到附属链路中的所有设备,甚至包括那些根本不支持特定网络协议的设备。它的功能被多播地址所取代
各地址范围如下:
地址类型 | 二进制表示 | IPv6表示 |
---|---|---|
不确定地址 | 00…0(128 bits) | ::/128 |
回环地址 | 00…1(128 bits) | ::1/128 |
多播地址 | 111111111 | FF00::/8 |
本地链路地址 | 1111111010 | FE80::/10 |
全球单播地址 | 上述几种之外的所有地址 |
任播地址取自单播地址空间(任何范围)并且在语法上与单播没有区别地址。
单播
单播地址分为3中类型范围:链路本地(link-local)、站点本地(site-local)和全局(global)范围。
链路本地
链路本地地址只在分配地址的接口所附接的网络链路上有效。要求每个支持IPv6的接口都至少要有一个链路本地地址。
链路本地地址(fe80::/10) | ||
---|---|---|
10 bits | 54 bits | 64 bits |
1111111010 | 0 | 接口标识符 |
范围区域
按照范围的拓扑结构连接起来的区域被称为范围区域(scope zone)或简称为区域(zero)。
每个IPv6地址都属于且只属于一个对应于其地址范围的区域,即一个范围区域IPv6地址是唯一的。
链路本地区域(或链路区域)就是由一条特定的网络链路和连接到那条链路上的多个接口组成的,赋给一个接口的链路本地地址就属于一个特定的链路本地区城,如图A与B属于不同的链路区域。
图1:
图2:
图2拓扑存在的问题:当路由需要与fe80::1(非全局地址)进行交互时,不能识别出需要发往A还是发往B。
地址的唯一性只能在相应的区域内得到保证(图1),范围受限地址在其范围区域边界上就具有二义性(图2),故引入区域ID的概念。
区域ID文本表示
-
定义了一种IPv6地址的基本文本表示形式的扩展,如下所示:
< address >%< zone id >
其中:
< address >是IPv6地址。
< zone id >是用来标识地址区域的字符串。
%是用来区分< address >和< zone id >的分隔字符。
形式为: fe80::1%1,表示fe80::1地址的区域ID为1。
-
还允许特有的方式来表示< zone id >部分:
将接口名作为链路ID:
形式为:fe80::1%eth0,表示fe80::1地址的接口名为eth0。
-
KAME内核中还使用了另外一种区域ID:
整体转换如下:
嵌入ID:如上所述地址中嵌入区域ID,如fe80::1区域ID为1,嵌入后变成fe80:1::1。
sin6_scope_id:表示在结构体中sockaddr_in6{}结构体中设置sin6_scope_id=1。
站点本地地址
站点本地地址(fec0::/10) | ||
---|---|---|
10 bits | 54 bits | 64 bits |
1111111011 | 子网ID | 接口标识符 |
IPv6 工作组概述了当前站点本地寻址范围的几个缺陷。这些缺陷分为两大类:地址模糊和站点定义模糊。
因此在RFC3879:Deprecating Site Local Addresses中对站点单播进行废弃,将fec0::/10纳入进全球单播地址中,但仍然保留站点地址的多播地址。
全局范围
全局地址在整个因特网范围有效。
普通全球地址 | ||
---|---|---|
n bits | 64-n bits | 64 bits |
全局路由前缀 | 子网ID | 接口标识符 |
任播
它的最初语义是,在 IP 网络上通过一个 Anycast 地址标识一组提供特定服务的主机,同时服务访问方并不关心提供服务的具体是哪一台主机(比如 DNS 或者镜像服务),访问该地址的报文可以被 IP 网络路由到这一组目标中的任何一台主机上,它提供的是一种无状态的、尽力而为的服务。
与多播不同的是,任播在一组接口中取得最优的解进行服务,而多播是无差别对一组接口进行交互。即任播为1对1(多个中选出最优的1个),而多播是1对多。
RFC2526:Reserved IPv6 Subnet Anycast Addresses对任播子网进行说明。
维基百科:在互联网中,通常使用边界网关协议(BGP)来实现任播。
多播
多播地址格式:
8 bits | 4 bits | 4 bits | 8 bits | 8 bits | 64 bits | 32 bits |
---|---|---|---|---|---|---|
11111111 | 标志 | 范围 | 保留 | 前缀长度 | 网络前缀 | 组ID |
标志(flags):标识了组的分配属性。
1 bit | 1 bit | 1 bit | 1 bit |
---|---|---|---|
0 | R标志 | P标志 | T标志 |
保留 必须为0 | 进一步基于网络前缀分配的多播地址。R=1时P、T必须为1 | P=1 基于网络前缀分配的多播地址,与多播地址格式中的8bits前缀长度、64bits网络前缀长度搭配使用,P=1时T必须为1 P=0 不是基于网络前缀分配的多播地址 | T=0 永久地址,由IANA分配的 T=1 动态分配 |
通常R标志、P标志位均为0。
详细可参考:
R标志:RFC3306:Unicast-Prefix-based IPv6 Multicast Addresses
P标志:RFC3956:Embedding the Rendezvous Point (RP) Address in an IPv6 Multicast Address
范围(scope):说明了地址范围的类型。
0 | 保留 |
---|---|
1 | 接口本地 |
2 | 链路本地 |
3 | 保留 |
4 | 管理本地 |
5 | 站点本地 |
6 | 未分配 |
7 | 未分配 |
8 | 组织本地 |
9 | 未分配 |
A | 未分配 |
B | 未分配 |
C | 未分配 |
D | 未分配 |
E | 全局 |
F | 保留 |
前缓长度(plen)和网络前级(network prefix)字段对某些类型的多播地址有效,标识了拥有这个多播地址的IPv6单播子网。
组ID(group ID):标识了一个特定的多播组。
保留(reserved)字段必须为零。
Pv6地址体系结构规范定义了一些特殊的多播地址:
- 所有节点多播地址(all-nodesmulticast addresses)
所有节点多播地址 | |
---|---|
ff01:0:0:0: 0:0:0:1 | 接口本地范围 |
ff02:0:0:0:0:0:0:1 | 链路本地范围 |
- 所有路由器多播地址(all-routers multicast addresses)
所有路由器多播地址 | |
---|---|
ff01:0:0:0:0:0:0:2 | 接口本地范围 |
ff02:0:0:0:0:0:0:2 | 链路本地范围 |
ff05:0:0:0:0:0:0:2 | 站点本地范围 |
- 请求节点多播地址(solicited-node multicast addresses)
请求节点多播地址 | |
---|---|
fe02:0:0:0:0:1:ff00::/104 | 请求节点多播地址 |
如:2001:db8:7654:3210:fedc:ba98:7654:3210那么相应的请求节点多播地址为ff02:0:0:0:0:1:ff54:3210。
原地址 | 2001:db8:7654:3210:fedc:ba98:76 | 54:3210 |
---|---|---|
请求节点多播地址前缀 | ff02:0:0:0:0:1:ff | |
请求节点多播地址 | ff02:0:0:0:0:1:ff | 54:3210 |
进行邻居发现和重复地址检测(DAD)时,要求节点加入请求节点多播地址组。
接口标识符
IPV6地址的接口标识符部分可以手工配置也可以自动配置。
不管采用哪种配置方法,在接口所连接的链路上,接口标识符都必须是唯一的。
EUI-64的生成
EUI-64 格式:
u/l位(全局/本地比特) | |
---|---|
0 | 本地管理 |
1 | 全局管理 |
i/g位(组/个体比特) | |
---|---|
0 | 个人地址(单播) |
1 | 组地址(多播) |
IEEE EUI-64通过MAC-48第23位中插入0xfffe生成。
当从 IEEE EUI-64 标识符形成IPv6接口标识符时,称为修改的EUI-64:
修改的EUI-64中“u”位设置为1以表示全局范围,设置为零 0以表示本地范围,与 IEEE EUI-64刚好相反。
通过反转“u”位(IEEE EUI-64 术语中的全局/本地位)来形成修改的 EUI-64 格式接口标识符。
如MAC-48的网卡:00-60-97-8f-6a-4e那么转换后得到02-60-97-ff-fe-8f-6a-4e。
参考
RFC
当前标准:
RFC4291:IP Version 6 Addressing Architecture
围绕RFC4291进行补充:
RFC5952:A Recommendation for IPv6 Address Text Representation
RFC7136:Significance of IPv6 Interface Identifiers
RFC7346:IPv6 Multicast Address Scopes
RFC7371:Updates to the IPv6 Multicast Addressing Architecture
RFC8064:Recommendation on Stable IPv6 Interface Identifiers
RFC4007: IPv6 Scoped Address Architecture
废弃标准:
RFC3513:Internet Protocol Version 6 (IPv6) Addressing Architecture
RFC2373:IP Version 6 Addressing Architecture
RFC1884:IP Version 6 Addressing Architecture
废弃标准:
RFC3513:Internet Protocol Version 6 (IPv6) Addressing Architecture
RFC2373:IP Version 6 Addressing Architecture
RFC1884:IP Version 6 Addressing Architecture
书籍
《IPv6详细卷1:核心协议实现》