• 从输入URL到展示出页面这个过程发生了什么


    1.前言

    看到标题应该就知道我们这篇文章要讲什么了,这其实是一道很经典的面试题,所以特地拿出一篇文章讲解,但由于本人水平有限且该题目为开放性题目,所以答案不唯一且可能有所疏漏。

    2.补充(DNS) 

    考虑到之前没有讲到过DNS(域名服务器),所以先在这里简单介绍,不过多深入。

    DNS,即Domain Name System,域名系统。

    DNS是一整套从域名映射到IP的系统。 TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息,于 是人们发明了域名,并通过域名系统来映射域名和IP地址。(简单说就是域名经过DNS就会被转换成一个IP地址)

    比如这就是一组简单的对应关系:

    而我们最早的DNS系统其实就是一个被称作hosts的文件,现在也可以在我们的电脑上找到。他记载了域名和IP的对应关系,但是现在已经很少使用了。因为现在的域名成千上万,全部写在一个文件中是不现实的,所以就有了专门的DNS服务器来保存这个文件。 当我们的电脑需要DNS解析时只需要直接访问DNS服务器即可。

    下面是一些概念:

     域名是一个字符串,如 www.baidu.com , hr.nowcoder.com

    域名系统为一个树形结构的系统,包含多个根节点。其中:

    1. 根节点即为根域名服务器,最早IPv4的根域名服务器全球只有13台,IPv6在此基础上扩充了 数量。

    2. 子节点主要由各级DNS服务器,或DNS缓存构成。

    DNS域名服务器,即提供域名转换为IP地址的服务器。

    浏览器、主机系统、路由器中都保存有DNS缓存。

    Windows系统的DNS缓存在 C:\Windows\System32\drivers\etc\hosts 文件中, Mac/Linux系统的DNS缓存在 /etc/hosts 文件中。

    网络通信发送数据时,如果使用目的主机的域名,需要先通过域名解析查找到对应的IP地址:

    域名解析的过程,可以简单的理解为:发送端主机作为域名系统树形结构的一个子节点,通过域名 信息,从下到上查找对应IP地址的过程。如果到根节点(根域名服务器)还找不到,即找不到该主 机。

    域名解析使用DNS协议来传输数据。DNS协议是应用层协议,基于传输层UDP或TCP协议来实现。 


    但是互联网发展如此迅速,DNS服务器能够承受住如此大的访问量吗?

     所以就有了以下两种解决方案:

    1.主机在请求DNS后会在本地缓存映射关系(每隔一段时间才会去更新) 

    2.在全世界架设很多的DNS镜像服务器(从根服务器上同步数据的服务器称为镜像服务器)

    基于第二点,我们可以说DNS既是一个协议,也是一套系统(分布式服务器系统)

    3.正文

    站在我的角度来看,我会从六个方向去分析

    1.应用层的角度:DNS解析,HTTP请求的构造

    2.传输层角度:TCP协议/UDP协议等等

    3.网络层的角度:网络数据报转发过程

    4.数据链路层的角度:以太网数据帧,MTU影响分包,MAC地址等

    5.物理层角度:上述数据会被转化成光信号电信号等进行编码传输

    6.总结:发送过程涉及从上到下封装,接收方涉及从下到上的分用,上述只是客户端给服务器发送请求的过程,之后服务器还需要根据需求计算响应,再按照相似的流程将数据返回给客户端

    这主要是站在后端的角度去分析,假如站在前端的角度可能就是另一种风景了。 

    3.1  DNS解析

    (1)DNS解析:

    在浏览器输入熟悉的网址 比如www.baidu.com,这个叫做网址,并不是百度真实的地址,互联网中每一台机器都有唯一标识的ip地址。网址和ip地址的转换,就是DNS解析。

    ​ 网址简单容易记住,但是ip地址很复杂,所以需要一个地址簿记录哪个ip对应哪一个网址,这个地址簿就是DNS服务器

    (2)DNS服务器查找过程

    DNS域名查找,在客户端和浏览器,本地DNS之间是递归查询,在本地DNS服务器与根域及其子域之间是迭代查询

    需要获取到域名的对应IP,需要访问域名服务器,域名服务器访问流程大致如下:

    查找浏览器缓存 ——> 查找操作系统缓存 ——> 查找路由器缓存 ——> 查找本地DNS缓存 ——> 递归查询 

    递归查询过程如下:

    查找就可能找到或者找不到两种情况

    ①本地DNS服务器找到:在客户端浏览器输入url网址后,在递归查找找到ip地址,任何一个步骤找到都会结束查找过程。

    ②本地DNS服务器找不到:根据本地DNS服务器设置的转发器进行查询,迭代查找。

    (3)解析URL
    完整的url:协议+域名+端口+路径[+参数] [+描点]
    解析url是因为某些参数包含的特殊字符会产生歧义,url对非安全字符转义,用的是百分号编码
    encodeURL 不会编译= ? & ;/等符号,所以用来编码整个URL;而encodeURLComponent编码会编译以上特殊字符,所以用来编码参数部分


    (4)检查浏览器是否有缓存
    注意检查缓存发生在发起请求之前进行
     

    3.2 建立TCP连接(3次握手) 

    首先判断是否是https,若协议是https则作加密处理

    HTTPS由两部分组成HTTP+SSL/TLS,在http上加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS加密,传输的数据自然也是加密后的数据。

    HTTPS=HTTP+加密+认证+完整性保护

    而有关TCP协议的详解可以看到下面这篇文章,我就不在本文再次赘述了。

    TCP网络协议_invictusQAQ的博客-CSDN博客

    其中TCP的各种机制如确认应答,滑动窗口等需要我们去重点关注

    3.3网络数据报转发过程

    这个主要是涉及到我们的数据报是如何通过IP协议发送出去的,以及一些有关IP协议的注意事项

    IP 协议的相关特性_invictusQAQ的博客-CSDN博客

    3.4 数据链路层角度

    这里我们需要重点关注数据链路层的协议对数据传输的影响,比如ARP和RARP他们在数据传输中的作用,以及MTU对IP协议的影响。

    数据链路层重点协议_invictusQAQ的博客-CSDN博客

    3.5 物理层和业务处理 

    物理层的部分由于我们主要涉及软件层面,所以不多赘述。而服务器在收到客户端的请求后会对客户端的数据进行处理,这里取决于具体的业务代码。而相关的Servlet/Spring等我们会在之后逐渐学习。

    3.6 浏览器解析渲染页面

    留白,水平有限,可在网络自行学习

    3.7 断开TCP连接(四次挥手)

    TCP网络协议_invictusQAQ的博客-CSDN博客

    4.后记 

    由于水平有限,很多东西没有讲到,例如构建HTTP请求,浏览器解析渲染页面和一些框架的知识都没有提到

  • 相关阅读:
    【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory
    GBase8s数据库由数据库对象执行的对照
    【Spring系列】- Spring循环依赖
    ES6 Iterator 和 for...of 循环
    数据分析 - 概率计算
    Elasticsearch检索
    STM32cubemx对FreeRTOS的适配(工程模板配置)
    ac7260网卡不能连5g
    什么是网络存储服务器
    Vue (十五) --------- UI 组件库
  • 原文地址:https://blog.csdn.net/weixin_60778429/article/details/126337686