2024年前端最新WEB性能权威指南学习笔记 Item01_web aes性能(1),2024年最新被面试官问的前端-Framework难倒了

总结

为了帮助大家更好温习重点知识、更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

前端面试题汇总

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

JavaScript

性能

linux

三次握手

所有的TCP连接一开始都要经过三次握手。客户端和服务器在交换应用数据之前,必须就起始分组序列号,以及其他一些连接相关的细节达成一致。处于安全考虑,序列号由两端随机生成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SYN

客户端选择一个随机序列号x,并发送一个SYN分组,其中可能还包括其他TCP标志和选项。

SYN ACK

服务器给x加1,并选择自己的一个随机序列号y,追加自己的标志和选项,然后返回响应。

ACK

客户端给x和y加1并发送握手期间的最后一个ACK分组。

其中要记下来的是:

  • 为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,
  • 为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。

或者可以记忆下中的描述:

  • 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
  • 第二次握手:服务器端收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k)即SYN+ACK包,此时服务器进入SYN_RECV状态。
  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器端进入ESTABLISHED状态,完成三次握手。

三次握手完成后,客户端和接收端之间就可以通信了。在每次传输应用数据之前,都必须经历一次完整的往返。因此,提高 TCP 应用性能的关键,在于想办法重用连接。

TCP快速打开

连接并不是想重用就可以重用。TFO(TCP Fast Open) 是可以减少新建TCP连接带来的性能损失。Linux 3.7 及以后的内核已支持在客户端和服务端支持 TFO,但 TFO 并不能解决所有问题,它虽然有助于减少三次握手的往返时间,但只能在某些情况下有效,比如只能发送某些类型的HTTP请求、只能用于重复的连接等。

拥塞预防机制

流量控制

预防发送端过多的向接收端发送数据的机制。为实现流量控制,TCP 的两端都要通告自己的接收窗口(rwnd)。如果一端跟不上数据传输,就会向发送端通告一个较小的窗口,因此接收的一端更可能成为性能瓶颈。

窗口缩放

最初的 TCP 规范分给通告窗口大小的字段是16位,相当于设定了发送端和接收端窗口的最大值为 65535 字节,在这个限制内通常无法获得最佳性能。为解决这个问题,RFC 1323 提供了 “TCP窗口缩放”(TCP Window Scaling)选项,可以将窗口大小提升到 1G 字节,这在三次握手期间完成,当中有一个值表示在将来的 ACK 中左移16位窗口字段的位数。

TCP 窗口缩放机制在主要平台上都是默认弃用的,但中间节点和路由器可以重写或去掉这个选项。因此如果服务器或客户端连接不能完全利用现有的带宽,往往应该先查一查窗口大小。Linux 可通过下述命令查询:

$> sysctl net.ipv4.tcp_window_scaling
$> sysctl -w net.ipv4.tcp_window_scaling=1

慢启动

流量控制可以防止发送端向接收端发送过多的数据,但在连接建立之初,无法知道可用宽带是多少,因此需要一个估算机制,且需要根据网络中不断变化的条件而动态改变速度。解决该问题的几种算法:慢启动、拥塞预防、快速重发和快速恢复

慢启动的设计思路是根据交换数据来估算客户端与服务器之间的可用带宽。TCP 连接时初始化一个拥塞窗口(cwnd)变量,表示发送端从客户端接收确认(ACK)之前可以发送的数据量的限制。同时发送端不会通告 cwnd 变量,发送端只是维护这么一个私有变量。

此时,客户端与服务端之间最大可以传输(未经ACK确认的)数据量取 rwnd 和 cwnd 中的最小值。在分组被确认之后,增大窗口大小(每收到一个 ACK,慢启动算法就告诉服务器可以将它的 cwnd 增加一个 TCP 段),慢慢的启动。因为每接收一个 ACK 就增加一个 TCP 段,所以是指数增长。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TCP慢启动算法示意图

一个 TCP 端的大小是 1460字节
MTU 大小为1500,其中 ip 头为 20,tcp 头 20,所以 maximum segment size 为 1460 字节。1 字节为 8 位二进制。

无论宽带多大,每个 TCP 连接都必须经过慢启动阶段,因此不可能一上来就利用连接的最大带宽。例如接收窗口最大为 65535≈64kb≈45段TCP,则要达到这个窗口经过 4 次往返,这可能会带来上百毫秒的延迟。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拥塞窗口大小增长示意图,经4次往返才能达到最大接收窗口

慢启动限制了可用了的吞吐量,对于许多 HTTP 连接,特别是一些短暂、突发的连接,例如对小文件的传输来说非常不利。

慢启动重启
TCP 还实现了 SSR(Slow-Start Restart 慢启动重启)机制,这种机制会在连接空闲一段时间后重置连接的拥塞窗口。因为在连接空闲的同时,网络状况也可能发生了变化,为避免拥塞,理应将拥塞窗口重置回“安全的”默认值。SSR 对于会出现突发空闲的长周期 TCP 连接(如 HTTP 的 keep-alive 连接)有很大的影响,因此建议在服务器上禁用SSR,Linux平台检查和关闭的命令为:

$> sysctl net.ipv4.tcp_slow_start_after_idle
$> sysctl -w net.ipv4.tcp_slow_start_after_idle=0

队首阻塞

TCP 在不可靠的信道上实现了可靠的网络传输,虽然 TCP 很流行,但其并不是唯一的选择,在某些情况下也不是最佳选择,特别是按序交付和可靠交付有时候并不必要,反而会导致额外的延迟,对性能造成负面影响。

为了让分组按照顺序传送到接收端,如果中途有一个分组没能到达接收端,那么后续分组必须保存在接收端的 TCP 缓冲区,等待丢失的分组重发并到达接收端,这一切都发生在 TCP 层,应用程序对 TCP 的重发和分组缓存排队一无所知,需等到分组全部到达才能访问数据,在次之前应用程序只能在套接字读数据时感到延迟交付。这种效应称为 TCP 的队首(HOL,Head of Line)阻塞。

丢包就丢包
事实上丢包是让 TCP 达到最佳性能的关键,被删除的包正是一种反馈机制,能够让接收端和发送端各自调整速度,以避免网络拥堵,同时保持延迟最短。

TCP优化

把服务器内核升级到最新版本(Linux:3.2+)

TCP的最佳实践以及影响其性能的底层算法一直在与时俱进,而且大多数变化都只在最新内核中才有实现,一句,让你的服务器跟上时代是优化发送端和接收端TCP栈的首要措施,反正好就是了,如果有条件就升级。

确保cwnd和rwnd大小为10

Linux2.6.38默认initcwndinitrwnd是3和10。它允许14.2KB初始值发送,等接收的返回后才开始缓慢增长。这比HTTP和SSL重要,因为它可以让你在头部初始设置更多空间的数据包。具体可以使用uname -a命令查看您自己的linux内核版本,如果小于3.2可以执行ip route | while read p; do ip route change $p initcwnd 10 initrwnd 10; done;更改。

禁用空闲后的慢启动

TCP实现了SSR慢启动重启机制。这种机制会在连接空闲一定时间后重置连接的拥塞窗口。道理很简单,在连接空闲的同时,网络状况也可能发生了变化,为了避免拥塞,理应将拥塞窗口重置回“安全的”默认值。

毫无疑问,SSR对于那些会出现突发空闲的长周期TCP连接(比如HTTP的keep-alive连接)有很大影响,因此,我们建议在服务器上禁用SSR。在Linux平台,可以通过如下命令来检查和禁用SSR:

$> sysctl net.ipv4.tcp_slow_start_after_idle $> sysctl -w net.ipv4.tcp_slow_start_after_idle=0

确保启动窗口缩放(RFC1323)

启动窗口缩放可以增大最大接收窗口大小,可以让高延迟的连接达到更好的吞吐量,在Linux中,可以通过如下命令检查和启用窗口缩放选项:

$> sysctl net.ipv4.tcp_window_scaling $> sysctl -w net.ipv4.tcp_window_scaling=1

减少传输冗余数据

这个在没看TCP原理之前还没怎么感觉,看过之后感觉这个太重要了,举个例子TCP每次传输都需要三次握手也就是说每发送一次请求之前都要增加一次往返时间,可以想象每次请求的代价有多大,能减少请求尽量少请求,这个很重要!!

压缩要传输的数据

这个同上节省资源也很重要,多个文件压缩成一个还重用了已经建立的TCP连接

最后

正值招聘旺季,很多小伙伴都询问我有没有前端方面的面试题!

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端资料图.PNG

重要!!

压缩要传输的数据

这个同上节省资源也很重要,多个文件压缩成一个还重用了已经建立的TCP连接

最后

正值招聘旺季,很多小伙伴都询问我有没有前端方面的面试题!

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-qxbtTUCG-1715600241588)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值