面试必考的网络编程知识,帮你梳理好了

原文链接:https://time.geekbang.org/column/intro/100032701?code=MrepKa9qbL%2Fq4MYlFPzBkWI4YZyqbwypNFX95YzPpkA%3D\x26amp;utm_term=SPoster

什么是网络编程?用一句话概括,就是对网络协议的落地。

落地,意味着对实战的要求更高。所以,一些朋友更喜欢用类似 Netty 这种封装好的框架——快速,高效。既然这样,为什么要学网络编程呢?

跟开发细节相比,有时候我们更看重开发效率。但如果是高性能网络编程呢?

拿盖房子来说,如果要建个小平房,对地基的深浅和材质没那么高要求;但要想建造高楼大厦,小平房的地基条件就远远不够了。

同样的,普通开发跟高性能网络编程也不能相提并论,高性能就意味着:那些未经大规模验证的设计很容易到达临界点。

这时,不仅要想办法延展边界,比如提高吞吐量和并发性,还要解决各种棘手异常,比如如何保证千万个连接的正常运行等等。

这些问题,可不是一个框架就能解决的

框架的产生,或是为了实现跨平台支持,例如 JDK;或是为了屏蔽网络编程的细节,让开发更方便,例如 libevent。直接学框架,出了问题也难以排查,更无法捋顺框架背后的设计逻辑

业余草面试过很多候选人,我发现,即使是工作多年的技术人,对网络协议和网络编程的理解,仍然停留在一个比较浅的层次上,比如:

• 大家经常说的四层、七层,分别指的是什么?

• TCP 三次握手是什么,TIME_WAIT 是怎么发生的?CLOSE_WAIT 又是什么状态?

• Linux 下的 epoll 解决的是什么问题?如何使用 epoll 写出高性能的网络程序?

• 什么是网络事件驱动模型?Reactor 模式又是什么?

大多数人仅停留在「是这样」的阶段,对「为什么」缺乏深入了解。其实,无论在面试还是工作中,这方面知识都是非常重要的基本功

在我看来,学高性能网络编程,掌握两个核心要点就够了:第一,在理解网络协议的基础上,充分利用操作系统内核提供的能力,感知各种网络 I/O 事件;第二,学会使用线程处理并发。

抓住这两个核心问题,就抓住了高性能网络编程的“七寸”

分享给你一张网络编程的核心知识图谱,仔细梳理、透彻理解这些知识点,才能学以致用地解决工作中的实际问题。

这张图谱出自盛延敏,最近他跟极客时间合作了专栏《网络编程实战》

业余草提前看到了目录,其实挺想多说一句:这名字起得太朴素了。要我的话,就叫:高性能网络编程,更贴切些,因为整个专栏都是围绕着「高性能」展开的

但话又说回来,高性能就是建立在那些实打实的经验基础上,所以现在这个也没啥毛病,算是简洁有力。

专栏里的内容,也是单刀直入展开,举个栗子:在讲解某个理论或算法时,与代码、实验相关联,分析它提出的目的,以及解决了哪些问题。

说白了,就是从解决实际问题的角度切入,讲解知识点,让你透彻理解协议、API 和代码。学完就能用得上,这点挺不错的,值得推荐给你。

关于盛延敏

盛延敏,现就职于某大型金融服务公司(很好猜,但人家不让说),专注云计算的架构和开发工作。

博士毕业于中科大,毕业后加入 IBM,从事 WebSphere 应用服务器、PaaS 平台 Bluemix 等系统的开发工作。后任大众点评云平台首席架构师,推动了以 Docker 为核心的私有云建设和落地。

2000 年那会儿,他就开始用网络编程框架 ACE、CORBA 等进行电信网管系统的开发,后来又接触了 ICE,写分布式控制系统。再之后转向 Java,使用 JDK 进行 Web Service 和应用服务器的网络开发和研究,使用 Netty 进行 Java 高性能网络编程的开发。

他是如何讲解网络编程的?

网络编程是个重实战的模块。在专栏中,他从底层原理讲起,逐步聚焦到高性能编程上,讲解了那些常见异常和性能问题,并手把手教你搭建一个可用的高性能框架。

专栏主要聚焦 Linux 系统下的网络编程,相比于 Windows,Linux 可以更好、更完善地实现互联网的所有底层通道。加上基于 Linux 的移动开发平台 Android 迅速崛起,Linux 的重要性我也不多说了。

专栏主要分三大层级,逐步递进:

第一,理解 TCP/IP 网络模型和协议。

在基础篇中,梳理了 TCP/IP 模型和网络函数接口之间的联系,通过实例展开对套接字、套接字缓冲区、拥塞控制、数据包和数据流、本地套接字(UNIX 域套接字)等的讨论,交付了一个全面细致的知识体系。

第二,结合对协议的理解,增强对各种异常情况的处理能力。

比如,对 TCP 数据流的处理、半关闭的连接、TCP 连接有效性的侦测、处理各种异常情况等,这些问题决定了程序的健壮性。这一部分的内容,在提升篇有详细展开。

第三,写出可支持大规模高并发的网络处理程序。

在性能篇中,深入研究了 C10K 问题,引入进程、线程、多路复用、非阻塞、异步、事件驱动等现代高性能网络编程所需要的技术,并在实战篇中,结合实例进行上手操作,让你可以独立写出高性能的网络程序。

我看盛延敏用荀子那句“不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。”来诠释学习网络编程的最佳方法,太文艺了哥,要我说的话:干就完了。

学透了,就要去用,你可以对专栏里的代码进行修改和调试,进一步加深理解。跟着好好学,把这些内容都吃下去,消化掉,从底层到实战,透彻理解高性能网络编程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券