欢迎来到TB体育·(中国)手机客户端下载
计算机网络这门学科应该如何学习?TB体育app
栏目:行业动态 发布时间:2023-06-22 07:33:07

  公众号【程序员黄小斜】互联网求职面试老司机,分享一切关于自学编程的干货内容

  我当初学计算机网络这个课,学了一遍忘一遍,特别是谢希仁的那本计算机网络,简直阴影。好在最后还是学成归来,分享一下我一路上学习计算机网络的那些方法,也推荐一些靠谱的学习资源,看完没用可以打我,看完有用记得点赞!

  为什么要学计算机网络,因为这门课实在重要,几乎是面试必问的内容,什么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》准备开始第二轮对于计算机网络的死磕。

  当时也投了一些简历,准备了一些面试,刷过一些面试题,其中面到计算机网络的概率很大,于是我每天都会花一些时间来看着两本书。

  TB体育官网app下载

  不知道是不是我理解能力有问题,当我看《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网络编程的文章推出,敬请期待。

  说实话,这种学习方法非常低效,当你自己去抓过包,见过真实的数据包、TCP header,你会惊讶,哇,原来这就是 TCP,而不是记住课本上那一张张header构造图!

  比如我在大学期间抓过网络包,写过网络编程、也做过可靠传输实验、模拟TCP、kali Linux 上玩过 arp 等一些简单的网络攻击,我觉得计算机网络挺简单的,本质上就是两台主机如何通信。

  我觉得学习计网,做点网络编程、简单网络攻击、抓包,会让学习更加有趣,我当时是这几个都玩了下,你对这些网络协议的认识就会更加深刻的。

  比如《图解HTTP》、《图解TCP/IP》、《网络是怎么连接的》、《计算机网络:自顶向下》、《TCP/IP卷一》等等

  这门课程配合《计算机网络:自顶向下方法》,然后做一下课程的lab,基本能够掌握TCP的核心。

  你想都写了一个TCP了,还能理解不了吗?而且这种理解是从细节到上层工作原理的全面把控。

  在这,顺便分享一份大学期间自己整理的电子书库,绝不是在网上那种打包下载的,而是自己需要学到某个方向知识的时候,去网上挨个找的,最后汇总而成。

  汇集了编程语言(Java、C++、C、Python等等)、操作系统、计算机网络、系统架构、设计模式、程序员数学、测试、中间件 、前端开发、后台开发、网络编程、Linux使用及内核、数据库、Redis....等主流的编程学习书籍。

  我整理的这些书大家可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统:

  4. 抓包:《Wireshark 网络分析就这么简单》,这本书写得很幽默风趣,可以看看。

  国外经典课程:CS144,这门课的视频其实并不突出,一般般吧,但是 Assignment/Lab 挺有意思的,用 C++ 实现一个 TCP,当然了不会像 linux 中网络协议栈那么复杂,但是麻雀虽小五脏俱全,你想想你都写了一个tcp了,还怕理解不了?:

  人家老外老师就是给力,直接做了一个网站,这个网站你可以通过 TCP 连接上去,然后你需要运行几个节点,互相发消息,他们之间的消息都会经过老师的网站,所以通过网站上是可以控制丢包率的,也能控制节点的拓扑结构,要求就是让你基于这种不可靠的信道,做出可靠数据传输!这简直就是翻版 TCP 嘛,超时重传、ACK、滑动窗口啥的都给我上!

  就是像下面图中一样,圆圈就表示你可达的范围,不同节点形成各种网络拓扑,可以调节网络 丢包率 Loss chance。

  简单网络攻击:比如去玩玩 ARP 攻击,在寝室或者你们家里搞点“网络攻击”

  当然了,不同岗位的同学可能关注的重点会不一样,前端同学可能更关注 HTTP、浏览器网络请求、渲染过程,后台同学则更关注网络层和传输层。

  花了好大的力气,终于背完了 HTTP、TCP、IP、ARP、DHCP 等一堆协议。

  先谈遇到了什么问题,再说如何去解决,最终才是搬出前辈们的 RFC 文档,这样就会顺畅很多。

  而且这是在引导我们去思考如何解决问题,从点对点连接开始如何构造一个网络。

  如果一上来就搬出原理,比如 TCP 连接管理、状态转换、超时重传、IP 包如何分段与重组这样的东西,我觉得是比较懵逼的。

  如果你脑海里对这些问题的答案非常的清晰,那么恭喜你,你对网络掌握得还不错!

  我们大学老师就是从应用层开始往下讲的,自顶向下的好处是直观,上层的直观感受会让你有探索下层实现的欲望。

  我们教材也恰好使用的是《计算机网络-自顶向下》这本经典的计算机网络书籍,这本书也是采取自顶向下这样的讲述方式。

  当然了,国内也有不少高校是以自底向上的方式上课的,一上来就是一堆的物理层、链路层协议,典型教材如《Computer Networks, Fourth Edition》。

  因为自顶向下是一层层的从外向内打开,然而最初设计网络的时候肯定不可能是自顶向下的吧。

  真实的世界一定是自底向上演变的,不可能先定义了 HTTP 协议再去考虑如何设计传输层,这显然不合理嘛。

  网络的演变一定是最初有两台电脑互相通信的需求,然后是多台电脑,他们之间构成了局域网,再往后局域网之间组成了广域网。

  最关键的是,自底向上是解决问题导向,比如有了 IP层 为什么还需要传输层呢?

  我们都知道一台电脑可能有多个进程在使用网络连接,那么当 IP 包到达主机时,怎么区分这是发给哪个进程的呢?

  但是自顶向下可能就是学完应用层,直接告诉你,下一层是传输层,然后接着讲 TCP 和 UDP 是什么。

  运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。我们在本章采用的教学方法是,交替地讨论运输层的原理和这些原理在现有的协议中是如何实现的。与往常一 样,我们将特别关注因特网协议,即 TCP 和 UDP 运输层协议。

  那我可能就会想,为什么在应用层和网络层之间需要运输层,直接把应用数据包打包在网络层里发送出去不行吗?

  当然可以,只要给每个应用分配一个唯一的ID,一起放在网络层的数据包发送出去,接收方使用这个 ID 来定位数据是给哪个应用的。

  其实你也看出来了,这就是把 TCP、UDP 做的事情放在了 IP 层去做。

  所以为了保持 IP 层的灵活性和功能独立,这里引入了传输层,这就是分层。

  学习计网过程中也需要建立结构化的思维,最直观的结构就是按照计网的层次来,即:应用层、传输层、网络层、数据链路层、物理层。

  然后在去学习每个层的功能和其中的每个协议,这个过程既可以自顶而下,也可以自底向上。

  分层学习过程中除了要掌握每一层之外,最重要的其实是要学习层与层之间是如何链接起来的,比如 IP 层和数据链路层就是 ARP 协议。

  最后当你学完所有的协议后,再回顾一下,一个数据包是如何从 send() 函数发送出去的。

  离散的 IP 数据包又是如何抽象出“面向连接”的 TCP 层,并且要清晰的认识到这里的连接是一种逻辑状态,建立、断开连接则是同步双方的通信状态。

  基于这样的认识,才能轻易的回答出类似: “TCP连接建立后出现服务器崩溃、断电、网线被拔...会发生什么情况”这样的问题。

  也可以关注下我@编程指北哟,致力于分享CS学习方法、校招打法、硬核技术,希望抹平CS学习的信息差,让同学们少走弯路!

  应评论里某个言辞激烈的人的要求,我声明我回答里的“没半毛钱关系”应该改为“只有半毛钱关系”,这样也许更准确点

  我回答的是“计算机网络该怎么学”这个问题,不是“网络编程该怎么学”。那些自我感觉良好,抬高自己贬低别人的还是歇了吧,谁都可以指出我的错误,但是得有理有据,不接受喷子。一些程序员出身的人看到我的回答莫名愤慨,有人说什么网工不过是看说明书的工种,从这个角度说,程序员不也是看SDK和API说明书的工种么?

  在实际工作中会编程会linux会excel对网工帮助很大,但是这个问题是”怎么学“一门工程技术。

  看到知乎上总是有人对计算机网络和网络编程傻傻的搞不清楚,我觉得我有必要说一下,计算机网络和socket编程没半毛钱关系!

  我想可能是知乎上码农太多了,于是所有和IT有关的东西都和编程扯不清的关系,除了把计算机网络和网络编程混一块外,居然还有人认为计算机网络是做网页的。我可以很负责任的说,很多的网工是从来没编过程的,而搞socket编程的码农们也根本不需要对网络协议有多深的理解。

  socket这个东西本来就是对网络协议和系统IO的一个封装,程序员可以不用关心数据在网络中是如何传输的,只需要调用recv()/send()就够了,可以让程序员专注于交互和数据本身。而网工是要了解数据在网络中传输的每个细节,从而规划和控制数据传输的过程。这两者有根本的区别。

  精通协议又搞编程的有么?当然有,这些人应该是研究网络协议,或者在网络设备厂商搞底层开发。或者是网工工作中遇到瓶颈和麻烦,半路学了点编程语言来解决实际问题。

  。让它通就,是搭建新的网络,或者解决网络不通、丢包、缓慢等问题,或让两个现有的网络连接起来;让它不通就是制定接入、访问策略,建立加密和认证体系。所有的协议都是围绕着两类需求创造的,不同的协议适用不同的实际情况。

  概念多,是真的,的确是很繁杂而且细节很多,现有的网络协议都是由不同的机构在不同时期一点一点增加和改进来的,所以繁杂琐碎很正常。但是生活接触不到、难理解我就不认同了,你想过你从插上网线到打开一个网页要经历那些过程吗?是怎么实现的?你有时候上网慢是什么原因?怎么去解决?人最可贵的就是好奇心和探索精神了,这些协议每一个的产生都是有实际确切的目的的,我觉得研究一件事物的机理是件很有意思的事。相对来说,工科的这些学科比起理科学科,根本不存在什么抽象难理解。

  方式就是协议。网络工程这门学科其实是需求主导的,是一个很实用主义的东西,

  对于一门实用技术来说,学习的关键当然是多动手、多做实验,模拟器,抓包,有利于对协议和报文的理解。

  你说学到链路层了,如果你用传统网络教程,到链路层估计还是一脸懵逼,因为太不直观了,路由器交换机这些东西离普通网民太远,一点感性认识都没有。所以推荐《计算机网络:自顶向下方法》,中文有第六版,英文到到第7版了,不过差不多。它从上层讲到下层,应用层和传输层讲完的时候,结合你上网的经验,估计你有很多体会。后面的就水到渠成了。

  。get到我想表达的意思就好。———————————我是分割线————————————

  学计算机网络的话,死记硬背其实是没啥前途的,因为毕业后天天撸码搬砖时一般不会有人问你以太网里最大帧长是多少。所以掌握网络的基本设计思想其实才是最重要的。

  1. 牢记网络是分层的,分层的,分层的(重要的事情说三遍。。。)。把每一层负责干什么搞清楚了后就会简单很多。

  2)0101到底是什么意思啊?要不我们搞个规则出来,这样大家都能理解?于是就有了数据链路层。

  3)各种各样的数据链路层协议太多了,怎么才能互相联起来呢?上面再加一层好了,把底层细节全部盖住。于是IP协议出来了。

  4)这份数据是从电脑上哪个程序发出来的啊?应该发到对方的哪个程序上?搞不定了,那就再加一层吧。于是TCP协议出来了。

  5)一次只能发1000来个byte,好麻烦啊。可不可以一次性发一堆?当然可以啦,再加一层,于是HTTP出来了。

  大概就是这样o(╯□╰)o。是不是发现每一层其实都是把下层细节给屏蔽掉了而专注自己这层的问题?换而言之,下面每一层的协议都可以随便乱换,只要当前这一层大家能互相理解就好。比如网络层底下既可以是802.3也可以是802.11~

  另外Wireshark是个好东西,抓包可以有效深入理解数据是怎样一层一层被封装起来的。

  2. 网络的本质是通信,而通信里很重要的一个部分是协议。协议是干什么的呢,就是两个人之间的一套怎么建立联系然后怎么沟通的机制。你可以想一下跟别人交流的时候是怎么样的,然后类比协议是怎么做的。再次举一个不太恰当的例子:

  这样丝就和女神建立起联系了。如果丝不回复ok的话后面的故事是不是就没法进行了?是不是很像TCP的三次握手?