大家好,我是梅巴哥er。 又是继续学习的一天。
1,问:计算机网络TCP和UDP的区别
答:
- UDP用户数据报协议,TCP传输控制协议。
连接状态:TCP面向连接,UDP无连接。TCP是单对单传输数据,UDP适合多波发布可靠性:TCP利用握手、确认和重传机制,提供了可靠性保证。UDP可能会丢失,不保证数据发送成功有序性:TCP利用序列号,保证了消息的顺序交付。UDP的数据包是相互独立的,不具备有序性。速度:UDP更快量级:TCP属于重量级,UDP属于轻量级。
2,问:TCP连接和释放过程(即三次握手和四次挥手)
答:
-
三次握手:
- 客户端向服务器发送连接请求,
- 服务器确认收到请求,并向客户端返回应答,
- 客户端确认收到应答,并向服务器发送确认报文,服务器确认收到报文。建立连接。
-
四次挥手:
- 客户端向服务器发送请求释放连接的报文
- 服务器确认收到客户端的关闭请求,服务器进入半关闭状态,并向客户端返回确认报文
- 服务器做好释放连接准备,再次向客户端发送报文,并停止了向客户端发送数据,只能接收客户端发送的数据
- 客户端确认收到报文,确认服务器做好了释放连接准备,停止等待,关闭连接,并向服务器发送报文。服务器确认收到报文,关闭连接。
3,问:栈和队列的区别
答:
- 栈和队列,都是一种线性存储结构。
- 栈是单端口的,只能在一端操作,所以数据的存取都遵循“先进后出”的规则。理解举例:如点击页面A的连接,进入到B页面,点击B页面的连接,再进入到C页面。如果想回到A页面,就要先从C回退到B,再从B回退到A。
- 队列是双端口的,可以在两段操作,所以数据的存取可以做到“先进先出”。理解举例:常见的排队买东西就是队列类型的。
4,问:http, https, http2.0的演变过程和特性
答:
-
http特性:- 基于TCP/IP,可靠传输
- 支持客户端/服务器模式,即一个发请求,一个返回响应
- 简单、快速、灵活:客户端向服务器发送请求时,只需发送请求方式和路径即可。http允许传输任意类型的数据对象。
- 无状态:每个请求之间都是独立的
- 无连接:每次连接只处理一个请求
- 明文通信
-
http2.0特性:- 头部压缩
- 二进制格式
- 多路复用
- 服务器推送
- 请求优先级
-
https特性- 内容加密
- 验证身份
- 保护数据的完整性
5,问:手机扫码登陆怎么实现
答:
6,问:轮询,长轮询,websocket
答:
-
轮询:- 客户端向服务器发送请求,客户端获取数据,更新页面数据。页面加载后触发定时器,每隔一段时间,再次向服务器发送请求。
-
长轮询:- 客户端向服务器发送请求,客户端收到获取到数据后,更新页面数据,然后马上再发一次请求,看下有没有新的数据。递归执行。页面加载时,再次向服务器发送请求,看下有没有数据更新
-
websocket:- 持续连接,双向数据传输。服务器有数据更新时,就把数据发送给客户端,客户端收到新数据后,更新页面数据。
7,js计算精度丢失问题及解决
console.log((0.1 + 0.2) === 0.3) // false
console.log((0.2 + 0.3) === 0.5) // true
// 解决
// 先变成整数,计算完成后再变回小数
console.log((0.1*10 + 0.2*10)/10 === 0.3) // true
8,问:怎么阻止事件冒泡
答:
e.stopPropagation()
9,问:js基本数据类型
答:
string, number, boolean, null, undefined, symbol
10,问:XSS和CSRF攻防
答:
-
XSS: 跨站脚本攻击
- 攻击: 不需要用户登陆,在页面输入代码,向页面注入脚本,完成破坏操作。
- 反射型攻击:XSS代码出现在url中,作为输入发送给服务器,服务器收到后,再把响应内容和XSS代码一起返回给客户端,客户端收到后解析执行XSS代码,完成攻击。
- 存储型攻击:XSS代码会被存储到服务器,不需要在客户端重复提交XSS代码
- 防御:对用户输入数据进行编码、过滤和校正。
-
CSRF:跨站请求伪造
- 攻击:网站A的用户登陆网站A,并生成了cookie信息。随后用户又通过A网站访问了危险网站B。危险网站B携带用户A的cookie信息向网站A发请求,网站A不能确定这个请求是危险网站B发出的,还是用户A发出的,网站A识别了cookie,所以同意了请求,然后危险网站B就可以模拟用户A对网站进行操作。
- 防御:使用token,把token隐藏了http的head头中,使用Referer验证,核实请求来源,如果不是本站的请求,就拒绝。
11,问:js为什么是单线程的
答:
- 单线程:同时只做一件事,做完一件事后,再做另一件事。
- 作为单线程的脚本语言,js的主要用途是与用户互动和操作DOM。如果js是多线程,会面临许多问题。比如两个线程上,一个线程对该节点添加内容,另一个线程同时又删除了这个节点,在执行上就容易出现问题。而js的单线程特性,不需要考虑抢占资源等问题,恰恰提高了执行效率。
12,问:js数组方法中,哪些方法是改变原数组的,哪些不会
答:
- 增删、反转、排序。可以改变原数组。其他的不会。
13,问:foreach和map有什么区别,分别在什么情况下使用
答:
- map有返回值,返回的是一个新数组。
- forEach没有返回值
14,问:js原型链
答:
-
回答方向:
- 为啥会有原型这个概念
- 原型链图
15, 手撕代码:输出一个字符串中,第一个不重复的字符。如果没有不重复的字符,就输出-1
var arr = []
for(var i = 0; i < str.length; i++) {
var str1 = str.slice(0, i) + str.slice(i+1)
arr.push(str1.indexOf(str[i]))
}
arr.indexOf(-1) === -1 ? console.log(-1) : console.log(str[arr.indexOf(-1)])
16, 问:介绍一下七层网络模型,以及每一层都有哪些协议
答:
OSI:
- 物理层:EIA/TIA-232, EIA/TIA-499, V.35, V.24, RJ45, Ethernet, 802.3, 802.5, FDDI, NRZI, NRZ, B8ZS
- 数据链路层:Frame Relay, HDLC, PPP, IEEE 802.3/802.2, FDDI, ATM, IEEE 802.5/802.2
- 网络层:IP,IPX,AppleTalk DDP
- 传输层:TCP,UDP,SPX
- 会话层:RPC,SQL,NFS,NetBIOS,names,AppleTalk,ASP,DECnet,SCP
- 表示层:TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption,MPEG,MIDI,HTML
- 应用层:FTP,WWW,Telnet,NFS,SMTP,Gateway,SNMP
17,问:diff算法
答:
- diff算法:即差异查找算法
- 传统diff算法:计算两棵树的差异的时间复杂度是O(n³),计算成本过高
- React的diff算法:跨层级移动操作特别少,可以忽略不计。通过比较同层级的DOM节点,优化diff算法,计算两棵树的差异的时间复杂度是O(n)
18,问:map数组的时候,给标签里加key有什么作用
答:
- 不加key时,创建一个新标签,会把前面的标签都删除,然后重新创建一遍所有标签
- 加key后,创建一个新标签,不会操作前面的标签,而是单纯的添加新创建的标签。
19,问:react数据初始化应该在哪个生命周期,为什么
答:
constructor()
20,问:网址输入到渲染的全过程
答:
- DNS解析
- 先看缓存里有没有需要的资源,如果有,就直接从缓存里拿
- 如果没有,客户端就和服务器建立连接
- 客户端向服务器发送请求,获取html、css、js等资源
- 浏览器解析并渲染页面,然后断开连接。
以上。