(1)**解析URL:**首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果合法,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则进行转义后再进行下一过程。

(2)**缓存判断:**浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。

(3)**DNS解析:**下一步首先需要获取的是输入的 URL 中的域名的 IP 地址,首先会判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。

(4)**获取MAC地址:**当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。

(5)**TCP三次握手:**下面是 TCP 建立连接的三次握手的过程,首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,服务端接收到请求后向客户端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。

(6)**HTTPS握手:**如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。

(7)返回数据:数据在进入服务端之前,可能还会先经过负责负载均衡的服务器,它的作用就是将请求合理的分发到多台服务器上,这时假设服务端会响应一个 HTML 文件。首先浏览器会判断状态码是什么,如果是 200 那就继续解析,如果 400 或 500 的话就会报错,如果 300 的话会进行重定向,这里会有个重定向计数器,避免过多次的重定向,超过次数也会报错。浏览器开始解析文件,如果是 gzip 格式的话会先解压一下,然后通过文件的编码格式知道该如何去解码文件。文件解码成功后会正式开始渲染流程.

(8)**页面渲染:**浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。

(9)**TCP四次挥手:**最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。

详情看:

https://juejin.cn/post/6844903952476028941

用户输入url,到浏览器缓存机制检查,到HTTP请求包结构,到DNS解析,到连接建立,到服务器端处理(如动态页面处理、静态页面返回,CDN相关知识),到浏览器收到HTML内容怎么解析,到怎么并行加载串行执行CSS、JS,到怎么构造渲染树渲染页面,到怎么根据请求头把内容缓存到浏览器端。如果此时你还能补充HTTPS、同构直出、Service Worker之类,那就更好。

当在浏览器中输入 Google.com 并按下回车之后发生了什么?相关推荐

  1. 浏览器中输入Google.com然后按下回车键

    按下回车键,当然会产生操作系统的中断响应,产生一个WM_KEYDOWN消息,当然这些都不是计算机网络的东西,这里只讨论计算机网络相关的东西: 解析URL 浏览器通过URL能够知道下面的信息: Prot ...

  2. 在浏览器中输入 Google.com 回车之后发生了什么?

    这个仓库试图回答一个古老的面试问题:当你在浏览器中输入google.com并且按下回车之后发生了什么? 不过我们不再局限于平常的回答,而是想办法回答地尽可能具体,不遗漏任何细节. 这将是一个协作的过程 ...

  3. 学科综合 | 当你在浏览器中输入Google.com并且按下回车之后发生了什么?

    来自:skyline75489 (Liu Jialiang) · GitHub 译文出处:skyline75489 链接:https://github.com/skyline75489/what-ha ...

  4. 当你在浏览器中输入 google.com 后按下回车发生了什么?

    按下"g"键 接下来的内容介绍了物理键盘和系统中断的工作原理,但是有一部分内容却没有涉及.当你按下"g"键,浏览器接收到这个消息之后,会触发自动完成机制.浏览器 ...

  5. 面试必问系列之在浏览器中输入URL后到网页显示 其间发生了什么?

    文章目录 @[TOC](文章目录) 1:解析URL网址,从而生成发送给Web服务器的Http请求信息 2:真实地址查询-----(DNS域名解析) 3:调用协议栈 4:可靠的传输 TCP 5:远程定位 ...

  6. 一名学生A希望访问网站www.google.com。学生A在其浏览器中输入http://www.google.com并按回车.....

    一名学生A希望访问网站www.google.com.学生A在其浏览器中输入http://www.google.com并按回车,直到Google的网站首页显示在其浏览器中,请问: (1) 在此过程中,按 ...

  7. 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3

    备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...

  8. 从在浏览器中输入URL到页面渲染出来的完整过程是怎样的?

    从宏观上看,主要包括以下几个步骤:域名解析.建立连接.发送请求.响应数据.关闭连接.下面以在Chrome浏览器中输入https://yq.aliyun.com/articles/580962为例,讨论 ...

  9. c++软件开发面试旋极面试题_经典软件开发面试题:浏览器中输入一个网址后发生了什么?...

    经典软件开发面试题:浏览器中输入一个网址后发生了什么? ​ 大家好, 这一期呢,我们来谈一个经典的面试题.这种题目是在浏览器中输入一个网址以后, 会显示一个网页,这期间到底发生了什么? 答案要求说的越 ...

  10. 在浏览器中输入URL按下回车键后发生了什么

    在浏览器中输入URL按下回车键后发生了什么 [1]解析URL [2]DNS查询,解析域名,将域名解析为IP地址 [3]ARP广播,根据IP地址来解析MAC地址 [4]分别从应用层到传输层.网络层和数据 ...

最新文章

  1. 理解面向过程和面向对象的程序设计方法
  2. R语言abline函数为图像添加竖线、横线、斜线、回归线实战
  3. CICC科普栏目丨时间之箭:从熵到大爆炸再到万物理论(一)
  4. RS-232串口线与以太网的八芯双绞线的对比,为什么不使用串口线来连接电脑和路由器?
  5. Unity Scene为每一个游戏物体进行扩展编辑
  6. mysql index sub part_mysql中的key和index 理解
  7. VGG16与SSD算法Tensorflow代码实现对比
  8. three.js获取模型大小
  9. C++程序中可以没有using namespace std;这一句吗
  10. Linux系统 nginx伪静态配置及nginx重启
  11. 绿幕抠图-为你的想象插上翅膀
  12. 大一上学期高数期中复习 高数叔复习笔记
  13. dd大牛的背包九讲 pdf下载_「背包问题九讲」dd大牛的背包九讲-背包问题汇总 - seo实验室...
  14. ERP员工入职登记(五)
  15. element-ui 表格合并问题
  16. 【笔记】创新思维工作坊(一)
  17. 数据库中的层次模型是什么(树形结构)
  18. 相关模块的接口表及API
  19. C++标准库实现WAV文件读写
  20. K-means均值聚类算法python代码实现

热门文章

  1. 北京内推 | 微软亚洲研究院自然语言计算组招聘NLP研究实习生
  2. java todo注释_Java自定义注解
  3. # ubuntu 16.04 vivado2017.4版本用JTAG烧写usrpx310的固件
  4. URAL 1069 Prufer Code 优先队列
  5. 在家佛弟子对待工作的态度——世俗八正道
  6. 智能车基础学习FTM模块
  7. ping网络通不通、ttl讲解、查询ip归属地、tracert路由分析诊断
  8. css经典布局——圣杯布局
  9. 银行加息有什么影响(央行加息,对股市和房价有何影响?)
  10. 公告栏模板php代码,[免插件]为wordpress主题怎样添加滚动公告栏功能