扫一扫
关注微信公众号

换个角度理解计算机网络,搭建计网知识框架
2023-02-08   51CTO

  虽然集线器确实有用,但也导致了消息爆炸,原来我只要发给计算机B的消息,现在却要发给连接到集线器上的所有计算机,这样无论是从经济还是效率上来说都不是一个很好的选择。如果把这个集线器弄得更智能一些,只发给目标计算机就好了。

 
  所谓换个角度,就是从三层物理设备(物理层、数据链路层、网络层)开始,串联起整个网络的工作原理

  可能有些小伙伴看见物理设备天生就犯困,反手就准备关闭文章,且慢!本文只是简单的介绍这几个设备的功能,并不会涉及复杂的底层硬件原理,不一定严谨,并且摒弃了很多细节,但读起来一定通俗易懂,帮助你迅速搭建起计网的知识框架。

  什么是数据?

  首先我们需要知道,网络上传输的东西是什么?所谓数据,什么是数据

  假设你要传输的数据是name="小牛肉",那么经过从应用层开始经过层层封装,到达物理层进行传输的时候,你的数据已经被封装进了很多东西:


 
  首部里面具体是什么,不是本文的重点,你只需要知道其中有这么几个字段很重要:

  源IP地址

  源MAC地址

  目标IP地址

  目标MAC地址

  每一台计算机都有自己的IP地址和MAC地址。

  物理层设备:集线器

  假设一个网络上有ABCDE五台计算机,A想要给C发送数据包,那么数据包被发送出来后它怎么知道C在哪里?

  古老的物理层设备“集线器”出现了👇
 

  A通过集线器给C发送消息

  如上图所示,集线器上面有若干个端口,每个端口都连着一台计算机,假设A计算机对应端口1,B计算机对应端口3,C计算机对应端口7......

  那么A想要给C发送消息,消息要经过谁?没错,首先要经过集线器

  集线器不是很聪明,他其实也不知道C到底在哪里,所以他会将A的消息广播给所有的计算机,由各个计算机自己判断是不是发送给自己的消息。

  数据链路层设备:交换机

  虽然集线器确实有用,但也导致了消息爆炸,原来我只要发给计算机B的消息,现在却要发给连接到集线器上的所有计算机,这样无论是从经济还是效率上来说都不是一个很好的选择。如果把这个集线器弄得更智能一些,只发给目标计算机就好了。

  既然只发送给一个计算机,那我们首先需要唯一定位这个计算机。

  通过什么来定位?发送出来的数据包中其实已经封装好了,就是通过目标计算机的MAC地址来进行唯一定位。


  A通过交换机给C发送消息

  那具体是怎么做到的呢?

  事实上,交换机内部维护一张【MAC地址表】,记录着每一个MAC地址的设备,连接在哪一个端口上。

  如果发来的包首部中包含的目标MAC地址在MAC地址表中没有映射关系,交换机就将此包广播给所有端口,也即发给了所有机器;

  如果地址表有映射,那就只发给那一个端口

  比如A想要给C发送消息,一开始交换机的MAC地址表是空的,交换机并不知道C的端口号,因此A发送的消息将会被广播,同时,A的MAC地址和它对应的端口号会被记录到MAC地址表中。


  A通过交换机给C发送消息,此时MAC地址表为空

  这样,C对A的消息进行响应的时候,交换机就不需要进行广播消息了,因此它已经知道A计算机在哪个端口了,并且同样的,C的MAC地址和它对应的端口号会被记录到交换机的MAC地址表中。


  C通过交换机给A发送消息,此时MAC地址表中含有A的信息

  网络层设备:路由器

  交换机似乎看起来已经是最优解了,但事实上,随着计算机设备越来越多,交换机的端口都不够用了,当然你肯定能想到可以用将多个交换机互相连接起来,然后每个交换机之间都互相共享他们的MAC地址表。但随着计算机数量的增长,比如10亿台设备,100万个交换机,那这100万个交换机都需要各自维护包含10亿条记录的MAC地址表,无论是从经济还是效率上来说这也都不是一个很好的选择。

  所以将交换机连接在一起这个思路确实没有错,但不能粗暴的直接连接在一起,得想个办法,让每个交换机仍然只需要维护和自己连接的设备的MAC地址表,同时还能和其他交换机进行共享

  路由器应用而生。

  路由器同样有很多端口,每一个端口都拥有一个MAC地址和一个IP地址,每一个端口都连着一个局域网(或者说子网或者说IP地址段也行,本文就不过多区分子网和局域网的含义了)或者另一个路由器

  举个简单的例子,有两个子网,每个子网内都只有一个交换机,交换机上连接着若干个计算机设备,用路由器把这两个交换机连接起来,当两个子网之间需要进行通信的时候,通过路由器就可以实现了。


  那具体是怎么做到的呢?

  事实上,路由器内部同样维护着一张表,这张表称为【路由表】,记录着每一个局域网(IP地址段)和它对应的端口。

  比如某个路由器的端口0上连接着192.168.0.x​的IP地址段,端口1上连接着192.168.1.x的IP地址段,那么路由表就是下面这样:


  大伙一定发现了上面路由表中还有”下一跳“这个字段,很简单,一个路由器的端口毕竟是有限的,不可能一个路由器连接所有的IP地址段,因此,如果该路由器发现目标计算机的IP地址不在自己管辖的IP地址段之内,就会通过下一跳地址转发给其他的管辖这个IP地址的路由器

  路由器具体是怎么工作的呢?比如A给C发送数据,A在子网号为192.168.0.x​的子网,而C在子网号为192.168.1.x的子网,那么A首先需要知道C和自己是不是在同一个子网:

  如果是同一个子网,那么直接把数据发送给交换机就可以了

  如果不是同一个子网,那么需要经过路由器的转发,A需要把数据通过交换机发送给路由器,然后由路由器决定该发送给哪个子网


  A通过路由器给C发送消息

  这里有两个问题:

  1)A如何判断是否和C在同一个子网?

  答案:这个简单,也不是本文重点,不过多介绍了,就是将源IP与目的IP分别同子网掩码进行与运算,结果相等就是在同一个子网

  2)A如何知道哪个设备是路由器?

  答案:每个计算机上都要设置【默认网关】

  其实说发给路由器不准确,应该说A会把数据包发给默认网关。

  对A来说,A只能直接把数据包发给同处于一个子网下的某个IP上,所以其实发给路由器还是发给某个计算机设备,对A来说并没有什么区别,反正它只认得IP地址。

  所以默认网关,其实就是A在自己电脑里配置的一个IP地址,以便在发给不同子网的设备时,发给这个IP地址。

  总结

  如下图A给F发送一个数据包,我们来梳理下整个通信过程:


  A给不同子网的F发送消息

  1)首先A(192.168.0.1​)通过子网掩码(255.255.255.0​)计算出自己与F(192.168.3.2​)并不在同一个子网内,于是决定发送给默认网关(192.168.0.222)

  2)A通过ARP协议找到默认网关192.168.0.222的MAC地址(数据链路层需要知道MAC地址才能传输数据)

  3)A将源MAC地址(AA-AA-AA-AA​)与网关MAC地址(MM-MM-MM-MM​)封装在数据链路层头部,又将源IP地址(192.168.0.1​)和目的IP地址(192.168.3.2)(注意这里千万不要以为填写的是默认网关的IP地址,从始至终这个数据包的两个IP地址都是不变的,只有MAC地址在不断变化)封装在网络层头部,然后发送数据包


  报文格式

  4)第一个交换机收到数据包后,发现目标MAC地址是MM-MM-MM-MM,转发给第一个路由器

  5)数据包来到了第一个路由器,发现其目标IP地址是192.168.3.2​,查看其路由表,发现了下一跳的地址是192.168.100.21

  6)所以此时该路由器需要做两件事,一是再次匹配路由表,找到下一跳192.168.100.21匹配的端口号,二是从这个端口把数据包转发出去

  7)此时第二个路由器收到了数据包,看到其目的地址是192.168.3.2,查询其路由表找到匹配的端口号,并准备从该端口把数据包转发出去

  8)但此时路由器需要知道192.168.3.2​的MAC地址才行,于是查看其ARP缓存,找到其MAC地址为FF-FF-FF-FF,并将其封装在数据链路层头部,从上个步骤确定的端口将包转发出去。

  9)如上图所示,对应的交换机收到了数据包,发现目的MAC地址为FF-FF-FF-FF,查询其MAC地址表,从对应的端口把数据包发出去。

  10)数据包最终成功抵达计算机F,F发现目的MAC地址就是自己,于是收下了这个数据包。

热词搜索:网络

上一篇:网络基础设施革命四大趋势
下一篇:最后一页

分享到: 收藏