什么是DNS

當(dāng)我們發(fā)起一個網(wǎng)絡(luò)請求,首先要經(jīng)過DNS服務(wù),將域名轉(zhuǎn)化為IP地址,然后通過IP地址建立連接。DNS的工作流程如下圖所示。

Local DNS有什么缺陷

那么,傳統(tǒng)的Local DNS有什么缺陷呢。就目前端上而言,主要有幾個問題:

?Local DNS劫持

DNS劫持示例圖如下:

DNS劫持會導(dǎo)致端上網(wǎng)絡(luò)連接失敗或者DNS解析失敗,嚴(yán)重影響用戶使用,在之前,端上采用備用域名的機(jī)制去解決這個問題,但是效果并不是很好。

?DNS解析過慢

DNS解析分為遞歸查詢和迭代查詢兩種。

由于遞歸模式會導(dǎo)致DNS服務(wù)器流量很大,所以現(xiàn)在大多數(shù)采用迭代模式。

由于端上網(wǎng)絡(luò)環(huán)境的復(fù)雜性已經(jīng)DNS解析的流程也較為復(fù)雜,有些場景下DNS解析時間高達(dá)幾百毫秒,對于一次網(wǎng)絡(luò)請求來說,是相當(dāng)緩慢的。

什么是HttpDns

目前來說,騰訊和阿里都有自己的HTTPDNS解決方案。HTTPDNS有以下特性:

1.安全,由于httpdns使用http或者h(yuǎn)ttps協(xié)議通過ip直連的方式進(jìn)行解析,繞過了運營商的Local DNS,避免了域名劫持

2.快速,通過預(yù)解析機(jī)制,將熱點域名提前解析,網(wǎng)絡(luò)連接時直接緩存獲取

Android端HttpDns接入指南

在阿里云HTTPDNS文檔中,有所謂的“最佳方案”,包含SNI場景、OkHttp場景等等,但是,這對于我們來說,接入量還是偏大,且覆蓋的場景依然有限。如果我們想很簡單的接入,且覆蓋全量JAVA場景,如何做呢。首先,我們看一下Android側(cè)DNS解析的調(diào)用流程,以API 28為例。

InetAddress#getAllByName() ->Inet6AddressImpl#lookupHostByName() ->Libcore.os.android_getaddrinfo()

而Libcore代碼如下Libcore源碼[1]:

public final class Libcore { private Libcore() { } /** * Direct access to syscalls. Code should strongly prefer using {@link #os} * unless it has a strong reason to bypass the helpful checks/guards that it * provides. */ public static Os rawOs = new linux(); /** * Access to syscalls with helpful checks/guards. */ public static Os os = new BlockGuardOs(rawOs);}

通過簡單的代碼跟蹤可以發(fā)現(xiàn),他們實現(xiàn)Os這個接口[2],接口?對哦,動態(tài)代理。是的,我們可以通過動態(tài)代理的方式,去hook掉Java層發(fā)起的DNS解析請求。


上面的代碼,已經(jīng)開源在KIDDNS-Android[3]

下期預(yù)告

Android P hide API的問題相信困擾了不少同學(xué),那么下期,咱們一起了解下如何在Android P上使用hide API!

References

[1] Libcore源碼:https://android.googlesource.com/platform/libcore/+/refs/tags/android-9.0.0_r35/luni/src/main/java/libcore/io/Libcore.java

[2] Os這個接口:https://android.googlesource.com/platform/libcore/+/refs/tags/android-9.0.0_r35/luni/src/main/java/libcore/io/Os.java

[3] KIDDNS-Android:https://github.com/VIPKID-OpenSource/KIDDNS-Android

1.《dns優(yōu)化 Android網(wǎng)絡(luò)優(yōu)化篇-從DNS開始》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《dns優(yōu)化 Android網(wǎng)絡(luò)優(yōu)化篇-從DNS開始》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/347086.html