还在为 IPv6 烦恼?这篇文章完美解决你的难题!

所在版块: 知识库 2017-09-11 10:53 [复制链接] 查看: 783|回复: 0
一、为什么要使用 IPv6
从 IPv4 到 IPv6,IP 地址的数量从 2 的 32 次方扩展到 2 的 128 次方,这个是 IPv6 碾压 IPv4 的地方,足够地球上的每粒沙子分配一个或者多个 IP 地址。当然,除了 IPv4 本身的原因(地址枯竭)外,下面提到的几点,也说明了 IPv6 比 IPv4 更加高效,例如:
避免了网络地址转换(NAT)的需要
通过使用简化的头提供了更快的路由通过网络
防止网络碎片
避免广播邻居地址解析

但最根本的原因莫过于苹果审核的压力,不得不将 App 适配 IPv6。

二、测试应该关注的点
1.保证项目代码中使用的是更高层次的网络 API,避免使用 socket API
在苹果官网上,有这么一张图,说明了哪些框架支持 IPv6,哪些不支持,如下图所示:

11.jpg


图中蓝色部分默认支持 IPv6,如果项目代码中使用的是 WebKit 或者 AFNetWorking 这些网络框架,那么需要改动的代码不会很多。

2.走读代码中是否使用了 IP 地址
比如,检查代码中是否包含了类似于 192.168.0.1 的地址,如果有,需要换为其对应的域名地址。

3.检查代码是否包含只适用于 IPv4 的 API
确保项目代码中没有以下 API:
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()

如果有了这些代码也不要怕,只需要将对应的 API 换为 IPv6 所支持的 API 即可,下表是 IPv4 和 IPv6 的对应关系表:

22.png


4.本地搭建 IPv6 环境,回归 App 中所有网络请求的模块
我们现在连的网络,无论是 wifi 还是移动、联通、电信的各种不同类型的网络,都是 IPv4 的,也就是实际生活中和我们打交道的全是 IPv4 环境。但我们需要测试 IPv6 在 iOSAPP 中的兼容性,是必然不能在现有的网络环境下测试的,需要测试人员自己构建测试环境。

值得欣慰的是,苹果公司在 MacOSX 10.11 以后的系统中就埋下了开启 IPv6 环境的彩蛋。我们所要做的就是参照官方文档,在本地搭建这样的测试环境。即用 Mac 机建立一个热点,然后用 iPhone 连接该热点,回归待测模块。简单的示意图如下所示:

33.jpg


a)需要准备的设备:
系统是 OSX 10.11 以后版本的 Mac 机(该 Mac机要使用非 WiFi 方式上网,且支持双网卡)一台,iPhone 手机一台。这个地方有些土豪同学可能会有疑问,我的 Mac 本本只有无线网卡,没有有线网孔啊,这时你就需要一个苹果 Thunderbolt 千兆以太网转换器,如下图所示:

44.jpg


b)开启 NAT64 网络
打开“系统偏好设置”,按住 option 键的同时点击“共享”,如下图所示:

55.jpg


之后,在共享页就能看到“创建 NAT64 网络”的可选框了,如下图所示:

66.jpg


到此,我们的 NAT64 网络就创建完成了,剩下的就是创建热点了。

c)在 MAC 机上创建 WiFi 热点
MAC 上创建 WiFi 热点,很简单,这里就不再详细说明了,看下面这张图也能知道怎么创建的:

77.jpg


这里想说明一点,也是比较关键的一点:点击上图中的“启动”button 后,有些网络会出现如下图所示的共享失败情况:

88.jpg


出现这种情况,说明你当前使用的网络受到了 802.1x 协议的限制,无法共享。只能通过去 802.1x 保护或者换其他可以共享的网络进行共享。

如果是在公司网络,可以寻求 IT 进行网络切换,或者找开发他们搭建好的网络环境进行测试(ps:如果开发没有 IPv6 网络环境,且发版时间又比较紧张的情况下,可以和老大申请回家办公,或者随便一个咖啡馆)。

如果热点搭建成功,是可以在 Mac 机右上角的网络状态处看到如下图所示的图标:

99.jpg


d)iPhone 手机连接创建好的热点,连接成功后,可以查下 iPhone 手机的 IP 地址
我这里看到的是 169.254.*.*的 IP 地址,这类地址属于保留地址,具体什么是保留地址,请自行百度。

e)回归待测 App,确保所有的网络请求在本地搭建好的 IPv6 网络环境下正常的,这里说的“正常”就是指和在 IPv4 网络环境下的表现一致
经测试,在 IPv6 网络环境下,QQ 可以正常使用,微信网络连接失败(微信最新的 SDK 已支持 IPv6)。

最后,如果感兴趣的话,可以用抓包工具看一下,IPv6 的地址长什么样子,之前都是在课本中见到过,这次测试也算是头一次真正看到 IPv6 的地址啦,如下图所示:

1010.jpg


三、项目实战

这里以地图 SDK 为例,简单说明具体的测试步骤。地图 SDK,是地图软件开发工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合,它包括接口 API、示例代码、支持性的技术注解或者其他的支持文档,有了这些,第三方开发者可以很方便的使用这些 API 开发自己所需的功能。(目前和腾讯地图 SDK 合作的有京东、58 同城、携程、嘀嘀等。这里附上腾讯地图开放平台地址:http://lbs.qq.com/ios_v1/index.html)

1.首先需要分析该 SDK 使用到了哪些库
地图 SDK 中使用的 framework 如下图:

1111.jpg


针对地图 SDK 中使用到的这些库,逐一确认是否支持 IPv6,比如 WebKit.framework 框架,苹果官方文档就明确说明了支持 IPv6。

2.检查 SDK 源码中是否使用到了 IP 地址
这块主要是走查所有有网络请求的模块,是否将 IP 地址替换为了域名,这块一般是在代码某个配置文件中进行定义的。比如,下图所示的 server 地址:

1212.jpg


3.检查代码中是否包含只支持 IPv4 的 API
由于 SDK 使用的是 WebKit.framework,不存在底层的 socketAPI,这块没有风险。

4.本地搭建测试环境,回归 SDK 网络相关模块
这里,需要保证在 IPv6 环境下的功能与在 IPv4 环境下表现一致的,就可以说明测试通过。

5.抓包确认
最后,可以通过抓包看看是否真的走的是所搭建的 IPv6 的测试环境,当然也可以亲眼目睹下 IPv6 的 IP 地址长什么样儿。



回复

使用道具 举报

高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版经验值规则

扫描二维码打开微信端