iOS开发之如何应对苹果app的ipv6时代?
一
背景介绍
你了解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
为什么要接入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环境本来就支持了,我们不改上层的,只改底层的是影响最小。
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等。
举个栗子
这里大概描述一下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地址上。
开发同学干了什么?
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进行的联网操作。
三
客户端兼容性测试办法
测试环境搭建
后台不用改,那客户端要改如何兼容。我们可以先用苹果给的测试工具,简单测试。整体原理如下:
其中,在客户端的改造叫做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的网。
【经验总结】
逻辑和场景是测试的两个纬度,二者都要兼顾到。
iOS开发之如何应对苹果app的ipv6时代?的更多相关文章
- 如何应对苹果app 的ipv6 时代?腾讯专家教您进行环境改造
WeTest 导读 WWDC2015苹果宣布在ios9支持纯IPv6的网络服务,并且要求2016年提交到app store的应用必须兼容纯IPv6的网络,要求适配的系统版本是ios9以上(包括ios9 ...
- 【转】【iOS开发】打开另一个APP(URL Scheme与openURL)
目标 平常我们做iOS开发,会经常遇到打开其他的APP的功能.本篇文章讲的就是打开别人的APP的一些知识.我们的目标是: 打开别人的APP 让别人打开我们的APP iOS9的适配问题 使用URL Sc ...
- ios开发中如何调用苹果自带地图导航
前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行 ...
- iOS开发基础:最新的APP打包上架流程
之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...
- iOS开发 - OC - 苹果为大家提供的后台:CloudKit 的简单使用
一.什么是cloudKit 移动开发中,网络请求数据是日常中用到的,我们习惯把一些用户改动的数据存在服务器,以便下次请求使用.或者开发者方通过服务器将编辑的数据发送给用户.但是这一切都建立在我们的AP ...
- iOS开发那些事-iOS6苹果地图实用开发
在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,但是API编程接口没有太大的变化.开发人员不需要再学习很多新东西就能开发地图应用,这是负责任的做法.因此本节介绍的内容也同样适用于iOS5 ...
- iOS开发那些事-iOS6苹果地图有用开发
在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,可是API编程接口没有太大的变化.开发者不须要再学习非常多新东西就能开发地图应用,这是负责任的做法.因此本节介绍的内容也相同适用于iOS5 ...
- iOS开发分析"秘密"App内容页面的效果(两)
@我前几天写的"秘密"的Cell制品的效果,想要的效果还是有差距,并且扩展性非常不好,于是重写封装,把总体视图都放到scrollView中,基本是和secret app 一模一样的 ...
- iOS开发之常用资讯类App的分类展示与编辑的完整案例实现(Swift版)
上篇博客我们聊了<资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0)>,今天的这篇博客就在上篇博客的基础上做些东西.做一个完整的资讯类App中的分类展示 ...
随机推荐
- 解读:hadoop压缩格式
Hadoop中用得比较多的4种压缩格式:lzo,gzip,snappy,bzip2.它们的优缺点和应用场景如下: 1). gzip压缩 优点:压缩率比较高,而且压缩/解压速度也比较快:hadoop本身 ...
- Linux命令awk
1.简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行读入,默认以空格为分隔符将每行切片,切开的部 ...
- Tomcat的配置,设置内存,获取用户IP
一.修改配置文件 tomcat配置文件路径/tomcat/bin/server.xml # shutdown指定终止Tomcat服务器运行时,发给Tomcat 服务器的shutdown监听端口的字符串 ...
- KVM配置及维护
kvm使用场景 1.公司测试环境/开发环境 测试开发环境可以使用配置低点的物理机就可以 2.公司生产环境 一般小公司没有私有云或容器团队,运维人员可能就1-2个,然后公司也不舍得花钱买商业化的私有云. ...
- IntelliJ IDEA 开发git多模块项目
1.clone主项目 填写主仓库地址 2.在项目根目录,初始化子模块,并clone源码 git submodule init git submodule update 3.定位到各个子模块根目录,并切 ...
- pycharm社区版创建django项目(Windows 8.1)
django是Python的一个开源web框架,在pycharm开发环境中,pycharm专业版在新建一个项目的时候有django选项,帮助创建一个django框架的项目.pycharm社区版需要自己 ...
- lucene介绍和存储介绍
全文检索基础 1. Windows系统中的有搜索功能:打开“我的电脑”,按“F3”就可以使用查找的功能,查找指定的文件或文件夹.搜索的范围是整个电脑中的文件资源. 2. 在BBS.BLOG.新闻等系统 ...
- sql数据类型转换函数
1.CAST()CAST (<expression> AS <data_ type>[ length ]) 2.CONVERT()CONVERT (<data_ type ...
- jquery中的工具方法$.isFunction, $.isArray(), $.isWindow()
本文正式地址:http://www.xiabingbao.com/jquery/2015/07/25/jquery-judge-type 在javascript中对变量类型的判断中,我们讲解了了jqu ...
- spring mvc: xml练习
xml练习,得到的结果是: <?xml version="1.0" encoding="UTF-8" standalone="yes" ...