1 IPv6的优势
l 提供2的128次方地址,大约340万亿亿个地址;
l 层次化路由,前3位固定,第4~16位是顶级聚合,理论上互联网骨干网路由只有8192条路由(2的13次方);
l 定长报头(40Byte),多达12个选项,分为基本头和扩展头;
l 支持即插即用,设备接入到网络中可以自动获取网络前缀和参数,结合自身链路地址生成IP地址,简化网络管理;
l 更好的安全保障,实现扩展头支持ipsec,无需借助其它安全设备进行加密;
l 引入了流标签(flow lable),可以进行相同流量标记,实施QOS。
2 IPv6地址介绍
2.1 地址表示
128位,16位分为1块,总共8块(216=65536,用16进制表示则164=65536,因此每块是4位的16进制数)
对比ipv4,32位,8位1块(28=256),分为4块
举例:1001:0fa4:0001:2c00:0000:0000:0002:0ef1
简化规则1:每一块的起始0可以省略
1001:0fa4: 1:2c00: 0: 0: 2:0ef1
简化规则2:有1个或连续的多个0组成的地址块可以用::取代,但不能有多个::
1001:0fa4: 1:2c00::2:0ef1
2.2 地址结构
比较常用的是64位前缀
2.3 EUI64
电气和电子工程师协会 (IEEE)定义,将 EUI-64 地址指派给网络适配器,或从 IEEE802(MAC) 地址派生得到该地址。配合无状态自动配置一起自动生成IPv6地址或者接口启用ipv6后自动生成link-local地址。规则如下:
MAC地址(IEEE802)为48位,由24位公司标识和24位扩展标识组成,高7位(U/L位)为0表示该地址唯一;
注:G/L(Global/Local,也称为U/L位,其中U表示Universal)位,如果G/L=0,则是全局管理地址,由IEEE分配;如果G/L=1,则是本地管理地址,是网络管理员为了加强自己对网络管理而指定的地址。
1. 现将MAC地址(IEEE802)转换为IEEE EUI-64,MAC是48位,而IEEE EUI-64是60位,将16 位的 11111111 11111110 (0xFFFE)插入公司 ID 和扩展 ID 之间的 IEEE 802 地址中
2. 第7位(U/L位)反转为1,即得到IPV6接口标识符IEEE EUI-64地址
2.4 无状态自动配置(SLAAC)
1) PC接入网络,发送RS消息(类型为133的ICMPv6,目的FF02::2(所有路由器));
2) 路由器回应RA消息(类型134),该消息包括PC需要的前缀、前缀长度等,目的为FF02::1(所有主机)
3) PC收到RA消息后,使用消息中的前缀和前缀长度完成地址的自动配置(前缀+EUI64接口ID),并且将消息中宣告的链路本地地址添加到本地的默认路由中作为默认网关
4) 进一步也会使用改地址进行DAD(重复地址检测)
注:RS:路由器请求(router solicitation),RA:路由器通告(router advertisement)
2.5 IPv6单播地址
2.5.1 链路本地地址(Link-local Address)
只在同一链路有效,在IPv6启动后自动生成,使用特定前缀FE80::/10,接口ID使用EUI64自动生成或者手动配置,可以实现无状态自动配置、邻居发现等应用,OSPFV3和RIPng等协议工作在链路本地地址上。
2.5.2 唯一本地地址(ULA,Unique Local IPv6 Unicast Address)
唯一本地地址是IPv6网络中可以随意使用的私有地址,相当于IPv4的私有地址,用以取代RFC3879定义的站点本地地址(Site-local),使用特定前缀FD00/8,格式如下
Prefix |
Global ID |
Subnet ID |
Interface ID |
固定前缀:8bit,FD00/8
Global ID:40bit,全球唯一前缀,通过伪随机方式生成
Subnet ID:16bit,工程师根据网络规划自定义子网ID
Interface ID:64bit,相当于IPv4的主机位
2.5.3 全球单播地址(Global Unicast Addresses)
相当于IPv4的公网地址,目前已经分配出去的前三位固定是001,所以已分配的地址范围是2000::/3.格式如下:
001 |
TLA |
RES |
NLA |
SLA |
Interface ID |
001:3bit,已固定为001;
TLA(Top Level Aggregation)顶级聚合:13bit,IPv6管理机构根据TLA分配给不同的骨干网ISP,最大8192个顶级路由()
RES:8bit,保留,为未来扩充TLA或NLA
NLA(Next Level Aggregation)次级聚合:24bit,骨干网ISP根据NLA分配给各中小ISP不同的IP地址段,中小ISP可以针对NLA继续分割;
SLA(Site Level Aggregation):16bit,公司或企业内部根据根据SLA把同一大块地址分成不同的网段,分配给各站点使用,一般做公司网络内部规划,最大65536
2.5.4 嵌入IPv4的IPv6地址
1. 兼容IPv4的IPv6地址(IPv4-compatible address)
80bit |
16bit |
32bit |
0000 ………………………… 0000 |
0000 |
IPv4 address |
低32位携带一个IPv4地址,主要用于IPv4兼容IPv6隧道,由于每个地址都需要一个单播的IPv4地址,扩展性差基本已被6to4隧道取代
2. 映射IPv4的IPv6地址(IPv4-mapped address)
80bit |
16bit |
32bit |
0000 ………………………… 0000 |
FFFF |
IPv4 address |
前80位全0,后16位全1,最后为32位IPv4地址,用于把IPv4地址用IPv6表示
3. 6to4地址
用于6to4隧道,使用IANA指定的2002::/16为前缀,其后是32位的IPv4地址(转换为16进制),6to4后80位由用户自己定义,可对前16位进行划分,定义多个IPv6子网,不同的6to4使用不同的48位前缀,彼此之间用使用其中内嵌32位IPv4地址的自动隧道来建立连接。
2002(16bit)+IPv4(32bit)+子网(80bit)
2.5.5 单播地址分类总结表
地址类型 |
高位二进制 |
十六进制 |
链路本地地址 |
1111111010 |
FE80::/10 |
站点本地地址(已废除) |
1111111011 |
FEC0::/10 |
唯一本地地址 |
11111101 |
FD00::/8 |
全球单播地址(已分配) |
001 |
2::/4或3::/4 |
2.6 IPv6任意播地址
RFC1546(Host Anycasting Service)提出,主要为DNS和http提供服务,但IPv6并没有为任意播规划独立的网段,使用和单播地址相同的网段,多台设备可以有相同的任意播地址,以任意播地址为目标的数据包会通过路由器的路由表被路由到离源设备最近的拥有该目标地址的设备。不可以作为ipv6的源地址.
RFC2526(Reserved IPv6 Subnet Anycast Addresses),保留的子网任意传送地址,在每个子网内,接口标识符的最高128位被保留作为子网任意传送地址。IPv6地址类型需要64位的 EUI-64格式的接口标识符,在所有保留的任意传送地址中G/L位必须设为0(本地),用来表明接口标识符在全球并不是唯一的。
2.7 IPv6组播地址
FF(8) |
Flags(4) |
Scop(4) |
Group id(112) |
FF:8bit,ipv6的的组播固定为FF::/8开头
Flags (标志):4bit,格式0|R|P|T
Ø 第一位保留,固定为0;
Ø R位:0代表非内嵌RP,1代表内嵌RP,RFC3956;
Ø P位:0代表非基于单播前缀的组播地址,1代表单播前缀的组播地址,P取1则T必须为1,RFC3306;
Ø T位:0表示永久分配的组播地址(周知),1表示非永久分配(临时分配).
Scop(范围):4bit,标识传播范围
0 reserved ;
1 Interface-Local scope ( 0001,节点);
2 Link-Local scope(0010,链路);
3 reserved;
4 Admin-Local scope;
5 Site-Local scope(0101,站点);
6 (unassigned);
7 (unassigned);
8 Organization-Local scope(1000,组织);
9 (unassigned);
A (unassigned);
B (unassigned);
C (unassigned);
D (unassigned);
E Global scope(1110,全球);
F reserved;
Group id:112bit,组播标识符
固定的组播地址:
所有节点的组播地址(相当于IPV4的广播):FF02::1
所有路由器的组播地址(相当于224.0.0.2):FF02::2
所有OSPF V3的路由器(相当于224.0.0.5):FF02::5
所有OSPF V3的DR和BDR(相当于224.0.0.6):FF02::6
所有RIP路由器(相当于224.0.0.9):FF02::9
所有PIM路由器(相当于224.0.0.13):FF02::D
被请求节点组播地址:由固定的前缀FF02::1:FF00:0/104和单播地址的最后24位组成。
以太网组播地址映射关系
与IPv4不同,以太网组播地址为33:33加上组播地址的后32位
如:FF02::1,以太网组播为33:33::1
2.8 特殊地址
0:0:0:0:0:0:0:0(简化为0::),未指定地址(Unspecified address),不能分配给任何节点,当设备刚接入网络没有任何地址,则使用该地址作为源地址发送数据包,比如RA消息,DAD(重复地址检测),该地址不能作为目的;
0:0:0:0:0:0:0:1(简化为::1),环回地址(Loopback address),相当于127.0.0.1
3 IPv6报文格式
3.1 格式
IPv6报文的报文头分为基本头和扩展头2部分,基本头只包含基本的必要属性比如源目的IP,扩展功能用扩展头添加在基本头的后面。IPv6头部定长为40字节(不包含扩展头部)
Version:4bit,6表示IPv6;
Traffic class:8bit,流量类别,类似于IPv4的TOS和DSCP;
Flow Label:20bit,流标签。该字段用来标记IP数据包的同一个流,IPv6新增字段,试用阶段,路由器可以用该字段辨别同一个流,而不用处理流中的每个数据包头;
Payload Length:16bit,数据包的有效载荷,指包头后的数据内容长度(包含扩展头部分),单位是Byte,最大65535,和IPv4不同的是,IPv4的Total Length包含了报文头长度,而IPv6的Payload Length不包含报文头,但包括扩展报头。
Next Header:8bit,下一报头,该字段指明了跟随在IPv6基本报头后的扩展报头的信息类型,如果只有基本头而无扩展头,那么该字段的值指示的是数据部分所承载的协议类型,类似IPv4的协议字段;
Hop Limit:8bit,类似于IPv4的ttl,最大值255;
Source Address:128bit,该报文的源地址;
Destination Address:128bit,该报文的目的地址;
Extension Headers:可变,扩展包头;
3.2 Next Header
不是所有的扩展报头都需要被转发路由设备查看和处理的。路由设备转发时根据基本报头中Next Header值来决定是否要处理扩展头。除了目的选项扩展报头出现两次(一次在路由扩展报头之前,另一次在上层扩展报头之前),其余扩展报头只出现一次。
Next Header值 |
对应的扩展头或高层协议类型 |
0 |
逐跳选项扩展报头 |
6 |
TCP |
17 |
UDP |
43 |
路由扩展报头 |
44 |
分片扩展报头 |
50 |
ESP扩展报头 |
51 |
AH扩展报头 |
58 |
ICMPv6 |
60 |
目的选型扩展报头(指那些将被分组报文的最终目的地处理的选项) |
89 |
OSPFv3 |
3.3 IPv6扩展头
3.3.1 扩展头结构
基本头定长40Byte,IPv6的扩展头取代了IPv4的选项字段,分片字段独立出来设计为分片扩展头,提高了中间设备对IPv6报文的转发效率;
IPv6数据包有0个或多个扩展头,每个扩展头的长度是8Byte的整数倍;
IPv6基本头和扩展头的Next Header字段表明了紧跟在本报头后面是什么内容,可能是另一个扩展头或高层协议;
IPv6扩展头被当作IPv6的静载荷一部分,计算在IPv6的Payload length。
无扩展头的IPv6报文:
IPv6基本头 |
TCP头 |
DATA |
一个扩展头的IPv6报文:
IPv6基本头 |
分片扩展头 |
TCP头 |
DATA |
多个扩展头的IPv6报文:
IPv6基本头 |
路由选择扩展头 |
认证报头扩展头 |
TCP头 |
DATA |
目前RFC2460定义了6个IPv6扩展头:逐跳选项报头、目的选项报头、路由报头、分片报头、认证报头、封装安全载荷报头。
逐跳选项扩展头和目的选项扩展头的数据部分采用TLV格式(Type-Length-Vlaue)
Option Type(8) |
Opt Data Length(8) |
Option Data |
Option Type:8bit,标识类型,最高2位表示当设备识别此扩展头的处理方法;
00跳过这个选项;
01丢弃数据包并不通知对方;
10丢弃数据包,不论目的是否为组播,向发送方发送一个ICMPv6的错误信息报文;
11丢弃数据包,当目的不是组播时,向发送方发送一个ICMPv6的错误信息报文。
第3位表示在选路过程中,Data部分是否可以被改变,0表示不能改变,1表示可以改变;如果存在认证扩展头,在计算数据包的校验值时可变化Data部分需要被当做8bit的全0处理。
Opt Data Length:8bit,标识Option Data的长度部分,最大255,单位Byte,不包括Option Type和Opt Data Length长度;
Opt Data:最大255Byte
3.3.2 已定义的扩展头
1. 逐跳选项扩展头
Next Header=0,用于携带在报文发送路径上必须被每一跳路由器检查和处理的可选信息,类似IPv4中的Router Alert选项。目前只定义了一个逐跳选项--巨型净载荷选项,通过这个选项,允许IPv6的报文有效净荷超过65535Byte。
Next Header(8) |
Hdr ext Len(8) |
Option(TLV格式) |
Next Header:8bit,作用与基本头的Next Header相同;
Hdr ext Len:8bit,标识Option的长度,以8Byte为单位,不包含扩展头的第一个8byte,即如果扩展头只有8Byte,则该字段为0;
Option:携带不定数量的TLV格式选项,目前唯一定义的就是巨型净载荷选项。使用巨型净载荷选项,要求IPv6头的16位净载荷长度字段值为0,扩展头中的巨型净载荷长度字段值不小于65535,此外还有一个限制:如果包中有分片扩展头就不能同时使用巨型净载荷选项,因为使用巨型净载荷不能分片。
巨型净载荷选项的选项类型是194,由于整个选项扩展头只有8Byte,所以扩展头长度为0,选项数据长度为4,表示巨型净载荷长度是32bit,所以使用巨型净载荷选项,IPv6数据包的净载荷最大可达到232-1Byte,IPv6基本头不包括在内。
巨型净载荷选项如下:
Next Header |
Hdr Ext Len=0 |
Option Type=194 |
Opt Data Len=4 |
Option Data(巨型净载荷长度) |
举例净载荷为100000Byte的IPv6数据包
浅蓝色为IPv6的基本头,浅绿色+浅黄色为逐跳扩展头,浅黄色为类型为0的巨型净载荷选项。
2. 路由选择扩展头
Next Header=43,包含IPv6数据包到达目的地所要经过的中间节点,使源端可以强制数据包经过哪些节点,类似IPv4中的松散源路由.
Next Header |
Hdr Ext Len |
Routing Type |
Segments Left |
Type-specific Data |
Next Header:8bit,作用同基本头的Next Header
Hdr ext Len:8bit,标识Option的长度,以8Byte为单位,不包含扩展头的第一个8byte,即如果扩展头只有8Byte,则该字段为0;
Routing Type:8bit,目前只定义了类型0,表示数据需要经过的路由器地址;举例如下图
Segments Left:表示数据包需要经过中间节点的数量,最大255
Type-specific Data:内容有Routing Type决定
Reserved:保留部分,32位,Address[1],Address[2]等表示数据包需要经过的中间节点
因为Hdr ext Len的单位为8byte(64Bit),所有Hdr ext Len字段部分的数值为所需经过节点数(128Bit)*2
Next Header |
Hdr Ext Len |
Routing Type=0 |
Segments Left |
Reserved |
|||
Address[1] |
|||
Address[2] |
|||
… … |
使用路由扩展头时,源端数据包的目的并非实际的最终目的,而是第一个中间节点Address[1],Segments Left表示需要经过的节点数,中间的其他路由器忽略路由选择扩展头,数据包到达第一个指定节点Address[1]时才处理此路由选择扩展头,数据包的目的地址替换为第二个指定节点Address[2],Segments Left值减1,以此类推,数据包到达最终目的的,最终Segments Left为0.
如图IP1和IP2是数据包转发需要经过的节点,则源主机发送的源为S,目的为第一个节点IP1,在路由选择头中又2个IP,分别是第2个节点IP2和最终节点D,数据包到达IP1后,数据包的目的被替换为IP2,同时Segments Left减1.
3. 分片扩展头
Next Header=44,如果源端发送的数据包大小超过了Path MTU大小,则源端在发送前需要对报文进行分片,在IPv4中,数据包超过MTU大小,中间路由器会对报文进行分片,而在IPv6中,中间路由器不能对报文进行分片;如果中间路由器转发的报文超过了接口MTU,数据报文将被丢弃,同时路由器会发送一个ICMPv6的错误信息给源端。
Next Header |
Reserved |
Fragment Offset |
RES |
M |
Identification |
Next Header:8bit,作用同基本头的Next Header
Reserved:8bit,保留部分全0
Fragment Offset:13bit,等同于IPv4中的片偏移(Fragment Offset)字段,且与IPv4片偏移一样以8Byte为单位,比如该值为150,表示该报文的数据位于原报文的1200Byte处。
Res:2bit,保留未使用
M:1bit,表示是否还有后续分片,1表示有,0表示无
Identification:32位,等同于IPv4的标识符(Identification)(IPv4的标识符为16bit),用于标识同一分组的分片报文,便于接收端重组。
由于分片扩展头是定长8Byte设计,所有扩展头的长度无意义,全设为0.
使用方式:
假设源端要发送2000Byte的IP数据,分段标识(Identification)为1111,MTU为1400Byte:
1. 由于IPv6基本头定长40Byte,所以数据包的有效净载荷为1360;
2. 由于要分段,加入分段扩展头8Byte,所以有效净载荷为1352;
3. 2000Byte的数据要分为2段,第一段有效净载荷长度为1360,有效净载荷的数据报文是1352,第二段的有效净载荷长度是656,有效净载荷的数据部分是648,两段的标识都是1111
4. ESP扩展头
Next Header=50,提供数据包的完整性校验和加密,ESP将需要加密的字段加密后放入ESP头的数据部分,ESP和AH联合使用,用来提供认证和加密。
Security Parameters Index(SPI) |
||||
Sequence Number |
||||
Payload Data(variable) |
||||
|
Padding(0~255Byte) |
|||
|
Pad Length |
Next Header |
||
Authentication Data(variable) |
||||
|
SPI:32bit,与目的地址和AH协议组合,唯一标识本数据包的SA;
Sequence Num:32bit,是一个单调递增的数,用于防重放***;
Payload Data:可变长,加密数据;
Padding:填充,由于加密数据必须为4Byte(32bit)的整数倍,所以有时候需要填充,内容根据加密算法,最大255Byte;
Pad Length:8bit,标识Padding部分长度,0表示无填充;
Next Header:8bit,作用同基本头的Next Head;
Authentication Data:可变长,身份验证。
5. AH扩展头
Next Header=51,为报文提供完整性验证,在传输过程中不被改变的字段会被用作认证信息计算,可能改变的(如Hop Limit)做0处理,如果有多个扩展头,AH扩展头必须置于中间节点处理的扩展头之后,以及目的地址处理的扩展头之前。
Next Header |
Payload Len |
Reserved |
|
Security Parameters Index(SPI) |
|||
Sequence Number Field |
|||
Integrity Check Value-ICV(variable) |
|||
Next Header:8bit,作用同基本头的Next Header;
Payload Len:8bit,标识认证报头的总长度,单位是4Byte,最大255;
Reserved:16bit,保留全为0;
SPI:32位,与目的地址和AH协议组合,唯一标识本数据包的SA;
Sequence Num:32位,一个单调递增的数,可用于防重放***;
Integrity Check Value:可变长,必须为4Byte的整数倍,其内容用作完整性检查。
6. 目的选项扩展头
Next Header=60,取代了IPv4的Option字段,携带只能由目的地址才能处理的信息
Next Header |
Hdr Ext Len |
|
|
Option |
|||
Next Header:8bit,作用同基本头的Next Header;
Hdr Ext Len:8bit,标识Option头的长度,该长度以8Byte为单位,不包括扩展头的第一个8Byte,即如果该扩展头只有8Byte,该字段为0
Option:包含一个或多个TLV格式的选项。
7. 总结
扩展头 |
值 |
作用 |
逐跳选项扩展头 |
0 |
类似IPv4中的Router Alert,目前只有巨型净载荷选项选项 |
路由选择扩展头 |
43 |
类似IPv4中的松散源路由 |
分片扩展头 |
44 |
分片,IPv6只能由源节点进行分片 |
ESP扩展头 |
50 |
ESP加密 |
AH扩展头 |
51 |
AH验证 |
目的选项扩展头 |
60 |
携带只能由目的地址才能处理的信息 |
如果有多个扩展头,必须按照以下顺序出现:
l IPv6基本头
l 逐跳选项扩展头(0)
l 目的选项扩展头(60)
l 路由选择扩展头(43)
l 分片扩展头(44)
l AH扩展头(51)
l ESP扩展头(50)
l 目的选项扩展头(60,指那些将被分组报文的最终目的地处理的选项)
l 上层协议数据报文
除了逐条选项扩展头外,其余扩展头在传输路径中不被路由器查看,这种机制保证了路由器只查看和选路相关的基本头字段,保证了转发数据的高效。每个扩展头的大小是8Byte的整数倍。
除了目的选项扩展头最多出现两次(一次在路由选择扩展头前,一次在上层协议头部前)以外,每个扩展头应该只出现一次。
3.4 与IPv4的比较
IPv6与IPv4相比,减掉了6个字段,新增了1个字段;
l IPv6使用定长40Byte设计,因此去除了IHL字段;
l 分片功能由分片扩展头去实现,因此去除了Identification/Flags/Fragment Offset这3个字段;
l 去除了首部校验,原因有三:
1. 数据链路层大都已经对数据进行了校验
2. 四层协议也有类似的校验功能
3. TTL每跳都在变,路由器需要频繁对数据包进行校验,影响数据包的转发效率
l 去除Padding字段。
l 新增了Flow Label字段,
相同或相似点:
l Version字段相同;
l IPv4的TOS字段相当于IPv6的Traffic class;
l IPv5的Total Length相当于IPv6的Payload length,但IPv6的Payload length不包括报头,而IPv4的Total Length包括报头;
l IPv4的TTL相当于IPv6的Hop Limit;
l IPv4的Protocol相当于IPv6的Next header,但IPv6的Next header扩展性更高;
l IPv4的Options相当于IPv6的Extension Headers.
4 拓展--MAC地址
摘自百度百科。
MAC地址标准为IEEE802地址,共48位,24 位公司 ID(也称为制造商 ID)和 24位扩展ID(也称为底板 ID)组成。
全局/本地(U/L):
U/L位是第一个字节的第七位,用于确定该地址是全局管理的还是本地管理的。如果将 U/L 位设置为 0,那么通过分配唯一的公司 ID,IEEE 已对地址进行了管理。如果 U/L 位被设置为 1,则地址是本地管理的。网络管理员已覆盖制造地址,并指定其他地址。
个人/组 (I/G)
I/G 位是第一个字节的最低位(第8位),用来确定地址是个人地址(单播)还是组地址(多播)。设置为 0 时,地址是单播地址。设置为 1 时,地址是多播地址。
对于典型的 802.x网络适配器地址,U/L 和 I/G 位均设置为 0,对应于全局管理的单播MAC 地址。
IEEE EUI-64
地址代表网络接口寻址的新标准。公司 ID 仍然是 24 位长度,但扩展 ID 是 40 位,从而为网络适配器制造商创建了更大的地址空间。EUI-64 地址使用 U/L 和 I/G 位的方式与 IEEE 802 地址相同。
将 IEEE 802地址映射到 EUI-64 地址
要从 IEEE 802 地址创建 EUI-64 地址,则 16 位的 11111111 11111110 (0xFFFE) 将被插入到公司 ID 和扩展 ID 之间的 IEEE 802 地址中。
EUI-64地址一般是唯一的