日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HttpDNS功能说明及实现

發布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HttpDNS功能说明及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

功能說明

HTTPDNS使用HTTP協議進行域名解析,代替現有基于UDP的DNS協議,域名解析請求直接發送到阿里云的HTTPDNS服務器,從而繞過運營商的Local DNS,能夠避免Local DNS造成的域名劫持問題和調度不精準問題。

功能說明
防劫持繞過運營商Local DNS,避免域名劫持,讓每一次訪問都暢通無阻。
精準調度基于訪問的來源IP,獲得最精準的解析結果,讓客戶端就近接入業務節點。
0ms解析延遲通過熱點域名預解析、緩存DNS解析結果、解析結果懶更新策略等方式實現0解析延遲
快速生效避免Local DNS不遵循權威TTL,解析結果長時間無法更新的問題
降低解析失敗率有效降低無線場景下解析失敗的比率

防劫持

HTTPDNS代替了傳統的LocalDNS完成遞歸解析的功能,基于HTTP協議的設計可以適用于幾乎所有的網絡環境,同時保留了鑒權、HTTPS等更高安全性的擴展能力,避免惡意攻擊劫持行為。

精準調度

傳統域名解析的調度精準性問題,本質根源在于Local DNS的部署和分配機制上。由于碎片化的管理方式,這些環節的服務質量同樣很難得到保障。HTTPDNS在遞歸解析實現上優化了與權威DNS的交互,通過<a name="https://datatracker.ietf.org/doc/rfc7871">edns-client-subnet</a>協議將終端用戶的IP信息直接交付給權威DNS,這樣權威DNS就可以忽略Local DNS IP信息,根據終端用戶的IP信息進行精準調度,避免Local DNS的坐標干擾

DNS解析0延遲:

  • 構建客戶端DNS緩存;

    通過合理的DNS緩存,我們確保每次網絡交互的DNS解析都是從內存中獲取IP信息,從而大幅降低DNS解析開銷。根據業務的不同,我們可以制訂更豐富的緩存策略,如根據運營商緩存,可以在網絡切換的場景下復用已緩存的不同運營商線路的域名IP信息,避免網絡切換后進行鏈路重選擇引入的DNS網絡解析開銷。另外,我們還可以引入IP本地化離線存儲,在客戶端重啟時快速從本地讀取域名IP信息,大幅提升首頁載入效率。
  • 熱點域名預解析;

    在客戶端啟動過程中,我們可以通過熱點域名的預解析完成熱點域名的緩存載入。當真正的業務請求發生時,直接由內存中讀取目標域名的IP信息,避免傳統DNS的網絡開銷。
  • 懶更新策略;

    絕大多數場景下業務域名的IP信息變更并不頻繁,特別是在單次APP的使用周期內,域名解析獲取的IP往往是相同的(特殊業務場景除外)。因此我們可以利用DNS懶更新策略來實現TTL過期后的DNS快速解析。所謂DNS懶更新策略即客戶端不主動探測域名對應IP的TTL時間,當業務請求需要訪問某個業務域名時,查詢內存緩存并返回該業務域名對應的IP解析結果。如果IP解析結果的TTL已過期,則在后臺進行異步DNS網絡解析與緩存結果更新。通過上述策略,用戶的所有DNS解析都在與內存交互,避免了網絡交互引入的延遲。

實現方案

服務端:

服務端提供API接口,app端直接通過ip地址訪問,ip地址可以有多個

請求方式:HTTP GET

URL參數說明:

名稱是否必須描述
host必須要解析的域名
ip可選用戶的來源IP,如果沒指定這個參數,默認使用請求連接的源IP

請求示例:

  • 示例1(默認來源IP):http://x.x.x.x/d?host=www.suning.com

  • 示例2(指定來源IP):http://x.x.x.x/d?host=www.suning.com&ip=185.53.179.6

考慮到服務IP防攻擊之類的安全風險,為保障服務可用性,HTTPDNS同時提供多個服務IP,當某個服務IP在異常情況下不可用時,可以使用其它服務IP進行重試。

請求成功時,HTTP響應的狀態碼為200,響應結果用JSON格式表示,示例如下:

{"host": "www.suning.com","ips": ["112.84.104.48"],"ttl": 57,"origin_ttl": 120 }

請求失敗的響應示例:

{"code": "MissingArgument" }

錯誤碼列表如下:

錯誤碼HTTP狀態碼描述
MissingArgument400缺少必要參數
InvalidHost400域名格式不合法
MethodNotAllowed405不支持的HTTP方法
InternalError500服務端內部錯誤

錯誤處理

異常下的出錯兼容邏輯,主要包括異步請求,重試,降級

異步請求

訪問HTTPDNS服務時,應該使用異步請求的策略,避免解析延遲太大而對業務造成影響,特別是在網絡環境異常或HTTPDNS服務IP異常不可 用時,如果用同步訪問,需要等待網絡超時后才會返回解析失敗,這個超時時間較大,可能對業務的使用體驗造成很大影響。異步請求策略:解析域名時,如果當前緩存中有TTL未過期的IP,可直接使用;如果沒有,則立刻讓此次請求降級走原生LocalDNS解析,同 時另起線程異步地發起HTTPDNS請求進行解析,更新緩存,這樣后續解析域名時就能命中緩存。

重試

訪問HTTPDNS服務解析域名時,如果請求HTTPDNS服務端失敗,即HTTP請求沒有返回,可以進行重試。大部分情況下,這種訪問失敗是由于網絡原因引起的,重試可以解決。

降級

不管是因為什么原因,當通過HTTPDNS服務無法獲得域名對應的IP時,都必須降級:使用標準的DNS解析,通過Local DNS去解析域名。

Android端:

OkHttp默認使用系統DNS服務InetAddress進行域名解析,但同時也暴露了自定義DNS服務的接口,通過該接口我們可以優雅地使用HttpDns。

  • 自定義DNS接口

OkHttp暴露了一個Dns接口,通過實現該接口,我們可以自定義Dns服務:

public class OkHttpDns implements Dns {private static final Dns SYSTEM = Dns.SYSTEM;HttpDnsService httpdns;//httpdns 解析服務private static OkHttpDns instance = null;private OkHttpDns(Context context) {this.httpdns = HttpDns.getService(context, "account id");}public static OkHttpDns getInstance(Context context) {if(instance == null) {instance = new OkHttpDns(context);}return instance;}@Overridepublic List<InetAddress> lookup(String hostname) throws UnknownHostException {//通過異步解析接口獲取ipString ip = httpdns.getIpByHostAsync(hostname);if(ip != null) {//如果ip不為null,直接使用該ip進行網絡請求List<InetAddress> inetAddresses = Arrays.asList(InetAddress.getAllByName(ip));Log.e("OkHttpDns", "inetAddresses:" + inetAddresses);return inetAddresses;}//如果返回null,走系統DNS服務解析域名return Dns.SYSTEM.lookup(hostname);} }
  • 創建OkHttpClient

創建OkHttpClient對象,傳入OkHttpDns對象代替默認Dns服務:

private void okhttpDnsRequest() {OkHttpClient client = new OkHttpClient.Builder().dns(OkHttpDns.getInstance(getApplicationContext())).build();Request request = new Request.Builder().url("http://www.aliyun.com").build();Response response = null;client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);DataInputStream dis = new DataInputStream(response.body().byteStream());int len;byte[] buff = new byte[4096];StringBuilder result = new StringBuilder();while ((len = dis.read(buff)) != -1) {result.append(new String(buff, 0, len));}Log.d("OkHttpDns", "Response: " + result.toString());}}); }
  • 總結

相比于通用方案,OkHttp+HttpDns有以下兩個主要優勢:

實現簡單,只需通過實現Dns接口即可接入HttpDns服務通用性強,該方案在HTTPS,SNI以及設置Cookie等場景均適用。規避了證書校驗,域名檢查等環節

IOS端:

基于NSURLProtocol可攔截iOS系統上基于上層網絡庫NSURLConnection/NSURLSession發出的網絡請求;

通過以下接口注冊自定義NSURLProtocol,用于攔截上層網絡請求,并創建新的網絡請求接管數據發送、接收、重定向等處理邏輯,將結果反饋給原始請求。

[NSURLProtocol registerClass:[CustomProtocol class]];

自定義NSURLProtocol處理過程概述:

  • 在canInitWithRequest中過濾要需要做HTTPDNS域名解析的請求;
  • 請求攔截后,做HTTPDNS域名解析;
  • 解析完成后,同普通請求一樣,替換URL.host字段,替換HTTP Header Host域,并接管該請求的數據發送、接收、重定向等處理;



作者:剛哥說
鏈接:https://www.jianshu.com/p/15ff2aeb5b5b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

總結

以上是生活随笔為你收集整理的HttpDNS功能说明及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。