-
如果您正在使用高級網絡API(如
NSURLSession
CFNetwork框架)編寫客戶端應用程序,並按名稱進行連接,則不需要爲應用程序更改任何內容以使用IPv6地址。如果你不是通過名字連接,你可能應該是。請參閱在連接主機之前避免解析DNS名稱以瞭解如何操作。有關CFNetwork的信息,請參閱“ CFNetwork框架參考”。 -
如果您正在編寫服務器端應用程序或其他低級網絡應用程序,則需要確保您的套接字代碼在IPv4地址和IPv6地址之間正常工作。參見RFC4038:IPv6過渡的應用方面。
-
避免需要網絡地址轉換(NAT)
-
通過使用簡化的標頭提供更快的通過網絡的路由
-
防止網絡破碎
-
避免廣播用於鄰居地址解析
-
協議中嵌入的IP地址文字。許多通信協議,例如會話發起協議(SIP),文件傳輸協議(FTP),WebSockets和對等協議(P2PP),包括協議消息中的IP地址文字。例如,
FTP
參數命令DATA PORT
和PASSIVE
交換包含IP地址文字的信息。類似地,IP地址文字可能出現在SIP報頭字段,例如的值To
,From
,Contact
,Record-Route
,和Via
。請參閱使用高級網絡框架和不使用IP地址面值。 -
嵌入在配置文件中的IP地址文字。配置文件通常包括IP地址文字。請參閱不要使用IP地址文字。
-
網絡預檢。許多應用程序嘗試通過將IP地址文字傳遞到網絡可達性API來主動檢查Internet連接或活動的Wi-Fi連接。請參閱連接沒有預檢。
-
使用低級網絡API。有些應用與插座等原始網絡API,如直接工作
gethostbyname
,gethostbyname2
和inet_aton
。這些API容易被濫用,或者它們僅支持IPv4,例如,解析AF_INET
地址族的主機名,而不是AF_UNSPEC
地址族。請參閱使用高級網絡框架。 -
使用小地址家庭存儲容器。一些應用程序和網絡庫使用地址存儲容器-如
uint32_t
,in_addr
,和sockaddr_in
-即是32位或更小。請參閱使用適當大小的存儲容器。 -
WebKit的。該框架提供了一組用於在Windows中顯示Web內容的類,並且實現諸如以下鏈接之類的瀏覽器功能,管理後退列表以及管理最近訪問的頁面的歷史。WebKit簡化了加載網頁的複雜過程,即從HTTP服務器異步請求Web內容,響應可以按照隨機順序遞增執行,或部分由於網絡錯誤。有關更多信息,請參閱WebKit框架參考。
-
可可URL加載系統。該系統是通過網絡發送和接收數據而不提供顯式IP地址的最簡單方法。數據被髮送並且使用幾類-如之一接收
NSURLSession
,NSURLRequest
以及NSURLConnection
與工作-即NSURL
物體。NSURL
對象讓你的應用程序操縱URL和他們引用的資源。NSURL
通過調用該initWithString:
方法並傳遞一個URL說明符來創建一個對象。調用類的checkResourceIsReachableAndReturnError:
方法NSURL
來檢查主機的可達性。有關更多信息,請參閱URL會話編程指南。 -
CFNetwork的。該核心服務框架提供了一個網絡協議抽象庫,可以輕鬆執行各種網絡任務,例如使用BSD套接字,解析DNS主機以及使用HTTP / HTTPS。要定位沒有顯式IP地址的主機,請調用該
CFHostCreateWithName
方法。要打開一對TCP套接字到主機,請調用該CFStreamCreatePairWithSocketToCFHost
方法。欲瞭解更多信息,請參見CFNetwork的概念在CFNetwork的編程指南。 -
inet_addr()
-
inet_aton()
-
inet_lnaof()
-
inet_makeaddr()
-
inet_netof()
-
inet_network()
-
inet_ntoa()
-
inet_ntoa_r()
-
bindresvport()
-
getipv4sourcefilter()
-
setipv4sourcefilter()
支持IPv6 DNS64 / NAT64網絡
隨着IPv4地址池耗盡即將來臨,企業和蜂窩提供商越來越多地部署IPv6 DNS64和NAT64網絡。DNS64 / NAT64網絡是一個僅IPv6網絡,通過翻譯繼續提供對IPv4內容的訪問。根據應用程序的性質,轉換具有不同的含義:
什麼是推動IPv6採用
主要的網絡服務提供商,包括美國的主要蜂窩運營商正在積極推廣和部署IPv6。這是由於各種因素。
注意: 世界IPv6發佈是一個在全球範圍內跟蹤部署活動的組織。要查看最近的趨勢,請訪問世界IPv6發佈網站。
IPv4地址耗盡
數十年來,世界已經知道IPv4地址最終將耗盡。諸如無類別域間路由(CIDR)和網絡地址轉換(NAT)等技術有助於延遲不可避免。然而,2011年1月31日,互聯網號碼分配機構(IANA)IPv4地址的頂級池正式耗盡。美國互聯網號碼註冊機構(ARIN)預計在2015年夏季將會用盡IPv4地址 - 這裏提供倒計時。
IPv6比IPv4更有效率
除了解決IPv4耗盡問題外,IPv6比IPv4更有效率。例如,IPv6:
4G部署
第四代移動通信技術(4G)僅基於分組交換。由於IPv4地址的供應有限,需要IPv6支持,以便4G部署可擴展。
多媒體服務兼容性
IP多媒體核心網絡子系統(IMS)允許多媒體短信和LTE語音(VoLTE)等服務通過IP傳送。一些服務提供商使用的IMS僅與IPv6兼容。
成本
服務提供商通過繼續支持傳統IPv4網絡,同時業界繼續遷移到IPv6,從而帶來額外的運營和管理成本。
DNS64 / NAT64過渡工作流程
爲了減緩IPv4地址的耗盡,在許多IPv4網絡中實現了NAT。雖然這個解決方案暫時工作,但它證明是昂貴和脆弱的。今天,隨着更多的客戶端正在使用IPv6,供應商現在必須支持IPv4和IPv6。這是一項昂貴的工作。
提供單獨的IPv4和IPv6連接的蜂窩網絡理想情況下,提供商希望放棄對IPv4網絡的支持。但是,這樣做可以防止客戶端訪問代表互聯網重要部分的IPv4服務器。爲了解決這個問題,大多數主要的網絡提供商正在實施一個DNS64 / NAT64過渡工作流程。這是一個僅IPv6網絡,通過翻譯繼續提供對IPv4內容的訪問。
使用DNS64和NAT64部署IPv6網絡的蜂窩網絡在這種類型的工作流程中,客戶端向DNS64服務器發送DNS查詢,DNS64服務器從DNS服務器請求IPv6地址。當找到一個IPv6地址時,它立即被傳回給客戶端。但是,當未找到IPv6地址時,DNS64服務器會請求IPv4地址。然後,DNS64服務器通過在IPv4地址前綴來合成IPv6地址,並將其傳遞給客戶端。在這方面,客戶端始終接收到IPv6就緒地址。參見圖10-3。
DNS64 IPv4到IPv6的轉換過程當客戶端向服務器發送請求時,將通過NAT64網關自動路由目的地爲合成地址的任何IPv6數據包。網關對請求執行IPv6到IPv4地址和協議轉換。它還對服務器的響應執行IPv4到IPv6的轉換。參見圖10-4。
DNS64 / NAT64過渡解決方案的工作流程IPv6和App Store要求
與IPv6 DNS64 / NAT64網絡的兼容性將成爲App Store提交的要求,因此應用程序必須確保兼容性。好消息是,大多數應用程序已經是IPv6兼容的。對於這些應用程序,定期測試應用程序以觀察迴歸仍然很重要。不兼容IPv6的應用程序在DNS64 / NAT64網絡上運行時可能會遇到問題。幸運的是,如本章所討論的那樣,解決這些問題通常很簡單。
支持IPv6的常見障礙
幾種情況可能會阻止應用程序支持IPv6。以下部分介紹如何解決這些問題。
確保IPv6 DNS64 / NAT64兼容性
遵守以下準則,以確保您的應用程序中的IPv6 DNS64 / NAT64兼容性。
使用高級網絡框架
需要聯網的應用程序可以建立在高級網絡框架或低級POSIX套接字API上。在大多數情況下,高級框架就足夠了。它們具有能力,易於使用,並且不如低級API容易出現常見的陷阱。
網絡框架和API層如果您需要低級套接字API,請遵循RFC4038:IPv6過渡的應用方面的準則。
注意: 網絡,互聯網和Web和網絡入門概述提供有關網絡框架和API的詳細信息。
不要使用IP地址文字
確保你不及格的IPv4地址文字的點符號API,如getaddrinfo
和SCNetworkReachabilityCreateWithName
。相反,使用高級網絡框架和地址不可知版本的API,例如getaddrinfo
和getnameinfo
,並傳遞他們的主機名或完全限定域名(FQDN)。看到getaddrinfo(3)
Mac OS X Developer Tools Manual Page
和getnameinfo(3) Mac OS X Developer Tools Manual Page
。
注意: 在iOS 9和OS X 10.11及更高版本中,NSURLSession
並CFNetwork
在DNS64
/ NAT64網絡上運行的設備上本地從IPv4文字自動合成IPv6地址。但是,您仍然應該刪除IP地址文字的代碼。
連接沒有預檢
可見性API(請參閱SCNetworkReachability參考)旨在用於診斷目的之後識別連接問題。許多應用程序不正確地使用這些API來主動檢查Internet連接,SCNetworkReachabilityCreateWithAddress
方法是調用該方法並傳遞一個IPv4地址0.0.0.0
,這表示網絡上有路由器。但是,路由器的存在並不能保證存在Internet連接。一般來說,避免提前檢查網絡的可達性。只是嘗試建立一個連接,並優雅地處理故障。如果必須檢查網絡可用性,請避免調用該SCNetworkReachabilityCreateWithAddress
方法。調用該SCNetworkReachabilityCreateWithName
方法並將其傳遞給主機名。
一些應用程序還將該SCNetworkReachabilityCreateWithAddress
方法傳遞給169.254.0.0
一個自我分配的鏈路本地地址的IPv4地址,以檢查活動的Wi-Fi連接。要檢查Wi-Fi或蜂窩連接,請kSCNetworkReachabilityFlagsIsWWAN
改用網絡可達性標誌。
使用適當尺寸的存儲容器
使用sockaddr_storage
足夠大的地址存儲容器來存儲IPv6地址。
檢查IPv6 DNS64 / NAT64不兼容的源代碼
檢查並消除IPv4特定的API,例如:
如果您的代碼處理IPv4類型,請確保處理IPv6等價物。
IPv4的 |
IPv6的 |
---|---|
|
|
|
|
|
|
|
|
|
|
使用系統API來合成IPv6地址
如果您的應用程序需要連接到沒有DNS主機名的純IPv4服務器,請使用此方法getaddrinfo
來解析IPv4地址字面值。如果當前網絡接口不支持IPv4,但是支持IPv6,NAT64和DNS64,則執行此任務將導致合成的IPv6地址。
清單10-1顯示瞭如何解決使用的IPv4文字getaddrinfo
。假設您將IPv4地址存儲在四個字節(如{192,
0, 2, 1}
)中,則此示例代碼將其轉換爲字符串(例如"192.0.2.1"
),用於getaddrinfo
合成IPv6地址(例如struct
sockaddr_in6
包含IPv6地址"64:ff9b::192.0.2.1"
),並嘗試連接到那個IPv6地址。
getaddrinfo
,以解決IPv4地址文字
#include <sys / socket.h> |
#include <netdb.h> |
#include <arpa / inet.h> |
#include <err.h> |
|
uint8_t ipv4 [4] = {192,0,2,1}; |
struct addrinfo提示,* res,* res0; |
int error,s; |
const char * cause = NULL; |
|
char ipv4_str_buf [INET_ADDRSTRLEN] = {0}; |
const char * 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)); |
/*還沒到*/ |
} |
s = -1; |
for(res = res0; res; res = res-> ai_next){ |
s = socket(res-> ai_family,res-> ai_socktype, |
水庫> ai_protocol); |
if(s <0){ |
cause =“socket”; |
繼續; |
} |
|
if(connect(s,res-> ai_addr,res-> ai_addrlen)<0){ |
cause =“connect”; |
關閉(多個); |
s = -1; |
繼續; |
} |
|
打破; / *好吧,我們有一個* / |
} |
if(s <0){ |
err(1,“%s”,原因); |
/*還沒到*/ |
} |
freeaddrinfo(RES0); |
注意:getaddrinfo
在iOS 9.2和OS X 10.11.2 中添加了合成IPv6地址的功能。但是,利用它不會破壞與舊系統版本的兼容性。見getaddrinfo(3)
Mac OS X Developer Tools Manual Page
。
測試IPv6 DNS64 / NAT64兼容性
測試您的應用程序的最簡單方法是IPv6 DNS64 / NAT64兼容性 - 這是大多數蜂窩運營商正在部署的網絡類型 - 是使用Mac設置本地IPv6 DNS64 / NAT64網絡。然後,您可以從其他設備連接到此網絡進行測試。參見圖10-6。
重要信息: IPv6 DNS64 / NAT64網絡設置選項在OS X 10.11及更高版本中可用。此外,基於Mac的IPv6 DNS64 / NAT64網絡與實施了對RFC6106的支持的客戶端設備:DNS配置的IPv6路由器通告選項兼容。如果您的測試設備不是iOS或OS X設備,請確保它支持此RFC。請注意,與服務提供商部署的DNS64 / NAT64工作流不同,基於Mac的IPv6 DNS64 / NAT64始終生成合成的IPv6地址。因此,它不提供對本地網絡之外的僅限IPv6的服務器的訪問,如果您嘗試提供支持IPv6的服務器但不支持IPv6,則可能會出現意外的方式。有關詳細信息,請參閱本地測試的限制。
使用Mac設置本地IPv6 Wi-Fi網絡
-
確保您的Mac連接到互聯網,但不能通過Wi-Fi。
-
從Dock,LaunchPad或Apple菜單啓動系統偏好設置。
-
按Option鍵,然後單擊共享。不要釋放Option鍵。
打開共享首選項 -
在共享服務列表中選擇Internet共享。
配置Internet共享 -
釋放Option鍵。
-
選中“創建NAT64網絡”複選框。
使能本地IPv6 NAT64網絡 -
選擇提供Internet連接的網絡接口,如Thunderbolt以太網。
選擇要共享的網絡接口 -
選中Wi-Fi複選框。
啓用Wi-Fi上的共享 -
單擊Wi-Fi選項,並配置網絡的網絡名稱和安全選項。
訪問Wi-Fi網絡選項 設置本地Wi-Fi網絡選項 -
選中“Internet共享”複選框以啓用本地網絡。
啓用Internet共享 -
當系統提示您確認要開始共享時,單擊開始。
啓動Internet共享
共享激活後,您應該看到一個綠色狀態指示燈和一個標籤,表示Internet Sharing:On。在Wi-Fi菜單中,您還將看到一個小而微弱的箭頭向上,表示啓用了Internet共享。您現在有一個IPv6 NAT64網絡,可以從其他設備連接到它,以測試您的應用程序。
互聯網共享指標局部測試的侷限性
基於Mac的IPv6 DNS64 / NAT64網絡是在IPv6環境中測試應用程序的有用工具。然而,由於它總是生成合成的IPv6地址並使用IPv4在WAN側傳輸數據,因此它不是由服務提供商提供的網絡的精確副本。這些網絡(以及在App Review中使用的網絡)確實允許直接的IPv6到IPv6連接。如果您的服務器配置錯誤,這可能會導致您的應用程序在常規使用或審查期間的行爲與本地測試中的行爲不同。甚至可能導致在您自己的環境中難以重現的App Review失敗。
特別是,如果您的服務器聲稱支持IPv6,您可能遇到麻煩,但實際上並不支持。在這種情況下,在初始測試期間,您的應用程序似乎通過IPv6路徑與您的服務器進行通信,從而正常運行。但是,您的測試網絡實際上是將您的應用程序生成的IPv6流量轉換爲WAN上的IPv4流量。因此,您實際上正在運行服務器的IPv4數據路徑。後來在應用程序審查(或現實世界)期間,應用程序運行相同,但是網絡直接連接到服務器的IPv6。如果您的服務器無法正確響應IPv6流量,您的應用程序無法按預期運行,並且可能會失敗App Review。
爲了避免這種情況,除了使用基於Mac的IPv6 DNS64 / NAT64測試網絡驗證您的應用程序外,還可以獨立驗證您的服務器是否正常工作爲IPv6服務器。例如,確保服務器:
-
具有正確的DNS信息。除了檢查服務器本身之外,您還可以使用
dig(1)
Mac上的命令行工具查看服務器如何報告其AAAA記錄。 -
實際上是在聽IPv6。使用像ipv6-test.com這樣的工具測試Web服務器(HTTP或HTTPS)。對於其他協議,您需要從本機IPv6網絡進行驗證。
-
正確響應IPv6請求。如果您有訪問權限,請查看服務器日誌以驗證是否正確處理IPv6流量。如果沒有,您將需要從本機IPv6網絡進行測試。
資源
有關實施網絡的更多信息,請參閱:
有關IPv6轉換的更多信息,請參閱:
有關轉換到IPv6時遇到的技術問題,請參閱: