来源:伯乐在线专栏作者 - 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适配的坑的更多相关文章

  1. 本地如何搭建IPv6环境测试你的APP

    IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...

  2. iOS之在本地搭建IPv6环境测试你的app

    IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...

  3. 本地如何搭建IPv6环境测试你的APP(转)

    IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...

  4. mac本地如何搭建IPv6环境测试你的APP

    转自:http://www.cocoachina.com/ios/20160525/16431.html 投稿文章,作者:请勺子喝杯咖啡(简书) IPv6的简介 IPv4 和 IPv6的区别就是 IP ...

  5. 【指南】本地如何搭建IPv6环境测试你的APP

    由于苹果最近更新IOS10之后他们的工作环境升级了,统一用IPV6网络,所以我们发出去的申请的APP不兼容IPV6的话,会通过不了审核! 所幸的是苹果会自动把你服务器要接的协议自动把iPV6转成IPV ...

  6. 如何让你的App适配iOS7?

    随着苹果在2013年9月18日发布iOS7最新的系统以来,iOS各种设备升级到iOS7的数字就已经不断刷新记录.目前据外界统计iOS7设备装机量已经达到2.5亿部,已占iOS设备的64%.由此可见让自 ...

  7. iOS开发——适配篇&App适配简单概括

    App适配简单概括 1:适配:适应.兼容各种不同的情况 系统适配 针对不同版本的操作系统进行适配 屏幕适配 针对不同大小的屏幕尺寸进行适配 在用户眼中 屏幕是由无数个像素组成的 像素越多,屏幕越清晰 ...

  8. App适配iPhone 6/ Plus和iOS 8:10条小秘诀

    App适配iPhone 6/ Plus和iOS 8:10条小秘诀   iPhone 6iOS 8适配   (原文:raywenderlich 作者:Jack Wu 译者:@TurtleFromMars ...

  9. [坑况]——webpack搭建前端环境踩过的坑啊

    前言 嘿哈,webpack搭建前端环境踩过的坑啊! 第一个:完全不知所措 webpack4 下面用不了HtmlWebpackPlugin 和 ExtractTextPlugin 解决方案: html- ...

随机推荐

  1. 网络安装CentOS 5.3

    转自网络安装CentOS 5.3 0. 基本要求 (1) 需要使用至少两台服务器:其中一台没有操作系统,是我们即将安装的服务器;另外一台是已经安装好操作系统的服务器,我们用来存储CentOS的安装文件 ...

  2. 快速搭建PHP开发环境(PhpStorm+EasyPHP)

    写在开头,何为PHP(拍黄片)? P HP是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用(维基百科). 从上我们得出,何为PHP? 1.开源脚本语言. 2.用于网络开发可嵌入 ...

  3. WEB 开发异常:java.lang.ClassNotFoundException

    某个类明明是有的,可是eclipse 启动tomcat服务器运行web项目,出现如题异常. java.lang.ClassNotFoundException 信息: Set web app root ...

  4. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除BEAN自动装配的歧义@QUALIFIER及自定义注解

    一. The @Qualifier annotation is the main way to work with qualifiers. It can beapplied alongside @Au ...

  5. ANDROID_MARS学习笔记_S05_005_方向传感器

    import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import ...

  6. WIN32和Kernel)直接读写硬盘扇区

    第一篇写技术的文章哦,以前好少写文章,我的文字表达很差劲,大家不要笑哦.前几天仙剑4通关了,感觉好惆怅,什么都不想去做.今天看了一下书发现一篇比较好玩的文章,于是自己静静地实践一番.文章是<基于 ...

  7. iOS -view横向变成竖向

    -------

  8. perl unload gbk oracle 数据库

    perl unload gbk Oracle 数据库 use Encode; if ( $#ARGV < 0 ){ print "请输入一个文件\n"; exit(-1); ...

  9. How to: Use a Custom User Name and Password Validator

    在wcf中使用自定义的用户名和密码验证方式 https://msdn.microsoft.com/en-us/library/aa702565.aspx http://www.codeproject. ...

  10. java基于xml配置的通用excel单表数据导入组件(五、Action处理类)

    package xxxxxx.manage.importexcel; import java.io.File; import java.util.HashMap; import java.util.M ...