1.表示方式
长度128bits;
4个数字一组(16bits)中间用":"隔开
用16进制表示;
地址前缀长度用"/xx"表示,非掩码;
若以零开头,则零可以省略;
连续全零的组可以用"::"表示,一个地址中只能出现一次。
2.地址结构
前缀+接口标识
前缀:相当于IPv4中的网络ID
接口标识:相当于IPv4中的主机ID,接口ID生成方式:IEEE EUI-64自动生成;手动配置。
EUI-64规范:将48bits的MAC地址转化成64bits的接口ID
MAC地址格式中c bit表示厂商ID,d bit 表示厂商编号ID,“0”bit 代表全局/本地位,表示全球有效。g表示其是表示单个主机还是某个组。具体的转换算法为:将上述的0转换为1,在c和d之间插入两个字节:FFFE, 结果为IPv6接口ID。
3. IPv6地址分类
- 单播地址:标识一个接口,目的为单播地址的报文会被送到被标识的接口;
- 组播地址:标识多个接口,目的为组播地址的报文会被送到被标识的所有接口;
- 任播地址:标识多个接口,目的为任播地址的报文会被送到最近的一个被标识接口,最近节点是由路由协议来定义的,任播地址与单播地址使用同一个地址空间。
4. 单播地址
单播地址分为链路本地地址,站点本地地址,全球单播地址;
特殊的地址:
::/128 (全零地址),未被指定地址,用于IPv6节点在没有获取IPv6地址时的通讯;
::1/128 (环回地址),用于节点发送报文给自己;
内嵌IPv4地址,用于IPv4向IPv6过渡
4.1 本地使用地址:分为链路本地地址和站点本地地址
链路本地地址:只能在连接到同一本地链路的节点之间使用,使用特定的本地链路前缀FE80::/64(最高10位值为1111111010),同时将接口ID添加在后面作为地址的低64bits 。当一个节点启动IPv6协议栈时, 启动时节点的每个接口会自动配置一个本地链路地址。这种机制使得两个连接到同一链路的IPv6节点不需要做任何配置就可以通讯。
站点本地地址:站点本地地址仅仅能在一个站点内使用,类似IPv4中的私有地址比较。任何没有申请到提供商分配的全球单播地址的组织机构都可以使用本地站点地址。对于站点本地地址来说,前48bits 总是固定的,其中前十bits 固定为1111111011(FEC0),紧跟在后面的是连续38bits 0。在接口ID和48bits 特定前缀之间有16bits子网ID字段,供机构在内部构建子网。与链路本地地址不同的是,站点本地地址不是自动生成的。一个本地站点前缀和地址可以分配给站点内的任何节点,包括路由器。
4.2 全球单播地址:IPv6公网地址
已经分配的全球路由前缀,目前分配的为001开头的;
1) 2001::/16 IPv6 Internet
2) 2002::/16 6to4隧道
3) 2003::/16-3ffd::/16 未指定
4) 3ffe::/16 6bone
4.3 内嵌IPv4地址,当需要将IPv4与IPv6地址建立联系时使用,目前分为两种格式:一种是IPv4兼容IPv6地址,另一种是IPv4映射IPv6地址。
IPv4兼容IPv6地址:以96bits 0加上32bits IPv4地址形成,用于IPv4兼容IPv6自动隧道,IPv4兼容地址被节点用于通过IPv4路由器以隧道方式传送IPv6包。
IPv4映射IPv6地址:以80bits 0加上16bits 1,再加上IPv4地址形成,用于IPv4与IPv6的互通,目前有SIIT(Stateless IP/ICMP Translation)应用,IPv4映射地址则被IPv6节点用于访问只支持IPv4的节点。
5. 组播地址
组播目的地址的报文会被发送到该组播地址代表的一组接口,组播地址也有特定的前缀来标识,其最高位前8bits 为1(FF).
Flags标志位:前3bits保留为0,分为两类。
0000:永久多播地址
0001:临时多播地址
Scope 应用范围:
范围(Scope)用来限制组播数据流在网络中发送的范围。该字段占有4bits 。RFC3513是这样定义该字段的:
0:预留
1:节点本地范围,单个接口有效,仅用于Loopback通讯
2:链路本地范围
4:管理本地范围,由管理员配置
5:站点本地范围
8:组织本地范围,属于组织的多个站点
E:全球范围
F:预留
Group ID:
组ID
5.1 预定义组播地址
Node-local
所有节点的组播地址: FF01:0:0:0:0:0:0:1
所有路由器的组播地址: FF01:0:0:0:0:0:0:2
Link-local
所有节点的组播地址: FF02:0:0:0:0:0:0:1
所有路由器的组播地址: FF02:0:0:0:0:0:0:2
Solicited-Node组播地址: FF02:0:0:0:0:1:FFXX:XXXX(接口ID的后24bits,用于重复地址检测和节点用来获取相同本地链路上邻居节点的链路层地址)
所有OSPF路由器组播地址: FF02:0:0:0:0:0:0:5
所有OSPF的DR路由器组播地址: FF02:0:0:0:0:0:0:6
所有RIP路由器组播地址: FF02:0:0:0:0:0:0:9
所有PIM路由器组播地址: FF02:0:0:0:0:0:0:13
站点本地范围所有路由器组播地址: FF05::2
6. 任播地址
代表一组接口,但是发往任播的报文只会被发送到最近的一个接口;
任播地址与单播地址使用相同的地址空间,因此任播与单播的表示无任何区别;配置时须明确表明是任播地址,以此区别单播和任播;
任播地址仅被用做目标地址,且仅分配给路由器;
7. IPv6报文结构
IPv6报文一般都有三个部分组成:
基本报头:包括报文转发的基本信息,路由器通过基本报头解析就能完成绝大多数的报文转发任务;
扩展报头:包括一些扩展的报文转发信息,该部分不是必需的,也并不是每个路由器都需要处理,一般只有在目的路由器(或者主机)才处理扩展报头;
上层协议数据单元:这部分与IPv4的上层协议数据单元没有区别
7.1 基本报头
IPv6基本报头也称之为固定报头。固定报头包含8个字段,总长度为40个bytes 。这8个字段分别为:版本(Version)、流量级别(Traffic Class)、流标签(Flow Label)、载荷长度(Payload Length)、 下一 个报头(Next Header)、跳数限制(Hop Limit)、源IPv6地址、目的IPv6地址。
版本(Version)
该字段规定了IP协议的版本,其值为6。长度为4bits 。
通信流类别(Traffic Class)
该字段功能和IPv4中的服务类型功能类似,表示IPv6数据包的类或优先级。长度为8bits 。RFC2460中没有定义通信流类别字段的值。RFC2474以区分服务(DS)字段的形式,为通信流类别提供了一个可替换 的定义。
流标签(Flow Label)
与IPv4相比,该字段是新增的。它用来标识这个数据包属于源节点和目标节点之间的一个特定数据包序列,它需要由中间IPv6路由器进行特殊处理。该字段长度为20bits 。关于流标签字段的使用的详细细节,还 没有具体协议定义。一般来说一个流可以通过源/目的IPv6地址和流标签来确定。
有效载荷长度(Payload Length)
该字段表示IPv6数据包有效载荷的长度。有效载荷是指紧跟IPv6包头的数据包的其它部分(即扩展报头和上层协议数据单元)。该字段长度为16bits 。那么该字段只能表示最大长度为65535bytes的有效载荷。 如果有效载荷的长度超过这个值,该字段会置0,而有效载荷的长度用逐跳选项扩展报头中的超大有效载荷选项来表示。
下一个报头(Next Header)
该字段定义紧跟在IPv6报头后面的第一个扩展报头(如果存在)的类型,或者上层协议数据单元中的协议类型。该字段长度为8bits。关于扩展报头的详细信息后面回提及。
跳数限制(Hop Limit)
该字段类似于IPv4中的Time to Live字段。它定义了IP数据包所能经过的最大跳数。每经过一个路由器,该数值减去1,当该字段的值为0时,数据包将被丢弃。该字段长度为8bits 。
源地址(Source Address)
表示发送方的地址,长度为128bits。
目的地址(Destination Address)
表示接收方的地址,长度为128bits。
7.2 IPv4与IPv6基本报头对比
IPv4报头中的内容包括:
版本(Version)
该字段规定了IP协议的版本,其值为4。长度为4bits。
Internet报头长度(IHL)
该字段表示有效载荷之前的4bytes块的数量。该字段长度为4bits。因为IPv4报头的最小长度为20bytes,所以其值最小为5。
服务类型(Type of Service)
该字段指定路由器在传送过程中如何处理数据包。也可以这么说:表示这个数据包在由IPv4网络中的路由器转发时所期待的服务。这个字段长度为8bits。这个字段也可以解释为区分业务编码点(DSCP)。。
总长度(Total Length)
该字段表示IP数据包的总长度(单位为byte),包括包头和有效载荷。这个字段的长度为16bits。
标识(Identification)
该字段和后面提到的标志以及分段偏移量字段都是和分段有关的字段。标识字段由IPv4数据包的源节点来选择,如果IPv4数据包被拆分了,则所有的片断都保留标识字段得值,以使目标节点可以对片断进行重 组。该字段长度为16bits。
标志位(Flags)
该字段长度为3bits,当前只定义了2bits,一个用来表示是否可以对IPv4数据包进行拆分,另一个表示在当前的片断之后是否还有片断。
片段偏移量(Fragment Offset)
该字段表示相对于原始IPv4有效载荷起始位置的相对位置。这个字段的长度为13位。
生存时间(Time to Live)
该字段指出了一个IPv4数据包在被丢弃前,可以经过的链路的最大数量。该字段值每经过一个路由器该字段减去1,当为0时,数据包将被丢弃。长度为8bits。
协议(Protocol)
该字段用于标识有效载荷中的上层协议。长度为8bits。
报头校验和(Header Checksum)
表示IP包头的校验和,用于错误检查。请注意:该字段仅用于IP包头的校验和,有效载荷不包括在校验和计算中。数据包沿途的每个中间路由器都重新计算和验证该字段(因为路由器转发数据包时,TTL值都变 化)。该字段长度为16bits。
源地址(Source Address)
发送方的IP地址,长度为32bits。
目的地址(Destination Address)
接收方的IP地址,长度为32bits。
选项(Options)
该字段是一个可选项。
通过将IPv6报文头和IPv4报文头进行比较,我们就发现IPv6中去掉了几个在IPv4中存在的字段:包头长度、标识、标志、分段偏移量、包头校验和、选项和填充。为什么要去掉这几项呢?其实IPv6设计者是很有 深意的。首先分析一下报头长度字段。我们知道在IPv4包头中,包头长度指有效载荷之前的4bytes块的数量,也就是数据报头的总长度,包括选项字段部分。如果有选项字段,IPv4数据包头长度就要增加,所以 IPv4报头长度的值不是固定的。而IPv6不使用选项字段,而是用扩展字段,基本IPv6报头长度是固定的40个bytes,扩展字段的处理不同于IPv4对选项字段的处理。
由于IPv6处理分段有所不同,所以标识、标志和分段偏移量等三个和分段有关系的字段也被去掉。在IPv6网络中,中间路由器不再处理分段,而只在产生数据包的源节点处理分段。去掉分段字段也就省却了中间 路由器为处理分段而耗费的大量CPU资源。那么包头校验和字段为什么要去掉呢?IPv6设计者们认为第2层、第4层都有校验和(UDP校验和在IPv4中是可选的,在IPv6中则是必需的),因此第3层校验和是冗余 的,不是必需的,而且浪费中间路由器的资源。由于IPv6从根本上改变了选项字段,在IPv6中选项由扩展报头处理,因此也去掉了选项字段,简化了报头,减少了发送路径上中间路由器的处理消耗。
7.3 扩展报头
IPv6的基本报头里面携带了转发所需要的基本信息,而原来IPv4中的选项部分被放在扩展报头中。
IPv6扩展报头是可能跟在基本IPv6报头后面的可选报头。为什么在IPv6中要设计扩展报头这种字段呢?我们知道在IPv4的报头中包含了所有的选项,因此每个中间路由器都必须检查这些选项是否存在,如果存在,就 必须处理它们。这种设计方法会降低路由器转发IPv4数据包的效率。为了解决转发效率问题,在IPv6中,相关选项被移到了扩展报头中。中间路由器就不需要处理每一个可能出现的选项(在IPv6中,每一个中间路由 器必须处理唯一的扩展报头是逐跳选项扩展报头),这种处理方式提高了路由器处理数据包的速度,也提高了其转发性能。
扩展报头种类:
逐跳选项扩展头 Hop by Hop Options Header
路由扩展头 Routing Header
分段扩展头 Fragment Header
目的选项扩展头 Destination Options Header
身份验证扩展头 Authentication Header
封装安全性净荷扩展头 Encapsulating Security Payload Header
扩展报头可以出现多次,顺序如下
IPv6 basic header
1. Hop-by-Hop Options header
2. Destination Options header
3. Routing header
4. Fragment header
5. Authentication header
6. Encapsulating Security Payload header
7. Destination Options header
Upper-layer header
除目的选项扩展头外,每种扩展报头只能出现一次
目的选项扩展头最多出现两次,一次在路由扩展头之前,一次在上层数据之前,如果没有路由扩展头,则只能出现一次
8. 实验
===========[华为模拟器]
[Switch]ipv6 #全局启用ipv6
[Switch]interface Vlanif2
[Switch-Vlanif2]ipv6 enable
[Switch-Vlanif2]ipv6 address FEC0::/64 eui-64
[Switch-Vlanif2]interface Vlanif3
[Switch-Vlanif3]ipv6 enable
[Switch-Vlanif3]ipv6 address FEC0:0:13::1/64
[Switch]ipv6 route-static :: 0 Vlanif3 FE80::2E0:FCFF:FE22:2027 #出接口为链路本地地址
#查看
[Switch-Vlanif2]dis ipv6 interface Vlanif 2
Vlanif2 current state : UP
IPv6 protocol current state : UP
IPv6 is enabled, link-local address is FE80::4E1F:CCFF:FE3E:2AA2
Global unicast address(es):
FEC0::4E1F:CCFF:FE3E:2AA2, subnet is FEC0::/64
Joined group address(es):
FF02::1:FF3E:2AA2
FF02::2
FF02::1
MTU is 1500 bytes
ND DAD is enabled, number of DAD attempts: 1
ND reachable time is 30000 milliseconds
ND retransmit interval is 1000 milliseconds
Hosts use stateless autoconfig for addresses
[Switch-Vlanif2]dis ipv6 interface Vlanif 3
Vlanif3 current state : UP
IPv6 protocol current state : UP
IPv6 is enabled, link-local address is FE80::4E1F:CCFF:FE3E:2AA2
Global unicast address(es):
FEC0:0:13::1, subnet is FEC0:0:13::/64
Joined group address(es):
FF02::1:FF00:1
FF02::1:FF3E:2AA2
FF02::2
FF02::1
MTU is 1500 bytes
ND DAD is enabled, number of DAD attempts: 1
ND reachable time is 30000 milliseconds
ND retransmit interval is 1000 milliseconds
Hosts use stateless autoconfig for addresses
[Switch]dis ipv6 routing-table protocol static
Public Routing Table : Static
Summary Count : 1
Static Routing Table's Status : < Active >
Summary Count : 1
Destination : :: PrefixLength : 0
NextHop : FE80::2E0:FCFF:FE22:2027 Preference : 60
Cost : 0 Protocol : Static
RelayNextHop : :: TunnelID : 0x0
Interface : Vlanif3 Flags : D