从输入url到页面加载发生了什么

zqlucky zqlucky     2022-10-17     166

关键词:

这个面试题在网上找了很多答案,发现下面这篇感觉是最精简,蛮适合我。

原文链接https://segmentfault.com/a/1190000006879700

从输入URL到页面加载发生了什么

最近在进行前端面试方面的一些准备,看了网上许多相关的文章,发现有一个问题始终绕不开: 在浏览器中输入URL到整个页面显示在用户面前时这个过程中到底发生了什么。仔细思考这个问题,发现确实很深,这个过程涉及到的东西很多。这个问题的回答真的能够很好的考验一个web工程师的水平,于是我自问自答一番。

总体来说分为以下几个过程:

  1. DNS解析

  2. TCP连接

  3. 发送HTTP请求

  4. 服务器处理请求并返回HTTP报文

  5. 浏览器解析渲染页面

  6. 连接结束

具体过程

DNS解析

DNS解析的过程就是寻找哪台机器上有你需要资源的过程。当你在浏览器中输入一个地址时,例如www.baidu.com,其实不是百度网站真正意义上的地址。互联网上每一台计算机的唯一标识是它的IP地址,但是IP地址并不方便记忆。用户更喜欢用方便记忆的网址去寻找互联网上的其它计算机,也就是上面提到的百度的网址。所以互联网设计者需要在用户的方便性与可用性方面做一个权衡,这个权衡就是一个网址到IP地址的转换,这个过程就是DNS解析。它实际上充当了一个翻译的角色,实现了网址到IP地址的转换。网址到IP地址转换的过程是如何进行的?

解析过程

DNS解析是一个递归查询的过程。

 

上述图片是查找www.google.com的IP地址过程。首先在本地域名服务器中查询IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到google的IP地址并把它缓存到本地,供下次查询使用。从上述过程中,可以看出网址的解析是一个从右向左的过程: com -> google.com -> www.google.com。但是你是否发现少了点什么,根域名服务器的解析过程呢?事实上,真正的网址是www.google.com.,并不是我多打了一个.,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上,所有网址真正的解析过程为: . -> .com -> google.com. -> www.google.com.。

DNS优化

了解了DNS的过程,可以为我们带来哪些?上文中请求到google的IP地址时,经历了8个步骤,这个过程中存在多个请求(同时存在UDP和TCP请求,为什么有两种请求方式,请自行查找)。如果每次都经过这么多步骤,是否太耗时间?如何减少该过程的步骤呢?那就是DNS缓存。

DNS缓存

DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。

  • 在你的chrome浏览器中输入:chrome://dns/,你可以看到chrome浏览器的DNS缓存。

  • 系统缓存主要存在/etc/hosts(Linux系统)中:

技术分享图片

  • ...

DNS负载均衡

不知道大家有没有思考过一个问题: DNS返回的IP地址是否每次都一样?如果每次都一样是否说明你请求的资源都位于同一台机器上面,那么这台机器需要多高的性能和储存才能满足亿万请求呢?其实真实的互联网世界背后存在成千上百台服务器,大型的网站甚至更多。但是在用户的眼中,它需要的只是处理他的请求,哪台机器处理请求并不重要。DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡,又叫做DNS重定向。大家耳熟能详的CDN(Content Delivery Network)就是利用DNS的重定向技术,DNS服务器会返回一个跟用户最接近的点的IP地址给用户,CDN节点的服务器负责响应用户的请求,提供所需的内容。在这里打个免费的广告,我平时使用的比较多的是七牛云的CDN(免费)储存图片,作为我个人博客的图床使用。

TCP连接

HTTP协议是使用TCP作为其传输层协议的,当TCP出现瓶颈时,HTTP也会受到影响。但由于TCP优化这一块我平常接触的并不是很多,再加上大学时的计算机网络的基础基本上忘完,所以这一部分我也就不在这里分析了。

HTTPS协议

我不知道把HTTPS放在这个部分是否合适,但是放在这里好像又说的过去。HTTP报文是包裹在TCP报文中发送的,服务器端收到TCP报文时会解包提取出HTTP报文。但是这个过程中存在一定的风险,HTTP报文是明文,如果中间被截取的话会存在一些信息泄露的风险。那么在进入TCP报文之前对HTTP做一次加密就可以解决这个问题了。HTTPS协议的本质就是HTTP + SSL(or TLS)。在HTTP报文进入TCP报文之前,先使用SSL对HTTP报文进行加密。从网络的层级结构看它位于HTTP协议与TCP协议之间。

技术分享图片

HTTPS过程

HTTPS在传输数据之前需要客户端与服务器进行一个握手(TLS/SSL握手),在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL使用了非对称加密,对称加密以及hash等。具体过程请参考经典的阮一峰先生的博客TLS/SSL握手过程
HTTPS相比于HTTP,虽然提供了安全保证,但是势必会带来一些时间上的损耗,如握手和加密等过程,是否使用HTTPS需要根据具体情况在安全和性能方面做出权衡。

HTTP请求

其实这部分又可以称为前端工程师眼中的HTTP,它主要发生在客户端。发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口(HTTP协议80/8080, HTTPS协议443)。HTTP请求报文是由三部分组成: 请求行, 请求报头请求正文

请求行

格式如下:
Method Request-URL HTTP-Version CRLF

eg: GET index.html HTTP/1.1

常用的方法有: GET, POST, PUT, DELETE, OPTIONS, HEAD。

TODO:

  • GET和POST有什么区别?

请求报头

请求报头允许客户端向服务器传递请求的附加信息和客户端自身的信息。
PS: 客户端不一定特指浏览器,有时候也可使用Linux下的CURL命令以及HTTP客户端测试工具等。
常见的请求报头有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent等。

技术分享图片

上图是使用Chrome开发者工具截取的对百度的HTTP请求以及响应报文,从图中可以看出,请求报头中使用了Accept, Accept-Encoding, Accept-Language, Cache-Control, Connection, Cookie等字段。Accept用于指定客户端用于接受哪些类型的信息,Accept-Encoding与Accept类似,它用于指定接受的编码方式。Connection设置为Keep-alive用于告诉客户端本次HTTP请求结束之后并不需要关闭TCP连接,这样可以使下次HTTP请求使用相同的TCP通道,节省TCP连接建立的时间。

请求正文

当使用POST, PUT等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中。在请求包头中有一些与请求正文相关的信息,例如: 现在的Web应用通常采用Rest架构,请求的数据格式一般为json。这时就需要设置Content-Type: application/json。

服务器处理请求并返回HTTP报文

自然而然这部分对应的就是后端工程师眼中的HTTP。后端从在固定的端口接收到TCP报文开始,这一部分对应于编程语言中的socket。它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。这一部分工作一般是由Web服务器去进行,我使用过的Web服务器有Tomcat, Jetty和Netty等等。

HTTP响应报文也是由三部分组成: 状态码, 响应报头响应报文

状态码

状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息–表示请求已接收,继续处理。

  • 2xx:成功–表示请求已被成功接收、理解、接受。

  • 3xx:重定向–要完成请求必须进行更进一步的操作。

  • 4xx:客户端错误–请求有语法错误或请求无法实现。

  • 5xx:服务器端错误–服务器未能实现合法的请求。
    平时遇到比较常见的状态码有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500(分别表示什么请自行查找)。

TODO:

  • 301和302有什么区别?

  • HTTP缓存

技术分享图片

该图是本公司对状态码的一个总结,绘制而成的status code map,请大家参考。

响应报头

常见的响应报头字段有: Server, Connection...。

响应报文

服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。

浏览器解析渲染页面

浏览器在收到HTML,CSS,JS文件后,它是如何把页面呈现到屏幕上的?下图对应的就是WebKit渲染的过程。

技术分享图片

浏览器是一个边解析边渲染的过程。首先浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。这个过程比较复杂,涉及到两个概念: reflow(回流)和repain(重绘)。DOM节点中的各个元素都是以盒模型的形式存在,这些都需要浏览器去计算其位置和大小等,这个过程称为relow;当盒模型的位置,大小以及其他属性,如颜色,字体,等确定下来之后,浏览器便开始绘制内容,这个过程称为repain。页面在首次加载时必然会经历reflow和repain。reflow和repain过程是非常消耗性能的,尤其是在移动设备上,它会破坏用户体验,有时会造成页面卡顿。所以我们应该尽可能少的减少reflow和repain。

技术分享图片

JS的解析是由浏览器中的JS解析引擎完成的。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。但是又存在某些任务比较耗时,如IO读写等,所以需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。

浏览器在解析过程中,如果遇到请求外部资源时,如图像,iconfont,JS等。浏览器将重复1-6过程下载该资源。请求过程是异步的,并不会影响HTML文档进行加载,但是当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因。CSS文件的加载不影响JS文件的加载,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。

Web优化

上面部分主要介绍了一次完整的请求对应的过程,了解该过程的目的无非就是为了Web优化。在谈到Web优化之前,我们回到一个更原始的问题,Web前端的本质是什么。我的理解是: 将信息快速并友好的展示给用户并能够与用户进行交互。快速的意思就是在尽可能短的时间内完成页面的加载,试想一下当你在淘宝购买东西的时候,淘宝页面加载了10几秒才显示出物品,这个时候你还有心情去购买吗?怎么快速的完成页面的加载呢?优雅的学院派雅虎给出了常用的一些手段,也就是我们熟悉的雅虎34条军规。这34军规实际上就是围绕请求过程进行的一些优化方式。

如何尽快的加载资源?答案就是能不从网络中加载的资源就不从网络中加载,当我们合理使用缓存,将资源放在浏览器端,这是最快的方式。如果资源必须从网络中加载,则要考虑缩短连接时间,即DNS优化部分;减少响应内容大小,即对内容进行压缩。另一方面,如果加载的资源数比较少的话,也可以快速的响应用户。当资源到达浏览器之后,浏览器开始进行解析渲染,浏览器中最耗时的部分就是reflow,所以围绕这一部分就是考虑如何减少reflow的次数。

总结

写这篇文章真的非常纠结,前前后后断断续续写了两个星期,因为涉及到的东西比较多,再加上有些东西记忆的没有那么清晰了,所以不好下笔。所涉及到的大部分内容,也基本上是一笔带过,只是给读者一个浅显的认知,当遇到相关的问题时,知道如何去查询。大家可以当成一篇Web开发的科普类文章去阅读。

另外在这里为公司的产品打个广告,在Chrome store中搜索DHC,这是一款超级好用的Web客户端工具,囊括了很多的功能: 报文分析,API测试等等,可谓说是WEB工程师必备工具。

 






从输入url到页面加载发生了什么

从输入URL到页面加载发生了什么转自:https://segmentfault.com/a/1190000006879700作者写得很不错,作者忽略了的,我加了上去,完善了一些,如get与post的区别等总体来说分为以下几个过程:DNS解析TCP连接发送HTTP请求服务器处理请求并返... 查看详情

一个页面从输入url到页面加载显示完成,这个过程中都发生了什么?

一个页面从输入URL到页面加载显示完成,这个过程中都发生了:1.浏览器补全URL地址在输入完URL之后,浏览器会自动检查该地址是否完整,例如是否有添加https协议,若发现不完整,会自动补全。2.向DNS查询IP地址每个域名都对应... 查看详情

从输入一个url到加载页面发生了什么?

  惭愧了,很久之前被面试的时候也有面试官问了我这个问题,但是当时回答的很不满意,于是回头看了很多资料,现在也整理一下。  大致可总结为以下几个步骤:  1.DNS解析。  2.TCP链接。  3.发送HTTP请求。  4.... 查看详情

一个页面从输入url到加载显示完成,发生了什么?

面试经典题——URL加载一、涉及基本知识点:1.计算机网络五层因特尔协议栈:应用层(dns、http):DNS解析成IP并完成http请求发送;传输层(tcp、udp):三次握手四次挥手模式建立tcp连接;网络层(IP、ARP):IP寻址;数据链路... 查看详情

性能分析从开始输入url到页面加载完成的过程中都发生了什么事情?

【稍后更新】第一个问题:从输入URL到浏览器接收的过程中发生了什么事情? 第二个问题:浏览器如何向网卡发送数据? 第三个问题:数据如何从本机网卡发送到服务器? 第四个问题:服务器接收到数据后会进行哪... 查看详情

一个页面从输入url到页面加载显示完成,这个过程中发生了什么?

1.浏览器通过DNS查找域名对应的IP地址(DNS查询:浏览器缓存-->系统缓存-->路由器缓存-->ISPDNS缓存-->根域名服务器)2.浏览器向Web服务器发送一个HTTP请求(TCP三次握手)3.服务器301重定向(从http://example.com重定向到http://ww... 查看详情

一个页面从输入url到页面加载显示完成,这个过程中都发生了什么?

<divstyle="background:#ff6a00;color:#0;font-size:small;">   <p>           作者:        查看详情

从浏览器输入url到页面加载完成都发生了什么

一个http请求的过程简要介绍一下一个http请求的网络传输过程:DNSLookup先获得URL对应的IP地址SocketConnect浏览器和服务器建立TCP连接SendRequest浏览器发送HTTP请求ContentDownload服务器发送响应接下来讲讲这里存在的性能问题:如果你对D... 查看详情

一个页面从输入url到页面加载显示完成的过程中都发生了什么

前端面试/笔试必考问题,越详细越好先简单得讲:浏览器根据请求的URL交给DNS域名解析,找到真实IP,向服务器发起请求;   服务器交给后台处理完成后返回数据,浏览器接收文件(HTML、JS、CSS、图象等);  ... 查看详情

从输入url到页面加载完成的过程中都发生了什么

根据URL请求页面过程过程概述浏览器查找域名对应的IP地址;浏览器根据IP地址与服务器建立socket连接;浏览器与服务器通信:浏览器请求,服务器处理请求;浏览器与服务器断开连接。天啦撸,结束了?也太简单了吧。。。各... 查看详情

深入浅出经典面试题:从浏览器中输入url到页面加载发生了什么-part1

背景“从浏览器中输入URL到页面加载的发生了什么“,这是一道经典的面试题,涉及到的知识面非常多,但作为一个自认为对网络知识掌握的比较好的老码农来说,回答这个问题自然不在话下。如果这道题目如果在面试出... 查看详情

经典面试题:一个页面从输入url到加载显示完成,发生了什么?(转)

一、涉及基本知识点:1.计算机网络五层因特尔协议栈:应用层(dns、http):DNS解析成IP并完成http请求发送;传输层(tcp、udp):三次握手四次挥手模式建立tcp连接;网络层(IP、ARP):IP寻址;数据链路层(PPP):将请求数据... 查看详情

面试题系列---一个页面从输入url到页面加载显示完成,这个过程都发生什么?

一个页面从输入URL到页面加载显示完成,这个过程都发生什么?1.在浏览器中输入url2.浏览器访问dns服务器,根据域名查找对应的ip3.通过ip找到服务器,建立tcp连接4.发送http请求5.后端服务器接收请求,处理后响应给浏览器6.浏览... 查看详情

一个网页从输入url到页面加载完成的过程中都发生了什么事情?

...一般会经历以下几个过程:1、首先,在浏览器地址栏中输入url2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。3、在发送http请求前,需要域名解析... 查看详情

一个页面从输入url到页面加载完的过程中都发生了什么事情?

过程概述浏览器查找域名对应的IP地址;浏览器根据IP地址与服务器建立socket连接;浏览器与服务器通信:浏览器请求,服务器处理请求;浏览器与服务器断开连接。以下为详细解析:根据域名查找IP地址概念解释IP地址:IP协议为... 查看详情

从输入url到页面展示,到底发生了什么

从输入URL到页面展示,到底发生了什么1、输入URL当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得url了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的url,然后给出智能提示,... 查看详情

一个页面从输入url到加载完成,发生什么事

1、浏览器会开启一个线程来处理这个请求,对URL分析判断如果是http协议就按照Web方式来处理;2、调用浏览器内核中的对应方法,比如WebView中的loadUrl方法;3、通过DNS解析获取网址的IP地址,设置UA等信息发出第二个GET请求;4、... 查看详情

从输入url到页面展示到底发生了什么(代码片段)

从输入url到页面展示到底发生了什么|--域名解析(获得IP地址)|--向WEB服务器发送HTTP请求|--服务器处理请求|--服务器返回HTTP响应|--浏览器显示页面信息输入地址当输入url地址后,浏览器已经在智能匹配地址了,会从历史记录、... 查看详情