计算机基础笔记

202 阅读9分钟

面试了才知道,校招注重基础,算法。。

一、TCP和UDP的区别

UDP

UDP的全称是用户数据报协议,它的特点是:

  1. 无连接
  2. 支持一对一、一对多、多对一
  1. 头部开销小
    头部只有8个字节,对比TCP头部有20个字节,传输数据报文时是很高效的。
  1. 不可靠
    通信不需要建立连接,随时想发就发
    收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。
    UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。这适用于对及时性要求高的场景,例如电话会议。这样的缺点是网络不好的情况下会丢包

TCP:

  1. 有连接

    三次握手建立连接,四次握手取消连接
  2. 只支持一对一传播
  3. 可靠传输
    用TCP的端序号和确认号保证传输顺序和不会丢包
    1.TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收
    2.接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
  1. 拥塞控制

当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞

TCP的现代实现包含四种相互影响的拥塞控制算法:慢开始、拥塞避免、快速重传快速恢复

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
适用场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输

TCP表头:

二、强缓存和协商缓存

强缓存

强缓存是本地缓存,指浏览器不会发出请求,直接从本地缓存中读取

控制强缓存的两个字段:expires和cache-control

  1. expires的值是绝对时间,如果发送请求在expires之前,缓存始终有效,不会去服务器请求
  2. cached-control:max-age = number,这是相对时间,如果在相对时间内,那么就不需要去服务端请求,直接从缓存中拿

协商缓存

协商缓存需要在服务器端对比资源是否修改,来判断是否可以使用缓存。若未改动,则返回304状态码,浏览器拿到此状态码就可以直接使用缓存数据了。否则服务器返回新资源。

控制协商缓存的两个header字段是:Last-Modify/If-Modified-Since 和 Etag/If-None-Match,这两个字段是成对使用的

Last-Modified:最后修改时间

当浏览器再次进行请求时,会向服务器传送 If-Modified-Since 报头,询问 Last-Modified 时间点之后资源是否被修改过。如果没有修改,则返回码为 304,使用缓存;如果修改过,则再次去服务器请求资源,返回码和首次请求相同为 200,资源为服务器最新资源。

ETag:

服务器根据实体内容生成一段 hash 字符串,标识资源的状态。浏览器会将这串字符串传回服务器,验证资源是否已经修改,如果没有修改,就返回304, 过程如下:

以下就是etag的一个使用实例:

304协商缓存

先从304协商缓存开始吧。这是比较基础的知识。相信我,只要你提起304协商缓存,面试官一定会忍不住问你,什么是协商缓存?

这时就到了你展示一下自己丰富的浏览器缓存知识的时候了。我一般会这么答:浏览器缓存分为强制缓存和协商缓存,优先读取强制缓存。

强制缓存分为expires和cache-control,而expires是一个特定的时间,是比较旧的标准和cache-control通常是一个具体的时间长度,比较新,优先级也比较高。

而协商缓存包括etag和last-modified,last-modified的设置标准是资源的上次修改时间,而etag是为了应对资源修改时间可能很频繁的情况出现的,是基于资源的内容计算出来的值,因此优先级也较高。

协商缓存与强制缓存的区别在于强制缓存不需要访问服务器,返回结果是200,协商缓存需要访问服务器,如果命中缓存的话,返回结果是304。

三、浏览器的缓存机制

首先,浏览器发送请求前,根据请求头的expires和cache-control判断强缓存是否可用,如果缓存没过期,就直接从缓存获取资源,并不会发送请求。

如果强缓存不可用,则进入下一步。

  1. 当强缓存不可用时,浏览器会发送请求,根据请求头的etag和last-modified判断,协商缓存是否可用,如果命中,直接从缓存获取资源。如果不行,则进入下一步。

  2. 如果前两步都缓存都不可用,则直接从服务端获取资源。

缓存还可以放在浏览器的localstorage和sessionstorage

四、HTTPS为什么安全

HTTPS = HTTP + SSL/TLS

传输层安全性协议(英语:Transport Layer Security,缩写:TLS)及其前身安全套接层(英语:Secure Sockets Layer,缩写:SSL)是一种安全协议

SSL已经启用,TLS1.3最新的

加密内容保隐私:对称+非对称加密

数字签名防篡改

数字证书破伪装

1.Client发起一个HTTPS(比如https://juejin.im/user/5a9a9cdcf265da238b7d771c)的请求,

2.Server把事先配置好的公钥证书(public key certificate)返回给客户端。

3.Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。

4.Client随机生成会话密钥,然后用证书的公钥加密这个会话密钥,发给Server。

5.Server使用自己的私钥(private key)解密这个消息,得到会话密钥。至此,Client和Server双方都持有了相同的对称密钥。

6.Server使用会话密钥加密“明文内容A”,发送给Client。

7.Client使用会话密钥解密响应的密文,得到“明文内容A”。

8.Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。

总结:查数字证书->客户端随机生成会话密钥,用服务器的公钥加密,发给服务器->服务器用私钥解密-》两边都有了对称密钥,用来加密会话->服务器加密后响应-》浏览器解密,然后加密后请求

五、堆、栈、队列

堆(heap)

堆(heap)是指程序运行时申请的动态内存,在JS运行时用来存放对象。

栈(stack)

栈(stack)遵循的原则是“先进后出”,JS种的基本数据类型与指向对象的地址存放在栈内存中,此外还有一块栈内存用来执行JS主线程–执行栈(execution context stack)

队列(queue)

队列(queue)遵循的原则是“先进先出”,JS中除了主线程之外还存在两个“任务队列”(微任务队列microTask和宏任务队列macroTask)。

微任务:promise.then

宏任务:setTimeout, setInterval

六、DNS解析过程

  1. 查看主机缓存,是否有对应的域名-IP地址

  2. 递归查询本地域名服务器

  3. 如果本地域名服务器也查不到,就会进行一系列的迭代查询
    首先向根域名服务器 迭代查询, 根域名服务器告知 顶级域名器
    迭代查询顶级域名服务器
    迭代查询权限域名服务器

七、为什么TCP三次握手建立连接

TCP/IP协议是传输层

三次握手的机制是为了保证能建立安全可靠的连接

第一次握手是客户端发起, 客户端会向服务端发送一个报文,SYN=1, 服务端收到之后就知道客户端希望建立连接,

第二次握手是服务端发起的确认TCP连接请求,ACK=1, SYN=1

以上两次握手之后,客户端已经明确自己可以发送请求,也可以接受响应

但对于 服务端, 两次握手不够,因为服务器目前只知道 客户端发送的消息,服务端可以收到,但它不知道服务端发送的消息,客户端能不能收到

所以需要第三次握手

当客户端收到服务端发来的确认请求后,还需要再向服务端发送确认这个请求,ACK=1

以上,两方都知道 自己能发送消息,也可以接受消息

第三次握手是为了防止已经失效的TCP请求突然又到达服务端,服务端误以为有新的TCP请求,会一直等待,浪费资源

八、为什么TCP四次挥手取消连接

四次握手也是客户端和服务端都可以发起

当客户端先发起时,FIN=1

当服务端接收到这个请求,就知道客户端希望取消连接,于是就发送一个请求确认,

这个时候,客户端已经做好了取消连接的准备,但服务端不一定做好了取消连接的准备

服务端可能还有没有发送出去的数据

当服务端做好断开连接的准备,会向客户端发送一个TCP连接释放请求,

然后客户端收到之后,发送确认报文

九、HTTP状态码

414 请求过长

429 请求过多

参考:

github.com/mqyqingfeng…