1. 程式人生 > >如何應對蘋果app 的ipv6 時代?

如何應對蘋果app 的ipv6 時代?

  WeTest導讀

WWDC2015蘋果宣布在ios9支持純IPv6的網絡服務,並且要求2016年提交到app store的應用必須兼容純IPv6的網絡,要求適配的系統版本是ios9以上(包括ios9)。

一、背景介紹

1、你了解IPv6嗎?

IPv6是Internet Protocol Version 6的縮寫,簡單的概括IPv6就是現行的互聯網協議(IPV4)的下一代IP協議。IPv6由128位二進制數組成,可提供龐大的IP地址資源,足以讓地球上每個生物乃至每厘米都能被分配到一個或多個IP地址。將這128位的地址按每16位劃分為一個段,將每個段轉換成十六進制數字,並用冒號隔開。

IPv4地址示例:192.168.191.1

IPv6地址示例:2001:0db8:85a3:08d3:1319:8a2e:0370:7344

2、為什麽要接入IPv6?

目前互聯網廣泛應用的IPv4技術,理論上IPv4是一個32位的二進制數的地址,可編址1600萬個網絡、40億臺主機。但在采用了A、B、C三類編址方式後,可用的網絡地址和主機地址數目大打折扣,歐美資本主義列強掌握著核心技術,留給我國的就更少了。

二、改造方案

要想使應用完全支持IPV6的環境要做的太多了,從協議到硬件,要做一次徹底的大調整。不但客戶端要做ipv6的改造,服務器也要適配ipv6.主要有一下四種對應關系,必須做好以下每一種。

IPv4->IPv4

IPv4->IPv6

IPv6->IPv4

IPv6->IPv6

要做到IPv6和IPv4完全兼容需要做很大的修改,最簡單的協議上要兼容128位的IP地址,路由器,服務器等相關硬件也要升級。應蘋果公司的要求,本次改造我們只關註客戶端從IPv6的網絡環境訪問IPv4的資源。那麽問題來了,現在我們大部分後臺服務器都是使用IPv4接入的,我們要如何做兼容?幸好,從一開始設計IPv6就考慮到了向後兼容的問題,運營商會提供一個中間節點,使用DNS64/NAT64等技術,負責協議的轉換,打通IPv6和IPv4之間的鏈路。(IPv6和IPv4互通技術有很多,這裏只討論apple要求的技術方案DNS64/NAT64)我們要走的服務器必須支持nat/nat64的環境,搭建的wifi環境本來就支持了,我們不改上層的,只改底層的是影響最小。

1、NAT64與DNS64技術

NAT64是一種有狀態的網絡地址與協議轉換技術,一般只支持通過IPv6網絡側用戶發起連接訪問IPv4側網絡資源。但NAT64也支持通過手工配置靜態映射關系,實現IPv4網絡主動發起連接訪問IPv6網絡。NAT64可實現TCP、UDP、ICMP協議下的IPv6與IPv4網絡地址和協議轉換。

DNS64則主要是配合NAT64工作,上海證券通主要是將DNS查詢信息中的A記錄(IPv4地址)合成到AAAA記錄(IPv6地址)中,返回合成的AAAA記錄用戶給IPv6側用戶。DNS64也解決了NAT-PT中的DNS-ALG存在的缺陷。NAT64一般與DNS64協同工作,而不需要在IPv6客戶端或IPv4服務器端做任何修改。NAT64解決了NAT-PT中的大部分缺陷,同時配合DNS64的協同工作,無需像NAT-PT中的DNS-ALG等。

2、舉個栗子

這裏大概描述一下NAT64的工作流程。

(1)IPv6主機發起www.ipv6bbs.cn的AAAA域名解析到DNS64(主機配置的DNS地址是DNS64)

(2)DNS64觸發AAAA到DNS AAAA中查詢;

(3)DNS AAAA返回NULL的信息到DNS64;

(4)DNS64然後觸發A的申請到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主機;

(7)IPv6主機發起目的地址為64:ff9b:11.111.11.11的IPv6數據包;由於NAT64在IPv6域內通告配置的IPv6 Prefix,因此這個數據包轉發到NAT64設備上;

(8)NAT64執行地址轉換和協議轉換,目的地址轉換為192.0.2.1,源地址根據地址狀態轉換(64:ff9b:11.111.11.11,1500)->(11.111.11.11,2000);在IPv4域內路由到IPv4 server;

(9)數據包返回,目的地址和端口為11.111.11.11,2000;

(10)NAT64根據已有記錄進行轉換,目的地址轉換為2001:db8::1,源地址為加了IPv6前綴的IPv4 server地址64:ff9b:11.111.11.11,發送到IPv6主機;


按照NAT64的規則,客戶端如果沒有做DNS域名解析的話(微信依賴的是自己實現的NEWDNS),客戶端就需要完成DNS64的工作。這裏的關鍵點是,發現網絡是IPv6-only的NAT64網絡的情況下,我們可以自己補充上前綴64:ff9b::/96,然後進行正常的訪問。然而這裏客戶端能獲取的信息量一般都是很有限的。

註:AAAA記錄(AAAA record)是用來將域名解析到IPv6地址的DNS記錄。用戶可以將一個域名解析到IPv6地址上,也可以將子域名解析到IPv6地址上。

3、開發同學幹了什麽?

Xplaform改造的要點主要有一下4個:

a.換用兼容IPv4及IPv6的API,例如:getaddrinfo,yaoli同學在測試過程中發現,ios9系統在IPv6-only的環境下,返回會的地址信息結構體中port為0,所以這裏需要重新賦值端口號再進行聯網。

b.判斷當前客戶端是處於IPv4-only、IPv6-only還是IPv4和IPv6並存的環境,然後分別使用不同的網絡API,可以參考http://km.oa.com/articles/show/270667。

c.SCNetworkReachabilityCreateWithAddress這個方法最好使用探測域名的方式。如果參數填的是0.0.0.0,蘋果文檔說明這返回的結果不保證能真正出外網。這樣就需要其它輔助的手段嘗試是否能出外網了。

d.使用socket及connect進行的聯網操作。

三、客戶端兼容性測試辦法

1、測試環境搭建

後臺不用改,那客戶端要改如何兼容。我們可以先用蘋果給的測試工具,簡單測試。整體原理如下:

其中,在客戶端的改造叫做Xplaform,需要連接mac機創建的NAT64/DNS64的wifi,就是傳說中的IPV6的網絡環境,再通過有線網絡,路由器,訪問到IPv4的資源。就做到IPv6→IPv4的連接。

下面講解一下IPv6wifi網絡環境的搭建。

(1)工具/準備

體驗網有線接口、iMAC(10.11以上的系統)和iOS9(包括iOS9)以上設備

(2)步驟

接好體驗網的網線,然後打開系統設置找到Sharing圖標,如下:

點擊進入,然後按住option按鍵同時用鼠標點擊下圖的“internet-Sharing”。

這時可以看到下方出現了“Create NAT64 Network”可選菜單,把這個選上,如下圖:

之後用手機連上這個共享的wifi熱點,測試對應的網絡功能即可。

測試重點:

1、IPV4和IPV6網絡環境判斷是否正確

2、UDP和TCP的切換是否正確

3、數據線和音視頻的基本功能

四、經典bug分享

【bug描述】移動4G下無法傳文件。

在移動網絡下無法查看電腦和進入wifiphoto,傳文件,問題出現的初期我們馬上切換到wifi下,發現wifi下是可以的,把sim卡換成聯通的,也可以。唯獨移動的網絡下無法傳文件。初步斷定是對網絡的兼容性問題。

【問題排查】

1、查看socket日誌,發現在connection一直失敗。在建立連接階段一直失敗。我們做該需求的目的在於要增加IPV6的客戶端能通過IPV6的網絡訪問到IPV4的資源。因此,在做IPV6的改造中我們做了一個判斷邏輯,判斷當前網絡環境是IPV4 or IPV6。

2、加日誌驗證,我們把socket綁定的ip地址類型打出來,果然:

在移動數據網絡下走了ipv6的通道。可是各大運營商的網絡應該走的是ipv4才對。

3、review代碼。問題就很明顯了,我們梳理了一下選擇ipv6或者ipv4協議棧的判斷邏輯,原來開發判斷到網關是IPv6的網關之後就不再往下判斷,直接建立連接。然而,我們連接上4G網絡環境的時候,移動基站分發的網關是一個ipv6形式網關,它可以兼容ipv6和ipv4兩種ip(開發同學認為是移動公司兼容ipv6的策略,看來移動公司已經走在我們前面了)。

【解決辦法】

我們更改了IPv6和IPv4協議棧的判斷邏輯:

1、探測環境


我們的探測環境的方法是:先創建一個ipv6的socket去連ipv6的地址,如果當前網絡不是ipv6的環境,返回路由不可達。關鍵點,因為tcp是異步的需要三次握手,所以我們使用udp來完成這個過程。

2、繼續判斷網關語法是否是IPv6格式,

3、最後獲取DNS地址,以上都符合IPv6的語法,即為IPv6的網絡,建立socket走IPv6.

4、如果當前網絡是IPv6的環境,我們就對IP進行兼容性改造IPv6=64:ff9b::/96+IPv4。再通過改造後的IP地址建立socket連接。

5、如果IPv6和IPv4都可以走通,我們優先建立IPv4的連接。

【結果檢查】

打印出建立連接的日誌:

從日誌可以看出,手機連接4G之後得到的是IPv4的地址和IPv6格式的網關。

創建socket時,IPv6失敗,走IPv4的網。

【經驗總結】

邏輯和場景是測試的兩個緯度,二者都要兼顧到。

如何應對蘋果app 的ipv6 時代?