写这篇文章主要是因为准备搞一个httpDNS和http2对组内的分享,然后刚好花一些时间去画图。并且整理一些素材,刚好就把整理的一些内容整理成具体的文章。
在我们学习之前我们可以去思考一些问题:
1)DNS是干嘛用的?为什么要有DNS?
2)DNS是怎么获取到IP?
3)DNS是怎么通信,通信协议是什么?
针对这些问题我们可以展开我们的话题。
说到DNS,其实可以用一词概述域名系统,域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
域名系统(Domain Name System,DNS)是Internet上解决网上机器命名的一种系统。就像拜访朋友要先知道别人家怎么走一样,Internet上当一台主机要访问另外一台主机时,必须首先获知其地址,TCP/IP中的IP地址是由四段以“.”分开的数字组成,记起来总是不如名字那么方便,所以,就采用了域名系统来管理名字和IP的对应关系。
通过上面描述其实我们可以知道DNS其实就是做IP解析使用,当然我们在真实场景中IP是比较难去记忆的。在我们浏览器的对网站访问过程中都是采用域名的形式去访问网站。但是在我们客户端机器对网站的服务器访问过程中,其实是通过IP去访问。所以我们需要通过域名经过DNS解析为IP达到最终对网站服务器访问,进行数据传输后得到我们最终可以看到页面。
当一个我们在地址栏输入www.xueersi.com时,DNS解析有大致10个过程,如下:
浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果您是mac或unix/linux可以在/etc/hosts中设置。如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。
如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析。
根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如 .com .cn .org等)地址。
此时LDNS再发送请求给上一步返回的gTLD。
接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器。
Name Server根据映射关系表找到目标ip,返回给LDNS。
LDNS缓存这个域名和对应的ip。
LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束。
最终我们用户得到IP后浏览器本身就会通过IP对服务器进行访问从而得到我们想要看到的页面。
我们可以通过WireShark抓一下DNS的包
(以上的数据包我们情绪的可以看到我们对www.xueersi.com解析时,我们有两个数据包。一个是query、另一个是query response)
抓取对应数据包后,我们可以得到query包以下十六进制信息:
0000 e4 f3 e8 ae fa 9b 6c 96 cf d9 f9 5d 08 00 45 00 ......l....]..E.
0010 00 3d f4 3c 00 00 40 11 e0 8a c0 a8 12 97 c0 a8 .=.<..@.........
0020 12 01 ea 6e 00 35 00 29 77 7a b1 1b 01 00 00 01 ...n.5.)wz......
0030 00 00 00 00 00 00 03 77 77 77 07 78 75 65 65 72 .......www.xueer
0040 73 69 03 63 6f 6d 00 00 01 00 01 si.com.....
可以通过nslookup www.xueersi.com 查看下DNS解析情况
针对以上十六我们可以通过一张图去看看DNS的结构:
根据上图,我们主要关注传输层和应用层两部分的数据。可以得知,我们传输层其实是采用UDP协议进行通信。然后我们应用层则分为两部分:一部分是DNS 的header头部分;另一部分是DNS的数据区域部分。我们主要说一下应用层部分。
DNS header头分为6个主要字段Transaction ID(会话标识)、Flags(标志)、Questions(问题数)、Answer RRs(回答资源记录数)、Authority RRs(授权资源记录数)、Additional RRs(附加资源记录数)总共占用12个字节;
另外DNS的数据区域部分,是根、Questions(问题数)、Answer RRs(回答资源记录数)、Authority RRs(授权资源记录数)、Additional RRs(附加资源记录数)这几个字段的数量去决定的。在我们图中只有Questions有值1。所以DNS的数据区域只有Queries(查询问题区域)
我们搞清楚了query数据包,那么我们继续往下看看!
在我们DNS请求访问域名服务器,域名服务器用来干嘛?里面保存了很多域名和相对应ip的记录,记录一般叫作域名资源记录 , 它有5个元素分别如下:
Domain_name:指出这条记录适用于哪个域名;
Time_to_live:用来表明记录的生存周期,也就是说最多可以缓存该记录多长时间
Class:一般总是IN;
Type:记录的类型;
Value:记录的值,如果是A记录,则value是一个IPv4地址。
然而我们图中可以看到部分元素的身影。
记录的类型如下:
类型 | 助记符 | 说明 |
---|---|---|
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只是为了获取IP使用,那么我们直接有IP的话,不就可以避开DNS解析?
确实是这样的。
我们可以模拟试试。
通过curl命令就可以模拟代理某个IP。 curl -x ip:80 http://www.xueersi.com 就可以模拟。
按照如上演示,其实我们就要思考另外一个问题,就是实际场景中IP肯定是可变的。这时候就可以使用到httpDNS技术。
当然我们要思考另外一个问题DNS是可以劫持的,这样会有安全性问题。通过ip代理直接访问的形式,其实就绕过了DNS。也可以保证安全性。
1.DNS解析是为了获取IP地址;
2.DNS获取IP采用UDP协议进行通信;
3.在我们去做链路优化的过程中,如果针对DNS的优化。那么我们首先考虑的问题就是快速获取到我们的IP。在获取IP的过程中,那么我们的IP会涉及到变化。(这时候其实我们就可以使用到httpDNS技术)
WireShark抓DNS请求和回复数据报的分析
https://blog.csdn.net/u011068702/article/details/86323447
DNS协议详解及报文格式分析
https://jocent.me/2017/06/18/dns-protocol-principle.html#_label1_1
【协议分析】rpcx网络协议分析之kcp数据传输
https://blog.csdn.net/byxiaoyuonly/article/details/105080829