1.2 IPv6的概念

  为了更清楚地阐释IPV6在物联网领域的重要性,以及它与其他协议(比如我们后面讲讨论的6LowPAN)之间的关系,我们会覆盖少量关于最新版IP协议的知识。我们假设你对比特、字节、网络栈、网络层、包、IP头等都有一定的了解。你还需要知道,IPv6是一个与IPv4不兼容的协议。

  下图描述了因特网使用的分层模型。

 ![](image001.png)
图1.1.因特网协议栈

  IPv6位于第三层——网络层。第三层处理的数据叫做包(packets)。连接到因特网中的设备可以是主机或者路由器。主机可以是PC、台式机或者收发数据包的传感器板子。主机是包的源或目的地。路由器与主机不同,它负责对数据包进行转发,并且选择下一步路由,一步一步地转发到目的地。路由器从一个接口接收数据,然后尽可能快地将这些数据从另一个接口发送到下一个转发路由。这些路由在一起,则构成了因特网。

1.2.1 IPv6包

  你需要知道的第一件事是IPv6包长啥样。在我们之前看到的分层模型中,每一层都添加该层自身相关的信息,而这些被添加的信息只能由另一个IP设备的对等层处理。不同设备的对等层之间的“对话”必须按照一个协议。

  因特网层级包括:

  • 应用层:这里驻有程序员利用网络协议栈提供的网络服务开发的软件。比如网页浏览器,它向网页服务器发送一个连接请求。又比如网页服务器,它运行在因特网中的某个服务器上等待来自客户端浏览器的请求。应用层协议包括HTTP、DNS等。
  • 传输层:传输层位于网络层之上,并给网络层提供附加功能,比如转发丢失的数据包,或者保证包按照发送的顺序接收。本层为应用层提供一个“网络服务”,用于发送或接收数据。TCP/UDP是传输层中最常见的协议。
  • 网络层:这一层负责正确交付从传输层下发的数据,以及接收从链路层上传的数据。因特网在这一层只使用了一个协议——IP。IP地址用来标识源地址和目的地址。
  • 链路层:该层负责发送和接收帧——网络层发送过来的字节的集合。它指定了相关了机制,用于在不同节点间共享媒介。
  • 物理层:该层负责电信号处理。需要获得从一个节点到另一个节点的的数字信息。包含所有的物理媒介——有线和无线。

  下图描述了如下的思想:每一层接收上一层传递下来的一些字节信息,然后添加一些相关的附加信息,接收端主机的对等层负责处理这些对应的附加信息。在本图中,数据来源于应用层,被发送到物理层。

![](image009.png)
图1.2. 协议栈中的数据流

  IP包中的发送、接收字节遵循一个标准格式,下图是基本的IPv6头部:

图1.3. IPv6头

  最开始,是一个固定大小40字节的IPv6基本头,接着是上层数据和一些可选的扩展头(将在后买介绍)。如图所示,包头被分为几个字段。与IPv4头部相比,IPv6的头部有如下的改进:

  • 字段数由12减至8
  • 基本的IPv6头有固定的40字节大小,并是64bit对齐的,这样的好处是允许在路由器上进行基于硬件的快速转发
  • 地址的大小由32bit增加至128bit

  在IPv6头部中,最重要字段是源地址和目的地址。IP地址是每个IP设备在因特网上独一无二的,用于路由器的转发决策。

  每个IPv6地址有128位,这相当于有2^128个地址(大约是3.4x10^38),而IPv4的每个地址使用32bit的编码方式,一共只有2^32个地址。

  除了基本头之外,还有一个上面提到的扩展头。为了保证基本头的简单性和固定大小,附加信息以扩展头的形式被 添加到IPv6头部。

![](image003.png)
图1.4. IPv6扩展头

  有几个扩展头已经被定义了,正如上图所示。扩展头必须按照上图中的顺序。扩展头:

  • 具有灵活性。例如,计算包中数据以保证安全
  • 优化包处理过程。因为除逐跳传输头之外,扩展都只被终节点处理(包的源节点和最终目的节点),而不会被传输路径中的每个路由处理。
  • 它们位于链的头部。以IPv6的基本头开始,使用一个域指向下一个扩展头

1.2.2 IPv6编址

  使用128bit编址将带来以下好处:

  • 提供更多的地址,可以满足现在和将来的需求
  • 简化地址自动配置机制
  • 更多的层级结构空间和更多的路由聚合空间
  • 能够做端对端的安全协议   Pv6地址归纳为下面几类(也在IPv4中存在):
  • 单播(一对一):数据包从源发送到一个目的地。这是最常见的一种形式,(相对于下面的两种)我们将会更多地谈及。
  • 组播(一对多):数据包从源发送多多个目的地。通过多播路由,使包能够在某些地方被替换。
  • 广播(一对最近的):数据包从源发送到一组中的最近目的地。
  • 被保留的:这些地被用作特殊用途

  在进入关于IPv6地址和单播地址更详细的介绍前,我们先来总体了解他们,并理解其符号规则。你必须对这些概念有清楚的认识,因为这可能是你用IPv6表示地址时面临的第一个问题。

图1.5. IPv6地址

IPv6地址的符号规则是:

  • 由8组组成,每组16bit,组与组之间由“:”隔开
  • 每4bit由一个十六进制符号表示
  • 大小写不敏感
  • 网络前缀(地址的组)的格式是:前缀/前缀长度,其中前缀长度表明一个组地址中前面有多少个连续比特相同
  • 每组中最左边的0可以被省略
  • 一个或者多个全零组可以被“::”代替。这只能做一次。

  前三条规则告诉你最基本的IPv6地址符号组成规则。他们由从0到F的十六进制符号表示。IPv6的地址由8组组成,每组有4个十六进制符号,组与组之间由冒号“:”分隔。最后两条规则是用于地址的符号压缩,我们将在下面如何进行地址压缩的。

  先看一些例子:

1)我们写出所有的地址位,比如2001:0db8:4004:0010:0000:0000:6543:0ffd

2)我们用方括号就地址位括起来,比如[2001:0db8:4004:0010:0000:0000:6543:0ffd]

3)我们遵循第四条规则,在每个组里省略最左边的0,比如2001:db8:4004:10:0:0:6543:ffd

4)我们要用第五条规则,运行一个或多个连续的零组用“::”压缩,比如2001:db8:4004:10::6543:ffd

  我们的注意力应该放在IPv6地址的压缩和解压缩过程,这个过程应该是可逆的。犯错是很常见的,比如地址2001:db8:A:0:0:12:0:80可能会被多多次使用“::”压缩。我们提供两种选择:

a) 2001:db8:A::12:0:80
b) 2001:db8:A:0:0:12::80

  两者都是的IPv6地址,但是地址2001:db8:A::12::80是错误的,因为它没有遵循最后一条压缩规则。通过这个被严重过度压缩的地址,我们不能确定如何去扩展它。我不不知道应该扩展为2001:db8:A:0:12:0:0:80还是扩展为2001:db8:A:0:0:12:0:80

1.2.3 IPv6网络前缀

  最后你必须理解网络前缀的概念。网络前缀是指一些规定的bit位和一些未被定义的bit位——可能会被用于创建新的子前缀或者用于定义被分配给自己的完整IPv6地址。

  我们看一些例子:

  1)网络前缀2001:db8:1::/482001:0db8:0001:0000:0000:0000:0000:0000的压缩形式)表示前48bit将总是相同的(2001:0db8:0001),但是我们可以定义其余80bit。例如,获得一个更小的前缀:2001:db8:1:a::/642001:db8:1:b::/64

  2)对于上面定义的更小前缀2001:db8:1:b::/64,其前64bit是固定的,后64bit可以由我们自己分配。例如,可以为一个主机分配IPv6接口2001:db8:1:b:1:2:3:4。最后的例子给我们引入了IPv6的基本概念:前缀*A/64经常用于局域网(Local Area Network,LAN)。最右边的64bit被叫做接口标识符(interface identifier,IDD),因为它在一个由前缀/64所定义的本地网络中唯一地标识了一个主机的接口。下图描述了这个情形:

图1.6. 网络和接口ID

  既然你已经明白了你的第一个IPv6地址,我们就对你将平道的两种地址进行更详细地讨论:保留地址和单播地址。

  • 未指明的地址,当没有有效地址的时候,用于占位符:0:0:0:0:0:0:0:0 (::/128)
  • 回路地址,一个节点发送IPv6地址包到它自身:0:0:0:0:0:0:0:1 (::1/128)
  • 文件前缀2001:db8::/32。这个前缀被保留用于在例子和文档中使用。你已经在本章中看到过这个前缀了。

  在文档[RFC6890]中有介绍,互联网地址编码分配机构IANA负责维护注册具有特殊目的的IPv6地址。

  下面是一些单播地址的其他类型:   1. 本地连接地址:在一个连接到网络的IPv6接口中总是存在一个本地连接地址。本地连接地址由前缀FE80::/10开始,且可以用于与该本地网络中其它主机通信,也就是说,所有的主机连接到一个相同的交换机。本地连接地址不能与其他网络中的主机通信,也就是说不能穿过路由器发送、接收包。   2. 唯一本地地址(ULA)[RFC4193]:所有的ULA地址都由前缀FC00::/7开始(在实际中意味着你可以看到FC00::/8FD00::/8)。ULA用于本地通信,且通常用于在单一点。ULA一般不用于在全球因特网中进行路由选择,而仅仅用于一个更受限的环境中。   3. 全球单播地址:等价于与IPv4的公共地址。全球单播地址在整个因特网中是唯一的,可以被用于从一个站点发送数据包到因特网中的任意目的地。