长期以来,全球 IPv4 地址耗尽令人担忧,今天这一时刻终于来临。负责英国、欧洲、中东和部分中亚地区互联网资源分配的欧洲网络协调中心(RIPE NCC)宣布,其最后的 IPv4 地址空间储备池在 11 月 25 日 UTC + 1 15:35 完全耗尽,所有 43 亿个 IPv4 地址已分配完毕。这意味着没有更多的 IPv4 地址可以分配给 ISP 和其他大型网络基础设施提供商。
全球ipv4地址正式耗尽 --infoQ
上面的提到的是来自infoQ的一篇报道,那为什么要用到 ipv6 呢,根本原因是 ipv4 地址耗尽的问题。
IPv6 的头部字段,和 IPv4 差别巨大(可以猜测到,IPv6 和 IPv4 无法兼容)
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 的数值为扩展头部的类型值。
ipv4/ipv6 关键差异
IPv4 | IPv6 | |
---|---|---|
地址长度 | 32位 | 128位 |
地址表示方式 | 点分十进制 | 冒号十六进制 |
头部长度 | 可变头部长度 | 定长头部 |
校验机制 | 使用校验和保证数据完整性 | 去掉IP层的校验和,完整性交给上层保证 |
头部选项 | 头部包含可选字段 | 去掉了选项字段,改为扩展头部 |
安全性 | 无安全机制(IPSec在IP层之外实现) | 提供认证和加密机制(IPSec inbuilt) |
链路层地址映射 | ARP协议 | NDP协议 |
广播机制 | 包含广播地址 | 没有广播机制 |
邻居发现协议 NDP(对应于 IPv4 里面的 ARP 协议)
红色部分在ipv6中去除了。
ipv6 地址语法
一个 IPv6 的地址使用冒号十六进制表示方法:128 位的地址每 16 位分成一段,每个 16 位的段用十六进制表示并用冒号分隔开,例如:
一个普通公网 IPv6 地址:2001:0D12:0000:0000:02AA:0987:FE29:9871
IPv6 地址支持压缩前导零的表示方法,例如上面的地址可以压缩表示为:
2001:D12:0:0:2AA:987:FE29:9871
为了进一步精简 IPv6 地址,当冒号十六进制格式中出现连续几段数值 0 的位段时,这些段可以压缩为双冒号的表示,例如上面的地址还可以进一步精简表示为:
2001:D12::2AA:987:FE29:9871
又例如 IPv6 的地址 FF80:0:0:0:FF:3BA:891:67C2
可以进一步精简表示为:
FE80::FF:3BA:891:67C2
这里值得注意的是,双冒号只能出现一次。
IPv6 地址的号段划分和前缀表示法
IPv6 的地址类型
IPv6 地址分三种类型
1、单播,对应于 IPv4 的普通公网和私网地址
2、组播,对应于 IPv4 的组播(多播)地址
3、任播,IPv6 新增的地址概念类型
IPv6 单播地址
1、全球单播地址
前缀 2000::/3,相当于 IPv4 的公网地址(IPv6 的诞生根本上就是为了解决 IPv4 公网地址耗尽的问题)。这种地址在全球的路由器间可以路由。
2、链路本地地址
前缀 FE80::/10,顾名思义,此类地址用于同一链路上的节点间的通信,主要用于自动配置地址和邻居节点发现过程。Windows 和 Linux 支持或开启 IPv6 后,默认会给网卡接口自动配置一个链路本地地址。也就是说,一个接口一定有一个链路本地地址。
fe80::de1e ....
注意,很容易会把链路本地地址和 IPv4 的私网 / 内网地址对应起来,其实链路本地地址对应于 IPv4 的 APIPA 地址,也就是 169.254 开头的地址(典型场景就是 windows 开启自动获取地址而获取失败后自动分配一个 169.254 的地址)。
3、唯一本地地址
前缀 FC00::/7,相当于 IPv4 的私网地址(10.0.0.0、172.16.0.0、192.168.0.0),在 RFC4193 中新定义的一种解决私网需求的单播地址类型,用来代替废弃使用的站点本地地址。
4、环回地址
0:0:0:0:0:0:0:1 或::1,等同于 IPv4 的 127.0.0.1
5、过渡地址
就是在 IPv6 的某一些十六进制段内嵌这 IPv4 的地址,例如 IPv6 地址中 64:ff9b::10.10.10.10,此 IPv6 地址最后 4 个字节内嵌一个 IPv4 的地址,这类地址主要用于 IPv6/IPv4 的过渡技术中。
IPv6部署现状
- IPv6使用比例比较高的几个国家/地区:
1、印度(57%)比利时(54%)美国(50%)德国(41%)马来(37%)希腊(36%)日本(30%)巴西(29%)
2、使用率超过5%的国家有55个
3、中国目前只有3.9% - 移动运营商
1、 印度(JIO 87% Vodafone 45.9%)
2、美国(T-Mobile 93 % Sprint 70%)
3、 日本(Softbank 34%) - IPv6路由
全球BGP路由数据库中,由54154个AS,其中13947(25.8%)通告了IPv6的前缀,其中243个只通告了IPv6前缀。 - 运营商骨干网
除非洲,中东国家,拉美少数国家和中国外,其他国家的运营商骨干网都完成了IPv6的部署。
IPv6 过渡方案
为什么 IPv6 已经发展了十几年了,目前在我们的工作和生活中还是比较少接触和使用。这里的原因是非常的复杂,有技术上障碍,因为 IPv6 和 IPv4 是两个完全不兼容的协议(在极少数的特定场景可以实现兼容),如果要从支持 IPv4 升级到 IPv6,无论是应用程序用客户端、服务器程序端、路由器等等,都要同时支持 IPv6 才能解决问题,这个的升级改造需要花费的成本是巨大的。而且,正是由于技术上的升级花费大量的人力物力,无论是运营商还是互联网服务商,一方面要重视用户的体验问题,这个肯定不能强制客户更新换代硬件设备和软件,另一方面也要维护自身的投资和利益,更愿意去选择利用现有技术降低 IPv4 地址耗尽带来的压力,例如 NAT 的广泛应用,就是 IPv6 推广使用的一个重要的“障碍”。
1、双栈技术
简介:
- 设备同时支持IPv4/IPv6协议栈
- 如果通信双方都支持IPv6,则使用IPv6,否则使用IPv4
- 最简单直接的过渡方案
特点: - 不能解决根本的IPv4地址耗尽的问题
-
现实网络中,双栈技术需要和其他过渡技术配合一起使用
2、隧道技术
当前的网络是以 IPv4 为主,因此尽可能地充分利用 IPv4 网络进行 IPv6 通信是十分好的手段之一。隧道技术就是这样子的一种过渡技术。
隧道将 IPv6 的数据报文封装在 IPv4 的报文头部后面(IPv6 的数据报文是 IPv4 的载荷部分),IPv6 通信节点之间传输的 IPv6 数据包就可以穿越 IPv4 网络进行传输。隧道技术的一个很重要的优点是透明性,通过隧道进行通信的两个 IPv6 节点(或者节点上的应用程序)几乎感觉不到隧道的存在。
简介:
- 当前网络是以ipv4为主,新增的IPv6网络形成彼此不通的孤岛网络
- IPv6孤岛通过隧道技术联通。
关键技术: - IP隧道:IPv6 over IPv4
- 边界路由器支持双栈协议
- 边界路由器之间,通过MP-BGP交换IPv6路由信息
-
边界路由器之间,通过隧道技术在IPv4网络上转发IPv6数据包
3、转换技术
解决问题:
- IPv6-only 客户端如何访问IPv4-only的网络
- 运营商用户侧网络的兼容性技术。
技术: - DNS64/NAT64
- 464XLAT
方案一:DNS64/NAT64
DNS64
1、 当DNS 查询记录AAAA为空时,用A记录合成一个IPv6地址。
2、 合成地址的第一部分只想NAT64的地址前缀,第二部分嵌入A记录中的IPv4地址
NAT64
1、NAT64网关将DNS64的合成地址转换为IPv4地址后向外发送,并维持 IPv4和IPv6的MAP表
2、NAT64网关接收到外部的IPv4包后,根据MAP表将IPv4包转换为IPv6包发送给IPv6 only 的客户端。
其实就是子网内用IPv6,出口用IPv4.
方案二:464XLAT
也是为了客户端 IPv6-only 网络访问 IPv4服务端的方式。
但不是有 DNS64/NAT64 方式了吗?不不不,万一,客户端绕过DNS 阶段,直接访问 8.8.8.8 怎么办呢?
解决方案:
- XLAT Customer-side translator
客户端操作系统之上,将IPv4包转成IPv6 - PLAT Provider-side translator
运营商的本地网关上,将IPv6包转换为IPv4包
支持范围:
- 操作系统:Android 4.3 以上,Windows10
- 支持的运营商 T-mobile;Orange
-
苹果明确表示不支持,要求APP在IPv6网络下正常工作。
这种技术把运营商网络搞的超级复杂,而且这种方式就是在对 IPv4 做妥协。
国内三大运营商对兼容性方案做的支持程度还是不够,主要推崇IPv6-only。
国内运营商在服务端没有 IPv6 的情况下都会请求失败!!!(IPv6兼容性在国外比较常见)
参考:
https://www.infoq.cn/article/vpDCmupCW3MEv3L2kx41
https://www.infoq.cn/article/zgkJXORjQiTEUBifd3pi