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