如果域名不是ip,需要走域名解析成ip的逻辑,优先级顺序为:
1 浏览器缓存 > 2 系统缓存 > 3 本地hosts> 4 根域名 > 5 顶级dns服务器(如 com) > 6 二级dns服务器(baidu.com) > 7 三级dns服务器(www.baidu.com)
如果客户端指向的dns服务器为非官方的如 8.8.8.8,那在第4步之前可能还有一层cache,当然最后解析的ip有可能是cdn的,如果cdn失效了就直接穿透到源ip,当然这个服务器这一部分可能做了四层负载均衡的设置,所以有可能每次获取的服务器ip都不一祥,也有可能到了服务器nginx层做了七层转发,所以虽然获得的ip一样,但是内部可能转发给了很多内网服务器.
如果链接地址是域名开头的,浏览器会开始DNS解析动作。解析优先级依次为:
浏览器缓存 > 操作系统缓存 > 本机hosts文件 > “野生DNS服务器” >核心DNS服务器( 根级DNS > 顶级DNS > 权威DNS) ;
将域名解析为正确的ip地址之后,通过三次握手与服务器建立tcp/ip连接;浏览器发送请求报文,服务器接收并处理请求,返回响应报文,浏览器开始解析html文档,在这过程中又会发起一些http请求,进行图片、css、js等静态资源的获取,以及ajax请求获取json数据。同时,浏览器相关引擎开始绘制dom视图,执行js脚本,完成页面的初始化直到所有代码执行完毕。
注:本地缓存hosts一般是指本机域名解析文件hosts
“C:\WINDOWS\system32\drivers\etc\hosts”
故本地DNS解析可以理解为就是查找系统里面的hosts文件的对应关系。
此外, hosts文件相当于是一个简易的dns解析器(KV格式),而操作系统缓存则是在内存里,访问缓存要比访问磁盘快的多。所以解析dns都要先找缓存,没有才去访问解析器(hosts、dns服务器等)。
注:dns请求时使用专门的dns协议,使用udp发送,因为是通过udp所以不需要建立连接。
在dns解析失败时,由于根本没有进入http处理流程,所以不会有4xx之类的错误,而是dns解析错误信息。