关于IPv6技术相关知识详解

网络 通信技术
IPv6的普及已经喊了很多年了,但是事与愿违啊,由于NAT技术的出现,所谓的普及IPv6还是遥遥无期,不可否认NAT技术真的很伟大,但是IPv6肯定是未来的趋势,作为网络编程的开发人员,系统的详细的了解IPv6还是很有必要的。

1. 前戏

IPv6的普及已经喊了很多年了,但是事与愿违啊,由于NAT技术的出现,硬是将当时岌岌可危的IPv4拖了二十年,所谓的普及IPv6还是遥遥无期,不可否认NAT技术真的很伟大,但是IPv6肯定是未来的趋势,作为网络编程的开发人员,系统的详细的了解IPv6还是很有必要的。我相信IPv6的普及很快就会到来,身怀此绝技的读者你们,肯定是香馍馍了。所以开始看文章吧。

其实我们用的比较多的主流操作系统都已经支持了IPv6协议栈,Windows7,Linux2.6之后的版本等等。

[[239621]]

2. IPV6的基本概念

周所周知,IPv6采用128位的地址长度拥有更大的地址空间。首先我们先来认识一下IPv6到底长成什么样子。

IPv6数据报文和IPv4有很大的差别:

  • 数据链路层(L2)的type字段标识为 0x86dd,表示承载的上层协议是IPv6(IPv4对比:type字段为0x0800);
  • IPv6的头部字段,和IPv4差别巨大(可以猜测到,IPv6和IPv4无法兼容)。

我们来看下ipv6的报文头部格式:

IPv6技术详解

Ipv6报文头部

ipv6的头部更加的简单,少了很多的字段,对比ipv4,有这几个地方需要注意:

  • IPv6报文头部是定长(固定为40字节),IPv4报文头部是变长的。这个意味着,写代码处理IPv6数据报文的效率会提高很多:);
  • IPv6中Hop Limit字段含义类似IPv4的TTL;
  • IPv6中的Traffic Class字段含义类似IPv4中的TOS(Type Of Service);
  • IPv6的报文头部取消了校验和字段:取消这个字段也是对IPv4协议的一个改进。当IPv4报文在网路间传输,每经过一个路由器转发就是修改TTL字段,就需要重新计算校验和,而由于数据链路层L2和传输层L4的校验已经足够强壮,因此IPv6取消这个字段会提高路由器的转发效率。值得一提的是,在IPv6协议下,传输层L4协议UDP、TCP是强制需要进行校验和的(IPv4是可选的);
  • IPv6报文头部中的Next Header字段表示“承载上一层的协议类型”或者“扩展头部类型”。

这里的含义与IPv4有很大的差别,需要加以解释:

  • 当IPv6数据报文承载的是上层协议ICMPv6、TCP、UDP等的时候,Next Header的值分别为58、6、17,这个时候和IPv4报文头部中的Protocol字段很类似;
  • 当不是以上3种协议类型的时候,IPv6报文头部紧接的是扩展头部。扩展头部是IPv6引入的一个新的概念,每个IPv6的数据报文可以承载0个或多个扩展头部,扩展头部通过链表的形式组织起来。当IPv6数据报文承载着扩展头部的时候,Next Header的数值为扩展头部的类型值。

为什么要引入扩展头部这个概念,这里也是IPv6对IPv4改进的一个方面,用扩展头部取代了IPv4的可选项信息,精简了IPv6的头部,增强了IPv6的扩展性。有同学会不会有疑问,IPv6的分片数据报文怎么处理?其实就是使用了IPv6扩展头部。

当发送一个分片IPv6数据报文的时候,IPv6使用的是扩展头部的形式组织各个分片的信息,IPv6报文头部Next Header字段值为44表示存在扩展头部,扩展头部是IPv6分片数据信息。

对比IPv4,分片信息是记录在IPv4报文头部的分片字段中。

IPv6的扩展头部类型有很多种,除了上述的分片头部,还有路由头部、逐跳可选头部等,具体的可以参考RFC2460。

本章主要介绍了IPv6的一些很直观的认识,下面逐渐介绍IPv6上的基本知识和概念。

3. ipv6的地址语法

一个IPv6的地址使用冒号十六进制表示方法:128位的地址每16位分成一段,每个16位的段用十六进制表示并用冒号分隔开,例如:

一个普通公网IPv6地址:

  1. 2001:0D12:0000:0000:02AA:0987:FE29:9871 

IPv6地址支持压缩前导零的表示方法,例如上面的地址可以压缩表示为:

  1. 200112:0:0:2AA:987:FE29:9871 

为了进一步精简IPv6地址,当冒号十六进制格式中出现连续几段数值0的位段时,这些段可以压缩为双冒号的表示,例如上面的地址还可以进一步精简表示为:

  1. [pquote]200112::2AA:987:FE29:9871 

又例如IPv6的地址FF80:0:0:0:FF:3BA:891:67C2可以进一步精简表示为:

  1. FE80::FF:3BA:891:67C2 

这里值得注意的是:双冒号只能出现一次。

4. IPv6地址的号段划分和前缀表示法

IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分(与鹅厂内部一些的64位uin改造放号的zone划分算法)。

IPv6的地址结构如下图:

IPv6技术详解

例如RFC4291中定义了n=48, m=16,也就是子网和接口ID与各占64位。

IPv6支持子网前缀标识方法,类似于IPv4的无分类域间路由CIDR机制(注意:IPv6没有子网掩码mask的概念)。

使用“IPv6地址/前缀长度”表示方法,例如:

  • 2001:C3:0:2C6A::/64表示一个子网;
  • 而2001:C3:0:2C6A:C9B4:FF12:48BC:1A22/64表示该子网下的一个节点地址。

可以看到,一个IPv6的地址有子网前缀+接口ID构成,子网前缀由地址分配和管理机构定义和分配,而接口ID可以由各操作系统实现生成,生成算法后面的章节会介绍。

5. IPv6的地址类型

IPv6地址分三种类型:

  • 单播,对应于IPv4的普通公网和私网地址;
  • 组播,对应于IPv4的组播(多播)地址;
  • 任播,IPv6新增的地址概念类型。

IPv6没有广播地址,用组播地址实现广播的功能。实际上我们工作和生活最可能最多接触的就是单播地址,接下来本文重点会讲解单播地址的种类。组播和任播地址有兴趣的同学自行查阅相关RFC和文献。

责任编辑:赵宁宁 来源: cpp软件架构狮
相关推荐

2019-06-09 08:37:17

2010-05-26 17:42:29

IPv6数据包

2010-05-24 16:20:32

IPv6隧道技术

2019-07-04 14:11:48

MSTPIPv6网络拓扑

2010-05-25 14:55:47

IPv6与RFID结合

2019-03-28 14:35:53

IPv6IPv4TCP

2023-05-05 07:10:42

IPv6互联网

2011-03-02 09:59:38

2018-08-08 15:23:10

IPv4IPv6网络

2018-10-09 09:58:54

IPv6技术障碍

2010-05-26 12:56:24

2010-06-07 15:14:40

移动IPv6技术

2013-05-27 11:30:41

IPv6IP协议IPv6应用

2012-11-28 13:20:30

IPv6

2018-12-13 17:56:31

2013-01-23 14:23:36

IPv6 技术

2010-05-26 16:07:00

IPv6 ISATAP

2018-11-06 05:14:19

IPv6IPv4网络

2010-05-26 14:33:10

IPv6黑洞路由

2009-11-05 10:16:51

接入网技术
点赞
收藏

51CTO技术栈公众号