面试前准备
本人最近一直在从事 TCP + SSL 协议栈的开发工作并且这两个方面绝对擅长,所以认为这两方面不需要任何准备
花了一天时间重新梳理了平时工作中涉及的以下内容,因为这些东西具有一定的技术优势和技术难度(若不是工作涉及,很少有人会理解的很深)
- DPDK 的内存管理,memseg, memzone, mempool 的实现源码(目前主要从事的工作就是基于该平台的)
- IXGBE 网卡驱动初始化部分源码和收发报文的源码(曾经优化过 IGB 的网卡驱动并熟悉 intel 的网卡驱动)
- 操作系统 IRQ 的申请和中断触发后的调用流程源码(个人认为能了解这个流程的基本上就能熟悉 intel 网卡驱动代码了)
- TLDK(基于 DPDK 的传输层开发套件)的框架和主要流程源码(在此平台上开发过代理应用)
- VPP 源码 TCP 层和 session 层的源码,VPP 的调度框架源码(同样在此平台上开发过代理应用)
- 操作系统的内存管理和进程调度源码(有 6 年的时间都是在内核开发代理应用)
面试内容
准备的内容一项没有谈,SSL 则是一笔带过,TCP 也是浅尝辄止,感觉面试的岗位就是需要熟悉 LVS 和 Nginx 两个开源的代码并且工作内容就是运营维护这些基于开源搭建的产品
面试结果
因不熟悉提到的两个开源代码,所以应该是不会通过
面试的感想
关于 SSL 的问题,其实多数人对 SSL 的了解就是 openSSL 库提供的接口,执行 init 初始化,然后通过 SSL_read, SSL_write,但是本人对 SSL 协议栈的实现和涉及的各种算法都精通,最近的项目就是
在 DPDK 上加入 TCP 协议栈再加入 SSL 协议栈(注意不是内部调用 SSL_read 和 SSL_write 这些接口,而是完完整整的实现了 SSL 的协议栈,包括 record 状态机和 SSL 握手流程以及各种算法的使用),但是面试的时候只问了一下 SSL 的握手流程,不知道面试官是怎么想的,作为面试官问要么问些深入的实现源码,要么问些原理和思想上的,问这个表面的 RFC 定义好的几个交互流程根本没有意义。
关于 TCP 协议栈的问题,总觉得表面的一问一答形式的问题网上都有很多讲解的,比如为什么 TCP 挥手需要 4 次挥手,这个问题明显就是太过形式了,根们验证不了面试者对 TCP 协议栈源码的了解程度,如果是本人问些 TCP 4 次挥手的问题,应该问:
当应用调用了 close 后 TCP 协议栈有数据未发送的行为;当应用调用了 close 后 TCP 协议栈有数据未发送但马上收到了对端的 FIN 时候的行为;当接收端收到了未按序到达的 FIN 报文时的行为;这些都是什么问题?这些都是个问题吗?这些就是问题!为什么会问这些问题:1. 本人基于 VPP 平台开发了应用项目,刚才说的这几个问题就是在阅读 VPP TCP 协议栈代码时候关注的问题,并且发现了 VPP 19.04 版本中在这些方面的两个 bug, Florin Coras(VPP TCP 协议栈实现者,VPP 的 host-stack 相关文档上都是这位发表的)给予了修复,并且后来通过私信了沟通了很多关于 VPP TCP 协议栈的实现思想和理念。2. 这些是细节的东西,这个代表着对 TCP 协议栈的理解程度。
关于开源的问题:比较大的互联网企业都是比较爱用开源的代码,总结有以下原因:
1. 开源出来的都是新的创意,而往往公司需要这个功能时,开源的已经成熟了,因为要快速迭代开发,所以就直接拿来用了
2. 由于研发人员的流动性,导致招聘到的研发人员之前就对开源比较熟悉,所以就接着沿用开源代码了
3. 公司喜欢参照大公司的产品架构,大公司用的就照搬也拿来用
4. 认为开源的代码有人维护,自己省事,并且放心
开源代码有好有坏,好处是贡献的人多,维护成本低,但坏处是开源意味着不安全,发现了代码的漏洞后就可能被利用被攻击,尤其对安全类的开源代码而言,比如当年爆出的 OpenSSL 心脏流血的漏洞,就是因为 OpenSSL 开源的任何人都可以去研究,当发现漏洞后可以利用漏洞攻击很多使用 OpenSSL 的网站。但如果闭源,也就是是自己实现 SSL 协议栈的话,就不会有这种暴露的风险,因为代码是不公开的。
开源还有个问题就是会养成拿来主义的思想,国内著名的云厂商之前就提出过自己的云是自主研发的云而其他家的云都是拿来的云,暂且不说这个是否一定正确,但在一定的角度上说明了自主可控的要比拿开源代码实现的产品更具有信服力