纯IPv6环境App适配的坑
来源:伯乐在线专栏作者 - MrPeak
链接:http://ios.jobbole.com/86580/
苹果从2016年6月1号开始,强制所有app必须支持纯IPv6的网络环境。这项举措将对IPv6的普及起到一定的推动作用,也体现了Apple作为国际大厂的担当。
大部分App由于使用的是高层API,并不需要做任何的更改就能自然度过这次IPv6的考核,只是对于少部分手写IPv4地址连server的同学,生活有一点点影响。
请好好学习TCP/IP协议
每次苹果对技术的推动,都是一次很好的充电学习机会。这里Peak君拜托大家务必好好学习网络协议(深鞠躬)。
之前Apple默认开启ATS,推动HTTPS的使用,ATS可以手动关闭,但据说到2017年所有的HTTP流量都必须带S了,不然无法通过审核。这很make sense,我知道到HTTPS部署已经变得相当简易的今天,还有很多很多的App在侥幸走HTTP。
再后来有Apple将APN悄悄过渡到了HTTP2.0通道,HTTP2.0慢慢地走入寻常百姓家。
这次IPv6的推进,是一次对IP layer的复习机会。大部分人包括我自己对HTTP,TCP相对熟悉一些,IP层由于项目当中接触少,更多还是停留在大学学习的基础概念上。这次趁着Apple的这股东风,好好翻了几篇RFC文档,画了一张下面的图,也同时把公司App的socket迁移方案理顺了。这当中最重要的两个概念是DNS64和NAT64。
DNS64
DNS64说白了是用来帮助host获取IPv6地址的,传统的DNS服务器可以把域名转换成IPv4地址,但我们的iPhone设备如果处于IPv6环境下,只能去获取IPv6的地址。DNS64就像一个中间代理,把传统服务器返回的IPv4地址通过特殊的映射方式转换成一个看着像IPv6地址的地址(IPv4的核,IPv6的壳),转换其实很简单,用公式可以这样表达:
64:ff9b::IPv4 = IPv6
NAT64
DNS64帮助拿到IPv6的地址后,接下来就是NAT64登场,帮助IPv6的Packet顺利接入IPv4的公网当中。IPv4的公网环境路由器只认识IPv4的地址,所有这里当然也需要一个中间设备来做协议转换。NAT64就扮演这个角色。
我在上面的流程图当中已经比较清晰的画出了NAT64的工作方式。其实就是内部同时有IPv4和IPv6的网卡,IPv4的网卡配了一个IPv4的地址池子,再通过端口映射的方式将IPv4地址和IPv6地址对应,同时再做一些协议的转换,毕竟IPv4和IPv6的header完全不同。说白了就是一个内部路由的功能,将奔向IPv4公网的包做了地址和协议的转换。
一个深坑
博主公司所做的App就属于Apple重点点名,手写IPv4地址的典型。socket迁移过程当中踩了一个不大不小的坑,在尝试使用DNS64服务器将IPv4地址转换成IPv6地址的过程当中,发现数字端口号会导致奇异bug。
getaddrinfo(ipv4_str, @(port).stringValue.UTF8String, &hints, &res0);
我们一般使用getaddrinfo函数来解析host,如果端口号部分的入参是数字类型,会导致返回的结果里端口号被修改,当然socket就没法连成功啦。修改办法是在DNS query结果里手动将端口号再改回。
另一个办法是跳过DNS查询,直接自己将IPv4的地址转化成IPv6的地址。类似这样:
const char* ipv4mapped_str ="64:ff9b::121.43.xx.xxx";
视频教程
加上之前录制的Xcode视频教程,这是第二篇视频博客,应该也是最后一篇。视频教程确实不太适合做零散的技术博客分享,而更适合系统性的技术教程。
一是因为广告长到令人发指,90s的广告足以磨掉大部分人的耐心,何况等待的是一篇并不怎么有趣的技术教程。
二是因为视频不如文字精炼,容易把话说得又臭又长,我个人看别人技术博客也习惯一目十行的搜索感兴趣要点,视频只能靠拖进度条,远不如文字大纲了然。
至此也是一次有趣的尝试,收获了iMovie,keynote等高端技能,以后说不定哪天能派上更有价值的用场。
纯IPv6环境App适配的坑的更多相关文章
- 本地如何搭建IPv6环境测试你的APP
IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...
- iOS之在本地搭建IPv6环境测试你的app
IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...
- 本地如何搭建IPv6环境测试你的APP(转)
IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...
- mac本地如何搭建IPv6环境测试你的APP
转自:http://www.cocoachina.com/ios/20160525/16431.html 投稿文章,作者:请勺子喝杯咖啡(简书) IPv6的简介 IPv4 和 IPv6的区别就是 IP ...
- 【指南】本地如何搭建IPv6环境测试你的APP
由于苹果最近更新IOS10之后他们的工作环境升级了,统一用IPV6网络,所以我们发出去的申请的APP不兼容IPV6的话,会通过不了审核! 所幸的是苹果会自动把你服务器要接的协议自动把iPV6转成IPV ...
- 如何让你的App适配iOS7?
随着苹果在2013年9月18日发布iOS7最新的系统以来,iOS各种设备升级到iOS7的数字就已经不断刷新记录.目前据外界统计iOS7设备装机量已经达到2.5亿部,已占iOS设备的64%.由此可见让自 ...
- iOS开发——适配篇&App适配简单概括
App适配简单概括 1:适配:适应.兼容各种不同的情况 系统适配 针对不同版本的操作系统进行适配 屏幕适配 针对不同大小的屏幕尺寸进行适配 在用户眼中 屏幕是由无数个像素组成的 像素越多,屏幕越清晰 ...
- App适配iPhone 6/ Plus和iOS 8:10条小秘诀
App适配iPhone 6/ Plus和iOS 8:10条小秘诀 iPhone 6iOS 8适配 (原文:raywenderlich 作者:Jack Wu 译者:@TurtleFromMars ...
- [坑况]——webpack搭建前端环境踩过的坑啊
前言 嘿哈,webpack搭建前端环境踩过的坑啊! 第一个:完全不知所措 webpack4 下面用不了HtmlWebpackPlugin 和 ExtractTextPlugin 解决方案: html- ...
随机推荐
- 用 NSURProtocol 注入测试数据
在之前的几篇博文中,笔者介绍过访问异步网络的单元测试方法及如何使用模拟对象来进一步控制单元测试的范围.在今天的教程中,笔者将展示另一种方法,即:通过自定义 NSURProtocol 类来获取静态测试数 ...
- UML 中关系详解以及在visio中的表示
http://www.cnblogs.com/kittywei/archive/2013/05/15/3079536.html
- 【Xamarin挖墙脚系列:Android最重要的命令工具ADB】
原文:[Xamarin挖墙脚系列:Android最重要的命令工具ADB] adb工具提供了很好的基于命令的对系统的控制. 以前说过,安卓的本质是运行在Linux上的虚机系统.在Linux中,对系统进行 ...
- linux使用crontab -e 遇到No space left on device
今天用linux的crontab -e编辑定时脚本的时候.遇到No space left on device的错误. 网上找了半天终于知道原因了,昨天晚上我的一个任务因为路径没写对,到时crontab ...
- bzoj3530
比较恶心的题目不难发现是在自动机上做数位dp注意要考虑前导0,题目中给出的233是幸运数,20233不是为此我非常猥琐的写了一个四维dp,用记忆化搜索实现 ; ..,..,..,..] of long ...
- SPOJ_10628_Count_on_a_Tree_(主席树+Tarjan)
描述 http://www.spoj.com/problems/COT/ 给出一棵n个节点的树,树上每一个节点有权值.m次询问,求书上u,v路径中第k小的权值. COT - Count on a tr ...
- zabbix监控zookeeper
在github找到一个不错的模板,直接导入使用.下载地址: https://github.com/zhujinhe/zookeeper-zabbix-template 监控项监控类型为外部检查 zab ...
- jQuery选择器上下文
- (转载)SQL联合查询中的关键语法
(转载)http://www.cnblogs.com/zhangliyu/archive/2009/03/21/1418215.html 联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用 ...
- 开源cms
提起开源cms,大家第一想到的是php的cms,因为php开源的最早,也最为用户和站长们认可,随着各大cms系统的功能的不断完善和各式各样的开源cms的出现,.net和java的高端的cms系统也逐渐 ...