HTTP 系列之——DNS

DNS 简介

DNS 的全称为 Domain Name System(即域名系统),它是将域名解析成对应的 IP 地址。

想象以下我们打电话的场景,当我们要打电话给一个朋友时,我们往往不会直接拨他的号码(她倒是有可能),因为电话号码太长了,而且我们的朋友又太多,我们不可能记住每个人的电话号码。这个时候我们通常用用到同学录,通过人名找到电话号码,然后拨通电话。

和打电话一样,我们在访问一个地址的时候也需要先知道它的“号码”,而在计算机世界里,这个“号码”就是ip地址。例如我们在浏览器地址栏输入 http://www.baidu.com 并回车时,我们并不是直接与百度的服务器建立连接,然后开始下载资源。而是要先找到 www.baidu.com 这个域名对应的 ip 地址。由域名找到 ip 地址这个过程就叫做 DNS 解析。

域名结构

域名采用了层次结构的命名方法,如图

根域名其实是一个点, 所以最初的网址最后都是一个点(如mp.csdn.net.),只是所以的域名都有这个点,所以后来简化给去掉了。

域名服务器

现在我们已经了解了域名的结构了,那么这个结构应该交给谁去解析呢?

答案是遍布在世界各地的域名服务器,域名服务器就是安装了域名系统的主机,大致分为以下几类:

这里写图片描述

  • 根域名服务器:全球共有13个不同IP地址的根域名服务器,它们分别用一个英文字母命名(从 a 到 m)。实际上为了缩短dns报文传输路径,每个根域名服务器都会有它的镜像服务器。中国大陆地区就有6组根服务器镜像(F,I(3台),J,L)。当你对某个根域名服务器发出请求时,请求会被路由到离你最近的镜像服务器。所有的根域名服务器都知道所有顶级域名服务器的域名和ip地址,记住,这是域名解析的基础。
  • 顶级域名服务器:负责管理在该域名下注册的二级域名
  • 权限域名服务器:负责管理一个区域的域名
  • 本地域名服务器:当一个主机发出 DNS 查询请求的时候,首先到达的就是本地域名服务器。它为了帮你拿到目标地址的IP,会与以上几个域名服务器进行多次的交互,最终拿到IP返回给你。

域名解析过程

好了,现在我们已经知道有哪几类域名服务器了,并且知道它们是一级管着一级,我们就可以试着解析一个域名了。盗个图先

这里写图片描述

当你在浏览器地址栏敲下www.163.com 并回车的时候,域名解析的过程大概分为以下几个步骤:

  1. 浏览器会先从自身的 dns 缓存中寻找对应的 ip 地址,如果命中,解析结束。且这个 dns 缓存的时间可以通过 TTL(time to live)属性来设置
  2. 如果浏览器缓存没命中,请求就会来到操作系统,操作系统也有一个域名解析和缓存的过程。如果缓存命中,就把缓存中域名对应的 IP 地址返回给浏览器。
  3. 如果操作系统的缓存也没有命中,请求就会被发送到本地域名服务器(LDNS)。这台服务器通常用来处理一个区域(如一个城市)的 dns 请求,所有经过它解析的域名、ip队都会缓存在这里。有一个城市的人在访问它,可想而知它已经缓存了多少域名了,所以 80% 的 dns 解析到这里就可以完成了
  4. 如果连 LDNS 都没能解析你的请求,那么 LDNS 会求助于根域名服务器。根域名服务器会告诉 LDNS www.163.com 中这个顶级域名 .com 的服务器地址,让 LDNS 去它那儿查
  5. LDNS 接收到根域名服务器的相应后,会去请求顶级域名服务器 .com。该服务器知道之前有一家公司在自己这里注册了 163.com 这个域名服务器,然后会把 163.com 这个服务器的 ip 地址返回给 LDNS。
  6. LDNS 拿到 www.163.com 的 ip 地址后返回给你的主机,操作系统会把 这个 ip 缓存下来,以方便下次请求使用。然后把 ip 地址返回给浏览器
  7. 浏览器拿到 ip 后,也会自己缓存一份。

自此,DNS 解析流程结束。那么你要问题,浏览器拿到 ip 之后呢?拿到 ip 之后就可以与目标服务器建立 tcp 连接了啊!然后你们之间就可以相互发送秋波啦~

注意:很多DNS服务器进行配置的时候,仅支持UDP查询包。所以DNS在解析的过程中所发出的请求都是基于UDP协议的,而不是TCP。

报文结构

头部 

  1. 会话标识(2字节):是DNS报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应
  2. 标志(2字节):
    QR(1bit) 查询/响应标志,0为查询,1为响应
    opcode(4bit) 0表示标准查询,1表示反向查询,2表示服务器状态请求
    AA(1bit) 表示授权回答
    TC(1bit) 表示可截断的
    RD(1bit) 表示期望递归
    RA(1bit) 表示可用递归
    rcode(4bit) 表示返回码,0表示没有差错,3表示名字差错,2表示服务器错误(Server Failure)
  3. 数量字段(总共8字节):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions表示查询问题区域节的数量,Answers表示回答区域的数量,Authoritative namesversers表示授权区域的数量,Additional recoreds表示附加区域的数量

 正文

  1. Queries区域1.1 查询名:长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名),一般的格式如下图所示。1.2 查询类型:
    类型 助记符 说明
    1 A 由域名获得IPv4地址
    2 NS 查询域名服务器
    5 CNAME 查询规范名称
    6 SOA 开始授权
    11 WKS 熟知服务
    12 PTR 把IP地址转换成域名
    13 HINFO 主机信息
    15 MX 邮件交换
    28 AAAA 由域名获得IPv6地址
    252 AXFR 传送整个区的请求
    255 ANY 对所有记录的请求

    这里给一个域名,可用来模拟DNS的查询类型,可以选择不同的类型,比如A,PTR等玩一下, https://www.nslookuptool.com/chs/       
    1.3 查询类:通常为1,表明是Internet数据

  2. 资源记录(RR)区域(包括回答区域,授权区域和附加区域)

该区域有三个,但格式都是一样的。这三个区域分别是:回答区域,授权区域和附加区域

2.1. 域名(2字节或不定长):它的格式和Queries区域的查询名字字段是一样的。有一点不同就是,当报文中域名重复出现的时候,该字段使用2个字节的偏移指针来表示。比如,在资源记录中,域名通常是查询问题部分的域名的重复,因此用2字节的指针来表示,具体格式是最前面的两个高位是 11,用于识别指针。其余的14位从DNS报文的开始处计数(从0开始),指出该报文中的相应字节数。一个典型的例子,C00C(1100000000001100,12正好是头部的长度,其正好指向Queries区域的查询名字字段)。

2.2 查询类型:表明资源纪录的类型,见1.2节的查询类型表格所示 

2.3 查询类:对于Internet信息,总是IN

2.4 生存时间(TTL):以秒为单位,表示的是资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,它同时也可以表明该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值(比如86400,这是一天的秒数)。

2.5. 资源数据:该字段是一个可变长字段,表示按照查询段的要求返回的相关资源记录的数据。可以是Address(表明查询报文想要的回应是一个IP地址)或者CNAME(表明查询报文想要的回应是一个规范主机名)等。

你可能感兴趣的:(HTTP 系列之——DNS)