网络编程实战
盛延敏
前大众点评云平台首席架构师
立即订阅
6034 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 学好网络编程,需要掌握哪些核心问题?
免费
第一模块:基础篇 (9讲)
01 | 追古溯源:TCP/IP和Linux是如何改变世界的?
02 | 网络编程模型:认识客户端-服务器网络模型的基本概念
03丨套接字和地址:像电话和电话号码一样理解它们
04 | TCP三次握手:怎么使用套接字格式建立连接?
05 | 使用套接字进行读写:开始交流吧
06 | 嗨,别忘了UDP这个小兄弟
07 | What? 还有本地套接字?
08 | 工欲善其事必先利其器:学会使用各种工具
09丨答疑篇:学习网络编程前,需要准备哪些东西?
第二模块:提高篇 (10讲)
10 | TIME_WAIT:隐藏在细节下的魔鬼
11 | 优雅地关闭还是粗暴地关闭 ?
12 | 连接无效:使用Keep-Alive还是应用心跳来检测?
13 | 小数据包应对之策:理解TCP协议中的动态数据传输
14丨UDP也可以是“已连接”?
15 | 怎么老是出现“地址已经被使用”?
16 | 如何理解TCP的“流”?
17 | TCP并不总是“可靠”的?
18 | 防人之心不可无:检查数据的有效性
19丨提高篇答疑:如何理解TCP四次挥手?
期中复习周 (2讲)
期中大作业丨动手编写一个自己的程序吧!
免费
期中大作业丨题目以及解答剖析
免费
第三模块:性能篇 (12讲)
20 | 大名⿍⿍的select:看我如何同时感知多个I/O事件
21 | poll:另一种I/O多路复用
22 | 非阻塞I/O:提升性能的加速器
23 | Linux利器:epoll的前世今生
24 | C10K问题:高并发模型设计
25 | 使用阻塞I/O和进程模型:最传统的方式
26 | 使用阻塞I/O和线程模型:换一种轻量的方式
27 | I/O多路复用遇上线程:使用poll单线程处理所有I/O事件
28 | I/O多路复用进阶:子线程使用poll处理连接I/O事件
29 | 渐入佳境:使用epoll和多线程模型
30 | 真正的大杀器:异步I/O探索
31丨性能篇答疑:epoll源码深度剖析
第四模块:实战篇 (4讲)
32 | 自己动手写高性能HTTP服务器(一):设计和思路
33 | 自己动手写高性能HTTP服务器(二):I/O模型和多线程模型实现
34 | 自己动手写高性能HTTP服务器(三):TCP字节流处理和HTTP协议实现
35 | 答疑:编写高性能网络编程框架时,都需要注意哪些问题?
结束语 (1讲)
结束语丨我相信这不是结束,让我们江湖再见
网络编程实战
登录|注册

开篇词 | 学好网络编程,需要掌握哪些核心问题?

盛延敏 2019-07-29
00:00
07:25
讲述:冯永吉 大小:6.80M
你好,我是盛延敏,欢迎你的加入。在接下来的几个月时间里,我会和你一起深入学习网络编程。网络编程是一个高度重视实战的内容模块,工作这么多年,我一直都在近距离与它打交道。
我博士毕业于中科大,毕业之后就加入了 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 的重要性愈发明显。对有志于学习网络编程的你来说,这是一个非常明智的选择。
我在下面放了一张专栏的目录,专栏将分别从基础篇、提升篇、性能篇和实战篇展开。
在我看来,要学好网络编程,需要达到以下三个层次。
第一个层次,充分理解 TCP/IP 网络模型和协议。在这方面,仅仅做到理论上的理解是远远不够的。在基础篇中我们会梳理 TCP/IP 模型和网络函数接口之间的联系,并通过实例展开对套接字,套接字缓冲区,拥塞控制,数据包和数据流,本地套接字(UNIX 域套接字)等的讨论,给你一个全面而具体的知识体系。
第二个层次,结合对协议的理解,增强对各种异常情况的优雅处理能力。比如对 TCP 数据流的处理,半关闭的连接,TCP 连接有效性的侦测,处理各种异常情况等,这些问题决定了程序的健壮性。有关这一部分的内容,我们将在提升篇详细展开。
第三个层次,写出可以支持大规模高并发的网络处理程序。在这个阶段,我将带你一起深入研究 C10K 问题,引入进程、线程、多路复用、非阻塞、异步、事件驱动等现代高性能网络编程所需要的技术。我们将在性能篇深入讨论这些技术,并在实战篇结合实例,一步步教你写出高性能的网络程序。
“不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。”几千年前荀子的这段话,告诉了我们学习计算机编程技术的最佳方法,我想用在这里再合适不过了。
所以,无论是哪个层次,都需要你和我一起坚持下去。你可以对专栏里的代码进行修改和调试,从而增强你对网络编程的理解。
最后,请你留言说一说自己的情况。你在什么岗位?工作几年啦?在日常工作中是怎么使用网络编程的?开张圣听,期待跟你碰撞出更多精彩想法。感谢你对我的信任,我一定会竭尽所能,助你成功。
让我们一起进步。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《网络编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(111)

  • C家族铁粉 置顶
    弱弱问一下,是不是学过java,才能学这门课~我只会点c/c++语法

    编辑回复: 专栏内容会涉及到一些底层的东西,有C或者C++语言基础即可~

    2019-07-29
    7
  • 晚枫 置顶
    老师,你好,专栏是使用c++语言吗

    编辑回复: 需要有C或者C++的基础哈,毕竟涉及到操作系统底层操作,不过你不用特别担心,不难,能看懂语法就行。

    2019-07-29
    5
    3
  • widy28 置顶
    请问这个是什么时候开课,写的每周一周三周五开课,找了半天没找到从几月几号开始,昨天一看没有更新课程呢?

    编辑回复: 周五更新。

    2019-08-01
    2
  • binary
    10年Java,决心学习网络系统底层。

    作者回复: 强,一起学习

    2019-07-30
    10
  • 陈华应
    以前看过极客的专栏发布时间表,是很期待的一门课程。今天推了就第一时间看了开篇,没有想过是c版的,对c的了解连皮毛都不算,但还是决定跟,尝试用Java跟下来,双十一的时候回来给自己鼓掌~~~

    作者回复: 感谢信任。我是这么理解的,c版的是最接近事实真相的,因为系统内核的API也是c版的,通过c版的学习,对Java的学习会起到事半功倍的效果。放心,c版代码理解起来很容易,我会对代码进行解读,一起加油~

    2019-07-29
    9
  • 传说中的成大大
    我现在就在学Linux 也在看多路复用 突然来了这个专栏我毫不犹豫的买了,自从学了Linux就知道有个内核那个东东 套接字也是文件 是内核管理的 当某个套接字上有数据达到时 内核就会唤醒套接字对应等待的进程也就是recv的返回 epoll就是为了解决大量套接字的问题 select数量有限,我是进来提高加实战的

    作者回复: 已经有相当的基础了,总结的不错

    2019-07-30
    6
  • 郭凯强
    3年半web developer,最近正好在看罗剑锋老师的《透视HTTP协议》,看到课程目录里的自己写HTTP服务器就果断入了...实践才能出真知。

    作者回复: 实践出真知+1

    2019-07-30
    6
  • Skrpy
    我现在是大三的暑假,准备考研的复习,我觉得这个专栏能在我复习计算机网络时给我更好的启发,同时我也希望复习的过程不是纸上谈兵,而是将来能在实际实验和工作中践行这些知识。

    作者回复: 机会总是垂青准备好的人,我觉得你就是这样的人,加油!

    2019-07-30
    5
  • 禾桃
    希望能增加一个章节,讲讲 kernel bypass,
    solarflare 和 exanic的API,多谢!

    作者回复: 很前沿,好题材

    2019-07-29
    1
    5
  • wang
    工作一年,今天刚毕业,找了一份今后会接触这方面很多的工作,不过同事大多用go,主要对并发封装很好,自己一直用Java,没啥特别的目的,学习一直在路上,有则增强,无则开拓

    作者回复: 语言是工具,原理是基础

    2019-07-30
    4
  • leesper
    中科大学长的课必须要支持一下!我工作五年多了,从第一天工作起就接触高性能网络编程,从C++到Java,自己也用Go写过网络编程框架,但还不是Reactor模式,期望学完本课后将框架改进为真正的one loop per thread模型!

    作者回复: 同道中人,一起共勉

    2019-07-29
    4
  • 黄金
    看评论都是大佬。。一年经验前端的我瑟瑟发抖,试试能不能学到点东西,就怕经验太少看不懂

    作者回复: 看不懂更要努力拉

    2019-08-08
    3
  • nightmare
    java岗位,6年经验,平常在项目中用netty,非常简单快捷的编写网络程序,平常只需要关注handler的业务逻辑,对于reactor netty就很好的实现了 用eventLoop实现了Reactor 而且用 eventLoopGoup可以快速实现reactor的单线程模型,多线程模型,主从模型

    作者回复: 嗯,我希望不仅是会用,还能理解为什么是这么设计的,这样就跟武侠小说里男主一般,打通任督二脉,功力方能大增。

    2019-07-29
    2
    3
  • linupy
    你好,有语言限制吗,特别是后期编写http服务器的时候?

    作者回复: 没有限制,大家都会看懂的

    2019-07-31
    2
  • 贺荣伟
    我是一名软件工程专业的研究生,明年就要毕业了,在读研期间,做过一些网络编程相关的项目,在最近找工作的过程中,发现,关于网络编程,IO 多路复用,select,poll,epoll 这一块的知识点,面试问的挺多的,在自己一路学习的过程中,也踩过很多坑,希望通过盛老师的这个专栏,能系统性的提升自己对网络编程知识的认知,加深理解,重要的还是要动手写代码,在实践中学习!大家一起加油吖!

    作者回复: 动手写起来,一定会有收获

    2019-07-30
    1
    2
  • 传说中的成大大
    而我今年的目标就是弄熟 数据结构和算 linux下的进程控制 线程控制 i/o复用 很期待你的文章

    作者回复: 路选对了,还怕远吗?

    2019-07-30
    2
  • tdytaylor
    老师,等了好几个月了,终于等到您的网络编程了

    作者回复: 感谢信任

    2019-07-30
    2
  • SMTCode
    自己造高并发的轮子确实很艰难,也是综合实力的体现。

    作者回复: 造轮子的目的是为了更好的理解,大家一起努力~

    2019-07-29
    2
  • 错过了过去
    一直在学习网络相关的知识,各种协议,网络编程。看了这个专栏的目录,基本上所有的知识点都接触过了,但没有在实际的工作中使用过,刚毕业两年,现在正换工作去一家做 CDN 的公司,购买这个专栏的目的也就是重新梳理一遍知识点,希望有所收货,老师加油,期待好文章!

    作者回复: 感谢信任。我用心写,你用心学,必有收获。

    2019-07-29
    2
    2
  • Leo
    java开发工程师的岗位,目前工作4年,开发过程中大部分写的业务代码,对于网络编程的知识只能自己看书,但是实际开发业务中没涉及到需要自己去写,所以看了之后很容易忘记,希望通过课程增强对这块的掌握,提成自己
    2019-08-14
    1
收起评论
99+
62
返回
顶部