1、IPv6地址语法
IPv6地址在计算机中用128位二进制数表示,但是为了增加可读性通常使用十六进制表示。
由于IPv6地址空间巨大,会经常出现连续的0。为简化书写,可以将连续的0用“::”进行缩写。在读取时,再将“::”展开为连续的0,直到将IPv6地址填充为128位。所以一个IPv6地址中只能出现一次“::”。
2、IPv6地址结构
一个完整的IPv6地址由前缀、接口标识和前缀长度组成。
1、前缀也称为网络标识符,与IPv4地址中的网段地址具有相同的意义,用于标识一个网段。其长度由前缀长度指定。
2、接口标识与IPv4地址中主机号具有相同的意义,用于标识网络上一个节点的网络接口。其长度=128-前缀长度
3、前缀长度,指明前缀字段在IPv6地址中的长度。一般是64位长度,也可以是其它长度。取值范围:0-128。当长度为0时,代表所有网段(如下图2)。当长度为128时,代表一个无子网的唯一地址。
3、IPv6地址分类
RFC2373中定义了地址空间及分配情况。目前已分配的地址不足20%,预留了足够的地址空间备用。下表列出了常用地址空间:
| 用途 | 空间定义 | 地址前缀 | 适用范围 | 占比 |
|---|---|---|---|---|
| 全球单播地址(GUA) | 001 | 2000::/3 | 全球唯一 可在公网路由转发 | |
| 本地链路地址(LLA) | 1111 1110 10 | FE80::/10 | 仅用于本地链路 | |
| 唯一本地地址(ULA) | 1111 110 | FC00::/7 | 作用 | |
| 多播地址 | 1111 1111 | FF::/8 | 作用 |
3.1 单播地址
1. 全球单播地址(GUA: Global Unique Address)
- 地址定义: 全球单播地址前3个bit固定为“001”。
- 地址区间: 2000:: - 3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF。
- 地址用途: 可以被所有路由器转发,用于全球范围的通信。也就是公网地址。
- 其它说明: 经过公网转发的两个通信设备之间应该采用全球单播地址。如果没有全球单播地址,是无法直接与公网设备通信的。2002::/16属于全球单播地址,但具有特殊用途。专用于6to4隧道,隧道技术在其它章节详细介绍。
2. 本地链路地址(LLA: Link Local Address)
- 地址定义: 本地链路地址前10个bit固定为“1111 1110 10”,和接下来54bit的“0”共同组成64位前缀。接下来的64位接口标识符通常由EUI-64规范生成。
- 地址区间: FE80::/64 - FE80::FFFF:FFFF:FFFF:FFFF/64。
- 地址用途: 本地链路地址是在接口Link-UP后自动配置的,用于局域网内通信。局域网的称呼并不准确,但便于理解。本地链路地址不能被三层路由转发,只能在同网段内二层转发。用于获取到全球单播地址前在局域网内通信,比如获取全球单播地址,地址冲突检测等。
- 其它说明: 本地链路地址生成通常使用EUI-64规范生成,而EUI-64是基于EUI-48生成。EUI-48也就是MAC地址,由24位制造商ID和24位网卡ID组成。EUI-64是在制造商ID和网卡ID之间插入“FFFE”,并将U/L位(从高位开始的第7位)置“1”。单播MAC U/L位为“0”,需要注意。
3. 唯一本地地址(ULA: Unique Local Addresses)
| 1111 110 | L | 全局ID | 子网ID | 接口ID |
|---|---|---|---|---|
| 7Bit | 1Bit | 40Bit | 16Bit | 64Bit |
- 地址定义: 唯一本地地址前7个bit固定为“1111 110”。接下来的1 bit(L位)置1,表示本地分配的前缀,置0的场景未定义,预留暂不使用。所以前8bit就固定成“1111 1101”,即0xFD。接下来40bit是全局ID,表示一个站点(如校园,公司等)。接下来的16bit是子网ID,即,最多可以划分65536个子网。最后的64bit为接口ID。
- 地址区间: FD::/64 - FDFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF/64。
- 地址用途: ULA地址的应用范围是本地站点内部,不能在全球范围使用。类似于IPv4地址空间中的10.0.0.0/8等私网地址,可以在公司、校园内部划分子网,并进行路由转发,但不能在全球范围内使用。与本地链路地址不同,不能自动生成,需要通过有状态或者无状态自动配置方式进行获取。ULA地址在站点内部可以随意使用,无需全球分配。
- 其他说明: ULA地址前8个bit可以认为是固定的0xFD,和接下来自定义的40bit全局ID及16bit子网ID,共同组成64 bit的前缀。接口ID通常自动生成。
3.2 任播地址
任播地址本质上还是单播地址,不同的是任播地址用来标识一组网络接口。这组接口通常位于不同的设备上,当向一个多播地址发送数据,会根据接口组中的距离选择最近的一个设备进行转发。并不是转给该地址的所有接口,而是选择其中一个。
例如:DNS服务器配置任播地址后,在不同位置的设备向相同的DNS服务器发送报文时会选择离自己最近的设备进行解析。这样可以节省解析时间,提升业务体验。
3.3 多播地址
多播地址即组播地址,同IPv4组播一样,一个地址标识一组网络接口。接口组的划分并非人为指定,而是通过业务区分。例如:提供IPv6地址分配业务的DHCPv6服务器,分配IPv6前缀的路由器,观看CCTV1电视节目的用户。
当服务器提供相应服务时,会自动加入相应的组播组。当路由器提供前缀分配时,也会自动加入对应的组播组。观看CCTV1时,会主动加入相应的组播组。
需要注意的是由于IPv6地址空间太大,取消了广播的概念。但是广播寻址的功能未取消,只是被多播地址替代。每个设备默认加入ff02::1组播组,当需要向同网络内所有设备发送报文,只需向ff02::1组播组发送报文即可。三层(IP层)虽然有变化,但与IPv4共用的二层(以太层)无变化。
- 地址定义:
最高位的8个bit固定为0xFF,接下来是4Bit的Flags,4Bit的Scope和112Bit的Group ID。
Flags中的T、P、R标志位:
T标志: RFC4291中定义普通组播地址的格式。也是最常用的一种格式。
| 8 | 4 | 4 | 112 bits | +--------+----+----+------------------------------------------+ |11111111|flgs|scop| group ID | +--------+----+----+------------------------------------------+ / \ +-+-+-+-+ |0|R|P|T| Flags字段定义 +-+-+-+-+Flags字段(4Bit)最低bit是T标志位,最高的bit未使用,应该置0。
当 T = 0 时,表示当前的组播地址是由永久地址(即知名地址)
当 T = 1 时,表示当前的组播地址是临时组播地址(非永久分配地址)。
P标志: RFC 3306中定义一种新格式,该格式将单播前缀信息合并到组播地址中。
| 8 | 4 | 4 | 8 | 8 | 64 | 32 | +--------+----+----+--------+--------+----------------+----------+ |11111111|flgs|scop|reserved| plen | network prefix | group ID | +--------+----+----+--------+--------+----------------+----------+当 P = 0 时,表示组播地址不是基于网络前缀的组播地址。这指示如[ADDRARCH]中定义的组播地址。
当 P = 1 时,表示组播地址是基于网络前缀分配的组播地址。如果 P = 1,则 T 必须设置为 1,否则 T 位的设置由RFC4291第2.7节定义。
R标志: RFC3956定义了指定源(RIID)的单播前缀嵌入组播地址的方法。
| 8 | 4 | 4 | 4 | 4 | 8 | 64 | 32 | +--------+----+----+----+----+----+----------------+----------+ |11111111|flgs|scop|rsvd|RIID|plen| network prefix | group ID | +--------+----+----+----+----+----+----------------+----------+如果R = 1,表示多播地址是嵌入了RP(Rendezvous Point,即共享树中的会合点)的地址。因此,P必须设置为1,T也必须设置为1。这意味着前缀为FF70::/12。在这种情况下,先前保留字段的后4位被定义为RP接口ID。
如果R = 0,表示多播地址不嵌入RP地址,并遵循[RFC4291]和[RFC3306]中定义的结构。在这种情况下,“RIID”的值必须为零,并且在接收时必须被忽略。
Scope的定义: Scop是一个4位多播范围值,用于限制多播组的范围。
0 reserved 1 Interface-Local scope 2 Link-Local scope 3 reserved 4 Admin-Local scope 5 Site-Local scope 6 (unassigned) 7 (unassigned) 8 Organization-Local scope 9 (unassigned) A (unassigned) B (unassigned) C (unassigned) D (unassigned) E Global scope F reserved
3.4 未指定地址(::)
当设备还未获取到地址时,使用“::”,即全0的地址表示未指定地址。
3.5 环回地址(::1)
环回地址即系统内部通信使用的地址,“::1”与“127.0.0.1”功能一样。使用该地址进行主机内部进程间通信。
ps:如有错误,补充知识点,请留言交流。