浏览器输入URL发生的那些事儿

138 阅读6分钟

image.png

计网OSI七层

应用层 HTTP FTP DNS

表示层

会话层

传输层 TCP UDP

网络层

数据链路层 Mac地址

物理层 电线光纤

1 Url解析-判断url是否正确

协议 主机地址 端口号 文件路径 查询参数 锚点

协议: http or https 443

端口号:默认80

文件路径:资源在网站的位置

查询参数:?key1=value1&key2=value2&token=xxx

锚点: #xxx

2 DNS域名解析

缓存判断:浏览器 操作系统 路由器 ISP缓存

  • 浏览器缓存:浏览器检查是否在缓存中
  • 操作系统缓存:操作系统DNS缓存,去本地的hosts文件查找
  • 路由器缓存:路由器DNS缓存
  • ISP 缓存: ISP DNS缓存(ISP DNS 就是在客户端电脑上设置的首选 DNS 服务器,又称本地的DNS服务器)

IP查找:根服务器-顶级域名服务器-域名服务器

image.png

3 TCP三次握手

4 浏览器发送请求-HTTP请求报文 并携带请求体信息

  • 请求行:有请求方法、请求的url、http协议及其版本

  • 请求头:把浏览器的一些基础信息告诉服务器。比如包含了浏览器所使用的操作系统、浏览器内核等信息,以及当前请求的域名信息、浏览器端的 Cookie 信息等

  • 空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头

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

5.服务器响应请求 并返回数据

  • 响应行/状态行:由 HTTP 版本协议字段、状态码和状态码的描述文本 3 个部分组成

  • 响应头:用于指示客户端如何处理响应体,告诉浏览器响应的类型、字符编码和字节大小等信息

  • 空行:最后一个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。

  • 响应体:返回客户端所需数据

juejin.cn/post/727909…

6.浏览器解析渲染页面

1.解析html-构建dom树 遇到script 等待下载完成再解析html,

    • 事实上,浏览器在解析HTML的过程中,遇到了 script元素是不能继续构建DOM树的
    • 它会 停止继续构建,首先下载JavaScript代码,并且执行JavaScript的脚本
    • 只有 等到JavaScript脚本执行结束后,才会继续解析HTML,构建DOM树
  • 为什么要这样做呢?

    • 这是 因为JavaScript的作用之一就是操作DOM,并且可以修改DOM
    • 如果我们等到DOM树构建完成并且渲染再执行JavaScript会造成严重的回流和重绘,影响页面的性能
    • 所以会在遇到script元素时,优先下载和执行JavaScript代码,再继续构建DOM树
  • 但是这个也往往会带来新的问题,特别是现代页面开发中:

    • 在目前的开发模式中(比如Vue、React),脚本往往比HTML页面更“重”,处理时间需要更长
    • 所以会造成页面的解析阻塞,在脚本下载、执行完成之前,用户在界面上什么都看不到
  • 为了解决这个问题,script元素给我们提供了两个属性(attribute) :defer和async

defer不需要等待脚本下载 async 独立脚本

2.解析css 构建css dom

3.渲染(render)dom树

image.png

7.四次挥手

  • 浏览器先判断是否为合法的url格式,不合法则在搜索引擎中搜索

  • 合法后,DNS解析会先判断缓存中是否有url的IP地址。

  • 缓存的查询顺序是:浏览器缓存 -> 操作系统缓存(本地的hosts文件) -> 路由器缓存 -> 本地的DNS服务器缓存

  • 在缓存中没有的情况,则向服务器发起请求查询ip地址。

  • 查询IP地址的顺序是:根域名服务器 -> 顶级域名服务器 -> 权威域名服务器。直到查找到返回,并将其存储在缓存中下次使用

  • TCP建立连接,也就是三次握手

  • 第一次握手,携带建立连接请求SYN=1和随机序列seq=x

  • 第二次握手,携带确定字段ACK=1、连接请求SYN=1、随机序列seq=y和ack为上一次握手的seq+1,就是x+1

  • 第三次握手,携带确定字段ACK=1、ack=y+1、seq=x+1

  • 如果是https,还有一个TCP四次握手

  • 第一次握手,客户端向服务端发送 支持的协议版本 + 支持的加密方法 + 生成的随机数

  • 第二次握手,服务端向客户端发送 证书 + 公钥 + 随机数

  • 第三次握手前,客户端会先验证证书有没有过期、域名对不对、是否可信机构颁发的。

  • 没有问题或者用户接受不受信的证书,浏览器会生成一个新的随机数

  • 第三次握手,将之前的三个随机数通过一定的算法生成会话秘钥,之后的加密解密都是用这个秘钥

  • 第四次握手,服务端收到回复,是用确定的加密方法进行解密,得到第三个随机数,使用同样的算法计算出会话秘钥

  • 建立连接之后,浏览器发送http请求

  • 请求报文由请求行、请求头、空行和请求体组成

  • 服务器解析请求报文,返回响应报文

  • 响应报文由响应行、响应头、空行和响应体组成,我们需要的html文件就在响应体中

  • 浏览器拿到html文件并开始解析,构建dom tree。遇到css文件,下载并构建CSSOM tree。等到两者都构建完成之后,一起构建Render tree。然后进行布局和绘制

  • 其中遇到了script标签,则停止构建dom tree,等下载完成之后才会继续构建dom tree

  • 当资源传输完毕之后,TCP关闭连接,进行四次挥手的操作,其中四次挥手的操作客户端和服务器都可以发起

  • 第一次挥手,携带断开连接的FIN=1、确定字段ACK=1、随机序列seq=u,ack=v

  • 第二次挥手,携带确定字段ACK=1、随机序列seq=v,ack=u+1

  • 第三次挥手,携带确定字段ACK=1、断开连接FIN=1、随机序列seq=w、ack=u+1

  • 第四次挥手,携带确定字段ACK=1,随机序列seq=u+1,ack=w+1

  • 等待2MSL后进入关闭状态

  • 断开连接,结束通讯

部分转:juejin.cn/post/727909…