欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用户从地址栏输入url,按下enter键后,直到页面加载完成的这个过程都发生了什么?

程序员文章站 2023-01-13 11:12:29
流程大概描述一下: 用户将url输入后,服务器接受到请求,然后将这个请求进行处理,然后将处理后的结果返回给浏览器,浏览器将该结果以页面的形式呈现给用户。 详细描述: 1:用户将url(例如www.baidu.com)输入至地址栏并回车后,首先浏览器会开启一个线程来处理这个请求,对URL判断如果是ht ......

流程大概描述一下:

 用户将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))