001-【飞天闪客】你管这破玩意儿叫网络?

原视频:你管这破玩意儿叫网络?

一、MAC地址与交换机

MAC地址(Media Access Control Address),也称为物理地址、硬件地址,用来定义网络设备的位置。MAC地址由48位二进制数组成,通常由12个16进制数表示,每两个16进制数之间用冒号分隔。例如:00:0c:29:4d:3a

。前6位16进制数表示厂商代码,后6位16进制数表示设备序列号。

MAC地址是全球唯一的,每个网络设备都有一个唯一的MAC地址。MAC地址用于在网络中标识设备,以便设备之间进行通信。

集线器

两台计算机之间要通信,在他们之间连接一条网线即可;三台计算机之间要通信,在他们之间两两连接网线即可。但是,随着计算机数量的增加,连接网线的数量也会增加,这显然是不现实的。于是,人们发明了集线器(Hub),将所有设备的网线连接到集线器上,这样,所有设备之间就可以互相通信了。

集线器

在发送信息时,在信息前添加信息发送者的MAC地址和接收者的MAC地址,这样接收者就可以根据MAC地址判断信息是否是发送给自己的,从而选择接受或者忽略信息。

数据包形式

集线器的缺点是:当网络中存在多个设备时,每个设备都会接收到其他设备发送的信息,这会导致网络拥塞,降低网络性能。并且由于集线器只是单纯的将一个端口的信息广播给其余设备,无法做到一对一通讯,其安全性较差。那么这时候,人们就需要一种能够实现一对一通信的中转设备,于是交换机就诞生了。

交换机

交换机(Switch)与集线器类似,只是其内部维护着一张MAC地址表,用于记录每个设备的MAC地址和对应的端口。

交换机与地址表

如果这是a向b发送一个数据包,到了交换机后,交换机会查看MAC地址表,发现b的MAC地址在表中,于是就会将数据包从端口5直接发送给b,而不会发送给其他设备。这样就避免了网络拥塞,提高了网络性能。同时,由于交换机可以做到一对一通讯,其安全性也得到了提高。

那么,这个MAC地址表是如何生成的呢?

在最开始的时候,交换机和集线器没有什么区别,会将接收到的数据包广播到所有设备,交换机在接收到数据包时,会查看数据包中的源MAC地址,并将源MAC地址和对应的端口记录到MAC地址表中。这样,当交换机再次接收到数据包时,就可以根据数据包中的目的MAC地址,从MAC地址表中找到对应的端口,将数据包发送给目的设备。

交换机的出现解决了了集线器的问题,但是随着网络规模的扩大,交换机的端口也出现了不够用的问题。于是,产生了将两台交换机连接到一起的想法。

两个交换机直接连接

但是请注意,上图那根蓝色的线在左边交换机中的地址表不是一条记录,而是连接到右边交换机的所有地址表的记录:

左侧交换机地址表

右侧交换机地址表

所以,虽然看起来交换机的端口数量是够用了,但是其中维护的MAC地址表确实是越来越大了,带来的后果就是存储空间的膨胀,总有一天会出问题的。

思考问题的来源,我们发现,关键在于交换机与交换机之间连接出去的蓝色线,它后面不知道有多少设备会连接进来,从而使得维护的表越来越大。那我们可不可以在交换机与交换机之间接入一个新的设备,这个设备就像一台电脑一样,拥有自己的独立的MAC地址,而且还能帮我们对数据包做一次转发呢?

于是人们又发明了路由器。


二、路由器与IP地址

路由器

路由器(Router)是一种网络设备,作为一台拥有独立MAC地址的设备,它可以帮忙对数据包做一次转发,注意:==路由器每个端口都有独立的MAC地址==。

路由器工作示意图

现在,左边交换机的MAC地址表中,只需要多出来一条路由器MAC地址与其端口的映射关系,就可以成功的将数据包转交给路由器了,后续的传输暂且不管。

那么现在有一个新的问题,如何将发给EFGH的数据包都发给路由器呢?当然,可以将每个设备的MAC地址记录下来,但是又会出现数量太多的问题。

修改MAC地址后的网络

于是乎,你想到在MAC地址上做一下手脚,将左边交换机连接设备的MAC地址定义为LL-…,右侧为RR-…,这样就能区分开来了。比如:从A发给E的数据包,由于目标MAC地址为RR-…,所以会发给路由器,路由器会根据目标MAC地址,将数据包转发给右侧交换机,右侧交换机根据目标MAC地址,将数据包转发给E。但是这样做是不现实的。因为,MAC地址是硬件地址,是由硬件厂商在生产时写入的,我们无法修改。如果要按照上述方式操作,就需要供应商按要求写入生产设备的MAC地址,这显然是不现实的。

既然无法修改MAC地址,那么我们可以再给电脑添加一个随时都能修改的名字,这就是IP地址

IP地址与子网掩码

IP地址(Internet Protocol Address)是互联网协议地址,是互联网上每个设备的唯一标识。IP地址由32位二进制数组成,通常由4个十进制数表示,每两个十进制数之间用点分隔。例如:192.168.1.1。

添加IP地址的网络结构

由于网络结构改变了,我们发送的数据包结构也要发生改变,需要额外在数据链路层头部和数据层头部之间添加一个网络层头部,用于标识网络层的信息。这样,当数据包到达路由器时,路由器就可以根据网络层头部中的目标IP地址,将数据包转发给对应的设备。

添加IP地址的数据包结构

现在,我们用语言来描述一下将数据包从A发送给C的过程:

  • 首先,A检查IP地址,发现不是连接在交换机上的设备,==将目标MAC地址修改为路由器的MAC地址==,再将数据包发送到左侧交换机,于是将数据包转发给路由器;
  • 然后,路由器检查IP地址,发现是连接在右侧交换机上的设备,于是==根据目标IP地址将数据包中目标MAC地址修改为C的MAC地址==,再转发给右侧交换机;
  • 最后,右侧交换机检查MAC地址,发现是连接在端口6上的设备,于是将数据包转发给C。

问题1:A给C发送数据包,怎么知道要通过路由器转发呢?

答案:子网(Subnet)

子网(Subnet)是指一个网络被划分为多个较小的网络,每个较小的网络被称为一个子网。子网是网络地址的一部分,用于标识网络中的设备属于哪个子网。

  • 如果源IP与目的IP在同一个子网,直接将包通过交换机发出去;
  • 如果源IP与目的IP不在同一个子网,就把包交给路由器去处理。

问题2:怎么判断两个IP是否在同一个子网呢?

答案:子网掩码(Subnet Mask)

子网掩码(Subnet Mask)是一个32位的二进制数,用于标识IP地址中的网络部分和主机部分。子网掩码中的1表示网络部分,0表示主机部分。

子网掩码与IP地址进行按位与运算,得到的结果就是网络地址:

  • 如果两个IP地址的网络地址相同,那么它们就在同一个子网;
  • 如果两个IP地址的网络地址不同,那么它们就不在同一个子网。

举个例子:

子网掩码应用

子网掩码应用(勘误:右侧子网应为192.168.1.0)

问题3:A如何知道,那个设备是路由器?

答案:在A上要设置默认网关(Default Gateway)

默认网关(Default Gateway)是指当计算机需要访问的IP地址不在同一个子网时,计算机将数据包发送给默认网关,由默认网关进行转发。默认网关通常是一个路由器,用于连接不同的子网。

默认网关

#### 问题4:如何得知路由器的MAC地址?

答案:ARP协议(Address Resolution Protocol)

ARP协议(Address Resolution Protocol)用于在局域网中查找设备的MAC地址。

我们回到A向B发送数据的场景:

在最开始的时候,A不知道B的MAC地址,于是A会发送一个ARP请求,请求B的MAC地址,B收到请求后,会回复A,A收到回复后,会将B的MAC地址记录下来,下次再向B发送数据时,就可以直接使用B的MAC地址了。

最开始发送的数据包

问题5:路由器如何将数据转发过去的?

答案:路由表(Routing Table)

路由表映射了目的寻址范围和端口的关系,路由器根据路由表将数据包转发到对应的端口。路由表还可能包含下一跳(Next Hop)信息,表示数据包如果不能直接传递到目的地,可以再交给下一个路由器来处理。

总结

==网络层(IP协议)本身没有传输包的功能,包的实际传输是委托给数据链路层,也就是以太网中的交换机来实现的。==

涉及到的三张表:

  • MAC地址表:==交换机==用来记录MAC地址和端口的映射关系;
  • ARP表:==电脑==用来记录IP地址和MAC地址的映射关系;
  • 路由表:==路由器==用来记录IP地址和端口的映射关系。

电脑视角

  • 首先要知道我的IP以及对方的IP;
  • 通过子网掩码判断我们是否处于同一个子网;
  • 如果是同一个子网,直接通过ARP协议获取对方的MAC地址,然后通过交换机发送数据;
  • 如果不是同一个子网,通过ARP协议获取默认网关的MAC地址,然后通过交换机发送数据,数据包中目标MAC地址为默认网关的MAC地址。

交换机视角

  • 我收到的数据包必须有目标MAC地址;
  • 通过MAC地址表查映射关系;
  • 查到了就按照映射关系从我的指定端口发出去;
  • 查不到就所有端口都发出去。

路由器视角

  • 我收到的数据包必须有目标IP地址;
  • 通过路由表查映射关系;
  • 查到了就按照映射关系从我的指定端口发出去;
  • 查不到就返回一个路由不可达数据包。