1.2 IPv6的概念
为了更清楚地阐释IPV6在物联网领域的重要性,以及它与其他协议(比如我们后面讲讨论的6LowPAN)之间的关系,我们会覆盖少量关于最新版IP协议的知识。我们假设你对比特、字节、网络栈、网络层、包、IP头等都有一定的了解。你还需要知道,IPv6是一个与IPv4不兼容的协议。
下图描述了因特网使用的分层模型。
IPv6位于第三层——网络层。第三层处理的数据叫做包(packets)。连接到因特网中的设备可以是主机或者路由器。主机可以是PC、台式机或者收发数据包的传感器板子。主机是包的源或目的地。路由器与主机不同,它负责对数据包进行转发,并且选择下一步路由,一步一步地转发到目的地。路由器从一个接口接收数据,然后尽可能快地将这些数据从另一个接口发送到下一个转发路由。这些路由在一起,则构成了因特网。
1.2.1 IPv6包
你需要知道的第一件事是IPv6包长啥样。在我们之前看到的分层模型中,每一层都添加该层自身相关的信息,而这些被添加的信息只能由另一个IP设备的对等层处理。不同设备的对等层之间的“对话”必须按照一个协议。
因特网层级包括:
- 应用层:这里驻有程序员利用网络协议栈提供的网络服务开发的软件。比如网页浏览器,它向网页服务器发送一个连接请求。又比如网页服务器,它运行在因特网中的某个服务器上等待来自客户端浏览器的请求。应用层协议包括HTTP、DNS等。
- 传输层:传输层位于网络层之上,并给网络层提供附加功能,比如转发丢失的数据包,或者保证包按照发送的顺序接收。本层为应用层提供一个“网络服务”,用于发送或接收数据。TCP/UDP是传输层中最常见的协议。
- 网络层:这一层负责正确交付从传输层下发的数据,以及接收从链路层上传的数据。因特网在这一层只使用了一个协议——IP。IP地址用来标识源地址和目的地址。
- 链路层:该层负责发送和接收帧——网络层发送过来的字节的集合。它指定了相关了机制,用于在不同节点间共享媒介。
- 物理层:该层负责电信号处理。需要获得从一个节点到另一个节点的的数字信息。包含所有的物理媒介——有线和无线。
下图描述了如下的思想:每一层接收上一层传递下来的一些字节信息,然后添加一些相关的附加信息,接收端主机的对等层负责处理这些对应的附加信息。在本图中,数据来源于应用层,被发送到物理层。
IP包中的发送、接收字节遵循一个标准格式,下图是基本的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头部。
有几个扩展头已经被定义了,正如上图所示。扩展头必须按照上图中的顺序。扩展头:
- 具有灵活性。例如,计算包中数据以保证安全
- 优化包处理过程。因为除逐跳传输头之外,扩展都只被终节点处理(包的源节点和最终目的节点),而不会被传输路径中的每个路由处理。
- 它们位于链的头部。以IPv6的基本头开始,使用一个域指向下一个扩展头
1.2.2 IPv6编址
使用128bit编址将带来以下好处:
- 提供更多的地址,可以满足现在和将来的需求
- 简化地址自动配置机制
- 更多的层级结构空间和更多的路由聚合空间
- 能够做端对端的安全协议 Pv6地址归纳为下面几类(也在IPv4中存在):
- 单播(一对一):数据包从源发送到一个目的地。这是最常见的一种形式,(相对于下面的两种)我们将会更多地谈及。
- 组播(一对多):数据包从源发送多多个目的地。通过多播路由,使包能够在某些地方被替换。
- 广播(一对最近的):数据包从源发送到一组中的最近目的地。
- 被保留的:这些地被用作特殊用途
在进入关于IPv6地址和单播地址更详细的介绍前,我们先来总体了解他们,并理解其符号规则。你必须对这些概念有清楚的认识,因为这可能是你用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::/48
(2001:0db8:0001:0000:0000:0000:0000:0000
的压缩形式)表示前48bit将总是相同的(2001:0db8:0001
),但是我们可以定义其余80bit。例如,获得一个更小的前缀:2001:db8:1:a::/64
和2001: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所定义的本地网络中唯一地标识了一个主机的接口。下图描述了这个情形:
既然你已经明白了你的第一个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::/8
或FD00::/8
)。ULA用于本地通信,且通常用于在单一点。ULA一般不用于在全球因特网中进行路由选择,而仅仅用于一个更受限的环境中。
3. 全球单播地址:等价于与IPv4的公共地址。全球单播地址在整个因特网中是唯一的,可以被用于从一个站点发送数据包到因特网中的任意目的地。