本文转载自HttpDns 原理是什么

什么是 DNS

DNS(Domain Name System,域名系统),DNS 服务用于在网络请求时,将域名转为 IP 地址。能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。

传统的基于 UDP 协议的公共 DNS 服务极易发生 DNS 劫持,从而造成安全问题。

DNS 域名系统结构

Root 域名:DNS 域名使用时,规定由尾部句号来指定名称位于根或更高级别的域层次结构

Top Level 顶级域名:用来指示某个国家、地区或组织使用的名称的类型名称。如 .com

Second Level 域名:个人或组织在 Internet 上使用的注册名称。如 linkedkeeper.com

Third Level 域名:已注册的二级域名派生的域名。如 misc.linkedkeeper.com

DNS 解析过程

  1. 浏览器中输入 www.linkedkeeper.com,发出解析请求。

  2. 本机的域名解析器 resolver 程序查询本地缓存和 host 文件中是否为域名的映射关系,如果有则调用这个 IP 地址映射,完成解析。

  3. 如果 hosts 与本地解析器缓存都没有相应的网址映射关系,则本地解析器会向 TCP/IP 参数中设置的首选 DNS 服务器(我们叫它 Local DNS 服务器)发起一个递归的查询请求。

  4. 服务器收到查询时,如果要查询的域名由本机负责解析,则返回解析结果给客户机,完成域名解析,此解析具有权威性。如果要查询的域名,不由 Local DNS 服务器解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性。

  5. 如果 Local DNS 服务器本地区域文件与缓存解析都失效,则根据 Local DNS 服务器的设置(是否递归)进行查询,如果未用开启模式,Local DNS 就把请求发至13台 Root DNS。如果用的是递归模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。

  6. Root DNS 服务器收到请求后会判断这个域名是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP。

  7. Local DNS 服务器收到 IP 信息后,将会联系负责 .com 域的这台服务器。

  8. 负责 .com 域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .com 域的下一级 DNS 服务器地址给本地 DNS 服务器。

  9. 当 Local DNS 服务器收到这个地址后,就会找 linkedkeeper.com 域服务器,10、11重复上面的动作,进行查询。

  10. 最后 www.linkedkeeper.com 返回需要解析的域名的 IP 地址给 Local DNS 服务器。

  11. Local DNS 服务器缓存这个解析结果(同时也会缓存,6、8、10返回的结果)。

  12. Local DNS 服务器同时将结果返回给本机域名解析器。

  13. 本机缓存解析结果。

  14. 本机解析器将结果返回给浏览器。

  15. 浏览器通过返回的 IP 地址发起请求。

递归查询和迭代查询

  • 递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。
  • 迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:你下一步应当向哪一个域名服务器进行查询。然后让本地域名服务器进行后续的查询,而不是替本地域名服务器进行后续的查询。

由此可见,客户端到 Local DNS 服务器,Local DNS 与上级 DNS 服务器之间属于递归查询;DNS 服务器与根 DNS 服务器之前属于迭代查询。

实际环境中,因为采用递归模式会导致 DNS 服务器流量很大,所以现在大多数的 DNS 都是迭代模式。

结合 Wireshark 分析 DNS 协议

HttpDns 是什么

HTTPDNS 利用 HTTP 协议与 DNS 服务器交互,代替了传统的基于 UDP 协议的 DNS 交互,绕开了运营商的 Local DNS,有效防止了域名劫持,提高域名解析效率。另外,由于 DNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确定位客户端地理位置、运营商信息,从而有效改进调度精确性。

HttpDns 主要解决的问题

  • Local DNS 劫持:由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问 domain 解析过程,所以从根本避免了劫持问题。
  • 平均访问延迟下降:由于是 IP 直接访问省掉了一次 domain 解析过程,通过智能算法排序后找到最快节点进行访问。
  • 用户连接失败率下降:通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。

如何进行改造支持 HttpDns

目前,国内有一部分厂商已经提供了这个解析服务,可以直接使用第三方服务。目前,提供 HttpDns 解析服务的有:阿里云HttpDNS

阿里云的 HttpDNS 服务的 API 比较标准,直接发一个 Get 请求,带上请求参数,返回结果以 json 返回。

http://203.107.1.1/d?host=www.linkedkeeper.com

请求成功时,返回结果如下:

{`` ``"host"``: ``"www.linkedkeeper.com"``,`` ``"ips"``: [``  ``"115.238.23.241"``,``  ``"115.238.23.251"`` ``],`` ``"ttl"``: 57``}

在移动端,将由 HttpDns 获得的 IP 地址在原有 URL 的基础上,将域名替换为 IP,然后用新的 URL 发起 HTTP 请求。

HttpDns 原理是什么的更多相关文章

  1. HttpDns原理

    什么是 DNS DNS(Domain Name System,域名系统),DNS 服务用于在网络请求时,将域名转为 IP 地址.能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数 ...

  2. DNS相关知识

    1 DNS解析过程详解 2 DNS原理总结及其解析过程详解 3 DNS原理及其解析过程[精彩剖析] 4 DNS域名解析原理 5 dig挖出DNS的秘密 6 nslookup通往DNS的桥梁 7 DNS ...

  3. APP端的网络优化(DNS优化,HTTP优化)

    一.使用httpDNS优化DNS解析和缓存 一般来说在App内用域名发送请求都要经过DNS解析出ip,然后再根据ip去拿对应的资源,这个过程中,如果LocalDNS中存在这个域名对应的ip,就会直接返 ...

  4. 百度APP移动端网络深度优化实践分享(一):DNS优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<一>DNS优化>,感谢原作者的无私分享. 一.前言 网络优化是客户端几大技术方 ...

  5. 5-网宿CDN客户端推流NGB

    网宿NGB调度系统(类似httpdns原理)从服务端分发给客户端推流IP,实现基于APP realip精准调度模式. 参考官网介绍:https://www.wangsu.com/content/det ...

  6. 双非本科字节跳动Android面试经验和心得体会分享(已拿offer)

    新人报道,没有什么可分享的,就记录一些自己求职的体会和心得. 我是在校招补录的时候参加了今日头条的招聘,岗位是Android开发,最后成功拿到了入场券.但是这也丝毫不值得骄傲,大家都知道:技术日新月异 ...

  7. 2579页阿里P8Android学习笔记在互联网上火了,完整版开放下载

    笔记作者:来自于阿里P8级大神: Mark 笔记特点:条理清晰,理论+实战+源码,含图像化表示更加易懂. 内容概要:Android 相关,性能优化,Java 相关,Kotlin 相关,网络相关,插件化 ...

  8. 说实话,Android开发月薪3W,谁不酸呢?

    近期有个网友在某匿名区晒字节跳动Offfer,毕业一年月薪3W,引发众多读者羡慕,纷纷留言酸了.酸了.但进大厂的要求还是蛮高的,需要在技术实力上有一定的积累,今天给大家分享一份高质量笔记, 助力大家技 ...

  9. Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成

    一.前言 谈到优化,首先第一步,肯定是把一个大功能,拆分成一个个细小的环节,再单个拎出来找到可以优化的点,App 的网络优化也是如此. 在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认 ...

随机推荐

  1. Spark JDBC系列--取数的四种方式

    Spark JDBC系列--取数的四种方式 一.单分区模式 二.指定Long型column字段的分区模式 三.高自由度的分区模式 四.自定义option参数模式 五.JDBC To Other Dat ...

  2. Spring Boot整合Spring Data JPA

    1.JPA 2.Spring Data JPA 3.导入依赖 4.连接数据库 5.实体类 6.Repository 7.测试 1.JPA JPA是Java Persistence API的简称,中文名 ...

  3. docker 安装 nexus3 初始密码不再是admin123

    最近在docker上安装 nexus3 ,参照之前博客都提示 初始密码是admin/admin123 但是登录的时候出现如下提示: 很显然提示  admin用户的密码在/nexus-data/admi ...

  4. (转)pip和easy_install使用方式

    easy_install 跟 pip 都是 Python 的套件管理程式,有了它們,在使用 Python 開發程式的時候會帶來不少方便. easy_install 和 pip 有什麼不一樣?據 pip ...

  5. PHP-电脑搭建服务器

    PHP-电脑搭建服务器 一 材料 花生壳   php   mysql    apache(我使用的是phpstudy) 二 实现 (一)phpstudy安装 (二)花生壳安装及认证 (二)相关设置 1 ...

  6. 2020牛客暑期多校训练营(第八场)Game SET

    传送门:Game SET 题意 一套牌有四种属性,每种属性都有三种特征,shapes (one, two, or three), shape (diamond, squiggle, or oval), ...

  7. 【noi 2.6_7113】Charm Bracelet(DP)

    题意:N个饰物,有重量和渴望程度.问在M的重量限制内能达到的最大的渴望度. 解法:经典的01问题,但有一个小技巧值得记住:用if比较大小比调用max函数快了不少,这题有100ms左右. 1 #incl ...

  8. Slim Span POJ 3522 (最小差值生成树)

    题意: 最小生成树找出来最小的边权值总和使得n个顶点都连在一起.那么这找出来的边权值中的最大权值和最小权值之差就是本题的结果 但是题目要求让这个输出的结果最小,也就是差值最小.那么这就不是最小生成树了 ...

  9. Java RMI 实现一个简单的GFS(谷歌文件系统)——背景与设计篇

    目录 背景 系统设计 1. 系统功能 2. Master组件 2.1 命名空间 2.2 心跳机制 2.3 故障恢复和容错机制 3. ChunkServer组件 3.1 本地存储 3.2 内存命中机制 ...

  10. 调用其他文件__name__=='__main__'下代码

    如何调用其他文件__name__=='__main__'下代码 使用os.system()或者subprocess.run()执行该文件,用这种方法相当于直接创建了一个子进程,新调用的py不影响当前调 ...