面试心得
面试前准备
本人最近一直在从事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协议栈的话,就不会有这种暴露的风险,因为代码是不公开的。
开源还有个问题就是会养成拿来主义的思想,国内著名的云厂商之前就提出过自己的云是自主研发的云而其他家的云都是拿来的云,暂且不说这个是否一定正确,但在一定的角度上说明了自主可控的要比拿开源代码实现的产品更具有信服力