纯IPv6环境App适配的坑
?
來源:伯樂在線專欄作者 - MrPeak
鏈接:http://ios.jobbole.com/86580/
?
蘋果從2016年6月1號(hào)開始,強(qiáng)制所有app必須支持純IPv6的網(wǎng)絡(luò)環(huán)境。這項(xiàng)舉措將對(duì)IPv6的普及起到一定的推動(dòng)作用,也體現(xiàn)了Apple作為國際大廠的擔(dān)當(dāng)。
?
大部分App由于使用的是高層API,并不需要做任何的更改就能自然度過這次IPv6的考核,只是對(duì)于少部分手寫IPv4地址連server的同學(xué),生活有一點(diǎn)點(diǎn)影響。
?
請(qǐng)好好學(xué)習(xí)TCP/IP協(xié)議
?
每次蘋果對(duì)技術(shù)的推動(dòng),都是一次很好的充電學(xué)習(xí)機(jī)會(huì)。這里Peak君拜托大家務(wù)必好好學(xué)習(xí)網(wǎng)絡(luò)協(xié)議(深鞠躬)。
?
之前Apple默認(rèn)開啟ATS,推動(dòng)HTTPS的使用,ATS可以手動(dòng)關(guān)閉,但據(jù)說到2017年所有的HTTP流量都必須帶S了,不然無法通過審核。這很make sense,我知道到HTTPS部署已經(jīng)變得相當(dāng)簡(jiǎn)易的今天,還有很多很多的App在僥幸走HTTP。
?
再后來有Apple將APN悄悄過渡到了HTTP2.0通道,HTTP2.0慢慢地走入尋常百姓家。
?
這次IPv6的推進(jìn),是一次對(duì)IP layer的復(fù)習(xí)機(jī)會(huì)。大部分人包括我自己對(duì)HTTP,TCP相對(duì)熟悉一些,IP層由于項(xiàng)目當(dāng)中接觸少,更多還是停留在大學(xué)學(xué)習(xí)的基礎(chǔ)概念上。這次趁著Apple的這股東風(fēng),好好翻了幾篇RFC文檔,畫了一張下面的圖,也同時(shí)把公司App的socket遷移方案理順了。這當(dāng)中最重要的兩個(gè)概念是DNS64和NAT64。
?
?
DNS64
?
DNS64說白了是用來幫助host獲取IPv6地址的,傳統(tǒng)的DNS服務(wù)器可以把域名轉(zhuǎn)換成IPv4地址,但我們的iPhone設(shè)備如果處于IPv6環(huán)境下,只能去獲取IPv6的地址。DNS64就像一個(gè)中間代理,把傳統(tǒng)服務(wù)器返回的IPv4地址通過特殊的映射方式轉(zhuǎn)換成一個(gè)看著像IPv6地址的地址(IPv4的核,IPv6的殼),轉(zhuǎn)換其實(shí)很簡(jiǎn)單,用公式可以這樣表達(dá):
?
64:ff9b::IPv4 = IPv6
?
NAT64
?
DNS64幫助拿到IPv6的地址后,接下來就是NAT64登場(chǎng),幫助IPv6的Packet順利接入IPv4的公網(wǎng)當(dāng)中。IPv4的公網(wǎng)環(huán)境路由器只認(rèn)識(shí)IPv4的地址,所有這里當(dāng)然也需要一個(gè)中間設(shè)備來做協(xié)議轉(zhuǎn)換。NAT64就扮演這個(gè)角色。
?
我在上面的流程圖當(dāng)中已經(jīng)比較清晰的畫出了NAT64的工作方式。其實(shí)就是內(nèi)部同時(shí)有IPv4和IPv6的網(wǎng)卡,IPv4的網(wǎng)卡配了一個(gè)IPv4的地址池子,再通過端口映射的方式將IPv4地址和IPv6地址對(duì)應(yīng),同時(shí)再做一些協(xié)議的轉(zhuǎn)換,畢竟IPv4和IPv6的header完全不同。說白了就是一個(gè)內(nèi)部路由的功能,將奔向IPv4公網(wǎng)的包做了地址和協(xié)議的轉(zhuǎn)換。
?
一個(gè)深坑
?
博主公司所做的App就屬于Apple重點(diǎn)點(diǎn)名,手寫IPv4地址的典型。socket遷移過程當(dāng)中踩了一個(gè)不大不小的坑,在嘗試使用DNS64服務(wù)器將IPv4地址轉(zhuǎn)換成IPv6地址的過程當(dāng)中,發(fā)現(xiàn)數(shù)字端口號(hào)會(huì)導(dǎo)致奇異bug。
?
getaddrinfo(ipv4_str, @(port).stringValue.UTF8String, &hints, &res0);
?
我們一般使用getaddrinfo函數(shù)來解析host,如果端口號(hào)部分的入?yún)⑹菙?shù)字類型,會(huì)導(dǎo)致返回的結(jié)果里端口號(hào)被修改,當(dāng)然socket就沒法連成功啦。修改辦法是在DNS query結(jié)果里手動(dòng)將端口號(hào)再改回。
?
另一個(gè)辦法是跳過DNS查詢,直接自己將IPv4的地址轉(zhuǎn)化成IPv6的地址。類似這樣:
?
const char* ipv4mapped_str ="64:ff9b::121.43.xx.xxx";
?
?
視頻教程
?
加上之前錄制的Xcode視頻教程,這是第二篇視頻博客,應(yīng)該也是最后一篇。視頻教程確實(shí)不太適合做零散的技術(shù)博客分享,而更適合系統(tǒng)性的技術(shù)教程。
?
一是因?yàn)閺V告長到令人發(fā)指,90s的廣告足以磨掉大部分人的耐心,何況等待的是一篇并不怎么有趣的技術(shù)教程。
?
二是因?yàn)橐曨l不如文字精煉,容易把話說得又臭又長,我個(gè)人看別人技術(shù)博客也習(xí)慣一目十行的搜索感興趣要點(diǎn),視頻只能靠拖進(jìn)度條,遠(yuǎn)不如文字大綱了然。
?
至此也是一次有趣的嘗試,收獲了iMovie,keynote等高端技能,以后說不定哪天能派上更有價(jià)值的用場(chǎng)。
總結(jié)
以上是生活随笔為你收集整理的纯IPv6环境App适配的坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7安装PHP5.6.23
- 下一篇: 《CMake实践》笔记二:INSTALL