总结关于浏览器和网络的一些知识点和面试考点:
http和https
- http2有何优势
- 与http1文本格式传递数据不同,http2将传输信息分割为更小的消息和帧,并以二进制格式进行编码
- 多路复用,允许在单个TCP连接中并行处理多个请求和响应
- 头部压缩,通过共享头部信息,减少传输数据量
- 允许服务器主动向客户端推送资源
- 通过流控制、消息控制、窗口控制等实现流量精细控制
- https有何优势
- 使用SSL/TLS对HTTP报文进行加密,加密过程结合了对称加密和非对称加密,确保数据的保密性和完整性
- 通过数字证书进行身份验证,确保通信双方的真实性
- 传输数据前,HTTPS对数据加密,使用信息摘要算法生成一个摘要值,数据到达接收端后,接收端使用相同算法对接收的数据进行摘要计算,与发送端的摘要值比较,一致说明传输过程中数据没被篡改
- 常见状态码
- 20*(成功)200:请求成功
- 30*(重定向)301:请求资源已永久移动到新URL上;302:请求资源临时从其他URL上响应;304:客户端执行请求,但资源未发生变化
- 40*(客户端错误)400:服务器无法理解请求;401:要求进行身份验证;403:服务器拒绝执行;404:服务器无法找到请求资源
- 50*(服务端错误)500:服务器遇到未知错误,无法完成处理;503:临时的服务器维护或过载,服务器当前无法处理请求;504:网关超时
- OPTIONS
浏览器和服务器之间的协商机制,用于确保跨域请求的安全性和合规性 - 请求报文组成
- 请求行:HTTP方法、请求的资源标识符、HTTP版本号
- 请求头:包含与请求相关的信息
- 空行:分隔请求头和请求正文
- 请求正文:包含发送给服务器的数据
- 响应报文组成
- 状态行:HTTP版本、状态码、状态码描述
- 响应头:包含了与响应相关的元信息
- 响应正文:服务器返回给客户端的数据
- keep-alive
可以在一个TCP连接上发送多个HTTP请求,保持持久连接,可以减少连接的频繁建立和关闭,降低网络负载和服务器负载,提高请求的响应时间和整体性能
输入URL到页面渲染发生了什么
- 浏览器解析URL:首先检查本地host文件,看是否有对应域名;如果有,直接向该IP地址发送请求;如果没有,浏览器将域名发给DNS服务器进行解析,将域名转换为对应的服务器IP地址
- 建立TCP连接,发送HTTP请求
- 服务器处理请求,发送HTTP响应
- 浏览器解析和渲染页面:解析HTML并构建DOM树,解析CSS并构建CSS Object Model树,将DOM树和CSSOM树合并为Render Tree;浏览器根据渲染树的信息计算节点的位置和大小,生成布局(重排);布局完成后,转换节点信息并进行绘制(重绘)
缓存
- 浏览器缓存
- cookie:可以由客户端或服务器生成,手动设置过期时间,会通过Cookie请求头自动发送给浏览器,容量为4kb,可在任意窗口访问
- localStorage:由客户端初始化,永不过期,容量为5MB,可在任意窗口访问
- sessionStorage:由客户端初始化,在当前页面关闭前有效,容量为5MB,只能在当前页面窗口访问
- HTTP缓存
- 强缓存:在有效时间内,不会向服务器发送请求,直接从缓存中读取资源。控制强缓存的字段是Expires和Cache-Control,其中Cache-Control优先级高于Expires,适用于不经常变动的静态资源,通过减少网络请求次数来提高加载速度和减少服务器压力
- 协商缓存:强缓存失效后,浏览器携带缓存标识向服务器发起请求,服务器根据缓存标识决定是否使用缓存。控制协商缓存的字段有Last-Modified/If-Modified-Since和Etag/If-None-Match,适用于频繁更新的资源,通过服务器验证确保用户获取最新内容,同时减少不必要的数据传输
浏览器安全
- 跨域
- 原因:浏览器同源策略限制(协议是否相同、主机是否相同。端口号是否相同)
- 措施:CORS,通过服务器端设置相应的HTTP头部信息,如Access-Control-Allow-Origin,允许跨域;nginx代理服务器;window.postMessage,通过监听window的message事件,可以接收其他窗口发送的消息
- SQL注入
- 原因:通过在Web应用的输入参数中注入恶意的SQL代码执行未授权的数据库操作
- 措施:参数化查询、输入验证
- 跨站脚本攻击XSS
- 原因:通过在网页上注入恶意脚本获取用户的敏感信息或劫持用户会话
- 措施:设置CSP、限制网页可加载的资源和执行的脚本、对敏感信息进行加密存储和传输
- 跨站请求伪造CSRF
- 原因:通过伪装成受信任用户的请求,欺骗浏览器去执行攻击者预设的操作
- 措施:验证码、Token验证、验证HTTP Referer头部信息
浏览器垃圾回收机制
- JavaScript内存管理
- 栈内存所存的基础数据类型大小是固定的,所以栈内存的内存都是操作系统自动分配和释放回收的
- 堆内存所存大小不固定,系统无法自动释放回收,所以需要JS引擎来手动释放这些内存
- v8垃圾回收算法
- V8将堆分为两个空间,一个叫新生代,一个叫老生代,新生代是存放存活周期短对象的地方,老生代是存放存活周期长对象的地方
- 新生代标记活动对象和非活动对象,复制from-space的活动对象到to-space中并进行排序,清除from-space中的非活动对象,将from-space和to-space进行角色互换,以便下一次的垃圾回收,经过多次垃圾回收这个对象还在新生代中,该对象会移动到老生代中
- 老生代里使用了标记清理和标记整理,标记阶段对老生代对象进行第一次扫描,对活动对象进行标记,清理阶段对老生代对象进行第二次扫描,清除未标记的对象,即非活动对象,整理阶段每次清理完非活动对象,就会把剩下的活动对象,整理到内存的一侧,整理完成后,直接回收掉边界上的内存
- 全停顿
- 原因:垃圾回收优先于代码执行,会先停止代码的执行,等到垃圾回收完毕,再执行JS代码
- 优化策略:增量标记(标记一点,JS代码运行一段)、惰性清理(延迟了清理,让JS代码先执行或者只清理部分垃圾,而不清理全部)、并行(并行式GC允许主线程和辅助线程同时执行同样的GC工作,这样可以让辅助线程来分担主线程的GC工作)
TCP
- 与UDP的区别
- TCP三次握手建立连接,UDP无连接
- TCP提供了可靠的数据传输服务,UDP不保证数据包的可靠传输,可能会出现丢包或乱序
- TCP有流量控制功能,可以根据接收方的处理能力来发送数据,UDP可能会以超过接收方处理能力的速度发送数据,导致数据丢失
- UDP适用于对实时性要求高的应用,TCP适用于需要可靠传输的应用
- 三次握手过程
- 客户端发送SYN报文到服务器,这个包包含客户端的初始化序列号,目的是向服务端请求建立连接
- 服务器接收后,发送SYN+ACK报文到客户端,这个包包含服务器的初始化序列号,并对客户端的SYN进行确认
- 客户端接收后,发送ACK报文到服务器,这个包包含对服务器SYN的确认,连接建立
- 四次挥手过程
- 客户端发送FIN报文到服务器,表示客户端完成了数据的发送,并希望关闭连接
- 服务器收到后,发送一个ACK报文作为确认,此时连接处于半关闭状态,客户端不发送,服务器仍可以发送
- 服务器完成数据发送并希望关闭连接时,发送一个FIN报文给客户端
- 客户端接收后,发送一个ACK报文作为最后的确认,进入TIME-WAIT状态,等待一段时间后确保服务器收到ACK连接关闭
- 网络模型
- OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- TCP/IP四层模型:网络接口层、网络层、传输层、应用层