IPv6报文格式
报文头部
- Version(4-bit):IP版本,该字段值为6
- Traffic Class(8-bit):流量分类,与IPv4包头的TOS类似
- Flow Label(20-bit):流标签,用来标记IPv6数据包的一个流
- Payload Length(16-bit):有效载荷的长度,扩展报头也算在Payload长度里
- Next Header(8-bit):处理选项字段,分段,安全,移动性,松散源路由,记录路由等的新方式
- Hop Limit:(8-bit):定义IP数据包所能经过的最大跳数,每跳一次将此值减1。
- Source Address(128-bit):IP数据包的源地址
- Destination Address(128-bit):IP数据包的目的地址
- Possible Extension Header(s): 扩展报头
扩展报头(RFC2460)
| Value | Type of Header | | —- | —- | | 0 | Hop-by-Hop Options Header | | 6 | TCP (Upper Layer) | | 17 | UDP (Upper Layer) | | 41 | Encapsulated IPv6 Header | | 43 | Routing Header | | 44 | Fragment Header | | 50 | Encapsulating Security Payload | | 51 | Authentication Header | | 58 | ICMPv6 (Upper Layer) | | 59 | No next header | | 60 | Destination Options |
RFC2460推荐的Extension Header出现顺序:
- IPv6 main header
- Hop-by-Hop Options header (if present, it MUST be the first one following the main/regular header)
- Destination Options header(with Routing Options)
- Routing header
- Fragment header
- Authentication header
- Encapsulating Security Payload header
- Destination Options header
- Upper-layer header
注:除了Hop-by-Hop Options header,其它的扩展头在传输过程中, 中间节点不对其做处理,处理扩展头的节点按扩展头顺序处理,而不能挑选某个header
Extension Header的组合方式
+---------------+------------------------
| IPv6 header | TCP header + data
| |
| Next Header = |
| 6(TCP) |
+---------------+------------------------
+---------------+----------------+------------------------
| IPv6 header | Routing header | TCP header + data
| | |
| Next Header = | Next Header = |
| 43(Routing) | 6(TCP) |
+---------------+----------------+------------------------
+---------------+----------------+-----------------+-----------------
| IPv6 header | Routing header | Fragment header | fragment of TCP
| | | | header + data
| Next Header = | Next Header = | Next Header = |
| 43(Routing) | 5(Fragment) | 6(TCP) |
+---------------+----------------+-----------------+-----------------
Hop-by-Hop 扩展头(type=0):
介绍:该字段由传送路径上的每个节点和路由器读取并处理,目前只定义了一个选项:要求支持超过64k的数据报文Jumbogram(RFC2675 )。
用途:主要用于巨型数据包(RFC2675)和路由器警报(RFC 2711),e.g :RSVP,MLD report etc)
补齐使用Pad1或者PadN
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
. .
. Options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Routing Header(type=43)
介绍:在数据包发往目的地的途中,该包头能够被IPv6源节点用来强制数据包经过特定的路由器。当路由类型字段设为0时,在路由包头可以指定中间路由器列表,类似IPv4的松散源路由选项。
用途:主要用于移动IP
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. type-specific data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Hdr ext Len(8-bit):扩展头长度,不统计前1个字节
- Routing type(8-bit):标识路由头类型
- Segment Left(8-bit):剩余的seg数目
- Type-specific data(变长):由Routing type决定,Routing type=0时该段保留前4bytes,后跟沿途路由器的address-list
补齐使用Pad1或者PadN
如何使用?举个例子,源S发数据包到目的节点D,指定要经 I1,I2,I3 则:
As the packet travels from S to I1:
Source Address = S Hdr Ext Len = 6
Destination Address = I1 Segments Left = 3
Address[1] = I2
Address[2] = I3
Address[3] = D
As the packet travels from I1 to I2:
Source Address = S Hdr Ext Len = 6
Destination Address = I2 Segments Left = 2
Address[1] = I1
Address[2] = I3
Address[3] = D
As the packet travels from I2 to I3:
Source Address = S Hdr Ext Len = 6
Destination Address = I3 Segments Left = 1
Address[1] = I1
Address[2] = I2
Address[3] = D
As the packet travels from I3 to D:
Source Address = S Hdr Ext Len = 6
Destination Address = D Segments Left = 0
Address[1] = I1
Address[2] = I2
Address[3] = I3
Fragment Header(type=44)
介绍:只能源节点用来将大于传输路径的PMTU的数据包进行分段,与IPv4不同,IPv6在源节点进行分段,而不能在中间的节点进行分段(使用PMTU机制进行检测路径最小的MTU)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Reserved | Fragment Offset |Res|M|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Reserved(8-bit): 初值为0
- Fragment Offset(13-bit):分片报文的偏移
- Res(2-bits):0
- M:1表示more frag(还有Fragment),0表示last frag(我就是最后一个了)
- Identification:分片产生的ID,对于发往同一目的的不同分片报文,该ID不同
Destination Options Header(type=60)
介绍:承载数据包目的节点所需要的可选信息,给宿主机解释和使用的,目前这个选项为空
用途:IETF暂时建议使用该扩展头在移动节点和家乡代理之间交换注册信息
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
. .
. Options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Hdr ext Len(8-bit):Header的长度,不统计前1个字节
- Options(变长):包含一个或多个TLV(Tag,Length,Value)三元组
- Pad1,PadN:用于填充报文Options剩余部分
No Next Header(type=59)
介绍:用于表示后面没有扩展头跟该在该扩展头后面
Authentication header(type=51)
介绍:由IPsec使用,以提供认证,数据完整性和重放保护,确保基本IPv6包头中一些字段的保护
Encapsulating Security Payload header(type=50)
介绍:由IPsec使用,以提供认证数据完整性和重放保护和IPv6数据包的保密
IPv4报文头和IPv6报文头比较
Reference:https://www.cnblogs.com/jersey/archive/2011/11/29/2267492.html
IPv6 地址划分
如图所示,地址分为三大类:组播、单播、任意播(也称泛播);
单播可分为:全球单播地址(可理解为公网地址 —-IPv6)、本地链路地址、站点本地地址、回环地址、未指定地址、内嵌 IPv4 地址。
1. 全球单播地址UGA (Global Unicast Address),又称可聚合全球单播地址AUGA
π:3.14
前 3bit 固定 001;
地址范围:2xxx:xxxxx/3 - 3FFF: :FFFF;
2001::/16 IPV6 因特网地址;
2002::/16 6to4 过渡地址;
3ffe::/16 用于 6bone 测试目的的前缀;
注意:接口标识符:指 64bit的 MAC地址(未来网络适配器的 MAC地址),或者是基于 48bit MAC地址扩展为 64bit(EUI 64)。在全球单播地址中,规定如 2001:BCFF:FEA6::/48** 表示一个 IPv6路由前缀,2001:BCFF:FEA6:6C01::/64表示一个 IPv6子网前缀。
2. 本地链路地址LLA link local address
固定前缀 FE80::/10;当一个节点启用 IPv6 时自动生成,格式如下图,64 位拓展由 MAC 地址按照 EUI 64 转换而来。
EUI-64 格式:基于 MAC 地址自动构造;
例如:MAC 地址为 0012:3400:ABCD;
首先把 MAC 地址对半分开,插入一个固定值 FFFE;
0012:3400:ABCD ——> 0012:34FF:FE00:ABCD;
再把第七位翻转:0——> 1, 1——>0
0012:34FF:FE00:ABCD ——> 0212:34FF:FE00:ABCD;
最后加上前缀:
FE80::212:34FF:FE00:ABCD;
3. 本地站点地址
类似于 IPv4 中的私有地址,仅在内部网络使用,如打印机。
固定前缀 FEC0::/10;
对于 IPv6 本地站点地址的配置,必须通过 DHCPv6 进行地址的分配、无状态的前缀公告、或者手工的进行输入。
4. 唯一本地地址ULA
ULA,唯一本地地址,概念上相当于私有 IP,仅能够在本地网络使用,在 IPv6 Internet 上不可被路由。上面提到的站点本地地址由于起初的标准定义模糊而被弃用,而后 RFC 又重新定义了唯一本地地址以满足本地环境中私有 IPv6 地址的使用。
在 RFC4193 中标准化了一种用来在本地通信中取代站点本地单播地址的类型。ULA 拥有固定前缀 FC00::/7,分为两块:FC00::/8 暂未定义,FD00::/8 定义如下:
5. 未指定地址
形式:0:0:0:0:0:0:0:0/128 —> ::/128;
表示地址未指定,或者在写默认路由时代表所有路由;
该地址作为某些报文的源 IP 地址,比如作为重复地址检测时 DAD 时发送的邻居请求报文的源地址,或者 DHCPv6 初始化过程中客户端所发送报文的源 IP。
6. 回环地址
形式:0:0:0:0:0:0:0:1;
同 IPV4 中 127.0.0.1 地址的含义一样,表示节点自已。
7. 内嵌 IPv4
映射 IPV4 的 IPV6 地址 — 仅用于拥有 IPV4 和 IPV6 双协议栈节点的本地范围
其中高 80bit 设为 0, 后 16bit 设为 1,再跟 IPV4 地址
0000:0000:0000:0000:0000:ffff:206.123.31.2
0000:0000:0000:0000:0000:ffff:ce7b:1f01
8. 组播地址(IPv6 通信的核心)
前缀:FFxx::/8;
在 IPV6 中没有广播的概念,而是使用用组播来代替;因此 IPv6 中存在大量的组播使用。
标志位为 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 在一个站点范围内的所有路由
下面一张图总结下IPv6单播地址中,全球单播地址(GUA)、唯一本地地址(ULA)以及本地链路地址(LLA)三个最重要地址之间的关系:
IPv6任播地址
任播地址标识一组网络接口(通常属于不同的节点)。任播地址是一个只能分配给路由器的IPv6地址,只能作为通信的目的地址使用,发给任播地址的数据包将发给其中路由意义上最近的一个网络接口。任播地址设计用来在给多个主机或者节点提供相同服务时提供冗余功能和负载分担功能,目前任播地址在IPv6中应用很少,主要应用在移动IPv6中。
IPv6组播地址
IPv6组播与IPv4相同,类似于IPv4组播地址224.0.0.0/3,用来标识一组接口,通常是属于不同节点的接口。其作用是源节点发送单个数据包,属于该组播组的所有接口都能收到,常见的应用就是IPTV。
申请IPv6地址
IANA(Internet Assigned Numbers Authority)负责全球IP地址(无论是IPv4还是IPv6)资源的管理和分配。IANA将全球分为了五大区域(Region),每个区域下设一个分支机构,称为RIR(RegionalInternet Registry),每个RIR负责所在区域的IP地址资源的管理和分配。
IP地址的分配过程如下图所示:IANA负责向RIR分配地址,RIR负责向NIR或LIR或ISP分配地址,NIR负责向LIR或ISP或EU分配地址,LIR负责向ISP或EU分配地址,ISP负责向EU分配地址。
中国互联网络中心(CNNIC)是中国大陆地区唯一的国家级互联网注册机构(NIR),是负责向本地区内的网络服务提供商和企事业单位分配IP地址、AS号码资源的权威、中立机构。用户可登陆中国互联网络中心的官方网站详细了解IP地址管理机申请办法。
同时,国内三大运营商已经获取IPv6地址资源,但目前尚未提供地址申请业务,应该会在近期开放,具体时间需要与运营商确认。企业可以根据需要,选择当地运营商进行IPv6地址的申请。具体流程,不同的运营商可能会有差异。另外,赛尔网络是国内最大的IPv6网络CERNET(China Education and Research Network,中国教育和科研计算机网)的运营者,主要服务对象为教育行业(例如高校等),其拥有的IPv6地址资源也主要分给拥有赛尔网络会员资格的教育行业客户。
https://blog.csdn.net/finderskill/article/details/87718523