You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
7.1 KiB
Markdown

2 years ago
# 开篇词 | 学好网络编程,需要掌握哪些核心问题?
你好,我是盛延敏,欢迎你的加入。在接下来的几个月时间里,我会和你一起深入学习网络编程。网络编程是一个高度重视实战的内容模块,工作这么多年,我一直都在近距离与它打交道。
我博士毕业于中科大毕业之后就加入了IBM在IBM从事WebSphere应用服务器、PaaS平台Bluemix等系统的开发工作后来又在大众点评担任云平台首席架构师推动了以Docker为核心的私有云的建设和落地。现在我在蚂蚁金服专注于云计算的架构和开发等方面的事情。正是这些工作经历让我对网络编程有了更为深入的理解。
2000年初我就开始使用网络编程框架ACE、CORBA等技术从事电信网管系统的开发后来又开始接触ICE写分布式控制系统再之后转向Java使用JDK从事Web Service和应用服务器的网络开发和研究使用Netty从事Java高性能网络编程的开发。作为一个网络程序设计和开发的老兵我目前继续在云计算领域深度耕耘更是少不了和各种网络设计和开发打交道。
得益于这么多年的深耕,在工作过程中,我也接触了不少同学,面试过很多候选人,令我惊讶的是,很多工作很久的同学对网络协议和网络编程一知半解,仅仅停留在一个很粗浅的水平。
事实上,无论是在面试中,还是在工作中,掌握网络编程领域的知识都是一个非常重要的基本功。这在互联网蓬勃发展的今天,更是如此。
如果我问你一些关于网络编程方面的问题,你会怎样回答呢?
* 大家经常说的四层、七层,分别指的是什么?
* TCP三次握手是什么TIME\_WAIT是怎么发生的CLOSE\_WAIT又是什么状态
* Linux下的epoll解决的是什么问题如何使用epoll写出高性能的网络程序
* 什么是网络事件驱动模型Reactor模式又是什么
这些问题看似简单,但想做到完全理解可并不容易。很多人可能停留在“是这样”的状态,对于“为什么”缺乏深入和了解。
我在学网络编程的时候,也面临着这种窘境。我发现很多情况下,我们都希望尽可能详尽地学习网络编程,面面俱到,但奈何头绪太多,对于初学者来说很容易深陷其中,钻牛角尖,也就难以去理清脉络了。
这样导致的后果就是过分关注知识点本身,片面地斩断了它们与实际工作的联系。比如流量控制和拥塞控制这一部分的内容。我记得我在学这部分知识的时候,纯粹是把这些当作考试的知识点来学习,很难将书本的知识和实际经验,尤其是和代码结合起来进行理解。为什么会有这些算法,它们究竟解决了哪些问题?这些问题搞不懂,看似无伤大雅,其实已经或多或少地和实际工作产生了断层。
流量控制和拥塞控制只是网络编程一小部分的内容进程、线程、多路复用、异步I/O这些概念一摆出来又会让人一头雾水。从哪里学怎么学
很多人在理论部分折了戟,干脆跑向了另一个极端,转而去学习框架,快速上手。事实上,理论是基石,框架则是站在一个更为抽象的角度来看待网络编程问题。框架的产生或是为了实现跨平台支持,例如 JDK或是为了屏蔽网络编程的细节让开发更为方便例如 libevent。
没有理论为底,框架也只是空中楼阁。直接学习框架反而会更加摸不着头脑,对网络编程也很难有实打实的收获。
那么你可能会问,理论学不懂,框架又不行,到底应该怎么学?
事实上,我认为学习高性能网络编程,掌握两个核心要点就可以了:**第一就是理解网络协议并在这个基础上和操作系统内核配合感知各种网络I/O事件第二就是学会使用线程处理并发**。抓住这两个核心问题,也就抓住了高性能网络编程的“七寸”。我会从实践出发,单刀直入地展开,从问题的角度对这些看似枯燥的知识点进行阐述。
我会跟你一起在专栏里研究某个理论或者算法,看看它提出来的目的到底是什么,又解决了哪些问题。我还会和代码进行关联,和实验进行关联,循序渐进地引出这个理论或者算法的实际意义。
我会从最简单的网络套接字开始一步步带你写出健硕的高性能网络程序。在这个过程里我会尽我所能将自己在这个领域中多年的体会和专栏内容融为一体帮助你理解协议、API和代码。
在专栏里我们会重点展开对Linux网络编程的学习。原因也很简单目前Linux系统已成为互联网数据中心的标配再加上基于Linux的移动开发平台Android的迅速崛起Linux的重要性愈发明显。对有志于学习网络编程的你来说这是一个非常明智的选择。
我在下面放了一张专栏的目录,专栏将分别从基础篇、提升篇、性能篇和实战篇展开。
![](https://static001.geekbang.org/resource/image/d9/b4/d9868ff93c308befe7bb3f06cfc828b4.jpg)
在我看来,要学好网络编程,需要达到以下三个层次。
**第一个层次充分理解TCP/IP网络模型和协议**。在这方面,仅仅做到理论上的理解是远远不够的。在**基础篇**中我们会梳理TCP/IP模型和网络函数接口之间的联系并通过实例展开对套接字套接字缓冲区拥塞控制数据包和数据流本地套接字UNIX域套接字等的讨论给你一个全面而具体的知识体系。
**第二个层次,结合对协议的理解,增强对各种异常情况的优雅处理能力**。比如对TCP数据流的处理半关闭的连接TCP连接有效性的侦测处理各种异常情况等这些问题决定了程序的健壮性。有关这一部分的内容我们将在**提升篇**详细展开。
**第三个层次,写出可以支持大规模高并发的网络处理程序**。在这个阶段我将带你一起深入研究C10K问题引入进程、线程、多路复用、非阻塞、异步、事件驱动等现代高性能网络编程所需要的技术。我们将在**性能篇**深入讨论这些技术,并在**实战篇**结合实例,一步步教你写出高性能的网络程序。
“不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。”几千年前荀子的这段话,告诉了我们学习计算机编程技术的最佳方法,我想用在这里再合适不过了。
所以,无论是哪个层次,都需要你和我一起坚持下去。你可以对专栏里的代码进行修改和调试,从而增强你对网络编程的理解。
最后,请你留言说一说自己的情况。你在什么岗位?工作几年啦?在日常工作中是怎么使用网络编程的?开张圣听,期待跟你碰撞出更多精彩想法。感谢你对我的信任,我一定会竭尽所能,助你成功。
让我们一起进步。
![](https://static001.geekbang.org/resource/image/bf/25/bfc96ae0d8f839919b9d9866cfb8b025.jpg)