原始语句
作者:黄
请在文章开头注明出处和作者。
这篇文章的思维导图
简介
上一期我讲了如何学习数据结构。当时我的学习方法是先看视频,再看书,然后刷基础算法题进行巩固。
作为一个非学科考研党,当时感觉这条学习路线还是比较顺利的。毕竟,它能让我学得更快。这个课程比较简单。
所以,我在读研的时候,打算用同样的方法补上其他几门计算机基础课,第一门就是计算机网络。
因为这门课真的很重要,几乎是面试必问的部分。什么TCP/IP三次握手,四波,TCP和UDP的区别,HTTP协议的一堆面试问题,都是程序员面试中很常见的问题。你也应该深有体会。
计算机网络中的复杂概念远不止这些,所以按照老规矩,我们先来看看什么是计算机网络。
根据百科介绍,计算机网络是指通过通信线路将位于不同地理位置的多台具有独立功能的计算机及其外部设备连接起来,在网络操作系统、网络管理软件和网络通信协议的管理和协调下,实现资源共享和信息传输的计算机系统。
相对于数据结构的介绍,百科中对计算机网络的介绍更容易理解。简单来说,计算机网络就是通过通信线路将计算机连接起来,实现网络互联和信息传输。
为什么要学计算机网络?
在这个时代,没有网络是根本无法生存的,我们所学的编程知识离开了网络也就无从谈起。毕竟没有哪种编程语言只支持单机操作。
作为一名编程学习者,当你在学习一门语言时,比如Java,你可能会学到一些基本的语法、面向对象的基础知识、set类的使用,甚至多线程、IO流和异常处理。这个时候,你往往意识不到计算机网络的重要性。反正我写代码不涉及网络传输,平时的工作也只是CRUD。没有学计算机网络的地方。
曾几何时,我也是这么想的,但是后来,我接触到了Tomcat,Nginx,Java中的网络编程技术,比如BIO,NIO,甚至netty这种网络编程框架。看这些没有计算机网络基础的东西,肯定会让你怀疑人生。
当我第一次意识到自己的计算机网络基础比较薄弱的时候,是在学习docker容器的时候接触到了docker的网络原理。比如docker的网络模式有桥接和主机,但我当时基本看不懂是什么。
同样,我在学习OpenStack的时候,也无法理解里面的网络组件是干什么用的。
即使不学网络编程、虚拟化、容器调度,也要学会如何配置自己的家ip地址、DNS、子网掩码。在我认真学习计算机网络之前,我甚至对这些东西一脸懵逼。
我不懂计算机网络。我学编程真的太难了!
如何学习计算机网络
初亏
我本科的时候,我们有一门选修课,就是计算机网络,但我当时没有选。
读研的时候就开始疯狂补计算机基础。当时选择了自己的第一本书《计算机网络》作为入门教材。现在想来,当时真的是年少无知,可以看看推荐名单。
这本书作为大学通用教材,历史悠久,内容枯燥,在那么多计算机网络书籍中排名靠前。我都快忘了当时是怎么完成这本书的了。
这本书虽然还没到大书的水平,但是里面的内容对初学者真的不太友好。全书充斥着不易理解的概念栈和概念介绍。
众所周知,教科书大多已经过时了。虽然计算机网络这几年变化不大,但是里面的一些教学方法确实跟不上时代了。
这本书我只记得,看了一个星期就全忘了。记不清当初学了什么,是笔试面试还是复试。这真的是一本很棒的书。
学习阶段
在饱受课本丢失之苦后,我终于学会了寻找书单。当时除了买了一堆Java的书,还特意买了一本TCP/IP Volume I和图文并茂的HTTP,准备开始第二轮的计算机网络猛攻。
当时我也投了一些简历,准备了一些面试,刷了一些面试问题,其中遇到计算机网络的概率很大,所以每天花一些时间看两本书。
不知道是不是理解能力有问题。当我读到备受推崇的计算机网络书籍《TCP/IP第一卷详解》的时候,我居然感觉自己又在读原版教材了。这部大部头好像在讲一堆复杂的概念,用一些很难的解释来解释这些概念。
当时我的自信心有点受挫。计算机网络真的那么难吗?为什么我还是看不懂这本书?
现在看来,计算机网络确实是一门纯理论课程。除了一些网络抓包,用开发者工具检查网络请求,基本没什么可练的。现在很多书都是从网络抓包开始讲解计算机网络,这其实是一种很好的新的学习方法。
一本书是否适合一个人,真的是因人而异。尤其是这类专业技术书籍,不同层次的人阅读效果会有很大差异。所以,可以参考一些网上的书单,但不要盲目推崇。在你自己了解他们之前,说他们好还不晚。
于是第二次进入计算机网络失败。看完TCP/IP第一卷,过了一个月又忘了。
强化学习阶段
俗话说,只有三两本选书让我失望,我心都碎了。虽然我在面试的时候通过背一些常见的计算机网络面试题目就能蒙混过关,但是真正遇到比较复杂的问题的时候,只能望洋兴叹,说不出个所以然来。
学好计算机网络的关键是理解它。我在网上搜了很多内容,看到了一本叫《计算机网络:自上而下》的书,也有人称赞。原因是这本书从应用层开始,一直到物理层,似乎更符合人脑的学习和思维方式。
我一直很勤快的买书。当时我正在练习,所以这本书成了我日常练习的必读书目。
因为组里的项目都是做容器和私有云的,不了解互联网计算机网络看着简直是找死,更别说存储、调度、微服务这些技术了。
这本书真的给了我全新的观感。本书开篇就说了,计算机网络将以一种全新的方式引入,首先是应用层,然后是传输层、网络层、链路层、物理层。
自顶向下和自顶向下的区别是什么?按照自上而下的思路,我们首先接触的是应用层,也就是HTTP、DNS、FTP、POP等常见的协议。这层协议是我们平时用的,书上说的都是接地气的,所以我很快就接受了应用层的介绍。
按照这个思路,书中继续讲传输层,也就是我们常见的TCP和UDP。应用层使用域名或IP+端口定位机器,传输层将应用层的数据切片,有序传输,保证可靠性。
也就是说,TCP消息封装了应用层消息。接下来,是网络层。网络层通过IP路由,目的是找到对应的终端机,所以网络层的数据报要包装传输层的数据报。
接下来,虽然网络层解决了路由问题,但是局域网内的网络交换是通过mac地址来寻址的,所以数据链路层起了作用,因为它是通过mac地址来定位目标机的,所以数据链路层的数据报包裹了网络层的数据报。
在最后的物理层,数据传输的本质仍然是0和1的电信号,自然需要通过物理介质来传输。当然,物理介质除了常见的网线、光纤之外,还包括电磁波。
我梳理了一下整个计算机网络的脉络,所以总体来说,按照自上而下的思路学习计算机网络,对初学者来说还是比较友好的。
远非如此。
看了《计算机网络:自上而下》,虽然对整个网络的结构和脉络有了一个大概的了解,但对很多实现细节还是略知一二,比如HTTP和TCP报文的结构,还有一些不太容易理解的概念,比如路由算法、IP广播和组播、NAT技术、VPN技术等。如果不懂这些,总觉得自己还缺很多东西。
后来开始尝试面试一些大厂,发现自己还是有不小的差距。比如头条、腾讯等公司,尤其是腾讯,对计算机网络的调查特别严格。
比如三次握手,四次挥手的常见问题一般会引申,比如为什么三次握手,四次挥手,如果没有三次握手或者没有第四次挥手会怎么样。
比如TCP协议的作用是什么,它是如何保证可靠传输的?这个时候你要知道TCP保证可靠传输的机制,比如滑动窗口、超时重传、包确认等原理,这些你都需要能够解释清楚。
比如还有一种常见的调查方式,就是让你把自己从域名访问到得到返回结果的过程中经历的事情说清楚。对于这样一个开放性的问题,你要尽可能多的讲,先讲DNS解析,再讲TCP三次握手,然后介绍IP数据报的网络路由,以及数据链路层在局域网中的作用,甚至还要介绍物理层。
总之,你知道的越多,越详细,你回答这些问题的机会就越大。我每次都会详细的把整个过程说出来,这样面试的时候就不会给自己留坑了。
对了,在学习计算机网络的路上,还有一个重要的学习资源帮助了我,那就是刘鑫老师的《码农翻身》这本书。当时也是偶尔在网上看到的。
起初,刘鑫先生只是写文章,后来他把它们汇编成一本书。对于计算机网络部分,本书通过讲故事的方式介绍了大量的计算机网络知识,讲解了一些复杂的计算机网络概念,如NAT、网络隧道、VPN等。
虽然这本书没有包含太多关于计算机网络的信息,但它确实有助于加深对计算机网络一些概念的理解。
写了这么多,最后用一个思维导图告诉大家如何学习计算机网络,算是对本文的总结。
如果你是技术类的学生,相信我不用担心你对计算机网络的学习。如果你是非技术类的学生,我觉得还是可以按照这个思路学习的。
推荐资源
书
计算机网络:自上而下,图解TCP/TP,图解HTTP
摘要
计算机网络学习到此为止。如果你还有任何问题,请到我们办公室来。
作为一名Java工程师,你必须了解Java网络编程。有了计算机网络的基础,相信对网络编程的后续学习会有帮助。之后还会有关于Java网络编程的文章,敬请关注。