unicast
在单播寻址模式下, 一个IPv6 接口(host)在一个网络里是唯一的。 IPv6 报文包含源地址和目的地址。 当一个网关或路由器收到一个unicast IP 报文,目标是一台主机,它把报文从与该主机相连的接口发出去。 如图:
multicast
目的地为多个主机的报文由多播地址发送。 所有对该多播信息感兴趣的主机要事先加入多播组。 所有加入该组的接口接收这个多播报文并处理它, 其它不感兴趣的主机忽略该多播报文。 如图:
anycast
在这种地址模式下,多个接口(主机)被赋予相同的anycast IP地址。 当一个主机希望与配备anycast 的主机联系,它发送一个 unicast 消息。 在复杂的路由机制的帮助下,这个unicast 消息被送到离发送者最近(路由成本最低)的主机上。如图:
address structure
IPv6 地址是128位的,分成8块(block),每块16位。每块可以表示成四个16进制数,用冒号“:”隔开。 下面是一个128位的IPv6地址,用二进制表示,分成8块,每块16位:
0010000000000001 0000000000000000 0011001000111000 1101111111100001
0000000001100011 0000000000000000 0000000000000000 1111111011111011
我们把每块表示成16进制数:
2001:0000:3238:DFE1:0063:0000:0000:FEFB
规则1 去掉前导的0
在第五块,0063 的前两个0可以去掉,成为:
2001:0000:3238:DFE1:63:0000:0000:FEFB
规则2 如果两个以上的块含有连续的0,则省去所有的块并代之以“::” , 如果还有全0的块,它们可以缩写为一个0(比如第二块):
2001:0:3238:DFE1:63::FEFB
Interface ID
IPv6 有3种不同的unicast 地址体系。地址的第二部分(后64位)总是用来表示 interface ID。 我们注意到,MAC 地址是48位的,并且是全球唯一的。 Interface ID 利用了MAC这种唯一性。 一个主机可以用IEEE 的 Extended Unique Identifier (EUI-64)格式来自动配置它的Interface ID。 首先,主机把它的MAC地址分成各24位的两部分。 然后把16位16进制数0xFFFE 插入这两部分中间:
然后把第7位取反,得到 IPv6 的interface ID:
Global Unicast Address
这种地址类型相当于IPv4 的公共地址。 它是全球可寻址且是唯一的:
Global Routing Prefix的最高3位必须是001,这样,global unicast address 都是这样的形式: 2xxx:xxxx:…. 或 3xxx:xxxx:… 。
Link-Local Address
自动配置的IPv6 地址叫做 Link-Local Address。 这种地址总是以FE80开头, 后面的48位全是0:
Link-local address 只能在链路范围内传播。 这种地址是无法路由的,因此路由器永远不会把这种地址转发到链路之外。Link local address 在使能IPv6的时候就自动配置好了。 这是我的机器上的link local address:
我们可以看到, link local address 是怎样从MAC地址派生出来的。
Unique-Local Address
这种地址是全球唯一的,但它只应该在本地通讯里使用。 地址的第二部分是Interface ID, 第一部分由 Prefix, Local Bit, Global ID 和 Subnet ID组成:
Prefix 总是1111110, L 位设为1表示地址是本地赋值的,到目前为止,L为0 还没有定义。 所以, unique local IPv6 地址总是以FD开头。
这是这三种地址的使用范围:
link-local address 只能在链路范围里使用; unique local address 在一个单位或组织中使用;而 global unicast address 在全球范围内使用。
在表中我们可以看到,0:0:0:0:0:0:0:0/128 不指定任何地址,只能作为尚未获得正式地址的主机的源地址,不能作为目的地址,不能分配给真实的网络接口。 在IPv4 中, 掩码为0.0.0.0 的地址0.0.0.0 表示默认路由,在IPv6里也是类似的, ::/0 表示默认路由。 在IPv4里,从127.0.0.1 到127.255.255.255 都可以表示回环地址; 而在IPv6里,只有0:0:0:0:0:0:0:1/128 表示 回环地址,缩写为 ::1/128。
为路由器/节点保留的多播地址
这些地址用来帮助主机和路由器在还没有配置IPv6地址的时候相互通信。 主机先基于EUI-64 自配置地址一个地址,然后用这些地址来表示网络上的路由器或其它主机。
这是两台配置了IPv6地址的主机间的抓包:
前两条是邻居发现协议(NDP, 取代了IPv4 的ARP),我们看到92条用到了ff02::1 (All nodes in link-local) 向整个链路层广播,问它需要的地址信息。 93条是相关主机的回复。 94、95是ping及其回复,用的都是ffd0 开头的 unique local address。这是我事先设好的。
在第一台主机上:
ifconfig eth0 inet6 add fd00::f21f:afff:fe23:48c/64
在第二台主机上:
ifconfig eth0 inet6 add fd00::20e:cff:fe5e:4606/64
然后在第一台上ping 第二台:
ping6 -c1 fd00::20e:cff:fe5e:4606
抓包,就得到了以上结果。