你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

前言chrome

前面的章节介绍了数据链路层,网络层和传输层的协议,今天咱们一块儿看下应用层的协议——DNS。数据库

咱们平时上网的时候想访问某个网站,须要在浏览器中输入URL网址,咱们输入的通常是域名domain。要想访问某个网站,咱们必须知道该网站的IP地址,这时候就须要有一个东西告诉咱们域名和IP的映射关系,域名解析系统——DNS就能够实现这一个目的。编程

若是说ARP协议是用来将IP地址转换为MAC地址,那么DNS协议则是用来将域名转换为IP地址(也能够将IP地址转换为相应的域名地址)。windows

正文浏览器

咱们都知道,TCP/IP中使用的是IP地址和端口号来肯定网络上某一台主机上的某一个程序,难免有人有疑问,为何不用域名来直接进行通讯呢?缓存

  1. 由于IP地址是固定长度的,IPv4是32位,IPv6是128位,而域名是变长的,不便于计算机处理。服务器

  2. IP地址对于用户来讲不方便记忆,但域名便于用户使用,例如www.baidu.com这是百度的域名。

总结一点就是IP地址是面向主机的,而域名则是面向用户的。网络

1 什么是DNSdom

DNS是 Domain Name System 的缩写,也就是 域名解析系统,是因特网的一项核心服务,它做为能够将域名和IP地址相互映射的一个分布式数据库,可以令人更方便的访问互联网,而不用去记住可以被机器直接读取的IP地址。分布式

咱们能够将域名系统(DNS)理解成因特网的电话簿。人类经过域名在线访问信息,如www.baidu.com或www.taobao..com。Web浏览器经过Internet协议(IP)地址进行交互。DNS将域名转换为IP地址,以便浏览器能够加载Internet资源。

域名服务主要是基于UDP实现的,服务器的端口号为53。

2 DNS的域名层级

域名系统必需要保持惟一性。为了达到惟一性的目的,因特网在命名的时候采用了层次结构的命名方法:

  1. 每个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和链接符(-)组成

  2. 标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label)。

  3. 每一个标号应该在63个字符以内,每一个标号均可以当作一个层次的域名。

  4. 级别最低的域名写在左边,级别最高的域名写在右边。

关于域名的层次结构:

一、在全部域名的尾部,实际上都有一个根域名,例如www.baidu.com真正的域名是www.baidu.com.root,简写为www.baidu.com.。由于,根域名.root对于全部域名都是同样的,因此平时是省略的。

二、顶级域名,如 .com,.cn .net等。

顶级域名又分为三类:

一是国家和地区顶级域名,目前200多个国家都按照ISO3166国家代码分配了顶级域名,例如中国是cn,日本是jp等;

二是通用顶级域名,例如表示工商企业的.com,表示网络提供商的 .net,表示非盈利组织的 .org等。

三是新顶级域名,如通用的.xyz、表明“高端”的.top、表明“红色”的.red、表明“人”的.men等一千多种。

三、次级域名,如 baidu.com 里的 baidu,这个是用户能够进行注册购买的。

四、主机域名,好比 baike.baidu.com 里的baike,这个是用户可分配的。

3 DNS的工做原理
当一个用户在地址栏输入www.taobao.com时,DNS解析有大体十个过程,以下:

  1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,若是有,解析结束。

举例:在chrome浏览器的地址栏中输入 chrome://net-internals/#dns 并回车,该页面会显示当前全部DNS缓存,经过点击“Clear host cache”,能够清空全部DNS缓存。

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

二、若是浏览器缓存中没有(专业点叫还没命中),浏览器会检查操做系统缓存中有没有对应的已解析过的结果。而操做系统也有一个域名解析的过程。在windows中可经过c盘里一个叫hosts的文件来设置,若是你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

可是这种操做系统级别的域名解析规程也被不少***利用,经过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,形成所谓的域名劫持。因此在windows7中将hosts文件设置成了readonly,防止被恶意篡改。

  1. 若是至此尚未命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器通常在你的城市的某个角落,距离你不会很远,而且这台服务器的性能都很好,通常都会缓存域名解析结果,大约80%的域名解析到这里就完成了。

  2. 若是LDNS仍然没有命中,就直接跳到根域名服务器请求解析。

  3. 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址。

  4. 此时LDNS再发送请求给上一步返回的主域名服务器 (gTLD)。

  5. 接受请求的主域名服务器gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器。

  6. Name Server根据映射关系表找到目标ip,返回给LDNS。

  7. LDNS缓存这个域名和对应的ip。

  8. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中。

总结:

简单来讲,一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操做系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,若是未命中则访问OS缓存,最后再访问DNS服务器(通常是ISP提供),而后DNS服务器会递归式的查找域名记录,而后返回。

4 DNS报文结构

DNS报文格式头部

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

该部分中每一个字段含义以下:

  • 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。经过它能够区分 DNS 应答报文是对哪一个请求进行响应的。

  • 标志:DNS 报文中的标志字段。

  • 问题计数:DNS 查询请求的数目。

  • 回答资源记录数:DNS 响应的数目。

  • 权威名称服务器计数:权威名称服务器的数目。

  • 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。

标志Flags 字段中每一个字段的含义以下:

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

AA 受权应答(Authoritative Answer) - 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的受权解析服务器。注意由于别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。

TC 截断(TrunCation) - 用来指出报文比容许的长度还要长,致使被截断。

RD 指望递归(Recursion Desired) - 这个比特位被请求设置,应答的时候使用的相同的值返回。若是设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。

RA 支持递归(Recursion Available) - 这个比特位在应答中设置或取消,用来表明服务器是否支持递归查询。

RCODE 应答码(Response code) - 这4个比特位在应答报文中设置,表明的含义以下:

0 没有错误。

1 报文格式错误(Format error) - 服务器不能理解请求的报文。

2 服务器失败(Server failure) - 由于服务器的缘由致使没办法处理这个请求。

3 名字错误(Name Error) - 只有对受权域名解析服务器有意义,指出解析的域名不存在。

4 没有实现(Not Implemented) - 域名服务器不支持查询类型。

5 拒绝(Refused) - 服务器因为设置的策略拒绝给出应答。好比,服务器不但愿对某些请求者给出应答,或者服务器不但愿进行某些操做(好比区域传送zone transfer)。

6-15 保留值,暂时未使用。

查询报文格式

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

该部分中每一个字段含义以下:

  • 查询名:通常为要查询的域名,有时也会是 IP 地址,用于反向查询。

  • 查询类型:DNS 查询请求的资源类型。一般查询类型为 A 类型,表示由域名获取对应的 IP 地址。

  • 查询类:地址类型,一般为互联网地址,值为 1。

查询名QNAME要查找的名字,是一个或多个标识符的序列。每一个标识符以首字节的计数值来讲明随后标识符的字节长度,每一个名字以最后字节为0结束,长度为0的标识符是根标识符。单个标识符最大长度为63字节。

查询类型QTYPE 每一个问题有一个查询类型。2个字节表示查询类型,取值能够为任何可用的类型值,以及通配码来表示全部的资源记录。

DNS的查询类型有20种,比较经常使用的查询类型有有A,NS,CNAME,PTR,MX等五种类型。如下分别介绍五种类型:

1)A:由DNS域名到IP地址的查询,即正向查询,编程中由函数gethostbyname实现。

2)PTR:由IP到域名的查询,即逆向查询,编程中由函数gethostbyaddr。

3)NS:查询解析的名字服务器(Name server)。

4)CNAME:查询DNS的别名。

5)MX:邮箱服务器查询。

应答报文格式

资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示。

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

资源记录格式中每一个字段含义以下:

  • 域名:DNS 请求的域名。

  • 类型:资源记录的类型,与问题部分中的查询类型值是同样的。

  • 类:地址类型,与问题部分中的查询类值是同样的。

  • 生存时间:以秒为单位,表示资源记录的生命周期,通常用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也能够代表该资源记录的稳定程度,稳定的信息会被分配一个很大的值。

  • 资源数据长度:资源数据的长度。

  • 资源数据:表示按查询段要求返回的相关资源记录的数据。

资源记录部分只有在 DNS 响应包中才会出现。

5 实战

搭建拓扑环境以下:

HTTP客户端访问HTTP服务器时,须要经过DNS服务器将域名解析成IP地址,从而实现访问。

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

HTTP客户端配置:

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

DNS服务器的配置:

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

HTTP服务器的配置:

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

在ENSP模拟客户端访问HTTP服务器经过DNS地址解析的过程

一、在HTTP客户端输入网址URL: http://www.baidu.com

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

因为配置了DNS服务器,客户端发动DNS请求报文给DNS服务器,请求服务器的IP地址。

二、在接口下抓取到DNS请求报文和应答报文:

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

三、根据DNS请求报文能够看到:这个是HTTP客户端发送给DNS服务器的DNS请求报文,请求域名www.baidu.com的IP地址

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

四、根据DNS应答报文能够看到:这个是DNS服务器回送给HTTP客户端的DNS回应报文,告诉客户端域名www.baidu.com的IP地址是192.168.1.2。

你知道上网时输入的URL是怎么解析成IP地址的吗?一文带你搞懂DNS

相关文章
相关标签/搜索