ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

如何学习 Linux 网络编程 一文讲透

如何学习 Linux 网络编程 一文讲透 为什么要学习网络编程在日常的工作中绝大部分人从事的工作都是业务开发。直接使用网络库来搭建一个服务器涉及到网络编程并不多。那为什么还要学习网络编程呢学习网络编程让我们在排查网络问题时得心应手 当线上遇到问题如果了解网络编程会多一个排查问题的思路加快问题的解决。职场上拉开与同龄人的差距: 对于和网络编程相关的岗位越了解网络编程越能拉开同年龄人之间的差距。举个例子: 在腾讯的时候我们 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/2unix 环境高级编程tcp / ip 详解深入理解 linux 网络linux 程序设计网络编程学习资源推荐网络编程博文不知各位有没这种感觉花了很多时间去查找文章但读下来都是泛泛而谈的水文网上能搜到的内容讲了一大堆而重要的干货却一笔带过让人有骂娘的冲动浪费了很多时间。自己淋过雨总想给别人撑把伞。决定自己来写网络编程系列文章。希望对新人能有所帮助少走一些弯路。我会将这十几年工作中积累的高并发服务器开发经验 以及高并发服务器所涉及的 linux 网络编程的知识点图解的方式逐一拆解让小白也能看懂。我希望各位看到的是真正高并发服务器系统性的知识而不是泛泛而谈的水文。我能做的就是尽我所能站在读者的角度用心把高并发服务器的经验写出来对得起各位的时间。白天还要上班时间有限制每周只能更新一篇文章了。这些文章会同步更新到微信公众号、个人博客以及csdn博客。感兴趣可以关注。微信公众号:高并发成长记个人博客地址:https://www.yudongtc.com/csdn 博客:https://blog.csdn.net/apelife/category_9036947.html学习网络编程没人带你无法抱大腿, 怎么解决呢一方面可以跟着公众号里的文章系统性的学习网络编程。一段时间后你对网络编程将不再那么畏惧。另一方面看读者是否需要。如果需要我可以建一个微信交流群大家有问题可以在群里及时得到解答。
返回列表