纯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等高端技能,以后说不定哪天能派上更有价值的用场。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Visual Studio 创建新的Web Part项目

使用Visual Studio 创建新的Web Part项目 Web Part是你将为SharePoint创建的最常见的对象之一。它是平台构建的核心基块。1. 管理员身份打开Visual Studio,新建空白SharePoint项目。命名WroxSPProject,点击确定。部署为场解决方案,点击完成。…

聊一聊Yarp结合Nacos完成服务发现

背景 Yarp 这个反向代理出来后,相信还是有不少人在关注的。在 Yarp 中,反向代理的配置默认也是基于配置文件的,也有不少大佬已经把这个配置做成了数据库配置可视化界面。仔细想了想,做成数据库配置,好像只是便于配置的…

相亲对象能有多油腻......

1 冰起来再烧(素材来源网络,侵删)▼2 还没从年假清醒的我(素材来源网络,侵删)▼3 孙悟空为啥没被人收去当坐骑(素材来源网络,侵删)▼4 成年人的潜台词(素材…

C++之char*,const char*和string的相互转换

1. string转const char*string s "abc";const char* c_s s.c_str(); 2. const char*转string直接赋值即可const char* c_s "abc";string s(c_s); 3. string转char*string s "abc";char* c;const int len s.length();c new char[len1];strc…

教你如何迅速秒杀掉:99%的海量数据处理面试题

教你如何迅速秒杀掉:99%的海量数据处理面试题 作者:July 出处:结构之法算法之道blog 前言 一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲…

poj 1986 Distance Queries

LCA 题意:LCA模板题,输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面的那个字母无视掉,没用的。接着k,下面k个询问lca,输出即可 有人说要考虑不连通的情况&a…

【.NET 遇上 GraphQL】 ChilliCream 平台介绍

ChilliCreamhttps://chillicream.com/https://github.com/ChilliCream/hotchocolateChilliCream 平台包含了四个产品, Hot Chocolate, Banana Cake Pop, Strawberry Shake, 平台提供开发人员工具和服务以加快整个开发过程。Hot ChocolateHot Chocolate 是 .NET 平台下的一个开源…

.NET 的 WebSocket 开发包比较

编者按 本文出现在第三方产品评论部分中。在这一部分的文章只提供给会员,不允许工具供应商用来以任何方式和形式来促销或宣传产品。请会员报告任何垃圾信息或广告。 Web项目常常需要将数据尽可能快地推送给客户,必要时无需等待客户端请求。对于与用户之间…

《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX 《CMake实践》笔记三:构建静态库与动态库 及 如何使用外部共享库和头文件 四、更好一点的Hello World 没有最好,只有更好…

14年前,林国强院士发现自己学生论文无法重复后,是这样处理的

全世界只有3.14 % 的人关注了爆炸吧知识本文转自:iNature让我们把时间拨回至 2007 年 3 月,当年,一封以林国强院士的名义发表的公开信,在网络上流传。信中披露,林院士发现自己的一名博士生发表在权威期刊《美国化学会志…

C++ char[] 与 string 转换

处理档案资料,最常使用 char[] 或 string 来储存字串,前者是 字元阵列 ,为C所拥有,当然C也可以使用;而后者是C独有的 字串类别 ,可以产生字串物件。在使用C处理字串时,时常会char[]和string互转…

支持向量机通俗导论(理解SVM的三层境界)

支持向量机通俗导论(理解SVM的三层境界) 作者: July ; 致谢: pluskid、 白石、J erryLead。出处:结构之法算法之道 blog 。 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的&#…

WPF 实现加速小火箭~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。01—代码如下一、创建 SpeedRocketsExample.xaml 代码如下。<Window x:Class"WPFDevelopers…

第二十四天 多维数组

经过前面对一维数组和二维数组的学习&#xff0c;我们充分的掌握了数组的定义和使用&#xff0c;接下来我们该学习的是&#xff1a;多维数组。比较简单的方法&#xff0c;想要提高数组的维数只要在声明的时候在索引多加一个中括号即可。比如&#xff1a;我们要声明三维数组那么…

最懂男人心的内裤,戳100个洞透气,超舒服

▲ 点击查看有什么日用品&#xff0c;需要盆友们时不时就经常补货买买买的&#xff1f;除了家里的酱油、纸巾、沐浴露&#xff0c;还有一样hin重要&#xff0c;那就是内裤&#xff01;除了洗澡的空挡&#xff0c;内裤就一直穿在身上&#xff0c;可以说内裤是比女友还亲、比手机…

搬家到此,嘿嘿

希望能够把遇到的技术问题给记录起来&#xff0c;给我加油吧&#xff01; 之前一直在网易博客上记录&#xff0c;刚搬到此地&#xff0c;尽快习惯下来啦转载于:https://www.cnblogs.com/lwjlss/p/5682533.html

C++ throw:抛出自己的异常

throw 是C中的关键字&#xff0c;用来抛出异常。如果不使用 throw 关键字&#xff0c;try 就什么也捕获不到&#xff1b;上节提到的 at() 函数在内部也使用了 throw 关键字来抛出异常。throw 既可以用在标准库中&#xff0c;也可以用在自定义的函数中&#xff0c;抛出我们期望的…

git - svn 平滑到 git

1. 建立自己的git仓库&#xff0c;需要是空git仓库 2. checkout 你的 git仓库 3. svn忽略.git文件&#xff0c;忽略.git .gitignore 4. 把 .git文件拷到你的 svn仓库 5. git 上传文件 ————可以用&#xff0c;但是不符合我的情况———— 1. 所有需要用到的&#xff1a;git…

Logback也爆漏洞了,总结下最近log相关的几个漏洞

大家好&#xff0c;我是君哥&#xff0c;周末又要结束了。前些天 Apache Log4j2 接连报了几个重大漏洞&#xff0c;好在我们的系统使用的 logback&#xff0c;可当我们正庆幸的时候&#xff0c;logback 也爆出漏洞了。今天我们一起来看一下这几个漏洞。CVE-2021-42550先看一下官…

vim配置php语法高亮

安装vim之后&#xff0c;将php语法高亮插件 php.vim&#xff0c;放到/usr/share/vim/vimfiles/syntax 目录下 php语法高亮插件在这里下载&#xff1a;http://www.vim.org/scripts/script.php?script_id1571 然后配置vim配置文件 vimrc 在这里 /etc/vimrc ,增加一行 “s…