关于面试:从URL输入到页面展现到底发生什么

4次阅读

共计 4804 个字符,预计需要花费 13 分钟才能阅读完成。

前言

关上浏览器从输出网址到网页出现在大家背后,背地到底产生了什么?经验怎么样的一个过程?先给大家来张总体流程图,具体步骤请看下文合成!

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

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

一、URL 到底是啥

URL(Uniform Resource Locator),对立资源定位符,用于定位互联网上资源,俗称网址。
比方 http://www.w3school.com.cn/html/index.asp,恪守以下的语法规定:

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

二、域名解析(DNS)

在浏览器输出网址后,首先要通过域名解析,因为浏览器并不能间接通过域名找到对应的服务器,而是要通过 IP 地址。大家这里或者会有个疑难 —- 计算机既能够被赋予 IP 地址,也能够被赋予主机名和域名。比方 www.hackr.jp。那怎么不一开始就赋予个 IP 地址?这样就能够省去解析麻烦。咱们先来理解下什么是 IP 地址

1.IP 地址

IP 地址是指互联网协议地址,是 IP Address 的缩写。IP 地址是 IP 协定提供的一种对立的地址格局,它为互联网上的每一个网络和每一台主机调配一个逻辑地址,以此来屏蔽物理地址的差别。IP 地址是一个 32 位的二进制数,比方 127.0.0.1 为本机 IP。
域名就相当于 IP 地址乔装打扮的伪装者,带着一副面具。它的作用就是便于记忆和沟通的一组服务器的地址 。用户通常应用主机名或域名来拜访对方的计算机,而不是间接通过 IP 地址拜访。 因为与 IP 地址的一组纯数字相比,用字母配合数字的示意模式来指定计算机名更合乎人类的记忆习惯。但要让计算机去了解名称,相对而言就变得艰难了。因为计算机更善于解决一长串数字。为了解决上述的问题,DNS 服务应运而生。

2. 什么是域名解析

DNS 协定提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。DNS 是一个网络服务器,咱们的域名解析简略来说就是在 DNS 上记录一条信息记录

例如 baidu.com  220.114.23.56(服务器外网 IP 地址)80(服务器端口号)

3. 浏览器如何通过域名去查问 URL 对应的 IP 呢

  • 浏览器缓存:浏览器会依照肯定的频率缓存 DNS 记录。
  • 操作系统缓存:如果浏览器缓存中找不到须要的 DNS 记录,那就去操作系统中找。
  • 路由缓存:路由器也有 DNS 缓存。
  • ISP 的 DNS 服务器:ISP 是互联网服务提供商 (Internet Service Provider) 的简称,ISP 有专门的 DNS 服务器应答 DNS 查问申请。
  • 根服务器:ISP 的 DNS 服务器还找不到的话,它就会向根服务器发出请求,进行递归查问(DNS 服务器先问根域名服务器.com 域名服务器的 IP 地址,而后再问.baidu 域名服务器,顺次类推)

4. 小结

浏览器通过向 DNS 服务器发送域名,DNS 服务器查问到与域名绝对应的 IP 地址,而后返回给浏览器,浏览器再将 IP 地址打在协定上,同时申请参数也会在协定搭载,而后一并发送给对应的服务器。接下来介绍向服务器发送 HTTP 申请阶段,HTTP 申请分为三个局部:TCP 三次握手、http 申请响应信息、敞开 TCP 连贯。

三、TCP 三次握手

在客户端发送数据之前会发动 TCP 三次握手用以同步客户端和服务端的序列号和确认号,并替换 TCP 窗口大小信息

1.TCP 三次握手的过程如下:

  • 客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,由浏览器发动,通知服务器我要发送申请了)
  • 服务器发回一个带 SYN=1,ACK=X+1,Seq=Y 的响应包以示传播确认信息(第二次握手,由服务器发动,通知浏览器我筹备承受了,你连忙发送吧)
  • 客户端再回传一个带 ACK=Y+1,Seq=Z 的数据包,代表“握手完结”(第三次握手,由浏览器发送,通知服务器,我马上就发了,筹备承受吧)

2. 为啥须要三次握手

谢希仁著《计算机网络》中讲“三次握手”的目标是“为了避免已生效的连贯申请报文段忽然又传送到了服务端,因此产生谬误”。

四、发送 HTTP 申请

TCP 三次握手完结后,开始发送 HTTP 申请报文
申请报文由申请行(request line)、申请头(header)、申请体三个局部组成, 如下图所示:

1. 申请行蕴含申请办法、URL、协定版本

  • 申请办法蕴含 8 种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
  • URL 即申请地址,由 < 协定 >://< 主机 >:< 端口 >/< 门路 >?< 参数 > 组成
  • 协定版本即 http 版本号
POST  /chapter17/user.html HTTP/1.1

以上代码中“POST”代表申请办法,“/chapter17/user.html”示意 URL,“HTTP/1.1”代表协定和协定的版本。当初比拟风行的是 Http1.1 版本

2. 申请头蕴含申请的附加信息,由关键字 / 值对组成,每行一对,关键字和值用英文冒号“:”分隔。

申请头部告诉服务器有对于客户端申请的信息。它蕴含许多无关的客户端环境和申请注释的有用信息。其中比方:Host,示意主机名,虚拟主机;Connection,HTTP/1.1 减少的,应用 keepalive,即长久连贯,一个连贯能够发多个申请;User-Agent,申请收回者,兼容性以及定制化需要。

3. 申请体,能够承载多个申请参数的数据,蕴含回车符、换行符和申请数据,并不是所有申请都具备申请数据。

name=tom&password=1234&realName=tomson

下面代码,承载着 name、password、realName 三个申请参数。

五、服务器解决申请并返回 HTTP 报文

1. 服务器

服务器是网络环境中的高性能计算机,它侦听网络上的其余计算机(客户机)提交的服务申请,并提供相应的服务,比方网页服务、文件下载服务、邮件服务、视频服务。而客户端次要的性能是浏览网页、看视频、听音乐等等,两者截然不同。每台服务器上都会装置解决申请的利用——web server。常见的 web server 产品有 apache、nginx、IIS 或 Lighttpd 等。
web server 负责管控的角色,对于不同用户发送的申请,会联合配置文件,把不同申请委托给服务器上解决相应申请的程序进行解决(例如 CGI 脚本,JSP 脚本,servlets,ASP 脚本,服务器端 JavaScript,或者一些其它的服务器端技术等),而后返回后台程序解决产生的后果作为响应。

2.MVC 后盾解决阶段

后盾开发当初有很多框架,但大部分都还是依照 MVC 设计模式进行搭建的。
MVC 是一个设计模式,将应用程序分成三个核心部件:模型(model)– 视图(view)– 控制器(controller),它们各自解决本人的工作,实现输出、解决和输入的拆散。

1、视图(view)

它是提供给用户的操作界面,是程序的外壳。

2、模型(model)

模型次要负责数据交互。在 MVC 的三个部件中,模型领有最多的解决工作。一个模型能为多个视图提供数据。

3、控制器(controller)

它负责依据用户从 ” 视图层 ” 输出的指令,选取 ” 模型层 ” 中的数据,而后对其进行相应的操作,产生最终后果 。控制器属于管理者角色,从视图接管申请并决定调用哪个模型构件去解决申请,而后再确定用哪个视图来显示模型解决返回的数据。
这三层是紧密联系在一起的,但又是相互独立的,每一层外部的变动不影响其余层。每一层都对外提供接口(Interface),供下面一层调用。
至于这一阶段产生什么?简而言之,首先浏览器发送过去的申请先通过控制器,控制器进行逻辑解决和申请散发,接着会调用模型,这一阶段模型会获取 redis db 以及 MySQL 的数据,获取数据后将渲染好的页面,响应信息会以响应报文的模式返回给客户端,最初浏览器通过渲染引擎将网页出现在用户背后。

3.http 响应报文

响应报文由响应行(request line)、响应头部(header)、响应主体三个局部组成。如下图所示:

(1) 响应行蕴含:协定版本,状态码,状态码形容

状态码规定如下:
1xx:批示信息 – 示意申请已接管,持续解决。
2xx:胜利 – 示意申请已被胜利接管、了解、承受。
3xx:重定向 – 要实现申请必须进行更进一步的操作。
4xx:客户端谬误 – 申请有语法错误或申请无奈实现。
5xx:服务器端谬误 – 服务器未能实现非法的申请。

(2) 响应头部蕴含响应报文的附加信息,由 名 / 值 对组成

(3) 响应主体蕴含回车符、换行符和响应返回数据,并不是所有响应报文都有响应数据

六、浏览器解析渲染页面

浏览器拿到响应文本 HTML 后,接下来介绍下浏览器渲染机制

浏览器解析渲染页面分为一下五个步骤:

  • 依据 HTML 解析出 DOM 树
  • 依据 CSS 解析生成 CSS 规定树
  • 联合 DOM 树和 CSS 规定树,生成渲染树
  • 依据渲染树计算每一个节点的信息
  • 依据计算好的信息绘制页面

1. 依据 HTML 解析 DOM 树

  • 依据 HTML 的内容,将标签依照构造解析成为 DOM 树,DOM 树解析的过程是一个深度优先遍历。即先构建以后节点的所有子节点,再构建下一个兄弟节点。
  • 在读取 HTML 文档,构建 DOM 树的过程中,若遇到 script 标签,则 DOM 树的构建会暂停,直至脚本执行结束。

2. 依据 CSS 解析生成 CSS 规定树

  • 解析 CSS 规定树时 js 执行将暂停,直至 CSS 规定树就绪。
  • 浏览器在 CSS 规定树生成之前不会进行渲染。

3. 联合 DOM 树和 CSS 规定树,生成渲染树

  • DOM 树和 CSS 规定树全副筹备好了当前,浏览器才会开始构建渲染树。
  • 精简 CSS 并能够放慢 CSS 规定树的构建,从而放慢页面相应速度。

4. 依据渲染树计算每一个节点的信息(布局)

  • 布局:通过渲染树中渲染对象的信息,计算出每一个渲染对象的地位和尺寸
  • 回流:在布局实现后,发现了某个局部产生了变动影响了布局,那就须要倒回去从新渲染。

5. 依据计算好的信息绘制页面

  • 绘制阶段,零碎会遍历出现树,并调用出现器的“paint”办法,将出现器的内容显示在屏幕上。
  • 重绘:某个元素的背景色彩,文字色彩等,不影响元素四周或外部布局的属性,将只会引起浏览器的重绘。
  • 回流:某个元素的尺寸产生了变动,则需从新计算渲染树,从新渲染。

七、断开连接

当数据传送结束,须要断开 tcp 连贯,此时发动 tcp 四次挥手

  • 发动方向被动方发送报文,Fin、Ack、Seq,示意曾经没有数据传输了。并进入 FIN_WAIT_1 状态。(第一次挥手:由浏览器发动的,发送给服务器,我申请报文发送完了,你筹备敞开吧)
  • 被动方发送报文,Ack、Seq,表示同意敞开申请。此时主机发起方进入 FIN_WAIT_2 状态。(第二次挥手:由服务器发动的,通知浏览器,我申请报文承受完了,我筹备敞开了,你也筹备吧)
  • 被动方向发起方发送报文段,Fin、Ack、Seq,申请敞开连贯。并进入 LAST_ACK 状态。(第三次挥手:由服务器发动,通知浏览器,我响应报文发送完了,你筹备敞开吧)
  • 发动方向被动方发送报文段,Ack、Seq。而后进入期待 TIME_WAIT 状态。被动方收到发起方的报文段当前敞开连贯。发起方期待肯定工夫未收到回复,则失常敞开。(第四次挥手:由浏览器发动,通知服务器,我响应报文承受完了,我筹备敞开了,你也筹备吧)
正文完
 0