一、前言
最近准备写一个系列文章《在浏览器输入URL按下回车到显示网页经历了什么》,本文是系列文章的第一篇,也就是输入地址后第一步进行的操作,DNS解析,将域名解析成IP地址,进而通过TCP/IP建立链接完成浏览器和服务器通信过程
本篇文章主要参考以下文章 + 自己的理解
二、DNS
2.1 DNS是干什么的
DNS解析就是做了一件事,将域名地址转化成IP地址
包括电脑中Internet设置
中配置的DNS也是这个东西,配置的DNS决定使用什么DNS服务器来解析所有的请求
再就是以前碰到过的问题,能上QQ,不能访问网页,也有可能时DNS的问题(搜索DNS相关资料时也看到过)
2.2 为什么需要DNS
数据在传输层的传输是通过IP数据包,数据包包括两部分,固定首部和数据部分,首部中的源地址和目的地址都是IP协议,也就是IP地址,也就是说只有知道IP地址,才知道这个数据包应该被送到哪里,才能完成通信
2.3 DNS本质是什么
DNS是域名系统的缩写,它所提供的服务是用来将主机名和域名转换为IP地址的工作,是一个分布式的数据库
实质上解析域名是由一个域名解析服务器完成的,在域名服务器中保存着很多域名和IP的映射关系。想知道域名对应的IP,就向这个服务器发送一个请求,它就会告诉你IP地址是多少。
然而这是最早期的情况,那时候世界上网民还很少,只需要一个域名服务器。现在的域名系统采用的是分布式集群工作方式。
2.4 DNS相关概念
在说解析过程之前有些概念要提一下
2.4.1 域名结构
域名地址通常是如下格式,拿百度百科来说
www.baike.baidu.com,其中com是顶级域名,baidu是二级域名,baike是三级域名,www是四级域名
各级域名由上一级域名管理, baike这个三级域名由baidu这个二级域名管理,baidu由顶级域名com管理,根据这一规则,也就可以确定一种域名查找方式。
以下是域名层次结构示意图,当然不止三级域名,三级域名下还可以有四级域名等
2.4.2 域名服务器分类
域名服务器主要分为三类,但是实际还存在一个本地域名服务器,在域名解析过程中扮演者非常重要的角色
① 根域名服务器:
所有根服务器保存着所有顶级服务器的域名和IP地址,如果有请求发送到跟域名服务器,根域名服务器会根据要解析的域名告诉请求者应该去哪个顶级域名服务器查询,比如域名www.baidu.com要到com域名服务器解析
② 顶级域名服务器:
负责管理在该顶级域名服务器注册的二级域名
③ 权限域名服务器
负责一个“区”的域名服务器。
每台主机
都必须在权限域名服务器
处登记。为了更加可靠地工作,一台主机最好至少有两个权限域名服务器。
实际上,许多域名服务器
都同时
充当本地域名服务器
和权限域名服务器
。
权限域名服务器
总能将其管辖的主机名
转换为该主机的IP地址
。
不知道我这样理解对不对
我的域名是suhaoblog.cn,购买完域名需要完成DNS解析,这一过程就相当于在权限域名服务器完成了登记,方便日后解析过程中知道我这个二级域名去哪里解析
④ 本地域名服务器
本地服务器不属于下图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。
很多博客没有仔细说这个地方,包括看了很多视频也没讲清楚这个本地域名服务器到底是个什么,看了一篇博客大概理解了,如果你是直连运营商或者本地上网设置的自动分配DNS,那本地DNS一般就是ISP(运营商, 如电信,移动等)提供的DNS,即使是通过无线链接,很多路由器内有DNS转发器,也是是转发到ISP的DNS解析服务器
如果本地设置了DNS地址,那本地DNS就是指你在本地IPv4或者IPv6中设置的DNS服务器
可以在
cmd
下通过ipconfig/all
命令查看当前网络的DNS地址
2.5 解析过程
解析过程通常有两种,递归方式和迭代方式,主机向本地域名服务器的解析过程一般是递归的,而由本地域名服务器到其他根域名服务器的过程是迭代的
主机和本地域名服务器的递归过程其实也可以理解为代理,由本地域名服务器代理你的主机去查询,拿baike.baidu.com举例,这个过程都是从浏览器开始说起
查询过程图示如下(最差的情况下,各级都没有缓存)
- 首先按下回车键后,首先会去电脑C盘中的hosts文件中查找是否配置了DNS解析记录
- 不存在再去查找本地DNS解析器缓存,是否有这个网址映射关系
- 本地DNS缓存没有记录,则发送UDP数据包到本地域名服务器,查找对应记录
- 本地域名服务器没有记录,则会向根域名服务器发送UDP数据包请求查询,查找对应记录、
- 根域名服务器没有记录,会返回
com顶级域名服务器
地址,由本地服务器发送UDP数据包到com顶级域名服务器
进行查询 com顶级域名服务器
没有记录,会返回baidu二级域名服务器
地址,由本地服务器发送UDP数据包到baidu二级域名服务器
进行查询baidu二级域名服务器
没有记录,会返回baike三级域名服务器
地址,由本地服务器发送UDP数据包到baike三级域名服务器
进行查询- 如果在
baike三级域名服务器
都没查询到相关记录,则返回错误信息,否则返回域名对应的IP地址 - 根据递归逐层返回到浏览器,再由浏览器根据查询到的IP发起
TCP/IP
连接,等待服务器响应
2.6 DNS其他
2.6.1 DNS根域名服务器只有13台的说法
有个说法说根域名服务器只有13台,其实并不是或者说至少现在不是,这13代表的应该是一些域名地址,每一个域名后面都对应着不止一台服务器
知乎一个比较权威说法:
有 400 多个根域名服务器遍及全世界,这些根域名服务器由 13 个不同的组织管理。根域名服务器的清单和组织机构可以在 https://root-servers.org/ 中找到,根域名服务器提供 TLD 服务器的 IP 地址
2.6.2 缓存
关于DNS缓存,各层都会缓存,浏览器,操作系统,本地域名服务器以及其他各个节点都存在缓存,每个节点缓存都有一定的时间,通过参数TTL控制
三、总结
对计算机网络了解不是这么深入,本文也就大概就DNS过程进行了浅析,更深入的内容,可以看这个人的知乎回答,个人觉得写的很好(虽然赞同不是很多)