IPv6客戶端訪問IPv4服務(wù)器原理
首先,這個是無法直接訪問的,必須網(wǎng)絡(luò)的提供商支持過渡技術(shù)。
第一步:DNS 污染
例如我們想要訪問 example.com ,假設(shè)這個網(wǎng)站只有 IPv4 地址(93.184.216.34,用16進(jìn)制表示為 5d b8 d8 22) 那么,被“污染”的DNS返回的 IP 地址是 64:ff9b::5db8:d822。 其中 `64:ff9b::/96`是IANA分配用于DNS64的前綴。
第二步:IPv6 轉(zhuǎn) IPv4
訪問 64:ff9b::5db8:d822 時,IPv6 包頭被替換為 IPv4 包頭,繼續(xù)訪問。 同時回來的數(shù)據(jù)包會被做反向處理。
微信的DNS查詢,使用的 HTTP 協(xié)議自己封裝的,這樣在 IPv4 網(wǎng)絡(luò)下可以避免相當(dāng)多的問題。 如圖,微信直接查詢 A 記錄,即使我的設(shè)備在 IPv6-ONLY 的網(wǎng)絡(luò)環(huán)境下。 因此,微信就跪掉
應(yīng)用如何支持IPV6-Only?
對于如何支持IPV6-Only,官方給出了如下幾點標(biāo)準(zhǔn):(這里就不對其進(jìn)行解釋了,大家看上面的參考鏈接即可)
1. Use High-Level Networking Frameworks;
2. Don’t Use IP Address Literals;
3. Check Source Code for IPv6 DNS64/NAT64 Incompatibilities;
4. Use System APIs to Synthesize IPv6 Addresses;
NSURLConnection是否支持IPV6?
官方的這句話讓我們疑惑頓生:
*** using high-level networking APIs such as NSURLSession and the CFNetwork frameworks and you connect by name, you should not need to change anything for your app to work with IPv6 addresses***
只說了NSURLSession和CFNetwork的API不需要改變,但是并沒有提及到NSURLConnection。 從上文的參考資料中,我們看到NSURLSession、NSURLConnection同屬于Cocoa的url loading system,可以猜測出NSURLConnection在ios9上是支持IPV6的。
應(yīng)用里面的API網(wǎng)絡(luò)請求,大家一般都會選擇AFNetworking進(jìn)行請求發(fā)送,由于歷史原因,應(yīng)用的代碼基本上都深度引用了AFHTTPRequestOperation類,所以目前API網(wǎng)絡(luò)請求均需要通過NSURLConnection發(fā)送出去,所以必須確認(rèn)NSURLConnection是否支持IPV6. 經(jīng)過測試,NSURLConnection在最新的iOS9系統(tǒng)上是支持IPV6的。
Cocoa的URL Loading System從iOS哪個版本開始支持IPV6?
目前我們的應(yīng)用最低版本還需要支持iOS7,雖然蘋果只要求最新版本支持IPV6-Only,但是出于對用戶負(fù)責(zé)的態(tài)度,我們?nèi)匀恍枰闱宄诘桶姹旧蟄RL Loading System的API是否支持IPV6.
?。╰o fix me, make some experiments)待續(xù)~~~
Reachability是否需要修改支持IPV6?
我們可以查到應(yīng)用中大量使用了Reachability進(jìn)行網(wǎng)絡(luò)狀態(tài)判斷,但是在里面卻使用了IPV4的專用API。
在Pods:Reachability中
AF_INET Files:Reachability.m
struct sockaddr_in Files:Reachability.h , Reachability.m
那Reachability應(yīng)該如何支持IPV6呢?
?。?)目前Github的開源庫Reachability的最新版本是3.2,蘋果也出了一個Support IPV6 的Reachability的官方樣例,我們比較了一下源碼,跟Github上的Reachability沒有什么差異。
(2)我們通常都是通過一個0.0.0.0 (ZeroAddress)去開啟網(wǎng)絡(luò)狀態(tài)監(jiān)控,經(jīng)過我們測試,在iOS9以上的系統(tǒng)上IPV4和IPV6網(wǎng)絡(luò)環(huán)境均能夠正常使用;但是在iOS8上IPV4和IPV6相互切換的時候無法監(jiān)控到網(wǎng)絡(luò)狀態(tài)的變化,可能是因為蘋果在iOS8上還并沒有對IPV6進(jìn)行相關(guān)支持相關(guān)。(但是這仍然滿足蘋果要求在最新系統(tǒng)版本上支持IPV6的網(wǎng)絡(luò))。
?。?)當(dāng)大家都在要求Reachability添加對于IPV6的支持,其實蘋果在iOS9以上對Zero Address進(jìn)行了特別處理,官方發(fā)言是這樣的:
reachabilityForInternetConnection: This monitors the address 0.0.0.0,
which reachability treats as a special token that causes it to actually
monitor the general routing status of the device, both IPv4 and IPv6.
+ (instancetype)reachabilityForInternetConnection {
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
return [self reachabilityWithAddress: (const struct sockaddr *) &zeroAddress];
}
綜上所述,Reachability不需要做任何修改,在iOS9上就可以支持IPV6和IPV4,但是在iOS9以下會存在bug,但是蘋果審核并不關(guān)心。
評論