[导读]什么是网络编程?用一句话概括,就是对网络协议的落地。 落地,意味着对实战的要求更高。所以,一些朋友更喜欢用类似Netty这种封装好的框架——快速,高效。确实,跟开发细节相比,我们常常更看重开发效率。 可日常的项目里,我们也不得不面对极端的网络性能考验。没人喜欢堵车,但应对大量请求...
什么是网络编程?用一句话概括,就是对网络协议的落地。
落地,意味着对实战的要求更高。所以,一些朋友更喜欢用类似 Netty 这种封装好的框架——快速,高效。确实,跟开发细节相比,我们常常更看重开发效率。
可日常的项目里,我们也不得不面对极端的网络性能考验。没人喜欢堵车,但应对大量请求时,如果网络性能处理不佳,数据、业务就会面临大塞车。
举个正向的例子,之前在绿盟有个信息安全产品,叫黑洞,是当时市场上最成功的 DDOS 过滤设备。这玩意最大的技术难点就在于:当攻击报文洪水到达时,每秒要过滤掉几十万攻击请求。在那之前,我从没想过通过程序代码,对网络报文的处理效率,竟然能达到如此强悍的地步。
早些年尚且如此,更别提如今的 5G 时代了。用户大幅度提升的平均网络传输速度,正对我们提出高性能网络编程的要求:不仅要解决诸如提高吞吐量和并发性等问题,还得处理各种棘手异常,比如保证千万个连接的正常运行等等。
这些,显然不是一两个框架就能搞定的。
可惜的是,我面试过的不少候选人都没有意识到这点,哪怕他们已经工作多年,在网络协议和网络编程这块依旧不是很上心,对其的理解也还停留在一个比较浅的层次上,比如:
• 大家经常说的四层、七层,分别指的是什么?
• TCP 三次握手是什么,TIME_WAIT 是怎么发生的?CLOSE_WAIT 又是什么状态?
• Linux 下的 epoll 解决的是什么问题?如何使用 epoll 写出高性能的网络程序?
• 什么是网络事件驱动模型?Reactor 模式又是什么?
其实,无论在面试还是工作中,网络性能及优化这方面的知识都是非常重要的基本功。在我看来,想做到高性能网络编程,下面两个核心要点永远都绕不开:
第一,在理解网络协议的基础上,充分利用操作系统内核提供的能力,感知各种网络 I/O 事件;第二,学会使用线程处理并发。抓住这两点,就抓住了高性能网络编程的“七寸”。
分享给你一张网络编程的核心知识图谱,将上述两个核心会涉及到的知识点都囊括在内,只要我们仔细梳理、透彻理解这些核心知识点,就能学以致用地解决工作中的实际问题。
这张图谱出自盛延敏的《网络编程实战》专栏。其实我觉得他这名字起得太朴素了。要我的话,就叫:高性能网络编程,因为整个专栏都是围绕「高性能」展开的。
但话又说回来,高性能就建立在那些实打实的经验基础上,所以现在这个也算简洁有力。内容同样是单刀直入展开,比如在讲解某个理论或算法时,与代码、实验相关联,分析它提出的目的、解决了哪些问题。
说白了,就是从解决实际问题的角度切入,讲解知识点,让你透彻理解协议、API 和代码。学完就能用得上,这点挺不错的,值得推荐给你。
秒杀 专属口令「happy2021」立省 ¥40
到手仅 ¥89,仅限 50 个名额
盛延敏,前大众点评云平台首席架构师,现就职于某大型金融服务公司(很好猜但人家不让说),专注云计算的架构和开发工作。
他博士毕业于中科大,毕业后加入 IBM,从事 WebSphere 应用服务器、PaaS 平台 Bluemix 等系统的开发工作。后任职大众点评,推动了以Docker为核心的私有云建设和落地。
2000 年起,他开始用网络编程框架 ACE、CORBA 等进行电信网管系统的开发,后来接触了 ICE,写分布式控制系统。再之后转向 Java,使用 JDK 进行 Web Service 和应用服务器的网络开发和研究,使用 Netty 进行 Java 高性能网络编程的开发。这些工作经历,让他对网络编程有了极为深入的理解。
网络编程是个重实战的模块。我在学网络编程的那会,就掉进了坑里,老是想面面俱到,但奈何头绪太多,一直钻牛角尖,过分关注知识点本身,片面地斩断了它们与实际工作的联系。
而在这个专栏里,盛哥真正做到了讲练结合,从底层原理讲起,逐步聚焦到高性能编程上,讲解了常见异常和性能问题,并手把手带你编写一个高性能 HTTP 服务器。
专栏主要分三大层级,逐步递进:
第一,充分理解 TCP/IP 网络模型和协议。
前部分会带你梳理 TCP/IP 模型和网络函数接口之间的联系,通过实例展开对套接字、套接字缓冲区、拥塞控制、数据包和数据流、本地套接字(UNIX 域套接字)等的讨论,交付给你一个全面细致的知识体系。
第二,结合对协议的理解,增强对各种异常情况的处理能力。
比如,对 TCP 数据流的处理、半关闭的连接、TCP 连接有效性的侦测、处理各种异常情况等,这些问题决定了程序的健壮性。这一部分的内容,将在提升篇中详细展开。
第三,写出可支持大规模高并发的网络处理程序。
性能篇和实战篇,将会带你深入研究 C10K 问题,引入进程、线程、多路复用、非阻塞、异步、事件驱动等现代高性能网络编程所需要的技术,结合实例上手操作,教你写出高性能的网络程序。
具体每部分内容,来看目录。
别光我说,还收集了一些其他人的评价,供你参考。
盛哥用荀子那句“不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。”来诠释学习网络编程的最佳方法,太文艺了,要我说的话:学就完了。
学透了,就要去用,对专栏里的代码进行修改和调试,进一步加深理解。把这些内容吃下去,消化掉,从底层到实战,用科学的方法才能快速且透彻地理解高性能网络编程。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
大家好,我是小林。不知道大家当初是怎么学网络编程的?我来说说我踩过的坑。我当初在学网络编程的时候,看见网上的人都说《Unix网络编程》是网络编程圣经,豆瓣评分也很高,那么好学的小林,那肯定毫无犹豫买了。书到货后,我瞬间就...
关键字:
网络编程
什么是网络编程?用一句话概括,就是对网络协议的落地。 落地,意味着对实战的要求更高。所以,一些朋友更喜欢用类似Netty这种封装好的框架——快速,高效。确实,跟开发细节相比,我们常常更看重开发效率。 可日常的项目里,我们...
关键字:
网络编程
什么是网络编程?用一句话概括,就是对网络协议的落地。 落地,意味着对实战的要求更高。所以,一些朋友更喜欢用类似Netty这种封装好的框架——快速,高效。确实,跟开发细节相比,我们常常更看重开发效率。 可日常的项目里,我们...
关键字:
网络编程
在嵌入式行业网络编程使用相对较少,主流应用集中在NB-IOT、Lora、Mqtt这一块,原理上一般是通过加入硬件模块或者是使用第三方SDK来实现。
关键字:
网络编程
嵌入式
tcp
五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。
关键字:
嵌入式
网络编程
进行程序开发的同学,无论Web前端开发、Web后端开发,还是搜索引擎和大数据,几乎所有的开发领域都会涉及到网络编程。比如我们进行Web服务端开发,除了Web协议本身依赖网络外,通常还需要连接数据
关键字:
网络编程
数据包
TCP协议
CLIENT
【1】Winsock2 服务提供者接口(SPI):一、简述:1、一般用于提供给操作系统开发商、传输堆栈商在基础协议的基础上,开发更高级的服务.2、因为Winsock服务体系符合Windows开放服务体
关键字:
spi
网络编程
============================
1. IP地址
IP地址,就是每一个接入互联网的主机的唯一身份标识,IP地址
0-255组成的,分成了4段,每段0-255
IP地
关键字:
java
基础知识
网络编程
【1】工具介绍:用到的工具:VS2015
语言:C/C++
需要系统提供的动态链接库:1、 sporder.dll //很多系统不自带着个dll,导致编译时缺少dll无法编译. (发布时必须将此
关键字:
c++
网络编程
lsp
一、基本socket()函数 Linux系统是通过提供套接字(socket)来进行网络编程的。网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符。socket也有一个类
关键字:
Linux
网络编程
通信
首先要说讲述计算机网络和TCP/IP的书很多。 先要学习网络知识才谈得上编程讲述计算机网络的最经典的当属Andrew S.Tanenbaum的《计算机网络》第五版,这本书难易适中。《计算机网络(第5版
关键字:
Linux
网络编程
领测软件测试网 Linux下的网络编程分为两部分:服务器编程和客户机编程。一般服务器程序在接收客户机连接请求之前,都要创建一个守护进程。守护进程是linux/Unix编程中一个非常重要的概念,因为在创
关键字:
C语言
Linux
网络编程
同步服务端也是相当简单的。它只需要两个线程,一个负责监听新的客户端连接,另外一个负责处理已经存在的客户端请求。它不能使用单线程,因为等待新的客户端连接是一个阻塞操作(因为accept()
关键字:
c++
tcp
网络编程
同步服务端
POP3例子编程软件:VS2015
语言:C/C++
这里主要讲解POP3邮箱收信POP3协议的概述:一、简述:1、功能:用于邮件的接收.2、采用客户端与服务器对话工作模式,命令由ASCII码表示.(
关键字:
网络编程
pop3协议
邮箱收信
在Linux中的网络编程是通过socket接口来进行的。人们常说的socket是一种特殊的I/O接口,它也是一种文件描述符。socket是一种常用的进程之间通信机制,通过它不仅能实现本地机器上的进程之间的通信,而且通过网...
关键字:
socket
基础教程
嵌入式linux
操作系统
网络编程
在Linux中的网络编程是通过socket接口来进行的。是一种文件描述符。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输
关键字:
嵌入式
嵌入式开发
技巧
网络编程
Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序。以下是本人在学习中的总结与归纳。1. HttpURLConnection接口首先需要明确的是,Http通信中的...
关键字:
Android
网络编程
通信
GE