全文都圍繞客戶端和服務端之間IPv4與IPv6互轉。php
1、問題引出html
We discovered one or more bugs in your app when reviewed on iPad running iOS 10.3.2 on Wi-Fi connected to an IPv6 network.ios
Specifically, tapping some buttons produced an error message.服務器
Please see attached screenshots for details.網絡
Next Stepsapp
To resolve this issue, please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify any issues, then revise and resubmit your app for review.ide
If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.測試
For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue.ui
App Store Review Guidelinesthis
2.5.5 We will be reviewing on an IPv6 network, so if your app isn’t compatible with the IPv6 addressing, it may fail during review.
問題分析:我司APP沒有IPv6環境服務器,且未支持NAT64+DNS64服務。致使IPv6網絡下客戶端找不到IPv6服務器,且沒法轉換鏈接到IPv4服務器。
一、解決方案:經過DNS64 +NAT64進行訪問。
1)將域名解析出全球可達的IPv6地址。打開連接http://www.subnetonline.com/pages/converters/ipv4-to-ipv6.php,輸入IPv4值如100.100.100.100,計算出來的IPv6值爲6464:6464,帶上固定前綴2001:67c:2b0:db32::1,組合爲完整的IPv6值爲2001:67c:2b0:db32::1:6464:6464。
2)在域名管理中添加一條4A記錄。AAAA記錄(AAAA record)是用來將域名解析到IPv6地址的DNS記錄。
二、方案檢測:打開連接http://ipv6-test.com/validate.php,輸入域名,結果以下圖,則表明操做成功。
2、IPv六、DNS6四、NAT64
一、IPv6
1)IPv6是互聯網協議版本6(Internet Protocol Version 6),IPv6用於替代IPv4,號稱能夠爲全世界的每一粒沙子編上一個網址。
2)表示方法
IPv4包含4段十進制,IPv6包含8段十六進制,是IPv4地址長度的4倍。因而IPv4點分十進制格式再也不適用,IPv6有3種表示方法:
冒分十六進制表示法
格式爲X:X:X:X:X:X:X:X,其中每一個X表示地址中的16b,以十六進制表示,每一個X的前導0是能夠省略的,例如:
2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A
0位壓縮表示法
若是IPv6地址中包含很長的一段0,能夠把連續的一段0壓縮爲「::」。同時爲保證地址解析的惟一性,地址中」::」只能出現一次,例如:
FF01:0:0:0:0:0:0:1101 → FF01::1101
0:0:0:0:0:0:0:1 → ::1
0:0:0:0:0:0:0:0 → ::
內嵌IPv4地址表示法
爲了實現IPv4-IPv6互通,IPv4地址會嵌入IPv6地址中,此時地址常表示爲:X:X:X:X:X:X:d.d.d.d,前96b採用冒分十六進制表示,而最後32b地址則使用IPv4的點分十進制表示,例如::192.168.0.1與::FFFF:192.168.0.1就是兩個典型的例子,注意在前96b中,壓縮0位的方法依舊適用 。
二、NAT64
NAT64是一種有狀態的網絡地址與協議轉換技術,通常只支持經過IPv6網絡側用戶發起鏈接訪問IPv4側網絡資源。但NAT64也支持經過手工配置靜態映射關係,實現IPv4網絡主動發起鏈接訪問IPv6網絡。NAT64可實現TCP、UDP、ICMP協議下的IPv6與IPv4網絡地址和協議轉換。
三、DNS64
DNS64則主要是配合NAT64工做,主要是將DNS查詢信息中的A記錄(IPv4地址)合成到AAAA記錄(IPv6地址)中,返回合成的AAAA記錄用戶給IPv6側用戶。
3、爲何用IPv6?
一、IPv4地址有限正在耗盡。
二、IPv6比IPv4更有效。避免使用NAT轉換網絡地址,經過簡化頭部結構提供網絡快速通道,阻止網絡分裂,避免解析鄰居地址。
三、4G支持IPv6網絡。
四、多媒體服務(短信、語音)支持IPv6網絡。
五、服務提供商承擔額外的業務和管理成本,繼續支持傳統的IPv4網絡,而行業繼續遷移到IPv6。
4、DNS64/NAT64轉換流
一、蜂窩網絡單獨提供IPv4和IPv6鏈接。
二、DNS64/NAT64轉換工做流
理想的是,提供商放棄支持IPv4網絡,然而這樣阻止部分網絡訪問IPv4服務器。爲了解決這個問題,主流網絡提供商實現DNS64/NAT64轉換工做流。如下就是隻支持IPv6網絡經過轉換繼續支持IPv4內容。
部署的IPv6蜂窩網絡包括DNS64和NAT64
三、DNS64 server負責域名解析到IPv6
DNS64/NAT64這種部署類型下。客戶端請求IPv6地址流程是:
1)DNS64服務器向DNS server發送請求IPv6地址,若是IPv6存在,當即回傳到DNS64而後回傳給客戶端。
2)若是DNS server不存在IPv6,DNS64服務器向DNS server請求替代的IPv4地址。而後DNS64服務器用IPv6地址前綴聯合IPv4地址,回傳給客戶端。
所以,客戶端最終都能接收到到IPv6的地址。
四、NAT64負責IPv6和IPv4互轉
當客戶端訪問某域名內容,經過DNS64 server解析成IPv6地址/IPv6合成地址。若是是IPv6地址,直接訪問IPv6環境服務器。若是是IPv6合成地址,走NAT64網關,換算成IPv4地址,訪問IPv4環境服務器。
5、確保IPv6 DNS64/NAT64可用
一、不建議使用底層的網絡API。下圖展現的藍色部分的這些API都是不存在兼容性問題的,而咱們平時本身用的包括那些第三方的網絡庫大部分都是用的這些API。
二、不要用IP地址。網絡類中一些方法傳入值不要傳IP地址,而應該用域名。
三、檢查不兼容IPv6的代碼
工程中不能包括下面這些API,這些都是隻針對IPv4作處理的。
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
若是用到了下面左邊的這些IPv4的類型,那麼它們相應的IPv6類型也須要作處理
6、IPv6網絡APP測試
官網提供了經過mac共享,建立NAT64網絡來搭建IPv6網絡(操做教程戳iOS-不用網線搭建IPv6網絡測試環境)。
我的不建議這樣測,我司這樣測能正常訪問,但審覈仍是被拒。
實踐代表經過第一點的方案檢測,蘋果官方能審覈經過。
本文參考自蘋果官方文檔: