【计算机网络】计算机网络物理层,数据链路层和网络层的理解
阅读原文时间:2021年04月20日阅读:1

对于初学者甚至许多计算机科班出身的同学来说,学习网络和操作系统一样,感觉十分抽象,学完总有一种朦朦胧胧的感觉,因为毕竟对于绝大多数人来说,工作中都不需要接触这些东西。但是作为一个较真的程序员,还是想慢慢深入理解其中的奥秘,这也就是我想边学边写博客的原因,也希望能给初学者一些借鉴。

OSI将计算机网络可以分为七层模型,从底层网上分别是物理层,数据链路层,网络层,… ,应用层,自顶向下越来越靠近硬件,这是几乎是所有讲网络的书籍都会提到的,但是作为一个web developer来说,只需要从网络层开始学习,网络层之下太偏硬件,只需要知道原理即可。就算是在工作中,需要对web application进行优化,作为一个开发人员你也不可能像网络工程师那样去优化硬件和网络拓扑结构,那不是我们该关心的。但是我们必须要搞清楚物理层和数据链路层是在做什么。

我们都知道,计算机物理网卡里发出和接受的信号都是二进制的数字信号,所以我们必须设计一种网络,把不同的计算机连接起来,让数字信号能从一台计算机传递到另一台计算机。物理层总的来说负责二进制数字信号(比特流)的传输,当然它的实现是很复杂的。

那么问题来了,物理层只知道傻瓜式的传递比特流,它并不知道要当前host想和谁通信,只是无脑传递数据而已,更别提理解传递的数据是什么了。如果按照这种方式组成一个网络,其中主机A想跟主机B通信,主机A则通过网络向其他主机广播,当主机B收到数据后发先有人跟自己通信,再次将应答消息进行广播,主机A收到后发现是B的回复,然后在进行回应,那么相当于所有的主机通过广播的方式进行通行,那么可想而知这样的网路效率极低。就像一个你要给朋友发一个包裹,但是快递公司不知道怎么发给你朋友,所以就采用极为暴力的方式,给全国每个地方的人都发一份,然后让收件人自己去判断,你朋友收到后发先是你发给他的,于是进行回复,此时快递公司仍然不知道该回给谁,于是全国每人发一份,你收到后发先是你朋友给你的回复,依此类推。这显然是及其糟糕的设计。

链路层就是为了解决定向传递数据问题。链路层的数据格式是:

目标MAC地址 + 源MAC地址 + 数据 + 结束符

那么数据发送的方式是这样的:

所有的主机都连在一个中间设备(hub或者switch)上,然后中间设备将每个主机的MAC地址和端口(注意不是TCP里的端口)进行映射,形成一个映射表。主机A将数据包按照上面的格式发给中间设备,中间设备将目标MAC地址与映射表进行比较,找到目的MAC所连接的端口,然后将数据包发送给目标主机。

这么做带来了一个问题:随着主机的增多,这个中间设备需要维护一个非常大的映射表,每当有新主机连入时,都需要更新映射表,显然这么做扩展性很差,而且效率很低。另外mac地址有是由6个16进制数表示即2^48,那么一个mac地址占6Byte,那么若果要将所有的mac地址存进一张表内,那就需要TB级别的存储空间,这显然是不现实的。

那么我们稍作改进,将其改成递归嵌套结构,每个中间设备只保存当前子网的映射表,如果没发现目标mac地址,就将数据包网上层中间设备转发,上层设备将数据包进行比较,若发现目标主机就转发数据,否则就广播到每个子中间设备。由每个子中间设备在进行比较,若还没发现则再次向上转发,依次类推。

这么做也有个问题,优化了一些,但是没有根本上解决问题。

我们可以将网络划分成许多子网,我们为每个子网分配一个全网唯一的ID,叫做IP地址,如果主机A想要与主机B通信,我们只需实现如何根据主机B的IP找到主机B所在的子网,剩下的工作交给这个子网去处理就行了。这样就避免了中间设备存储过多的主机信息,而且也实现了单播而非广播的模式。这就是网络层所做的事情。

下一篇我们就具体研究一下,网络上两台主机是如何通过IP地址和MAC地址进行通信的

如果你觉得对你有帮助,别忘了三连,你的支持是我继续创作的动力!!!

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器