从输入URL到页面加载完成期间经历了什么?(总览篇)

        这是一个很灵活的问题,同样也是考察一个人知识深度以及广度的问题,在此仅通过通俗易懂的叙述作简单分析。

        设想现在的你面前有台笔记本电脑(不一定是笔记本,台式机一体机都可以),手里握着握感极其熟悉的鼠标,点开了在桌面沉睡已久的浏览器,浏览器向你定位了它的地址栏试图让你去输入一些东西来告知它的使命,于是你输入了一个网址:www.didudidudu.com,轻轻敲击了回车,这一切开始了!

1、DNS域名解析

        回车敲响的那一刻,浏览器检查了输入框,www.didudidudu.com是什么鬼东西??我需要的可是IP地址呀!万般无奈之下找向了浏览器缓存,让其查找是否有这家伙的记录,结果并没有发现,此时找向系统缓存,主要去查找了系统中的hosts文件,同样没有,此时找向路由器缓存,查看路由器映射表,然而,并没有!于是,计算机将域名发给了本地DNS服务器(提供本地连接的服务商),本地DNS服务器找不到会将域名发送给其他服务器,进行递归过程,首先会发送到根域名服务器去找,返回顶级域名服务器的IP地址,再请求顶级域名服务器IP返回二级域名服务器IP,再请求二级域名服务器IP返回三级域名服务器IP......直到找到对应的IP地址,返回给浏览器。

                        

2、发起TCP连接(三次握手)

        拿到IP地址后的浏览器很开心,终于可以有目的的去联系远方的“朋友”了,此时作用于传输层的TCP协议向远端服务器发起连接请求,此举成为三次握手:

①源端->远端:你好,我想跟你连接可以吗?(SYN=1,seq=x)

②远端->源端:可以,你确定要连接是吧?(SYN=1,ACK=1,seq=y,ack=x+1)

③源端->远端:确定,我们连接吧!(ACK=1,seq=x+1,ack=y+1)

3、发送HTTP请求,接受HTTP响应

        OK,连接上了,传输吧,这时就需要将用户输入的地址封装成HTTP Request请求报文,发送到服务器,服务器收到请求后会发出应答,即响应数据。

        HTTP请求报文格式:请求行+请求头+空行+消息体,请求行包括请求方式(GET/POST/DELETE/PUT)、请求资源路径(URL)、HTTP版本号;

                     

        HTTP响应报文格式:状态行+响应头+空行+消息体,状态行包括HTTP版本号、状态码、状态说明。

                      

        常见状态码

4、断开TCP连接(四次挥手)

        传也传完了,那咱们断开连接吧!

①源端->远端:好了,咱们断开吧(FIN=1,seq=u)

②远端->源端:行,等我稍微检查一下还有没有要发你的数据(ACK=1,seq=v,ack=u+1)

③远端->源端:可以了,咱们断开吧,拜拜(FIN=1,ACK=1,seq=w,ack=u+1)

④源端->远端:好的,再会,拜拜(ACK=1,seq=u+1,ack=w+1)

5、浏览器解析HTML代码,请求js,css等资源,最后进行页面渲染,呈现给用户

        浏览器获取文件后开始利用内核解析了,解析过程中也会出现一些HTTP请求请求一些资源,如js,css等文件,将这些文件下载到本地。浏览器解析HTML文件时会自上而下,起初产生一个DOM树,解析CSS之后产生CSS规则树,后将两树进行融合,合成为渲染层,最后调用操作系统的Native GUI的API绘制。

        接下来就要说到浏览器解析过程的进程与线程之间的关系,以及其他技术性问题。

(未完待续,下接细节篇)

猜你喜欢

转载自blog.csdn.net/didudidudu/article/details/80181505