WeTest 导读

WWDC2015苹果宣布在ios9支持纯IPv6的网络服务,并且要求2016年提交到app store的应用必须兼容纯IPv6的网络,要求适配的系统版本是ios9以上(包括ios9)。

 一、背景介绍

1、你了解IPv6吗?

IPv6是Internet Protocol Version 6的缩写,简单的概括IPv6就是现行的互联网协议(IPV4)的下一代IP协议。IPv6由128位二进制数组成,可提供庞大的IP地址资源,足以让地球上每个生物乃至每厘米都能被分配到一个或多个IP地址。将这128位的地址按每16位划分为一个段,将每个段转换成十六进制数字,并用冒号隔开。

IPv4地址示例:192.168.191.1

IPv6地址示例:2001:0db8:85a3:08d3:1319:8a2e:0370:7344

2、为什么要接入IPv6?

目前互联网广泛应用的IPv4技术,理论上IPv4是一个32位的二进制数的地址,可编址1600万个网络、40亿台主机。但在采用了A、B、C三类编址方式后,可用的网络地址和主机地址数目大打折扣,欧美资本主义列强掌握着核心技术,留给我国的就更少了。

二、改造方案

要想使应用完全支持IPV6的环境要做的太多了,从协议到硬件,要做一次彻底的大调整。不但客户端要做ipv6的改造,服务器也要适配ipv6.主要有一下四种对应关系,必须做好以下每一种。

 IPv4 -> IPv4

      IPv4 -> IPv6

      IPv6 -> IPv4

      IPv6 -> IPv6

要做到IPv6和IPv4完全兼容需要做很大的修改,最简单的协议上要兼容128位的IP地址,路由器,服务器等相关硬件也要升级。应苹果公司的要求,本次改造我们只关注客户端从IPv6的网络环境访问IPv4的资源。那么问题来了,现在我们大部分后台服务器都是使用IPv4接入的,我们要如何做兼容?幸好,从一开始设计IPv6就考虑到了向后兼容的问题,运营商会提供一个中间节点,使用DNS64/NAT64等技术,负责协议的转换,打通IPv6和IPv4之间的链路。(IPv6和IPv4 互通技术有很多,这里只讨论apple要求的技术方案DNS64/NAT64) 我们要走的服务器必须支持nat/nat64的环境,搭建的wifi环境本来就支持了,我们不改上层的,只改底层的是影响最小。

1、NAT64与DNS64技术

NAT64是一种有状态的网络地址与协议转换技术,一般只支持通过IPv6网络侧用户发起连接访问IPv4侧网络资源。但NAT64也支持通过手工配置静态映射关系,实现IPv4网络主动发起连接访问IPv6网络。NAT64可实现TCP、UDP、ICMP协议下的IPv6与IPv4网络地址和协议转换。

DNS64则主要是配合NAT64工作,主要是将DNS查询信息中的A记录(IPv4地址)合成到AAAA记录(IPv6地址)中,返回合成的AAAA记录用户给IPv6侧用户。DNS64也解决了NAT-PT中的DNS-ALG存在的缺陷。NAT64一般与DNS64协同工作,而不需要在IPv6客户端或IPv4服务器端做任何修改。NAT64解决了NAT-PT中的大部分缺陷,同时配合DNS64的协同工作,无需像NAT-PT中的DNS-ALG等。

2、举个栗子

这里大概描述一下NAT64的工作流程。

(1)IPv6主机发起www.ipv6bbs.cn的AAAA域名解析到DNS64(主机配置的DNS地址是DNS64)

(2)DNS64触发AAAA到DNS AAAA中查询;

(3)DNS AAAA返回NULL的信息到DNS64;

(4)DNS64然后触发A的申请到DNS A中查询;

(5)DNS A返回www.ipv6bbs.cn的A记录(11.111.11.11);

(6)DNS64合成IPv6地址(64:ff9b: 11.111.11.11),返回AAAA response给IPv6主机;

(7)IPv6主机发起目的地址为64:ff9b: 11.111.11.11的IPv6数据包;由于NAT64在IPv6域内通告配置的IPv6 Prefix,因此这个数据包转发到NAT64设备上;

(8)NAT64执行地址转换和协议转换,目的地址转换为192.0.2.1,源地址根据地址状态转换(64:ff9b: 11.111.11.11,1500)->( 11.111.11.11,2000);在IPv4域内路由到IPv4 server;

(9)数据包返回,目的地址和端口为11.111.11.11,2000;

(10)NAT64根据已有记录进行转换,目的地址转换为2001:db8::1,源地址为加了IPv6前缀的IPv4 server地址64:ff9b: 11.111.11.11,发送到IPv6主机;

按照NAT64的规则,客户端如果没有做DNS域名解析的话(微信依赖的是自己实现的NEWDNS),客户端就需要完成DNS64的工作。这里的关键点是,发现网络是IPv6-only的NAT64网络的情况下,我们可以自己补充上前缀64:ff9b::/96,然后进行正常的访问。然而这里客户端能获取的信息量一般都是很有限的。

注:AAAA记录(AAAA record)是用来将域名解析到IPv6地址的DNS记录。用户可以将一个域名解析到IPv6地址上,也可以将子域名解析到IPv6地址上。

3、开发同学干了什么?

 Xplaform改造的要点主要有一下4个:

a.换用兼容IPv4及IPv6的API,例如:getaddrinfo,yaoli同学在测试过程中发现,ios9系统在IPv6-only的环境下,返回会的地址信息结构体中port为0,所以这里需要重新赋值端口号再进行联网。

b.判断当前客户端是处于IPv4-only、IPv6-only还是IPv4和IPv6并存的环境,然后分别使用不同的网络API,可以参考http://km.oa.com/articles/show/270667。

c.SCNetworkReachabilityCreateWithAddress这个方法最好使用探测域名的方式。如果参数填的是0.0.0.0,苹果文档说明这返回的结果不保证能真正出外网。这样就需要其它辅助的手段尝试是否能出外网了。

d.使用socket及connect进行的联网操作。

三、客户端兼容性测试办法

1、测试环境搭建

后台不用改,那客户端要改如何兼容。我们可以先用苹果给的测试工具,简单测试。整体原理如下:

其中,在客户端的改造叫做Xplaform,需要连接mac机创建的NAT64/DNS64的wifi,就是传说中的IPV6的网络环境,再通过有线网络,路由器,访问到IPv4的资源。就做到IPv6→IPv4的连接。

下面讲解一下IPv6wifi网络环境的搭建。

(1)工具/准备

体验网有线接口、iMAC(10.11以上的系统)和iOS9(包括iOS9)以上设备

 (2)步骤

接好体验网的网线,然后打开系统设置找到Sharing图标,如下:

点击进入,然后按住option按键同时用鼠标点击下图的“internet-Sharing”。

这时可以看到下方出现了“Create NAT64 Network”可选菜单,把这个选上,如下图:

之后用手机连上这个共享的wifi热点,测试对应的网络功能即可。

测试重点:

1、  IPV4和IPV6网络环境判断是否正确

2、  UDP和TCP的切换是否正确

3、  数据线和音视频的基本功能

四、经典bug分享

【bug描述】移动4G下无法传文件。

在移动网络下无法查看电脑和进入wifiphoto,传文件,问题出现的初期我们马上切换到wifi下,发现wifi下是可以的,把sim卡换成联通的,也可以。唯独移动的网络下无法传文件。初步断定是对网络的兼容性问题。

【问题排查】

1、 查看socket日志,发现在connection一直失败。在建立连接阶段一直失败。我们做该需求的目的在于要增加IPV6的客户端能通过IPV6的网络访问到IPV4的资源。因此,在做IPV6的改造中我们做了一个判断逻辑,判断当前网络环境是IPV4 or IPV6。

2、加日志验证,我们把socket绑定的ip地址类型打出来,果然:

在移动数据网络下走了ipv6的通道。可是各大运营商的网络应该走的是ipv4才对。

3、review代码。问题就很明显了,我们梳理了一下选择ipv6或者ipv4协议栈的判断逻辑,原来开发判断到网关是IPv6的网关之后就不再往下判断,直接建立连接。然而,我们连接上4G网络环境的时候,移动基站分发的网关是一个ipv6形式网关,它可以兼容ipv6和ipv4两种ip(开发同学认为是移动公司兼容ipv6的策略,看来移动公司已经走在我们前面了)。

【解决办法】

我们更改了IPv6和IPv4协议栈的判断逻辑:

1、探测环境

我们的探测环境的方法是:先创建一个ipv6的socket去连ipv6的地址,如果当前网络不是ipv6的环境,返回路由不可达。关键点,因为tcp是异步的需要三次握手,所以我们使用udp来完成这个过程。

2、继续判断网关语法是否是IPv6格式,

3、最后获取DNS地址,以上都符合IPv6的语法,即为IPv6的网络,建立socket走IPv6.

4、如果当前网络是IPv6的环境,我们就对IP进行兼容性改造IPv6 = 64:ff9b::/96+IPv4。再通过改造后的IP地址建立socket连接。

5、如果IPv6和IPv4都可以走通,我们优先建立IPv4的连接。

【结果检查】

打印出建立连接的日志:

从日志可以看出,手机连接4G之后得到的是IPv4的地址和IPv6格式的网关。

创建socket时,IPv6失败,走IPv4的网。

【经验总结】

逻辑和场景是测试的两个纬度,二者都要兼顾到。


【腾讯WeTest iOS预审工具】

为了提高IEG苹果审核通过率,腾讯专门成立了苹果审核测试团队,打造出iOS预审工具这款产品。经过1年半的内部运营,腾讯内部应用的iOS审核通过率从平均35%提升到90%+。

现将腾讯内部产品的过审经验,以线上工具的形式共享给各位。在WeTest腾讯质量开放平台上可以在线使用。点击http://wetest.qq.com/product/ios即可立即体验!

如果使用当中有任何疑问,欢迎联系腾讯WeTest企业QQ:800024531


iOS预审工具分四步进行预审服务

【一键扫描】只需提供ipa包、审核图片、审核视频、应用描述,即可在4小时内拿到一份完整的检测报告,定位问题的同时提供解决方案,助您成功通过审核。

【案例分享】集结iOS审核失败常见原因,丰富案例为您提供参考依据。

【专家服务】腾讯专家团队为您分析各种疑难杂症,提出最优解决方案。

【ASO优化】专业优化AppStore内关键字搜索结果,让产品离用户更近一步。希望App/手游在预审验收保证下,都可以快快乐乐过审,开开心心赚钱。

 

如何应对苹果app 的ipv6 时代?腾讯专家教您进行环境改造的更多相关文章

  1. iOS开发之如何应对苹果app的ipv6时代?

    WWDC2015苹果宣布在ios9支持纯IPv6的网络服务,并且要求2016年提交到app store的应用必须兼容纯IPv6的网络,要求适配的系统版本是ios9以上(包括ios9). 一 背景介绍 ...

  2. 配置阿里云ECS支持IPv6,解决苹果app审核失败问题

    前几天iOS的App提交给苹果审核没通过,给出的原因是:该应用在 IPv6 的环境下无法使用.检查发现:阿里云优化过的系统没有启用IPv6协议,需要配置启用一下,但是只单独启用IPv6也是无法直接提供 ...

  3. 工信部要求应用商店上新 App 检查 IPv6,这里有一份 IPv6 快速部署指南

    7 月 25 日,工业和信息化部信息通信发展司组织召开部署推进 IPv6 网络就绪专项行动电视电话会议.会议指出,加快推进 IPv6 规模部署,构建高速率.广普及.全覆盖.智能化的下一代互联网,是互联 ...

  4. IPv6 时代如何防御 DDoS 攻击?

    在互联网世界,每台联网的设备都被分配了一个用于标识和位置定义的 IP 地址.20 世纪 90 年代以来互联网的快速发展,联网设备所需的地址远远多于可用 IPv4 地址的数量,导致了 IPv4 地址耗尽 ...

  5. 怎么找到苹果App Store的应用程序下载链接地址

    http://jingyan.baidu.com/article/6dad5075f6fa79a123e36e85.html 怎么找到苹果App Store的应用程序下载链接地址 每个上传到苹果app ...

  6. 发布iOS应用程序到苹果APP STORE完整流程

    参考:http://blog.csdn.net/mad1989/article/details/8167529(xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)) http ...

  7. 苹果App部署HTTPS进行在线下载安装

    苹果App的ipa下载需要有几个前提,可参考:Android和IOS的本地App如何安装(apk&ipa) 本文主要介绍如何部署https提供ipa的下载,步骤如下: 1. 搭建一个HTTPS ...

  8. 精准化测试专业平台Paw:苹果APP应用代码质量的守护者

    众所周知,一款苹果APP进入苹果应用商店后,要上排行榜,要被首页推荐,版本更新必不可少,但作为版本更新的关键所在,软件测试一直被业内吐槽“坑太多”,缺陷防不胜防.相关经验缺乏等等.若问如何“填坑”?以 ...

  9. 苹果App Store开发者帐户从申请,验证,到发布应用(4)

    苹果App Store应用内支付(In-App Purchase) IAP简介 IAP的全称是In-App Purchase,应用内付费.这种业务模式允许用户免费下载试用,对应用内提供的商品选择消费, ...

随机推荐

  1. sql 两种分页offset和row_number简单分析

    新建临时表字段id,向临时表里插入1,2,3,4,5,6 if object_id('tempdb..#test') is not null drop table #test create table ...

  2. [UWP]涨姿势UWP源码——适配电脑和手机

    上一篇我们介绍了绘制主界面的MainPage.xaml,本篇则会结合MainPage.xaml.cs来讲一讲如何适配电脑和手机这些不同尺寸的设备. 同时适配电脑和手机存在几个麻烦的地方: 屏幕尺寸差距 ...

  3. 关于oracle后导数据的一些小TIPS

    今天下午需要把一些数据导入到正式环境中,但是通过Excel拷贝进去行会错位,把excel的每一列的双击让其变为最宽即可解决该问题

  4. P2物理引擎中文文档

    P2物理引擎中文文档地址:https://github.com/schteppe/p2.js/wiki/Chinese-wiki-%E4%B8%AD%E6%96%87%E7%BB%B4%E5%9F%B ...

  5. PHP中的for循环

    循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都会把 ...

  6. ios坐标位置转换

    //ios常用坐标转换来处理一些下拉框队形的按钮的位置,我以最下面两个来进行一下个人的理解,不足之处多多见谅 - (CGPoint)convertPoint:(CGPoint)point toView ...

  7. Memcached与MySQL数据同步

    1.介绍 在生产环境中,我们经常使用MySQL作为应用的数据库.但是随着用户的增多数据量的增大,我们将会自然而然的选择Memcached作为缓存数据库,从而减小MySQL的压力.但是memcached ...

  8. ArcGIS API for JavaScript 4.2学习笔记[30] 点和线高程查询(第八章完结)

    终于到最后一篇了,可喜可贺. 本例先说明了如何进行单点的高程差分析,然后说明了道路的起伏分析.前者很直观地比较了两个年份的高程数据之间的差值,体现山区的高程变化(有啥用啊?)后者,一条路上的起点终点起 ...

  9. cloud-init 典型应用 - 每天5分钟玩转 OpenStack(174)

    本节介绍几个 cloud-init 的典型应用:设置 hostanme,设置用户初始密码,安装软件. 设置 hostname cloud-init 默认会将 instance 的名字设置为 hostn ...

  10. C语言本身并不提供输入输出语句

    C语言本身并不提供输入输出语句,输入和输出操作是由函数来实现的.在C标准函数库中提供了一些输入输出函数,例如,printf函数和scanf函数.在使用他们时,千万不要误认为他们是C语言提供的“输入输出 ...