IPv6客戶端訪問(wèn)IPv4服務(wù)器原理
首先,這個(gè)是無(wú)法直接訪問(wèn)的,必須網(wǎng)絡(luò)的提供商支持過(guò)渡技術(shù)。
第一步:DNS 污染
例如我們想要訪問(wèn) example.com ,假設(shè)這個(gè)網(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
訪問(wèn) 64:ff9b::5db8:d822 時(shí),IPv6 包頭被替換為 IPv4 包頭,繼續(xù)訪問(wèn)。 同時(shí)回來(lái)的數(shù)據(jù)包會(huì)被做反向處理。
微信的DNS查詢,使用的 HTTP 協(xié)議自己封裝的,這樣在 IPv4 網(wǎng)絡(luò)下可以避免相當(dāng)多的問(wèn)題。 如圖,微信直接查詢 A 記錄,即使我的設(shè)備在 IPv6-ONLY 的網(wǎng)絡(luò)環(huán)境下。 因此,微信就跪掉
應(yīng)用如何支持IPV6-Only?
對(duì)于如何支持IPV6-Only,官方給出了如下幾點(diǎn)標(biāo)準(zhǔn):(這里就不對(duì)其進(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***
只說(shuō)了NSURLSession和CFNetwork的API不需要改變,但是并沒(méi)有提及到NSURLConnection。 從上文的參考資料中,我們看到NSURLSession、NSURLConnection同屬于Cocoa的url loading system,可以猜測(cè)出NSURLConnection在ios9上是支持IPV6的。
應(yīng)用里面的API網(wǎng)絡(luò)請(qǐng)求,大家一般都會(huì)選擇AFNetworking進(jìn)行請(qǐng)求發(fā)送,由于歷史原因,應(yīng)用的代碼基本上都深度引用了AFHTTPRequestOperation類,所以目前API網(wǎng)絡(luò)請(qǐng)求均需要通過(guò)NSURLConnection發(fā)送出去,所以必須確認(rèn)NSURLConnection是否支持IPV6. 經(jīng)過(guò)測(cè)試,NSURLConnection在最新的iOS9系統(tǒng)上是支持IPV6的。
Cocoa的URL Loading System從iOS哪個(gè)版本開(kāi)始支持IPV6?
目前我們的應(yīng)用最低版本還需要支持iOS7,雖然蘋果只要求最新版本支持IPV6-Only,但是出于對(duì)用戶負(fù)責(zé)的態(tài)度,我們?nèi)匀恍枰闱宄诘桶姹旧蟄RL Loading System的API是否支持IPV6.
(to 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的開(kāi)源庫(kù)Reachability的最新版本是3.2,蘋果也出了一個(gè)Support IPV6 的Reachability的官方樣例,我們比較了一下源碼,跟Github上的Reachability沒(méi)有什么差異。
?。?)我們通常都是通過(guò)一個(gè)0.0.0.0 (ZeroAddress)去開(kāi)啟網(wǎng)絡(luò)狀態(tài)監(jiān)控,經(jīng)過(guò)我們測(cè)試,在iOS9以上的系統(tǒng)上IPV4和IPV6網(wǎng)絡(luò)環(huán)境均能夠正常使用;但是在iOS8上IPV4和IPV6相互切換的時(shí)候無(wú)法監(jiān)控到網(wǎng)絡(luò)狀態(tài)的變化,可能是因?yàn)樘O果在iOS8上還并沒(méi)有對(duì)IPV6進(jìn)行相關(guān)支持相關(guān)。(但是這仍然滿足蘋果要求在最新系統(tǒng)版本上支持IPV6的網(wǎng)絡(luò))。
?。?)當(dāng)大家都在要求Reachability添加對(duì)于IPV6的支持,其實(shí)蘋果在iOS9以上對(duì)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以下會(huì)存在bug,但是蘋果審核并不關(guān)心。
評(píng)論
查看更多