原文地址:http://www.skyfox.org/ios-app-support-ipv6-dns64-nat64.html
IPV4地址枯竭迫在眉睫,越來越多的企業(yè)和移動電話運營商都在部署IPv6 DNS64和NAT64網(wǎng)絡。一個DNS64 / NAT64 IPv6-only 網(wǎng)絡是繼續(xù)提供轉(zhuǎn)化訪問IPv4的內(nèi)容妓湘。根據(jù)您的應用程序的性質(zhì)急黎,過渡有不同的含義:
如果您正在編寫一個客戶端應用程序使用高級網(wǎng)絡api,如NSURLSession和CFNetwork框架,并且使用域名鏈接,你不需要改變?nèi)魏螙|西為您的應用程序使用IPv6地址柬唯。如果你的鏈接未使用域名,你現(xiàn)在應該使用它了疮丛。查看Avoid Resolving DNS Names Before Connecting to a Host學習怎么做,有關(guān). CFNetwork的更多信息, 查看CFNetwork Framework Reference.
如果你在寫一個服務器端應用程序或其他低級的網(wǎng)絡應用程序,你需要確保你的套接字代碼與IPv4和IPv6地址正常工作铸抑。Refer toRFC4038: Application Aspects of IPv6 Transition.
一.是什么驅(qū)使我們采用 IPv6
主要的網(wǎng)絡服務提供者,包括美國主要移動運營商正在積極推廣和部署IPv6灰追。這是由于各種各樣的因素递览。
IPv4 地址耗盡
幾十年來,世界已經(jīng)知道IPv4地址最終將枯竭。無類域間路由等技術(shù)(CIDR)和網(wǎng)絡地址轉(zhuǎn)換(NAT)幫助拖延不可避免的疯溺。然而,1月31日,2011年,頂級的互聯(lián)網(wǎng)地址分配機構(gòu)(IANA)IPv4地址正式精疲力竭论颅。美國互聯(lián)網(wǎng)號碼注冊機構(gòu)(ARIN)預計將在2015年夏天用完IPv4地址----這有一個一個倒計時。
IPv6比IPv4更加高效
除了解決IPv4的耗盡問題,IPv6比IPv4更高效囱嫩。例如,IPv6:
避免了網(wǎng)絡地址轉(zhuǎn)換的需要(NAT)
通過使用簡化的頭提供了更快的路由通過網(wǎng)絡
防止網(wǎng)絡碎片
避免廣播鄰居地址解析
4G 部署
第四代移動通信技術(shù)(4G)是基于分組僅進行切換恃疯。由于IPv4地址的供應量有限,對IPv6的支持是必需的墨闲,為了4G部署的可擴展性今妄。
多媒體服務的兼容性
IP多媒體核心網(wǎng)絡子系統(tǒng)(IMS)允許一些服務,如多媒體短信消息和語音/ LTE(VoLTE) 通過 IP傳送。一些服務提供商使用的IMS兼容IPv6 only鸳碧。
成本
繼續(xù)支持遺留的IPv4網(wǎng)絡,服務提供者引發(fā)了額外的操作和管理成本,而行業(yè)正在繼續(xù)遷移到IPv6盾鳞。
DNS64 / NAT64過渡工作流
為了幫助延緩IPv4地址的枯竭,NAT在很多IPv4網(wǎng)絡中實現(xiàn)瞻离。雖然這種解決方案暫時的有效腾仅,它證明了昂貴和脆弱。如今套利,隨著越來越多的客戶使用IPv6推励,供應商必須現(xiàn)在同時支持IPv4和IPv6。這是一個高昂代價肉迫。
一個蜂窩網(wǎng)絡,提供單獨的IPv4和IPv6連接
理想情況下,提供者想放棄支持IPv4網(wǎng)絡验辞。然而,這樣做防止了客戶訪問IPv4服務器,它代表的是互聯(lián)網(wǎng)的重要部分。為了解決這個問題,大多數(shù)網(wǎng)絡提供商實現(xiàn)DNS64 / NAT64過渡工作流喊衫。通過過渡轉(zhuǎn)換,能使 IPv6-only 網(wǎng)絡繼續(xù)提供訪問IPv4內(nèi)容跌造。
蜂窩網(wǎng)絡部署IPv6網(wǎng)絡DNS64和NAT64
在這種類型的工作流中,客戶端發(fā)送DNS查詢一個DNS64服務器,從DNS服務器請求IPv6地址。當發(fā)現(xiàn)IPv6地址,它立即傳回客戶機族购。然而,當一個IPv6地址找不到的時候,DNS64服務器請求一個IPv4地址代替壳贪。然后DNS64服務器通過IPv4地址的前綴生成一個IPv6地址,并將傳回客戶端财著。在這方面,客戶總是收到一個IPv6-ready地址。見圖3撑碴。
圖3 DNS64 IPv4與IPv6翻譯過程
當客戶端發(fā)送一個請求到服務器,任何IPv6合成地址發(fā)送的數(shù)據(jù)包通過NAT64網(wǎng)關(guān)自動路由的網(wǎng)絡。網(wǎng)關(guān)執(zhí)行IPv6-to-IPv4地址和協(xié)議轉(zhuǎn)換的請求朝墩。它還執(zhí)行IPv4-to-IPv6來自服務器的響應的轉(zhuǎn)換醉拓。參見圖4。
圖4 DNS64 / NAT64過渡解決方案的工作流程
IPv6和Appstore的審核要求
一個應用程序提交上架到Appstore 兼容IPv6 DNS64 / NAT64網(wǎng)絡將是必需的,至關(guān)重要的是,應用程序應該保證兼容性收苏。好消息是,大多數(shù)應用程序已經(jīng)兼容IPv6亿卤。對于這些應用,定期回歸測試你的應用也是必要的。應用程序不兼容ipv6 DNS64 / NAT64網(wǎng)絡上操作時可能會遇到問題鹿霸。幸運的是,解決這些問題通常是相當簡單的,在本章中討論排吴。
6月1日以后所有iOS應用必須支持IPv6-only網(wǎng)絡
支持IPv6的常見障礙
有些情況下會阻礙一個應用程序支持IPv6。接下來的小節(jié)描述如何解決這些問題懦鼠。
嵌入在協(xié)議的IP地址钻哩。許多通信協(xié)議,如會話初始化協(xié)議(SIP),文件傳輸協(xié)議(FTP)的WebSockets,和點對點協(xié)議(P2PP),包括IP地址文字協(xié)議消息。例如,FTP命令參數(shù)數(shù)據(jù)端口DATA PORT和被動PASSIVE的交換信息,包括IP地址文字肛冶。同樣,IP地址文字可能出現(xiàn)在SIP header字段的值,例如,To,From,Contact,Record-Route, andVia街氢。看Use High-Level Networking Frameworks和Don’t Use IP Address Literals.
嵌入到配置文件的IP地址睦袖。配置文件經(jīng)常包含IP地址珊肃。Don’t Use IP Address Literals.。
網(wǎng)絡連通性預檢馅笙。許多應用程序試圖通過使用IP地址和相應API,主動檢查網(wǎng)絡連接或一個活躍的WI-FI連接,伦乔。查看Connect Without Preflight.
使用低級網(wǎng)絡API。一些應用程序直接與套接字和其他原始網(wǎng)絡api進行交互,如gethostbyname,gethostbyname2, 與inet_aton董习。這些API很容易濫用或者他們只支持IPv4,例如:解析主機名AF_INET地址族, 而不是AF_UNSPEC地址族烈和。查看Use High-Level Networking Frameworks.
使用小地址族的儲存容器。一些應用程序和網(wǎng)絡庫使用地址存儲容器uint32_t,in_addr, 與sockaddr_in32位或者更小皿淋。查看Use Appropriately Sized Storage Containers.
確保IPv6的DNS64/NAT64兼容性
堅持以下原則斥杜,以確保您的應用程序的IPv6 DNS64/ NAT64的兼容性。
使用高級網(wǎng)絡框架
需要聯(lián)網(wǎng)的應用程序可以在高級別聯(lián)網(wǎng)框架或低級別的POSIX socket API來構(gòu)建沥匈。在大多數(shù)情況下蔗喂,高級別框架是足夠的。他們有能力高帖,易于使用缰儿,并且不容易比低級別的API遇到常見的陷阱。
網(wǎng)絡框架和API層
WebKit散址。這個框架提供了一組類乖阵,用于顯示在窗口的網(wǎng)頁內(nèi)容宣赔,并實現(xiàn)了瀏覽器的功能,如以下鏈接瞪浸,管理后臺轉(zhuǎn)發(fā)列表和管理的頁面的歷史記錄最近訪問過的儒将。 WebKit的簡化加載網(wǎng)頁,也就是說对蒲,異步請求從HTTP服務器的網(wǎng)頁內(nèi)容钩蚊,其中反應可能逐步到來,以隨機順序蹈矮,或部分由于網(wǎng)絡錯誤的復雜過程砰逻。欲了解更多信息,請參閱WebKit Framework Reference.泛鸟。
Cocoa URL loading system蝠咆。這個系統(tǒng)是在沒有提供明確的IP地址發(fā)送和接收網(wǎng)絡上的數(shù)據(jù)的最簡單的方法。數(shù)據(jù)的發(fā)送和使用幾類之一北滥,如NSURLSession刚操,NSURLRequest和NSURLConnection,與NSURL對象一起工作再芋。 NSURL對象可以讓你的應用程序處理URL和它們引用的資源赡茸。方法和傳遞一個URL說明:通過調(diào)用initWithString創(chuàng)建NSURL對象。調(diào)用checkResourceIsReachableAndReturnError:在NSURL類的方法來檢查主機是否可達祝闻。欲了解更多信息占卧,請參閱URL Session Programming Guide.
CFNetwork。這個核心服務框架提供抽象的網(wǎng)絡協(xié)議联喘,這使得它易于進行各種網(wǎng)絡任務华蜒,如與BSD sockets工作,解析DNS主機豁遭,并與HTTP / HTTPS工作叭喜。要定位沒有明確的IP地址的主機,調(diào)用CFHostCreateWithName方法蓖谢。要打開對TCP sockets的主機捂蕴,調(diào)用CFStreamCreatePairWithSocketToCFHost方法。欲了解更多信息闪幽,請參見CFNetwork ConceptsinCFNetwork Programming Guide.
如果您確實需要低級別的Socket API的應用啥辨,遵循RFC4038指南RFC4038: Application Aspects of IPv6 Transition.
不要使用IP地址
確保你不是通過IPv4地址 點符號的文字API ,如getaddrinfo和SCNetworkReachabilityCreateWithName等。相反,使用高級網(wǎng)絡框架和address-agnostic版本的api,比如getaddrinfogetnameinfo,通過主機名或完全限定域名(fqdn)盯腌。查閱getaddrinfo(3) Mac OS X Developer Tools Manual Page和getnameinfo(3) Mac OS X Developer Tools Manual Page.
注意:在iOS9和OS X10.11及更高版本溉知,NSURLSession和CFNetwork會在本地自動合成IPv6 從IPv4文本在本地DNS64/ NAT64網(wǎng)絡設備上。不過,你還是應該努力擺脫使用IP地址的代碼级乍。
連接而無需預檢
可達性的API(見SCNetworkReachability Reference)明確連接問題后舌劳,用于診斷目的。許多應用程序不正確地使用這些API主動檢查通過調(diào)用SCNetworkReachabilityCreateWithAddress方法玫荣,并傳遞給它的0.0.0.0IPv4地址甚淡,這表明網(wǎng)絡上有一個路由器。然而捅厂,路由器的存在并不能保證一個因特網(wǎng)連接是否存在贯卦。一般情況下,避免預檢網(wǎng)絡可達性恒傻。只嘗試做一個連接,并從容地處理失敗建邓。如果你必須檢查網(wǎng)絡的可用性盈厘,避免調(diào)用SCNetwoSCNetworkReachabilityCreateWithAddress方法。調(diào)用SCNetworkReachabilityCreateWithName方法官边,并傳遞給它一個主機名代替沸手。
有些應用程序還通過SCNetworkReachabilityCreateWithAddress方法 一個IPv4169.254.0.0,自分配的鏈路本地地址的注簿,以檢查活躍的Wi-Fi連接契吉。要檢查Wi-Fi或蜂窩連接,查找網(wǎng)絡可達性標志使用kSCNetworkReachabilityFlagsIsWWAN代替诡渴。
使用適當大小的存儲容器
使用地址存儲容器,如sockaddr_storage,存儲IPv6足夠大捐晶。
檢查源代碼IPv6 DNS64 / NAT64不兼容
檢查并消除IPv4-specific api,如:
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
如果您的代碼有以下IPv4類型,確保使用IPv6的等價方法去處理。
IPv4IPv6
AF_INETAF_INET6
PF_INETPF_INET6
struct in_addrstruct in_addr6
struct sockaddr_instruct sockaddr_in6
kDNSServiceProtocol_IPv4kDNSServiceProtocol_IPv
使用系統(tǒng)API來合成IPv6地址
使用getaddrinfo解決一個IPv4地址
#include
#include
#include
#include
uint8_tipv4[4]={192,0,2,1};
structaddrinfohints,*res,*res0;
interror,s;
constchar*cause=NULL;
charipv4_str_buf[INET_ADDRSTRLEN]={0};
constchar*ipv4_str=inet_ntop(AF_INET,&ipv4,ipv4_str_buf,sizeof(ipv4_str_buf));
memset(&hints,0,sizeof(hints));
hints.ai_family=PF_UNSPEC;
hints.ai_socktype=SOCK_STREAM;
hints.ai_flags=AI_DEFAULT;
error=getaddrinfo(ipv4_str,"http",&hints,&res0);
if(error){
errx(1,"%s",gai_strerror(error));
/*NOTREACHED*/
}
s=-1;
for(res=res0;res;res=res->ai_next){
s=socket(res->ai_family,res->ai_socktype,
res->ai_protocol);
if(s<0){
cause="socket";
continue;
}
if(connect(s,res->ai_addr,res->ai_addrlen)<0){
cause="connect";
close(s);
s=-1;
continue;
}
break;/* okay we got one */
}
if(s<0){
err(1,"%s",cause);
/*NOTREACHED*/
}
freeaddrinfo(res0);
注意:合成IPv6地址的只能添加在iOS 9.2和OS X 10.11.2中的getaddrinfo方法然而,它不兼容老系統(tǒng)版本妄辩。查閱:getaddrinfo(3) Mac OS X Developer Tools Manual Page
定期測試IPv6 DNS64 / NAT64兼容性
最簡單的方法來測試你的應用是否兼容IPv6 DNS64 / NAT64
在mac上建立一個本地IPv6 DNS64 / NAT64網(wǎng)絡惑灵。你可以從你的其他設備連接到這個網(wǎng)絡用于測試目的。參見圖
重要提示:IPv6的DNS64/NAT64網(wǎng)絡設置選項在OS X10.11及更高版本可用眼耀。此外英支,基于Mac的IPv6 DNS64/NAT64網(wǎng)絡是與已經(jīng)執(zhí)行了RFC6106支持客戶端設備兼容:對于DNS配置IPv6路由器廣告選項。如果您的測試設備不是iOS或OS X設備哮伟,請確保它支持RFC干花。需要注意的是,不同于服務提供商部署DNS64/ NAT64工作流程楞黄,一臺Mac池凄,基于IPv6 DNS64/ NAT64總是產(chǎn)生合成的IPv6地址。因此鬼廓,它不能提供本地網(wǎng)絡的外部訪問
使用你的MAC建立本地的IPv6 Wi-Fi 網(wǎng)絡
確認你的MAC連接到了互聯(lián)網(wǎng),并且不是通過Wi-Fi.
從Dock中運行系統(tǒng)首選項
按住Option按鍵并且同時點擊共享 ,不要松開Option按鍵
打開設置 共享選項
從共享服務中選擇互聯(lián)網(wǎng)分享選項
配置互聯(lián)網(wǎng)共享
釋放Option按鍵
選中 創(chuàng)建NAT64網(wǎng)絡復選框
打開本地的IPv6 NAT64 網(wǎng)絡
選擇一個提供互聯(lián)網(wǎng)鏈接的網(wǎng)絡接口, 例如雷電網(wǎng)卡
選擇一個網(wǎng)絡接口共享
選擇Wi-Fi 復選框.
打開通過 Wi-Fi共享
點擊 Wi-Fi 選項, 配置網(wǎng)絡名稱與密碼等信息
訪問WI-FI設置選項
設置本地WI-FI
選擇互聯(lián)網(wǎng)共享復選框,開啟你的本地網(wǎng)絡
開啟互聯(lián)網(wǎng)共享
當提示確認開始分享的時候,點擊開始
開始分享
一旦共享處于活動狀態(tài)修赞,你應該看到一個綠色的狀態(tài)指示燈,Internet共享標簽:開。在無線網(wǎng)絡菜單中柏副,您還將看到一個小的勾邦,淡淡的箭頭朝上,表明互聯(lián)網(wǎng)共享已啟用割择。你現(xiàn)在有一個IPv6NAT64網(wǎng)絡眷篇,并可以從其他設備,以測試你的應用程序連接到它荔泳。
互聯(lián)網(wǎng)共享標識