一. 地址分类
1. Unicast Address
A. Aggregate Global Unicast Address
目前实际使用的地址都是 2 开头,eg:2401:3800:c001::2c 是 www.google.cn 的地址
6 to 4 过渡期间使用的地址:2002::/16
6bone 测试使用的地址:3ffe::/16
配置/删除 Unicast Address:sudo ifconfig eth0 add/del 1:1:1::1
B. Link-Local Address
所有支持 IPv6 的设备,其接口在启动时,都会自动生成一个该地址。形式为 FE80:InterfaceID,前缀为 FE80::/64,最后 64 bit 为 InterfaceID。其 InterfaceID 按照 EUI-64 格式生成,具体为:将 FF-FE 插入 MAC 地址中间,然后将原 MAC 地址第 7 位取反。eg:
MAC: 90:4c:e5:12:aa:0b
插入 FF-FE: 90:4c:e5:ff:fe:12:aa:0b
取反: 92:4c:e5:ff:fe:12:aa:0b
加头: fe80::924c:e5ff:fe12:aa0b/64
因此,在 IPv6 中,链路层和 IP 层,通过这种方式巧妙的结合在了一起。即使没有路由器,同一链路的设备也能通过该地址通信,达到了即插即用的目的。同时,这也是其局限性,由于路由器不会转发该类型的地址,如果要和其它链路的设备通信,必须使用一个非 Link-Local 地址。
由于一个接口可以配置多个 IPv6 地址,那么学习路由就有可能出现很多下一跳,所以需要 Link-Local 地址来唯一的标识一个节点,在本地链路看到的下一跳都是对端的 Link-Local 地址。
此外,ping6 Link-Local Address 时,必须通过 -I ethx 指定接口。原因是,设备上的接口可能有多个,如果不指定接口,将无法得知从哪个接口出去。
Q:该地址可以手动修改不?如果可以,是否需要连同 MAC 地址一起修改?
C. Site-Local Address
即私网地址,形式为 FEC0::SubnetID:InterfaceID,前缀为 FEC0::/10,其后的 54 bit 为 SubnetID,最后 64 bit 为 InterfaceID。例如,在本地分配 10 个子网:
FEC0:0:0:0001::/64
FEC0:0:0:0002::/64
FEC0:0:0:0003::/64
....
Q:该地址如何手动配置?
D. Unspecified Address
0:0:0:0:0:0:0:0
表示地址为指定,或者代表默认路由
E. Loopback Address
0:0:0:0:0:0:0:1 或者 ::1
即环回地址,类似 IPv4 中的 127.0.0.1
F. IPv4 Compatible Address
a. IPv4 兼容的 IPv6 地址
高 96 bit 为 0,后跟 32 bit 的 IPv4 地址。该形式如今已经废弃。
b. 映射 IPv4 的 IPv6 地址
高 80 bit 为 0,接下来的 16 bit 为 1,再跟 32 bit 的 IPv4 地址。
2. Multicast Address
a. 格式说明
IPv6 中没有广播,用组播来代替,前缀为 FF00::/8,格式说明如下:
1111 1111 4bit 4bit
| 固定值 | | 标 志 | | 范 围 |
标志位 0000 表示永久保留的组播地址,标志位 0001 表示用户可临时使用的组播地址。
范围段定义了组播地址的范围,如下:
二进制 十六进制 范围类型
0001 1 本地接口范围
0010 2 本地链路范围
0011 3 本地子网范围
0100 4 本地管理范围
0101 5 本地站点范围 类似组播的私网地址
1000 8 组织机构范围
1110 E 全球范围 类似组播的公网地址
下面是一些组播指定地址:
FF02::1 all nodes 在本地链路范围的所有节点
FF02::2 all routers 在本地链路范围的所有路由器
FF02::5 all ospf routers
FF02::9 all rip routers 所有运行RIP的路由器
FF02::A all eigrp routers 所有运行eigrp的路由器
FF05::2 在一个站点范围内的所有路由器
b. 被请求节点的组播地址 solicited-node multicast address
一种特殊的组播地址,对于节点或路由器的接口上配置的每个单播和任意播地址,都会自动生成一个对应的被请求节点组播地址。注意 Link-Local 地址也会生成一个被请求节点的组播地址。
工作范围:只在本地链路有效。
特点:1. 在本地链路上,被请求节点的组播地址组中通常只包含一个用户
2. 只要知道一个节点的 IPv6 地址,就能计算出它的被请求节点的组播地址
作用:1. 在 IPv6 中,没有 ARP。ICMPv6 代替了 ARP 的功能,被请求节点的组播地址被节点用来获得相同本地链路上邻居节点的链路层地址
2. 用于重复地址检测 DAD,在使用无状态自动配置将某个地址配置为自己的 IPv6 地址之前,节点利用 DAD 验证在其本地链路上该地址是否已经被使用。
前缀:FF02:0000:0000:0000:0000:0001:FFxx:xxxx/104
FF02::1:FFxx:xxxx/104
如何产生:被请求节点组播地址的前 104 位固定,将 IP 地址的后 24 位移下来填充到后面。例如:
IPv6---2001::1234:5678/64 被请求节点组播地址---FF02::1:FF34:5678/104 其中 FF02::1:FF 为固定部分,共 104 位
借助于该机制,仅在最高有效位不同的 IP 地址(例如,需要与不同提供者关联的多个前缀),被映射到相同的 solicited-node multicast address,于是减少了节点在链路层必须加入的多播地址数目。
组播 IP 地址到 MAC 地址的映射:
映射规则:组播 MAC 地址的前 16 位固定为 0x3333,将组播 IPv6 地址的后 32 位直接映射到组播 MAC 地址的后 32 位。
例如:IPv6 地址为--FF12::1234:5678/64,对应的组播 MAC 地址为--3333:1234:5678,0x3333 为固定前缀
例如:所有节点的组播地址:FF02::0001,对应的组播 MAC 地址:3333:0000:0001
3. Anycast Address
二. Neighbor Discovery Protocol
IPv6 的 ND 协议定义了 5 个不同的 ICMP 分组类型:
1. Neighbor Solicitation
由节点发送,以便确定邻居的链路层地址(组播),或者通过缓存的链路层地址,验证邻居仍然可达(单播),也可用于 Duplicate Address Detect。等同于 IPv4 中的 ARP 协议。
消息格式为:
IP 字段
Source Address: 或为发送此消息的接口的 IPv6 地址,或为未指定地址(DAD)
Destination Address: 或为目标地址的 solicited-node multicast address(用于地址解析,即获取目标节点的链路层地址),或为目标地址(用于验证可达性)
Hop Limit: 255
ICMP 字段
Type: 1 个字节,值为 135
Code: 1 个字节,值为 0
Checksum: 2 个字节
Reserved: 4 个字节
Target Address: 请求的目标的 IP 地址,注意不能是一个组播地址,类似于 ARP "if u r the owner of this IP address, tell me ur mac address" 中的 IP address
由于 IP 中的 Destination Address 为目标地址的 solicited-node multicast address,而在本地链路中,被请求节点的 solicited-node multicast address 组中通常只包含一个用户,于是减少了在地址解析过程中对其它节点的干扰。
2. Neighbor Advertisement
响应 Neighbor Solicitation 消息。此外,节点也可单独发送该消息,用于通知节点链路层地址的改变。
消息格式为:
IP 字段
Source Address: 发送此消息的接口的 IPv6 地址
Destination Address: 如果是响应 Neighbor Solicitation 消息,则为 Neighbor Solicitation 消息的 Source Address,而如果 Source Address 为未指定地址,或者不是用于响应,则为所有节点的组播地址(即 FF02::1)。
Hop Limit: 255
ICMP 字段
Type: 1 个字节,值为 136
Code: 1 个字节,值为 0
Checksum: 2 个字节
Flags: 4 个字节
Target Address: 如果是响应 Neighbor Solicitation 消息,则为 Neighbor Solicitation 消息的 Target Address,如果不是响应消息,则为其链路层地址已经改变的 IPv6 地址。
3. Router Solicitation
当接口使能后,主机可以发送该消息,要求路由器立即生成 Router Advertisement 消息。
4. Router Advertisement
路由器利用此消息,周期性的通告其存在及各种链路参数,或者用于响应 Router Solicitation。Router Advertisement 包括前缀,这些前缀用于确定是否另一个地址共享相同链路和/或地址配置、建议的跳数限制等等。
5. Redirect
由路由器使用,通知主机有到目的地的更好的下一跳。
节点通过组播 Neighbor Solicitation(它要求目标节点返回自己的链路层地址)完成地址解析。Neighbor Solicitation 消息被组播到目标地址的 solicited-node multicast address。此目标用单播 Neighbor Advertisement 消息返回它自己的链路层地址。
三. 对比 IPv4 的组播机制
1. 多播组地址
IPv4 中的 D 类地址用于组播:
1 1 1 0 多播组 ID
范围是 224.0.0.0 到239.255.255.255。
能够接收发往一个特定多播组地址数据的主机集合称为主机组。一个主机组可以跨越多个网络。主机组中的成员可以随时加入或者离开主机组,主机组中对主机的数量没有限制。
此外,一些多播组地址被 IANA 确定为知名地址,它们也被当作永久主机组。例如:
224.0.0.1 代表“该子网内的所有系统组”
224.0.0.2 代表"该子网内的所有路由器"
224.0.1.1 用作网络时间协议 NTP
2. 多播组地址到以太网地址的转换
IANA 拥有一个以太网地址块,即高 24 位为 00:00:5e,这意味着该地址块的范围从 00:00:5e:00:00:00 到 00:00:5e:ff:ff:ff。IANA 将其中的一半分配为多播地址。同时,为了指明一个多播地址,任何一个以太网地址的首字节必须为 01,这意味着与 IP 多播相对应的以太网地址范围从 01:00:5e:00:00:00 到 01:00:5e:7f:ff:ff。
这种地址分配将使以太网多播地址中的 23 bit 与 IP 多播组 ID 对应起来,通过将多播组 ID 中的低 23 bit 映射到以太网地址中的低 23 bit 实现。
| 被忽略 |
0 7 8 15 16 23 24 31
D 类 IP 地址 1 1 1 0 0 0 0 0
| 多播组地址中的低 23 bit 复制到对应的以太网地址中 |
|0 0 0 0 0 0 0 1|0 0 0 0 0 0 0 0|0 1 0 1 1 1 1 0|0 | | |
由于多播组号中的最高 5 bit 在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的。32 个不同的多播组号被映射为一个以太网地址。例如:
224.128.64.32(e0.80.40.20) 和 224.0.64.32(e0.00.40.20)
都映射为同一以太网地址 01:00:5e:00:40:40。
既然地址映射不是唯一的,那么设备驱动程序或者 IP 层就必须对数据包进行过滤。但是,尽管存在地址映射不完美和需要硬件过滤的不足,多播仍然比广播好。
单个物理网络的多播是简单的。多播进程将目的 IP 地址指明为多播地址,设备驱动程序将它转换为相应的以太网地址,然后把数据发送出去。这些接收进程必须通知它们的 IP 层,它们想接收的发往给定多播地址的数据包(例如 NTP 需要通知 IP 层,要接收发往 224.0.1.1 这个地址的数据包,而对于 224.0.0.1 这样的地址,应该是由硬件或者设备驱动程序默认接收),并且设备驱动程序能够接收这些多播帧。这个过程就是“加入一个多播组”。
当把多播扩展到单个物理网络以外需要通过路由器转发多播数据时,复杂性就增加了,需要 IGMP 协议。