来源:伯乐在线专栏作者 - 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. IEEE二进制浮点数算术标准(IEEE 754)

    整理自IEEE 754 IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用.这个标准定义了表示浮点数的格式(包括负零-0) ...

  2. Eclipse下设置github开发环境

    1.按照github上的指南配置(http://help.github.com/win-set-up-git/)基础的git环境. 2.在github上创建一个Repository. 3.在Eclip ...

  3. FFmpeg发送流媒体的命令(UDP,RTP,RTMP)

    http://blog.csdn.net/leixiaohua1020/article/details/38283297

  4. swift 学习资源

    http://blog.csdn.net/sqc3375177/article/details/29206779

  5. 微信JSSDK录音的一些bug

    UPDATE: 这篇博文已经过期, 新的BUG总结请看微信JSSDK与录音相关的坑 微信JSSDK有不少坑, 最近做一个webapp, 用到了其中的录音功能, 发现不少问题, 总结一下: 当你调用st ...

  6. 处理 insert 字段内容包含 单引号 的问题

    问题:postgreSQL insert 字段包含单引号,如:insert into table values('1001','tom'cat'),执行报错: 解决:将单引号替换为两个单引号,如 de ...

  7. 利用if else来运行咱们结婚吧

    static void Main(string[] args)        {            while (true)            {                string ...

  8. 【数据结构】之二叉树的java实现

    转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...

  9. java JdbcTemplate源码

    package com.wl.filter; package org.javaresearch.jerch; import java.lang.reflect.Method; import java. ...

  10. Bzoj 3505: [Cqoi2014]数三角形 数论

    3505: [Cqoi2014]数三角形 Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits   Description