一
背景介紹
你了解IPv6嗎需忿?
IPv6是Internet Protocol Version 6的縮寫鳞骤,簡(jiǎn)單的概括IPv6就是現(xiàn)行的互聯(lián)網(wǎng)協(xié)議(IPV4)的下一代IP協(xié)議横媚。IPv6由128位二進(jìn)制數(shù)組成底循,可提供龐大的IP地址資源嘉裤,足以讓地球上每個(gè)生物乃至每厘米都能被分配到一個(gè)或多個(gè)IP地址。將這128位的地址按每16位劃分為一個(gè)段据过,將每個(gè)段轉(zhuǎn)換成十六進(jìn)制數(shù)字惋砂,并用冒號(hào)隔開。
IPv4地址示例:192.168.191.1
IPv6地址示例:2001:0db8:85a3:08d3:1319:8a2e:0370:7344
為什么要接入IPv6绳锅?
目前互聯(lián)網(wǎng)廣泛應(yīng)用的IPv4技術(shù)西饵,理論上IPv4是一個(gè)32位的二進(jìn)制數(shù)的地址,可編址1600萬個(gè)網(wǎng)絡(luò)鳞芙、40億臺(tái)主機(jī)眷柔。但在采用了A、B原朝、C三類編址方式后驯嘱,可用的網(wǎng)絡(luò)地址和主機(jī)地址數(shù)目大打折扣,歐美資本主義列強(qiáng)掌握著核心技術(shù)喳坠,留給我國(guó)的就更少了鞠评。
二
改造方案
要想使應(yīng)用完全支持IPV6的環(huán)境要做的太多了,從協(xié)議到硬件壕鹉,要做一次徹底的大調(diào)整剃幌。不但客戶端要做ipv6的改造聋涨,服務(wù)器也要適配ipv6.主要有一下四種對(duì)應(yīng)關(guān)系,必須做好以下每一種负乡。
IPv4 -> IPv4
** IPv4 -> IPv6**
** IPv6 -> IPv4**
** IPv6 -> IPv6**
要做到IPv6和IPv4完全兼容需要做很大的修改牍白,最簡(jiǎn)單的協(xié)議上要兼容128位的IP地址,路由器抖棘,服務(wù)器等相關(guān)硬件也要升級(jí)茂腥。應(yīng)蘋果公司的要求,本次改造我們只關(guān)注客戶端從IPv6的網(wǎng)絡(luò)環(huán)境訪問IPv4的資源钉答。那么問題來了础芍,現(xiàn)在我們大部分后臺(tái)服務(wù)器都是使用IPv4接入的,我們要如何做兼容数尿?幸好仑性,從一開始設(shè)計(jì)IPv6就考慮到了向后兼容的問題,運(yùn)營(yíng)商會(huì)提供一個(gè)中間節(jié)點(diǎn)右蹦,使用DNS64/NAT64等技術(shù)诊杆,負(fù)責(zé)協(xié)議的轉(zhuǎn)換,打通IPv6和IPv4之間的鏈路何陆。(IPv6和IPv4 互通技術(shù)有很多晨汹,這里只討論apple要求的技術(shù)方案DNS64/NAT64) 我們要走的服務(wù)器必須支持nat/nat64的環(huán)境,搭建的wifi環(huán)境本來就支持了贷盲,我們不改上層的淘这,只改底層的是影響最小。
NAT64與DNS64技術(shù)
NAT64是一種有狀態(tài)的網(wǎng)絡(luò)地址與協(xié)議轉(zhuǎn)換技術(shù)巩剖,一般只支持通過IPv6網(wǎng)絡(luò)側(cè)用戶發(fā)起連接訪問IPv4側(cè)網(wǎng)絡(luò)資源铝穷。但NAT64也支持通過手工配置靜態(tài)映射關(guān)系,實(shí)現(xiàn)IPv4網(wǎng)絡(luò)主動(dòng)發(fā)起連接訪問IPv6網(wǎng)絡(luò)佳魔。NAT64可實(shí)現(xiàn)TCP曙聂、UDP、ICMP協(xié)議下的IPv6與IPv4網(wǎng)絡(luò)地址和協(xié)議轉(zhuǎn)換鞠鲜。
DNS64則主要是配合NAT64工作宁脊,主要是將DNS查詢信息中的A記錄(IPv4地址)合成到AAAA記錄(IPv6地址)中,返回合成的AAAA記錄用戶給IPv6側(cè)用戶贤姆。DNS64也解決了NAT-PT中的DNS-ALG存在的缺陷榆苞。NAT64一般與DNS64協(xié)同工作,而不需要在IPv6客戶端或IPv4服務(wù)器端做任何修改。NAT64解決了NAT-PT中的大部分缺陷,同時(shí)配合DNS64的協(xié)同工作脚草,無需像NAT-PT中的DNS-ALG等造锅。
舉個(gè)栗子
這里大概描述一下NAT64的工作流程仙畦。
1、IPv6主機(jī)發(fā)起www.ipv6bbs.cn的AAAA域名解析到DNS64(主機(jī)配置的DNS地址是DNS64)
2音婶、DNS64觸發(fā)AAAA到DNS AAAA中查詢;
3慨畸、DNS AAAA返回NULL的信息到DNS64;
4、DNS64然后觸發(fā)A的申請(qǐng)到DNS A中查詢;
5衣式、DNS A返回www.ipv6bbs.cn的A記錄(11.111.11.11);
6寸士、DNS64合成IPv6地址(64:ff9b: 11.111.11.11),返回AAAA response給IPv6主機(jī);
7碴卧、IPv6主機(jī)發(fā)起目的地址為64:ff9b: 11.111.11.11的IPv6數(shù)據(jù)包;由于NAT64在IPv6域內(nèi)通告配置的IPv6 Prefix弱卡,因此這個(gè)數(shù)據(jù)包轉(zhuǎn)發(fā)到NAT64設(shè)備上;
8、NAT64執(zhí)行地址轉(zhuǎn)換和協(xié)議轉(zhuǎn)換住册,目的地址轉(zhuǎn)換為192.0.2.1婶博,源地址根據(jù)地址狀態(tài)轉(zhuǎn)換(64:ff9b: 11.111.11.11,1500)->( 11.111.11.11,2000);在IPv4域內(nèi)路由到IPv4 server;
9、數(shù)據(jù)包返回荧飞,目的地址和端口為11.111.11.11,2000;
10凡人、NAT64根據(jù)已有記錄進(jìn)行轉(zhuǎn)換,目的地址轉(zhuǎn)換為2001:db8::1,源地址為加了IPv6前綴的IPv4 server地址64:ff9b: 11.111.11.11叹阔,發(fā)送到IPv6主機(jī);
按照NAT64的規(guī)則挠轴,客戶端如果沒有做DNS域名解析的話(微信依賴的是自己實(shí)現(xiàn)的NEWDNS),客戶端就需要完成DNS64的工作耳幢。這里的關(guān)鍵點(diǎn)是岸晦,發(fā)現(xiàn)網(wǎng)絡(luò)是IPv6-only的NAT64網(wǎng)絡(luò)的情況下,我們可以自己補(bǔ)充上前綴64:ff9b::/96睛藻,然后進(jìn)行正常的訪問启上。然而這里客戶端能獲取的信息量一般都是很有限的。
注:AAAA記錄(AAAA record)是用來將域名解析到IPv6地址的DNS記錄修档。用戶可以將一個(gè)域名解析到IPv6地址上碧绞,也可以將子域名解析到IPv6地址上。
開發(fā)同學(xué)干了什么吱窝?
** Xplaform改造的要點(diǎn)主要有一下4個(gè):**
a.換用兼容IPv4及IPv6的API讥邻,例如:getaddrinfo,yaoli同學(xué)在測(cè)試過程中發(fā)現(xiàn),ios9系統(tǒng)在IPv6-only的環(huán)境下院峡,返回會(huì)的地址信息結(jié)構(gòu)體中port為0兴使,所以這里需要重新賦值端口號(hào)再進(jìn)行聯(lián)網(wǎng)。
b.判斷當(dāng)前客戶端是處于IPv4-only照激、IPv6-only還是IPv4和IPv6并存的環(huán)境发魄,然后分別使用不同的網(wǎng)絡(luò)API,可以參考http://km.oa.com/articles/show/270667。
c.SCNetworkReachabilityCreateWithAddress這個(gè)方法最好使用探測(cè)域名的方式励幼。如果參數(shù)填的是0.0.0.0汰寓,蘋果文檔說明這返回的結(jié)果不保證能真正出外網(wǎng)。這樣就需要其它輔助的手段嘗試是否能出外網(wǎng)了苹粟。
d.使用socket及connect進(jìn)行的聯(lián)網(wǎng)操作有滑。
三
客戶端兼容性測(cè)試辦法
測(cè)試環(huán)境搭建
后臺(tái)不用改,那客戶端要改如何兼容嵌削。我們可以先用蘋果給的測(cè)試工具毛好,簡(jiǎn)單測(cè)試。整體原理如下:
其中苛秕,在客戶端的改造叫做Xplaform肌访,需要連接mac機(jī)創(chuàng)建的NAT64/DNS64的wifi,就是傳說中的IPV6的網(wǎng)絡(luò)環(huán)境艇劫,再通過有線網(wǎng)絡(luò)吼驶,路由器,訪問到IPv4的資源港准。就做到IPv6→IPv4的連接旨剥。
下面講解一下IPv6wifi網(wǎng)絡(luò)環(huán)境的搭建。
1.工具/準(zhǔn)備
體驗(yàn)網(wǎng)有線接口浅缸、iMAC(10.11以上的系統(tǒng))和iOS9(包括iOS9)以上設(shè)備
2.步驟
接好體驗(yàn)網(wǎng)的網(wǎng)線轨帜,然后打開系統(tǒng)設(shè)置找到Sharing圖標(biāo),如下:
點(diǎn)擊進(jìn)入衩椒,然后按住option按鍵同時(shí)用鼠標(biāo)點(diǎn)擊下圖的“internet-Sharing”蚌父。
這時(shí)可以看到下方出現(xiàn)了“Create NAT64 Network”可選菜單,把這個(gè)選上毛萌,如下圖:
之后用手機(jī)連上這個(gè)共享的wifi熱點(diǎn)苟弛,測(cè)試對(duì)應(yīng)的網(wǎng)絡(luò)功能即可。
測(cè)試重點(diǎn):
1阁将、 IPV4和IPV6網(wǎng)絡(luò)環(huán)境判斷是否正確
2膏秫、 UDP和TCP的切換是否正確
3、 數(shù)據(jù)線和音視頻的基本功能
四
經(jīng)典bug分享
【bug描述】移動(dòng)4G下無法傳文件做盅。
在移動(dòng)網(wǎng)絡(luò)下無法查看電腦和進(jìn)入wifiphoto缤削,傳文件,問題出現(xiàn)的初期我們馬上切換到wifi下吹榴,發(fā)現(xiàn)wifi下是可以的亭敢,把sim卡換成聯(lián)通的,也可以图筹。唯獨(dú)移動(dòng)的網(wǎng)絡(luò)下無法傳文件帅刀。初步斷定是對(duì)網(wǎng)絡(luò)的兼容性問題让腹。
【問題排查】
1、 查看socket日志扣溺,發(fā)現(xiàn)在connection一直失敗骇窍。在建立連接階段一直失敗。我們做該需求的目的在于要增加IPV6的客戶端能通過IPV6的網(wǎng)絡(luò)訪問到IPV4的資源锥余。因此像鸡,在做IPV6的改造中我們做了一個(gè)判斷邏輯,判斷當(dāng)前網(wǎng)絡(luò)環(huán)境是IPV4 or IPV6哈恰。
2、加日志驗(yàn)證志群,我們把socket綁定的ip地址類型打出來着绷,果然:
在移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)下走了ipv6的通道⌒吭疲可是各大運(yùn)營(yíng)商的網(wǎng)絡(luò)應(yīng)該走的是ipv4才對(duì)荠医。
3、review代碼桑涎。問題就很明顯了彬向,我們梳理了一下選擇ipv6或者ipv4協(xié)議棧的判斷邏輯,原來開發(fā)判斷到網(wǎng)關(guān)是IPv6的網(wǎng)關(guān)之后就不再往下判斷攻冷,直接建立連接娃胆。然而,我們連接上4G網(wǎng)絡(luò)環(huán)境的時(shí)候等曼,移動(dòng)基站分發(fā)的網(wǎng)關(guān)是一個(gè)ipv6形式網(wǎng)關(guān)里烦,它可以兼容ipv6和ipv4兩種ip(開發(fā)同學(xué)認(rèn)為是移動(dòng)公司兼容ipv6的策略,看來移動(dòng)公司已經(jīng)走在我們前面了)禁谦。
【解決辦法】
我們更改了IPv6和IPv4協(xié)議棧的判斷邏輯:
1胁黑、探測(cè)環(huán)境
我們的探測(cè)環(huán)境的方法是:先創(chuàng)建一個(gè)ipv6的socket去連ipv6的地址,如果當(dāng)前網(wǎng)絡(luò)不是ipv6的環(huán)境州泊,返回路由不可達(dá)丧蘸。關(guān)鍵點(diǎn),因?yàn)閠cp是異步的需要三次握手遥皂,所以我們使用udp來完成這個(gè)過程力喷。
2、繼續(xù)判斷網(wǎng)關(guān)語法是否是IPv6格式渴肉,
3冗懦、最后獲取DNS地址,以上都符合IPv6的語法仇祭,即為IPv6的網(wǎng)絡(luò)披蕉,建立socket走IPv6.
4、如果當(dāng)前網(wǎng)絡(luò)是IPv6的環(huán)境,我們就對(duì)IP進(jìn)行兼容性改造IPv6 = 64:ff9b::/96+IPv4没讲。再通過改造后的IP地址建立socket連接眯娱。
5、如果IPv6和IPv4都可以走通爬凑,我們優(yōu)先建立IPv4的連接徙缴。
【結(jié)果檢查】
打印出建立連接的日志:
從日志可以看出,手機(jī)連接4G之后得到的是IPv4的地址和IPv6格式的網(wǎng)關(guān)嘁信。
創(chuàng)建socket時(shí)于样,IPv6失敗,走IPv4的網(wǎng)潘靖。
【經(jīng)驗(yàn)總結(jié)】
邏輯和場(chǎng)景是測(cè)試的兩個(gè)緯度穿剖,二者都要兼顧到。
轉(zhuǎn):https://cloud.tencent.com/developer/article/1359312