计算机网络应该如何学习?
计算机网络应该如何学习?
大家好,我是小北。
很多同学在学习计算机网络的时候,有个很大的误区,那就是挨个的背下每一个网络协议的作用、字段构成,以及通信双方的交互状态机:
TCP 头部:
TCP 状态机:
努力的背完了 HTTP、TCP、IP、ARP、DHCP 等一堆协议,却难以理解它们如何协同工作。
也就是经典的问题:数据包在网络中是如何传输的?
我觉得学习计算机网络不应该这样去死记硬背,网络存在的本质就是解决两台主机之间的通信问题,从最初两台主机直接通过网线连接,我们是不需要什么 IP 协议,ARP 之类的东西的。
随着越来的越多的主机加入,构成了局域网,然后局域网互联构成了广域网,这个过程中会引出很多的问题是直接通过网线连接解决不了的,这个时候才是 MAC、ARP、IP 这些协议登场的时候。
从问题出发,按照 Why -> How -> What 这样的顺序,先谈遇到了什么问题,再说如何去解决,最终才是搬出前辈们多次迭代后最终呈现的设计方案来(也就是网络协议,RFC 文档),这样就会顺畅很多。
而且能够引导初学者对网络产生兴趣,思考如何解决问题,这个过程也是把整体揉碎,一步步消化,又重建为整体的过程。
如果一上来就搬出结论,比如 TCP 连接管理、状态转换、超时重传、IP 包如何分段与重组这样的东西,我是比较懵逼的,我并不太清楚为什么需要这样做,不这样做行不行。
我在学校学习计网的时候也有一堆的困惑,比如
- 路由器和交换机有什么区别?
- 为什么有了 MAC 地址还要 IP 地址呢?或者只用 IP 地址行不行呢?
- 如何理解广播域和冲突域?
不知道大家有过这些问题吗?
有答案么,如果对这些问题非常的清晰,那么说明你对网络掌握得非常不错。
二、自顶向下 VS 自底向上 学习计算机网络
在《计算机网络-自顶向下》这本经典的计算机网络教科书中,章节组织就是按照OSI七层模型,从上层往下依次把网络的衣服解开。
自顶向下有个优点就是从我们熟悉的应用层开始比较好接受,但是我以前学习的时候总感觉这一切都是预定?
知道该这样,却不知道不这样行不行?
因为自顶向下是一层层的从外向内打开,然而最初设计的时候肯定不可能是自顶向下的吧,比如我们不可能先定义了HTTP 协议再去考虑如何设计传输层,这显然不合理嘛。
真实的世界一定是,最初有两台电脑互相通信的需求,然后是多台电脑,然后是操作系统要能够知道数据是传给上层哪个应用的,才引入了传输层。
但是在书中里是怎么说的呢?
比如说在第三章讲传输层的时候,是这样开篇的:
运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在 不同主机上的应用进程提供直接的通信服务起着至关重要的作用。我们在本章采用的教学 方法是,交替地讨论运输层的原理和这些原理在现有的协议中是如何实现的。与往常一 样,我们将特别关注因特网协议,即 TCP 和 UDP 运输层协议。
那我可能就会想为什么在应用层和网络层之间需要运输层,直接把应用数据包打包在IP packet里发送出去不行吗?
这样行吗?
其实我觉得是没问题,只要给每个应用分配一个唯一的ID,一起放在IP packet 发送出去,接收方使用这个ID来定位数据是给哪个应用的。
但是这样又会产生很多问题,比如那TCP做的事情就需要在IP层去做,这样显然会加重整个网络中路由器的负担,所以这里引入了分层的设计。
分层这个思想在计算机世界中非常重要,在计算机很多领域都能看到它的身影。
比如经典的MVC分层,将软件架构分为Model-View-Controller三层。而分层好处非常明显,把整个系统解耦了,并且层与层之间只用规定接口,便能实现灵活组合,面向切面编程!