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)

浙公网安备 33010602011771号