DNS查询得到IP

如果输入的是域名,需要进行dns解析成IP,大致流程:

  • 如果浏览器有缓存,直接使用浏览器缓存,否则使用本机缓存,再没有的话就是用host
  • 如果本地没有,就向dns域名服务器查询(当然,中间可能还会经过路由,也有缓存等),查询到对应的IP
  • 注意,域名查询时有可能是经过了CDN调度器的(如果有cdn存储功能的话)

而且,需要知道dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑dns-prefetch优化

为什么需要ip

TCP/IP 网络是通过 IP 地址来确定通信对象的,不知道 IP 地址就无法将消息发送给对方,因此,在委托操作系统发送消息时,必须要先查询好对方 的 IP 地址。

让人来使用名称,让路由器来使用IP地址。 为了填补两者之间的障碍,需要有一个机制能够通过名称来查询IP地址,或者通过IP 地址来查询名称,这个机制就是DNS

实际的IP地址

实际的 IP 地址是一串 32 比特的数字,按照 8 比特(1 字节)为一组分成 4 组,分别用十进制表示,然后再用圆点隔开。

在 IP 地址的规则中,网络号和主机号连起来总共 32 比特,但这两部分的具体结构是不固定的(在组建网络时,用户可以自行决定它们之间的分配关系),无法区分哪部分是网络号,哪部分是主机号。因此:需要另外的附加信息来表示 IP 地址的内部结构。这就需要用到子网掩码,子网掩码的格式是一 串与IP地址长度相同的32比特数字,左边一半都是1,右边一半都是0。子网掩码为1的部分表示网络号,子网掩码为0的部分表示主机号。

浏览器是怎么知道DNS解析服务器

一般宽带服务商都会提供DNS服务器,谷歌还为公众提供了两个免费的DNS服务,分别为8.8.8.8和8.8.4.4,取这两个IP地址是为了容易记住,当你的DNS服务不好用的时候,可以尝试改成这两个。

入网的设备是怎么获取到这些IP地址的呢?是通过动态主机配置协议(DHCP),当一台设备连到路由器之后,路由器通过DHCP给它分配一个IP地址,并告诉它DNS服务器。

当我的电脑连上wifi的时候,会发一个DHCP Request的广播,路由器收到这个广播后就会向我的电脑分配一个IP地址并告知DNS服务器。这个时候系统就有DNS服务器了,Chrome是调res_ninit这个系统函数(Linux)去获取系统的DNS服务器,这个函数是通过读取/etc/resolver.conf这个文件获取DNS:

浏览器是如何向DNS服务器发出查询

  • 浏览器搜索自身的DNS缓存:
    • 首先浏览器会去搜索自身的DNS缓存,看缓存有没有过期,过期的话缓存的解析就结束了(chrome缓存的时间只有一分钟,查看chrome的缓存可打开:chrome://net-internals/#dns )。
  • 搜索操作系统自身的DNS缓存:
    • 如果浏览器没有找到缓存或者缓存过期失效,浏览器就会搜索操作系统自身的缓存,没有找到或者失效,解析结束(操作系统的缓存:window系统是一天,mac系统严格根据DNS协议中的TTL)。
  • 读取本地的hosts文件:
    • 若操作系统的缓存也没有找到或失效,浏览器就会去读取本地的hosts文件(Hosts文件也可以建立域名到IP地址的绑定关系,可以通过编辑Hosts文件来达到名称解析的目的。 例如,我们需要屏蔽某个域名时,就可以将其地址指向一个不存在IP地址,以达到屏蔽的效果)。
  • 浏览器发起一个DNS的系统调用:
    • hosts中没有找到对应的配置项的话,浏览器发起一个DNS的调用(向本地主控DNS服务,一般来说是你的运营商提供的)。

解析器与DNS服务器之间的交互过程

通过 DNS 查询 IP 地址的操作称为域名解析,负责执行解析这一操作的就叫解析器。 解析器实际上是一段程序,它包含在操作系统的 Socket 库中。整个解析器的工作流程图:

  • 调用解析器后,解析器会向 DNS 服务器(运营商提供的)发送查询消息。
  • 运营商服务会先查找自身缓存找到对应条目,没有过期,解析成功,若没找到对应条目,主控服务器会代替浏览器发起一个迭代的DNS解析的请求,先查找根域的),运营商服务器拿到域名的IP,返回给操作系统的内核,同时缓存在了自己的缓存区,操作系统内核从DNS服务商拿来的IP地址返回给浏览器。
  • 浏览器再向 Web 服务器发送消息时,只要从该内存地址取出 IP地址,将它与 HTTP 请求消息一起交给操作系统

DNS服务器的基本工作

DNS 服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应 来自客户端的查询消息包含以下 3 种信息

  • 域名:服务器、邮件服务器(邮件地址中@后面的部分)的名称 。
  • Class:用来识别网络的信息(在最早设计 DNS 方案时,DNS 在互联网以外的其他网络中的应用也被考虑到了。不过,如今除了互联网并没有其他的网络了,因此 Class 的值永远是代表互联网的 IN )。
  • 记录类型 :表示域名对应何种类型的记录(例如,A :表示域名对应的是 IP 地址,MX :表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息也会不同 )。

常见的DNS记录类型如下。

  1. A:地址记录(Address),返回域名指向的IP地址。
  2. NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
  3. MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
  4. CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。
  5. PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名,详见下文。

DNS服务上的信息是如何在 DNS 服务器上注册并保存的

DNS 服务器中的所有信息都是按照域名以分层次的结构来保存的,层次有点号来划分:主机名.次级域名.顶级域名.根域名(host.sld.tld.root),越靠近右边级别越高,所有域名后面都是带有根域的,但是一般都省略掉了。

运营商DSN服务器发起的迭代请求

前面说过若运营商服务里没有找到对应的条目,就会发起一个DNS迭代请求,首先就是查找根域服务器,那么运营商的服务了一定要保存有根域服务的IP地址。因为全球共有13台根逻辑域名服务器:A-M,2014年统计的真实的根服务器有386台,将根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中也不是什么难事。如何实现呢:根域 DNS 服务器的相关信息已经包含在 DNS 服务器程序的配置文件中了,因此只要安装了 DNS 服务器程序,这些信息也就被自动配置好了。

完整的DNS解析过程

1.系统会检查浏览器缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。浏览器缓存是受这个域名的失效时间和缓存的空间大小控制的。

2.如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中即为本地的Host文件。

3.如果本地Host文件中没有那么操作系统会把这个域名发送给这里设置的LocalDNS,也就是本地区的域名服务器。这个DNS通常都提供给你本地互联网接入的一个DNS解析服务。这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约90%的域名解析都到这里就已经完成了,所以LDNS主要承担了域名的解析工作。

4.如果LDNS仍然没有命中,就直接到Root Server域名服务器请求解析

5.根域名服务器返回给本地域名服务器一个所查询的域的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如.com,.cn、.org等。全球只有13台左右。

6.本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求。

7.接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成

8.Name Server域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器。

9.返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。

10.把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。以上的流程可以简化为下图

HTTP劫持

DNS劫持

DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能访问或访问的是假网址。其实本质就是对DNS解析服务器做手脚,或者是使用伪造的DNS解析服务器可以通过下图来展示 从图中可以看出红色的是劫持的流程,劫持后将你的请求转发到一个虚假的服务器。

  • 解决办法 DNS的劫持过程是通过攻击运营商的解析服务器来达到目的。我们可以不用运营商的DNS解析而使用自己的解析服务器或者是提前在自己的App中将解析好的域名以IP的形式发出去就可以绕过运营商DNS解析,这样一来也避免了DNS劫持的问题。

内容劫持

内容劫持网上很少有提到,这也是在做httpDNS SDK所遇到的一个问题,其实内容劫持一开始的出发点是好的,是运营商为了加快用户的访问速度同时减少自己的流量损耗而做的一个缓存机制,用户在像服务器请求数据的时候运营商会把用户的请求转移到这个缓存池中,如果缓存中有就直接返回,没有的话再去像服务器请求然后拦截并缓存服务端给用户的回调数据,这样一来可以极大的降低运营商像服务器请求的次数,也能加快用户的访问,所以出发点是好,但是一些非法的商家对缓存池内部做一次些处理就是直接对返回的内容进行修改,这样一来我们就会接受到错误的数据.黄色线条就是比价危险的了,因为回调的数据很可能已经被篡改过。

results matching ""

    No results matching ""