我想象中的计算机网络

前言

因为自己不是科班出生,但是对编程很感兴趣,希望成为一名程序员,所以经常自己学习一些编程方面的知识,如今由于各种层面的抽象,对于编程的基础知识需求已经不像以前那么高,对于一些计算机原理程序员不用弄明白具体是如何实现,就可以进行编程,就像电子工程师不用理解每个集成电路内部具体原理一样。但是在自学的途中我发现,这些懵懂可能对于进一步学习会造成一些理解障碍,因此决定学习一些原理上的知识。

想象的开始

现如今互联网成为生活中最常见的一部分,但是多个计算机到底如何通信的呢。在我的想象中两台计算机建立通信的非常简单,无非通过一个数据线连接起来,约定好彼此传输数据的格式。可以像对讲机一样你说一句我说一句(半双工),如果有多台计算机需要通信就像广播一样就行。

我想象中的计算机网络

但是可以很明显的发现,如果网络中的两个计算机需要单独的通信是不能实现的,所以我们需要给每一台计算机加上唯一的标识,并约定在传输数据的头部加上这个标识表示这个数据是给哪一台计算机的,就像写信信封上填上地址。每台计算机在接收时会查看地址是不是自己,是的话才会拆信封。这个地址就是MAC地址

我想象中的计算机网络

这样网络中任意两个计算机都可以单独通话了。但是等等,这样在网络中如果同时两人需要发送信息,那么线路中肯定会发生冲突,电话串音?

所以在发送消息前我们需要查看现在线路是不是繁忙,您拨打的电话在通话中,请稍后再拨?但是我们不能采用相同的等待时间,因为大家都约定等待时间相同会造成下次还是同时想发送,这样还是会发生很多冲突,所以我们可以给等待时间加上随机值,但是再网络十分拥挤的情况下,还是会发生很多冲突,所以之后采用了根据阻塞次数指数级别的增加等待时间来缓解,叫指数退避,比如第一次等待冲突1s+随机值,第二次2s,第三次4s…

这样就是最基本的以太网,或者wifi网络的结构了。

进一步思考

在计算机数量少的情况下,上面的通信肯定可以满足,但是如果是一个公司或学校的电脑在几百上千数量下,网络使用时间非常集中…emmmm,好吧你可能发一条消息就需要几分钟,很明显这样满足不了人的需求。因为我们使用的都是一条线路,大家的通信都是在这一条线路上进行的,那么我们可不可以增加线路,来减少线路中计算机的数量呢。这就叫减少冲突域,于是交换机上场了。

如果向同冲突域发送信息不需要经过交换机:

我想象中的计算机网络

如果向不同冲突域发送信息经过交换机转发:

我想象中的计算机网络

而交换机要知道哪个Mac地址属于那个冲突域,所以需要记录mac地址对应的冲突域。

到这里就可以知道,就算是互联网也可以是这样构成。像这样:

我想象中的计算机网络

实际会复杂很多这里只是粗略画下,我懒不像画好看的图,将就看看吧。

互联网

这里我画图就不画具体一个网络内冲突域的结构了,把整体抽象出来用一个符号代替。

上面我们可以看到,互联网这样构成会有一个问题,就是传输消息到目标可能不止一条路径,而如何选择路径就是一个新的概念,路由。路由器会记载下一次数据传输可以跳转的地址。这里面会设计到一些新东西,感兴趣可以自己百度一下,这里不展开了。

如果A中的一台计算机需要给B中的一台计算机传递消息,可以看到会有很多不同的路由。

我想象中的计算机网络

这样其实减少了数据传输可能存在的单点问题。比如AB传输路径中的一个路由点因为雷电或者其他原因失效了,总是能找到其他路径完成传输。

我想象中的计算机网络

本来会沿蓝线传输因为中间点挂掉了,所以可以沿红线传输。

再想想

确实这样就完成了互联网结构,但是再传输方面,如果一个人在下载xhp造成了他路径上的路由点网络拥堵,那么其他正在聊WX的人不是就卡疯了??一人下片全城断网??上面我们说了传输到一个目的地的路径不止一条,其实我们可以把大的数据分成很多小数据经过不同路径完成传输。就像这样:

我想象中的计算机网络

当然这会造成其他问题,我决定另起一篇再来思考这些问题。这里只是记录下我一个非科班(电子狗)在学习计算机网络时的一些自己的理解过程。