从输入url地址到页面渲染全过程

参考博客:经典面试题:从 URL 输入到页面展现到底发生什么?TCP/IP协议详解

  • DNS 解析:将域名解析成 IP 地址
  • TCP 连接:TCP 三次握手
  • 发送 HTTP 请求
  • 服务器处理请求并返回 HTTP 报文
  • 浏览器解析渲染页面
  • 断开连接:TCP 四次挥手

1、DNS 解析:将域名解析成 IP 地址

URL(Uniform Resource Locator),统一资源定位符

scheme://host.domain:port/path/filename

各部分解释如下:
scheme:定义因特网服务的类型。常见的协议有 http、https、ftp、file,其中最常见的类型是 http,而 https则是进行加密的网络传输。
host:定义域主机(http 的默认主机是 www)
domain:定义因特网域名
port:定义主机上的端口号(http 的默认端口号是 80)
path:定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。
filename:定义文档/资源的名称

DNS记录、DNS协议、DNS服务器

在这里插入图片描述

  • 浏览器通过向 DNS 服务器发送域名,DNS 服务器查询到与域名相对应的 IP 地址,然后返回给浏览器,浏览器再将 IP 地址打在协议上,同时请求参数也会在协议搭载,然后一并发送给对应的服务器。

2、TCP 连接:TCP 三次握手 (全双工通信)

在这里插入图片描述

  • 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

  • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

  • 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据。

3、发送 HTTP 请求

请求报文由请求行(request line)、请求头(header)、请求体三个部分组成。

扫描二维码关注公众号,回复: 12725366 查看本文章

在这里插入图片描述

  • 请求方法包含 8 种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。

POST /chapter17/user.html HTTP/1.1

以上代码中,“POST”代表请求方法,“/chapter17/user.html”表示 URL,“HTTP/1.1”代表协议和协议的版本。

在这里插入图片描述

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

响应报文由响应行(request line)、响应头部(header)、响应主体三个部分组成。

在这里插入图片描述
状态码规则如下:

  • 1xx:指示信息–表示请求已接收,继续处理。
  • 2xx:成功–表示请求已被成功接收、理解、接受。
  • 3xx:重定向–为完成请求,客户需进一步细化请求。
  • 4xx:客户端错误–请求有语法错误或请求无法实现。
  • 5xx:服务器端错误–服务器未能实现合法的请求。

具体如下:

  • 200 ok(请求成功)
  • 204 no content (请求成功,但是没有结果返回)
  • 206 partial content (客户端请求一部分资源,服务端成功响应,返回一范围资源)
  • 301 move permanently (永久性重定向)
  • 302 found (临时性重定向)
  • 303 see other (示由于请求对应的资源存在着另一个 URI,应使用 GET
    方法定向获取请求的资源)
  • 304 not modified (表示在客户端采用带条件的访问某资源时,服务端找到了资源,但是这个请求的条件不符合。跟重定向无关)
  • 307 temporary redirect (跟302一个意思)
  • 400 bad request (请求报文存在语法错误)
  • 401 unauthorized (需要认证(第一次返回)或者认证失败(第二次返回))
  • 403 forbidden (请求被服务器拒绝了)
  • 404 not found (服务器上无法找到请求的资源)
  • 500 internal server error (服务端执行请求时发生了错误)
  • 503 service unavailable (服务器正在超负载或者停机维护,无法处理请求)

在这里插入图片描述
服务器:

  • 服务器是网络环境中的高性能计算机,它侦听网络上的其他计算机(客户机)提交的服务请求,并提供相应的服务,比如网页服务、文件下载服务、邮件服务、视频服务

  • 而客户端主要的功能是浏览网页、看视频、听音乐等等,两者截然不同。

  • 每台服务器上都会安装处理请求的应用——web server。常见的 web server 产品有 apache、nginx、IIS 或 Lighttpd 等。

在这里插入图片描述
实现过程:

  • 首先浏览器发送过来的请求先经过控制器,控制器进行逻辑处理和请求分发;

  • 接着会调用模型,这一阶段模型会获取 redis db 以及 MySQL 的数据;

  • 获取数据后将渲染好的页面,响应信息会以响应报文的形式返回给客户端;

  • 最后浏览器通过渲染引擎将网页呈现在用户面前。

在这里插入图片描述

5、浏览器解析渲染页面

在这里插入图片描述

  • 根据 HTML 解析出 DOM 树

    • 深度优先遍历
    • 构建 DOM 树的过程中,若遇到 script 标签,则 DOM 树的构建会暂停,直至脚本执行完毕。
  • 根据 CSS 解析生成 CSS 规则树

    • 解析 CSS 规则树时 js 执行将暂停,直至 CSS 规则树就绪。
  • 结合 DOM 树和 CSS 规则树,生成渲染树

    • 精简 CSS 并可以加快 CSS 规则树的构建,从而加快页面相应速度。
  • 根据渲染树计算每一个节点的信息

    • 布局:通过渲染树中渲染对象的信息,计算出每一个渲染对象的位置和尺寸。
    • 回流:在布局完成后,发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染。
  • 根据计算好的信息绘制页面

    • 重绘:某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的重绘。
    • 回流:某个元素的尺寸发生了变化,则需重新计算渲染树,重新渲染。

6、断开连接:TCP 四次挥手

在这里插入图片描述

  • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

  • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

猜你喜欢

转载自blog.csdn.net/weixin_43973415/article/details/113412503
今日推荐