从输入URL到页面展示,这中间发生了什么

2021-09-19  本文已影响0人  前端技术驿站

"从浏览器地址栏输入 url 到请求返回发生了什么?",呃,这道面试题我都不知道被问了多少遍,作为必考题,我们有必要总结一下。

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

下面让我们了解下这 5 个过程。

一、DNS 解析

DNS( Domain Name System)是"域名系统"的英文缩写。DNS 解析的过程就是寻找哪台机器上有你需要资源的过程。

当你在浏览器中输入一个地址时,例如www.shanzhonglei.com,其实不是网站真正意义上的地址。互联网上每一台计算机的唯一标识是它的 IP 地址,但是 IP 地址并不方便记忆,所以就用网址代替 IP 地址。

DNS 域名解析过程

所以解析过程大概为:浏览器缓存->本地hosts文件->路由器缓存->本地DNS服务器->根DNS服务器->顶级域名服务器->主域名服务器

前端 DNS 优化

可以在 html 页面头部写入 dns 缓存地址。

<meta http-equiv="x-dns-prefetch-control" content="on" />
<link rel="dns-prefetch" href="http://www.shanzhonglei.com/" />

DNS 负载均衡

如果 DNS 返回的 IP 地址每次都一样,那么这台机器需要多高的性能和储存才能满足亿万请求呢?

其实 DNS 可以返回一个合适的机器的 IP 给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是 DNS 负载均衡,又叫做 DNS 重定向。

大家耳熟能详的 CDN(Content Delivery Network)就是利用 DNS 的重定向技术,DNS 服务器会返回一个跟用户最接近的点的 IP 地址给用户,CDN 节点的服务器负责响应用户的请求,提供所需的内容。

二、TCP 连接

用户数据包协议(User Datagram Protocol),简称 UDP,是基于 IP 之上开发能和应用打交道的协议。

UDP 中一个最重要的信息是端口号,端口号其实就是一个数字,每个想访问网络的程序都需要绑定一个端口号。

通过端口号 UDP 就能把指定的数据包发送给指定的程序了,所以通过 IP 地址信息把数据包发送给指定的电脑,而 UDP 通过端口号把数据包分发给正确的程序。

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 相对于 UDP 有两个特点:

三次握手,就是指在建立一个 TCP 连接时,客户端和服务器总共要发送 3 个数据包来确认连接的建立。三次握手主要作用:

2.1 三次握手过程

刚开始客户端处于 Closed 的状态,服务器处于 Listen 状态。

  1. 客户端发送到服务器。客户端发送 SYN 报文给服务器,并且指明客户端初始化序列号为 ISN(c),即以 SYN=1, seq=x 的形式发送过去。此时客户端处于 SYN_SEND 状态。
  2. 服务器发送给客户端。服务器收到客户端的 SYNISN(c),也发送一个 SYN 回去,同时设置 ACK = ISN(c) + 1 以及指明服务器初始化序列号为 ISN(s),即以 SYN=1, ACK=x+1, seq=y 的形式发送给客户端。
  3. 客户端发送到服务器。客户端收到服务器发送的消息后,设置 ACK = ISN(s) + 1,将自身的 ISN(c) + 1,即以 ACK=y+1, seq=x+1 的形式发送给服务器。此时客户端处于 ESTABLISHED 阶段,服务器收到报文,也处于 ESTABLISHED 阶段,双方建立了连接。
    tcp.jpg

2.2、两次握手不行吗?

三次握手的目的:

  1. 客户端发送数据给服务器,服务器确认自己可以接受客户端的请求。
  2. 服务器发送数据给客户端,客户端确认自己可以发送数据给服务器,也可以接受到服务器的请求。
  3. 客户端发送数据给服务器,服务器确认自己可以发送数据给客户端。

如果采用两次握手,客户端发送数据给服务器,服务器确认后就当连接开始:

  1. 客户端发送一次请求给服务器,指定时间后没响应再发了一个
  2. 服务器先接收到后一个建立连接的请求,然后前一个建立连接的请求,因为网络延迟等问题,在第二个之后达到了
  3. 服务器认为第二个请求是最新发的,于是向客户端发送确认报文段,同意建立连接,于是连接建立了(两次握手)
  4. 这时候客户端还在等待最新的请求连接(第二次请求),自动忽略服务器发送的关于第一个请求连接的响应,也不发送数据
  5. 服务器一直等待客户端发送数据,服务器资源被占用

2.3 三次握手过程中可以携带数据吗?

第三次握手的时候可以携带,第一第二次不可以携带。

第三次握手的时候,客户端处于 ESTABLISHED 状态了,它可以建立连接并且知道服务器的接收、发送能力是正常的,所以可以携带数据了。

2.3、四次挥手过程

2.4、为什么需要四次挥手

因为服务器接收到客户端的关闭请求之后。

如果有一些数据因为网络延迟等问题没有发送到,那么它直接关闭会导致这些数据没有接收到;亦或者服务器也有一些数据要发送给客户端,要确保这些数据发送完。

我们知道 TCP 是个可靠的棒小伙,所以它才会第一次回复客户端收到关闭连接的请求了,第二次回复客户端你发送的数据应该没延迟了,我也发送完我要发送的数据了,可以关闭了。

最后客户端接收到了,回复告诉服务器它也可以关闭了,然后过一阵子确保服务器接收到它发的 ACK 报文之后,也处于 CLOSED 状态了。这样就确保了连接的正常关闭。

三、发送 HTTP 请求

发送 HTTP 请求的过程就是构建 HTTP 请求报文,并通过 TCP 协议发送到服务器指定端口(HTTP 协议默认端口 80/8080,HTTPS 协议默认端口 443)。

HTTP 请求报文由 3 部分组成:请求行、请求报文 和 请求正文。

注意,如果本地缓存是否缓存了该资源,就会直接渲染页面。

GET 和 POST 方法到底有什么区别?

如果没有前提,也就是不用任何规范限制的话,我们只考虑语法来说,GET 请求和 POST 请求都能拉取数据。这两个方式是没有任何区别的,只有名字不一样。

RFC 是一种网络规范,如果基于 RFC 规范,那就不一样:

四种常见的 POST 提交数据方式:

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

这一步,会检查状态码,如果是 301/302,则需要重定向,从 Location 自动中读取地址,重新发起请求。如果是 200 状态码,检查响应类型 Content-Type,如果是字节流类型,则将该请求提交给下载管理器,该导航流程结束,不再进行后续的渲染。

如果是 html 则通知浏览器进程准备渲染进程准备进行渲染。

HTTP 响应报文也是由 3 部分组成:状态码、响应报头 和 响应报文。

平时遇到比较常见的状态码有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500(分别表示什么请自行查找)。

状态码 301 和 302 的区别?

301 重定向是一种永久重定向,而 302 跳转是暂时的跳转。

五、浏览器解析渲染页面

cssRender.png

浏览器的渲染过程为:

  1. 解析 HTML,生成 DOM
  2. 解析 CSS,生成 CSS 规则树(CSS Rule Tree)
  3. DOM TreeCSS Rule Tree 相结合,生成 渲染树Render Tree
  4. 从根节点开始,计算每一个元素的大小、位置,给出每个节点所应该出现的屏幕精确坐标,从而得到基于渲染树的 布局渲染树Layout of the render tree)。
  5. 遍历渲染树,将每个节点用 UI 渲染引擎来绘制,从而将整棵树绘制到页面上,这个步骤叫 绘制渲染树Painting the render tree

浏览器在解析过程中,如果遇到请求外部资源时,如图像,JS 等,还会重新执行网络请求。这个请求过程是异步的,并不会影响 HTML 文档进行加载,但是当文档加载过程中遇到 JS 文件,HTML 文档会挂起渲染过程,不仅要等到文档中 JS 文件加载完毕还要等待解析执行完毕,才会继续 HTML 的渲染过程。原因是因为 JS 有可能修改 DOM 结构,这就是 JS 阻塞后续资源下载的根本原因。

CSS 文件的加载不影响 JS 文件的加载,但是却影响 JS 文件的执行。JS 代码执行前浏览器必须保证 CSS 文件已经下载并加载完毕。

建议将 script 标签放到 body 标签底部,或者给 script 标签添加 defer/async 属性。

页面渲染层优化

扩展

DNS 域名称和组织类型

DNS 域名称 组织类型
com 商业公司
edu 教育机构
net 网络公司
gov 非军事政府机构
Mil 军事政府机构

TCP 和 UDP 的区别

最后

公粽号【前端技术驿站】,多多交流,共同进步!
回复react:
1、React.js大众点评案例完整版
2、React+TypeScript高仿AntDesign开发企业级UI组件库
3、React17+React Hook+TS4最佳实践 仿Jira企业级项目
回复vue
1、[全栈开发 ]Vue+Django REST framework 打造生鲜电商项目
2、核心源码内参
3、Vue3+ElementPlus+Koa2 全栈开发后台系统
4、ES6零基础教学解析彩票
5、Node.js+Koa2框架生态实战 - 从零模拟新浪微博(完整版)
6、vue无人点餐收银系统
回复node
1、Nodejs视频教程
2、全栈最后一公里 - Nodejs 项目的线上服务器部署与发布
3、深入浅出Node.js

上一篇下一篇

猜你喜欢

热点阅读