面向找工作的面经汇总
面向找工作的面经汇总
面向找工作,所以以一些常见的问题收集为主
计算机网络
计算机网络由哪几个部分组成
计算机网络=资源子网+通信子网+协议
资源子网:由若干个主机组成,它们向各个用户提供服务;
通信子网:由一些专用的节点交换机和连接这些节点的通信链路组成;
一系列的协议:这些协议是为在主机之间或主机和子网之间的通信而用
TCP 建立连接的三次握手
- 起初两端都处于 closed 关闭状态,client 将标志位 SYN 置 1,随机产生一个序列值 seq=x,并将该数据包发给 Server,Client 进入 SYN-SENT 状态,等待 Server 确认
- Server 收到数据包后由 SYN=1 得知 Client 正在请求建立连接,Server 将标志位 SYN 和 ACK 都置 1,响应统计值 ack=x+1,随机产生序列值 seq=y,并将该数据包发送给 Client 以确认连接请求,Server 进入 SYN-RCVD 状态,操作系统为该 TCP 连接分配缓存和变量
- Client 收到确认后,检查 ACK 是否为 1、ack 是否为 x+1,并且此时操作系统为该连接分配缓存和变量,将数据包发给 Server。Server 检查 ack 是否为 y+1,ACK 是否为 1,如果正确则连接建立成功,Client 与 Server 进入 Established 状态,可以开始传输数据
CDN 原理
Content Delivery Network,内容分发网络。基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中。在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应
用户从输入 URL 到显示页面的过程
- DNS 解析
- TCP 连接
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 连接结束
HTTP 的请求方法
常见的请求方法有 get,post,
get 用来请求数据,post 用来提交数据,form 表单使用 get 时数据会以 querystring 形式存在 url 中,因而不够安全也存在数据大小限制,而 post 不会,post 将数据存放在 http 报文体中,获取数据应该用 get,提交数据用 post
GET 与 POST 区别
- GET 把 参数包含在 URL 中,POST 通过 request body 传递参数
- GET 请求会被 浏览器主动 cache,而 POST 不会,除非手动设置。
- GET 产生 一个 TCP 数据包;POST 产生 两个 TCP 数据包。
- GET 比 POST 更不安全,因为参数 直接暴露在 URL 上,所以不能用来传递敏感信息。
- GET 请求只能进行 url 编码,而 POST 支持 多种编码方式。
- GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
- GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以
- GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
- 由于(主流) 浏览器的一些 限制,导致 get 请求所传输的数据长度和字符编码(ASCII)受到一些限制,但是 post 请求一般未对其进行限制,所以支持更多的编码和数据长度
请求方法的 head
Head 只请求页面的首部,head 方法和 get 方法相同,但是服务器响应 head 时不返回消息体。在一个 head 请求的响应中,http 头中包含的元信息应该和一个 get 请求的响应消息相通。head 方法可以用来获取请求中隐含的元信息,而不用传输实体本身,可以用来测试超链接的有效性。
- 只请求资源的首部
- 检查超链接有效性
- 检查网页是否被修改
用于自动搜索机器人获取网页的标志信息,获取 rss 种子信息,或者传递安全认证信息等
HTTP 状态码
第一个数字进行分类
1 表示信息,2 表示成功,3 表示重定向,4 表示客户端错误,5 表示服务器错误
常见的有 101 切换协议,200 成功,301 永久重定向,302 临时重定向,304 未修改
301 和 302:
301 永久移动,请求的网页已经永久移动到新的未知,服务器返回此响应,会自动将请求者转到新位置。
302 历史移动,服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来继续以后的请求。
200 和 304
200 表示成功,服务器已成功处理请求,表示为服务器提供了请求的网页
304 表示未修改,自从上次请求后,请求的网页未修改过,服务器返回此响应时不会返回网页内容
OSI 七层模型
- 应用层:文件传输,HTTP、SNMP、FTP
- 表示层:数据格式化、代码转换,数据加密
- 会话层:建立、接触会话
- 传输层:提供端对端的接口,TCP、UDP
- 网络层:为数据包选择路由,IP、ICMP
- 数据链路层:传输有地址的帧
- 物理层:在物理媒体上传输二进制形式的数据
TCP/IP 模型
是一系列网络协议的总称,目的是使计算机之间可以进行信息交换
从上到下:
- 链路层:负责建立电路连接,是整个网络的物理基础,典型协议包括以太网、ADSL
- 网络层:分配地址和传送二进制数据,主要协议是 IP 协议
- 传输层:负责传送文本数据,主要协议是 TCP
- 应用层:传送各种最终形态的数据,是直接与用户信息打交道的层,主要协议是 http、ftp
TCP 与 UDP 区别
UDP 不一定提供可靠的数据传输
- TCP 是面向连接的,UDP 是面向无连接的
- UDP 程序结构较简单
- TCP 是面向字节流的,UDP 是基于数据报的
- TCP 保证数据正确性,UDP 可能丢包
- TCP 保证数据顺序,UDP 不保证
TCP 为什么需要四次挥手
因为双方都要释放自己的连接,A 向 B 发出释放连接请求,B 收到后给 A 发送一个确认,此时 A 就不能再向 B 发送数据了,处于 FIN-WAIT-2 的状态,但此时 B 还可以向 A 发送数据。接着 B 向 A 也发送一个断开连接的请求,A 收到后给 B 发送一个确认。此时 A、B 都关闭了连接。
HTTP 缓存机制
浏览器第一次向服务器发起 HTTP 请求后,服务器会返回请求的资源,并且在响应头中添加一些有关缓存的字段(比如 cache-control,expires,last-modifies,ETag,Data),之后浏览器再向该服务器请求资源就可以视情况使用强缓存和协商缓存
强缓存:浏览器直接从本地缓存中获取数据,不与服务器进行交互
协商缓存:浏览器发送请求到服务器,服务器判断是否可使用本地缓存
https 握手过程
- 客户端发起握手请求,以明文传输请求信息,就是用户在浏览器里输入一个 HTTPS 网址,然后连接到服务端的 443 端口
- 服务端进行配置,采用 HTTPS 协议的服务器必须要有一套数字证书(也就是一对公钥和私钥),可以自己制作,也可以向组织申请
- 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite
- 客户端验证证书的合法性,包括可信性,是否吊销,过期时间和域名,这部分工作是由客户端的 SSL/TLS 来完成的
- 客户端使用公匙对对称密匙加密,发送给服务端,传送的是用证书加密后的随机值。
- 服务器用私钥解密,拿到对称加密的密匙(服务端用私钥解密后,得到了客户端传过来的随机值,然后把内容通过该随机值进行对称加密,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥)
- 传输加密后的信息,这部分信息就是服务端用私钥加密后的信息,可以在客户端用随机值解密还原
- 客户端解密信息,客户端用之前生产的私钥解密服务端传过来的信息,于是获取了解密后的内容
波特率计算公式
比特率=波特率*单个调制状态对应的二进制位数
波特率指单片机或计算机在串口通信时的速率。指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数
webSocket 心跳机制
心跳机制指客户端每隔一段时间会向服务器发送一个数据包,告诉服务器自己还活着,同时客户端会确认服务器端是否还活着,如果还活着的话,服务端就会回传一个数据包给客户端来确定服务器端也还活着,否则的话,有可能是网络断开连接了。需要重连。
在使用 websocket 的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发 onclose 的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。因此就有了 websocket 的心跳了。
tcp 和 http 关系
http 底层用什么协议得分版本,http1.0 和 http2.0 都是基于 tcp;http3.0 是基于 udp 的,利用介于传输层和应用层之间的一个协议 QUIC 协议保证可靠传输
网页打不开应该怎么排查
首先 ping 域名,域名假如 ping 不通说明域名解析有问题,域名能 ping 通但是网站访问不了就有可能是网站程序或者是服务器的问题。也可以根据网站的提醒,当显示 404 或者一些服务器错误的提醒,404 代表的是网页不存在,有可能是网站代码出了问题这样我们集中排查网站程序的问题就行了。也有许多情况是我的电脑打不开,但是有的同伙电脑能打开,这个情况有两种情况,一种是域名 dns 问题,一种是网站服务器问题导致的个别地区访问不了网站的情况。
HTTP 与 HTTPs 的区别
- 加密:http 协议对传输的数据不进行加密;https 协议对传输的数据进行加密,https 加密需要 CA 签发的证书。
- 端口:http 协议使用 TCP 的 80 端口;https 协议使用 TCP 的 443 端口
- 网络分层模型:http 可以明确是位于应用层;https 是在 http 的基础上加上了 SSL 安全协议,而 SSL 是运输层协议,所以 https 是应用层和传输层的结合
HTTPs 怎么保证安全
https 通过 SSL 安全协议来保障安全性。具体体现在密钥和证书验证上。
密钥:
1、服务端生成一对公钥和私钥,将公钥和证书发送给客户端;
2、客户端验证证书通过后生成一个对称加密的密钥,并使用服务器生成的公钥加密,发送给服务器;
3、服务器使用私钥解密获得对称加密密钥。
4、客户端和服务器相互发送消息认可对称加密密钥,至此加密通道建立。
5、开始数据传输,在检验数据完整性的基础上,使用对称加密密钥进行加密解密。
证书验证:
一般来说浏览器都内置了权威 CA 的根证书,客户端使用根证书的密钥对服务器发来的证书进行解密验证,若域名、有效期、签发机关等验证项符合则通过,否则认定证书无效,断开连接。
HTTPs 是对称加密还是非对称加密
采用 对称加密 和 非对称加密 结合的方式来保护浏览器和服务端之间的通信安全。
ARP
地址解析协议,即ARP(Address Resolution Protocol)
用于实现从 IP 地址到 MAC 地址的映射,即询问目标 IP 对应的 MAC 地址。
- 主机 A 先查看自己的 ARP 表,确定其中是否包含有主机 B 对应的 ARP 表项,如果找到了对应的 MAC 地址,主机 A 直接利用这个地址对 IP 数据包进行帧分装,并将数据包发送给主机 B
- 如果再 ARP 表中找不到,则缓存数据报文,并以广播的方式给该网段上所有主机发送 ARP 请求报文,但只有被请求的主机 B 才会对该请求进行处理
- 主机 B 比较自己的 IP 地址与 ARP 请求报文中的目标 IP 地址,若相同,则将主机 A 的 IP 地址与 MAC 地址存入自己的 ARP 表中,之后以单播方式发送 ARP 响应报文给主机 A,其中包含自己的 MAC 地址
- 主机 A 收到 ARP 响应报文后,将主机 B 的 MAX 地址加入自己的 ARP 表中,同时封装 IP 数据包并发送
DNS
dns 解析有两种查询方式,分为递归查询和迭代查询。一般的 主机 向本地域名服务器的查询使用递归查询,本地域名服务器向根域名服务器查询使用迭代查询。它使用的是 UDP 协议,原因是性能更好,查询时间更短,如果发生数据丢失,重传一个就好了,不需要建立连接
操作系统
计算机由哪几个部分构成,怎么通讯?
冯·诺伊曼把计算机分作五部分:计算器、控制器、存储器、输入和输出设备。
什么是进程
并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位
什么是线程
是进程的一部分,一个没有线程的进程可以被看作是单线程的,也是 CPI 调度的一个基本单位
操作系统中进程和线程的区别
进程是具有一定独立功能的程序,他是系统进行资源分配调度的一个独立单位,
线程是进程的一个实体,是 cpu 调度分派的基本单位,线程之间基本上不拥有系统资源
一个程序至少有一个进程,一个进程至少有一个线程,资源分配给进程,同一个进程下所有线程共享该进程的资源
线程的共享资源
共享
- 堆:堆是在进程空间中开辟的
- 全局变量:与某一具体函数无关,所以也与特定线程无关
- 静态变量:对于局部变量来说,是放在某一函数的代码中的,但是存放位置和全局变量一样,存于堆开辟的.bss 和.data 段,是共享的
- 文件等公用资源:使用这些公共资源的线程必须同步,win32 提供了几种资源同步的方式,如信号、临界区、时间和互斥体
独享
- 栈:栈是独享的
- 寄存器:电脑的寄存器是物理的,但线程中存放的是寄存器的副本(包括程序计数器 PC)
进程间的通信方式
共八种
- 无名管道:半双工的通信方式,数据只能单向流动且只能在具有亲缘关系的进程间使用
- 高级管道:将另一个程序当作一个新的进程在当前程序进程中启动,则这个进程算是当前程序的子进程
- 有名管道:也是半双工的通信方式,但是允许没有亲缘进程之间的通信
- 消息队列:消息队列是有消息的链表,存放在内核中,并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限的缺点
- 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,
- 信号:用于通知接受进程某个事件已经发生
- 共享内存:共享内存就是映射一段能被其他进程所访问的内存。这段共享内存由一个进程创建,但是多个进程可以访问,共享内存是最快的 IPC 方式,往往与其他通信机制配合使用
- 套接字:可用于不同机器之间的进程通信
银行家算法
著名的死锁避免算法
基本思想:把操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家指定的规则进行进程的资源分配。
进程在运行之前先声明对各种资源的最大需求量,当进程在执行中继续申请资源时,先测试该进程已经占用的资源数和本次申请的资源数之和是否超过声明的最大需求量。如果超过了,就拒绝分配。否则,再测试系统现存的资源能否满足该进程尚需的最大资源量,如果能满足就分配,否则就推迟分配
数据库
Redis 和 MySQL
从类型上来说,mysql 是关系型数据库,redis 是缓存数据库
作用上,mysql 用于持久化的存储数据到硬盘,功能强大,但是速度较慢。redis 用于存储使用较为频繁的数据到缓存中,读取速度快
需求上,mysql 和 redis 因为需求的不同,一般都是配合使用
css、Js、http
CSS3 缩放、旋转相关的 API
在 CSS3 中,可以利用 transform 功能实现文字或图像的旋转、缩放、倾斜、移动这 4 中类型的变形处理。
旋转:使用 rotate 方法,在参数中加入角度值,角度值后面跟表示角度单位的“deg”文字即可,旋转方向为顺时针方向。
1 |
|
缩放:
使用 scale 方法来实现文字或图像的缩放处理,在参数中指定缩放倍率。
1 |
|
可以分别指定元素的水平方向的放大倍率与垂直方向的放大倍率
1 |
|
js 为什么是单线程
作为浏览器脚本语言,JavaScript 的主要用途是与用户互动,以及操作 DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定 JavaScript 同时有两个线程,一个线程在某个 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
移动端的适配要考虑哪些
在移动端虽然整体来说大部分浏览器内核都是 webkit,而且大部分都支持 CSS3 的所有语法。但是,由于手机屏幕尺寸不一样,分辨率不一样,或者我们还需要考虑横竖屏的问题,这时候也就不得不解决在不同手机上,不同情况下的展示效果了。
- 元素自适应问题
- 文字 rem 问题
- 高清图问题
- 1 像素问题
- 横竖屏显示问题
- 手机字体缩放问题
JS 如果执行很久阻塞界面怎么办,有哪些解决方式?
什么是阻塞:在页面中我们通常会引用外部文件,而浏览器在解析 HTML 页面是从上到下依次解析、渲染,如果中引用了一个 a.js 文件,而这个文件很大或者有问题,需要 2 秒加载,那么浏览器会停止渲染页面(此时是白屏显示,就是页面啥都没有),2 秒后加载完成才会继续渲染,这个就是阻塞。
解决方法:
推迟加载:如果页面初始的渲染并不依赖于 js 或者 CSS 可以用推迟加载,就是最后在加载 js 和 css,把引用外部文件的代码写在最后。比如一些按钮的点击事件,比如轮播图动画的脚本也可以放在最后。
defer 延迟加载
1
<script src="" defer></script>
异步加载
就是告诉浏览器不必等到加载完外部文件,可以边渲染边下载,什么时候下载完成什么时候执行。
JS 跨域的实现
一个域通过某种方式请求到另一个域的数据
JSONP:通过动态创建 script,再请求一个带参网址实现跨域通信。document.domain + iframe 跨域:两个页面都通过 js 强制设置 document.domain 为基础主域,就实现了同域。
location.hash + iframe 跨域:a 欲与 b 跨域相互通信,通过中间页 c 来实现。 三个页面,不同域之间利用 iframe 的 location.hash 传值,相同域之间直接 js 访问来通信。
window.name + iframe 跨域:通过 iframe 的 src 属性由外域转向本地域,跨域数据即由 iframe 的 window.name 从外域传递到本地域。
postMessage 跨域:可以跨域操作的 window 属性之一。
CORS:服务端设置 Access-Control-Allow-Origin 即可,前端无须设置,若要带 cookie 请求,前后端都需要设置。
代理跨域:启一个代理服务器,实现数据的转发
JS 语言特性
运行在客户端浏览器上;
不用预编译,直接解析执行代码;
是弱类型语言,较为灵活;
与操作系统无关,跨平台的语言;
脚本语言、解释性语言
网页性能优化
减少 HTTP 请求
使用内容发布网络(CDN)
添加本地缓存
压缩资源文件
将 CSS 样式表放在顶部,把 javascript 放在底部(浏览器的运行机制决定)
避免使用 CSS 表达式
减少 DNS 查询
使用外部 javascript 和 CSS
避免重定向
图片 lazyLoad
数据类型
分为基本对象类型和引用对象类型
基本数据类型:按值访问,可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。基本数据类型有这六种:undefined、null、string、number、boolean、symbol。
引用类型:当复制保存着对象的某个变量时,操作的是对象的引用,但在为对象添加属性时,操作的是实际的对象。引用类型值指那些可能为多个值构成的对象。
引用类型有这几种:Object、Array、RegExp、Date、Function、特殊的基本包装类型(String、Number、Boolean)以及单体内置对象(Global、Math)。
元素类型的判断
判断方法:typeof(),instanceof,Object.prototype.toString.call()等
HTML 载入和渲染的过程
- 浏览器下载 HTML 文件并开始解析 DOM。
- 遇到样式表文件
link[rel=stylesheet]
时,将其加入资源文件下载队列,继续解析 DOM。 - 遇到脚本文件时,暂停 DOM 解析并立即下载脚本文件。
- 下载结束后立即执行脚本,在脚本中可访问当前``以上的 DOM。
- 脚本执行结束,继续解析 DOM。
- 整个 DOM 解析完成,触发
DOMContentLoaded
事件。
coding
KMP 算法
说说 C++,Java,JavaScript 这三种语言的区别
从静态类型还是动态类型来看
静态类型,编译的时候就能够知道每个变量的类型,编程的时候也需要给定类型,如 Java 中的整型 int,浮点型 float 等。C、C++、Java 都属于静态类型语言。
动态类型,运行的时候才知道每个变量的类型,编程的时候无需显示指定类型,如 JavaScript 中的 var、PHP 中的$。JavaScript、Ruby、Python 都属于动态类型语言。
静态类型还是动态类型对语言的性能有很大影响。
对于静态类型,在编译后会大量利用已知类型的优势,如 int 类型,占用 4 个字节,编译后的代码就可以用内存地址加偏移量的方法存取变量,而地址加偏移量的算法汇编很容易实现。
对于动态类型,会当做字符串通通存下来,之后存取就用字符串匹配。
从编译型还是解释型来看
编译型语言,像 C、C++,需要编译器编译成本地可执行程序后才能运行,由开发人员在编写完成后手动实施。用户只使用这些编译好的本地代码,这些本地代码由系统加载器执行,由操作系统的 CPU 直接执行,无需其他额外的虚拟机等。
源代码=》抽象语法树=》中间表示=》本地代码
解释性语言,像 JavaScript、Python,开发语言写好后直接将代码交给用户,用户使用脚本解释器将脚本文件解释执行。对于脚本语言,没有开发人员的编译过程,当然,也不绝对。
源代码=》抽象语法树=》解释器解释执行。
对于 JavaScript,随着 Java 虚拟机 JIT 技术的引入,工作方式也发生了改变。可以将抽象语法树转成中间表示(字节码),再转成本地代码,如 JavaScriptCore,这样可以大大提高执行效率。也可以从抽象语法树直接转成本地代码,如 V8
Java 语言,分为两个阶段。首先像 C++语言一样,经过编译器编译。和 C++的不同,C++编译生成本地代码,Java 编译后,生成字节码,字节码与平台无关。第二阶段,由 Java 的运行环境也就是 Java 虚拟机运行字节码,使用解释器执行这些代码。一般情况下,Java 虚拟机都引入了 JIT 技术,将字节码转换成本地代码来提高执行效率。
注意,在上述情况中,编译器的编译过程没有时间要求,所以编译器可以做大量的代码优化措施。
对于 JavaScript 与 Java 它们还有的不同:
对于 Java,Java 语言将源代码编译成字节码,这个同执行阶段是分开的。也就是从源代码到抽象语法树到字节码这段时间的长短是无所谓的。
对于 JavaScript,这些都是在网页和 JavaScript 文件下载后同执行阶段一起在网页的加载和渲染过程中实施的,所以对于它们的处理时间有严格要求。
MQTT
MQTT(消息队列遥测传输)是 ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP 协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!