这也是一个经典的面试题,不管前端仍是后端均可能都会遇到,知识点相对来讲也比较多,考察得比较全面的。最近也看了不少浏览器相关的文章,结合起来,在这里简单梳理总结下。同时,感谢浏览器这个伟大的发明。html
下面是我简单粗糙画的一张流程图:前端
过程分为下方几个流程:git
相关知识点:github
URLweb
DNS解析、IP地址面试
TCP创建链接、三次握手后端
服务器处理、HTTP请求、状态码浏览器
浏览器渲染bash
TCP链接结束服务器
URL(Uniform Resource Locator),统一资源定位符,用于定位互联网上资源,俗称网址。
通常遵照下面的语法规则:
scheme://host.domain:port/path/filename
各部分解释以下:
为何须要域名解析? 浏览器并不能直接经过域名找到对应的服务器,而是要经过 IP 地址。固然也能够直接IP地址去访问,可是以人类的记忆习惯去记住各个网站的IP地址...那,我只能祝你幸福。
先说下IP地址: IP 地址是一个 32 位的二进制数,好比 127.0.0.1 为本机 IP。它的做用就是便于记忆和沟通的一组服务器的地址。域名就至关于 IP 地址的别名。 举个方便理解例子:好比一个经度:113.35 纬度:23.12 的地点,这样很是不方便记忆,可是这个地方有个地名叫广州天河,那个这就很符合人类的认知了。例子里面的经纬度就至关于IP地址,广州天河就至关于域名。
什么是域名解析 DNS 协议提供经过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。DNS 是一个网络服务器,咱们的域名解析简单来讲就是在 DNS 上记录一条信息记录。
例如 xiaoyexiang.com 120.77.215.71(服务器外网IP地址)80(服务器端口号)
复制代码
在客户端发送数据以前会发起 TCP 三次握手用以同步客户端和服务端的序列号和确认号,并交换 TCP 窗口大小信息。
网上也有不少方便易解的过程,这里我直接引用:
创建TCP链接后,开始向Web服务器发送HTTP请求报文。
POST /chapter17/user.html HTTP/1.1
// 以上代码中“POST”表明请求方法,“/chapter17/user.html”表示 URL,“HTTP/1.1”表明协议和协议的版本。如今比较流行的是 Http1.1 版本
复制代码
一个典型的 http request header 通常须要包括请求的方法,例如 GET 或者 POST 等,不经常使用的还有 PUT 和 DELETE 、HEAD、OPTION以及 TRACE 方法,通常项目中,浏览器只会发起 GET 或者 POST 请求。
此处注意: 这里可能会发生用户输入的为“baidu.com/”而非“https:/…参见文章。
服务器接受到请求后,对相应的请求做出相应的处理,处理完成后并做出相应的http 响应报文
** 响应行包含:协议版本,状态码,状态码描述 **
状态码规则以下:
此处对于服务器处理,我的表示了解很少
不作过多解释,搬我以为网上比较简单易懂的
浏览器拿到响应文本 HTML 后,接下来介绍下浏览器渲染机制
浏览器解析渲染页面分为一下五个步骤:
当数据传送完毕,须要断开 tcp 链接,此时发起 tcp 四次挥手。
在web2.0时代,即便在页面渲染后客户端仍是持续与服务器端通讯,这个模式被称为AJAX,是“Asynchronous JavaScript And XML”的缩写。
JS的解析是由浏览器中的JS解析引擎完成的。JS是单线程运行,也就是说,在同一个时间内只能作一件事,全部的任务都须要排队,前一个任务结束,后一个任务才能开始。可是又存在某些任务比较耗时,如IO读写等,因此须要一种机制能够先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。JS的执行机制就能够看作是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。全部的同步任务在主线程上执行,造成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,而后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,因此又叫作事件循环(Event loop)。
浏览器在解析过程当中,若是遇到请求外部资源时,请求过程是异步的,并不会影响HTML文档进行加载,可是当文档加载过程当中遇到JS文件,HTML文档会挂起渲染过程,不只要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。缘由是由于JS有可能修改DOM结构,这就意味着JS执行完成前,后续全部资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本缘由。CSS文件的加载不影响JS文件的加载,可是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。