盈彩体育注册(中国)有限公司
盈彩体育注册(中国)有限公司 您所在的位置:网站首页 盈彩体育注册(中国)有限公司 计算机网络该怎么学?

计算机网络该怎么学?

2024-05-04 22:11:26| 来源: 网络整理

我觉得咱们国内的学生也好,已经工作了工程师也罢。在网络这门课的学习体系中存在两个大问题:第一个是对实践的重视程度不够。第二是对实现的重视程度不够。我分开展开了和大家聊聊~

一、对实践的重视程度不够

俗话说的号,纸上得来终觉浅,绝知此事要躬行。计算机科学与技术这个专业在本科阶段来说,技术的占比是远远要高于科学占比的。那对于一门技术来讲,动手就是非常非常重要的。

而我们国内的教学模式太过于偏重理论了,所以很多人都会觉得网络技术这门课太抽象了。这不是学生的问题,而是教育方法的缺陷。你应该也没听说过有哪门技术是光看书就能看会的。

根据美国学者艾德加·戴尔1946年发现的金字塔学习理论,见下图。传统的理性性的学习如学习和听讲对知识的吸收率只有 10% 左右,而动手实践对知识的吸收率能达到 75% 以上。从效率上来讲,通过实践的方式进行学习的效率对理论学习的 7 -8 倍。

我觉得正确的学习方法应该是边学理论边动手实践。动手包括两类方法,一类是用一些命令行工具进行观测,另外一类就是用 socket 来写程序。

我建议首先要准备一台 Linux 电脑。在 Linux 下有很多成熟的网络相关的工具可供你使用。现在国内的互联网公司的服务器基本上也都是 Linux。而且用 Linux 有个好处就是源码是公开的。实在遇到不懂的问题,可以更容易地搜答案。这点比 Windows 强太多了。

对于第一类动手观测法,我的建议是你学到某一层的时候,就找到一些相关的工具来做几个实验。比如讲到 TCP 的时候,你可以启动一个 Nginx(或者干脆自己写一个 Server),用 curl 等工具发起 TCP 连接建立请求。这时候用 tcpdump 动手进行抓包,看看三次握手究竟是怎么握的。 看看每次握手的时候,包体究竟是长什么样的。

我把 linux 下常用的各种网络工具简单整理几个,各位有需要可以保存下来。

第二类方法就是动手编程。刚开始可以从一些简单的开始,比如就写个 tcp server, tcp client 让他们相互连接然后传输一些简单的数据。

然后可以开始练一些更为复杂一点的。比如写一套 FTP Server 和 Client, 让它们之间能够实现简单的文件下载。或者写一个 Web Server,支持通过浏览器来下载 Web Server 上的静态文件。再比如说模拟 tcpdump 来写一个抓包工具。(可以参考我的这篇文章,里面提供了一个简单的 demo)。

做完这些相信你对网络的理解会前进一大步。对于我个人来讲,我也是一直通过理论 + 实践的方法来对知识进行学习的,效果很好。

比如我在网络中,我想弄懂一条空的 TCP 连接消耗多大的内存。我自己在工作之余抽了好长时间去翻内核源码,然后动手做实验。当实验完成的时候,我对 TCP 连接的内存开销的理解就非常的深了。

漫画 | 花了七天时间测试,我彻底搞明白了 TCP 的这些内存开销!

我一直想弄清楚一台服务器在实际中最大能支撑多少条 TCP 连接,我也是通过动手实验的方法来学习的,当时我前前后后至少花了半个多月。参见:

漫画 | 一台Linux服务器最多能支撑多少个TCP连接漫画 | 理解了TCP连接的实现以后,客户端的并发也爆发了!

如果你也想玩玩,直接用我这篇文章里提供的源码就好。

百看不如一练,动手测试单机百万连接的保姆级教程!

如果你能能坚持通过这两种动手方法来学习,相信你的网络技术水平一定会远远超过你其他的同学。

二、对实现的重视程度不够

翻开任何一本计算机网络相关的教材大部分都是在讲协议(首先声明一下,我不反对理解这些基础的协议是挺重要的),那么协议具体是咋实现的,没人给讲过。

我们的日常开发都是基于操作系统在协议的实现基础上来进行工作的。对实现理解不到位会导致很多线上问题或者是性能优化都无从下手。

比如大家都知道了再服务器先 listen 一下,然后 accpet 接收连接请求。但是,到底为啥要 listen 之后才能 accept,似乎没有人和我们说过。不理解这个的话,就对全连接队列半连接队列理解不深,遇到问题就不好处理。

再比如说,现在的互联网大部分都是通过 TCP 连接来工作的,那么一台机器最多能撑多少个 TCP 连接?按道理说,整个业界都在讲高并发,这应该算是很入门的一个问题了。但当年我产生这个疑问的时候,却在 Google 上搜了个遍也没找到令我满意的答案。

再比如一个网络包是如何从网卡到达你的进程里的?这个问题表面上看起来简单,但事实上很多性能优化方案都和这个接收过程有关,能不能深度理解这个过程决定了你在网络性能上有多少的优化措施可用。例如多队列网卡的优化方案是在硬中断这一步开始将工作分散在多个 CPU 核上,进而提升性能的。我几年前想把这个问题彻底搞搞清楚,搜遍了互联网,翻遍了各种经典书都没能找到想要的答案。

还比如为啥 TCP 握手耗时过长,一条 TCP 连接会消耗多大的内存。同步阻塞网络 IO 为啥就性能慢了,为啥 epoll 用上了以后就要性能高很多。这些和工程实践相关的问题光知道网络协议理论是任何用都没有的,都是应该建立在对网络实现的深刻理解上才能更好地应对

针对这个问题,我个人做了一些努力,在实现层面把网络都扒了一遍。

例如,为什么服务端程序都需要先 listen 一下?事实上是因为服务器在接收客户端连接之前,提前准备了半连接和全连接两个队列。一个用于保存第一次握手请求,另一个用于保存第三次握手。客户端呢是在 connect 发起前,在内核里选择好端口号的。参见这几篇文章

为什么服务端程序都需要先 listen 一下?TCP连接中客户端的端口号是如何确定的?能将三次握手理解到这个深度,面试官拍案叫绝!

另外,一个网络包是如何被接收和被发送的,我也写了几篇文章。

图解Linux网络包接收过程25 张图,一万字,拆解 Linux 网络包发送过程127.0.0.1 之本机网络通信过程知多少 ?!

如果对我上面这些文章的深度网络知识感兴趣,可以直接下载我打包好的 PDF 或者关注我的公众号「开发内功修炼」

传送门:《理解了实现再谈网络性能》电子书发布啦!

也可以看 Github:https://github.com/yanfeizhang/coder-kung-fu ​

最后,祝大家早日攻克网络难关,也别忘了点个赞再走!



【本文地址】 转载请注明 

最新文章

推荐文章

CopyRight 2018-2019 盈彩体育注册(中国)有限公司 版权所有 豫ICP备16040606号-1