適配IPv6一:官方文檔

原文地址:http://www.skyfox.org/ios-app-support-ipv6-dns64-nat64.html

官方地址:https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

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 FrameworksDon’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)共享標識

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蕉饼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子玛歌,更是在濱河造成了極大的恐慌昧港,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件支子,死亡現(xiàn)場離奇詭異创肥,居然都是意外死亡,警方通過查閱死者的電腦和手機值朋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門唤冈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來客蹋,“玉大人骚露,你說我怎么就攤上這事冀瓦。” “怎么了丰辣?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵撒强,是天一觀的道長。 經(jīng)常有香客問我笙什,道長尿褪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任得湘,我火速辦了婚禮杖玲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淘正。我一直安慰自己摆马,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布鸿吆。 她就那樣靜靜地躺著囤采,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惩淳。 梳的紋絲不亂的頭發(fā)上蕉毯,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天乓搬,我揣著相機與錄音,去河邊找鬼代虾。 笑死进肯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的棉磨。 我是一名探鬼主播江掩,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乘瓤!你這毒婦竟也來了环形?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤衙傀,失蹤者是張志新(化名)和其女友劉穎抬吟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體统抬,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡火本,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓄喇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片发侵。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡交掏,死狀恐怖妆偏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盅弛,我是刑警寧澤钱骂,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站挪鹏,受9級特大地震影響见秽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讨盒,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一解取、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧返顺,春花似錦禀苦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秉扑,卻和暖如春慧邮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工误澳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耻矮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓脓匿,卻偏偏與公主長得像淘钟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陪毡,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容