网络层——IPv6 概述
禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!
IPv6 数据报
字段
在 2011 年 2 月,IANA 向一个区域注册机构分配完了未分配的 IPv4 地址的最后剩余地址池。这些注册机构可用的 IPv4 地址一旦用完,IPv4 地址就会耗尽,因此IPv6 技术就被开始进行研发部署。(原计划让 ST-2 作为 IPv5,但是 ST-2 后来就被舍弃了。)
IPv6 数据报由两大部分组成:基本首部 (base header)、有效载荷 (payload)。有效载荷也称为净负荷,它允许有零个或多个扩展首部 (extension header),再后面是数据部分。

下面就让我们看看 IPv6 数据报有什么内容:

| 字段 | 作用 |
|---|---|
| 版本(version) | 占 4 位,表示协议版本 |
| 流量类型(traffic class) | 占 8 位,与 IPv4 的服务类型类似,区分不同的数据报 |
| 流标签(flow label) | 占 20 位,用来标识一段数据报的流,能够对一个流中的某些数据报给出优先权 |
| 有效载荷长度(payload length) | 占 16 位,给出了 IPv6 数据报出基本首部以外的字节数 |
| 下一个首部(next header) | 占 8 位,当 IPv6 数据报没有拓展首部时,指明数据应当交付给哪一个上层协议;当出现拓展首部时,标识后面第一个拓展首部的类型 |
| 跳数限制(hop limit) | 占 8 位,该字段类似于 IPv4 中的 TTL,每次转发跳数减 1,该字段达到0 时包将会被丢弃 |
| 源地址、目的地址(Address) | 各占 128 位,标识该报文的来源和目的地 |
观察以上字段,我们需要重点关注 3 个方面。首先是 IP 地址长度从 IPv4 的 32 bit 增加到了 128 bit,也就是说可以表示 2128 个 IP 地址。这个数量级可以为地球上的每一个砂砾都赋予一个 IP 地址,这就保证了全世界不会用尽 IP 地址。第二我们关注 40 字节的首部,这也就说明了 IPv4 的很多首部统统被舍弃了,这样路由器就能更快地处理 IP 数据报。
第三我们关注流标签,所谓“流”就是互联网络上从特定源点到特定终点的一系列数据报。因此“流标签”的一种解释是“给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,入一种分默认服务质量或需要实时服务的流。”其实这么说还是很含糊,就比如说音频流,这个流被标识出来之后就可以进行一些定制的操作。这个字段很耐人寻味,这为 IPv6 提供更强大的服务提供了健壮性的选择。
对比 IPv4
IPv6 数据报相对于 IPv4 数据报有很多删减的地方,如下表总结:
| IPv6 的修改 | 说明 |
|---|---|
| 取消了首部长度字段 | 它的首部长度是固定的(40 字节) |
| 取消了服务类型字段 | 优先级和流标号字段实现了服务类型字段的功能 |
| 取消了总长度字段 | 改用有效载荷长度字段 |
| 取消了标识、标志和片偏移字段 | 这些功能已包含在分片扩展首部中 |
| 把TTL字段改称为跳数限制字段 | 作用一样,名称与作用更加一致 |
| 取消了协议字段 | 改用下一个首部字段 |
| 取消了检验和字段 | 加快了路由器处理数据报的速度 |
| 取消了选项字段 | 用扩展首部来实现选项功能 |
这里关注 4 个方面。首先是分片与重组的问题,IPv6 数据报不允许在路由器上分片,这个操作只能在源和目的执行。如果中间遇到链路的 MTU 较小怎么办?这个时候路由器就直接丢包,然后向发送方发一个“分组太大”的 ICMP 报文,然后源就根据这个报文,把数据报分成更小的几个再重传。这种设计是合理的,因为路由器的分片是耗时的操作,这样可以是 IP 数据报转发的速度提高。
第二个我们关注首部校验和的问题,这个字段在 IPv6 中已经没了。因为在传输层、数据链路层协议中,有很多协议都有具备错误检测的功能,而首部校验和因为有 TTL 等参数变化,计算的开销很大。因此把这个字段去除之后,也可以提升 IP 数据报转发的速度。
第三个我们关注选项,这个字段在 IPv6 中已经没了,不过它的功能被归并到下一个首部字段中了。这种改动可以使得 IP 数据报的首部长度为定长,也就是 40 字节。
第四是 IPv6 中取消了校验和,这是因为:在数据链路层对检测出有差错的帧就丢弃;在运输层使用 UDP 时,若检测出有差错的用户数据报就丢弃;当使用 TCP 时,对检测出有差错的报文段就重传,直到正确传送到目的进程为止。因此在网络层的差错检测可以精简掉。
扩展首部
IPv6 把 IPv4 中的选项字段的功能用扩展首部取代,而且扩展首部的处理由源和目的端系统来处理。这种设计不仅使得数据报首部的长度可以固定,而且沿途的路由器都不用对除了逐跳选项以外的信息进行处理,这也提高了路由器转发的效率。
IPv6 地址
目的地址形式
一个 IPv6 数据报的目的地址可以是以下三种基本类型地址之一,其中任播是 IPv6 增加的一种类型。
| 目的地址类型 | 说明 |
|---|---|
| 单播 (unicast) | 传统的点对点通信 |
| 多播 (multicast) | 一点对多点的通信 |
| 任播 (anycast) | 任播的终点是一组计算机,但数据报在交付时只交付其中的一个。通常是按照路由算法得出的距离最近的一个 |
IPv6 将实现 IPv6 的主机和路由器均称为节点,一个节点可能有多个与链路相连的接口。IPv6 地址是分配给节点上接口的,一个具有多个接口的节点可以有多个单播地址,其中的任何一个地址都可以当作到达该节点的目的地址。
冒号十六进制记法
IPv6 中的每个地址占 128 位,地址空间大于 3.4×1038,如此大的地址空间使用 IPv4 的点分十进制数记法已不再合适。IPv6 使用冒号十六进制记法来表示,即 16 位的值用十六进制值表示,各值之间用冒号分隔。

IPv6 地址还适应零压缩、点分十进制记法的后缀技术,对地址进行压缩表示。零压缩指的是一串连续的零可以用一对冒号取代,例如 FF05:0:0:0:0:0:0:B3 可以压缩为 FF05::B3。为了保证零压缩有一个不含混的解释,在任一地址中只能使用一次零压缩。

结合使用点分十进制记法的后缀在 IPv4 向 IPv6 的转换阶段特别有用,例如 0:0:0:0:0:0:128.10.2.1 可以压缩为 ::128.10.2.1。CIDR 的斜线表示法仍然可用,但 IPv6 取消了子网掩码。例如:60 位的前缀 12AB00000000CD3 可记为以下 3 种形式:
- 12AB:0000:0000:CD30:0000:0000:0000:0000/60
- 12AB::CD30:0:0:0:0/60(零压缩)
- 12AB:0:0:CD30::/60 (零压缩)
地址分类
IPv6 地址分类如下表所示
| 地址类型 | 二进制前缀 | IPv6记法 |
|---|---|---|
| 未指明地址 | 00…0(128 位),仅此一个 | ::/128 |
| 环回地址 | 00…1(128 位),仅此一个 | ::1/128 |
| 多播地址 | 11111111(8 位),功能和 IPv4 的一样 | FF00::/8 |
| 本地链路单播地址 | 1111111010(10 位),未连接到互联网,不能和互联网上的其他主机通信 | FE80::/10 |
| 全球单播地址 | 除上述四种外,所有其他的二进制前缀 |
其中全球单播地址是 IPv6 中使用得最多的一类,其划分方法非常灵活,包括:
- 把整个的 128 比特都作为一个结点的地址;
- 用 n 比特作为子网前缀,用剩下的(128-n) 比特作为接口标识符(相当于 IPv4 的主机号);
- 用 n 比特作为全球路由选择前缀,用 m 比特作为子网前缀,而用剩下的 (128-n-m)比特作为接口标识符。

向 IPv6 过渡
IPv4 要如何实现向 IPv6 的过渡呢?即使 IPv6 可以做到向后兼容,发送、路由和接收 IPv4 数据报,但是 IPv4 并不能够兼容 IPv6。第一种想法是约定一个日期,全球因特网的所有服务器全部改用 IPv6,这个明显很不现实。比较好的思路是逐步演进,慢慢地向 IPv6 进行过度。
双协议栈
所谓双协议栈技术,就是在完全过渡之前,先使一部分主机或路由器能够同时使用 IPv4 和 IPv6 进行通信,这样无论是接收到哪种数据报,都可以进行处理。但是由于二者不能兼容,主机要如何区分 IPv4 和 IPv6 地址呢?使用 DNS 进行解析,根据解析的结构判断使用什么样的处理方式。

这么做看似可行,但是会滋生很多问题。首先是主机或路由器需要有 2 套信息,分别是 IPv4 地址和 IPv6 地址,这增大了存储的开销。第二是每一跳都是用 DNS 进行解析,这也增大了时间上的开销,为 IP 协议实现快速传输造成了限制。第三也就是 IPv4 数据报被转换为 IPv6 数据报时,由于字段的不同将会造成数据的缺失,这是最要命的。

隧道技术
隧道技术是经实践证明性能不错,得到广泛应用的技术。思路是将 2 台 IPv6 路由器之间的 IPv4 路由器在逻辑上合并,当做是一个隧道。借助隧道,在发送端的 IPv6 节点可以将整个 IPv6 数据报放到 IPv4 数据报的有效载荷字段中。则在隧道中的 IPv4 路由器就正常地完成转发操作就行,和正常的数据报传输无异。当隧道接收端的 IPv6 节点收到数据报之后再提取并形成 IPv6 数据报即可。
概括一下,就是IPv6 数据报作为 IPv4 数据报被封装,穿越 IPv4 网络。整个过程就好像 IPv6 服务器之间直接相连接收数据报一样,兼容性和效率都很不错。

ICMPv6
IPv6 也需要使用 ICMP 来反馈一些差错信息,新的版本称为 ICMPv6。ICMPv6 比 ICMPv4 复杂得多,它合并了 ARP 和 IGMP 协议的功能。

ICMPv6 是面向报文的协议,它利用报文来报告差错、获取信息、探测邻站或管理多播通信。有的报文分类策略把其中的一些报文定义为 ICMPv6 报文,而把另一些报文定义为邻站发现 ND(Neighbor-Discovery)报文或多播听众交付 MLD(Multicast Listener Delivery)报文。所有这些报文都应当是 ICMPv6 报文,只是功能和作用不同。

参考资料
《计算机网络(第七版)》 谢希仁 著,电子工业出版社
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社

浙公网安备 33010602011771号