前端-深入探讨网络面试题

第一关 请求-文件、数据、连接

文件类的请求:加载HTMl、CSS
数据: ajax请求(基于HTTP,HTTP基于TCP),如何建立连接的(三次握手,为什么不是两次或者四次),socket长连接,beacon(在浏览关闭的时候也能保持连接),长连接方式(socket、websocket、HTTP只要不返回也可以实现长连接)。

协议

HTTP 与 TCP的区别
解释性的题(可以举例子)
假设现在有一个网站
http://www.baidu.com 这里的http是应用层协议,TCP是传输层协议,http是基于tcp传输实现的应用层连接。

http请求、发送、状态(状态码)

http版本:

http1.0:
http1.1:引入长连接
http2.0:二进制 | 多路复用 (没有并发的限制)| 包头压缩 | 服务端推送
http3.0: HTTP3基于UDP协议重新定义了连接,在QUIC层实现了无序、并发字节流的传输,解决了队头阻塞问题

https

请添加图片描述
https相对于http更加安全,但是性能损耗更发大
优化方法: 整合请求、长连接

白屏现象

上一个请求依赖前一个请求的返回值
ajax1 => ajax2 => ajax3
代码书写
回调 => 回调地狱 => Promise => async / await
可以从network面板中有个瀑布/时间线,如果其中ajax1请求失败或者超时了,就会产生阻塞,此时就会发生白屏现象
阻塞场景: 代码层面 网关层面(比如请求一个认证信息失败了) 没有使用CDN,服务器负载过多也会导致请求缓慢触发请求超时
在这里插入图片描述

当请求数据总是很大时,该怎么优化

单纯从网络协议层来优化的话,可以将内容压缩,例如图片上传的时候,可以使用Accept-Encoding进行压缩 => 期望返回内容被压缩,以减少网络流量,提升性能, 比如可以压缩图片的base64码
有三种压缩方式gzip deflate br
但是需要看服务端支不支持压缩或者服务端性能不足导致没有开启压缩,第三方Api需要手动开启压缩
所以Accept-Encoding是一种请求性的并不是强制性的策略

如果服务端支持压缩也开启了压缩,响应头里具有Content-Encoding:gzip

请求头

1、请求头中的 Cookie (cookie是一种小型文本文件,用于存储用户信息,实现网站的登录、记录、分析等功能。) =>

cookie、localStorage、sessionStorage区别
特性CookielocalStoragesessionStorage
数据的生命期一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效除非被清除,否则永久保存仅在当前会话下有效,关闭页面或浏览器后被清除
存放数据大小4K左右一般为5MB一般为5MB
与服务器端通信每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题仅在客户端(即浏览器)中保存,不参与和服务器的通信仅在客户端(即浏览器)中保存,不参与和服务器的通信
易用性需要程序员自己封装,源生的Cookie接口不友好源生接口可以接受,亦可再次封装来对Object和Array有更好的支持源生接口可以接受,亦可再次封装来对Object和Array有更好的支持

Cookie无法跨域,需要以一种非常不安全的形式使其支持跨域,例如将ifram中的cookie传出来,会非常不安全
跨tab通信(实质上就是进程之间怎么通信),cookie需要同源才支持,sessionStorage不能跨tab,但是localStorage凌驾于浏览器之上所以可以跨tab通信
其他存储方式还有indexDB(键值对数据库)、webSQL(完整的关系型数据库),Vuex之类的

场景题

登陆态以及自动登录,对cookie
小程序登录态(微信一键登录)

重定向(性能优化场景)

强缓存和协商缓存
last-modified Etag

请求控制 手写并发

class LimitPromise {
	constructor(max) {
		this._max = max || 6
		// 当前正在执行的数量
		this._count = 0
		// 等待的任务队列
		this._taskQueue = []
		// 单例模式-提供一个实例
		this.instance = null
	}
	run (caller) {
		// 主入口
		// 输入:外部要添加的请求,每个caller就是一次请求
		// 输出: 返回队列处理的Promise
		return new Promis((resolve, reject) => {
			// 创建处理任务
			const task = this._createTask(caller, resolve, reject)
			// 判断是否达到并发池上限
			if (this._count >= this._max) {
				this.taskQueue.push(task)
			} else {
				task()
			}
		})
	}
	_creteTask() {
		return () => {
			caller().then(res => {
				resolve(res)
			}).catch(err => {
				reject(err)
			}).finally(() => {
				this._count--
				if(this._taskQueue.length > 0) {
					const task = this._taskQueue.shift()
					task()
				}
			})
			this._count++
		}
	}
	static getInstance (max) {
		if(!this.instance) {
			this.instance = new LimitPromise(max)
		}
		return this.instance
	}
}
// 调用
const LimitPromis = LimitPromise.getInstance(3)

const asyncTask = () => {
	return new Promise((resolve, reject) => {})
}

for(let i = 0; i <= 7; i++) {
	LimitPromise.run(asyncTask).then(
		result => {
			// ...
		},
		error => {
			// ...
		}
	)
}

总结: 请求数据很多的时候可以进行压缩、请求控制并发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/507548.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {map<int,int> a;//提供一对一的hashvector<int> b(2,-1);//用来承载结果&#xff0c;初始化一个大小为2&#xff0c;值为-1的容…

Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

【写在前面】 之前应公司需要&#xff0c;给公司写过一整套直播的库( 推拉流&#xff0c;编解码)&#xff0c;类似于 libobs。 结果后来因为没有相关项目&#xff0c;便停止开发&维护了。 不过里面很多有用的组件&#xff0c;然后也挺好用的&#xff0c;遂开源出来一部分。…

总结HTTPS加密流程

前言 本篇博客将介绍HTTPS加密的具体流程&#xff0c;坐好板凳发车啦~~ 一.HTTPS是什么 HTTPS也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层 HTTP协议内容都是按照文本的方式明文传输的&#xff0c;这就导致在传输的过程中可能有一些内容被篡改。 …

leetcode 热题 100(部分)C/C++

leetcode 热题 100 双指针 盛最多水的容器 【mid】【双指针】 思路&#xff1a; 好久没写代码sb了&#xff0c;加上之前写的双指针并不多&#xff0c;以及有点思维定势了。我对双指针比较刻板的印象一直是两层for循环i&#xff0c;j&#xff0c;初始时i,j都位于左界附近&…

集成百兆,千兆,万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用

Hqst华轩盛(石门盈盛)电子导读&#xff1a;集成百兆&#xff0c;千兆&#xff0c;万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用 一 ﹑集成百兆&#xff0c;千兆&#xff0c;万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用前景 近年…

《Slime War: Idle Hero》

Slime War: Idle Hero 类型&#xff1a;Idle Arks 模拟经营 视角&#xff1a;2d 乐趣点&#xff1a;卡牌收集&#xff0c;战斗成长&#xff0c;家园建造&#xff0c;英雄培养 时间&#xff1a;2023-2024 个人职责&#xff1a; 1、参与原生DEMO研发制作 2、主导基础框架的讨论…

非关系型数据库之Redis配置与优化

一、关系数据库与非关系型数据库 1.1关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上一般面向于记录。SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0c;用…

OpenHarmony实战:RK3568 开发板镜像烧录指南

前言 烧录开发板是每个开发者的必修课&#xff0c;每次对系统的修改务必进行烧录测试&#xff0c;确保修改正确和不会引入新问题。 本文基于 Windows10&#xff0c;以 RK3568 开发板为例&#xff0c;指导如何烧录 OpenHarmony 镜像&#xff0c;镜像也叫固件。Hihoop&#xff…

如何制作CG动画?渲染农场在其中扮演的角色是什么?

CG动画制作是一个融合了艺术与技术的综合流程&#xff0c;从初步的概念设计延伸至最终成品。在这一过程中&#xff0c;渲染农场扮演着核心角色&#xff0c;它通过提供充足的计算能力来加快动画的渲染速度&#xff0c;从而确保创作团队能够以高效率制作出优质的动画作品。 一、c…

京东云免费服务器申请入口,2024年最新免费云主机

京东云服务器免费6月申请入口 jdyfwq.com 在京东云免费云主机申请页面&#xff0c;免费云服务器配置为云主机2核4G5M和轻量云主机2C2G可以申请免费使用&#xff0c;目前京东云免费云服务器申请时长从之前的6个月缩短到1个月&#xff0c;如下图&#xff1a; 京东云免费云主机 云…

[Windows]服务注册工具(nssm)

文章目录 官网下载地址百度云下载地址NSSM常用命令 使用场景&#xff1a;例如现在我们想开启自动启动一个Java服务,nginx,node等。 官网下载地址 https://nssm.cc/download 百度云下载地址 链接&#xff1a;https://pan.baidu.com/s/111fkBWIS7CTlWIj80Kc8Sg?pwdanan 提取码…

【二叉树】Leetcode 114. 二叉树展开为链表【中等】

二叉树展开为链表 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

中间系统-度量值、主机名映射、收敛特性、区域迁移、多拓扑

中间系统-度量值&#xff0c;主机名映射&#xff0c;收敛特性 1、ISIS度量值 ISIS Cost计算&#xff1a;一个接口的cost固定等于10. ISIS的Cost值范围为1~63&#xff08;称为IS-IS开销类型为narrow窄度量&#xff09;&#xff0c;不够使用只能做扩展&#xff08;宽度量&…

SwiftUI Swift 选择图片 添加图片

1. 添加记帐时添加图片功能 2. Show me the code // // TestPhotoPicker.swift // pandabill // // Created by 朱洪苇 on 2024/3/30. //import SwiftUI import PhotosUI import Foundationstruct TestPhotoPicker: View {State private var selectedItem: PhotosPickerIt…

机器学习在智能音箱中的应用探索与实践:让声音更懂你

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

多微信聚合聊天神器,让你的社交更高效!

对于那些拥有多个微信号的用户来说&#xff0c;频繁地在不同微信号和设备之间切换既麻烦又容易搞混。这时候&#xff0c;一款多微信聚合聊天神器——微信管理系统应运而生&#xff0c;为我们带来了极大的便利与高效。 下面一起来看看它都有哪些功能吧&#xff01; 1、多微信同…

Google Chrome将某个页签静音,不是网站

Google Chrome将某个页签静音&#xff0c;不是网站 打开chrome://flags/在里面搜索&#xff0c;audio&#xff0c;找到Tab audio muting UI contorl的选项&#xff0c;右侧设置为Enable。重新启动浏览器。 发现有声音的浏览器页签有一个喇叭图标&#xff0c;点击一下就行了。

【游戏分析】FPS游戏狩猎百发百中

某某游戏狩猎玩法及其类似于FPS游戏 即3D射击 所以同样拥有 自动瞄准功能和爆头功能 想达到百发百中我们就要精准的计算出3D朝向值 读取人物坐标 遍历怪物,读取怪物坐标比较简单,不过多陈诉 朝向自然而然一定是我们和敌人的坐标计算出来的 那么怎么计算的呢&#xff1f; 我…

web安全学习笔记【21】——安全开发

安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用 #知识点&#xff1a; 1、PHP留言板前后端功能实现 2、数据库创建&架构&增删改查 3、内置超全局变量&HTML&JS混编 4、第三方应用插件&传参&对象调用 DAY1 #章…