zoukankan      html  css  js  c++  java
  • IPv6-only 的兼容性解决方案

    前几天Apple宣布 6月1日后所有应用必须支持IPv6-only网络 今天抽空看了下这方面的知识

    首先解释下IPv6的是什么?

    维基百科的定义如下:
    IPv6是Internet Protocol version 6的缩写 全名为互联网通讯协议第6版 是互联网协议的最新版本,用于分组交换互联网络的网络层协议,旨在解决IPv4地址枯竭问题
    IPv6具有比IPv4大得多的编码地址空间。这是因为IPv6采用了128位的地址,而IPv4使用的是32位。因此新增的地址空间支持2128(约3.4 ×1038)个地址

    优点如下:

    1. IPv6具有更大的地址空间
    2. IPv6使用更小的路由表 (更快的路由)
    3. IPv6具有更高的安全性

    APP中如何使用IPv6

    1. 使用更高层次的网络API(Use High-Level Networking Frameworks) 避免使用socket API

    蓝色部分API 默认都支持IPv6


    API

    也就是说
    .WebKit
    .(NSURLSession NSURLRequest NSURLConnection)
    .CFNetwork
    这些API默认都已经支持IPv6
    而值得庆幸的时 我们使用的大多数第三方网络库使用的也是这些API
    比如AFNetWorking 我特意找了一段代码


    AFNetWoring DEMO

    下图是Alamofire创建请求的代码


    Alamofire DEMO

    Alamofire使用的是High-Level Networking Frameworks(NSURLRequest) 也不存在兼容性问题
    这意味着大多数情况下 我们不需要做什么 就可以兼容IPv6

    如果你不能避免使用socket API 请参考这个指南
    RFC4038: Application Aspects of IPv6 Transition
    或者参考谷歌的开源库CocoaAsyncSocket

    2. 不要使用IP地址
    比如使用SCNetworkReachabilityCreateWithName API 时

      func SCNetworkReachabilityCreateWithName(_ allocator:     CFAllocator?, _ nodename: UnsafePointer<Int8>) -> SCNetworkReachability?

    使用主机名或者主机域名访问

    3.检查IPv4代码
    项目中不能使用如下代码:

    inet_addr()
    inet_aton()
    inet_lnaof()
    inet_makeaddr()
    inet_netof()
    inet_network()
    inet_ntoa()
    inet_ntoa_r()
    bindresvport()
    getipv4sourcefilter()
    setipv4sourcefilter()

    IPv4->IPv6类型对照表
     
    ------------------------------------------------------------------------------------

    APP在美国的IPv6-Only网络环境下测试不通过。

      趟着中枪的还有阿里云,偌大的阿里居然表示不支持IPv6,不支持也就算了,为啥阿里也还要删除相关IPv6的贴子,见到老马,我得好好跟他聊聊。

       而且苹果美国测试中心表示通过NAT64/DNS64技术也无法访问中国的阿里云主机,这是几个意思?

       言归正传,作为此次国内大规模APP被拒的原因,小编从技术角度来帮小伙伴们分析下,文末再免费为小伙伴们提供解决方法。

    原因一:现有IPv4环境,国内、国外不一定互通,小编不敢往下说了,直接看数据好了。

    IPv4/IPv6扫盲:不同的网络协议,中国99%都在用IPv4协议,IPv6是下一代互联网协议,最直接的区别就是地址格式上

    国内主机ping国内网站的结果,时间最短,说明网络质量越好C:>ping api.6box.cn -n 2

    正在 Ping api.6box.cn [120.27.116.59] 具有 32 字节的数据:

    来自 120.27.116.59 的回复: 字节=32 时间=13ms TTL=52

    来自 120.27.116.59 的回复: 字节=32 时间=13ms TTL=52

    120.27.116.59 的 Ping 统计信息:

    数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),

    往返行程的估计时间(以毫秒为单位):最短 = 13ms,最长 = 13ms,平均 = 13ms

    美国AWS主机ping国内阿里云ECS,时间在300ms以上,丢包14%,当时我们的APP提交审核时,苹果同样表示IPv4网络连接不上。

    ubuntu@ip-172-31-21-126:~$ ping 120.27.116.59

    PING 120.27.116.59 (120.27.116.59) 56(84) bytes of data.

    64 bytes from 120.27.116.59: icmp_seq=1 ttl=43 time=306 ms

    64 bytes from 120.27.116.59: icmp_seq=2 ttl=43 time=307 ms

    --- 120.27.116.59 ping statistics

    ---7 packets transmitted, 6 received,

    14% packet loss, time 6007msrtt min/avg/max/mdev = 300.849/304.761/307.151/2.532 ms

      

    美国AWS主机ping国内114的公共DNS,等了N久,表示网络不通

    ubuntu@ip-172-31-21-126:~$ ping 114.114.114.114

    PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.

    审核不通过的大部分原因并非在代码层面,而是网络层面

    审核不通过的大部分原因并非在代码层面,而是网络层面

    审核不通过的大部分原因并非在代码层面,而是网络层面

    原因二:NAT64本地测试和美国中心的IPv6 Only + NAT64/DNS64网络环境并不一样

     NAT64扫盲:解决IPv4服务器不能被IPv6用户访问,看下图所示,目前中国99%的网站均不支持IPv6,但可以通过NAT64技术实现网络的转换,网站(APP)后台服务器不需要做配置,但网站域名所在的托管商,如万网,新网,易名中国等需要添加IPv6条目。

    前方有坑,请注意

    坑一、NAT64设备所在网络环境,决定你的网站能否无障碍被访问,苹果APP审核用的NAT64在美国,至于能顺利访问中国哪些网站服务器,就需要拼RP值了,相信很多小伙伴们已经明白了为啥本地NAT64模拟测试通过,在美国测试就不通过了吧。

    坑二、没有真实IPv6测试环境,阿里云居然说中国没有IPv6运营商,无法支持IPv6,两端都有坑,再拒我一次,朕就准备投靠安卓了,伤不起啊。

     小伙伴们,有困难不要怕,小编来拯救你们了!

     法宝一、网站服务器咱不动,小编在中国免费帮各位小伙伴们进行NAT64转换,我们的NAT64设备在中国,当然所有网站都能通了,美国测试中心到我们是走的IPv6。

       谁说中国没有IPv6,中国最大的IPv6就是中国教育网,拥有世界上最大的下一代互联网(CERNET2-CNGI)

         1、使用小编提供的DNS64服务,解析出自己网站对应的IPv6域名

    Windows: Win+R打开运行,输入cmd,打开命令提示符,输入以下命令

    Nslookup www.6box.cn dns64.6box.cn   

    命令中www.6box.cn改成你的网站名称,如果APP里调用了多个子域名,都需要进行转换,如a.6box.cn ,b.6box.cn

    将解析出来的IPv6地址记录添加到DNS域名托管商管理系统里,此操作通常在万网等域名网站里操作,不是在网站服务器上操作,建议直接联系网站技术负责人进行解析。此IPv6转换服务是免费给小伙伴们使用的,小伙伴们可以放心添加。

    C:>nslookup www.6box.cn dns64.6box.cn

    服务器:  UnKnown

    Address:  222.28.155.25

    非权威应答:

    名称:    www.6box.cn

    Addresses:  2001:da8:20d:400::76ba:3ffd  

              118.186.63.253

        2、给自己的网站添加IPv6 DNS记录,这样全球IPv6用户就能正确解析出你的IPv6地址啦

    以万网操作为例,进入”我的域名“---”域名解析”----”添加解析”

    记录类型AAAA  主机记录 www  记录值2001:da8:20d:400::76ba:3ffd  

    如果是api.6box.cn,则主机记录是api,其它类似

    新网怎么添加IPv6条目?

    新网不支持IPv6域名直接添加,给他们发邮件吧。

    上面都操作完了,效果怎么样?

    我们来测试一样:同样从美国AWS主机测试,这次采用IPv6线路进行测试,157ms,0丢包。比国内某些IPv4的网络还要快,有木有!!!

    ubuntu@ip-172-31-21-126:~$ ping6 2001:da8:20d:400::76ba:3ffd

    PING 2001:da8:20d:400::76ba:3ffd(2001:da8:20d:400::76ba:3ffd) 56 data bytes

    64 bytes from 2001:da8:20d:400::76ba:3ffd: icmp_seq=1 ttl=46 time=157 ms

    64 bytes from 2001:da8:20d:400::76ba:3ffd: icmp_seq=2 ttl=46 time=157 ms

    --- 2001:da8:20d:400::76ba:3ffd ping statistics ---

    5 packets transmitted, 5 received, 0% packet loss, time 4001ms

    rtt min/avg/max/mdev = 157.313/157.411/157.539/0.446 ms

    我们通过浏览器来测试下,发现网站已经通过IPv6访问了

    本地没有IPv6环境怎么办?

    法宝二、免费申请6Box IPv6路由器,本地有IPv6真实环境了,测试更easy,苹果要敢再拒,我们就带上6Box去炸美国。

     苹果送审了,自己还没有IPv6测试环境,怎么办,快来免费申请吧,小编也不是24小时都在线的,以后的测试还是需要小伙伴们自己来啊

    6Box SOHO版专为苹果开发企业提供真实IPv6环境,即插即用,操作简单,无须变更现有网络架构,快速搭建IPv6网络环境,提供高速IPv6国际出口带宽。

    主要功能如下:

    用户连接数:30-40人/台

    分配真实IPv6地址段 /64前缀

    提供10Mbps企业级高速IPv6接入带宽

    提供高速IPv6国际出口带宽(美国方向)

    如果想快速体验IPv6,可以下载6Box APP

  • 相关阅读:
    Win10 x64 + CUDA 10.0 + cuDNN v7.5 + TensorFlow GPU 1.13 安装指南
    工作十一年总结
    Anaconda3 指南
    Win Linux 双系统安装指南
    OBS 录制视频 自己留存
    React Starter Kit 中文文档
    .NET Framework 系统版本支持表
    Hyper-V和其他虚拟机共存 【转】
    Docker入门03——Container
    Docker入门02——Dockerfile详解
  • 原文地址:https://www.cnblogs.com/isItOk/p/5566175.html
Copyright © 2011-2022 走看看