前端实习八股整理-浏览器原理

浏览器原理

一、从输入URL开始到我们看到页面都发生了什么,越详细越好。

1.解析URL:分析需要使用的传输协议和请求资源的路径。如果输入的URL的协议名或主机名不合法,内容传给搜索引擎。如果有非法字符,先进行转义。
2.缓存判断:如果请求的资源在缓存里且没有失效则直接使用,否则向服务器发起新请求。
3.DNS解析:(获取域名的IP地址)首先判断本地服务器缓存是否有该域名的IP,然后向本地DNS服务器发起请求,缓存里也没有的话向根域名服务器发起请求,获得顶级域名服务器的地址后再发起请求,获得权威域名服务器后再发起请求得到IP,本地DNS服务器把IP返回给用户。用户->本地DNS域名服务器(递归请求),本地DNS服务器->各级域名服务器(迭代请求)。【获取就近的cdn服务器地址:智能DNS解析和地理位置定位】
4.获取MAC地址:将IP地址与本机子网掩码相与,判断是否有与请求主机再同一个子网里,如果是,用ARP获取MAC地址;否则,请求转发给网关代为转发,此时同样用ARP获取MAC地址,目的MAC地址为网关的地址。
5.TCP三次握手:首先客户端向服务器发送一个SYN(Synchronize Sequence Numbers,同步序列号)连接请求报文段和一个随机序号,服务端收到请求后向客户端发送一个SYN ACK报文段和一个随机序号,确认连接请求。客户端收到确认应答后,进入连接建立的状态,同时向服务器发送一个ACK确认报文段,服务器端收到确认后也进入连接建立状态。
6.HTTPS握手:(TLS四次握手)首先由客户端向服务器端发送使用协议的版本号、一个随机数和可使用的加密方法。服务器端收到后,确认加密的方法,发送一个随机数和自己的数字证书。客户端先检查数字证书是否有效,有效的话生成一个随机数,并用证书中的公钥对随机数加密后发给服务器端,还有一个前面所有内容的hash值供服务器检验。服务器端使用私钥对数据进行解密,同时向客户端发送一个前面所有内容的hash值供检验。这时候双方都有了三个随机数,按照之前约定的方法将三个随机数生成一把私钥,以后通信前用这个私钥将数据加密后再传输。
7.服务器响应html,返回数据:当前页面请求发到服务端后,服务端会返回一个html文件。这里的服务端可能是server或者是cdn(内容分发网络,可用来加快传输速度,主要用来存储静态文件,例如前端的html、css、js、图片文件等)。服务器上可能会通过nginx等设置静态资源代理,将url对应的html等静态资源返回。如果网站是博客或者其他需要seo友好的页面,就需要做服务端渲染,这时服务器会根据模版和数据渲染好html文件返回给前端。常见的服务端渲染方案有:ejs、art-template、等模版语法,也有基于vue、react等框架的服务端渲染框架nuxt.js及next.js等。
8.页面渲染:【解析HTML】首先根据HTML文件构建DOM树,【解析CSS】根据css创建CSSOM树,【JavaScript执行】遇到script标签要注意(没有defer或async属性的话会造成页面渲染的阻塞)。【构建渲染树】用DOM树和CSSOM树构建渲染树,【布局】根据渲染树计算每个元素的位置和大小生成布局树,布局变化会触发重排,重新计算布局。【绘制】浏览器将布局树转换为绘制指令,描述如何绘制每个元素,样式变化会触发重绘,重新生成绘制指令。【合成】浏览器将页面分为多个图层,分别绘制后再进行合成为最终页面,显示在屏幕上。【事件处理】用户操作会触发事件,浏览器执行相应的事件处理程序。
9.TCP四次挥手:客户端认为数据发送完成,向服务器发送连接释放请求。服务端接受请求,告诉应用层要释放TCP连接,然后发送ACK包,进入CLOSE_WAIT状态。表明客户端到服务端的连接已经释放不再接受客户端数据(服务端仍可以发送)。服务器端发送完毕后向客户端发送链接释放请求,进入LAST_ACK状态。客户端收到请求,发送确认应答,进入TIME_WAIT状态。该状态持续2MSL时间,这段时间内没有收到服务端的重发请求的话,进入CLOSED状态。服务端收到确认应答后也进入CLOSED状态。

二、浏览器的渲染过程

浏览器的渲染过程是将HTML、CSS和JavaScript代码转换为用户可见页面的过程,主要包括以下步骤:

1. 解析HTML

  • 构建DOM树:浏览器解析HTML文档,生成DOM(文档对象模型)树,表示页面结构。
  • 遇到外部资源:如CSS、JavaScript、图片等,浏览器会并行下载这些资源。

2. 解析CSS

  • 构建CSSOM树:浏览器解析CSS文件,生成CSSOM(CSS对象模型)树,表示样式信息。
  • 阻塞渲染:CSS解析会阻塞页面渲染,直到CSSOM构建完成。

3. 构建渲染树

  • 合并DOM和CSSOM:将DOM树和CSSOM树结合,生成渲染树,包含所有可见元素及其样式。
  • 忽略不可见元素:如、display: none等元素不会出现在渲染树中。

4. 布局(Layout)

  • 计算几何信息:浏览器根据渲染树计算每个元素的位置和大小,生成布局树。
  • 重排(Reflow):布局变化(如窗口调整)会触发重排,重新计算布局。

5. 绘制(Paint)

  • 生成绘制指令:浏览器将布局树转换为绘制指令,描述如何绘制每个元素。
  • 重绘(Repaint):样式变化(如颜色)会触发重绘,重新生成绘制指令。

6. 合成(Compositing)

  • 分层绘制:浏览器将页面分为多个图层,分别绘制。
  • 合成图层:将所有图层合成为最终页面,显示在屏幕上。

7. JavaScript执行

  • 阻塞DOM和CSSOM构建:JavaScript执行会阻塞DOM和CSSOM的构建,除非标记为异步(async或defer)。
  • 操作DOM/CSS:JavaScript可以修改DOM或CSSOM,触发重排或重绘。

8. 事件处理

  • 用户交互:用户操作(如点击)会触发事件,浏览器执行相应的事件处理程序。

优化建议

  • 减少重排和重绘:避免频繁操作DOM或样式。
  • 使用CSS动画:优先使用CSS动画而非JavaScript动画。
  • 异步加载JavaScript:使用async或defer减少阻塞。

三、浏览器缓存策略

1.强缓存:不需要向服务器发送请求,直接试用本地缓存。

通过HTTP响应头中的Cache-Control(以秒为单位表示资源有效期)【优先级更高】、Expires(指定资源的绝对过期时间)控制。

2.协商缓存:需要向服务器发送请求验证资源是否有效。返回304用本地缓存,返回200更新资源。
通过HTTP响应头:last-Modified/if-Modified-Since:基于文件最后修改时间;ETag/If-None-Match:基于文件内容哈希值

最佳实践:HTTP:协商缓存;CSS、JS、图片:强缓存;API请求:看业务需求。

内存缓存:频繁访问、实时处理、临时数据
硬盘缓存:不频繁反问、大容量数据、持久化存储

四、XSS攻击

XSS攻击指的是跨站脚本攻击,是一种代码注入攻击。
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库⾥,反射型 XSS 的恶意代码存在 URL ⾥。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执⾏恶意代码由浏览器端完成,属于前端JavaScript ⾃身的安全漏洞,⽽其他两种 XSS 都属于服务端的安全漏洞。

五、如何防御XSS攻击

1.从浏览器的执行来预防:纯前端,不使用服务器渲染;对插入到HTML中的代码做好充分的转义,对可能出现的恶意代码情况进行判断。【HTML 实体编码:是一种在 HTML 文档中表示特殊字符的方法。HTML 实体编码允许你在 HTML 文档中安全地嵌入那些可能与 HTML 标签或属性发生冲突的字符,例如 <、>、&、" 和 ’ 等】【Vue无论是使用模板还是渲染函数,内容都是自动转义的。这种转义是使用 textContent 这样的浏览器原生 API 完成的,所以只有当浏览器本身存在漏洞时,才会存在漏洞。】

方案一:针对文本内容(Text Content):
1.使用双花括号 { { }} 插值:Vue默认会对双花括号中的内容进行HTML转义。
2.使用 v-text 指令
3.v-html 是危险的,因为它会直接将字符串作为HTML解析,是XSS的根源。(不要使用!!!)

方案二:使用DOMPurify库(当需要渲染富文本时)
有时你可能确实需要显示用户输入的HTML内容(例如,一个允许用户使用Markdown或简单格式的应用)。在这种情况下,你必须先净化(Sanitize) HTML。
在Vue组件中使用:

<script setup>
import DOMPurify from 'dompurify';

const props = defineProps({
     
     
  message: Object
});

### 关于前端浏览器常见的面试问题及知识点 #### 浏览器工作原理 浏览器的工作流程是从输入URL到页面渲染完成的一系列复杂过程。当用户请求网页时,浏览器会发起HTTP/HTTPS请求获取资源文件并解析HTML文档构建DOM树[^1]。 #### 文档类型声明 (DOCTYPE) `<!DOCTYPE>` 声明位于 HTML 文档的第一行,用于定义所使用的 HTML 或 XHTML 版本标准。这有助于确保浏览器按照指定的标准模式来解释和呈现页面内容,而不是以向后兼容的方式处理旧版标签[^2]。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> </body> </html> ``` #### CSS盒模型与布局特性 不同版本的IE存在一些特殊的样式表现差异,比如著名的IE6双边距Bug:如果给浮动元素设置了外边距,则该元素会在水平方向上出现双倍的左边距或右边距现象[^3]。解决方法可以采用hack技术或者通过调整CSS属性顺序等方式规避此问题。 #### 渲染引擎区别 主流浏览器都拥有各自的渲染引擎,如WebKit(Safari), Blink(Chrome, Opera),Gecko(Firefox) 和 Trident(Internet Explorer)等。这些不同的内核可能对同一份代码有着细微差别化的支持程度以及性能优化策略上的取舍。 #### 跨域资源共享(CORS) 由于安全原因,默认情况下JavaScript无法直接访问其他域名下的资源。为了实现跨站请求,服务器端需配置允许特定源站点发送带有CORS头部信息的响应头字段,从而让客户端能够合法地读取远程API返回的数据流。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值