一面
- TCP与UDP区别
- UDP的优点(实时性好,占用资源低,无需三次握手较少被黑客利用的机会)
- UDP增加哪些功能可以实现更可靠、更稳定、且保证有序(超时重传、滑动窗口流量控制、序号/确认序号,面试官提到了kcp)
- Go Map如何实现并发安全?
- 在原生map的基础上加锁(注意控制锁的颗粒度,避免锁住整个map,可采用分段锁实现,比如:对一个大map进行hash,其内部是n个小map,根据key来来hash确定在具体的那个小map中,这样加锁的粒度就变成1/n了)
- 使用sync.Map
- Go sync.Map如何实现的?具体可参考文章:Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
- 写操作:直接写dirty map。
- 读操作:先读read map,没有再读dirty map。
- 优点:底层通过两个map来实现读写分离,保证线程安全的同时,降低锁时间来提高效率
- 缺点:不适用于大量写的场景,这样会导致read map读不到数据而进一步加锁读取,同时dirty map也会一直晋升为read map,整体性能较差;适用场景:适合读多写少的场景
- 原理:
sync.Map底层使用了两个原生map,一个叫read,仅用于读;一个叫dirty,用于在特定情况下存储最新写入的key-value数据:
read(这个map)好比整个sync.Map的一个“高速缓存”,当goroutine从sync.Map中读取数据时,sync.Map会首先查看read这个缓存层是否有用户需要的数据(key是否命中),如果有(命中),则通过原子操作将数据读取并返回,这是sync.Map推荐的快路径(fast path),也是为何上面基准测试结果中读操作性能极高的原因。
- sql注入的原理,解决方案。(面试官说他之前抓包查看过sql模板化的过程:其实就是MySQL内部先传sql模板,然后再传参数到模板中)
可以理解为sql模板化,通过占位符将用户传入的值当做字符串来处理,避免将用户不可预期的传入参数当做sql命令来执行。
预编译语句在被MySQL编译器编译后,执行代码会被缓存下来。那么下次调用时,只要是相同的预编译语句就再不需要编译,只要将参数直接传入编译过的语句执行代码中即可。
- 介绍下https协议,其非对称加密的过程
- https加密过程中,为什么需要第一次http的协商对称加密的密钥操作,然后再通过对称加密进行数据传输呢?(tls的两个阶段)
避免在网络传输的过程中被中间人拦截请求,即使中间人拦截了客户端的请求,也因为中间人自身没有服务端私钥,导致其不能对请求进行对称解密,从而获取不到客户端对称加密的密钥。
- 客户端收到服务端的公钥后,为什么要本地生成一个随机值作为客户端密钥,而不直接使用服务端的公钥作为客户端自身的密钥呢?
面试官说,因为性能上不允许,待了解…
- RSA算法怎么加解密的?它的public key和secret key分别是什么东西(加解密很耗时)?AES对称加密的流程呢?
- 项目介绍?