3.28 - 美团暑期实习一面

总计1h

一、八股

1. OSI七层模型,每一层具体介绍

2. HTTP和HTTPS

3. TCP和UDP,UDP的适用场景

4. HTTP3,为什么要基于UDP?

首先TCP的问题是:

  • 连接时间长(三次握手、四次挥手)
  • 队头阻塞
  • 拥塞控制
  • ...

如果要改造TCP,涉及到的协议非常多,会出现很多兼容性的问题,并且成本很大;

但UDP是无连接的,没有建链和拆链的成本,也没有队头阻塞的问题,所以非常适合在此基础上升级,因此选择UDP来作为构建QUIC协议的基础。

QUIC协议是怎么解决上述问题的呢?

  • 连接时间

    首次建立连接需要1RTT;之后的传输可以达到0RTT。

    • 首次建立过程

      服务端先准备好一个素数p,一个整数g,一个随机数S_sk作为自己的私钥,那么就可以得到自己的公钥:S_pk = g^S_sk mod p;

      客户端向服务端发送 “Client Hello!”;

      服务端将自己的公钥和g、p都发送给客户端。

     =============  ok,到这里其实已经建立好连接了,后面就可以直接发送请求了。 ==============

    • 客户端选择一个随机数作为自己的私钥C_sk,然后利用收到的g、p生成自己的公钥:C_pk = g ^ C_sk mod p;同时生成会话密钥K = S_pk ^ C_sk mod p,对消息加密,并将自己的公钥一起发送给服务端;
    • 服务端收到后,根据收到的客户端公钥计算会话密钥,解密消息。消息传输完成。

     ==================== 以上算法就是Diffie-Hellman算法。 ===============================

      第一次成功加密、解密消息后,服务端会按照之前的两个步骤,重新生成一个密钥,之后双方一直用这个新生成的密钥加密信息。

      为什么要新生成密钥呢?这是为了保证历史会话消息的安全性。因为服务端的原始私钥一直保存在config中,一旦私钥泄漏,那么很容易就可以将之前的每次会话信息都解密;

      每次新生成一个临时密钥,只会让泄漏密钥那一次的消息泄漏,而不会影响之前的消息。

  • 队头阻塞
    • TCP是通过重传和滑动窗口来保证可靠传输,造成队头阻塞。但UDP中,一条连接上会有多个流互不影响,一个流上有数据丢失对流没有影响。
  • 数据安全
    • 见连接时间。
  • 连接迁移
    • TCP根据唯一五元组来表示连接,SPORT+SIP+DIP+DPORT+协议号,同一台设备网络发生切换时IP地址会发生变化,因此就需要重新建立连接了;
    • 但UDP是使用64位随机数来表示连接,及时网络切换也不会重连。

5. 强缓存,协商缓存

6. 强缓存除了返回200,还会返回什么?

会在200 ok后面标注,来自内存缓存/硬盘缓存。

7. Etag和Last-modified优先级

8. Etag的缺点

服务器会为每个资源分配的唯一标识符就是Etag,注意是由服务器自己分配的!因此在分布式服务器的情况下,很有可能相同的资源在不同的服务器上对应的Etag是不相同的;计算Etag也会有性能消耗。

PS:Etag也分强Etag和弱Etag。强Etag只要资源发生一丁点改变,Etag值就会变;弱Etag只要资源没有发生根本改变,那么它就不会变化,前面会带有 “ W/ ” 字样。

9. 进程和线程

10. 进程间的通信方式

二、算法

1. 判断链表有环 141. 环形链表 - 力扣(Leetcode)

2. 最长子序列的长度 516. 最长回文子序列 - 力扣(Leetcode)

3. 矩阵最长递增路径 329. 矩阵中的最长递增路径 - 力扣(Leetcode)

 

posted @ 2023-03-28 20:38  Bookisso  阅读(53)  评论(0)    收藏  举报