用户从地址栏输入url,按下enter键后,直到页面加载完成的这个过程都发生了什么?
流程大概描述一下:
用户将url输入后,服务器接受到请求,然后将这个请求进行处理,然后将处理后的结果返回给浏览器,浏览器将该结果以页面的形式呈现给用户。
详细描述:
1:用户将url(例如www.baidu.com)输入至地址栏并回车后,首先浏览器会开启一个线程来处理这个请求,对URL判断如果是http协议就按照web方式处理
2.然后浏览会先从搜索自身的DNS(Domain Name System,域名系统)缓存开始,一级一级往上搜索。意思是浏览器先在自身的DNS缓存(这涉及浏览器的缓存机制)中搜索是否有www.baidu.com这个域名;
如果浏览器未从自身的DNS缓存中搜索到(也有可能是因为缓存已经失效,即缓存的时间到期了。以chrome为例,你可以在地址栏输入:chrome://net-internals/#dns来查询自己曾经访问过的网站),那么浏览器会搜索操作系统(这里的操作系统代指的是你正在使用的计算机)自身的DNS缓存;
如果本地操作系统的DNS缓存还是没找到,那么浏览器便会尝试去读取本地的HOST文件,这个HOST文件可以根据以下路径找到,即C/Windows/System32/drivers/etc/hosts
如果在HOST文件中还是没有找到对应的配置项,那么便会从路由器(前提是你连接的是无线网络,如果是宽带连接,那么便会省略该步)缓存中搜索;
3.如果上述过程,在任一一个缓存中找到,那么便直接在屏幕中显示页面内容;如果都没找到的话,浏览器会发起一个DNS的一个系统调用,就是向本地主控DNS服务器(一般来说是你宽带运营商提供的服务器)发起一个域名解析请求;
宽带运营商服务器会查看本身缓存,查找对应的条目,看有没有过期或者有没有这个条目;如果依旧没查找到,运营商服务器会代替浏览器发起一个迭代DNS解析的请求。意思是运营商服务器会去找根域(就是运营商服务器的上级服务器)的DNS IP地址,如果根域服务器查不到www.baidu.com的IP地址,但能查到com域的顶级域的IP地址,那么它便会将com域的顶级域的IP地址返回给运营商服务器;
运营商服务器拿到后,会去询问com域的DNS服务器是否查的到www.baidu.com的IP地址,如果它查不到www.baidu.com的IP地址,但查的到baidu.com这个域的IP地址,那么它会将baidu.com域的IP地址返回给运营商服务器;
运营商服务器拿到后,会去询问baidu.com域的DNS服务器(这个服务器一般域名注册商提供的,如万维网等)能否查到www.baidu.com的IP地址。一般到这个域的时候,只要是经过网站注册备案的,都能在这里查到(如果还没查到,那么就要进行其他的处理了)。查到之后就把www.baidu.com的IP地址返回给运营商DNS服务器;
运营商DNS服务器拿到结果之后,会把这个结果返回给操作系统内核同时缓存(缓存的时间根据自己缓存时间长短来)起来,操作系统内核把结果返回给浏览器,浏览器最终就拿到了www.baidu.com对应的IP地址;
4.通过DNS服务器解析后获得了网址的IP地址后,浏览器向域名对应的IP地址服务器发起TCP连接,即发起HTTP“三次握手”(详细过程请参考:点击打开链接)。即这个tcp连接请求要经过层层的路由设备到达服务器端以后进入到网卡,然后进入到内核的TCP/IP协议栈,还有可能要经过防火墙的过滤,最终到达Web服务端,然后建立起TCP/IP的连接;
5.TCP/IP连接建立起来以后,浏览器就可以向服务器发送HTTP请求了;(例如GET请求一个根域里的一个域名地址,www.baidu.com)
6.服务器端接受到了这个请求后,根据路径参数,经过后端的一些处理之后,把处理后的结果返回给浏览器;(浏览器发送报头(请求报头),然后进入到web服务器上的 Web Server,如 Apache、Tomcat、Node.JS 等服务器,随后进入部署好的后端应用,如 PHP、Java、JavaScript、Python 等,找到对应的请求处理,最后处理结束回馈报头,将数据返回至浏览器。例如路径参数携带的是想搜索有关于TCP/IP的知识,服务器会把结果的HTML页面返回给浏览器)
7.浏览器拿到了完整的HTML页面代码或者其他的数据结果后,浏览器开始下载HTML文档,同时设置缓存并关闭TCP连接。浏览器在解析和渲染这个页面的时候,里面的js,CSS,图片等静态资源也是一个个HTTP请求,都需要经过上述的几个主要步骤;
8.浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给用户。(即浏览器对整个HTML结构进行解析,形成DOM树,同时对相应的CSS文件进行解析,形成CSS树,然后结合DOM树和CSS树形成一个绘制树。得到绘制树后,需要计算每个节点在页面中的位置,这个过程称为layout(布局)。layout的过程是在一个连续的二维平面上进行的,接下来,需要将这些结果栅格化,映射到屏幕的离散二维平面上,这一过程称为paint(着色)。现代浏览器为提升性能,将页面划分多个 layer,各自进行 paint 然后组合成一个页面(composite layers))
文稿来自:https://www.cnblogs.com/wangziyue/p/10419404.html