如何学习 Linux 网络编程 一文讲透
2026/9/5 1:50:56 网站建设 项目流程

为什么要学习网络编程

在日常的工作中,绝大部分人从事的工作都是业务开发。直接使用网络库来搭建一个服务器,涉及到网络编程并不多。那为什么还要学习网络编程呢?

  • 学习网络编程,让我们在排查网络问题时得心应手: 当线上遇到问题,如果了解网络编程,会多一个排查问题的思路,加快问题的解决。
  • 职场上拉开与同龄人的差距: 对于和网络编程相关的岗位,越了解网络编程,越能拉开同年龄人之间的差距。

举个例子: 在腾讯的时候,我们 cdn 团队,有个刚毕业的新人。对网络编程掌握更深入些,发现公司网络库的一个bug, 从此便进入了leader的视野,受到重用。在同一条起跑线上,只比同龄人多掌握了一些网络知识,就拉开了差距,聚光灯全打在他身上,从此越走越远。

从毕业到11级,这哥们只用了不到4年时间。而大部分人这个时候还停留在8级。

  • 面试时的加分项:一场面试,在一个小时左右。如何在有限的时间内突出自己的强项呢? 如果你网络编程强,那可以引导面试官深入讨论网络编程的内容。而如果什么都不突出,等面试官发散去问,那就危险了。

学习网络编程的困惑

很多人初学网络编程,照着书籍一页一页读下来,一本本啃下来。然而,除了对网络编程api了解外,似乎并没有什么收获。于是各种困扰就来了。

根本原因是: 对网络编程的全貌不了解。以为书本上的知识点就是全部了,那只是冰山一角。

即使你对书本上的知识点全都了解后,也无法做出一个像样的产品。因为这些知识点是碎片化的,你还没能力将这些碎片的知识点连点成线,形成一个完整的知识体系。

总的来说,大家学习网络编程的困惑无外乎这么几种:

  • 不了解网络编程,具体的全貌是什么,包括哪些内容
  • 刚学习网络编程,自己没能力写出大一点的项目。此时有什么好的开源项目可以拿来练练手。
  • 学网络编程能做出什么大型的项目
  • 不知道学习网络编程后,可以从事哪些工作
  • 不知道网络编程的学习路线是怎么样的。
  • 学习网络编程,有没比较好的书籍、视频教程、博客文章等资源
  • 学习网络编程,找不到带你的引路人,没人带你,无法抱大腿
  • 没有机会从事自己喜欢的网络编程岗位

初学网络编程的同学,都会经历这个过程,都会有这个疑问。

如果一开始有人能解决你这些疑问,学习网络编程将会更有方向性,也会顺利很多。而如果没人指引,得一步步自己摸索,一步步试错,会走许多的弯路,也会浪费很多的时间。

我就是走了很多弯路,一步步摸索过来的。为了让后来人少走一些弯路,我将这十多年积累的网络编程经验分享给大家,一一解答大家学习网络编程的疑问,希望对各位有所帮助。

网络编程包括哪些内容

网络编程可不止书本上介绍的哪些知识点,那些只是冰山一角。很多人学不好网络编程,主要原因是对网络编程具体涉及哪些内容不了解,也就不知道要学什么了。

网关用于转发客户端请求到后端服务器。

我们对网关这台高并发服务器进行拆解,看看高并发服务器具体包含哪些网络编程知识:

注意: 以下知识点如果看不懂,没有关系。你知道有这么个东西就行,如果你真对网络编程感兴趣,你在看开源网络库时,一定能理解这些。

  • 网络模型的选择,Reactor 还是 Proactor, 一个高并发服务器,通常会使用一种作为网络模型。
  • 多线程之间如何通信。通常会使用无锁队列进行通信,通过队列实现异步解耦。
  • 无锁队列如何设计。 单生产者还是多生产者,单消费者还是多消费者。无锁队列的性能至关重要,队列性能不行,直接影响系统的吞吐。
  • 多线程之间通过队列通信,肯定要定义一个消息结构,那消息如何设计呢? 例如 Reactor 网络 I/O 线程 和业务线程之间通过队列通信,需要定义消息格式。

  • 高并发服务器,通常都需要写日志。为了防止直接写日志影响性能,如何异步写日志。
  • 为了避免频繁的分配释放内存,通常会使用内存池。内存池如何设计
  • 回源连接,也就是和后端服务器通信的连接。通常会使用连接池来管理,那连接池如何设计。
  • 与客户端方向,与后端服务器方向连接,连接保活如何处理、超时与重试如何设计。
  • 网络io线程收包后,都会将数据投递给业务线程处理,业务线程通常是一种预先分配的线程池。线程池如何设计。
  • 高并发服务器都会自己实现定时器,定时器如何设计呢?
  • 高并发服务器,通常会为每个连接维护一个收发缓冲区,缓冲区的性能,直接影响服务器性能,那缓冲区如何设计呢?这是每个网络库无法绕开的话题。

  • 上下游速度不匹配时,如何解决背压问题,防止服务器内存暴涨。
  • 高并发场景导致 fd 文件描述符耗尽时,该如何降级处理。
  • 客户端 qps 暴涨,服务器如何限频防止被客户端请求打挂;而回到后端服务器的请求暴涨时,回源如何限频,防止后端服务器被击穿
  • 网络上收到的数据包,粘包,半包如何处理
  • 对收到的字节流,codec如何解包,解析为完整的消息;对待发送的字节流,codec如何打包,组装成一条完整的消息
  • 线上出问题时,如何排查网络问题。掌握一些网络命令,是很有帮助的。例如nc、strace、perf、ss,以及用火焰图来定位cpu高负载的热点函数
  • 高并发服务器,会使用epoll,那epoll如何同时处理网络套接字、定时器、管道、信号。网络编程中,专业术语叫做统一事件源。

统一事件源,对于高并发服务器而言,是非常重要的。要让一个程序同时处理网络套接字、定时器、管道、信号等各种事件源,将各种事件源整合起来。这只有在大型项目中才会遇到,实践出来的结果,这种架构在书本上基本上是很少体现的。

  • 用好gdb,也是非常重要的技能。程序coredump时,能从dump文件发现蛛丝马迹
  • 五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
  • 进程间通信方式:信号量、管道、共享内存、socket 等
  • 多线程同步的方式: 自旋锁、读写锁等也是经常会使用
  • 客户端连接后,网关是否也需要为每个客户端到后端都建立一条连接,还是多个客户端可以连接复用,共用一个后端连接。不同应用场景,处理方式也不一样。
  • 客户端连接断开,网关与后端的连接是否也要立即断开。也是要考虑的细节
  • 客户端建连后,立马就发了数据,此时网关还没完成和后端建立连接,网关是否需要先将数据缓存起来。
  • 读取磁盘io数据。为了防止直接读取,阻塞线程。如何异步读取,如何异步写入。
  • 使用dpdk 将内核旁路,dpdk 接管网卡,直接从网卡读取数据,实现报文高速转发。
  • 多线程监听同一个套接字,惊群如何解决。例如多个 Reactor 网络线程,监听同一个套接字,会导致惊群。

  • 收到客户端请求后,如何使得后端服务器负载均衡, 负载均衡算法使用哪种
  • 一个服务器怎么既支持TCP,又支持 UDP。例如 http 服务器,使用的是tcp,但通过dns域名解析,使用的是udp
  • 网络io线程收到不完整的消息,是等接收完整后才投递给业务线程,还是收到多少数据就直接投递给业务线程?这些都是有讲究的。
  • 非阻塞套接字,与后端服务器建立连接时,如何得知是否连接成功

整体上看,一个高并发服务器大概包含这些内容。在你了解了高并发服务器的全貌后,你就知道要学什么内容。后续学习起来才有针对性,不会无头苍蝇乱撞。

这些内容你现在还不知道答案,没关系。在后面网络编程系列文章中,我会图解方式,将这些内容逐一拆解,让你真正的理解网络编程。

学习网络编程,可以做什么项目

可以做的小项目

刚开始学习网络编程,只是对书本上的知识点有所了解。但真要自己写点东西,好像又写不出来。这个时候怎么办呢?

这个时候,可以GitHup, gitee上,找点开源的小项目练练手,模仿着写。注意,这个时候不要追求项目大而全,找几个小型的项目。一方面更容易看懂,另一方面比较有针对性的练习某个知识点。

比如网络聊天室、http 服务器、ftp 服务器、游戏服务器。

读者会想,哪个比较值得阅读的,你直接给我推荐一个,我照着看就行? 因为都是个人写的小项目,肯定没有经过企业级大规模使用与验证,没有哪个好坏。因为小型,花不了多长时间,多挑选不同类型,去分析去模仿。

另外,也可以把你的需求交给AI,让AI 给你生成对应的小项目代码。

一定要动手模仿写一遍。

可以做的大项目

但凡企业级产品,不涉及网络编程的很少, 举几个企业会做的产品:

  • 社交类:你所了解的qq、微信,几千人的团队在搞这个产品。
  • 游戏类:王者荣耀服务器,高并发才能抗住大量玩家同时在线
  • 视频类:抖音、B站直播,这类流媒体服务器,抗住大量直播流量,同时也要保证低延迟
  • 负载均衡:腾讯 GSLB 负载均衡流量调度器,根据服务器负载实时调度,高并发场景下得抗住大量qps请求
  • 高性能4/7网关、作为服务器的入口,同时得看qps与流量请求。 例如腾讯 TGW 网关,作为腾讯内部各个服务器的入口,进行实时的高速转发。

不单单我列出的这些,现在很少单机软件了,每个领域的产品,大部分都离不开网络。因此网络编程可以开发出的软件产品非常多。

大家毕业后从事的行业不同,做的产品不一样,但都会用到通用的网络编程技术,在各自领域发光发热。

学好网络编程,可以从事什么工作

软件开发,涉及的领域非常多。那学好网络编程,可以从事哪些方面的工作呢?

  • 接入网关、CDN:不管是微信还是抖音、B站。必然会使用CDN进行网络加速。作为就近接入的入口,必然要承载高网络流量、高QPS请求数。此时CDN服务器性能的好坏就非常重要了,性能差分分钟容易造成平台雪崩。这一领域,基本上覆盖了网络编程的所有知识点。

举个例子: 以前负责腾讯某个游戏发布、2000多万的客户端并发下载,峰值带宽猛涨到130T。这些流量全部经过CDN。 130T是什么概念,整个互联网规模,大概也就500T左右的带宽。可以想象CDN得具有多高的性能才能抗住。

目前字节、腾讯、阿里、华为等大厂都有CDN团队,人数还不少;快手、B站、小红书等第二梯队、以及网宿、金山等等传统CDN厂商,都属于这个领域的佼佼者。占据互联网流量的半壁江山。

  • 云网络转发平台。像腾讯云、阿里云等大家比较熟悉,云网络对网络编程的要求更高,不仅涉及7层的网络知识、还涉及4层的dpdk高性能网络转发平台
  • 网络安全领域: 涉及防火墙,上网行为管理、应用识别、4/7层负载均衡,都和网络编程强相关。深信服、锐捷、360、华为、华三是这个行业的头部企业。
  • 协议栈开发: 很多领域,都会对内核协议栈进行定制化开发。例如对流量控制与拥塞控制进行优化。典型使用场景就是嵌入式、物联网了。
  • 路由交换: 路由器交换机开发,也会涉及非常多网络编程相关的知识。不要小瞧这个领域,作为互联网高速公路的基础设施,很多企业都在做,岗位也不少。
  • 业务开发: 不少也会涉及到网络编程知识,例如游戏领域,游戏服务器必然也涉及到网络编程。虽然很多都是使用网络库,在网络库基础上开发业务逻辑,但也会涉及到网络编程。

总体来说,学好网络编程,可以从事这些领域,当然远不止这些。 毫不夸奖的说,如果对网络编程研究得比较深入,那任何岗位都能胜任。因为每个领域的开发岗位,或多或少都离不开网络编程。

如何学习 linux 网络编程

这是大家都关心的问题。我们就来聊聊作为一个初学者,如何才能学好网络编程。个人认为,学好网络编程,需要经过7个阶段。

1、首先、你得知道网络编程的全貌,知道网络编程包含哪些内容。如果这个不清楚,只是跟着书本,一遍遍看,那会只见树木不见森林。我们得站在更好的维度,俯视网络编程的全貌。前面我们已经详细介绍了网络编程涉及的核心知识,就是为了让大家有一个全局的视野,针对性的去学习,而不是一上来就啃书本。

2、知道了网络编程的全貌后,接下来是补足基础的网络知识。网络编程的书籍也非常多,是不是要全部都啃完。 千万不要这么做,那会让你走很多弯路。可以分阶段进行。 这个阶段只需把unix网络编程卷1/2整体过一遍,对原理有一定的认识就行。剩下的经典书籍,等看了一些开源的网络库后,再补。

3、在有了基础的网络知识后,接下来就是找小项目动手练习了。找开源的小项目练练手,把原理性的知识,落实到具体的实践中来,加深对网络编程的了解。注意: 这个阶段是找小的项目,不要一上来就追求大而全,你 hold 不住。另外,一定要跟着实践,看懂后,把代码亲自敲一遍。网络是实操性极强的知识,光学原理而不写代码,基本上等于白学,一段时间后就忘记了。

4、接下来就是看网络库的实现了,了解生产级别网络库是怎么写的。可以在GitHup上找网络库的代码,将网络库源码理解透彻。libevent和muduo都可以,有时间都看看。推荐muduo,看下这个网络库的实现,是reactor网络模型的代表。代码也比较简洁,一个月基本上能看懂。

在看懂后,一定要模仿着自己从头写一遍。这个时候你会发现,看和自己写,思考完全是不一样的,写出来,要考虑的细节会更多。

当你手写了一遍网络库,这个时候,你会发现自己对网络编程的理解就不一样了。有了基础,有了实践,你自然知道接下来该如何继续提升网络编程的能力。

5、在对全貌有初步了解后,这个时候你会发现网络编程的基础知识还是有所欠缺。这个时候再回过头来,把网络编程那些经典的书籍一一去啃完,把基础打牢。手写网络库的过程中,肯定会遇到某些基础知识不了解的,这个阶段就是补足它的时候。在这个阶段,就可以将经典书籍啃完。实践后再去啃书籍,理解会更加深刻,因为网络编程从来都是实践出真知。

6、到这个阶段,多找几个大型的开源项目,去分析它的源码。这个时候,你网络编程的能力已经超过了一大批人。很多人都还只会那几个套接字api,让它写一个epoll网络模型都写不出来。

为什么要多看几个大型的开源项目,去分析它的源码呢?

  • 一方面,不同开源项目对网络编程的实现有差异,加深你对网络编程的了解。看完几个大型的开源项目后,你会有原来不过如此的感叹;
  • 另一方面网络编程的知识点非常多,每个开源项目只会实现其中一部分,多看几个,整体就比较全面了。
  • 大型的开源项目,不再只是网络库的实现。大型项目使用网络库,在这基础上叠加非常多功能,搭建出一个高并发服务器。这才是最终生产级别的产品。你可以了解高并发服务器开发涉及的所有知识点。

这个阶段,我推荐3个大型的开源项目。

  • nginx 这个高并发服务器,里面基本上涉及了网络编程的知识。把它啃下来,网络编程你可以横着走。
  • 云风的skynet、了解游戏框架的设计,这个也能学到非常多的网络编程知识。
  • 最后看看sogou开源的workflow异步网络框架。类似 proactor 风格,现在很多高性能服务器都在异步化了,很值得学习。

把这 3 个开源项目啃下来,真正看懂它是怎么做的、为什么这么做、如果让自己来写,会怎么做。那你对网络编程的理解,面试可以随便问。

当然这几个啃下来,基本上都要花大半年的时间,但我认为值得,让你有一技之长。

看不懂源码怎么办?

大型项目,源码至少几万行,看不懂怎么办? 现在不像我之前那个年代了,资源匮乏。

现在每个大型开源项目,前辈进行了深入研究,也有不少源码分析的文章可以参考。

另一方面,现在是AI 时代,不懂的地方,完全可以让AI给你分析,这可以解决你很多的障碍。

也不能只看而不实践,一定要把环境部署起来,运行起来。加日志、gdb调试看效果,加深理解。只看不动,效果会大打折扣。

要相信代码是人写的,就不可能脱离人类的思维,肯定是为了解决某种场景的。因此要相信,一定是可以理解透彻的,时间长短问题。

7、亲自动手,手写一个大型高并发服务器。理论补足了,也看了多个大的开源项目。接下来就是该你动手的时候,写一个大型的高并发服务器。如果你还是学生,把它做好,当做面试时的重点项目。

以nginx为例,你可以模仿,然后手写一个大型的http服务器。nginx 并没有涉及高并发所有知识点。 此时你可以完善,并将高并发所需要的知识,全部应用上。

当你自己写出一个,那对高并发服务器,你了然于胸。

写不出怎么办, 你可以借助AI,让AI当做你的工具,写出来给你参考,然后亲自写。

这需要花费几个月的时间,但亲自写一个大型的高并发服务器,还是很有必要的。网络编程本身是实践极强的学科,如果只学习理论知识,记不牢的,一段时间后就忘记了,忘记了又接着学,周而复始。

光说不练假把戏,一定要动手实践

真写出一个大型的项目后,一劳永逸,网络编程知识将永久刻在你大脑里,忘不了。

等你工作的时候,你看任何网络相关代码你都得心应手,拉开和同龄人的差距。 我们不需要什么都懂,只要有一个方向你比别人钻研更深,你就比其他人更有优势,然后滚雪球般,越走越远。

开源网络编程项目

源码之前,了无秘密。学习网络编程,不学习优秀的开源项目,很难有所突破。 看看别人怎么写的,为什么这么写、自己项目开发过程中,是否可以借助优秀开源项目框架的设计思想。

推荐几个网络编程中,比较好的开源项目:

  • muduo、libevent 这两个网络库可以看看,看完你大体知道网络库框架如何搭建。
  • nginx 这个http服务器,实现了网络库的所有内容,并在这基础上实现了一个真正可用的高并发服务器,而不仅仅是一个lib网络库。你从中可以学习到内存池、epoll、连接池如何设计。
  • sogou开源的workflow,是一个异步机制的网络框架,类似proactor,从中可以学到异步编程。现在异步编程,很多企业级都在推,像腾讯的CDN,完全是异步的
  • 云风的skynet、了解游戏框架的设计,这个也能学到非常多的网络编程知识。
  • dpdk 这是 Intel开源的高性能网络框架。是企业级标杆产品。不管是腾讯云、还是网络安全领域,绝对离不开dpdk。这套框架,将内存池、无锁队列、共享内存等性能玩到极致。如果是对云网络方向感兴趣,那真得研究研究。

没有机会从事网络编程工作,怎么办?

大家花了很多时间在网络编程的学习上,但往往事与愿违,就是无法找到一个和网络编程相关的岗位。

在这种大环境下,能有个工作就不错了。当你找了很久都没找到自己喜欢的岗位,那就先挑一个保底的入职吧,先养活自己再说。

  • 在工作中,多和leader沟通,了解项目的规划,时间长了,总有机会的。一旦有相关网络编程相关的任务,毛遂自荐抢着干,先入行再说。入行后,你后面再找其他工作,就有这方面的经验,可以作为下一份工作的踏板。当然,前提是打铁还得自身硬,让人交给你放心。
  • 现在的环境,都是在本行业挑选有经验的从业者。你没有相关领域经验,可以先工作,然后业余时间分析业界比较有名的大型网络编程开源项目源码,把它作为突破点。

在面试的时候,重点引导面试官和你聊聊你对开源项目的理解。这也是一种出路。尤其开源软件涉及的内容和岗位相关的,优势就很明显了,机会也就来了。

虽然比别人慢一点,晚了一点才进入这个行业,走了些弯路。但曲线救国,最终你还是找到自己喜欢的工作就行。

  • 工作过程中,多和同事、同学、朋友、猎头联络感情。借助它们的渠道给你内推。

如果采用各种途径,还是没能找到自己想要的岗位,那就随缘吧。很多时候越过山丘,无人等待。求而不得,我们也没法把控。

那就在你当前的岗位继续深耕,干一行爱一行,只要能在这个岗位上做到前30%, 你照样超过了很多同龄人。

不管做什么岗位的工作,感兴趣还是不感兴趣,最终的目的是赚钱,养家糊口

网络编程书籍

网络编程相关书籍,经典的无外乎那么几本。

  • unix网络编程卷1/2
  • unix 环境高级编程
  • tcp / ip 详解
  • 深入理解 linux 网络
  • linux 程序设计

网络编程学习资源推荐

网络编程博文

不知各位有没这种感觉,花了很多时间去查找文章,但读下来都是泛泛而谈的水文,网上能搜到的内容讲了一大堆,而重要的干货却一笔带过,让人有骂娘的冲动,浪费了很多时间。

自己淋过雨,总想给别人撑把伞。决定自己来写网络编程系列文章。希望对新人能有所帮助,少走一些弯路。

我会将这十几年工作中积累的高并发服务器开发经验, 以及高并发服务器所涉及的 linux 网络编程的知识点,图解的方式,逐一拆解,让小白也能看懂。

我希望各位看到的是真正高并发服务器系统性的知识,而不是泛泛而谈的水文。我能做的就是尽我所能,站在读者的角度,用心把高并发服务器的经验写出来,对得起各位的时间。

白天还要上班,时间有限制,每周只能更新一篇文章了。

这些文章会同步更新到微信公众号、个人博客,以及csdn博客。感兴趣可以关注。

  • 微信公众号:

高并发成长记

  • 个人博客地址:

https://www.yudongtc.com/

  • csdn 博客:

https://blog.csdn.net/apelife/category_9036947.html

学习网络编程,没人带你,无法抱大腿, 怎么解决呢?

一方面,可以跟着公众号里的文章,系统性的学习网络编程。一段时间后,你对网络编程将不再那么畏惧。

另一方面,看读者是否需要。如果需要,我可以建一个微信交流群,大家有问题,可以在群里及时得到解答。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询