输入URL过程

输入URL过程

1. URL解析:

  1. 判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。
  2. 由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。(可能会有这一步)
  3. 其他操作: 浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)。
  4. 检查缓存(强制缓存、协商缓存)(重点)

2. DNS查询

  1. 检查浏览器缓存—>检查本地的 Hosts 文件–>检查操作系统缓存–>没有则向 DNS 服务器发送查询请求。
  2. 路由器缓存–>本地域名服务器缓存:
    1. 在这,本地DNS主要指是指各地电信运营商提供的域名解析服务器。也就是我们在上网网卡里面你设置的DNS地址
    2. 一般本地 DNS 服务器地址由 ISP(互联网服务提供商)通过 DHCP 协议动态分配,我们仍可以手动把它修改为公共 DNS,比如 Google 提供的 8.8.8.8,国内的 114.114.114.114,它们分布在不同的地理位置上,借助 Anycast 技术,将请求路由到离用户最近的 DNS 服务器上。
  3. 本地域名服务器–>迭代或递归查询(根域名服务器,顶级域名服务器,权限域名服务器)
  4. 注意点:DNS劫持,DNS Prefetch,即DNS预获取

3. 建立TCP连接

  1. 拿到服务器IP,在浏览器发送HTTP请求之前,需要在浏览器和服务器之间建立一条TCP/IP连接

  2. 传输层:三报文握手,建立连接,TCP 传输报文主要掌握三次握手与四次挥手)

    下面的了解就行

    1. 网络层:将数据段打包,并加入源IP地址及目标IP地址,IP协议查询MAC地址,使用 ARP 协议查询它的 Mac 地址。
    2. 数据链路层:直接把数据通过 ARP 协议,向本网络的所有机器发送,接收方根据标头信息与自身 Mac 地址比较,一致就接受,否则丢弃
    3. 物理层:发送接收信息

4. 发送HTTP请求

  1. 与服务器建立了连接后,就可以向服务器发起请求了
  2. 在前面的步骤我们已经得到服务器的 IP 地址,浏览器会开始构造一个 HTTP 报文:请求行,请求头,请求体

5. 服务器永久重定向

为什么服务器一定要重定向而不是直接发送用户想看的网页内容呢?其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像http://www.yy.com/和http://yy.com/,搜索引擎会认为它们是两个网站,结果造成每个搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有就是用不同的地址会造成缓存友好性变差,当一个页面有好几个名字时,它可能会在缓存里出现好几次。

6. 服务器处理请求

  1. 后端从在固定的端口接收到TCP报文开始,它会对TCP连接进行处理,对HTTP协议进行解析(请求方法、域名、路径等),并且进行一些验证,并按照报文格式进一步封装成HTTP Request对象,供上层使用。

  2. 大点的网站可能会有Nginx反向代理

  3. 处理业务

 ![服务端处理](https://img-blog.csdnimg.cn/20210109110025177.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjE3MDk5,size_16,color_FFFFFF,t_70#pic_center)

7. 返回响应结果

将处理结果封装成响应报文发送给浏览器

8. 浏览器接受响应

  1. 浏览器接收到来自服务器的响应资源后,会对资源进行分析。
  2. 首先查看 Response header,根据不同状态码做不同的事(比如上面提到的重定向)。
  3. 如果响应资源进行了压缩(比如 gzip),还需要进行解压。
  4. 然后,对响应资源做缓存。
  5. 接下来,根据响应资源里的 MIME 类型去解析响应内容(比如 HTML、Image各有不同的解析方式)。

9. HTML解析https://juejin.cn/post/6844904020935606285

看另一篇笔记:HTML解析与CSS解析

解析过程是先构建dom树,再根据dom树构建渲染树,最后浏览器将渲染树绘制到页面上。

事件轮循机制

1. JS的解析是由浏览器中的JS解析引擎完成的,比如谷歌的是V8。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。但是又存在某些任务比较耗时,如IO读写等,所以需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。

2. JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。

10. 断开连接

四次挥手
为什么要等待2MSL

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值