前言 DNS身为TCP/IP协议族的“高层”(第7层,顶层),专职互联网的翻译任务,是一位出色的“翻译官”。本文将和大家一起接近、了解这位我们每天都要接触多次的翻译专家。

基本概念 DNS(Domain Name System):域名系统,DNS其实就是一个分布式的数据库系统,它主要的功能是提供主机名和IP地址之间的转换功能。我们每天在浏览器上输入的网址,比如www.jianshu.com,当你敲击回车时,就开始使用DNS服务了。最早,在DNS还没被发明之现,所有的地址都由一个中枢主机名进行管理,在那个“上古”时代,因为网站十分的稀少,管理难度还可以操控,但随着互联网的野蛮式发展,网站数量骤增,这种中央工作模式开始暴露出响应慢、安全性等一系列的问题,DNS适时的出现了。

DNS是如何工作的

我们还是用例子来说明。

172.27.0.14是笔者的主机(简称A),183.60.83.19是笔者网络运营商的DNS服务器(简称B)。 首先A主机发出了需要访问www.jianshu.com的请求,但这个域名,在系统内部要本不知道你要访问什么,TCP/IP协议只认IP地址,就像人脸识别一样,换个人就会识别错误。此时就需要一个称职的翻译官,将适合人记录的域名翻译成IP地址。这时候DNS进场了。 DNS首先会查找本机有无对应的DNS记录,windows系统会通过windows\system32\drivers\etc\hosts文件查找,Linux会通过/etc/hosts文件查找。 image.png host记录的格式如上,分为2个部分,前半部分是IP地址,后半部分是对应的域名。 如果host找不到记录,就会先发送DNS查询请求到指定的DNS服务器(这也就是为什么你的电脑为何必须指明DNS服务器地址的原因)。我们来看2条报文。

image.png 此时A通过54889端口(临时端口,使用UDP协议,如果你不清楚UDP协议是什么,请参考我的另一篇文档TCP和UDP,你要知道的123 (UDP篇)),和B主机的53端口通信,第1条报文是A主机发向B主机,+号表示递归查询,A表示查询类型,意思是需要查询IP地址,?表示这是一条查询报文。www.jianshu.com表示要查询的域名,33表示字节,UDP的首部长度是12个字节,域名长度为17个字节,查询类型和类占4个字节。 image.png 简单解释下域名长度为何是17个字节,以小数点为分隔单位,第1个3表示www占3个字节,第2个7表示jianshu占7个字节,第3个3表示com占3个字节,最后一个置0,表示后域名结束。 现在来看第2条报文,这是B服务器的响应报文,3/0/0表示返回了3资源记录(Resource Record),第2个0表示返回0条授权回答,第3个0表示返回了0条附加记录(一般都是0)。第1条资源记录类型为CNAME(域名规范名称),第2条就是A记录,表示返回对应CNAME的IP地址,第3条也是A记录返回的是该域名的另一个IP地址。有时候甚至可能返回N条A记录,这是因为使用了负载均衡技术,目的是增加服务提供的可靠性和并发处理能力。

此时DNS系统已经拿到了www.jianshu.com对应IP地址记录,即完成了翻译任务,并将其返回给系统,系统拿到了IP地址,将访问网页的请求进行打包封装,并指定报文的目的地址为刚刚获取到的域名对应IP地址,数据就顺利的发送到目的主机了。

至于DNS服务器是如何查询到域名IP地址的,后续有机会再跟大家汇报。