由浅入深图解计算机网络-设备篇

前言

1950年的赛其(SAGE)半自动地面防空系统,是人类历史上第一次将计算机与通信设备结合起来,它是计算机网络的雏形。 1969年9月2日,加利福尼亚大学的伦纳德·克莱因洛克教授首次在两台计算机之间实现了数据交换。随后, DARPA于1969年12月建立了只有四台主计算机的ARPA网络,这是世界上第一个计算机网络,它就是今天因特网的前身。

今天,我们就以图文结合的形式简单描述下数据是如何通过网络设备完成在两台计算机之间传输的。

集线器

集线器(Hub)属于纯硬件网络底层设备,它发送数据时都是没有针对性的,而是采用广播方式发送。也就是说当它要向某节点发送数据时,不是直接把数据发送到目的机器,而是把数据包发送到与集线器相连的所有机器,如下图:

其他机器收到数据后,是如何判断是不是给他的呢,这时候就需要MAC地址了。网络中每台设备都有一个唯一的网络标识,它就叫MAC地址,由网络设备制造商生产时写在硬件内部。MAC地址则是48位的(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如08:00:20:0A:8C:6D就是一个MAC地址。图中A在发送数据时会标明自己以及目的MAC。接收方在收到数据后,读取目的MAC地址,通过比较其与自己的是否一样,来判断是否是发给它的,如下图:

交换机

交换机的一个主要功能就是根据MAC地址来转发数据包,它通过学习连接到每个端口的主机的MAC地址,建立一个MAC地址表,以此决定数据包应该被转发到哪个端口。

具体表现为当数据到达交换机时,交换机通过查询其维护的MAC地址表,获取目的MAC对应的端口,然后将数据从这个端口发送出去。

那么最开始MAC地址表为空,交换机是怎么学习将其建立起来的呢?其奥秘就在数据的每一次转发中。 交换机在转发数据的过程中,会对MAC地址表的内容进行维护,维护分为两种。

第一种是收到数据包时,将发送发MAC地址以及其输入端口号的号码写入MAC地址表中。由于收到包的那个端口就连接着发送这个包的设备,所以只要将这个包的发送方MAC地址写入地址表,以后当收到发往这个地址的包时,交换机就可以将它转发到正确的端口了。交换机每次收到包时都会执行这个操作,因此只要某个设备发送过网络包,它的MAC地址就会被记录到地址表中,如下图:

另一种是删除地址表中某条记录的操作,这是为了防止设备移动时产生问题,这种情况下,只需要将一段时间不使用的过时记录从地址表中删除就可以了。

路由器

路由器是一种网络设备,用于在不同的计算机网络之间进行数据包的转发和路由选择,以实现数据在不同网络之间的传输。它根据IP地址和路由表来决定数据包的最佳路径,实现跨网络的数据传输。需要注意的是路由器的各个端口都具有MAC地址和IP地址

首先我们来了解几个概念:

  1. IP地址

例如192.168.0.1,每一台计算机也同时拥有MAC地址和IP 地址,IP地址可以随时更改,MAC 地址一般是无法变更的。在两个计算机之间传输数据时候,除了加上前面说目的MAC和源MAC之外,还要再增加一个目的IP和源IP的信息。

  1. 子网掩码

子网掩码将一个IP地址的空间分割成多个较小的子网。子网掩码通常由32位二进制数组成,并且有两种常见的表示方式:点分十进制表示法,例如 255.255.255.0 表示前24位均为1, 即IP地址的前24位表示子网的网段;CIDR表示法,例如192.168.0.0/24表示192.168.0网段。如何判断两个IP是不是在同一个子网就是将其分别同子网掩码进行与运算,两者结果相同则在同一子网,不相同就不在同一子网。比如:

A计算机:192.168.0.1 & 255.255.255.0 = 192.168.0.0

B计算机:192.168.0.2 & 255.255.255.0 = 192.168.0.0

C计算机:192.168.1.1 & 255.255.255.0 = 192.168.1.0

D计算机:192.168.1.2 & 255.255.255.0 = 192.168.1.0

以上结果说明,A 与 B 在同一子网,C 与 D 在同一子网,但 A 与 C 不在同一子网,与 D 也不在同一子网。

  1. 默认网关

默认网关是子网与外网连接的"设备",在每个子网中通常表现为路由器在该子网中的IP地址。当一台计算机发送信息时,根据发送信息的目标IP,通过子网掩码来判定目标主机是否在本地子网中,如果目标主机在本地子网中,则直接发送即可。如果目标不在本地子网中则将该信息送到默认网关,由路由器将其转发到其他网络中,进一步寻找目标主机。

那么,路由器怎么实现转发和路由的选择的呢?

假如从IP地址为192.168.0.1的计算机A发往IP地址为192.168.1.1的计算机C的数据包到达了路由器,之后,路由器就会查询路由表确定输出端口。具体过程是:

首先,路由器在完成包接收操作之后,就会丢弃包开头的MAC头部。MAC头部的作用就是将包送达路由器,其中的接收方MAC地址就是路由器端口的MAC地址。因此,当包到达路由器后,MAC头部的任务就完成分了,于是MAC头部就会被丢弃。

这里需要记住的是通过路由器转发的网络包,其接收方MAC地址为路由器端口的MAC地址

接下来,路由器会根据MAC头部后面的IP头部中的目的IP地址进行包的转发操作,同交换机里维护着一张MAC地址与端口的映射表一样,路由器中维护着一张IP地址(段)和端口的映射表,这就是路由表,它是通过人为手动配置路由信息以及通过运行路由协议来动态学习和交换路由信息建立起来的,不同的是路由表IP地址和端口并不是一对一的关系,以下是一个路由表的结构。

这个路由表说明192.168.0这个子网下的转发到端口0,192.168.1这个子网下转发到端口1。到这里,路由器就确定了数据包接下来要从端口1发送出去。

有一个特殊情况就是包中的目的IP没有匹配到路由表中任何记录,此时会匹配默认路由,路由表中子网掩码是0.0.0.0的记录表示"默认路由"。子网掩码是0.0.0.0的意思就是网络包接收方IP地址和路由表中目的地址的匹配中需要匹配的位数为0,换句话说,就是根本不需要匹配。

在确定了数据包从哪个端口发送出去之后,现在我们还需要知道接下来的数据应该发往哪个MAC地址,因为数据的传输方向总是通过下一个转发目的的MAC地址确认的,而查询MAC地址需要使用ARP缓存,这里简单介绍下ARP:ARP的建立是在同一子网中采取了广播的方法,ARP利用广播对所有设备提问:"a.a.a.a这个IP地址是谁的?请你把MAC地址回复给我。"然后就有人回答:"a.a.a.a这个IP地址是我的,我的MAC地址是xx-xx-xx-xx-xx-xx"。当然也不是每次发送包都要查询一次,我们会将查询结果放到一块叫做ARP缓存的内存空间中留着以后用,这就是ARP缓存。

路由器中也有ARP缓存,因此路由器在确定数据包从哪个端口发出后,会在ARP缓存中查询目的IP地址对应的MAC地址,如果找不到就会发送ARP查询请求,来确定下一个目的的MAC地址。

下面我们通过动图的形式演示了从计算机A发送数据到C的过程:

相关推荐
让开,我要吃人了15 小时前
HarmonyOS鸿蒙开发实战(5.0)网格元素拖动交换案例实践
前端·华为·程序员·移动开发·harmonyos·鸿蒙·鸿蒙开发
让开,我要吃人了1 天前
HarmonyOS开发实战(5.0)实现二楼上划进入首页效果详解
前端·华为·程序员·移动开发·harmonyos·鸿蒙·鸿蒙系统
京东云开发者2 天前
还在自己实现责任链?我建议你造轮子之前先看看这个开源项目
程序员
Goboy2 天前
轻松掌握MySQL性能监控 · performance_schema 快速入门
后端·mysql·程序员
程序员鱼皮10 天前
学弟去字节面试,一小时被问了 50 题。。
计算机·面试·程序员·互联网·编程·开发·项目·简历
冰 河12 天前
《Nginx核心技术》第16章:实现Nginx的高可用负载均衡
运维·nginx·程序员·负载均衡·高可用
Android技术栈15 天前
鸿蒙(API 12 Beta6版)图形【 请求动画绘制帧率】方舟2D图形服务
程序员·harmonyos·鸿蒙·鸿蒙系统·openharmony·方舟2d图形·动画绘制
程序员鱼皮18 天前
大厂为啥都发苹果电脑?哪个系统是开发之王?
计算机·程序员·互联网·开发·编程经验
Android技术栈18 天前
鸿蒙(API 12 Beta3版)【通过字节数组生成码图】
程序员·移动开发·harmonyos·鸿蒙·鸿蒙系统·openharmony