本文做者:黄小斜程序员
转载请务必在文章开头注明出处和做者。面试
上一期我讲到了数据结构怎么学,当时个人学习方法是先看视频,再看书,而后刷一刷基础算法题作巩固。算法
做为一个非科班考研党,当时以为这个学习路线仍是比较平滑的,毕竟能让我一个小白快速学会,这门课相对来讲仍是比较简单的。docker
因而,等我读研的时候,打算以相同的学习方式来补一下其余几门计算机基础课程,首当其冲的就是计算机网络。编程
由于这门课实在重要,几乎是面试必问的内容,什么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技术、***技术等等,不理解这些,总以为仍是欠缺了很多东西。
到后来,开始尝试面试一些大厂,更加发现了本身的差距还很大,好比百度、头条、腾讯这类公司,特别是腾讯,对于计算机网络的考察是特别严格的。
好比三次握手,四次挥手这种常见问题,通常还会延伸考察,好比为何要三次握手、四次挥手,没有第三次握手或者没有第四次挥手会怎么样。
再好比TCP协议的做用是什么,它是如何保证传输可靠的,这时候你就要了解TCP保证可靠传输的机制,好比滑动窗口,超时重传,分组确认等原理,也是你须要能讲清楚的。
再好比,还有一种常见的考察方式,就是让你讲清楚从域名访问到得到返回结果的过程当中都经历了什么,这么开放的问题,要尽量说出足够多的东西,先是DNS解析,再到TCP三次握手,而后介绍IP数据报的网络路由,以及局域网内数据链路层的做用,甚至能够把物理层也带进去讲一下。
总之,你掌握的越多越详细,对于这些问题才更有机会答好,我每次都会把整个过程讲的比较详细,这样面试时才不会给本身留坑。
对了,在学习计算机网络的路上,还有一个很重要的学习资源帮助到了我,那就是刘欣老师的《码农翻身》一书,当时我也是在网上偶尔看到。
一开始刘欣老师只是写公众号文章,后来把文章集结成书,对于计算机网络的部分,这本书用故事化的方法介绍了不少计算机网络的知识,同时解释了一些较为复杂的计算机网络概念,好比NAT、网络隧道、***等等。
虽然这本书关于计算机网络的内容不是不少,但确实有助于加深对于计算机网络一些概念的理解。
写了这么多,最后用一张思惟导图告诉你计算机网络应该怎么学,算是对本文的总结。
若是你是科班出身的同窗,相信你对计算机网络的学习不用我操心,若是是非科班的同窗,按照这个思路去学习,我以为是仍是能够的。
《计算机网络:自顶向下》
《图解TCP/TP》
《图解HTTP》
关于计算机网络的学习,咱们就讲到这里了,若是还有什么疑问也能够到我公众号里找我探讨,做为一个Java工程师,必需要懂得Java网络编程,有了计算机网络的基础以后,相信对后续学习网络编程会有帮助,以后也会有关于Java网络编程的文章推出,敬请期待。