IPv6-only的兼容性问题

如何满足苹果要求 iOS 应用完全支持 IPv6-ONLY 网络?

最近一条新闻引起了我的注意:

注解

5月5日消息,苹果昨日向开发者发出提醒,App Store将于今年6月1日实施全新策略,届时所有提交至苹果App Store的iOS应用申请必须要兼容面向硬件识别和网络路由的最新互联网协议–IPv6-only标准。

什么是 IPv6-ONLY ??

以前,大家都在用 IPv4,就是地址看起来是 114.255.40.66 的样子。然而,这样的地址已经不够用了,就有了类似 2001:da8:215:4009:250:56ff:fe97:40c7 这样的 IP 地址。

目前,一个网卡会同时使用这两张地址;在未来,一个网卡将仅有后面这样的 IPv6 地址。 使用这两种地址的设备是不能互相访问的,后来有了一些过渡技术让他们在某些情况下可以互相访问了。(如 DNS64/NAT64)

如何满足苹果要求??苹果公司为什么要这么做??

现在有极小一部分用户处在IPv6-ONLY的环境中,未来这个比例会扩大。

苹果这样要求,对于大多数开发者而言,并不困难。目前大多数应用无需任何操作即可满足要求。

我不太懂这些,我该怎么做呢??

在你的应用中使用域名(如 www.bupt.edu.cn),不要在任何地方使用 IPv4地址(114.255.40.66)。

我的服务器必须有 IPv6 地址么??

不是的,服务器只需要有公网 IPv4 地址即可,但要求必须使用域名(FQDN)来表示服务器。

如何创造 IPv6-ONLY 测试环境?

MacOS 提供了这个功能。 使用 Mac 把有线网络共享到 WiFi,中间勾选 创建NAT64网络 即可。

详情可参看 Apple Support

IPv6客户端访问IPv4服务器原理?

首先,这个是无法直接访问的,必须网络的提供商支持过渡技术。

  • 第一步:DNS 污染

    例如我们想要访问 example.com ,假设这个网站只有 IPv4 地址(93.184.216.34,用16进制表示为 5d b8 d8 22) 那么,被“污染”的DNS返回的 IP 地址是 64:ff9b::5db8:d822。 其中 `64:ff9b::/96`是IANA分配用于DNS64的前缀。

  • 第二步:IPv6 转 IPv4

    访问 64:ff9b::5db8:d822 时,IPv6 包头被替换为 IPv4 包头,继续访问。 同时回来的数据包会被做反向处理。

详情可参看 RFC6146 、 RFC6147

首先解释下IPv6的是什么?

维基百科的定义如下:
IPv6是Internet Protocol version 6的缩写 全名为互联网通讯协议第6版 是互联网协议的最新版本,用于分组交换互联网络的网络层协议,旨在解决IPv4地址枯竭问题
IPv6具有比IPv4大得多的编码地址空间。这是因为IPv6采用了128位的地址,而IPv4使用的是32位。因此新增的地址空间支持2128(约3.4 ×1038)个地址

优点如下:

  1. IPv6具有更大的地址空间
  2. IPv6使用更小的路由表 (更快的路由)
  3. IPv6具有更高的安全性

APP中如何使用IPv6

1. 使用更高层次的网络API(Use High-Level Networking Frameworks) 避免使用socket API

蓝色部分API 默认都支持IPv6


API

也就是说
.WebKit
.(NSURLSession NSURLRequest NSURLConnection)
.CFNetwork

这些API默认都已经支持IPv6
而值得庆幸的时 我们使用的大多数第三方网络库使用的也是这些API
比如AFNetWorking 我特意找了一段代码


AFNetWoring DEMO

下图是Alamofire创建请求的代码


Alamofire DEMO

Alamofire使用的是High-Level Networking Frameworks(NSURLRequest) 也不存在兼容性问题
这意味着大多数情况下 我们不需要做什么 就可以兼容IPv6

如果你不能避免使用socket API 请参考这个指南
RFC4038: Application Aspects of IPv6 Transition
或者参考谷歌的开源库CocoaAsyncSocket

2. 不要使用IP地址
比如使用SCNetworkReachabilityCreateWithName API 时

  func SCNetworkReachabilityCreateWithName(_ allocator:     CFAllocator?, _ nodename: UnsafePointer<Int8>) -> SCNetworkReachability?

使用主机名或者主机域名访问

3.检查IPv4代码
项目中不能使用如下代码:

inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()

IPv4->IPv6类型对照表

如何测试?

利用Mac创建一个 IPv6 WIFI 热点 手机连接该WIFI即可测试
(必须保证你的Mac已连接到Internet 并且不是通过WIFI的方式)
1. 创建 IPv6 WIFI热点

点击系统设置(System Preferences)-> 按住Option键 -> 点击共享(Sharing


共享

选择互联网共享(Internet Sharing


互联网共享

选中 创建NaT64网络 (Create NAT64 Network)


systempreferences_sharing_internetsharing_ipv6_2x.png

选择 一个共享来源连接


共享来源连接

配置WIFI选项


WIFI选项配置

输入你的热点名称和密码 最后启用互联网共享(Internet Sharing)选中checkbo


启用 互联网共享

热点开启效果

之后通过手机连接该热点 完成测试

参考连接: 官方网站



文/sprint(简书作者)
原文链接:http://www.jianshu.com/p/8837739251ad
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值