http://blog.chinaunix.net/uid-10898153-id-2920828.html
1.IPv6地址表示
(1)
首选格式
首选表示法也称为IPv6地址的完全形式,由一列以冒号(:)分开的8个16比特十六进制字段组成。如:
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
2002:0410:0000:1234:FB00:1400:5000:45FF
(2)
压缩表示
当一个或多个连续的16比特字段为0字符时,为了缩短IPv6地址长度,用::(两个冒号)表示这些字段的0是合法的。但是,IPv6地址中只允许一个::存在。如:
FE80:0000:0000:0000:0000:0000:0000:0009
压缩表示为:
FE80::0009
还可以省略前导0,写成:
FE80::9或FE80:0:0:0:0:0:0:9
(3)
内嵌IPv4地址的IPv6地址
IPv6地址的第一部分使用十六进制表示,而IPv4地址部分是十进制格式。这是过渡机制所用的IPv6地址特有的表示方法。如:
0000:0000:0000:0000:0000:0000:206.123.31.2
或写成
::206.123.31.2
2.IPv6地址类型
在IPv6中,地址指定给网络接口,而不是节点,每个端口同时拥有和使用多个IPv6地址。地址的3种类型是单播、任播和多播。在每种地址中有一种或多种类型的地址。单播有本地链路、本地站点、可聚合全球、回环、未指定和IPv4兼容地址。任播有可聚合全球、本地站点和本地链路地址。多播有指定地址和请求节点地址。
IPv6编址
|
多
播
|
单
播
|
任
播
|
分配地址
|
被请求节点地址
|
本地链路
地址
|
可聚合全球地址
|
本地站点地址
|
FF00::/8
|
FF02::1:FF00:0000/104
|
FE80::/10
|
2001::/16
2002::/16
3FFE::/16
|
FEC0::/10
|
未指定的回环地址
|
本地链路地址
|
可聚合全球
地址
|
本地站点地址
|
IPv4
兼容地址
|
::/128
::1/128
|
FE80::/10
|
2001::/16
2002::/16
3FFE::/16
|
FEC0::/10
|
0:0:0:0:0:0::/96
|
图
1-1 IPv6寻址结构中的地址类型
【注】:
(1)本地站点地址不可以在全球IPv6因特网上路由。
(2)当在一个节点上启用IPv6协议栈,节点的每个接口自动配置一个本地链路地址。
(3)本地站点地址设计用于永远不会与全球IPv6因特网通讯的设备,如打印机,内部服务器等。
(4)可聚合全球单播地址前缀至少48比特。如2001:0410:0110::/48是由提供商指定给组织机构的,在网络子网上使用前缀2001:0410:0110:0002::/64。
(5)任播地址使用可聚合全球单播地址,也能够使用本地站点或本地链路地址,要区分单播地址和任播地址是不可能的。
(6)
节点必需的IPv6地址
必需的地址
|
地址表示
|
每个网落接口的本地链路地址
|
FE80::/10
|
回环地址
|
::1
|
所以节点多播地址
|
FF01::1,FF02::1
|
分配的可聚合全球单播地址
|
2000::/3
|
所用的每个单播和任播地址的被请求节点多播地址
|
FF02::1:FFxx:xxxx,其中
xx:xxxx是每个单播或任播地址的低
24比特
|
主机所属的所有组的多播地址
|
FF00::/8
|
路由器必需的IPv6地址
必需的地址
|
地址表示
|
一个节点的所有必需的
IPv6地址
|
FE80::/10,
::1,
FF01::1,
FF02::1,
2000::/3,
FF02::1:FFxx:xxxx,
FF00::/8
|
所有路由器多播地址
|
FF01::2,
FF02::2,
FF05::2
|
子网路由器任播地址
|
UNICAST_PREFIX :0:0:0:0
|
其他任播配置地址
|
2000::/3
|
3.IPv6因特网控制消息协议(ICMPv6)
因特网控制消息协议(ICMP)向源节点报告关于向目的地传输IP数据包的错误和信息。在IPv4和IPv6中,ICMP为诊断、信息和管理目的定义了一些消息。如RFC2463中定义,IPv6 ICMP处理IPv4 ICMP所支持的消息和为IPv6协议的特殊操作而附加的消息。
表3-1 ICMPv4 和 ICMPv6共同使用的错误和信息性消息
消息
|
类型号
|
消息类型
|
定义
|
目的不可达
|
1
|
错误
|
目的主机中的
IP地址或者端口未处于活动状态
|
数据包超长
|
2
|
错误
|
数据包长度超过发送链路的最大传送单元(
MTU)
|
超时
|
3
|
错误
|
当存活时间(
TTL)字段到
0时,数据包被丢失,中间路由器通知源主机
|
回应请求
|
128
|
信息
|
发送到目的地的消息,请求一个回应消息
|
回应应答
|
129
|
信息
|
用来回答回应请求消息的消息
|
在IPv6中,协议的几种机制和功能使用ICMPv6消息:
Ø
替代地址解析协议(ARP)——一种用在本地链路区域取代IPv4中ARP协议的机制。节点和路由器保留邻居信息。为了这个特殊应用,IPv6定义了新的ICMPv6消息。
Ø
无状态自动配置——自动配置功能允许节点自己使用路由器在本地链路上公告的前缀配置它们的IPv6地址。前缀公告和无状态自动配置使用新的ICMPv6消息。
Ø
重复地址检测(DAD)——启动时和在无状态自动配置过程中,每一个节点都先验证临时IPv6地址的存在性,然后使用它。执行这个功能也使用新的ICMPv6消息。
Ø
前缀重新编址——前缀重新编址是当网络的IPv6前缀改变为一个新前缀时使用的一种机制。像前缀公告一样,前缀重新编址使用新的ICMPv6消息。
Ø
路径MTU发现(PMTUD)——源节点检测到目的主机的传送路径上最大MTU值的机制。ICMPv6消息也被用来执行这个任务。
4.邻居发现协议(NDP)
邻居发现协议(NDP)是IPv6中的一个关键协议,定义了下面这些机制:
Ø
替代ARP——因为ARP在IPv6中被去掉了,所以IPv6提供了一种新的确定本地链路上节点链路层地址的方法。这个新机制混合使用ICMPv6消息和多播地址。
Ø
无状态自动配置——这个机制允许本地链路上的节点混合使用ICMPv6消息和多播地址自己配置IPv6地址。
Ø
路由器重定向——路由器向一个IPv6节点发送ICMPv6消息,通知它在相同的本地链路上存在一个更好的到达目的网络的路由器地址。
邻居发现协议
|
替代
ARP协议
|
无状态自动配置
|
路由器重定向
|
前缀公告
|
前缀重新编址
|
重复地址检测
|
图
4-1 NDP包括的机制
为NDP特有的范畴定义新的ICMPv6消息,这些新的ICMPv6是路由器请求、路由器公告、邻居请求、邻居公告和重定向消息。
表4-1 为NDP定义的ICMPv6消息
ICMPv6类型
|
消息名称
|
类型
133
|
路由器请求(
RS)
|
类型
134
|
路由器公告(
RA)
|
类型
135
|
邻居请求(
NS)
|
类型
136
|
邻居公告(
NA)
|
类型
137
|
重定向消息
|
5.邻居请求和邻居公告工作原理
节点
A
|
节点
B
|
00:50:3e:e4:4c:00
FEC0::1:0:0:1:A
|
00:50:3e:e4:4b:01
FEC0::1:0:0:1:B
|
链路层地址
|
ICMPv6类型:
135(邻居请求)
源地址:
FEC0::1:0:0:1:A
目的地址:
FF02::1:FF01:B(被请求节点多播)
数据:
00:50:3e:e4:4c:00(节点
A的链路层地址)
源链路层地址:
00:50:3e:e4:4c:00
目的链路层地址:
33:33:FF:01:00:0B
|
ICMPv6类型:
136(邻居公告)
源地址:
FEC0::1:0:0:1:B
目的地址:
FEC0::1:0:0:1:A
数据:
00:50:3e:e4:4b:01(节点
B的链路层地址)
源链路层地址:
00:50:3e:e4:4b:01
目的链路层地址:
00:50:3e:e4:4c:00
|
图
5-1 用来发现本地链路上节点的链路层地址的邻居请求和邻居公告消息
步骤1:使用地址FEC0::1:0:0:1A的节点A要传送数据包到相同本地链路上的使用IPv6地址FEC0::1:0:0:1:B的目的节点B。然而节点A不知道节点B的链路层地址。节点A发送类型135的ICMPv6消息(邻居请求)到本地链路,它的本地站点地址FEC0::1:0:0:1:A作为IPv6源地址,与FEC0::1:0:0:1:B对应的被请求节点多播地址FF02::1:FF01:B作为目的地址,发送节点A的源链路层地址00:50:3E:E4:4C:00作为ICMPv6消息的数据。
步骤2:侦听本地链路上多播地址的节点B获取这个邻居请求消息,因为目的IPv6地址FF02::1:FF01:B代表它的IPv6地址FEC0::1:0:0:1:B相对应的被请求节点多播地址。
步骤3:节点B发送一个邻居公告消息应答,用它的本地站点地址FEC0::1:0:0:1:B作为IPv6源地址,本地站点地址FEC0::1:0:0:1:A作为目的IPv6地址。它还在ICMPv6消息中包括了它的链路层地址00:50:3E:E4:4B:01。
6.邻居缓存
一组有关单个邻居的表项,这些邻居接收到了最新的数据流。表项是连接单播地址的关键,它包括的信息有:其链路层地址、指示邻居是路由器还是主机的标志、指向任何排队等待完成地址解析数据包的指针等。邻居缓存表项还包括由邻居不达检测算法所使用的信息,如可达状态、探测无应答的次数以及下一次邻居不达检测发生的时间。
邻居缓存包含有邻居不可达检测算法维护的信息。邻居可达性状态是最关键的信息,它的取值是下列的5个值之一。
Ø
不完整性(INCOMPLETE):正在进行地址解析,邻居的链路层地址还没确定。
Ø
可达性(REACHABLE):邻居在最近处于可达状态(在小于10s以前)。
Ø
失效性(STALE):在数据流发送给该邻居以前邻居是不可达的,并无法验证其可达性。
Ø
延迟(DELAY):邻居不再是可达的,同时数据流在最近已经发送给邻居,但不立即对该邻居进行探测,而在一个短时延后发送探测信息,这样就可以为上层协议提供可达性确认。
Ø
探测(PROBE):邻居不再是可达的,同时发送单播邻居请求探测以验证可达性。
7.邻居可达性状态转换
表7-1 邻居可达性状态
状
态
|
描
述
|
INCOMPLETE
|
正在作地址解析,已发送
NS,还没有收到应答。
|
REACHABLE
|
在过去的
30秒中转发方向的通信已被确认。
|
STALE
|
在过去
30秒中在邻居缓存中的表项没有被确认,在邻居缓存中加入未请求的邻居宣告的发送者,状态为
STALE,在需要向该表项的主机发送通信前,不需要任何动作。
|
DELAY
|
在过去的
30秒钟没有收到可达性消息,并在过去
5秒内已向该邻居发送包。如果进入
DELAY状态
5秒后还没有收到被动确认,则发送
NS并将状态转移为
PROBE。
|
PROBE
|
已发送
NS验证可达性,还未收到
NA。
|
最初邻居缓存的表项在INCOMPLETE状态。当学习到该表项的链路层地址以后,转发方向的通信被确认,状态转入REACHABLE。在转发方向的通信不断地被确认时,状态保持在REACHABLE。
当无法从REACHABLE状态的主机收到可达性确认时,状态改变为STALE。从节点收到未经请求的RA或NA在邻居缓存中增加INCOMPLETE条目,然后立即转移到STALE状态。未经请求的宣告没有为转发通信提供任何信息。在向该表项节点发通信流之前表项保持STALE状态。
一旦向邻居发包,状态转移成DELAY,并且设置5秒定时器。即使主机处于STALE状态,包也发往缓存的链路层地址。如果在收到任何可达性确认以前定时器超时,则转入PROBE状态。如果确认可达性,则转入RECHABLE状态。
当转入PROBE状态后,向邻居所缓存的链路层地址发送NS。即使没有另外的包需要好、发送,在缺少应答条件下请求被每秒一次连续发送。在发送3次请求后1秒内没有收到应答,该表项从缓存内删除。
8.linux下IPv6邻居机制研究
(1)邻居相关命令
ip neighbours—neighbours管理命令
缩写
|
neighbour、
neighbor、
neigh、
n
|
对象
|
邻接(
neighbour)对象实现同一网段协议地址和链路层地址的绑定。在内核中,这些条目被组织到表中。
ipv4的相邻表也叫
ARP表。
ip neighbour命令支持对条目及其属性的显示、添加和删除。
|
命令
|
add、
change、
replace、
delete、
fulsh、
show(或者
list)
|
ip neighbour add – 添加一个新的邻接条目
ip neighbour change – 修改一个现有的条目
ip neighbour replace – 替换一个已有的条目
缩写:add、a;change、chg;replace、repl
简介:这三个命令用来建立一个邻接表的条目或者更新现有的邻接表条目。
参数
to ADDRESS(defaul)
|
相邻的协议地址。可以是
IPV4或者
IPV6
|
dev NAME
|
和相邻节点连接的设备
|
lladdr LLADDRESS
|
邻居的链路层地址。
LLADDRESS可以为空
|
nud NUD_STALE
|
邻接条目的状态。
nud是
Neighbour Unreachability Detection的缩写。可能的状态包括:
l
permanent – 邻接条目永远有效斌且只能由管理员删除
l
noarp – 邻接条目有效,不必对其有效性进行确认,在其生命期期满时会被删除
l
reachable – 在超时时间之内,这个邻接条目是有效的
l
stale – 这个邻接条目是有效的,但是比较可疑,如果条目是有效的,
ip neigh不会改变邻接状态,也不会修改其地址。
|
示例:
ip -6 n add fe80::20c:29ff:febe:5f36 lladdr 00:0c:29:be:5f:36 dev eth0 nud perm
ip -6 n add fe80::20c:29ff:febe:5f36 lladdr 00:0c:29:be:5f:36 dev eth0 nud reachable
ip -6 n del fe80::20c:29ff:febe:5f36 lladdr 00:0c:29:be:5f:36 dev eth0 nud noarp
ip -6 n chg fe80::20c:29ff:febe:5f36 dev eth0 nud perm
ip -6 n chg fe80::20c:29ff:febe:5f36 dev eth0 nud reachable
ip -6 n chg fe80::20c:29ff:febe:5f36 dev eth0 nud noarp
(2)linux下邻接条目操作
a)
添加永久状态邻居
【注】:此邻居一直存在。
b)
修改为reachable状态
【注】:修改后状态为reachable,30s后改为STALE,再过几十秒后失去此邻居。
c)
设置邻居为stale状态
【注】:几十秒后失去此邻居。
【结论】:
Ø
linux下邻居可达性状态可以通过命令来修改
Ø
在每次使用ip -6 n ls命令后,计时器并不重新开始计时
(3)linux下修改邻居可达性状态的时间值
查看文件/proc/sys/net/ipv6/neigh/eth0
(a)修改base_reachable_time的效果
几分钟后,状态依然维持
【分析】:此文件应该对应表7-1中“在过去的
30秒钟没有收到可达性消息,并在过去
5秒内已向该邻居发送包
”。
(b)修改delay_first_probe值
【分析】:此文件应该对应表7-1中“如果进入
DELAY状态
5秒后还没有收到被动确认,则发送
NS并将状态转移为
PROBE
”。
(c)修改base_reachable_time_ms值
【分析】:没有看到进入stale状态,应该是设置的1000ms时间太短。过程见表7-1。
【结论】:可以通过修改/proc/sys/net/ipv6/neigh/eth0中文件的值,来影响邻居可达性状态。