IPv6协议精讲---(二、IPv6地址分类)

1,107 阅读8分钟

1、IPv6地址语法

  IPv6地址在计算机中用128位二进制数表示,但是为了增加可读性通常使用十六进制表示。 image.png

  由于IPv6地址空间巨大,会经常出现连续的0。为简化书写,可以将连续的0用“::”进行缩写。在读取时,再将“::”展开为连续的0,直到将IPv6地址填充为128位。所以一个IPv6地址中只能出现一次“::”。

2、IPv6地址结构

  一个完整的IPv6地址由前缀、接口标识和前缀长度组成。

image.png

1、前缀也称为网络标识符,与IPv4地址中的网段地址具有相同的意义,用于标识一个网段。其长度由前缀长度指定。

2、接口标识与IPv4地址中主机号具有相同的意义,用于标识网络上一个节点的网络接口。其长度=128-前缀长度

3、前缀长度,指明前缀字段在IPv6地址中的长度。一般是64位长度,也可以是其它长度。取值范围:0-128。当长度为0时,代表所有网段(如下图2)。当长度为128时,代表一个无子网的唯一地址。

image.png

3、IPv6地址分类

image.png

  RFC2373中定义了地址空间及分配情况。目前已分配的地址不足20%,预留了足够的地址空间备用。下表列出了常用地址空间:

用途空间定义地址前缀适用范围占比
全球单播地址(GUA)0012000::/3全球唯一
可在公网路由转发
1/231/2^3
本地链路地址(LLA)1111 1110 10FE80::/10仅用于本地链路1/2101/2^{10}
唯一本地地址(ULA)1111 110FC00::/7作用1/271/2^{7}
多播地址1111 1111FF::/8作用1/281/2^{8}

3.1 单播地址

1. 全球单播地址(GUA: Global Unique Address)

  1. 地址定义: 全球单播地址前3个bit固定为“001”。
  2. 地址区间: 2000:: - 3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF。
  3. 地址用途: 可以被所有路由器转发,用于全球范围的通信。也就是公网地址。
  4. 其它说明: 经过公网转发的两个通信设备之间应该采用全球单播地址。如果没有全球单播地址,是无法直接与公网设备通信的。2002::/16属于全球单播地址,但具有特殊用途。专用于6to4隧道,隧道技术在其它章节详细介绍。

2. 本地链路地址(LLA: Link Local Address)

  1. 地址定义: 本地链路地址前10个bit固定为“1111 1110 10”,和接下来54bit的“0”共同组成64位前缀。接下来的64位接口标识符通常由EUI-64规范生成。
  2. 地址区间: FE80::/64 - FE80::FFFF:FFFF:FFFF:FFFF/64。
  3. 地址用途: 本地链路地址是在接口Link-UP后自动配置的,用于局域网内通信。局域网的称呼并不准确,但便于理解。本地链路地址不能被三层路由转发,只能在同网段内二层转发。用于获取到全球单播地址前在局域网内通信,比如获取全球单播地址,地址冲突检测等。
  4. 其它说明: 本地链路地址生成通常使用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 110L全局ID子网ID接口ID
7Bit1Bit40Bit16Bit64Bit
  1. 地址定义: 唯一本地地址前7个bit固定为“1111 110”。接下来的1 bit(L位)置1,表示本地分配的前缀,置0的场景未定义,预留暂不使用。所以前8bit就固定成“1111 1101”,即0xFD。接下来40bit是全局ID,表示一个站点(如校园,公司等)。接下来的16bit是子网ID,即,最多可以划分65536个子网。最后的64bit为接口ID。
  2. 地址区间: FD::/64 - FDFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF/64。
  3. 地址用途: ULA地址的应用范围是本地站点内部,不能在全球范围使用。类似于IPv4地址空间中的10.0.0.0/8等私网地址,可以在公司、校园内部划分子网,并进行路由转发,但不能在全球范围内使用。与本地链路地址不同,不能自动生成,需要通过有状态或者无状态自动配置方式进行获取。ULA地址在站点内部可以随意使用,无需全球分配。
  4. 其他说明: 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共用的二层(以太层)无变化。

  1. 地址定义:

最高位的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:如有错误,补充知识点,请留言交流。