落地|到底什么才是“网络编程”?

落地 , 意味着对实战的要求更高 。 所以 , 一些朋友更喜欢用类似Netty这种封装好的框架——快速 , 高效 。 确实 , 跟开发细节相比 , 我们常常更看重开发效率 。
可日常的项目里 , 我们也不得不面对极端的网络性能考验 。 没人喜欢堵车 , 但应对大量请求时 , 如果网络性能处理不佳 , 数据、业务就会面临大塞车 。
举个正向的例子 , 之前在绿盟有个信息安全产品 , 叫黑洞 , 是当时市场上最成功的DDOS过滤设备 。 这玩意最大的技术难点就在于:当攻击报文洪水到达时 , 每秒要过滤掉几十万攻击请求 。 在那之前 , 我从没想过通过程序代码 , 对网络报文的处理效率 , 竟然能达到如此强悍的地步 。
早些年尚且如此 , 更别提如今的5G时代了 。 用户大幅度提升的平均网络传输速度 , 正对我们提出高性能网络编程的要求:不仅要解决诸如提高吞吐量和并发性等问题 , 还得处理各种棘手异常 , 比如保证千万个连接的正常运行等等 。
【落地|到底什么才是“网络编程”?】这些 , 显然不是一两个框架就能搞定的 。
可惜的是 , 我面试过的不少候选人都没有意识到这点 , 哪怕他们已经工作多年 , 在网络协议和网络编程这块依旧不是很上心 , 对其的理解也还停留在一个比较浅的层次上 , 比如:
?大家经常说的四层、七层 , 分别指的是什么?
?TCP三次握手是什么 , TIME_WAIT是怎么发生的?CLOSE_WAIT又是什么状态?
?Linux下的epoll解决的是什么问题?如何使用epoll写出高性能的网络程序?
?什么是网络事件驱动模型?Reactor模式又是什么?
其实 , 无论在面试还是工作中 , 网络性能及优化这方面的知识都是非常重要的基本功 。 在我看来 , 想做到高性能网络编程 , 下面两个核心要点永远都绕不开:
第一 , 在理解网络协议的基础上 , 充分利用操作系统内核提供的能力 , 感知各种网络I/O事件;第二 , 学会使用线程处理并发 。 抓住这两点 , 就抓住了高性能网络编程的“七寸” 。
分享给你一张网络编程的核心知识图谱 , 将上述两个核心会涉及到的知识点都囊括在内 , 只要我们仔细梳理、透彻理解这些核心知识点 , 就能学以致用地解决工作中的实际问题 。
落地|到底什么才是“网络编程”?

这张图谱出自盛延敏的《网络编程实战》专栏 。 其实我觉得他这名字起得太朴素了 。 要我的话 , 就叫:高性能网络编程 , 因为整个专栏都是围绕「高性能」展开的 。
但话又说回来 , 高性能就建立在那些实打实的经验基础上 , 所以现在这个也算简洁有力 。 内容同样是单刀直入展开 , 比如在讲解某个理论或算法时 , 与代码、实验相关联 , 分析它提出的目的、解决了哪些问题 。
说白了 , 就是从解决实际问题的角度切入 , 讲解知识点 , 让你透彻理解协议、API和代码 。 学完就能用得上 , 这点挺不错的 , 值得推荐给你 。
盛延敏 , 前大众点评云平台首席架构师 , 现就职于某大型金融服务公司(很好猜但人家不让说) , 专注云计算的架构和开发工作 。
他博士毕业于中科大 , 毕业后加入IBM , 从事WebSphere应用服务器、PaaS平台Bluemix等系统的开发工作 。 后任职大众点评 , 推动了以Docker为核心的私有云建设和落地 。
2000年起 , 他开始用网络编程框架ACE、CORBA等进行电信网管系统的开发 , 后来接触了ICE , 写分布式控制系统 。 再之后转向Java , 使用JDK进行WebService和应用服务器的网络开发和研究 , 使用Netty进行Java高性能网络编程的开发 。 这些工作经历 , 让他对网络编程有了极为深入的理解 。