IPv6 简介
IPv6(IP版本6)是互联网通讯协议(Internet Protocol,简称IP)的新版本,它被设计来取代IPv4。并且针对当初设计IPv4时没有考虑到的问题做了以下改进:
- 扩展地址空间 IPv6将IP地址长度从32 bits扩展到128 bits,其主要目的是支持更多层的阶层式的路由架构,更大的地址空间(IPv6的地址不再有耗尽之虑),并且提供更简单的自动组态配置。在multicast address中新增 ”scope” 字段来提升multicast routing的可扩展性。定义一个新的地址类型称为 ”anycast address”,用来发送封包到一个群组中路由最近的一个node。
- 简化IP表头格式 IPv6删除了IPv4表头中不必要的字段,并且将选项字段移到扩展表头,降低router转送IP封包的处理时间。
- 支持更佳的扩充性 更改IP表头的某些选项,使得router转送封包更有效率,并且提供未来更大的灵活度来引入新的选项或新的扩展表头。
- 提供更好的QoS 在IP表头添加新的标签字段称为 "Flow Label”,让封包发送者能要求特殊的流量处理,譬如real-time服务。
- 认证和保密功能 支持认证、数据完整性及保密性。
须知,IPv6除了将完全取代IPv4以外,由于IP层版本的替换过程相当冗长艰巨,其设计者更希望IPv6是IP层的终极版本,未来不用再面临IP层版本更新的难题。至于IPv6是否能经得起考验,成为IP层的终极版本,只能有赖时间来证明。
专有术语
Address 地址,用来标示一个或一组interfaces。
Asymmetric reachability(非对称可达性)1个link可能具有non-reflexive(非反向性)或non-transitive(非传递性)的封包传送方式。Non-reflexive是指:A可传送封包到B,但是B无法传送封包到A。Non-transitive是指:A可传送封包到B,B可传送封包到C ,但是A无法传送封包到C。
Host(本机) 非router的nodes皆称为host。
Immediate Router 封包送达目的地所经过的routers。
Interface node连接到link的实体附件。例如网络卡。
Link 通信介质,node之间可以透过link layer进行通信。即IP的下层。例如Ethernet,PPP links,X.25,Frame relay,ATM networks。
Link MTU 一个link上可以传送IP packet的最大单元。即maximal link framesize减掉link frame header size。
Neighbors 邻居,连接到相同link的nodes。
Node(节点) 实现IPv6的设备皆称为node,包含hosts和routers。
Path MTU 来源和目的node路径中的最小的link MTU。即来源和目的路径中可以发送的MTU。由于IPv6的router不做fragmentation动作,如果packet的size超过path MTU,将无法送达目的地。
Reachability(可达性) 是指封包单向送达邻居的路径是否正常。特别是指封包是否送达邻居的IP层且被接收的IP层做适当处理。所谓reachable的邻近router,是指node的IP层发送的IP 封包被送达邻近的router的IP层,且router也确实转送封包。所谓reachable的邻近hosts,是指node的IP层封包被送达邻近host的IP层。
Router(路由器) 负责转发IP封包的node。
Upper layer(上层) IPv6的上层通讯协议。例如:传输协议如TCP和UDP,控制协议如ICMP,路由协议如OSPF。
IPv6地址
IPv6具有128 bits长度的IP地址。如此庞大的地址空间,IPv6地址不再有耗尽之虑。IPv6 的大地址空间设计主要用于建立有效率、具有更多层的阶层式路由基础结构,使主干router路由表要小得多(IPv4 Internet主干路由器的路由表中通常超过70,000个以上的路由)。
IPv6地址分成Prefix(前缀)及Interface ID两部分,各占64 bits。Prefix等同subnet ID。Interface ID等同一个segment(网段)的host ID。
IPv6地址语法
IPv6地址的128 bits以16 bits区分成8个区块,并用冒号隔开。每个16 bits区块转换为16进位表示法。例如:
ABCD:0F01:2345:6789:ABCD:0F01:2345:0089
2001:0DB8:0000:0000:0008:0800:020C:417A
为了简化Ipv6地址的表示,前置零可以移除,但是每个16 bits区块至少要有一个数字。
ABCD: F01:2345:6789:ABCD:F01:2345:89
2001:DB8:0:0:8:800:20C:417A
由于IPv6的大地址空间,有些类型的地址中经常会包含一连串的区块为零。为了进一步简化Ipv6地址的表示,连续为零的区块可压缩为「::」。例如:
2001:DB8:0:0:8:800:20C:417A可以压缩为2001:DB8::8:800:20C:417A
FF01:0:0:0:0:0:0:101可以压缩为FF01::101
0:0:0:0:0:0:0:1可以压缩为 ::1
0:0:0:0:0:0:0:0可以压缩为 ::
零压缩只能使用一次。否则无法确定每个「::」表示0的区块个数。
IPv6 Address Prefix
IPv6 address prefix(地址前缀)表示语法为ipv6-address/prefix-length。可以用来定义路由或子网。Prefix-length为64时,代表一个segment(网段)。Prefix-length小于64时,可以代表路由表的路由、子网或地址的范围。
例如:
2001:2DB:0:BC::/64 代表segment(网段)的prefix ID
2001: 2DB:0: BC::/60 代表路由表的路由、subnet(子网络)
2001: 2DB:0:CD30::/60也可以代表地址范围:
2001:2DB:0: CD30::/64到2001: 2DB:0: CD3F::/64
不在prefix-length内的bits必须为零。例如2001: 2DB:0:CD3F::/60就不是个合法的表示法。
地址类型表示法
IPv6地址的类型由不同长度及内容的前缀来表示。这些不同长度内容的前缀称为Format Prefix(FP)(格式前缀)。RFC
2373定义初始分配的FP如下:
IPv6的地址类型
IPv6地址的大小为128 bits,有三种类型:
- Unicast(单点传送)
- Multicast(多播)
- Anycast(任一传送)
此外,IPv6废除了使用broadcast address来传送封包。所有与broadcast相关的传送功能都被multicast address取代,主要原因是broadcast封包会传送到整个segment中所有的nodes,这种广播式的传送对同一segment上所有的nodes均造成影响。Multicast取代broadcast后,只有multicast的接收者才会加入对应的multicast group,不需要处理此multicast封包的nodes不再受到影响。
Unicast Address(单点传送)
一个识别地址指定给单一interface。目地地址为unicast address的IPv6封包将被传送到具有这个识别地址的interface。因为封包接收者只允许一个interface,所以称为unicast address。
依据地址能传送的有效范围,Unicastaddress细分为以下类型:
- Global unicast addresses (全局唯一地址)
- Link-local addresses(区域链结地址)
- Unique local addresses(唯一的区域地址)
- Special addresses(特殊地址)
Global Unicast Address
与IPv4的public地址相同,Globalunicast addresses的传送范围适用整个IPv6 Internet,并且是独一无二的地址。格式如下:
Global Unicast Address的最前面3 bits固定为001。最左边的48 bits或称为site prefix(站台前缀),通常是由ISP分配给一个组织或机构自行建构子网络。Subnet ID字段长度16 bits,并非为了能切分成216个网段,而是提供每个站台网络管理者建立多层的阶层式路由架构。Subnet ID字段也可能被ISP细分成更多的子网络,可提供给个别的小型网络使用(例如:家庭或个人用户)。
Link-Local Address
link-local address的传送范围只适用在一个segment,其地址唯一性仅限于同一个link上。所有的Interface都必须配置link-localaddress。
Link-local address的prefix为固定值:FE80::/64,是自行配置生成的。由于它的传送范围只适用在一个segment,IPv6 router不会转送目的地址为link-localaddress的封包到其它的segments。
Unique Local Address
简称ULA,1个segment或2个segments以上透过routers连接一起的子网络,传送范围适用在一个site的子网络。类似IPv4的专用网,ULA适用于专用网。
- ULA的前缀固定为FC00::/7。
- L(Local) bit 值为1代表Global ID是local自行设定。值为0代表Global ID是依照RFC 4193的算法生成的。
- Global ID 一个Global ID指定给1个site使用。
- Subnet ID 由site网络管理者自行配置。16 bit的长度并非为了把site切割成216个子网,而是提供site多层的阶层式路由架构。
RFC 4193定义了一个算法,声称依此算法生成的Global ID几乎不会重复,故美其名为Unique Local Address(唯一的区域地址)。其算法的主要目的是当2个的ULA子网络需要合并在同一个子网时,可避免因为Global ID相同而必须更改整个ULA子网络的prefix。
虽然RFC 4193预设ULA的传送范围为global,ULA的传送范围或可大于site-local,但应该局限于合并的ULA子网络。况且ULA无法在整个internet提供全局阶层式的路由架构,把ULA提升为全局传送只会徒增routers转送封包的负担。
Special Address
以下是IPv6的special addresses
- Unspecified address 未指定的地址
未指定的地址(0:0:0:0:0:0:0:0 或 ::) 仅用于表示此地址是空的,未指定。Unspecifiedaddress只能做为来源地址,不能指定给 interface,也不能做为目的地址。一般而言,当发送封包者还没有IPv6地址或者有些封包并不需要指定发送者的IPv6地址时,就会将来源地址设为 (::)。
- Loopback address 回路地址
回路地址(0:0:0:0:0:0:0:1 或 ::1) 用于识别回路接口,使node得以向自己传送封包。发往回路地址的封包绝不能在link上传送,也不能由 router转送。Loopback address不能当来源地址。
IPV6 MULTICAST ADDRESSES(多播)
- 一个识别地址指定给零到多个interfaces。目标地址为multicast address的IPv6封包将被传送到具有这个识别地址的所有interfaces。因为封包接收者是零到多个的interfaces,所以称为multicast(多播)。Multicast主要应用在一对多的传送方式,譬如在线游戏、在线直播节目、视频会议及聊天系统等都可能利用multicast来达到多播。
- Multicast也称为“群播“,接收同一个multicast address封包流的所有nodes称为一个group。一个group的大小没有限制,可零到任意多个。透过特定的protocol(例如MLD)通知邻近的router,group的成员可任意加入或离开。每个multicast address代表不同的group,每个group聆听对应的multicast 封包流。譬如在线直播节目,每个multicast address代表不同的节目,收看同一个节目的所有nodes即一个group。
- 多播的优点是只要发送一个封包,透过routers就可以转送到所有的聆听者。不像unicast addresses,如果要发送同一个封包给N个nodes,就必须重复发送N个封包到N个unicast addresses。
- 被指定IPv6 multicastaddress的interface只能当聆听者,不能以IPv6 multicast address的身份去发送封包,所以IPv6 multicast addresses不能做为来源地址。
- 此外,IPv6定义特定的multicast addresses取代IPv4原有broadcast相关的功能。只有欲接收相关multicast封包的nodes才会加入该multicast group,其它的nodes不再受到影响。
- IPv6 multicast addresses的前缀为1111111(0xFF),即以0xFF开始的皆为multicast地址。
MULTICAST ADDRESS格式
前缀为0xFF表示为multicast address以外,IPv6 multicast address还包含其它结构:flag、scope和group ID。
Flags(O R P T)表示multicast address上设定的旗标。如下所示,该字段大小为4 bits。
- 高序位bit保留且必须设为0。
- Transient (T) flag设为 0 时,表示是由 Internet 编号机构 (IANA) 配置的永久性且众所周知的multicast address。设为 1 时,表示是一个暂时的 (非永久指派的) multicast address。
- P flag的用途定义在RFC 3306。
- R flag的用途定义在RFC 3956。
Scope IPv6 multicastaddress可以传送的范围。长度为 4 bits。内容如下:(routers利用以下定义来确保multicast封包不会跨出其可传送范围)
Group ID 用来识别不同的multicast group。该字段大小为 112 bits。
由于在 Group ID 中使用了 112 bits,可以拥有 2112个群组 ID。但是,考虑到 IPv6 multicast地址低序位32 bits对应到 Ethernet multicastMAC 地址低序位32 bits的方式,RFC 2373 建议从 IPv6 multicast地址的低序位 32 bits开始指定 Group ID,并将group ID其余的bits设为 0。透过只使用低序位32 bits,每个Group ID 均对应到唯一的 Ethernet multicastMAC 地址。如此可完全避免multicast封包影响到其它的nodes。
预先定义好的MULTICAST 地址
RFC 4291定义了以下众所皆知的multicast 地址。
保留的MULTICAST 地址:
FF00:0:0:0:0:0:0:0
FF01:0:0:0:0:0:0:0
FF02:0:0:0:0:0:0:0
FF03:0:0:0:0:0:0:0
FF04:0:0:0:0:0:0:0
FF05:0:0:0:0:0:0:0
FF06:0:0:0:0:0:0:0
FF07:0:0:0:0:0:0:0
FF08:0:0:0:0:0:0:0
FF09:0:0:0:0:0:0:0
FF0A:0:0:0:0:0:0:0
FF0B:0:0:0:0:0:0:0
FF0C:0:0:0:0:0:0:0
FF0D:0:0:0:0:0:0:0
FF0E:0:0:0:0:0:0:0
FF0F:0:0:0:0:0:0:0
以上multicast地址均保留,且永不指定给任何multicast group。
All Nodes Addresses:
scope 1(node-local)及2(link-local)。Group值为 1表示all nodes。
FF01:0:0:0:0:0:0:1
FF02:0:0:0:0:0:0:1
譬如:FF02:0:0:0:0:0:0:1表示在link的范围内,此multicast 封包接收者为所有的nodes。
请注意,由于FF02:0:0:0:0:0:0:1封包会传送到link上所有的nodes,实际上,它跟broadcast所造成的影响是等同的。IPv6用multicast取代broadcast的目的是把原先broadcast所造成的影响尽量降到最低,并非完全根绝使用broadcast功能。在Neighbor Discovery Protocol中,Unsolicited Router Advertisement及Unsolicited Neighbor Advertisement messages均使用FF02:0:0:0:0:0:0:1来发送封包。实际上这2 messages的发送对象正是link上所有的nodes。
此外,IPv4的broadcast封包传送限制在同一link内的范围,因此All Nodes Addresses的scope也只限于1(node-local)以及2(link-local)。
All Routers Addresses:
scope 1(node-local),2(link-local)及5(site-local)。Group值为 2表示all routers。
FF01:0:0:0:0:0:0:2
FF02:0:0:0:0:0:0:2
FF05:0:0:0:0:0:0:2
譬如:FF02:0:0:0:0:0:0:2表示在link的范围内,此multicast 封包接收者为所有的routers。FF05:0:0:0:0:0:0:2表示在site-local的范围内,此multicast 封包接收者为所有的routers。
Solicited-Node Addresses:
表示法为FF02:0:0:0:0:1:FFXX:XXXX。章节Solicited-Node Address将详细介绍。
对应 IPv6 Multicast Addresses 到 Ethernet Addresses
当从Ethernet link发送IPv6 multicast封包时,对应的目的MAC address的格式为33-33-mm-mm-mm-mm,其中mm-mm-mm-mm是IPv6 multicast address的最后32 bits值。
Ethernet网络卡有一个MAC 地址表,而且这个MAC地址表的内容可动态设置。当接收到一个Ethernet frame的目的MAC address与MAC地址表任何一个地址相同时,就会把这个Ethernet frame传送给上层做进一步的处理。当接收到的Ethernet frame的目标MAC address不符合MAC 地址表任何地址时,则丢弃这个Ethernet frame。基本上,每个MAC 地址表会有下列的MAC addresses:
- Broadcast MAC Address 即MAC地址FF:FF:FF:FF:FF:FF。可能直接加在MAC地址表中,或者用另外一个flag来设定是否接收Broadcast MAC address。
- Unicast MAC Address 此MAC地址是网络卡出厂时就设定好的,它是独一无二的MAC address且不可更改,其目的是防止跟其它的网络卡的Unicast MAC address冲突。所有指派给网络卡上IP层的IPv6 unicastaddresses(包含Global, Link-local, unique local及anycast)都用此Unicast MAC address来接收Ethernet frame,并且发送Ethernet frame时,以它为来源MAC地址。
- Multicast MACAddress 除了取代IPv4原有broadcast功能的multicast addresses以外,一般都是动态加入到MAC 地址表或从MAC 地址表移除。当application layer加入某个IPv6 multicast address时,系统就会把对应的multicast MAC address加入MAC 地址表。反之,当应用程序停止聆听某个IPv6 multicast address时,就会把对应的multicast MAC address从MAC 地址表中移除。
此外,一般网络卡可以设定2种接收模式如下:
- Normal Mode 一般模式。即利用MAC地址表来决定接收到的Ethernet frame的去留。此模式适用在一般的Host。
- Promiscuous Mode 混杂模式。不做目的MAC的比对,此模式下直接将所有接收到的Ethernet frames传送给上层做进一步处理。此模式适用在router或其它特殊设备。当使用工具sniffer监看网络上的所有封包时也是启动此种模式。
IPv6 Anycast Addresses(任一传送)
一个识别地址指定给1到多个interfaces。目的地址为anycast address的IPV6封包将被传送到最邻近且具有这个地址身份的interface。“最邻近” interface是指路由距离上最近的interface。因为封包只被传送到这些interfaces中的其中一个,所以称为anycast。
每个不同的anycast address对应某特定的服务,服务内容视应用需求而定,并且是预先定义好的。目前anycast只能指定给router,所有被指定到同一个anycast address的routers都将提供相同的特定服务。譬如电话号码110,119或104查号台,这些服务台散布在全国各地并且提供相同的服务,相当类似anycast的应用概念。Mobile IPv6章节里将介绍anycast address的实际应用例子,届时读者对这个既新颖又抽象的anycast addresses会有更深一层的认识。
Anycast 地址取自于unicast 地址空间而来,所以具有与unicast相同的scope 属性(即Global,link-local或unique local)。由于anycast取自unicast地址空间,两者的格式完全一样,从格式语法上无法区别是anycast或unicast。当某个unicast地址被指定给1个以上的interfaces时,它就变成anycast地址,而且必须预先声明它是个anycast地址。譬如:电话号码110,119等都是预先经过明确公告,大众才会知道这些特殊号码的用途。
Anycast addresses不能当来源地址,也不能指定给hosts。
Solicited-Node Address(请求节点地址)
此类地址为前缀FF02:0:0:0:0:1:FF00::/104,与unicast或anycast地址的低序24 bits所合并形成的multicast地址,其目的用在解析邻近node的MAC地址。IPv4 ARP用broadcast解析邻近node的MAC地址,总是影响到所有邻近的nodes。而IPv6 Neighbor Discovery利用Solicited-Node Address取代broadcast,把这种影响降到非常低。例如:4037::01:800:200E:8C6C对应的Solicited-Node Address为FF02::1:FF0E:8C6C。只有地址的低序24 bits为0E:8C6C的nodes才会受到影响,将造成影响的几率降到非常低。
章节Neighbor Discovery将介绍如何利用Solicited-Node Addresses来解析邻近node的MAC地址。
Node需要配置的IPv6地址
以下是host需要配置的IPv6地址:
- Link-Local Addressfor each interface 每个interface都必须自行配置1个link-local地址。这是最基本也是第一个必须先配置的地址,有了link-local地址才能配置后续的其它地址。例如:assigned unicast Addresses及所有unicast address映像的Solicited-Node Multicast Address。
- Unicast Addresses 透过routers或者DHCPv6 server,配置global unicast或unique local unicast地址。这2种地址可别分配置0到多个。
- Loopback Address
- All-Nodes MulticastAddresses 即FF01:0:0:0:0:0:0:1和FF02:0:0:0:0:0:0:1。
- Solicited-NodeMulticast Address 所有配置到的unicast地址所映像的Solicited-Node Multicast地址。
- Multicast Addresses 所有host欲聆听的multicast地址,此乃动态任意join或leave的multicast地址。
Router需要配置的IPv6地址
Router除了需要配置host所有的地址以外,还需要配置以下IPv6地址:
- Anycast addresses 所有router配置到的anycast addresses及所映像的Solicited-Node Multicast地址。
- All-RoutersMulticast 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
IPv6 Interface Identifiers
Interface ID用来识别link上不同的interfaces,所以它在同一link上必须是独一无二的。此外,有些生成Interface ID的方法中,所配置的Interface ID在整个IPv6全局里也可能是独一无二的。Interface ID使用固定64 bits长度的主要目的是为了能映像48 bits MAC地址,也能映像IEEE 1394的64 bits MAC地址和未来的网络link layer地址。由于MAC地址是唯一的,映像出的Interface ID也同样具有唯一性。
Interface ID可以由以下几种方式来配置:
- 在RFC 4291中定义,可以从Extended Unique Identifier (EUI)-64配置Interface ID。由于此种配置方法是一对一的映射,从Interface ID可以反推到映像的实际MAC address,进而得知与interface或主机相关的讯息,不具隐秘性。
- 在RFC 4941中定义,可以临时分配,随机产生Interface ID。这种随机配置的方法,可以提供隐秘匿名的需求。
- 透过DHCPv6,动态配置IPv6地址(包含Interface ID)。
- 在RFC 5072中定义,可以基于link-layer address或serial number来配置Interface ID。也可以在PPP产生联机时随机配置Interface ID。
以EUI-64配置 INTERFACE ID
IEEE 802 地址格式
IEEE 802使用48 bits地址,它由24 bits(前3个bytes)的公司ID和24 bits(后3个bytes)的扩展ID组成。制造每个网络卡时,组合公司ID及224范围内的扩展ID,即产生一个全局唯一的48 bits地址。此地址称为硬件地址或者MAC地址。
公司ID的格式如下:
- “c” bits为公司ID。能申请的公司ID数可多达222.
- “u” bit为Universal/Local (U/L) bit。值为0代表MAC是全局唯一,值为1代表MAC是本地管理(不具全局唯一性,只能区域性使用此MAC地址)。
- “g” bit 为Individual/Group (I/G) bit。此bit是预留来区分unicast及multicast地址。值为0代表unicast地址,值为1代表multicast地址。
网络适配器的MAC出厂设定值:U/L及I/G bits皆设为0。
IEEE EUI-64 地址
前3个bytes的公司ID格式与IEEE 802完全相同,但扩展ID的长度是40 bits (5 bytes)。
IEEE 802地址转换成IEEE EUI-64地址的方法:
将16 bits值 0xFFFE置入公司ID及扩展ID之间。
IEEE EUI-64地址转换成Interface ID的方法:
将IEEE EUI-64地址的U/L bit取1的补码。如果U/L bit为1,则设为0。如果为0,则设为1。
IEEE 802地址转换成INTERFACE ID的方法:
先将IEEE 802转换成EUI-64,再将EUI-64转换成Interface ID。
参考文件
RFC
3306 Unicast-Prefix-based
IPv6 Multicast
RFC
3587 IPv6
Global Unicast Address Format
RFC
4193 Unique
Local IPv6 Unicast Addresses
RFC
4291 IPv6
Addressing Architecture