• 从输入URL到页面显示过程中发生了什么


      当我们从浏览器输入网址(eg:https://www.baidu.com),到看到相关的页面显示。这个过程发生了什么

    一、查找DNS缓存

      ① 浏览器会先去找缓存记录,会检查5个地方(浏览器、操作系统、hosts文件、路由器、ISP)的缓存记录,首先查的地方是浏览器的缓存,浏览器会检查这个网址在浏览器中是否有一条对应的DNS记录,用来找到目标的 ip 地址。

      什么是DNS缓存

       DNS(Domain Name System) 是一个分布式的数据库,它用于维护网址 URL 到其 IP 地址的映射关系。在互联网中,IP 地址是计算机能够理解的一种地址,而 URL 的这种别名地址是我们人类能够理解和方便记忆的的地址,DNS 就负责把人类记忆的地址映射成计算机能够理解的地址。

      分布式、层次数据库

       DNS 使用了大量的DNS服务器,它们的组织模式一般是层次方式,并且分布在全世界范围内,没有一台 DNS 服务器能够拥有因特网上所有主机的映射。相反,这些映射分布在所有的DNS服务器上。

      分类

       大致分为三类 DNS 服务器:根 DNS 服务器顶级域 DNS 服务器权威 DNS 服务器

      ② 浏览器第二个需要检查的地方就是操作系统缓存。如果浏览器缓存中不存在DNS记录,浏览器就会调用操作系统的缓存。

      ③ 浏览器第三个检查的地方是本地的 hosts 文件缓存,如果有就使用。如果没有在自己的电脑上,浏览器就会和与之相连的路由器共同维护DNS记录。如果与之相连的路由器也没有 DNS 记录的话,浏览器就会检查 ISP 中,ISP缓存就是你本地通信服务商的缓存(本地DNS服务器)。比如:中国移动。如果本地DNS服务器有缓存,就返回结果,如果没有,就会发起DNS查询。

    二、发起DNS查询

       DNS 查询方式可分为三种:递归查询、迭代查询、非递归查询

    • 递归查询:在递归查询中,DNS 客户端要求 DNS 服务器 (一般为 DNS 递归解析器)
      将使用所请求的资源记录响应客户端,或者如果解析器无法找到该记录,则返回错误消息

    • 迭代查询:在迭代查询中,如果所查询的 DNS 服务器与查询名称不匹配,则其将返回对较低级别域名空间具有权威性的 DNS 服务器的引用。然后,DNS 客户端对引用地址进行查询。此过程继续使用查询链中的其他 DNS 服务器,直至发生错误或超时为止。

    • 非递归查询:当 DNS 解析器客户端查询 DNS 服务器以获取其有权访问的记录时通常会进行此查询,因为其对该记录具有权威性,或者该记录存在于其缓存中,DNS 服务器通常会缓存 DNS 记录,查询到后来能够直接返回缓存结果,防止带来更多带宽消耗和上游服务器的压力。

      所以,如果 ISP 服务器没有 DNS 缓存记录,它就会向 DNS 根服务器地址发起查询,跟服务器没有缓存记录,就会将其重定向顶级域名服务器(eg:.com),并给出地址

      顶级域名服务器则会将其重定向到权威服务器(eg:baidu.com)

      最后,本地DNS服务器会收到对应的映射关系,不仅要返回给用户,还要这种对应关系保存到缓存中,以备下次使用。

    三、封装 TCP 数据包

       浏览器得到目标服务器的 IP 地址后,根据 URL 中的端口号可以知道端口号(http 协议默认端口号是80,https默认端口号是443),会准备 TCP 数据包。数据包的封装会经过下面的层层处理,数据到达目标主机后,目标主机会解析数据包。

    四、浏览器与目标服务器建立 TCP 链接

       浏览器在拿到相应的地址后,会发起 TCP 链接请求,TCP连接需要三次握手(交换 SYN 同步和 ACK 确认消息的过程)

    • 服务器准备好接受 TCP 链接,然后服务器处于 LISTEN 状态,等待客户端连接请求。

    • 客户端向服务器发送请求,请求中首部同步 SYN = 1, 同时选择一个初始序号 sequence,简写seq = x,SYN报文段不允许携带数据,只消耗一个序号。此时,客户端进入 SYN-SEND 状态。

    • 服务器收到客户端连接后,需要确认客户端的报文段。在确认报文段中,把 SYN 和 ACK 都置为1。确认号是 ack=x+1,同时也为自己选择一个初始序号 seq=y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。此时,TCP 服务器进入 SYN-RECEIVED(同步收到) 状态。

    • 客户端在收到服务器发出的响应后,还需要给出确认连接。 确认连接中的 ACK 置为1, 序号为 seq = x+1,确认号为 ack = y+1。TCP规定,这个报文段可以携带数据也可以不携带数据,如果不携带数据,那么下一个报文段的序号仍为seq=x+1,这时,客户端进入 ESTABLISHED(已连接) 状态。

    • 服务器收到客户的确认后,也进入 ESTABLISHED 状态。

      通俗讲就是:

    • 客户端:老哥,我要和连接。
    • 服务端:好的,知道了。
    • 客户端:好嘞。

    四、浏览器向服务器发送 HTTP 请求

      一旦 TCP 连接建立完成后,就开始直接传输数据办正事了!

    五、服务端接收到请求,对请求进行处理,并返回数据

      服务器包含一个Web服务器,也就是 Apache 服务器,服务器会从浏览器接受请求并将其传递给请求处理处理程序并生成响应。

    六、浏览器接受响应显示相关内容

      对于获取到HTML,CSS,JS,图片等资源。通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。

  • 相关阅读:
    Java8新特性简介
    责任链模式
    Bean的生命周期
    APP中https证书有效性验证引发安全问题(例Fiddler可抓https包)
    程序员成长指南
    Go 代码性能优化小技巧
    Go slice 扩容机制分析
    一次 Go 程序 out of memory 排查及反思
    curl 常用操作总结
    Go benchmark 详解
  • 原文地址:https://www.cnblogs.com/aloneer/p/14616609.html
Copyright © 2020-2023  润新知